Fail2ban 防禦SSH暴力破解攻擊

fail2ban 是個開源的入侵防御工具,用以保護 Linux 伺服器免受暴力破解威脅。透過監視系統日誌來檢測惡意行為,fail2ban會自動將多次登入失敗的加到 iptables 防火墙規則,以拒絕該IP地址的訪問。

自從Raspberry Pi 的SSH暴露在公網上,天天有駭客暴力破解密碼,光顧到很煩人的程度,是時候研究fail2ban提升資安等級了。


安裝和設定

先用以下指令安裝 fail2ban 和 iptables:

sudo apt-get update

sudo apt-get install -y fail2ban
#安裝 fail2ban

sudo apt-get install -y iptables
#安裝 iptables



執行 sudo nano /etc/fail2ban/jail.d/defaults-debian.conf ,在該文件增加backend = systemd,使結果如下:

[sshd]
backend = systemd
enabled = true

#這非常重要,不然會啟動失敗~


*由於原開發者提示我們不要修改 /etc/fail2ban/filter.d/sshd.conf 文件,所以要新增其他文件客製化規則的設定。


執行 sudo nano /etc/fail2ban/jail.local 建立檔案,將以下內容複貼上:

[DEFAULT]
ignoreip = 127.0.0.1 192.168.1.0/24

[sshd]
enabled = true
port = 22
logpath = /var/log/auth.log
backend = systemd
maxretry = 5
bantime = 1h
findtime = 10m

#注意!其他Linux發行版不一定適用。

  • ignoreip:不會被封鎖的IP,網段用空白字元分割,可以加入本機、區網電腦或公司的固定IP
  • maxretry:錯誤嘗試次數
  • bantime:封鎖時間,只有數字單位是秒,【-1】代表永久封鎖
  • findtime:在多少時間以內,只有數字單位是秒

以此範例說明,某IP若在10分鐘內嘗試帳密錯誤達到5次,IP將被封鎖1小時。


然後:

sudo systemctl restart fail2ban

到這裡就大功告成~

此時, fail2ban就會將亂猜密碼的IP新增到iptables的規則裡,將其封鎖。


進階

1.加嚴規則

預設只針對短時間攻擊,但有些 bot 會避開 findtim,隔幾分鐘再試,為了專門鎖慣犯IP,可以加這個 jail.local再加入:

[recidive]
enabled = true
logpath = /var/log/fail2ban.log
bantime = 7d
findtime = 1d
maxretry = 5

效果:一天內被鎖超過5次 → 直接鎖7天

用以下指令確認 [recidive] 規則是否啟用成功

sudo fail2ban-client status recidive



2.修改日誌時間

jail.local 在 [Recidive] 的運作依賴查看日誌 (/var/log/fail2ban.log),但Linux 對各套件的日誌有個預設打包時間,時間到了 fail2ban.log 就被系統給收走了,[Recidive] 規則也就失效;因此,可依需求調整日誌的保留時間。

sudo nano /etc/logrotate.d/fail2ban

weekly:可以改成 monthly(每月)、daily(每天),
rotate:保留多少份日志

如果以上文件改成 monthlyrotate 2:保留2個月,一個月一份。



操作

1.查詢 fail2ban 運作情況
依據 → jail.local 建立的規則
sudo fail2ban-client status
#查看jail.local下的運作規則,例如:[sshd]

sudo fail2ban-client status sshd
#查看[sshd]過濾器和封鎖的結果

sudo fail2ban-client
#介紹指令的各種用法

sudo fail2ban-client get sshd banip
#查詢被封的IP

sudo fail2ban-client set sshd unbanip 192.168.100.104
#移除被封的IP

sudo fail2ban-client set sshd unbanip --all
#一次解封所有IP

sudo fail2ban-client get sshd ignoreip
#查詢白名單IP

sudo fail2ban-client set sshd addignoreip 192.168.100.20
#增加白名單IP

sudo fail2ban-client set sshd delignoreip 192.168.100.77
#移除白名單IP

sudo fail2ban-client start|stop
#啟動|停止所有 jail.local的規則 

sudo fail2ban-client set sshd idle on|off                   
#啟用|停用 jail.local 裡的[sshd]規則


2. 管理 iptables
sudo iptables -L
#查看封鎖規則

sudo iptables -L --line-numbers
#查看封鎖規則(含編號)

sudo iptables -D f2b-sshd 1
#手動移除f2b-sshd下的1號規則(放行該IP)


3. 滾動日誌
sudo tail -f /var/log/fail2ban.log
#即時滾動日誌

即時監看訊息,可以看到入侵者一直亂猜密碼,然後被封鎖<-給你看心情好

4. 列出登入失敗資訊
sudo lastb -n 30
#列出近30筆登入失敗的資訊

看看入侵者用什麼帳號和IP嘗試登入

5. 開關 fail2ban
sudo systemctl start fail2ban
#開啟服務

sudo systemctl stop fail2ban
#停止服務

sudo systemctl restart fail2ban
#重啟服務

sudo systemctl disable fail2ban
#開機不啟動服務

sudo systemctl enable fail2ban
#開機自啟服務


後記

這裡就是一些觀念和我踩到的雷,如果你沒踩到可以不用看。

jail.local 規則順序/繼承
[DEFAULT]
  ↓(基礎規則)

[sshd]
  ↓(有寫就覆蓋,沒寫就繼承)

*可以想作[DEFAULT]是刑法這類的基本法條,而[sshd]是特別法

jail 檔案讀取順序
jail.conf → jail.local → jail.d/*.conf
jail.conf → 不要動(系統用)
jail.local → 只放「你要修改的部分」


踩到雷

我剛安裝好fail2ban居然無法順利運作,結果出現以下啟動失敗:

錯誤原因根據文獻[4],因為它將使用 systemd 作為後端,而不是 SSH 日誌檔案。請於/etc/fail2ban/jail.d/defaults-debian.conf 文件增加 backend = systemd ,這樣就能正常運作了。

參考資料

[1] How to fix fail2ban on Raspberry Pi OS

[2] Fail2ban 限定登入錯誤次數

[3] 安全:用logrotate实现fail2ban日志按天切分

[4] 如何在 Ubuntu 22.04 使用 Fail2Ban 來保護 NGINX

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *