如何使用 fail2ban 防禦 SSH 服務器的暴力破解攻擊
- 2019 年 10 月 6 日
- 筆記
對於SSH服務的常見的攻擊就是暴力破解攻擊——遠程攻擊者通過不同的密碼來無限次地進行登錄嘗試。當然SSH可以設置使用非密碼驗證驗證方式來對抗這種攻擊,例如公鑰驗證或者雙重驗證。將不同的驗證方法的優劣處先放在一邊,如果我們必須使用密碼驗證方式怎麼辦?你是如何保護你的 SSH 服務器免遭暴力破解攻擊的呢?
fail2ban 是 Linux 上的一個著名的入侵保護的開源框架,它會監控多個系統的日誌文件(例如:/var/log/auth.log 或者 /var/log/secure)並根據檢測到的任何可疑的行為自動觸發不同的防禦動作。事實上,fail2ban 在防禦對SSH服務器的暴力密碼破解上非常有用。
在這篇指導教程中,我會演示如何安裝並配置 fail2ban 來保護 SSH 服務器以避免來自遠程IP地址的暴力攻擊。
1、在linux上安裝Fail2ban
為了在CentOS 或 RHEL上安裝fail2ban,首先設置EPEL倉庫,然後運行以下命令。
$ sudo yum install fail2ban
在Fedora上安裝fail2ban,簡單地運行以下命令:
$ sudo yum install fail2ban
在ubuntu,Debian 或 Linux Mint上安裝fail2ban:
$ sudo apt-get install fail2ban
2、為ssh服務配置Fail2ban
現在你已經準備好了通過配置 fail2ban 來加強你的SSH服務器。你需要編輯其配置文件 /etc/fail2ban/jail.conf。在配置文件的「[DEFAULT]」區,你可以在此定義所有受監控的服務的默認參數,另外在特定服務的配置部分,你可以為每個服務(例如SSH,Apache等)設置特定的配置來覆蓋默認的參數配置。
在針對服務的監獄區(在[DEFAULT]區後面的地方),你需要定義一個[ssh-iptables]區,這裡用來定義SSH相關的監獄配置。真正的禁止IP地址的操作是通過iptables完成的。
下面是一個包含「ssh-iptables」監獄配置的/etc/fail2ban/jail.conf的文件樣例。當然根據你的需要,你也可以指定其他的應用監獄。
[DEFAULT] #全局設置
ignoreip = 127.0.0.1/8 #忽略的IP列表,不受設置限制
bantime = 600 #屏蔽時間,單位:秒
findtime = 600 #這個時間段內超過規定次數會被ban掉
maxretry = 3 #最大嘗試次數
backend = auto #日誌修改檢測機制(gamin、polling和auto這三種)
[ssh-iptables] #單個服務檢查設置,如設置bantime、findtime、maxretry和全局衝突,服務優先級大於全局設置。
enabled = true #是否激活此項(true/false)修改成 true
filter = sshd #過濾規則filter的名字,對應filter.d目錄下的sshd.conf
action = iptables[name=SSH, port=ssh, protocol=tcp] #動作的相關參數,對應action.d/iptables.conf文件
sendmail-whois[name=SSH, [email protected], [email protected], sendername="Fail2Ban"]#觸發報警的收件人
logpath = /var/log/secure #檢測的系統的登陸日誌文件。這裡要寫sshd服務日誌文件。默認為logpath = /var/log/sshd.log
#5分鐘內3次密碼驗證失敗,禁止用戶IP訪問主機1小時。配置如下
bantime = 3600 #禁止用戶IP訪問主機1小時
findtime = 300 #在5分鐘內內出現規定次數就開始工作
maxretry = 3 #3次密碼驗證失敗
根據上述配置,fail2ban會自動禁止在最近5分鐘內有超過3次訪問嘗試失敗的任意IP地址。一旦被禁,這個IP地址將會在1小時內一直被禁止訪問 SSH 服務。這個事件也會通過sendemail發送郵件通知。
一旦配置文件準備就緒,按照以下方式重啟fail2ban服務。
在 Debian, Ubuntu 或 CentOS/RHEL 6:
$ sudo service fail2ban restart
在 Fedora 或 CentOS/RHEL 7:
$ sudo systemctl restart fail2ban
為了驗證fail2ban成功運行,使用參數'ping'來運行fail2ban-client 命令。如果fail2ban服務正常運行,你可以看到「pong(嘭)」作為響應。
$ sudo fail2ban-client ping
Server replied: pong
3、測試fail2ban保護SSH免遭暴力破解
為了測試fail2ban是否能正常工作,嘗試通過使用錯誤的密碼來用SSH連接到服務器模擬一個暴力破解攻擊。與此同時,監控 /var/log/fail2ban.log,該文件記錄在fail2ban中發生的任何敏感事件。
$ sudo tail -f /var/log/fail2ban.log

根據上述的日誌文件,Fail2ban通過檢測IP地址的多次失敗登錄嘗試,禁止了一個IP地址192.168.1.8。
4、檢查fail2ban狀態並解禁被鎖住的IP地址
由於fail2ban的「ssh-iptables」監獄使用iptables來阻塞問題IP地址,你可以通過以下方式來檢測當前iptables來驗證禁止規則。
$ sudo iptables –list -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-SSH tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain fail2ban-SSH (1 references)
target prot opt source destination
DROP all — 192.168.1.8 0.0.0.0/0
RETURN all — 0.0.0.0/0 0.0.0.0/0
如果你想要從fail2ban中解鎖某個IP地址,你可以使用iptables命令:
$ sudo iptables -D fail2ban-SSH -s 192.168.1.8 -jDROP
當然你可以使用上述的iptables命令手動地檢驗和管理fail2ban的IP阻塞列表,但實際上有一個適當的方法就是使用fail2ban-client命令行工具。這個命令不僅允許你對"ssh-iptables"監獄進行管理,同時也是一個標準的命令行接口,可以管理其他類型的fail2ban監獄。
為了檢驗fail2ban狀態(會顯示出當前活動的監獄列表):
$ sudo fail2ban-client status
為了檢驗一個特定監獄的狀態(例如ssh-iptables):
$ sudo fail2ban-client status ssh-iptables
上面的命令會顯示出被禁止IP地址列表。

為了解鎖特定的IP地址:
$ sudo fail2ban-client set ssh-iptables unbanip 192.168.1.8

注意,如果你停止了Fail2ban 服務,那麼所有的IP地址都會被解鎖。當你重啟 Fail2ban,它會從/etc/log/secure(或 /var/log/auth.log)中找到異常的IP地址列表,如果這些異常地址的發生時間仍然在禁止時間內,那麼Fail2ban會重新將這些IP地址禁止。
5、修改端口號
如果修改ssh默認端口22為2015後 。 配置fail2ban來監控sshd服務
需要修改配置文件:
[root@xuegod63 fail2ban]# vim jail.conf
#修改iptables動作中的端口號。 默認為ssh。
改:port=ssh 為 port=2015

[root@xuegod63 fail2ban]# vim /etc/fail2ban/action.d/iptables.conf #修改動作文件中默認端口號。 改: port=ssh 為port=2015

重啟服務即可
6、設置Fail2ban自動啟動
一旦你成功地測試了fail2ban之後,最後一個步驟就是在你的服務器上讓其在開機時自動啟動。在基於Debian的發行版中,fail2ban已經默認讓自動啟動生效。在基於Red-Hat的發行版中,按照下面的方式讓自動啟動生效。
在 CentOS/RHEL 6中:
$ sudo chkconfig fail2ban on
在 Fedora 或 CentOS/RHEL 7:
$ sudo systemctl enable fail2ban
7、總結
在該教程中,我演示了如何安裝並配置fail2ban來保護一個SSH服務器。當然fail2ban可以緩解暴力密碼攻擊,但是請注意,這並不能保護SSH服務器避免來自複雜的分佈式暴力破解組織,這些攻擊者通過使用成千上萬個機器控制的IP地址來繞過fail2ban的防禦機制。