- Linux 可讓您使用 PAM 模組(例如 pam_faillock 和 pam_tally2)來限制登入嘗試次數並封鎖帳戶,具體取決於發行版。
- SSH 透過 MaxAuthTries 增加保護,減少每個連線的驗證嘗試次數,而不會鎖定帳戶。
- 使用 pam_cracklib、pam_pwquality 和 login.defs 實作密碼策略,並控制密碼的複雜度、過期時間和重試次數。
- 這些措施的良好組合可以減少暴力攻擊,提高安全性,同時又不影響系統運作。
在 Linux 系統中,控制密碼失敗次數是安全措施中經常被推遲到「以後」才考慮的一項…直到有一天,你發現日誌中出現了成千上萬次的密碼嘗試失敗記錄,或者用戶無故被鎖定。正確配置這些限制不僅可以抵禦暴力破解攻擊,還能幫助你避免出現莫名其妙的帳戶鎖定或關鍵服務故障。
在 Linux 系統中,我們可以透過多個層面來限制身份驗證嘗試次數:例如pam_faillock和pam_tally2等特定的 PAM 模組、 MaxAuthTries等 SSH 伺服器指令、 /etc/login.defs 檔案中的參數,以及pam_cracklib或pam_pwquality等密碼策略工具。了解它們之間的協同作用是建立一致策略並避免意外情況的關鍵。
Linux 系統中如何封鎖登入失敗的帳號:概述
基本想法很簡單:限制登入失敗次數,並在超過閾值時暫時或永久封鎖帳戶。實際應用比較複雜,因為它涉及多個元件:PAM、SSH、系統配置,以及根據發行版不同而存在的各種模組。
在 Red Hat 類型的發行版(RHEL、CentOS、Rocky、Alma…)中,現代方法是使用pam_faillock模組,該模組會記錄身份驗證錯誤並應用具有可配置解鎖時間的自動鎖定。
在基於 Debian 和 Ubuntu 的環境中,pam_tally2傳統上用於統計登入失敗次數,並拒絕超過特定閾值的登入嘗試。儘管最近的版本正在遷移到faillock,但 pam_tally2 仍然是許多生產伺服器上的主要功能。
除了 PAM 之外,SSH 守護程式還有自己的 MaxAuthTries 指令,用於限制每個連線允許的身份驗證嘗試次數。這不會直接鎖定帳戶,但確實降低了攻擊者在單一 SSH 通道上測試憑證的可能性。
最後,諸如 /etc/login.defs 之類的文件和密碼品質模組控制著更改密碼時的重試次數、最小複雜度、過期時間或長度等方面,從而完善了帳戶安全「包」。

因在 Red Hat、CentOS 及其衍生系統上登入嘗試失敗而導致的帳戶鎖定 (pam_faillock)
在 Red Hat 生態系統中,驗證失敗會阻止由 pam_faillock 模組處理,該模組集中整合到 PAM 堆疊中。此模組通常在/etc/pam.d/system-auth檔案中配置,在某些版本中,也在/etc/pam.d/password-auth 檔案中配置。
要在多次嘗試失敗後啟動鎖定,需要將類似這樣的行添加到這些 PAM 檔案的auth和account區塊中(具體細節可能因版本而異,但思路是這樣的):
auth required pam_faillock.so preauth silent audit deny=2 unlock_time=120
auth pam_faillock.so authfail audit deny=2 unlock_time=120
account required pam_faillock.so
這些參數定義了模組的基本行為:
- 審計:將失敗的嘗試和崩潰記錄在系統日誌中,通常在 在/ var /日誌/安全 或期刊。
- 拒絕=2:封鎖帳戶 2次失敗的嘗試.
- 解鎖時間=120帳戶將在之後自動解鎖。 120秒 (2分鐘)。
- 無聲:向使用者隱藏帳戶已鎖定的事實,使攻擊者更難盲目嘗試密碼。
重要提示:預設情況下,root 使用者通常不受此限制。如果您也想對管理員帳號套用限制,則必須在`auth`指令中新增`even_deny_root`參數,但需承擔下列風險:如果您忘記密碼或 SSH 連線被盜用,設定錯誤可能會導致您無法存取。
當帳戶因 pam_faillock 錯誤而被鎖定時,如果未啟用靜默登入選項,使用者在嘗試進行身份驗證時會收到一條特定訊息。這有助於支援人員快速識別問題並非密碼更改,而是由於登入失敗次數過多而導致的臨時鎖定。
要檢查失敗的嘗試和使用者的鎖定狀態,需要以管理員模式使用faillock工具:
# faillock --user lionel
此指令會顯示累計嘗試次數以及嘗試來源的 IP 位址或 TTY,方便調查可疑嘗試。如果您需要在不等待unlock_time 的情況下解鎖用戶,只需重置其計數器即可。
# faillock --user lionel --reset
此外,還有設定檔 /etc/security/faillock.conf,可以在其中定義全域參數,而無需直接修改 PAM 文件,例如:
deny = 3
fail_interval = 600
unlock_time = 900
在這個檔案中,您可以更有系統地調整嘗試次數、計算視窗和阻塞時間,集中管理策略,而不會使 PAM 行變得過於雜亂。
使用 pam_tally2 在 Debian 和 Ubuntu 系統中出現帳戶鎖定問題
在經典的 Debian 和 Ubuntu 系統中,負責統計登入失敗次數的模組是 pam_tally2。此模組維護一個日誌檔案(預設位於/var/log/tallylog),用於儲存每個使用者的身份驗證失敗訊息。
要啟用基於失敗次數的阻止策略,通常需要編輯/etc/pam.d/common-auth檔案並新增如下行:
auth required pam_tally2.so onerr=fail deny=3 unlock_time=120 audit even_deny_root root_unlock_time=600
多種選項的組合可以實現對行為的更精細控制:
- onerr=失敗如果模組中發生錯誤(例如,tallylog 出現問題),出於安全原因,將拒絕存取。
- 拒絕=3:封鎖帳戶 3次失敗的嘗試.
- 解鎖時間=120帳戶將在之後自動解鎖。 120秒.
- 審計:記錄事件 /var/log/auth.log.
- even_deny_root包括用戶 根 在阻止策略中。
- root_unlock_time=600為 root 使用者設定不同的鎖定時間(例如) 600秒) 雖然 解鎖時間 扮演另一個人。
當帳戶被鎖定時,系統會顯示特定訊息,表示已超過最大嘗試次數;這樣使用者就不會繼續嘗試,管理員也知道這並非簡單的「我忘了密碼」。
若要檢查特定使用者的嘗試計數器,可以使用程式pam_tally2 (不含 .so 字尾)並加上-u參數:
# pam_tally2 -u lionel
該指令會顯示錯誤數量、帳戶是否被鎖定以及鎖定時間。此外,我們還可以透過新增`--reset`選項,使用相同工具重設計數器,這樣無需等待鎖定時間到期即可解鎖使用者帳戶。
與 pam_tally2 相關的事件通常會記錄在 /var/log/auth.log 中,因此很容易將它們整合到監控系統或 SIEM 中,以便在偵測到異常的失敗嘗試模式時觸發警報。
限制 SSH 嘗試次數:MaxAuthTries 和其他措施
SSH 服務是 Linux 伺服器的主要入口點之一,因此實施多項安全措施是明智之舉。其中最簡單的措施之一是SSH 守護程式本身的MaxAuthTries指令,該指令專門用於限制單次連線中的登入失敗次數。
MaxAuthTries 定義了在伺服器關閉 SSH 會話之前可以進行的身份驗證嘗試次數。它不會鎖定帳戶,但會終止連接並強制重新打開,這大大減緩了暴力破解攻擊。
要進行配置,您需要編輯 SSH 設定檔(通常是/etc/ssh/sshd_config)並調整指令:
MaxAuthTries 3
在許多系統中,預設值通常為 6,對於暴露在網路上的伺服器來說,這個值相當寬鬆。將其降低到 3 甚至 2 意味著每個連接在被強制關閉之前只允許嘗試非常少的幾次。
需要注意的是,MaxAuthTries 並不能取代 pam_faillock 或 pam_tally2:它只是為每個連線設定了限制,而 PAM 則對每個使用者保持全域控制,並且可以在一段時間內封鎖帳戶。
除了修改 MaxAuthTries 值之外,還有其他一些基本的 SSH 安全加固建議:
- 將預設連接埠(22)變更為不太常見的連接埠。減少機器人掃描網路產生的噪音。
- 使用公鑰認證 與其使用密碼,不如至少要求管理者使用者使用密碼。
- 將 SSH 與防火牆和白名單結合使用僅允許來自受信任的 IP 位址或位址範圍的存取。
- 停用透過 SSH 直接以 root 使用者身分登入。 並強制個人帳戶使用 sudo。
如果你使用的是 Ubuntu 系統,並且想要減少登入圖形介面時被提示輸入密碼的次數,那麼修改 SSH 中的 MaxAuthTries 設定並不能解決問題:這是完全不同的兩個問題。在這種情況下,真正起作用的是登入管理員(LightDM、GDM 等)使用的 PAM 協定棧,因此你需要檢查/etc/pam.d目錄下的設定文件,而不是 sshd_config 檔案。
密碼策略:複雜度、過期時間和重試次數
限制登入失敗次數固然重要,但如果密碼是“123456”或“qwerty”,那就沒什麼用了。 Linux 系統安全加固的關鍵在於制定合理的密碼策略,強制使用強密碼,並在必要時定期更新密碼。
良好的密碼策略旨在透過強制執行密碼長度、複雜性和合理週期性的最低組合,防止使用者選擇可預測或重複使用的密碼。這適用於普通用戶以及特權或關鍵服務帳戶。
Linux 系統中任何合理的密碼策略通常都包含以下幾個關鍵點:
- 建立強密碼:最小長度(至少 12 個字元),混合使用大寫字母、小寫字母、數字和符號,避免使用字典中的單字。
- 避免重複使用密碼阻止使用者恢復到以前使用過的密碼。
- 設定一個合理的到期日每隔幾天強制更換一次,不要過度追求頻繁的輪換。
- 限制更改密碼的嘗試次數。防止使用者花費半小時嘗試弱密碼直到找到有效密碼。
- 補充為 多重身份驗證 盡可能尤其是在外部接入點或管理面板上。
在企業環境中,這些策略對於遵守法規、稽核和安全標準至關重要。在個人伺服器上,這些策略或許顯得有些多餘,但當您託管可透過網路存取的服務時,完善的策略與完全沒有策略之間的差異是巨大的。
使用 pam_cracklib 和 pam_pwquality 設定密碼原則
專門用於密碼品質的 PAM 模組允許對密碼強度進行精細控制。過去人們一直使用pam_cracklib ,但現在pam_pwquality因其改進和更多選項而越來越受歡迎。
在 Debian 和 Ubuntu 系統中,第一步是安裝相應的程式庫(如果尚未安裝):
sudo apt install libpam-cracklib libpam-pwquality libpwquality-tools
pam_cracklib 通常透過 /etc/pam.d/common-password 進行配置。它通常包含類似這樣的行:
password requisite pam_cracklib.so retry=3 minlen=12 difok=3 ucredit=-3 lcredit=-3 dcredit=-3 ocredit=-3
每個參數控制所需密碼的一個面向:
- 重試:使用者在指令失敗前可以嘗試輸入有效密碼的次數。
- 民倫:密碼最短長度。
- 迪福克與先前的密碼相比,最少需要使用不同字元。
- 優信:如果值為負數,則表示至少需要該數值。 大寫字母.
- 信用證:當值為負數時,至少需要 小寫.
- 信用證:負值至少需要 數字.
- 信用證:負值表示最小值 符號 或其他特殊字元。
正向加分項相當於一種「獎勵」機制:密碼可以稍短一些,但可以透過增加其他字元類別的複雜度來彌補。而負向加分項則表示強制性要求,例如「至少包含 X 個大寫字母」等等。
pam_pwquality 增加了更多選項,這些選項在 /etc/security/pwquality.conf 中配置,可以在其中調整以下參數:
- 迪福克與先前的密碼相比,不同字元的數量。
- 民倫最短長度。
- dcredit、ucredit、lcredit、ocredit:按字元類型計費,就像 cracklib 一樣。
- 小班:所需的最小類別數(小寫字母、大寫字母、數字、符號)。
- 最大重複次數:連續重複字元的最大數量。
- 最大類重複次數:同一類別字元的最大連續數量。
- 地理檢查:拒絕包含使用者 GECOS 欄位(全名等)資料的密碼。
- 字典路徑:透過字典屏蔽過於明顯的字詞。
- 髒話:一份具體的禁用詞彙清單。
該模組甚至可以檢測回文、大小寫字母的微小變化,或與以前的密碼幾乎相同的密碼,從而避免「我只是在末尾加個 1」這種典型的陷阱。
pwquality 的一個非常有用的配套工具是 pwscore,它可以根據當前配置來衡量密碼的品質:
# echo 123 | pwscore
Falló la comprobación de calidad de la contraseña:
La contraseña tiene menos de 8 caracteres
對於非常複雜的密碼,pwscore 會傳回一個高分,通常高達 100 分,這可以驗證您定義的策略既不太寬鬆,也不太難以遵守。
管理密碼過期時間和使用期限:修改 /etc/shadow 和 login.defs 文件
除了複雜性之外,通常還需要控制密碼的有效期限,超過期限後就需要更改密碼。在 Linux 系統中,此資訊儲存在/etc/shadow檔案中,可以使用change指令和/etc/login.defs中的指令輕鬆管理。
/etc/shadow 檔案儲存每個使用者的加密密碼和過期資料。密碼欄位的結構為$id$salt$hash,其中id表示使用的演算法(例如,$6$表示 SHA-512)。其他欄位表示上次密碼更改時間、有效期限、過期前的警告天數、過期後的非活動天數等。
`change` 指令可讓您在單一使用者層級查看和修改這些值。一些關鍵選項:
- -l顯示帳戶到期資訊。
- -m:兩次密碼更改之間的最短天數。
- -M密碼有效期限的最長天數。
- -W:到期前通知的天數。
- -E帳戶到期日。
- -I帳戶過期後,在停用帳戶之前,需要等待一定天數的非活動時間。
查詢的一個典型範例是:
# chage -l pepe
Last password change : Apr 18, 2020
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 90
Number of days of warning before password expires : 5
若要為新使用者定義預設值,可以使用 /etc/login.defs 文件,其中定義瞭如下全域指令:
- PASS_MAX_DAYS 天:密碼可使用的最大天數(例如,90)。
- PASS_MIN_DAYS:兩次密碼更改之間的最短天數。
- PASS_WARN_AGE到期前通知的天數。
- PASS_MIN_LEN 和 PASS_MAX_LEN:最小和最大長度,儘管在實踐中這通常委託給 PAM。
- 嘗試次數:如果密鑰被認為強度不足而被拒絕,則允許的最大密碼更改嘗試次數。
- 加密方法:使用的哈希演算法(例如, SHA512).
- 登入嘗試允許在中止登入前進行多次重試。
- 登入逾時輸入憑證的最長時間(以秒為單位)。
一個重要的細節:login.defs 指令會影響修改後建立的使用者。現有帳戶將保留其值,如果要使其符合新策略,則必須使用`change`進行調整。
將嘗試次數限制與公司政策和最佳實踐相結合
在專業環境中,僅僅設定幾個參數然後祈禱好運是不夠的。密碼和登入失敗嘗試策略必須與組織的實際情況、身分識別平台(例如Keycloak)以及封鎖服務或關鍵使用者帳戶的影響相符。
例如,如果腳本因嘗試使用錯誤的憑證而陷入循環,那麼強制阻止執行關鍵進程的服務帳戶可能會導致整個系統無法運作。在這種情況下,需要評估是否將該帳戶從封鎖清單中排除,或實施其他保護機制。
此外,還應考慮美國國家標準與技術研究院 (NIST) 等機構的最新建議,這些建議強調密碼長度和複雜性,而不是過於頻繁地強制更改密碼。通常來說,每 90 天強制更改一次密碼是合理的,但每 30 天就更改一次則可能導緻密碼過於簡單,例如「Password01」、「Password02」等等。
使用者培訓往往被忽略。無論您的密碼安全管理 (PAM) 配置多麼完善,如果使用者仍然把密碼寫在貼在顯示器上的便條紙上,那麼您的所有努力都將付諸東流。解釋策略背後的原因有助於確保用戶遵守規則,並減少抵抗情緒。
最後,將所有這些措施與可行的雙重認證(VPN、儀表板、帶有 OTP 的 SSH 等)相結合,可以在不過度依賴完美密碼的情況下提高安全性。
透過結合密碼嘗試次數限制、臨時鎖定、合理的複雜性和過期策略,以及加強 SSH 訪問,可以建立一個更具彈性的生態系統,抵禦暴力破解攻擊和人為錯誤,而不會將用戶的日常生活變成一場噩夢。
對字節世界和一般技術充滿熱情的作家。我喜歡透過寫作分享我的知識,這就是我在這個部落格中要做的,向您展示有關小工具、軟體、硬體、技術趨勢等的所有最有趣的事情。我的目標是幫助您以簡單有趣的方式暢遊數位世界。
