Kerberos rdns=false 中斷從 Linux 客戶端到 Windows IIS 伺服器的連接
最近我更改了 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 伺服器的連接?
但是這個錯誤不是來自 IIS 網路伺服器嗎?
不,它來自 curl 使用的 GSSAPI 庫 (libkrb5)。
為什麼客戶端的配置設置會影響 Web 伺服器的功能?即-如果客戶端進行反向查找,Web伺服器關心什麼,它甚至如何知道客戶端是否進行反向查找?
為特定伺服器 FQDN 頒發 Kerberos 票證,類似於 TLS 證書。當您想
app.example.com
通過 HTTP 進行通信時,您的客戶端必須請求HTTP/app.example.com@EXAMPLE.COM
服務主體的票證。但是,與 TLS(只查看 URL 中的域)不同,傳統的 Kerberos 實現使用伺服器 IP 地址的反向 DNS 來確定主體名稱,這可能導致客戶端請求與一個完全不同的 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。)