Kerberos 如何與 SSH 一起工作?
假設我有四台電腦,Laptop、Server1、Server2、Kerberos 伺服器:
- 我使用 PuTTY 或 SSH 從 L 登錄到 S1,提供我的使用者名/密碼
- 從 S1 我然後 SSH 到 S2。由於 Kerberos 對我進行身份驗證,因此不需要密碼
描述所有重要的 SSH 和 KRB5 協議交換:“L 向 S1 發送使用者名”、“K 向 S1 發送 …”等。
(此問題旨在由社區編輯;請為非專業讀者改進它。)
首次登錄:
l 向S1發送使用者名和SSH認證請求
S1 返回可用的 SSH 身份驗證機制,其中“密碼”是其中之一
L 選擇“密碼”並將明文密碼發送給 S1
S1 將使用者名和密碼提供給 PAM 堆棧。
在 S1 上,PAM(通常是
pam_krb5
或pam_sss
)從 Kerberos KDC 請求 TGT(授予票證的票證)。
S1 獲得一個 TGT。
- 舊式(無預認證):S1 發送一個 AS-REQ 並接收一個包含 TGT 的 AS-REP。
- 新樣式(帶有 preauth):S1 使用您的密碼加密目前時間戳,並將其附加到 AS-REQ。伺服器解密時間戳並驗證它是否在允許的時間偏差內;如果解密失敗,密碼立即被拒絕。否則,在 AS-REP 中返回 TGT。
S1 嘗試使用從您的密碼生成的密鑰來解密 TGT。如果解密成功,則認為密碼正確。
TGT 儲存在新創建的憑證記憶體中。(您可以檢查
$KRB5CCNAME
環境變數以找到 ccache,或用於klist
列出其內容。)S1 使用 PAM 執行授權檢查(取決於配置)並打開會話。
- 如果
pam_krb5
在授權階段呼叫,則檢查是否~/.k5login
存在。如果是,它必須列出客戶端 Kerberos 主體。否則,唯一允許的主體是.*username*@*DEFAULT-REALM*
第二次登錄:
S1 向 S2 發送使用者名和 SSH 身份驗證請求
S2 返回可用的身份驗證機,其中之一是“gssapi-with-mic” 1
S1通過向 KDC 發送帶有 TGT 的 TGS-REQ 並從 KDC 接收帶有服務票證的 TGS-REP 來請求 的票證。
host/*s2.example.com*@*EXAMPLE.COM*
S1 生成“AP-REQ”(認證請求)並將其發送給 S2。
S2 嘗試解密請求。如果成功,則完成身份驗證。(PAM 不用於身份驗證。)
- 其他協議(例如 LDAP)可能會選擇使用請求中包含的“會話密鑰”來加密進一步的數據傳輸;但是,SSH 已經協商了自己的加密層。
如果驗證成功,S2 使用 PAM 執行授權檢查並打開會話,與 S1 相同。
如果啟用了憑證轉發並且 TGT 具有“可轉發”標誌,則 S1 請求使用者 TGT 的副本(設置了“轉發”標誌)並將其發送到 S2,在那裡它被儲存到新的 ccache 中。這允許遞歸 Kerberos 身份驗證登錄。
請注意,您也可以在本地獲取 TGT。在 Linux 上,您可以使用 執行此操作**
kinit
**,然後使用 連接ssh -K
。對於 Windows,如果您登錄到 Windows AD 域,Windows 會為您執行此操作;否則,可以使用MIT Kerberos 。PuTTY 0.61 支持同時使用 Windows (SSPI) 和 MIT (GSSAPI),但您必須手動啟用轉發(委託)。1
gssapi-keyex
也是可能的,但沒有被官方 OpenSSH 接受。