ADC

配置 Web 身份验证的 SMS OTP

Citrix ADC 现在可以与第三方 SMS 提供商集成,以提供额外的身份验证层。

可以将 Citrix ADC 设备配置为在用户的移动设备上发送 OTP,作为第二个身份验证因素。设备向用户提供登录表格,以便在成功登录 AD 后进入 OTP。只有在成功验证 SMS OTP 身份验证后,才会向用户显示所请求的资源。

要实现 SMS OTP 身份验证,Citrix ADC 设备依赖于后端中的以下因素。

  1. 使用 LDAP 身份验证对用户进行身份验证并提取用户的手机号码。
  2. 创建 OTP 并将其存储在 NS 变量中。配置和使用变量
  3. 通过 WebAuth 身份验证方法将 OTP 发送到从 LDAP 提取的手机号码。
  4. 验证 OTP。

必备条件

配置 OTP 存储

管理员使用以下 CLI 命令设置数据库/存储以保存用于 SMS 身份验证的 OTP。

add ns variable otp_store -type "map(text(65),text(6),100000)" -ifValueTooBig undef -ifNoValue undef -expires 5
<!--NeedCopy-->

为每个用户会话生成随机 OTP

使用以下命令为每个用户会话生成一个 6 位随机 OTP,并将其保存在 OTP 存储中。

add ns assignment generate_otp -variable "$otp_store[AAA.USER.SESSIONID]" -set ("000000" + SYS.RANDOM.MUL(1000000).TYPECAST_UNSIGNED_LONG_AT.TYPECAST_TEXT_T).SUFFIX(6)
<!--NeedCopy-->

使用Citrix ADC 配置短信 OTP 身份验证

  • 在配置 SMS 双重身份验证功能之前,必须在 Citrix ADC 设备上配置 LDAP 身份验证,作为启用身份验证的第一要素。有关配置 LDAP 身份验证的说明,请参阅 使用配置实用程序配置 LDAP 身份验证

  • 配置 LDAP 并提取用于 SMS OTP 身份验证的手机号码。

示例第一因素配置

add authentication ldapAction ldap_action -serverIP 1.1.1.1 -serverPort 3268 -authTimeout 30 -ldapBase "dc=nsi-test,dc=com" -ldapBindDn Administrator@nsi-test.com -ldapBindDnPassword freebsd -ldapLoginName samaccountname -groupAttrName memberOf -ssoNameAttribute samaccountname  -Attribute1 mobile -email mail

add authentication Policy ldap_policy -rule true -action ldap_action
<!--NeedCopy-->

注意

手机号码可以使用 AAA.USER.ATTRIBUTE(1) 提取,并且可以在将其发送到后端服务器时包含在内。

示例第二因素配置

使用以下示例配置,生成要发送给最终用户的 OTP。

add authentication policylabel set_otp -loginSchema LSCHEMA_INT

add authentication Policy set_otp -rule true -action test

add authentication policy cascade_noauth -rule true -action NO_AUTHN

add authentication Policy check_otp -rule "$test.valueExists(AAA.USER.SESSIONID)" -action NO_AUTHN

add authentication policylabel check_otp -loginSchema LSCHEMA_INTbind authentication policylabel set_otp -policyName set_otp -priority 1 -gotoPriorityExpression NEXT

bind authentication policylabel set_otp -policyName cascade_noauth -priority 2 -gotoPriorityExpression NEXT -nextFactor check_otpbind authentication policylabel check_otp -policyName wpp -priority 1 -gotoPriorityExpression NEXT

bind authentication policylabel check_otp -policyName wpp_cascade_noauth -priority 2 -gotoPriorityExpression NEXT -nextFactor otp_verifyadd authentication Policy wpp -rule true -action webAuth_POST

add authentication Policy wpp_cascade_noauth -rule true -action NO_AUTHNadd authentication Policy otp_verify -rule "AAA.LOGIN.PASSWORD.EQ($test[AAA.USER.SESSIONID])" -action NO_AUTHN

add authentication policylabel otp_verify -loginSchema onlyPassword

bind authentication policylabel otp_verify -policyName otp_verify -priority 1 -gotoPriorityExpression NEXTadd authentication vserver avs SSL 10.106.40.121 443

bind authentication vserver avs -policy ldap_policy  -priority 1 -nextFactor set_otp -gotoPriorityExpression NEXT
<!--NeedCopy-->

第三因素配置示例

使用以下示例配置,第二因素配置中生成的 OTP 将使用 Web 身份验证方法发送给最终用户。有关 Web 身份验证的详细信息,请参阅 Web 身份验证

  • SMS 服务器通过 GET 方法公开 API 时的示例 Web 身份验证配置。

     add policy expression otp_exp_get ""method=sendMessage&send_to=" + AAA.USER.ATTRIBUTE(1) + "&msg=OTP is " + $otp_store[AAA.USER.SESSIONID] + "for login into secure access  gateway. Valid till EXPIRE_TIME. Do not share the OTP with anyone for security reasons.&userid=#####&password=###=1.0""
    
     add authentication webAuthAction webAuth_Get -serverIP 10.106.168.210 -serverPort 8080 -fullReqExpr q{"GET /GatewayAPI/rest?" + otp_exp_get + "HTTP/" + http.req.version.major + "." + http.req.version.minor.sub(1) + "\r\nAccept:\*/\*\r\nHost: <FQDN>\r\n"} -successRule "http.res.status.eq(200)" -scheme http
     <!--NeedCopy-->
    
  • SMS 服务器通过 GET 方法公开 API 时的示例 Web 身份验证配置。

     add policy expression otp_exp_post ""Message: OTP is " + $otp_store[AAA.USER.SESSIONID] + "for login into secure access  gateway. Valid till EXPIRE_TIME. Do not share the OTP with anyone for security reasons&Mobile:" + AAA.USER.ATTRIBUTE(1)"
    
     add authentication webAuthAction webAuth_POST -serverIP 10.106.168.210 -serverPort 8080 -fullReqExpr q{"POST /MyPHP/auth.php HTTP/" + http.req.version.major + "." + http.req.version.major + "\r\nAccept:\*/\*\r\nHost: 10.106.168.210 \r\nContent-Length: 10\r\n\r\n" + otp_exp_post} -scheme http -successRule true
     <!--NeedCopy-->
    
     add authentication webAuthAction webAuth_Get -serverIP 10.106.168.210 -serverPort 8080 -fullReqExpr q{"GET /GatewayAPI/rest?" + otp_exp_get + "HTTP/" + http.req.version.major + "." + http.req.version.minor.sub(1) + "\r\nAccept:/\r\nHost: <FQDN>\r\n"} -successRule "http.res.status.eq(200)" -scheme http
    
     add policy expression otp_exp_post "$otp_store[AAA.USER.SESSIONID]"
     <!--NeedCopy-->
    
  • 最后,发送 OTP。

     add authentication Policy wpp -rule true -action webAuth_POST
    
     add authentication policylabel send_otp -loginSchema LSCHEMA_INT
     bind authentication policylabel send_otp -policyName wpp -priority 1 -gotoPriorityExpression NEXT
     <!--NeedCopy-->
    

第四因素配置示例

使用以下示例配置,验证发送给最终用户的 OTP。

在此配置中,策略规则用于根据发送给最终用户的 OTP 验证 OTP。

add authentication Policy otp_verify -rule "AAA.LOGIN.PASSWORD.EQ($otp_store[AAA.USER.SESSIONID])" -action NO_AUTHN

add authentication policylabel otp_verify -loginSchema onlyPassword

bind authentication policylabel otp_verify -policyName otp_verify -priority 1 -gotoPriorityExpression NEXT

<!--NeedCopy-->

使用以下命令添加 OnlyPassword 登录架构:

add authentication loginSchema onlypassword -authenticationschema /nsconfig/loginschema/LoginSchema/OnlyPassword.xml"
<!--NeedCopy-->

连接成功进行 SMS OTP 身份验证的所有因素

使用以下 CLI 命令将所有因素链接在一起。

bind authentication policylabel send_otp -policyName wpp -priority 1 -gotoPriorityExpression NEXT -nextFactor otp_verify
<!--NeedCopy-->

注意:

添加了层叠身份验证策略,以便为最终用户启用可靠且持续的身份验证。如果当前因素失效,则评估下一个因素,以免对用户体验产生影响。

配置 Web 身份验证的 SMS OTP