如何使用fail2ban防御SSH服務(wù)器的暴力破解攻擊
對(duì)于SSH服務(wù)的常見(jiàn)的攻擊就是暴力破解攻擊——遠(yuǎn)程攻擊者通過(guò)不同的密碼來(lái)無(wú)限次地進(jìn)行登錄嘗試。當(dāng)然SSH可以設(shè)置使用非密碼驗(yàn)證驗(yàn)證方式來(lái)對(duì)抗這種攻擊,例如公鑰驗(yàn)證或者雙重驗(yàn)證。將不同的驗(yàn)證方法的優(yōu)劣處先放在一邊,如果我們必須使用密碼驗(yàn)證方式怎么辦?你是如何保護(hù)你的 SSH 服務(wù)器免遭暴力破解攻擊的呢?

fail2ban 是 Linux 上的一個(gè)著名的入侵保護(hù)的開(kāi)源框架,它會(huì)監(jiān)控多個(gè)系統(tǒng)的日志文件(例如:/var/log/auth.log 或者 /var/log/secure)并根據(jù)檢測(cè)到的任何可疑的行為自動(dòng)觸發(fā)不同的防御動(dòng)作。事實(shí)上,fail2ban 在防御對(duì)SSH服務(wù)器的暴力密碼破解上非常有用。
在這篇指導(dǎo)教程中,我會(huì)演示如何安裝并配置 fail2ban 來(lái)保護(hù) SSH 服務(wù)器以避免來(lái)自遠(yuǎn)程IP地址的暴力攻擊。
在linux上安裝Fail2ban
為了在CentOS 或 RHEL上安裝fail2ban,首先設(shè)置EPEL倉(cāng)庫(kù),然后運(yùn)行以下命令。
- $ sudo yum install fail2ban
在Fedora上安裝fail2ban,簡(jiǎn)單地運(yùn)行以下命令:
- $ sudo yum install fail2ban
在ubuntu,Debian 或 Linux Mint上安裝fail2ban:
- $ sudo apt-get install fail2ban
為SSH服務(wù)器配置Fail2ban
現(xiàn)在你已經(jīng)準(zhǔn)備好了通過(guò)配置 fail2ban 來(lái)加強(qiáng)你的SSH服務(wù)器。你需要編輯其配置文件 /etc/fail2ban/jail.conf。 在配置文件的“[DEFAULT]”區(qū),你可以在此定義所有受監(jiān)控的服務(wù)的默認(rèn)參數(shù),另外在特定服務(wù)的配置部分,你可以為每個(gè)服務(wù)(例如SSH,Apache等)設(shè)置特定的配置來(lái)覆蓋默認(rèn)的參數(shù)配置。
在針對(duì)服務(wù)的監(jiān)獄區(qū)(在[DEFAULT]區(qū)后面的地方),你需要定義一個(gè)[ssh-iptables]區(qū),這里用來(lái)定義SSH相關(guān)的監(jiān)獄配置。真正的禁止IP地址的操作是通過(guò)iptables完成的。
下面是一個(gè)包含“ssh-iptables”監(jiān)獄配置的/etc/fail2ban/jail.conf的文件樣例。當(dāng)然根據(jù)你的需要,你也可以指定其他的應(yīng)用監(jiān)獄。
- $ sudo vi /etc/fail2ban/jail.local
- [DEFAULT]
- # 以空格分隔的列表,可以是 IP 地址、CIDR 前綴或者 DNS 主機(jī)名
- # 用于指定哪些地址可以忽略 fail2ban 防御
- ignoreip = 127.0.0.1 172.31.0.0/24 10.10.0.0/24 192.168.0.0/24
- # 客戶端主機(jī)被禁止的時(shí)長(zhǎng)(秒)
- bantime = 86400
- # 客戶端主機(jī)被禁止前允許失敗的次數(shù)
- maxretry = 5
- # 查找失敗次數(shù)的時(shí)長(zhǎng)(秒)
- findtime = 600
- mta = sendmail
- [ssh-iptables]
- enabled = true
- filter = sshd
- action = iptables[name=SSH, port=ssh, protocol=tcp]
- sendmail-whois[name=SSH, dest=your@email.com, sender=fail2ban@email.com]
- # Debian 系的發(fā)行版
- logpath = /var/log/auth.log
- # Red Hat 系的發(fā)行版
- logpath = /var/log/secure
- # ssh 服務(wù)的最大嘗試次數(shù)
- maxretry = 3
根據(jù)上述配置,fail2ban會(huì)自動(dòng)禁止在最近10分鐘內(nèi)有超過(guò)3次訪問(wèn)嘗試失敗的任意IP地址。一旦被禁,這個(gè)IP地址將會(huì)在24小時(shí)內(nèi)一直被禁止訪問(wèn) SSH 服務(wù)。這個(gè)事件也會(huì)通過(guò)sendemail發(fā)送郵件通知。
一旦配置文件準(zhǔn)備就緒,按照以下方式重啟fail2ban服務(wù)。
在 Debian, Ubuntu 或 CentOS/RHEL 6:
- $ sudo service fail2ban restart
在 Fedora 或 CentOS/RHEL 7:
- $ sudo systemctl restart fail2ban
為了驗(yàn)證fail2ban成功運(yùn)行,使用參數(shù)'ping'來(lái)運(yùn)行fail2ban-client 命令。 如果fail2ban服務(wù)正常運(yùn)行,你可以看到“pong(嘭)”作為響應(yīng)。
- $ sudo fail2ban-client ping
- Server replied: pong
測(cè)試 fail2ban 保護(hù)SSH免遭暴力破解攻擊
為了測(cè)試fail2ban是否能正常工作,嘗試通過(guò)使用錯(cuò)誤的密碼來(lái)用SSH連接到服務(wù)器模擬一個(gè)暴力破解攻擊。與此同時(shí),監(jiān)控 /var/log/fail2ban.log,該文件記錄在fail2ban中發(fā)生的任何敏感事件。
- $ sudo tail -f /var/log/fail2ban.log

根據(jù)上述的日志文件,F(xiàn)ail2ban通過(guò)檢測(cè)IP地址的多次失敗登錄嘗試,禁止了一個(gè)IP地址192.168.1.8。
#p#
檢查fail2ban狀態(tài)并解禁被鎖住的IP地址
由于fail2ban的“ssh-iptables”監(jiān)獄使用iptables來(lái)阻塞問(wèn)題IP地址,你可以通過(guò)以下方式來(lái)檢測(cè)當(dāng)前iptables來(lái)驗(yàn)證禁止規(guī)則。
- $ 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中解鎖某個(gè)IP地址,你可以使用iptables命令:
- $ sudo iptables -D fail2ban-SSH -s 192.168.1.8 -j DROP
當(dāng)然你可以使用上述的iptables命令手動(dòng)地檢驗(yàn)和管理fail2ban的IP阻塞列表,但實(shí)際上有一個(gè)適當(dāng)?shù)姆椒ň褪鞘褂胒ail2ban-client命令行工具。這個(gè)命令不僅允許你對(duì)"ssh-iptables"監(jiān)獄進(jìn)行管理,同時(shí)也是一個(gè)標(biāo)準(zhǔn)的命令行接口,可以管理其他類型的fail2ban監(jiān)獄。
為了檢驗(yàn)fail2ban狀態(tài)(會(huì)顯示出當(dāng)前活動(dòng)的監(jiān)獄列表):
- $ sudo fail2ban-client status
為了檢驗(yàn)一個(gè)特定監(jiān)獄的狀態(tài)(例如ssh-iptables):
- $ sudo fail2ban-client status ssh-iptables
上面的命令會(huì)顯示出被禁止IP地址列表。

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

注意,如果你停止了Fail2ban 服務(wù),那么所有的IP地址都會(huì)被解鎖。當(dāng)你重啟 Fail2ban,它會(huì)從/etc/log/secure(或 /var/log/auth.log)中找到異常的IP地址列表,如果這些異常地址的發(fā)生時(shí)間仍然在禁止時(shí)間內(nèi),那么Fail2ban會(huì)重新將這些IP地址禁止。
設(shè)置 Fail2ban 自動(dòng)啟動(dòng)
一旦你成功地測(cè)試了fail2ban之后,最后一個(gè)步驟就是在你的服務(wù)器上讓其在開(kāi)機(jī)時(shí)自動(dòng)啟動(dòng)。在基于Debian的發(fā)行版中,fail2ban已經(jīng)默認(rèn)讓自動(dòng)啟動(dòng)生效。在基于Red-Hat的發(fā)行版中,按照下面的方式讓自動(dòng)啟動(dòng)生效。
在 CentOS/RHEL 6中:
- $ sudo chkconfig fail2ban on
在 Fedora 或 CentOS/RHEL 7:
- $ sudo systemctl enable fail2ban
總結(jié)
在該教程中,我演示了如何安裝并配置fail2ban來(lái)保護(hù)一個(gè)SSH服務(wù)器。當(dāng)然fail2ban可以緩解暴力密碼攻擊,但是請(qǐng)注意,這并不能保護(hù)SSH服務(wù)器避免來(lái)自復(fù)雜的分布式暴力破解組織,這些攻擊者通過(guò)使用成千上萬(wàn)個(gè)機(jī)器控制的IP地址來(lái)繞過(guò)fail2ban的防御機(jī)制。
via: http://xmodulo.com/how-to-protect-ssh-server-from-brute-force-attacks-using-fail2ban.html
























