問題現象
啟用或修改Linux系統的PAM(Pluggable Authentication Modules)模組配置後,或PAM模組檔案缺失時,在系統日誌/var/log/secure中,出現以下任一錯誤會導致無法登入:
requirement "uid >= 1000" not met by user "xxxx"user xxxx (0) has 5 failed attempts, failed attempts threshold is 3Refused user xxxx for service sshdPAM unable to dlopen(/usr/lib64/security/pam_lastlog.so): /usr/lib64/security/pam_lastlog.so: cannot open shared object file: No such file or directory
解決方案
請確保至少有一個管理員賬戶(root使用者或其他擁有sudo許可權的普通使用者)可以登入執行個體,否則無法修改設定檔。
問題定位
使用管理員賬戶通過VNC串連登入ECS執行個體。
訪問ECS控制台-執行個體。在頁面左側頂部,選擇目標資源所在的資源群組和地區。
進入目標執行個體詳情頁,單擊遠端連線,選擇通過VNC遠端連線。輸入帳號和密碼,登入ECS執行個體。
檢查認證日誌,定位嚴重錯誤資訊。
賬戶因失敗嘗試被鎖定:若日誌包含
Maximum amount of failed attempts was reached,說明配置了連續密碼錯誤後鎖定使用者賬戶,需解除賬戶鎖定。sudo grep -i "Maximum amount of failed attempts" /var/log/secure使用者登入許可權被限制:若日誌包含
requirement "uid >= 1000" not met by user,說明配置了禁止UID小於1000的使用者登入,需解除UID限制。sudo grep -i "not met by user" /var/log/secure使用者被列入黑名單:若日誌包含
Refused user,說明配置了黑白名單檔案控制使用者訪問,目標使用者可能被顯式拒絕或未被列入白名單,需解除使用者黑白名單限制。sudo grep -i "Refused user" /var/log/securePAM模組檔案缺失:若日誌包含
PAM unable to dlopen和No such file or directory,說明系統引用的PAM模組檔案(如pam_lastlog.so)缺失,需修複缺失的PAM模組。sudo grep -i "unable to dlopen" /var/log/secure
解除賬戶鎖定
檢查使用者的失敗登入次數。
將<username>替換為登入失敗的使用者名稱。
sudo sudo pam_tally2 -u <username>若輸出的失敗次數大於0,則表示賬戶被鎖定。
解鎖賬戶。
sudo pam_tally2 -u <username> -r永久修複(可選)。
如需禁用鎖定策略,可編輯
/etc/pam.d/system-auth檔案,注釋包含pam_tally2.so的規則。sudo vim /etc/pam.d/system-auth如下配置,表示普通使用者和root使用者連續三次輸入錯誤密碼會被鎖定,50秒後解鎖。
auth required pam_tally2.so deny=3 unlock_time=50上述使用的是
pam_tally2模組,不同的PAM版本,設定模組有所不同,請參見Linux PAM SAG。重新登入執行個體,驗證登入是否正常。
解除UID限制
定位設定檔。
尋找包含
pam_succeed_if的設定檔,如/etc/pam.d/sshd、/etc/pam.d/login或/etc/pam.d/system-auth。sudo grep -r "pam_succeed_if" /etc/pam.d/檢查並修改配置。
sudo vim /etc/pam.d/sshd對每個包含
auth required pam_succeed_if.so uid >= 1000的檔案,在其前面添加 # 號注釋對應行。# auth required pam_succeed_if.so uid >= 1000重新登入執行個體,驗證登入是否正常。
解除使用者黑白名單限制
定位設定檔。
尋找包含
pam_listfile的設定檔,如/etc/pam.d/sshd、/etc/pam.d/login或/etc/pam.d/system-auth。sudo grep -r "pam_listfile" /etc/pam.d/檢查配置。
sudo vim /etc/pam.d/sshd查看匹配的配置行,確認是白名單 (
sense=allow) 還是黑名單 (sense=deny),並找到名單檔案路徑(如/etc/ssh/whitelist或/etc/ssh/blacklist)。# 設定了訪問白名單,僅允許白名單使用者允許登入 auth required pam_listfile.so item=user sense=allow file=/etc/ssh/whitelist onerr=fail # 設定了訪問黑名單,禁止黑名單使用者登入 auth required pam_listfile.so item=user sense=deny file=/etc/ssh/blacklist onerr=fail根據配置類型修改設定檔。
白名單:在檔案末尾添加使用者名稱,每行一個使用者,儲存退出。
sudo vim /etc/ssh/whitelist黑名單:刪除包含目標使用者名稱的行,儲存退出。
sudo vim /etc/ssh/blacklist
重新登入執行個體,驗證登入是否正常。
修複缺失的PAM模組
定位缺失模組所屬的軟體包。
診斷報告或系統日誌中會給出缺失模組的路徑(如
/usr/lib64/security/pam_lastlog.so)。執行以下命令查詢該檔案所屬的軟體包。即使模組檔案已丟失,rpm -qf命令仍可基於RPM資料庫查詢到歸屬軟體包。rpm -qf /usr/lib64/security/pam_lastlog.so樣本輸出如下,表示該模組屬於
pam軟體包。pam-1.3.1-39.1.al8.x86_64您也可以執行
dnf provides "*/pam_lastlog.so"命令查詢模組所屬的軟體包。重裝軟體包,恢複缺失的模組檔案。
將命令中的
pam替換為上一步查詢到的軟體包名稱。sudo dnf reinstall pam -y使用yum作為包管理器的系統(如CentOS 7),請將上述命令中的
dnf替換為yum。驗證模組已恢複。
ls -l /usr/lib64/security/pam_lastlog.so若輸出顯示模組檔案已存在,表示修複完成。
重新登入執行個體,驗證登入是否正常。
修複完成後,執行個體健康診斷可能仍會基於修複前產生的歷史錯誤記錄檔檢出該問題,請等待一段時間後重新診斷。