Fail2ban防止暴力破解工具使用教程
- 場景
- Fail2ban安裝和配置
- 安裝
- 配置
- 原理
- 遇到的問題以及解決辦法
- 問題1:設置的策略是10分鐘內ssh連接失敗2次的ip進行封禁,日志中實際卻出現4次連接。
- 問題2:策略設置為1分鐘內失敗兩次,封禁ip。但通過日志發現,暴力破解也修改了策略,每分鐘嘗試1次ssh連接,這樣導致該ip無法被封禁。
場景
物理主機服務器托管于第三方機房中,僅僅提供電源以及網絡服務,并未提供安全防護管理。因此,我們經常遇到網絡攻擊,常見的就是通過ssh進行暴力破解,進入服務器,植入病毒和程序,進而造成經濟損失。
ssh連接日志記錄:
/var/log/secure
Mar 9 03:40:00 localhost sshd[78060]: Failed password for root from 14.103.109.71 port 49730 ssh2
Mar 9 03:40:00 localhost sshd[78060]: Connection closed by 14.103.109.71 port 49730 [preauth]
Mar 9 03:40:00 localhost unix_chkpwd[78088]: password check failed for user (root)
Mar 9 03:40:00 localhost sshd[78086]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=14.103.132.8 user=root
Mar 9 03:40:00 localhost sshd[78086]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Mar 9 03:40:01 localhost unix_chkpwd[78107]: password check failed for user (root)
Mar 9 03:40:01 localhost sshd[78090]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=14.103.109.71 user=root
Mar 9 03:40:01 localhost sshd[78090]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Mar 9 03:40:02 localhost sshd[78086]: Failed password for root from 14.103.132.8 port 37816 ssh2
Mar 9 03:40:02 localhost sshd[78086]: Received disconnect from 14.103.132.8 port 37816:11: Bye Bye [preauth]
Mar 9 03:40:02 localhost sshd[78086]: Disconnected from 14.103.132.8 port 37816 [preauth]
Mar 9 03:40:03 localhost sshd[78090]: Failed password for root from 14.103.109.71 port 49742 ssh2
Mar 9 03:40:03 localhost sshd[78090]: Connection closed by 14.103.109.71 port 49742 [preauth]
Mar 9 03:40:03 localhost unix_chkpwd[78125]: password check failed for user (root)
Mar 9 03:40:03 localhost sshd[78123]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=14.103.109.71 user=root
Mar 9 03:40:03 localhost sshd[78123]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Mar 9 03:40:06 localhost sshd[78123]: Failed password for root from 14.103.109.71 port 54450 ssh2
Mar 9 03:40:06 localhost sshd[78123]: Connection closed by 14.103.109.71 port 54450 [preauth]
Mar 9 03:40:06 localhost unix_chkpwd[78131]: password check failed for user (root)
Mar 9 03:40:06 localhost sshd[78129]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=14.103.109.71 user=root
Mar 9 03:40:06 localhost sshd[78129]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Mar 9 03:40:08 localhost sshd[78129]: Failed password for root from 14.103.109.71 port 54458 ssh2
Mar 9 03:40:08 localhost sshd[78129]: Connection closed by 14.103.109.71 port 54458 [preauth]
Mar 9 03:40:09 localhost unix_chkpwd[78138]: password check failed for user (root)
Mar 9 03:40:09 localhost sshd[78136]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=14.103.109.71 user=root
Mar 9 03:40:09 localhost sshd[78136]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
從ssh記錄中可以看到,這10秒鐘有4次ssh請求,差不多1分鐘24次記錄,已經屬于惡意暴力破解了。
Fail2ban安裝和配置
安裝
- Linux(CentOS/RHEL)
yum install epel-release -y # 先安裝 EPEL 源(CentOS 7)yum install fail2ban -ysystemctl enable --now fail2ban
- Linux(Ubuntu/Debian)
apt update && apt install fail2ban -ysystemctl enable --now fail2ban
配置
- 安裝路徑:
(base) [root@localhost fail2ban]# cd /etc/fail2ban/
(base) [root@localhost fail2ban]# pwd
/etc/fail2ban
(base) [root@localhost fail2ban]# ls
action.d fail2ban.conf fail2ban.d filter.d jail.conf jail.d jail.local paths-common.conf paths-fedora.conf
(base) [root@localhost fail2ban]#
- 配置文件路徑
(1) 主配置文件(不推薦直接修改)
/etc/fail2ban/jail.local
(1) 主配置文件(不推薦直接修改)
/etc/fail2ban/jail.conf
注意:(系統默認配置,升級時會被覆蓋)
(2) 自定義配置文件(推薦修改)
/etc/fail2ban/jail.local
注意:(用戶自定義配置,優先級高于 jail.conf,不會被升級覆蓋)
- 自定義配置文件注釋
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure # CentOS
maxretry = 5 # 允許5次失敗嘗試(平衡安全與誤封風險)
findtime = 300 # 5分鐘內的失敗嘗試計入統計(實時響應攻擊)
bantime = 86400 # 封禁24小時(足夠阻止暴力破解,避免長期誤封)
ignoreip = 127.0.0.1 192.168.1.0/24 # 信任內網IP
- 相關命令
重啟fail2ban應用:
systemctl restart fail2ban
實時監控fail2ban工具的日志:
tail -f /var/log/fail2ban.log
輸出封禁ip列表:
fail2ban-client status sshd | grep "Banned IP list"
原理
遇到的問題以及解決辦法
問題1:設置的策略是10分鐘內ssh連接失敗2次的ip進行封禁,日志中實際卻出現4次連接。
日志內容:
Jul 17 14:43:07 localhost sshd[105931]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=101.37.23.232 user=root
Jul 17 14:43:07 localhost sshd[105931]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Jul 17 14:43:09 localhost sshd[105931]: Failed password for root from 101.37.23.232 port 41776 ssh2
Jul 17 14:43:09 localhost sshd[105931]: Connection closed by 101.37.23.232 port 41776 [preauth]
Jul 17 14:45:42 localhost sshd[126373]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=101.37.23.232 user=root
Jul 17 14:45:42 localhost sshd[126373]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Jul 17 14:45:42 localhost sshd[126375]: Invalid user pi from 101.37.23.232 port 43878
Jul 17 14:45:42 localhost sshd[126375]: input_userauth_request: invalid user pi [preauth]
Jul 17 14:45:42 localhost sshd[126375]: pam_unix(sshd:auth): check pass; user unknown
Jul 17 14:45:42 localhost sshd[126375]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=101.37.23.232
Jul 17 14:45:43 localhost sshd[126499]: Invalid user hive from 101.37.23.232 port 44702
Jul 17 14:45:43 localhost sshd[126499]: input_userauth_request: invalid user hive [preauth]
Jul 17 14:45:43 localhost sshd[126499]: pam_unix(sshd:auth): check pass; user unknown
Jul 17 14:45:43 localhost sshd[126499]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=101.37.23.232
Jul 17 14:45:44 localhost sshd[126373]: Failed password for root from 101.37.23.232 port 43054 ssh2
Jul 17 14:45:44 localhost sshd[126373]: Connection closed by 101.37.23.232 port 43054 [preauth]
Jul 17 14:45:44 localhost sshd[126375]: Failed password for invalid user pi from 101.37.23.232 port 43878 ssh2
Jul 17 14:45:44 localhost sshd[126375]: Connection closed by 101.37.23.232 port 43878 [preauth]
Jul 17 14:45:44 localhost sshd[126499]: Failed password for invalid user hive from 101.37.23.232 port 44702 ssh2
Jul 17 14:45:44 localhost sshd[126499]: Connection closed by 101.37.23.232 port 44702 [preauth]
Jul 17 14:57:58 localhost sudo: root : TTY=pts/5 ; PWD=/root ; USER=root ; COMMAND=/bin/grep Ban /var/log/fail2ban.log
Jul 17 14:57:58 localhost sudo: pam_unix(sudo:session): session opened for user root by root(uid=0)
問題分析:
- 攻擊行為分析
從日志來看,IP 101.37.23.232 在短時間內進行了多次SSH暴力破解嘗試:
14:43:07
嘗試 root 登錄 → 失敗(1次)
14:45:42
嘗試 root 登錄 → 失敗(2次)
嘗試 pi 用戶登錄 → 無效用戶(3次)
嘗試 hive 用戶登錄 → 無效用戶(4次)
總計失敗登錄嘗試次數:
root 用戶:2次
無效用戶(pi、hive):2次
總失敗次數:4次
- Fail2Ban 策略匹配
您設置的策略是 10分鐘內限制2次(maxretry = 2),但Fail2Ban 默認只統計同一用戶的失敗登錄:
sshd jail 的默認 failregex 會分別統計:
root 的失敗登錄(2次)→ 未達到 maxretry=2 的封禁閾值(剛好等于,但可能未觸發)。
pi 和 hive 的失敗登錄(各1次)→ 未達到單獨封禁條件。
關鍵問題:
Fail2Ban 默認不合并不同用戶的失敗登錄,因此雖然總失敗次數是4次,但每個用戶的失敗次數均未達到 maxretry=2 的封禁條件。
- 為什么IP沒有被封禁?
原因說明:
分用戶統計失敗次數: Fail2Ban 默認按用戶名分別計算 maxretry,root 2次,pi 1次,hive 1次,均未達到封禁條件。
時間窗口 (findtime):所有嘗試均在 2分鐘 內發生(14:43-14:45),遠小于findtime=10m,但按用戶分開統計導致未觸發。
無效用戶未計入:部分Fail2Ban配置可能忽略 invalid user 的日志(需檢查 filter.d/sshd.conf 的 failregex)。
處理問題:
方案一:修改 filter.d/sshd.conf 合并統計所有失敗登錄
編輯 Fail2Ban 的 SSH 過濾規則:
sudo vim /etc/fail2ban/filter.d/sshd.conf
在 failregex 部分取消用戶區分,例如:
failregex = ^%(__prefix_line)s(?:error: PAM: )?Authentication failure for .* from <HOST>( port \d+)? ssh2$^%(__prefix_line)sFailed password for .* from <HOST>( port \d+)? ssh2$^%(__prefix_line)sConnection closed by <HOST> port \d+ \[preauth\]$
然后重載配置:
sudo fail2ban-client reload sshd
方案二:降低 maxretry 或縮短 findtime
sudo vim /etc/fail2ban/jail.local
調整參數:
maxretry = 2 # 保持當前值,但修改過濾規則后會更敏感
findtime = 1m # 縮短統計窗口至1分鐘
bantime = 1h # 封禁1小時
重啟 Fail2Ban:
sudo systemctl restart fail2ban
方案三:手動封禁該IP(臨時措施)
sudo fail2ban-client set sshd banip 101.37.23.232
驗證是否生效
檢查封禁列表:
sudo fail2ban-client status sshd
模擬攻擊測試:
使用另一臺服務器嘗試多次失敗登錄,觀察是否觸發封禁。
總結
當前策略問題:Fail2Ban 默認分用戶統計失敗次數,導致攻擊者通過切換用戶名繞過封禁。
修復方法:
-
修改 sshd.conf 合并所有失敗登錄統計。
-
調整 maxretry 和 findtime 提高敏感性。
-
手動封禁 確認的惡意 IP。
最終效果:調整后,同一IP的多次失敗登錄(無論用戶名)將在 findtime 窗口內累計,達到 maxretry 后自動封禁。
問題2:策略設置為1分鐘內失敗兩次,封禁ip。但通過日志發現,暴力破解也修改了策略,每分鐘嘗試1次ssh連接,這樣導致該ip無法被封禁。
解決方法:
將findtime修改時間長一點,保證安全,例如:1小時,1天
findtime = 6000