本文中将会介绍如何在Netscaler Gateway中配置多因素认证的方法。其中多因素认证的方法为otp。 软件版本: Netscaler NS13.0 47.24.nc Citrix_Virtual_Apps_and_Desktops_7_1912

关于otp OTP的意思是一次性密码,这是一个开源的密码生成的算法,它可以根据时间和一个种子文件来生成一个固定的值,只要两个设备的时间和种子文件一致,他们用otp算法算出的6位数字结果是一样的。而且这个算法不需要联网。 这次需要实现的是在gateway上输入域用户名和密码之后,外加上这个otp的token才能登陆。 效果如下: 使用起来的方法是这样的,我们访问ag的地址,并且在后面加入一个自定义的域名。用于注册设备,我们会为一个用户

为了完成这个效果,必须先要完成以下准备工作: 1.必须已经完成Gateway的配置

本文参考了:https://www.carlstalhood.com/native-one-time-passwords-otp-citrix-gateway-13/#changelog 配置OTP双因素认证需要完成,

  • AAA Vitrual Server

  • 对接LDAP(与域服务器对接,用于注册OTP保存种子文件,验证OTP是否正确)

  • 配置nFactor Flows(OTP认证的一个过程,根据配置的策略,访问网页之后会显示不同的界面,不同的界面有不同的认证过程,必须要完成上一个界面的认证才能进入下一个界面的认证,需要通过所有的界面认证才能进入SF界面。)

  • AAA Vitrual Server 首先在Netscaler中配置AAA服务,AAA服务在Security-AAA处,如果AAA服务是关闭的,它的右侧会有一个黄颜色感叹号,如果这样需要右键,启用服务。 先创建一个Virtual Server 这里根据图片照配,首先是为Authentication Virtual Server配置一个名称,IP地址选择Non Addressable。 接下来绑证书,由于我在上面一步没有选IP,这个vitrual server最后将会被用在AG上,所以证书用的也是AG的证书。(我的AG的证书用的就是AG的域名,不过我发现证书申请的时候可以用通配符的,也就是说你可以用*.abc.com来匹配整个域名) 选择证书并且绑定。除了证书之外,还需要配置nFactor Flows,这个配置需要先配置LDAP,所以暂时停止AAA Vitual Server的配置,先完成LDAP的配置。

NetScaler的LDAP配置的路径是Security / AAA - Application Traffic / Policies / Authentication / Advanced Policies / Actions / LDAP。 如果AG配置正确,默认应该已经有一个LDAP配置在其中了,还需要配置两条。 其中第一条存在的,是用于AG登录时,判断域账号密码是否正确。第二条被称为OTPRegisterDevice(实际上可以起任何名字)被用于注册设备,在后期我们注册设备的时候,我们会连接到域中,然后在用户的属性中修改一些值。实际上这个操作在用户的属性中添加了一个种子的值。 OTPAuth用于读取上面注册设备时留在域用户属性中的值,用于计算token码。 这些操作需要连接到域,所以需要提供域账号,而且其中注册设备的LDAP策略是需要修改域的信息的,所以提供的域账号必须要有修改域用户信息的权限。 (关于上图的配置我要多嘴一句,鉴于有一些IT会在填域服务器地址时填入IP地址,如果的确是IP地址,上图的最左上角部分请选ip之后再填入IP地址,如果选的主机名再填入IP地址。Netscaler会认为你填的是域名,然后用域名的方式去解析,或者是DNS会IP地址反解析的。以上两种情况会导致Netscaler向DNS发送请求,而如果环境中又正好有防火墙,禁用了53端口的情况下...那么配置会因为DNS请求超时而失效。 这种出错工程师往往会因为配置的是IP地址而排除DNS原因,结果就是排查一天都没结果。没必要为自己挖这种坑。如果已经配错了,改过来是没有用的,整个LDAP策略要重配。)

先配置OTPRegisterDevice这条LDAP: IP Adress填入域服务器的ip地址

下面的的Secutity Type部分我选择的是明文传输,如果有可以选择加密传输。这里不做讨论。 再接下来Base DN部分填入的是域的ADSI,你可以在域服务器中找到这个值。

接下来的域账号,这个域账号要有修改域账号属性的权限,它的格式是<域账号>@<域名> 右边部分则填写域账号的密码,然后测试网络的连通性,如果你的域账号能够成功登陆域,那么应该是这样的 接下来的部分这么填 其中OTP Secret的部分填写的是域账号中的属性的值,理论上你可以填写任何一个属性的值,不过这里用的是userParameters。 后期注册之后,我们可以进域,然后在域账号中看到这个值。 (示例:种子放在了user1用户的userParameters中) 要查看下图的界面,需要在AD帐号的管理界面勾选高级功能。


排错部分

按确认钮之后出现下图报错:

解决方法: 配置最上方左边,红框部分的勾取消。


OTPRegisterDevice配置完毕,还有一个OTPAuth。


OTPAuth的作用是读取域用户的userParameters属性,根据这个属性中的种子生成token。 它的配置和注册的LDAP极其像(可以勾选LDAP的策略再点击ADD按钮,这样Netscaler会克隆一份配置),不过有一些区别。

如图,在右上方的设置中红框部分要取消勾选。

在下图的Seach Filter,这个设置告诉设备从哪个属性值中获取种子的值。和上面保存种子值的地方是对应的。默认应该是userParameters>=#@

在上图的右则红框OTP secret中要填入userParameters


配置完LDAP,我们可以配置nFactor Flows了,这似乎是Netscaler13的新特性。 这次完成的目标是这样的。

这个流程解释了设备的OTP登录流程。这个流程中有两个分支。第一个分支为注册设备的分支。第二个分支则是通过OTP登录到SF的分支。 每一个灰框包括两个部分,一个是schema部分,一个是policy部分。schema将会决定页面的显示样式,而policy则决定验证方法。policy可以配置多个(如图中最左边的那个框),Policy会有优先级,会优先匹配最高优先级的验证方法,如果符合则转到绿色箭头的页面中去。如果不匹配则会用下一个policy。

首先是最左边的那个框,它由两个policy,定义是这样的,如果输入的gateway地址包含一个指定的二级目录,而且访问源IP为指定网段,则跳转到第一个分支的网页中去。否则跳转到第二个分支中去。 第一个分支会要求你验证域账号,一旦验证通过,则进入注册设备的页面。 第二个分支会要求验证你的域账号和OTP token,一旦验证通过则进入sf界面。

配置方法参考:https://www.carlstalhood.com/native-one-time-passwords-otp-citrix-gateway-13/#nfactorflow

图中从左到右,从上到下开始描述配置。第一个流程是用于分支的,我们会设置两个分支,一个是注册设备,一个是登陆sf。 所以我们先写注册设备的分支。 点击Add Policy,并且新建一个策略。 注意这个图中的表达式。 http.req.cookie.value("NSC_TASS").eq("manageotp") && client.IP.SRC.IN_SUBNET(10.2.0.0/16) 其中包含两个变动的部分,一个是“manageotp”,另外一个是10.2.0.0/16 注意这里goto选择next 这个表达式代表,访问gw网址的时候(在本次测试中,gw网址是gw.ipqn.local)如果包含二级目录“manageotp”,并且访问的设备ip在10.2.0.0/16网段中,那么便从这个分支进行下去下一个Factor。否则的话继续匹配下一个policy。 接下来点击加号按钮添加下一个policy。 表达式为true代表无论什么情况都匹配,这样配置也就是意味着只要不符合上一个policy的所有流量,都会走这个分支。 在每一个policy右边都有一个绿色箭头,点击之后就可以添加出一个新的factor。 我先叙述第一个分支的下一个factor。 第一个分支被我们定义为注册设备的分支,在这个分支中,需要添加schema。所以点击Add schema 如上图,可以在左侧选择xml模板,并且在右边查看网页的效果。 根据博客中的指示,添加的是SingleAuthManageOTP.xml,这个就和普通的storefront一样的登陆界面 新建一个policy(下文中,新建policy不再截图) 这里认证的方法选择ldap,然后就用到之前配置的ldap的配置了。 这里action处我们选择的是普通的用户名、密码的那个ldap。 然后点击蓝色的add按钮。 然后再次添加下一个factor。 添加policy。 这一次选择的是添加注册设备的ldap。这个分支便完成了。我们叙述一下作用。首先用户一定要是在指定的网段(一般设置成内网)并且在gw网址中输入manageotp这个二级域名才会进入下一个认真界面,不满足条件或者只满足一个的话不会进入这个分支。 这个分支接下来是要求你使用域账号登陆,只有正确的输入了域账号才能进入到注册设备的界面。 整个过程是自定义的,完全可以挑选自己选择的认证过程。域账号只是其中的一种,甚至可以跳过域账号的那个过程,输入网址之后直接进入注册设备的阶段。 甚至可以添加一个新的认证过程,整个流程可以一步一步的下去,这纯粹取决于配置者在安全和方便之间的抉择。 接下来是下一个分支。 下一个分支的网页界面应该包含用户名、密码和otp。根据博客的说法,选择的是 DualAuthPushOrOTP.xml。事实上由于我的博文中没有用到push服务。所以我们只要找到那个页面效果是用户名、密码、OTP三个输入框的xml就可以了。 schema选择好之后确定。然后在这个factor中添加policy,选择普通的验证的这个ldap。(这里我也不清楚为什么要这么做,不应该是直接选择otp验证吗?) 最后再次创建一个新的factor 创建policy如下图,此图使用的policy决定使用的ldap验证的方法是otp验证。 如此整个nFactor Flow流程完成。接下来就是将这个流程绑定到aaa virtual server上。 接下来我们要把这个aaa server放到gateway上去。 在这个页面选择添加按钮 下文输入 AAA.USER.ATTRIBUTE(1)

Profile配完之后,再配置Polices

然后进入Citrix Gateway Vitual Servers配置 选择正确的Vitual Server policy里加一条 这里选择策略,就是前文提到的traffic policy中的otp策略 下图的界面在右侧,点击authentication profile 这里就算着之前配置的aaa vitrual server了。 记得要在这里点个ok 还有一个“主题”,主题就是外观,尽量把外观设置成和sf一样。那样会漂亮点,实际没啥用。


接下来是在浏览器中的访问。注册的过程,应该是很容易理解的。


排错: 如上图那样写了二级目录但不能进注册界面怎么办? 如上图,路径没错,却进了有otp码的登录界面。 这时你需要通过浏览器抓包 如图在浏览器的“开发者工具”中,如箭头所示,可以在网页包中找到cookie “NSC_TASS”,可以看到值是“/regotp”。 这比我设的规则多了一个/。 所以可以把eq("regotp")的部分改成("/regotp")

现在可以进注册界面了。


你的手机上应该有一个支持otp的token软件,比如身份验证器啊之类的,这个很多,那个公司的无所谓,只要是otp就可以。 然后扫码之后,在手机上获取token并且验证。


这里有时候不是一步通过的,如果不能通过就需要排错。 (排错)

  • Netscaler的DNS是否配置正确? 一般到这一步的时候没有这个问题,但不排除前面的配置都是配的IP地址,而有一个地方却写了内网的域名。 不写自己的DNS会导致Netscaler不能解析本地的域名。

如果你觉得问题出在otp上。在不能确认的情况下,验证otp值是最有效果的。还记得之前提到的注册设备的网址吗?如果你已经注册,那么再次登录之后,界面是这样的。 点击测试按钮来输入otp值。这种方法如果通过,可以快速的排除了下文提到的两个问题。但是如果不通过,可以按下文方法排查。

  • 域服务中userParameters是否有值? 上文已经说过如何去看userParameters的值。 有一定的机率是你在Netscaler里填的AD帐号(即本文中的OTPAuth策略中的帐号)没有可以修改其他AD帐号内容的权限。所以配置也就没写到域中去。

  • Netscaler和你的手机时间是否一致?(因为otp的值取决于时间)

  • 不明问题 不知道发生了什么,但是就是无法登录。这个时候只能通过ssh登录到Netscaler上,通过shell看日志来排查问题了。

排错的命令是:

cat -n /tmp/aaa.debug

如上图,在打开监听的情况下再使用网页端登录。 可以看到登录的具体细节和失败原因。

(排错完毕)


注册完就可以正常登陆gw,登陆了。


  • 取消OTP设置 依红色剪头指示进入Gateway Virtual Servers配置。 找到Authentication Profile处配置,点击右上角的X删除OTP配置。之后保存。