如何使用 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的防禦機制。