在我的环境中,外部实体提供根 CA 和中间 CA。他们签发数千张带有 PKI 证书的智能卡以进行身份验证。他们在扩展密钥使用、主题备用名称字段中提供客户端身份验证(OID 1.3.6.1.5.5.7.3.2)。这包含用户的唯一 ID 号,即[电子邮件保护],其目的是作为用户的 Active Directory userPrincipalName (UPN)。
这些智能卡的有效期最短为 30 天,最长为 3 年,利用 UPN 进行身份验证允许用户在智能卡过期/损坏并获得新卡时保持访问权限,而无需在 Active Directory 中重新关联他们的证书。
上述身份验证方案适用于 Windows 工作站、服务器、Linux 服务器,并且是不可变的(不受控制)。
现在,我们尝试设置 HTTPD,使用 SSL/TLS 客户端身份验证通过 PKI 证书对这些用户进行身份验证。在基本身份验证级别,如果用户拥有由中间人签名的 PKI 令牌,并且该令牌未被 CRL 或 OCSP 撤销,则验证用户身份。
我们正在尝试将他们的 PKI 会话与他们的活动目录帐户关联起来,以便我们可以基于 Active Directory 安全组成员身份进行授权。
我们可以提取 UPN,但似乎没有办法将 mod_ssl 客户端身份验证桥接到 mod_authnz_ldap 授权方案。
以下是我们的概念验证 httpd 配置。
Listen 443 https
<VirtualHost _default_:443>
SSLEngine on
.... standard SSL options ....
<Location /secure-pki>
SSLVerifyClient require
SSLVerifyDepth 2
# How do we map the SSL_CLIENT_SAN_OTHER_msUPN_0 environment variable so mod_authnz_ldap uses it?
AuthLDAPBindDN "[email protected]"
AuthLDAPBindPassword "apassword"
AuthLDAPURL "ldaps://ldap1.example.com ldap2.example.com:3269/dc=example,dc=com?userPrincipalName?sub?(objectClass=user)"
Require ldap-group cn=Managers,ou=Groups,dc=example,dc=com
</Location>
</VirtualHost>
因此,本质上我们无法弄清楚如何将 SSL_CLIENT_SAN_OTHER_msUPN_0 环境变量映射到 mod_authnz_ldap 的用户名,以便 mod_authnz_ldap 使用它进行授权检查。