最近我更改了 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 服务器的连接?
不,它来自 curl 使用的 GSSAPI 库 (libkrb5)。
为特定服务器 FQDN 颁发 Kerberos 票证,类似于 TLS 证书。当您想
app.example.com
通过 HTTP 进行通信时,您的客户端必须请求HTTP/[email protected]
服务主体的票证。但是,与 TLS(只查看 URL 中的域)不同,传统的 Kerberos 实现使用服务器 IP 地址的反向 DNS 来确定主体名称,这可能导致客户端请求的 SPN 与一个完全不同的 SPN显示在 URL 中。
这对于指向单个 Web 服务器的多个域或使用 DNS 循环到多个 Web 服务器的域尤其常见。例如,如果您的“app.example.com”实际上指向以“web01.example.com”身份加入 AD 的服务器,那么之前 curl 成功请求了“HTTP/web01.example.com”的票证(其中AD 知道)但现在它正在请求您的 AD 域控制器不知道的“HTTP/app.example.com”的票证,因此无法为其签发票证。
如果域仅指向一个 IIS 服务器,
setspn
则可以通过为相同的 Kerberos 密钥添加别名来解决此问题。(这个 MIT/Heimdal Kerberos 行为与 Windows 客户端不同,如果我没记错的话,Windows 客户端总是表现得好像它们有 rdns=off。)