網路活動

使用 pam tally2 阻擋主機帳號密碼暴力破解

現今機房主機管理皆須使用遠端登入,除了使用防火牆限制特定來源主機網路位址連線 SSH 遠端登入外,若信任的來源主機變成入侵者的跳板時,則防火牆限制規則將無法阻擋入侵者。入侵者可能使用暴力法破解密碼,此時即可使用 pam_tally2 進行阻擋主機帳號密碼暴力破解。以下為設定 pam_tally2 的設定說明。

說明:測試遠端主機為安裝 CentOS 6.7 的虛擬機。 接下來將依照檢查系統是否符合設定需求,再進行設定及測試。

步驟一、確認是否有 /lib64/security/pam_tally2.so。
$ ls -la /lib64/security/pam_tally2.so
-rwxr-xr-x. 1 root root 14464 Aug 18 2015 /lib64/security/pam_tally2.so

步驟二、確認 /etc/pam.d/sshd 有以下設定。
...
auth include password-auth
...
account include password-auth
...

步驟三、修改 /etc/pam.d/password-auth 新增兩行設定,紀錄檔 /var/log/tallylog, 紀錄檔為二進位檔無法直接編輯。設定輸入密碼錯誤 5 次,鎖定帳號 900 秒。even_deny_root 表示連 root 帳號也套用相同設定。
...
auth required pam_tally2.so file=/var/log/tallylog deny=5 even_deny_root unlock_time=900
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_ldap.so use_first_pass
auth required pam_deny.so

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

步驟四、本機查詢密碼輸入錯誤次數,登入 root 帳號使用下列指令查詢。
# pam_tally2 --user=testaccount
Login Failures Latest failure From
testaccount 0

測試一:嘗試輸入兩次錯誤密碼,觀察計數器。
1. 先觀察輸入兩次錯誤密碼後的計數器。
# pam_tally2 --user=testaccount
Login Failures Latest failure From
testaccount 2 06/04/16 10:09:37 test11.test11.com.tw

2. 第三次輸入正確密碼後計數器歸零。
# pam_tally2 --user=testaccount
Login Failures Latest failure From
testaccount 0

測試二:嘗試輸入五次錯誤密碼,第六次輸入正確密碼,帳號維持鎖定。
1. 登入畫面出現錯誤訊息。
Too many authentication failures for testaccount

2. 帳號顯示六次錯誤,第六次為嘗試以正確密碼登入已鎖定帳號。
# pam_tally2 --user=testaccount
Login Failures Latest failure From
testaccount 6 06/21/16 10:13:20 test11.test11.com.tw

步驟五、若有需要手動重設錯誤次數,請使用 root 帳號重設。
1. 重設時會顯示帳號的最後封鎖紀錄。
# pam_tally2 --user=testaccount --reset
Login Failures Latest failure From
testaccount 6 06/21/16 10:13:20 test11.test11.com.tw

2. 檢查重設後的結果顯示錯誤次數為 0。
# pam_tally2 --user=testaccount
Login Failures Latest failure From
testaccount 0