显式代理SAML认证(Windows ADFS)

网络需求

在防火墙上启用显示代理,并且配置基于AD FS的SAML SSO进行用户验证。

网络拓扑

image-20231030114023394

  1. FortiGate的LAN口port2连接Windows AD服务器和Windows AD电脑。
  2. FortiGate的WAN口port1连接Internet。
  3. port2上启用explicit proxy和captive portal,验证通过SAML SSO完成。SAML SSO由Windows AD服务器上的AD FS提供。
  4. Windows AD电脑上设置FortiGate的port2作为上网的代理服务器。
  5. 完成配置后,Windows AD服务器作为SAML IdP(提供验证服务),FortiGate作为SAML SP(发起验证请求)。

配置步骤

Windows服务器配置

  1. 在本示例中,Windows AD服务器的OS是Windows 2019, version 1809。FortiGate是VM 7.0.12,SAML SSO 验证服务由Windows AD服务器上的AD FS (Active Directory Federation Service) 提供。
  2. Windows AD服务器和FortiGate的时间需要在同一时区,时间差默认不能超过15秒。建议都使用NTP。可以在FortiGate上修改时间差的容忍值

安装LDAP服务

  1. LDAP服务由Active Direcotry Domain Service,或者Active Directory Lightweight Directory Services提供。
  2. 在本示例中,Windows服务器10.10.186.5已经安装了Active Direcotry Domain Service。

安装AD Certificate Services证书服务

  1. AD FS服务需要用到SSL证书,如果没有证书,可以在Windows Server上安装AD DC,然后在AD DC上为AD FS服务新建证书。

  2. 如果你已经有供AD FS服务使用SSL证书,或者已经安装了AD DC,可以跳过这一步。

  3. 你也可以使用openssl或者其他工具为AD FS服务生成证书,然后将证书导入AD FS,将CA导入Windows AD服务器。

  4. 在Server Manager中安装”Active Directory Certificate Services”。

    Untitled

  5. Features: 直接Next。

  6. Role Services: Certification Authority。

    Untitled

  7. 使用默认配置,完成安装。

配置AD 证书服务

如果你已经有供AD FS服务使用SSL证书,可以跳过这一步。
  1. 打开AD CS configuration。

  2. Credentials: 默认。

    Untitled

  3. Role Serivces 选择Certificateion Authority。

    Untitled

  4. Setup Type 选择Enternprise CA。

    Untitled

  5. CA Type 选择 Root CA。

    Untitled

  6. 使用默认配置,完成AD CS的配置。

    Untitled

    Untitled

    Untitled

    Untitled

    Untitled

    Untitled

在AD证书服务中创建证书模板

如果你已经有供AD FS服务使用SSL证书,可以跳过这一步。
  1. 在Windows CMD中运行certsrv.msc。

  2. 右键点击Certificate Templates,点击Manage。

    Untitled

  3. 右键点击Computer,点击Duplicate Template。

    Untitled

  4. 在General标签页,给模板取名,并且选中”Publish certificate in Active Directory”。

    Untitled

  5. 在Request Handling标签页,选中”Allow private key to be exported”。

    Untitled

  6. 在Subject Name标签页,设置Subject name format: Common name。

    Untitled

  7. 在Security标签页,点击Add…。

    Untitled

  8. 修改Select this object type: Computers。

    Untitled

  9. Enter the ojbect names to select中找到AD证书服务器。

    Untitled

  10. 赋予AD证书服务器Full Control。

    Untitled

  11. 点击OK完成证书模板配置。

  12. 回到certsrv.msc。

  13. 右键点击Certificate Templates,点击New > Certificate Template to Issue。

    Untitled

  14. 选中刚才创建的证书模板。点击OK。

    Untitled

  15. 在列表中可以看到发布的证书模板。

    Untitled

为AD FS创建证书

如果你已经有供AD FS服务使用SSL证书,可以跳过这一步。
  1. 在Windows CMD中运行certlm.msc。

  2. 右键点击Personal, 点击All Taks > Request New Certificate…

    Untitled

  3. 点击Next。

    Untitled

    Untitled

  4. 选中刚才创建的证书模板,点击Enroll。

    Untitled

  5. 可以在Personal > Certificate中看到新创建的证书,这个证书将会提供给AD FS使用。

    Untitled

  6. 这是生成的证书,供参考:AD FS SSL.cer

安装AD FS

如果你已经安装了AD FS,可以跳过这一步。

在Server Manager中安装Active Direcotry Federation Services。选择默认配置,完成安装。

Untitled

初始化AD FS

  1. 在Server Manger点击Configure the federation service on this server,初始化AD FS。

    Untitled

  2. Welcome,保持默认。

    Untitled

  3. Connect to AD DS,保持默认。

    Untitled

  4. Specify Service Properties:SSL Certificate: 选择刚才生成的证书;Federation Service Display Name:可按需输入。这些字符将出现在SSO 登陆页面。

    Untitled

  5. Specify Service Account,可以使用普通的AD user账号,也可以是AD admin账号。

    Untitled

  6. Specify Database,创建一个数据库即可。然后Next,完成配置。

    Untitled

配置FortiGate作为SAML SP

导入AD FS的证书

  1. 进入Windows AD FS Management,点击Service > Certificates,右键点击Token-signing的证书,点击View Certificate…

    Untitled

  2. 在Details标签页,点击Copy to File…

    Untitled

  3. 以Base-64的格式保存。

    Untitled

  4. 然后将证书以Remote Certificate的方式导入到防火墙。

    Untitled

配置user saml,输入SP 和 IdP URL

  1. 现在我们可以在user saml中配置SP和IdP的 URL。

    config user saml
        edit "saml_user"
            set cert "Fortinet_CA_SSL"
            set entity-id "https://fgt.wtao.local:7831/XX/YY/ZZ/saml/metadata/"
            set single-sign-on-url "https://fgt.wtao.local:7831/XX/YY/ZZ/saml/login/"
            set single-logout-url "https://fgt.wtao.local:7831/XX/YY/ZZ/saml/logout/"
            set idp-entity-id "http://win2019.wtao.local/adfs/services/trust"
            set idp-single-sign-on-url "https://win2019.wtao.local/adfs/ls/"
            set idp-single-logout-url "https://win2019.wtao.local/adfs/ls/"
            set idp-cert "REMOTE_Cert_1"
            set digest-method sha1
            set adfs-claim enable
            set user-claim-type name
            set group-claim-type group
        next
    end
    
  2. 配置解释:

    • entity-id, single-sign-on-url, single-logout-url中写的是FortiGate的SP URL,这是由需要用到SAML SSO的服务预定义的。例如:

      • explicit proxy需要SAML SSO时,这3项是:

          # 10.10.186.1是电脑访问的,位于防火墙上的提供explicit proxy的接口IP地址。
          # 它也可以是FQDN - 用户电脑、防火墙(SP)和AD FS(IdP)需要能够解析到相同的IP地址。
          # 7831是固定端口
          set entity-id "https://10.10.186.1:7831/XX/YY/ZZ/saml/metadata/"
          set single-sign-on-url "https://10.10.186.1:7831/XX/YY/ZZ/saml/login/"
          set single-logout-url "https://10.10.186.1:7831//XX/YY/ZZ/saml/logout/"
        
      • captive portal需要SAML SSO时,这3项是

          # 10.10.186.1是防火墙上进行captive portal验证的接口IP地址,1003是固定端口。
          set entity-id "https://10.10.186.1:1003/remote/saml/metadata/"
          set single-sign-on-url "https://10.10.186.1:1003/remote/saml/login/"
          set single-logout-url "https://10.10.186.1:1003/remote/saml/logout/"
        
      • SSL VPN需要SAML SSO时,这3项是

          # sslvpn.mycompany.com 是用户访问的SSL VPN地址,10443是SSL VPN服务端口
          set entity-id "https://sslvpn.mycompany.com:10443/remote/saml/metadata/"
          set single-sign-on-url "https://sslvpn.mycompany.com:10443/remote/saml/login/"
          set single-logout-url "https://sslvpn.mycompany.com:10443/remote/saml/logout/"
        
  • idp-entity-id, idp-single-sign-on-url, idp-single-logout-url写的是AD FS提供IdP服务的URL,这3个URL在AD FS安装后是固定的。所有使用AD FS的SP都是用相同的这3个URL。

    防火墙和用户电脑都必须能够解析AD FS的主机名。
    set idp-entity-id "http://win2019.wtao.local/adfs/services/trust"
    set idp-single-sign-on-url "https://win2019.wtao.local/adfs/ls/"
    set idp-single-logout-url "https://win2019.wtao.local/adfs/ls/"
    

配置AD FS作为SAML IdP

AD FS上的Relying Party Trust定义了AD FS为哪个SP提供服务,当我们把防火墙配置成为SAML SP后,需要把那3个 SP URL写入到AD FS的Relying Party Trust。

添加Relying Party Trust

  1. 进入AD FS Management。

    Untitled

  2. select 'Claims Aware' and click 'Start’。

    Untitled

  3. 选择 “Enter data about the relying party manually”。

    Untitled

    Untitled

  4. 保持默认,Next。

    Untitled

  5. Configure URL, 选择”Enable support for the SAML 2.0 WebSSO protocol”,输入防火墙上user saml中的entity-id, https://fgt.wtao.local:7831/XX/YY/ZZ/saml/metadata/

    Untitled

  6. Configure Identifiers中,还是输入防火墙上user saml中的entity-id:https://fgt.wtao.local:7831/XX/YY/ZZ/saml/metadata/ ,点击Add,再点击Next。

    Untitled

  7. Choose Access Control Policy选择 Permit everyone。

    Untitled

  8. Ready to Add Trust,先不填写,Next。

    Untitled

  9. 取消“Configure claims issuance policy for this application”,点击Close。

    Untitled

配置Relying Party Trust > Claim Issuance Policy

  1. 在Relying Party Trust,右键点击刚才创建的relying party trust,点击“Edit Claim Issuance Policy”。

    Untitled

  2. click on 'Add Rule’。

    Untitled

  3. Claim rule template: Send LDAP Attributes as Claims。

    Untitled

  4. Configure Claim Rule:

    Untitled

    • Claim rule name: 按需取名。
    • Attribute store: Active Directory。
    • Mapping of LDAP attributes to outgoing claim types:
      • User-Principal-Name: username (手动输入)
      • User-Principal-Name: Name ID (有预选项)
      • User-Principal-Name: Name(有预选项)
  5. 点击Finish保存。

配置Relying Party Trust > SP URL

  1. 在Relying Party Trust中将防火墙的SP URL输入。

  2. 在Relying Party Trust,右键点击刚才创建的relying party trust,点击”Properties”。

    Untitled

  3. Endpoint标签页, 点击Add SAML…

    Untitled

  4. 点击OK。

    Untitled

  5. 再次点击Add SAML…

    Untitled

  6. 点击OK,这是完成配置的Endpoitns标签页。点击OK。

    Untitled

配置Relying Party Trust >SHA和防火墙证书

  1. 在Relying Party Trust,右键点击刚才创建的relying party trust,点击”Properties”。

    Untitled

  2. 在Advanced标签页,将Secure hash algorithm设置为SHA-1,和防火墙上的user saml > “set digest-method sha1” 保持一致。

    Untitled

  3. explicit proxy使用AD FS 作为SAML SSO时,AD FS会验证防火墙SP URL的证书,因此需要将防火墙上的Forinet_CA_SSL导入AD FS。

  4. 在防火墙上下载Forinet_CA_SSL。

    Untitled

  5. 在Signature标签页,导入Forinet_CA_SSL。

    Untitled

配置FortiGate启用explicit proxy和captive portal

  1. 启用explicity proxy和captive portal。在内网口port2上启用explicit-web-proxy和proxy-captive-portal。

    # Enable the web proxy:
    config system settings
      set gui-explicit-proxy enable
    end
    
    config web-proxy explicit
        set status enable
        set http-incoming-port 8080
        set unknown-http-version best-effort
    end
    
    # Enable the proxy captive portal:
    config system interface
        edit "port2"
            set explicit-web-proxy enable
            set proxy-captive-portal enable
        next
    end
    
  2. 配置LDAP服务器和LDAP用户组。

    # Configure the LDAP server
    config user ldap
        edit "ldap-10.10.186.5"
            set server "10.10.186.5"
            set cnid "userPrincipalName"
            set dn "dc=wtao,dc=local"
            set type regular
            set username "cn=administrator,cn=users,dc=wtao,dc=local"
            set password password_of_the_user
            set group-search-base "cn=users,dc=wtao,dc=local"
        next
    end
    
    config user group
        edit "ldap-group-saml"
            set member "ldap-10.10.186.5"
        next
    end
    
  3. 配置authentication scheme, rule和setting。

    config authentication scheme
        edit "auth_scheme_saml"
            set method saml
            set saml-server "saml_user"
            set user-database "ldap-10.10.186.5"
        next
    end
    
    config authentication rule
        edit "auth_rule_saml"
            set srcaddr "all"
            set active-auth-method "auth_scheme_saml"
        next
    end
    
    config firewall address
        edit "fgt.wtao.local"
          set type fqdn
          set fqdn "fgt.wtao.local"
    end
    
    config authentication setting
        set active-auth-scheme "auth_scheme_saml"
        set captive-portal "fgt.wtao.local"
    end
    
  4. 配置proxy-policy。proxy-policy #2,访问Windows AD FS服务器时,不需要用户名;proxy-policy #1,访问外网时,需要用户名,触发SAML SSO验证。

    config firewall address
        edit "win2019.wtao.local_IP"
            set type iprange
            set start-ip 10.10.186.5
            set end-ip 10.10.186.5
        next
    end
    config firewall proxy-policy
        edit 2
            set name "bypass"
            set proxy explicit-web
            set dstintf "port2"
            set srcaddr "all"
            set dstaddr "win2019.wtao.local_IP"
            set service "webproxy"
            set action accept
            set schedule "always"
            set logtraffic all
            set ssl-ssh-profile "certificate-inspection"
            set comment "no user identity is required for traffic to AD FS"
        next
        edit 1
            set name "proxy"
            set proxy explicit-web
            set dstintf "port1"
            set srcaddr "all"
            set dstaddr "all"
            set service "webproxy"
            set action accept
            set schedule "always"
            set logtraffic all
            set groups "ldap-group-saml"
            set ssl-ssh-profile "certificate-inspection"
        next
    end
    
  5. 配置防火墙策略。firewall policy#1,访问外网时,需要用户名。

    config firewall policy
        edit 1
            set name "LANtoWAN"
            set srcintf "port2"
            set dstintf "port1"
            set action accept
            set srcaddr "all"
            set dstaddr "all"
            set schedule "always"
            set service "ALL"
            set logtraffic all
            set nat enable
            set groups "ldap-group-saml"
        next
    end
    

电脑上设置使用防火墙作为上网代理

  1. 在Windows AD电脑上设置使用FortiGate的LAN port2作为上网代理服务器。

    Untitled

  2. 当Windows AD电脑访问公网网站时,会被重定向到AD FS SAML登陆页面。登陆页面的标题文字是在”1.7 初始化AD FS”中设置的。用户名的格式是UPN (User Principal Name)。

    Untitled

结果验证

  1. GUI > Dashboard > Users & Devices > Firewall Users显示登陆的用户。

    Untitled

  2. diag wad user list 会显示用户详情。

    FGVM01TM23001796 # diag wad user list
    
    ID: 2, VDOM: root, IPv4: 10.10.186.10
      user name   : user1@wtao.local
      worker      : 0
      duration    : 70
      auth_type   : IP
      auth_method : SAML
      pol_id      : 1
      g_id        : 2
      user_based  : 0
      expire      : no
      LAN:
        bytes_in=319243 bytes_out=17951352
      WAN:
        bytes_in=17925608 bytes_out=277637
    
    FGVM01TM23001796 #
    

故障排查

下面的错误表明在步骤“配置Relying Party Trust > Claim Issuance Policy”时,缺少User-Principal-Name: Name 的映射。加上后,问题可以解决。

Authentication failed.
user.saml.saml_user.user-name='http://schemas.xmlsoap.org/ws/2005/05/identity/claims/**name**' was NOT FOUND in the SAML Assertion Response.
Please check with the Administrator.

Copyright © 2024 Fortinet Inc. All rights reserved. Powered by Fortinet TAC Team.
📲扫描下方二维码分享此页面👇
该页面修订于: 2024-01-04 10:20:13

results matching ""

    No results matching ""