防火墙用户与 SSL VPN SAML 认证(Windows ADFS)
防火墙用户与 SSL VPN SAML 认证(Windows ADFS)
网络需求
ADFS(Active Directory Federation Service),Active Directory 联合身份验证服务是一项需要单独安装在 AD 服务器上的功能。其主要目的是为 AD 用户提供单一登录(SSO)访问权限。
ADFS 可以配合 FortiGate 实现 SAML 认证,本文详细介绍了 FortiGate 代理策略认证与 Windows Server 2019 ADFS 配合做 SAML 认证的配置,本例中 Fortigate 作为 SAML SP(Service Provider), ADFS 作为 SAML IDP(Identity Provider)。
网络拓扑

- FortiGate 作为 SP,Windows Server 安装 ADFS 服务后作为 IDP。
- FortiGate 和 Client 将 DNS 服务器地址配置为 Windows Server 的 IP。
配置步骤
防火墙策略用户 SAML 认证
Windows Server 端配置
在 Windows Server 中安装 AD 域控,加入或新建 AD 域。
在服务器配置中,安装 Windows ADFS 服务。
Client 为 AD 用户。

安装完成后,通过 Server Manager -> Tools -> AD FS Management 打开 ADFS 管理器,并点击 Relying Party Trust,点击右侧的 Add Relying Party Trust 按钮添加信任方。

弹出向导界面,这里选择感知方式,由于配合的是外部的 FortiGate,需要选择 Claims aware,点击 Start。

数据源选择手动输入,点击 Next。

直接点击 Next。

选择 SAML 认证,并填写信赖方的 metadata 地址(FortiGate 内网口的认证地址和端口号)。

配置信赖方 identifier URL,这里填写和上步相同的 URL,并点击 Add。

访问控制策略选择允许所有人访问。

检查配置无误,点击 Next。

点击 Configure claims issuance policy for this application,点击 Close。

在弹出的 Claim 规则中,选择模版为 Send LDAP Attributes as Claims。

配置 Claim 规则,Attribute store 选择 Active Dictionary,如下图配置映射关系,点击 Finish。

右键单击已创建的 Relying Party Trust,点击 Properties。

选择 Endpoints 选项卡,点击 Add SAML 按钮,Endpoint type 选择 SAML Assertion Consumer,Binding 选择 POST,Index 修改为 1,Trusted URL 填写 FortiGate 内网口的 SAML 登陆 URL。

再次新建一个 SAML,Endpoint type 选择 SAML logout,Binding 选择 Redirect,Trusted URL 填写 FortiGate 内网口的 SAML 登出 URL,Response URL 填写 FortiGate 的登出成功页面。

Advance 选项卡可以配置 hash 算法,默认为 SHA256。

进入 ADFS 服务器管理器的 Service → Certificates 界面,选择 Token-signing 下的证书,导出该证书。

将该证书导入 FortiGate 的 Remote Certificate 中。

访问 URL:
https://<ADFS Domain name>/FederationMetadata/2007-06/FederationMetadata.xml,例如实验这台 Windows Server 的 URL 为https://win-8chjfpovf6r.summerice2019.com/FederationMetadata/2007-06/FederationMetadata.xml,下载的 XML 文件中可以看到 IDP 相关信息,并记录。Metadata URL(
http://WIN-8CHJFPOVF6R.summerice2019.com/adfs/services/trust):
Login URL(
https://win-8chjfpovf6r.summerice2019.com/adfs/ls/) ,Logout URL 为https://win-8chjfpovf6r.summerice2019.com/adfs/oauth2/logout:
FortiGate 端配置
在 FortiGate 上配置 SAML 用户,配置 SP 和 IDP 信息,注意这里填写的 SP 信息要和 ADFS 中配置的 Endpoints 信息一致,IDP 信息从 XML 文件中记录的得来,证书选择导入的 ADFS 的 Remote Certificate,算法选择 sha256。
config user saml edit "adfs_saml_user" set entity-id "https://192.168.100.99:1000/remote/saml/metadata" set single-sign-on-url "https://192.168.100.99:1003/remote/saml/login" set single-logout-url "https://192.168.100.99:1003/remote/saml/logout" set idp-entity-id "http://WIN-8CHJFPOVF6R.summerice2019.com/adfs/services/trust" set idp-single-sign-on-url "https://WIN-8CHJFPOVF6R.summerice2019.com/adfs/ls/" set idp-single-logout-url "https://win-8chjfpovf6r.summerice2019.com/adfs/oauth2/logout" set idp-cert "REMOTE_Cert_1" set user-name "username" set digest-method sha256 next end创建用户组,将 SAML 用户加入用户组。
config user group edit "adfs_saml_group" set member "adfs_saml_user" next end在 FortiGate 的防火墙策略中引用该用户组。
config firewall policy edit 1 set srcintf "lan" "port20" set dstintf "port18" "port20" set action accept set srcaddr "all" set dstaddr "all" set schedule "always" set service "ALL" **set groups "adfs_saml_group"** next end
验证配置
Client 访问 www.bilibili.com ,重定向到 IDP 弹出 ADFS 登录页面,使用 SAML tracer 可以看到 SAML SP 和 IDP 的具体 URL。

输入帐号和密码,可以看到向 SP URL POST 了账户信息,登陆成功,正常弹出网页。


SSL VPN 用户认证
Windows Server 端配置
参考以上 IDP、SP URL 的端口号配置为 SSL VPN 端口号。
FortiGate 端配置
参考以上 IDP、SP URL 的端口号改为 SSL VPN 端口,并使用 SSL VPN 引用该用户组即可。
config user saml
edit "adfs_saml_user"
set entity-id "https://192.168.100.99:10443/remote/saml/metadata/"
set single-sign-on-url "https://192.168.100.99:10443/remote/saml/login"
set single-logout-url "https://192.168.100.99:10443/remote/saml/logout/"
set idp-entity-id "http://WIN-8CHJFPOVF6R.summerice2019.com/adfs/services/trust"
set idp-single-sign-on-url "https://WIN-8CHJFPOVF6R.summerice2019.com/adfs/ls/"
set idp-single-logout-url "https://win-8chjfpovf6r.summerice2019.com/adfs/oauth2/logout"
set idp-cert "REMOTE_Cert_1"
set user-name "username"
set digest-method sha256
next
end验证配置
打开 SSL VPN Web 登陆界面,点击 Single Sign-On。

重定向到 IDP 弹出 ADFS 登录页面,使用 SAML tracer 可以看到 SAML SP 和 IDP 的具体 URL。

输入帐号和密码,可以看到向 SP URL POST 了账户信息,登陆成功,正常弹出 SSL VPN 资源页面。

登出 SSL VPN,可以看到 IDP 登出成功,且正常弹出 logoutok 页面。

在 FortiGate 查看登陆用户。

使用 FortiClient 进行 SSL VPN SAML 认证。

弹出 ADFS 认证页,输入帐号密码。

登陆成功。

在防火墙上查看登陆用户。

注意事项
确保 SAML IDP 服务器的系统时间和客户端的时间一致,否则会认证失败,通过 diagnose debug application samld -1 可以看到该错误信息。
__samld_sp_login_resp [859]: Clock skew tolerance: 21 __samld_sp_login_resp [866]: Clock skew issue.重要
7.0.4 GA 开始支持配置 Clock skew tolerance 超时时间:
config user saml edit <> set clock-tolerance <in seconds> ( 0-300, 15 by default) next end如果客户端访问 IDP 需要穿过防火墙,需要在认证策略前配置一条去往 IDP 服务器的策略,并开启 captive-portal-exempt。
config firewall policy edit 2 set srcintf "lan" set dstintf "port18" set action accept set srcaddr "all" set dstaddr "192.168.101.77/32" set schedule "always" set service "ALL" **set captive-portal-exempt enable** next该错误表示 FortiGate 上的 SP、IDP URL 与 ADFS 中 Endpoints 中配置的 URL 不一致,需要检查配置。

该错误表示客户端未安装 ADFS 所属 AD 域的 CA 证书。

如果 SAML 弹出的登陆界面超时时间过短,来不及输入密码就过期了,可以通过以下命令修改超时时间。
config system global set remoteauthtimeout 60 //Number of seconds that the FortiGate waits for responses from remote RADIUS, LDAP, or TACACS+ authentication servers. (1-300 sec, default = 5). end