配置 Kerberos SSO 身份验证
本部分介绍如何配置 SSO 身份验证。
示例场景的元素
• INTLANDLOCAL:我们要用于身份验证的 Windows 域和 Kerberos 域。
• winsvr.intland.local:Windows 域 INTLAND.LOCAL 的域控制器 (DC) 的 DNS 名称。此元素还充当 INTLAND.LOCAL 领域的 KDC。
• cb.intland.local:我们要应用 Kerberos 的 Codebeamer 服务器的 DNS 名称。(在本例中,这是基于 Linux 的 Ubuntu 服务器)。
先决条件
本部分列出配置的先决条件。
主机名称
必须为 Kerberos 身份验证领域中的每个服务器分配一个可反向解析的完全限定域名 (FQDN)。
Kerberos 还希望服务器的 FQDN 可反向解析。如果反向域名解析无法实现,请在客户端 krb5.conf 中将 rdns 变量设置为 false。
如果已为服务器分配了 FQDN,请使用以下命令测试正向和反向查找:
$ nslookup winsvr.intland.local
$ nslookup <server ip address>
第一个命令的输出应包含服务器的 IP 地址。第二个命令的输出应包含服务器的 FQDN。
连接
要验证主机之间的连接,请使用 ping 命令:
在 winsvr.intland.local 中:
ping cb.intland.local
如果服务器无法访问,则可将其添加到 hosts 文件:C:\Windows\System32\drivers\etc\hosts。
在 cb.intland.local 中:
ping winsvr.intland.local
如果服务器无法访问,则可将其添加到 hosts 文件:/etc/hosts。
时间同步
Kerberos 协议要求客户端时间和服务器时间相匹配:如果客户端的系统时钟与服务器的系统时钟不匹配,则身份验证将失败。同步系统时钟的最简单方法是使用网络时间协议 (NTP) 服务器。(请知悉:Active Directory 域控制器通常也是 NTP 服务器。)。
防火墙
与所有网络服务一样,Kerberos 必须允许通过主机之间的任何防火墙。Kerberos 系统管理手册对此主题进行了详细介绍。
设置 apache2 模块
要在 apache2 中启用 Kerberos 和重写引擎,应在 cb.intland.local 中执行以下操作
启用重写模块:
$ a2enmod headers
安装 apache2 Kerberos 模块:
$ apt-get install libapache2-mod-auth-kerb krb5-user
需要重新启动 apache2:
service apache2 restart
cb.intland.local 的 Kerberos 配置
本部分介绍配置 intland.local 的相关信息
配置 Kerberos
对于 kdc 为 winsvr.intland.local 的 Kerberos realm INTLAND.LOCAL,应在 /etc/krb5.conf 文件中进行配置:
...
[libdefaults]
default_realm = INTLAND.LOCAL
...
[domain_realm]
cb.intland.local = INTLAND.LOCAL
intland.local = INTLAND.LOCAL
.intland.local = INTLAND.LOCAL
...
[realms]
INTLAND.LOCAL = {
admin_server = winsvr.intland.local
kdc = winsvr.intland.local
}
...
测试 Kerberos 是否工作
使用 kinit 对 Kerberos 设置进行基本检查
• Windows 域 INTLAND.LOCAL 包含用户名和密码。在本示例中,bela 用作用户名。
使用 shell 和类型
如果一切正常,命令将要求您提供 bela 的域密码,并在系统未发布错误消息的情况下终止。
• 使用 klist 显示您从 KDC 获得的初始票证
$ klist
为 cb.intland.local 创建 HTTP 服务主体
对于每个已应用 Kerberos 的主机,您必须针对 KDC 创建服务主体。
• 在 Windows 域 INTLAND.LOCAL 中创建帐户。其使用方式与计算机帐户类似。在本示例中,帐户名称为 cbsrv。
• 登录到 DC winsvr.intland.local,并使用 Windows 命令行工具 ktpass 将帐户 cbsrv 映射到服务主体 HTTP/
[email protected]。您需要该服务主体来对主机 cb.intland.local 应用 Kerberos。
• 如下所述使用 ktpass 选项:
ktpass 命令将创建主要 HTTP/
[email protected],然后将其映射到 AD 帐户 cbsrv,并将其密钥导出到 keytab 文件 (c:\temp\cb-kerberos.keytab) 中。将该文件复制到 cb.intland.local 中,例如以下路径:
/etc/apache2/cb-kerberos.keytab
检查 KDC 发送的票证是否正确
本部分简要介绍检查票证是否正确的相关信息。
检查 winsvr.intland.local 所对应的域和用户属性
检查与 cbsrv 帐户关联的 SPN:
> C:\Users\Administrator>setspn -L cbsrv
Registered ServicePrincipalNames for CN=cbsrv,CN=Users,DC=intland,DC=local:
HTTP/cb.intland.local
检查重复 SPN:
> C:\Users\Administrator>setspn -X
Checking domain DC=intland,DC=local
Processing entry 0
found 0 group of duplicate SPNs.
如果 setspn 找到 intland.local 的重复项,则对于 cb.intland.local,票证请求 (kvno) 将失败。
检查 KDC 向 cb.intland.local 发送的票证 (kvno、enctype) 是否正确:
为用户 cbsvr 获取并缓存 Kerberos 票证 (授予票证)。
获取服务主体的服务票证:
列出登录凭据缓存中存在的 Kerberos 主体和 Kerberos 票证:
列出生成的 keytab 文件中存在的 Kerberos 主体和 Kerberos 票证:
详细检查至关重要:
• 票证 kvno 必须与 keytab 中的 kvno 相匹配
• 票证中的主体名称必须与 keytab 中的主体名称相匹配
准备 keytab 文件
• 使拥有 httpd 进程的用户可以读取 /etc/apache2/cb-kerberos.keytab (chmod 400)。
• 使用 kinit 通过 keytab 文件中的加载密钥来测试创建的 keytab 文件是否对 cb.intland.local 有效:
$ kinit -k -t /etc/apache2/cb-kerberos.keytab HTTP/cb.intland.local
如果此文件无效,则您了解问题原因在于 Kerberos 配置,而与 Apache 或模块无关。
将 apache2 配置为使用 Kerberos 身份验证
打开 /etc/apache2/apache2.conf 文件,并附加以下行:
LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so
LoadModule auth_kerb_module modules/mod_auth_kerb.so
<VirtualHost *:80>
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyRequests Off
ProxyPreserveHost On
ProxyPass /cb http://localhost:8080/cb
ProxyPassReverse /cb http://localhost:8080/cb
ServerName cb.intland.local
<Location /cb>
Order allow,deny
Allow from all
AuthType Kerberos
KrbServiceName HTTP
AuthName "Domain login"
KrbAuthRealms INTLAND.LOCAL
Krb5KeyTab /etc/apache2/cb-kerberos.keytab
require valid-user
KrbLocalUserMapping On
KrbMethodNegotiate On
KrbMethodK5Passwd Off
# Below directives puts logon name of authenticated user into http header X-User-Global-ID
RequestHeader unset X-User-Global-ID
RewriteEngine On
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule /cb.* - [E=RU:%1,L,NS]
RequestHeader set X-User-Global-ID %{RU}e
# Remove domain suffix to get the simple logon name
RequestHeader edit X-User-Global-ID "@INTLAND.LOCAL$" ""
</Location>
</VirtualHost>
如果要使用 AJP 端口,则应使用以下设置:
LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so
LoadModule proxy_ajp_module /usr/lib/apache2/modules/mod_proxy_ajp.so
LoadModule auth_kerb_module modules/mod_auth_kerb.so
<VirtualHost *:80>
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyRequests Off
ProxyPreserveHost On
ProxyPass /cb ajp://localhost:8009/cb
ProxyPassReverse /cb ajp://localhost:8009/cb
ServerName perf.intland.local
<Location /cb>
Order allow,deny
Allow from all
AuthType Kerberos
KrbServiceName HTTP
AuthName "Domain login"
KrbAuthRealms INTLAND.LOCAL
Krb5KeyTab /etc/apache2/kerberos.keytab
require valid-user
KrbMethodNegotiate On
KrbMethodK5Passwd Off
KrbLocalUserMapping On
# Below directives puts logon name of authenticated user into http header X-User-Global-ID
RequestHeader unset X-User-Global-ID
RewriteEngine On
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule /cb.* - [E=RU:%1,L,NS]
RequestHeader set X-User-Global-ID %{RU}e
# Remove domain suffix to get the simple logon name
RequestHeader edit X-User-Global-ID "@INTLAND.LOCAL$" ""
</Location>
</VirtualHost>
确保在 tomcat 的 server.xml 中启用 AJP 端口。
apache2 服务器应在修改后重新启动。
$ service apache2 restart
将 Codebeamer 配置为使用 AD
1. 使用管理员帐户通过 tomcat URL (例如:cb.intland.local:8080/cb) 打开 Codebeamer。
2. 打开“系统管理”视图,然后单击“用户身份验证”。
3. 填写 AD/LDAP 特性,并选中“针对 LDAP/Active Directory 验证用户”复选框。
4. 单击“保存”。
5. 再次打开“用户身份验证”视图。
6. 针对 AD/LDAP 测试身份验证。结果应为:
在 Codebeamer“系统管理”中启用 SSO
• 此配置选项默认禁用。
• 要启用 SSO,请转至“系统管理”和“用户注册”,然后设置复选框:
在客户端启用 Kerberos 身份验证
• 使用域 INTLAND.LOCAL 的帐户登录到工作站。
• 在 Internet Explorer 中打开 Windows 集成的身份验证。
• 确保 webservers DNS 域 (其在本例中为 intland.local) 列在 IE 的本地 Intranet 站点部分。
◦ 要访问本地 Internet 站点部分,请单击 IE 的工具菜单,然后选择“Internet 选项”菜单项。
◦ 在打开的窗口中选择 Security 选项卡。
◦ 单击本地 Intranet 图标,然后单击 Sites 按钮。
◦ 将 cb.intland.local 或 intland.local 域添加到 Intranet 站点中。
◦ 确保已针对 Intranet 站点启用“自动登录”。
在 Firefox 中启用 Kerberos 身份验证
1. 打开 Firefox,然后在地址栏中输入 about:config。消除出现的任何警告。
2. 在“筛选器”字段中,输入 negotiate。
3. 双击 network.negotiate-auth.trusted-uris 首选项。
4. 此首选项列出了用于 Kerberos 身份验证的受信任站点。
5. 在该对话框中,输入域:intland.local。
6. 单击 OK 按钮。
7. 您刚刚在 network.negotiate-auth.trusted-uris 中输入的域现在应显示在“值”列中。该设置会立即生效;不必重新启动 Firefox。
通过 Kerberos SSO 打开 Codebeamer
• 使用域 INTLAND.LOCAL 的帐户登录到工作站。
• 在浏览器中打开 cb.intland.local/cb URL。
• Codebeamer 已打开,登录用户为经过身份验证的用户 bela。
| Codebeamer 7.6 版本使用 SSO HTTP 标题通过 Kerberos 进行自动注册。首次登录系统时,用户应使用标准登录表单进行登录,以便 Codebeamer 通过先前版本的 LDAP/AD 注册用户。 |