【发布时间】:2017-02-24 08:18:15
【问题描述】:
我在帮助客户为我们的软件配置 SSO(使用 Kerberos)时遇到了问题。
但首先,让我们给你一些背景:
正如您在附加的 krb5.ini 中看到的,我们想做跨域/领域 Kerberos,我们有四个不同的(Active Directory;都具有 2008 R2 森林/域功能级别)域。
1) test.local 2) subdomain.test.local(显然是 test.local 的子域) 3) example.local 4) dummy.local
在 test.local 和 example.local 之间以及在 test.local 和 example.local 之间(手动)设置了双向传递信任。
并且(当然)在 test.local 和 subdomain.test.local 之间存在默认信任。
[libdefaults]
default_realm = TEST.LOCAL
default_tkt_enctypes = rc4-hmac aes128-cts aes256-cts des-cbc-crc des-cbc-md5
default_tgs_enctypes = rc4-hmac aes128-cts aes256-cts des-cbc-crc des-cbc-md5
permitted_enctypes = rc4-hmac aes128-cts aes256-cts des-cbc-crc des-cbc-md5
[realms]
TEST.LOCAL = {
kdc = dc001.TEST.local
kdc = dc002.TEST.local
}
EXAMPLE.LOCAL = {
kdc = dc001.example.local
kdc = dc002.example.local
}
SUBDOMAIN.TEST.LOCAL = {
kdc = dc001.SUBDOMAIN.TEST.local
kdc = dc002.SUBDOMAIN.TEST.local
}
DUMMY.LOCAL = {
kdc = dc001.dummy.local
kdc = dc002.dummy.local
}
[domain_realm]
test.local=TEST.LOCAL
.test.local=TEST.LOCAL
example.local=EXAMPLE.LOCAL
.example.local=EXAMPLE.LOCAL
dummy.local=DUMMY.LOCAL
.dummy.local=DUMMY.LOCAL
subdomain.test.local=SUBDOMAIN.TEST.LOCAL
.subdomain.test.local=SUBDOMAIN.TEST.LOCAL
跨域名解析效果很好。
网络服务器是一个 linux 机器(如果我没记错的话,它是一个 RedHat 或 CentOS 安装)。 fqdn 是 web001.test.local。
客户端(与其所属的域分开)将 fqdn web001.test.local 视为本地 Intranet 区域的成员。
我们成功地为网络服务器创建了一个服务用户和一个相应的 keytab 文件。
如果我们查询 test.local 并搜索 spn,我们会得到正确的响应:
<service user)>
HTTP/web001.test.local@TEST.LOCAL
HTTP/web001.test.local
HTTP/web001
之后我们开始测试并且 Kerberos 运行良好(如果用户是 test.local 或 subdomain.test.local 的成员),直到我们尝试使用来自 dummy.local 和 example.local 的测试用户登录。
每次用户尝试从这些特定域登录时,我们都会得到以下堆栈跟踪:
09:44:25.447 WARN REQUEST[10.50.50.45]
o.s.s.k.w.a.SpnegoAuthenticationProcessingFilter - Negotiate Header was
invalid: Negotiate YIIJ...
org.springframework.security.authentication.BadCredentialsException:
Kerberos validation not successful
Caused by: java.security.PrivilegedActionException: null
Caused by: sun.security.krb5.KrbCryptoException: Checksum failed
Caused by: java.security.GeneralSecurityException: Checksum failed
正如我之前所说:Kerberos 与 test.local 和 subdomain.test.local 领域/域中的客户端/用户一起工作。
但我不明白为什么它不能与其他域/领域一起使用。
有人可以启发我或至少给我一个提示吗?
提前致谢。
附:关于调试/响应:我没有直接访问客户域(活动目录)和网络服务器的权限。因此,调试和回复您的答案可能需要几天时间。
【问题讨论】:
-
您真的检查过example.local域上的客户端是否获得了HTTP/web001.test.local的服务票证吗?来自 example.local 的 KDC 不能发出这样的服务票证。相反,来自 example.local 的 KDC 必须告诉客户端使用 KDC test.local 来获取这样的服务票证。你可以看看technet.microsoft.com/en-us/library/bb742516.aspx
-
我本人没有检查过。但我会要求客户检查。但据我所知,example.local 中的 KDC 会发出服务票证。但不是直接发给客户端,而是来自 test.local 的服务票证(通过信任)“交叉签名”,如此处所示(adsecurity.org/?p=1588;第二张图片)。但我主要担心的是我不明白为什么这适用于 test.local 以及 subdomain.test.local 但不适用于其他两个域。所以必须有区别。
-
您引用的链接存在安全漏洞,而不是以正确的方式工作
-
看来你最初的想法是对的。客户端(来自 example.local 或 dummy.local)似乎没有获得 HTTP/web001.test.local 的服务票证。问题是为什么?因为它适用于 test.local 以及 subdomain.test.local。
标签: spring-security kerberos spring-security-kerberos kerberos-delegation