Linux

Kerberos 如何與 SSH 一起工作?

  • March 28, 2016

假設我有四台電腦,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_krb5pam_sss)從 Kerberos KDC 請求 TGT(授予票證的票證)。

    1. S1 獲得一個 TGT。

      • 舊式(無預認證):S1 發送一個 AS-REQ 並接收一個包含 TGT 的 AS-REP。
      • 新樣式(帶有 preauth):S1 使用您的密碼加密目前時間戳,並將其附加到 AS-REQ。伺服器解密時間戳並驗證它是否在允許的時間偏差內;如果解密失敗,密碼立即被拒絕。否則,在 AS-REP 中返回 TGT。
    2. S1 嘗試使用從您的密碼生成的密鑰來解密 TGT。如果解密成功,則認為密碼正確。

    3. 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 接受。

引用自:https://serverfault.com/questions/329901