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

关于otp
OTP的意思是一次性密码,这是一个开源的密码生成的算法,它可以根据时间和一个种子文件来生成一个固定的值,只要两个设备的时间和种子文件一致,他们用otp算法算出的6位数字结果是一样的。而且这个算法不需要联网。
这次需要实现的是在gateway上输入域用户名和密码之后,外加上这个otp的token才能登陆。
效果如下:
Netscaler配置OTP_第1张图片
使用起来的方法是这样的,我们访问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界面。)

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

NetScaler的LDAP配置的路径是Security / AAA - Application Traffic / Policies / Authentication / Advanced Policies / Actions / Servers。
如果AG配置正确,默认应该已经有一个LDAP配置在其中了,还需要配置两条。
Netscaler配置OTP
其中第一条存在的,是用于AG登录时,判断域账号密码是否正确。第二条被称为OTPRegisterDevice(实际上可以起任何名字)被用于注册设备,在后期我们注册设备的时候,我们会连接到域中,然后在用户的属性中修改一些值。实际上这个操作在用户的属性中添加了一个种子的值。
OTPAuth用于读取上面注册设备时留在域用户属性中的值,用于计算token码。
这些操作需要连接到域,所以需要提供域账号,而且其中注册设备的LDAP策略是需要修改域的信息的,所以提供的域账号必须要有修改域用户信息的权限。
Netscaler配置OTP_第6张图片

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

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

接下来的域账号,这个域账号要有修改域账号属性的权限,它的格式是<域账号>@<域名>
右边部分则填写域账号的密码,然后测试网络的连通性,如果你的域账号能够成功登陆域,那么应该是这样的
Netscaler配置OTP
接下来的部分这么填
Netscaler配置OTP_第8张图片
Netscaler配置OTP_第9张图片
其中OTP Secret的部分填写的是域账号中的属性的值,理论上你可以填写任何一个属性的值,不过这里用的是userParameters。
后期注册之后,我们可以进域,然后在域账号中看到这个值。
(示例:种子放在了user1用户的userParameters中)
Netscaler配置OTP_第10张图片
OTPRegisterDevice配置完毕,还有一个OTPAuth。
OTPAuth的作用是读取域用户的userParameters属性,根据这个属性中的种子生成token。
它的配置和注册的LDAP极其像,不过有一个区别,就是在下图的Seach Filter,这个设置告诉设备从哪个属性值中获取种子的值。和上面保存种子值的地方是对应的。默认应该是userParameters>=#@
Netscaler配置OTP_第11张图片

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

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

Netscaler配置OTP_第35张图片
Profile配完之后,再配置Polices

Netscaler配置OTP_第36张图片
Netscaler配置OTP_第37张图片

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

接下来是在浏览器中的访问。注册的过程,应该是很容易理解的。
Netscaler配置OTP_第48张图片
Netscaler配置OTP_第49张图片
Netscaler配置OTP_第50张图片
Netscaler配置OTP_第51张图片
Netscaler配置OTP_第52张图片
你的手机上应该有一个支持otp的token软件,比如身份验证器啊之类的,这个很多,那个公司的无所谓,只要是otp就可以。
然后扫码之后,在手机上获取token并且验证。
Netscaler配置OTP_第53张图片
这里有时候不是一步通过的,如果不能通过需要排错。
(排错)
域服务中userParameters是否有值?
Netscaler和你的手机时间是否一致?(因为otp的值取决于时间)
(排错完毕)
注册完就可以正常登陆gw,登陆了。