最近我更改了 Linux 客户端上的 krb5.conf 文件以使用:
[libdefaults]
rdns = false
这些客户端仍可成功使用 kerberos 身份验证连接到其他 Linux 网络服务器。但是,现在它们与 IIS 网络服务器的连接中断了。我看到的一个示例错误是:
< HTTP/1.1 401 Unauthorized
< Content-Type: text/html
< Server: Microsoft-IIS/8.5
* gss_init_sec_context() failed: Server not found in Kerberos database.
但是,当我删除 rdns=false 时,Linux 客户端可以顺利进行身份验证/连接。我可以通过添加rdns=false
并查看失败,然后删除它并查看成功来不断重现此行为。为什么 rdns=false 会中断从 Linux 客户端到 IIS Web 服务器的连接?
答案1
但是这个错误不是来自 IIS 网络服务器吗?
不,它来自 curl 使用的 GSSAPI 库 (libkrb5)。
为什么客户端的配置设置会影响 Web 服务器的功能?即 Web 服务器关心客户端是否进行反向查找,以及如何知道客户端是否进行反向查找?
Kerberos 票证是针对特定服务器 FQDN 颁发的,类似于 TLS 证书。当您想要app.example.com
通过 HTTP 进行通信时,您的客户端必须为服务主体请求票证。HTTP/[email protected]
但是,与 TLS(它只查看 URL 中的域而不查看其他任何内容)不同,传统的 Kerberos 实现使用服务器 IP 地址的反向 DNS 来确定主体名称,这可能导致客户端请求的票证的 SPN 与 URL 中显示的 SPN 完全不同。
这在多个域指向单个 Web 服务器或使用 DNS 轮询到多个 Web 服务器的域中尤其常见。例如,如果您的“app.example.com”实际上指向已加入 AD 的服务器“web01.example.com”,则以前 curl 成功请求了“HTTP/web01.example.com”的票据(AD 知道),但现在它请求了“HTTP/app.example.com”的票据,而您的 AD 域控制器不要知道,因此不能发出门票。
如果域仅指向一台 IIS 服务器,setspn
则可以通过为同一个 Kerberos 密钥添加别名来解决这个问题。
(如果我没记错的话,MIT/Heimdal Kerberos 的行为与 Windows 客户端不同,Windows 客户端的行为总是像 rdns=off 一样。)