Active-Directory

PAM 接受有效使用者的任何密碼

  • January 2, 2018

我剛剛將我的 Arch Linux 工作站連接到我為我們公司設置的 Samba AD。我測試了它,它起作用了,或者我是這麼認為的。它接受了我的密碼,創建了我的 homedir 和所有內容,然後讓我登錄。我忘記測試的是它接受的內容。事實證明,只要使用者名有效(AD 或本地,無所謂),它就會接受任何密碼。有人可以指出我做錯了什麼嗎?

我正在使用 SSSD 來管理 AD 連接。這是我的/etc/pam.d/system-auth

#%PAM-1.0

auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        sufficient    pam_sss.so use_first_pass
auth        required      pam_env.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     [default=bad success=ok user_unknown=ignore] pam_sss.so
account     required      pam_permit.so

password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    sufficient    pam_sss.so use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     optional      pam_mkhomedir.so umask=0077
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_sss.so

讓我們詳細分析一下您的 PAM 配置的身份驗證部分。

auth        sufficient    pam_unix.so nullok try_first_pass

第一行說:“如果此測試成功,請停止進一步檢查並接受登錄;如果失敗,請繼續檢查。檢查在/etc/passwd和中配置的使用者/密碼/etc/shadow。如果使用者存在並且密碼欄位為空,則使用者是允許進入。” 這是本地使用者帳戶的身份驗證檢查。

auth        requisite     pam_succeed_if.so uid >= 500 quiet

第二行說:“如果此測試失敗,停止檢查並拒絕登錄;如果成功,繼續檢查。使用者的 UID 值必須為 500 或更大。” 這可以防止使用 AD 或其他共享使用者數據庫中的密碼登錄系統帳戶。

auth        sufficient    pam_sss.so use_first_pass

第三行說:“如果此測試成功,請停止進一步檢查並接受登錄;如果失敗,請繼續檢查。檢查 SSSD。” 這是對 AD 帳戶的檢查。

auth        required      pam_env.so

第四行說:“如果這一行失敗,拒絕登錄;但無論如何都要檢查到本節的末尾。設置/etc/security/pam_env.conf和/或中描述的任何環境變數/etc/environment。”

現在想想如果使用者存在(在 AD 或 local 中/etc/passwd)但密碼檢查失敗會發生什麼。第一,pam_unix.so失敗;但這不會導致拒絕,因為這會阻止您使用任何基於 AD 的使用者帳戶。

所以這個過程繼續到第二行。如果使用者有一個有效的 UID 映射並且 UID 號是 500 或更大,這也將成功。如果 UID 小於 500,這將失敗的唯一方法。

第三行進行 AD 檢查;這也失敗了。但同樣,“足夠”用於允許在此之後配置任何其他身份驗證方法,因此該過程繼續進行,就像pam_unix.so.

此時,第四行必須執行成功才能讓使用者進入。但這只是設置環境變數。man pam_env告訴我pam_env.so如果成功設置環境變數,模組將返回 PAM_SUCCESS 值。但是因為這是這個堆棧中的最後一個 PAM 模組,並且到目前為止沒有其他模組會提出絕對拒絕,所以這個模組的結果將成為身份驗證階段的整體結果。

為了解決這個問題,身份驗證階段需要pam_deny.so在最後,以在所有實際身份驗證機制都未能接受使用者時停止任何登錄嘗試。

此外,這pam_env.so可能應該在該過程的早期發生,以便環境變數初始化對於所有有效使用者都將以相同的方式發生。如果這在階段開始時不起作用auth,那麼pam_env.so應該改為進入session階段;man pam_env表示它將auth分階段工作session

因此,我最初的建議是將auth您的 PAM 配置部分更改為:

auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        sufficient    pam_sss.so use_first_pass
auth        requisite     pam_deny.so

因此,功能將是:

  • 為使用者設置環境變數。如果這失敗了,那麼無論如何都會出現嚴重錯誤。
  • 檢查本地密碼;如果成功,則接受登錄並結束此階段。
  • 此時拒絕任何 UID 小於 500 的使用者(= 沒有使用 AD 帳戶登錄的 root 或系統帳戶!)
  • 檢查 AD 中的密碼;如果成功,則接受登錄並結束此階段。
  • 如果我們到了這一點,沒有一個真正的身份驗證機制接受密碼,所以無條件拒絕登錄嘗試。

如果事實證明pam_env.so放在auth階段開始時會導致問題,您可以嘗試將其註釋掉;似乎以前在任何有效登錄時都會跳過它。

與更改 PAM 配置時一樣,首先打開與系統的會話並確保它是sudoroot 使用者或具有可用的完全 root 權限:然備份份目前配置。進行更改但不要註銷以進行測試:相反,通過打開另一個會話進行測試。如果失敗,您仍然可以登錄原始會話,因此您可以在必要時輕鬆恢復舊配置。如果這是一個生產系統或其他關鍵系統,請在進行更改之前打開兩個根會話,以防止手指比大腦更快的錯誤。

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