通過 SSH 連接到服務(wù)器非常安全,但是 SSH 守護(hù)進(jìn)程本身必須暴露給互聯(lián)網(wǎng)才能正常工作。這很容易成功潛在攻擊者的目標(biāo)。以這種方式暴露給網(wǎng)絡(luò)的任何服務(wù)都是攻擊者的潛在目標(biāo)。如果我們注意過這些服務(wù)的日志,就會(huì)經(jīng)??吹街貜?fù)的登錄嘗試,這就意味著該服務(wù)遭受了暴力破解攻擊。WordPress 因?yàn)閺V泛使用也每天都遭受著這樣的攻擊。
Linux 系統(tǒng)中有一個(gè)叫 Fail2ban 的服務(wù),可以通過分析應(yīng)用程序日志識(shí)別暴力破解行為,然后自動(dòng)修改 iptables 防火墻規(guī)則來屏蔽掉攻擊者 的 IP 地址。這個(gè)過程是自動(dòng)的,配置好Fail2ban 服務(wù)后,我們就不需要人工干預(yù)了。在這篇文章中,我將介紹如何在 CentOS 7 服務(wù)器上安裝和使用 Fail2ban。
在CentOS 7上安裝Fail2ban
官方 CentOS 組件庫(kù)中沒有包含 Fail2ban 軟件,它被打包在了 EPEL 項(xiàng)目中(EPEL代表額外的企業(yè)版 Linux 軟件包),我們需要先啟用 EPEl 倉(cāng)庫(kù)。
sudo yum install epel-release
現(xiàn)在,我們應(yīng)該可以安裝 Fail2ban 包了
sudo yum install fail2ban
安裝完成后,我們需要使用 systemctl 啟用 Fail2ban 服務(wù):
sudo systemctl enable fail2ban
自定義 Fail2ban 設(shè)置
Fail2ban 的配置文件在/etc/fail2ban目錄。在這里,我們可以找到一個(gè)名為 jail.conf 的 Fail2ban 配置文件。此文件可能會(huì)被軟件包升級(jí)覆蓋,所以我們不應(yīng)該直接編輯,我們可以編寫一個(gè)名為新文件 jail.local 的自定義配置文件,該文件中定義的任何值將覆 jail.conf 中的設(shè)置。
jail.conf 包含了 [DEFAULT] 配置,隨后是各個(gè)服務(wù)的配置。 jail.local 可以覆蓋這些值中的任何值。另外,文件夾 /etc/fail2ban/jail.d/ 中的服務(wù)相關(guān)設(shè)置又可以覆蓋這兩個(gè)文件中的設(shè)置,這些文件的優(yōu)先級(jí)如下:
- /etc/fail2ban/jail.conf
- /etc/fail2ban/jail.d/*.conf,按字母順序排列
- /etc/fail2ban/jail.local
- /etc/fail2ban/jail.d/*.local,按字母順序排列
任何文件可以包含一個(gè) [DEFAULT] 配置,首先執(zhí)行,也可以包含各個(gè)服務(wù)的配置。
首先,讓我們編寫一個(gè)非常簡(jiǎn)單的 jail.local。使用 vi 編輯器打開一個(gè)新文件:
sudo vi /etc/fail2ban/jail.local
粘貼以下內(nèi)容:
[DEFAULT]
# Ban hosts for one hour:
bantime = 3600
# Override /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport
[sshd]
enabled = true
上面的配置覆蓋了三種設(shè)置:為所有服務(wù)設(shè)置了一個(gè)新的屏蔽時(shí)間,設(shè)置使用 iptables 進(jìn)行屏蔽操作,并啟用了sshd 屏蔽,修改完成后,我們需要重啟以便使 Fail2ban 生效:
sudo systemctl restart fail2ban
該命令完成后應(yīng)該沒有任何輸出。
Fail2ban 其他可用設(shè)置
我們可能還需要調(diào)整 Fail2bam 的其他設(shè)置。打開 jail.conf,我們將討論一些默認(rèn)設(shè)置。如果需要改變這些值,一定要復(fù)制到 jail.local 配置文件里面調(diào)整,而不是直接在默認(rèn)文件里面修改。
sudo vi /etc/fail2ban/jail.conf
Jail 的所有默認(rèn)設(shè)置
首先是 [DEFAULT] 部分。
ignoreip = 127.0.0.1/8
該參數(shù)可以讓 Fail2ban 忽略來自某些 IP 的流量。目前,它被配置為不禁止來自本機(jī)的任何流量。我們可以附加更多 IP(以空格分隔)來忽略其他地址。
bantime = 600
bantime 參數(shù)設(shè)置了某IP被屏蔽的時(shí)間,以秒為單位,默認(rèn)為600秒,也就是10分鐘。
findtime = 600
maxretry = 3
接下來要注意的兩個(gè)參數(shù)是 findtime 和maxretry。這兩個(gè)參數(shù)共同確定了某IP應(yīng)該被屏蔽的條件。
maxretry 變量設(shè)置一個(gè) IP 在 findtime 內(nèi),被屏蔽之前可以嘗試的次數(shù)。默認(rèn)情況下,F(xiàn)ail2ban 將禁止在10分鐘內(nèi) 3 次登錄失敗的 IP。
destemail = root@localhost
sendername = Fail2Ban
mta = sendmail
如果要配置電子郵件警報(bào),我們可能需要重寫 destemail,sendername 和 mta 設(shè)置。destemail 參數(shù)設(shè)置了接收禁止消息的電子郵件地址。sendername 為郵件“發(fā)件人”字段的值。mta 參數(shù)設(shè)置了使用什么郵件服務(wù)來發(fā)送郵件。
action = $(action_)s
此參數(shù)設(shè)置了當(dāng) Fail2ban 想要屏蔽 IP 時(shí)采取的操作。默認(rèn)操作是配置防火墻以拒絕來自符合屏蔽條件的流量,直到屏蔽時(shí)間過去。
其他 Jail 設(shè)置
在 [DEFAULT] 之后,是各個(gè)服務(wù)的 jail 設(shè)置,通常包括一個(gè) port 和需要監(jiān)控的日志路徑 logpath。例如,我們啟用了 SSH 監(jiān)控,jail.local 中會(huì)有如下設(shè)置:
[sshd]
port = ssh
logpath = %(sshd_log)s
這種情況下,ssh 是一個(gè)標(biāo)準(zhǔn) SSH 端口的預(yù)定義變量,%(sshd_log)s 使用 Fail2ban 標(biāo)準(zhǔn)配置處定義的值(方便 jail.conf 在不同操作系統(tǒng)中移植)。
在有些監(jiān)控服務(wù)中,可能需要單獨(dú)設(shè)置一個(gè) filter,用來確定驗(yàn)證失敗的規(guī)則,該 filter 值位于 /etc/fail2ban/filter.d 目錄,此文件包含一個(gè)正則表達(dá)式,用于確定日志中的行是否符合屏蔽條件。后面將要介紹的 WordPress 監(jiān)控設(shè)置就需要新建一個(gè) filter 文件。
我們可以通過列出該目錄中的文件來查看可用的過濾器:
ls /etc/fail2ban/filter.d
如果我們看到一個(gè)與正在使用的服務(wù)相關(guān)的文件,大多數(shù)情況下該過濾規(guī)則是可以直接使用的,例如,我們正在使用 Nginx,我們可以在我們的 /etc/fail2ban/jail.local 文件中設(shè)置 [nginx-http-auth]:
[DEFAULT]
# Ban hosts for one hour:
bantime = 3600
# Override /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport
[sshd]
enabled = true
[nginx-http-auth]
enabled = true
重新啟動(dòng) Fail2ban 服務(wù):
sudo systemctl restart fail2ban
查看 Fail2ban 狀態(tài)和防火墻設(shè)置
設(shè)置了 Fail2ban后,我們需要知道 Fail2ban 是否按預(yù)期工作的,通過啟動(dòng) fail2ban-client 檢查整體服務(wù)狀態(tài)或個(gè)別監(jiān)控服務(wù)的狀態(tài):
sudo fail2ban-client status
sudo fail2ban-client status jail_name
也可以列出為 iptables 當(dāng)前生效的規(guī)則來查看通過 Fail2ban 屏蔽的 ip:
sudo iptables -L
使用 Fail2ban 防止 WordPress 暴力破解
如果我們的 WordPress 站點(diǎn)設(shè)置了訪問日志,我們就可以讓 Fail2ban 監(jiān)控網(wǎng)站日志,來防止 WordPress 暴力破解,凡是不停發(fā)送 POST 的請(qǐng)求到 wp-login.php 的請(qǐng)求,一般情況下都是暴力破解的行為。根據(jù)這個(gè)特征,我們可以設(shè)置下面的 filter,命名為wordpress.conf,放在/etc/fail2ban/filter.d/文件夾中。
# WP brute force attacks filter
[Definition]
failregex =.*-.*-.*POST.*/wp-login$
ignoreregex =
然后在 jail.local 文件中,加入以下內(nèi)容,其中的 logpath 就是網(wǎng)站的訪問日志路徑。
[wordpress]
enabled = true
filter = wordpress
logpath = /home/wwwlogs/*.log
maxretry = 3
port = http,https
Centos 7 使用了 firewalld 替代了 iptables,F(xiàn)ail2ban 可能無法更新 iptables 規(guī)則,這種情況下,使用下面兩條命令禁用 firewalld 防火墻,然后啟用 iptables 就可以了。
systemctl stop firewalld
systemctl mask firewalld
解封被誤殺的 IP
如果我們自己的 IP 地址被誤封了,可以使用下面的命令解封。
fail2ban-client set wordpress unbanip 8.8.8.8
添加 IP 地址到白名單
如果某個(gè) IP 地址需要頻繁登錄,我們可以添加這個(gè) IP 地址到白名單,以免觸發(fā) Fail2ban 規(guī)則造成不便。
fail2ban-client set wordpress addignoreip 8.8.8.8 # 添加 IP 到白名單
fail2ban-client set wordpress?delignoreip 8.8.8.8?#?從白名單中刪除?IP
通過上面的設(shè)置,服務(wù)器就可以防止大部分的暴力破解攻擊了,WordPress 安全性又提升了一個(gè)級(jí)別。即便如此,我們依然不能忘記安全的基本規(guī)則,不要設(shè)置過于簡(jiǎn)單的密碼,謹(jǐn)慎保存自己的密碼,防止泄露。安全不僅是一種狀態(tài),更是一種習(xí)慣,養(yǎng)成了注意網(wǎng)絡(luò)安全的習(xí)慣,安全就會(huì)一直保持下去。



CentOS 7 的 firewalld 還是可以跟 fail2ban 搭配得很好。
您參考參考 https://github.com/charlietag/os_security/blob/master/templates/F_23_setup_fail2ban/etc/fail2ban/jail.local
他default 會(huì)使用 iptables + ipset + firewalld 去擋。
效率也不錯(cuò) 跟您分享分享,如果有錯(cuò),您再跟我分享。