OpenSSH 兩因素身份驗證與 Kerberos/公鑰結合

OpenSSH 兩因素身份驗證與 Kerberos/公鑰結合

我正在嘗試為 OpenSSH 實現雙重認證。環境是Centos 7(核心:3.10.0-229.1.2.el7.x86_64),帶有OpenSSH_6.6.1p1、OpenSSL 1.0.1e-fips 2013 年2 月11 日。 。規格如下:

  • 擁有現有有效 Kerberos 票證的使用者只需詢問第二個因素
  • 沒有現有有效 Kerberos 票證的使用者必須被要求提供其密碼和第二個因素
  • 本機使用者(無 LDAP acc.)應該能夠使用其本機密碼進行身份驗證
  • 第二個因素不得在第一個因素之前提供
  • 除了 Kerberos 之外,如果可用,公鑰身份驗證也應被接受為第一個因素
  • 該功能應該能夠僅限於一組用戶 - 其他人只需使用他們的密碼即可進入

為了執行第二因素的驗證過程,有第 3 方可用的 PAM 模組,而該模組對 Kerberos 一無所知。所以這就是我所做的:

將這些行放入 /etc/ssh/sshd_config 中:

# To enable PAM - this will make sshd use PAM with configuration /etc/pam.d/sshd
UsePam yes
ChallengeResponseAuthentication yes

# To enable Kerberos and public key authentication - it will let sshd use existing Kerberos tickets
GSSAPIAuthentication yes

# Enable public key authentication
PubkeyAuthentication yes

# Password validation should be done via the KDC
PasswordAuthentication yes
KerberosAuthentication yes
KerberosOrLocalPasswd yes

# Kerberos / Public Key + PAM
AuthenticationMethods gssapi-with-mic,keyboard-interactive:pam publickey,keyboard-interactive:pam password,keyboard-interactive:pam
# (only supported for OpenSSH 6.2 or higher)

sshd 的 PAM 配置的 auth 部分 (/etc/pam.d/sshd)

auth       [success=ignore default=1] pam_localuser.so
auth       substack     password-auth
auth       [success=1 default=ignore] pam_localuser.so
auth       required     pam_2fa.so [...some arguments...]
auth       include      postlogin

模組 pam_2fa.so 負責提示並驗證第二個因素。

現在對於 Kerberos,這幾乎可以實現我想要實現的所有目標。但是,對於本機帳戶,它會導致兩個連續的密碼提示。這是我這裡的主要問題。這是因為在這種情況下,按照預期使用了路徑「password,keyboard-interactive:pam」。 (我需要這個 auth.path,這樣擁有 Kerberos 帳戶但沒有有效票證的人可以透過輸入密碼然後輸入 OTP 來獲取票證。)如果我從 PAM 配置中完全刪除密碼身份驗證子堆疊,則 Kerberos 帳戶仍然可以工作且本機帳戶仍然無法使用。對我來說,KerberosOrLocalPasswd yes 語句似乎被忽略,因為 UsePAM yes 也存在。然而,sshd 確實繼續使用 KDC 進行密碼驗證,因為否則它也不適用於 LDAP 帳戶。

再次強調,為了進一步澄清我希望在這裡實現的是描述所需身份驗證邏輯的偽代碼:

if gssapi_auth_ok(principal) or pubkey_auth_ok(pubkey):
  return second_factor_auth(user, read_otp())
else:
  if is_local_account(user):
    if local_passwd_auth(user, read_password()):
      return second_factor_auth(user, read_otp())
    else:
      return AUTH_ERR
  else:
    if krb5_auth(principal, read_password()):
      return second_factor_auth(user, read_otp())
    return AUTH_ERR

所以我認為我的場景在任何方面都不是太複雜或太雄心勃勃,但儘管我花了幾天的時間研究和實驗,但我仍然找不到明確的方法來實現它。你能幫我找到解決方案嗎?

預先非常感謝您!

答案1

我不知道有什麼方法可以在不編寫新的 pam 模組的情況下使用 PAM 完成您想要的操作。 PAM 相對複雜,根據我的經驗,sshd 與 PAM 和 kerberos 互動的方式總是存在著不起作用的邊緣情況。

你想要的也許是可能的,我只是不知道該怎麼做。如果您只需要保護 ssh 我建議使用

ForceCommand  /path/to/2fa_executable 

在你的 sshd_config 中。這將允許您實現您想要的邏輯,缺點是 2fa_executable 需要設定uid 才能讀取任何 2fa 秘密。

Duo Security 網站上有範例和程式碼。您可以使用 duo setuid 包裝器以及您正在使用的任何 2fa 代碼。

雙核心 Unix 配置

答案2

  • 擁有現有有效 Kerberos 票證的使用者只需詢問第二個因素。

這是透過 PAM 無法實現的。

針對 sshd 成功執行的基於金鑰的身份驗證會繞過authPAM 堆疊。這包括 GSSAPI,這是基於票證的 Kerberos 身份驗證的要求。它別無選擇,只能這樣做,因為 PAM 的設計根本就沒有考慮到這種類型的身份驗證。

設定UsePAM yes執行以下操作:

  • ChallengeResponseAuthenticationPasswordAuthentication會掛接authPAM 堆疊來驗證密碼。除了這兩種方法之外的任何形式的身份驗證不是觸摸auth堆疊。
  • 身份驗證成功後,account將呼叫 PAM 堆疊來決定是否允許經過身份驗證的使用者存取。 (總是)
  • 將呼叫 PAM堆疊session來處理會話設定任務。

auth摘要:對於使用 GSSAPI 或 ssh 金鑰進行身份驗證的人來說,絕對沒有辦法讓堆疊中的雙重認證提示符觸發。您可以將accountsessionstack 與這些身份驗證方法結合使用,但這就是 PAM 所能做到的。

答案3

這是如何做的解釋https://cern-cert.github.io/pam_2fa/

  • 基礎:使用 pam 的 2 因素驗證
  • 一個更了解 ssh 身份驗證方法的 pam 模組:

    auth [成功=2 忽略=忽略預設=死] pam_ssh_user_auth.so

  • 最近或修補過的 OpenSSH 將其公開給 pam

    驗證方法 gssapi-with-mic、鍵盤互動:pam publickey、鍵盤互動:pam 鍵盤互動:pam

相關內容