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