Unsplash+
使用 Fail2ban 來阻止暴力攻擊 WordPress 控制台登入,WordPress 建置網站的數量一直成長,相對的網路上針對 WordPress 的攻擊就越來越多,雖然防範都有作了,像是 xmlrpc.php 與 wp-login.php 的暴力攻擊,卻耗掉主機及網路不少的資源。
內容目錄:
- 什麼是 Fail2Ban?
- 安裝 Fail2ban
- 配置 Fail2ban
WordPress 最常見被入侵的問題,大多數是 wp-login 的暴力攻擊,管理者的密碼太弱,就很容易被猜測到導致網站被入侵;即使用安全外掛或更改控制台路徑,這樣的暴力入侵方式,一樣對 wp-login.php 不停的發出請求,一直消耗您的主機資源,直到網站資源耗盡而停止服務。
針對這樣的攻擊方式,最好的方法就是利用 Fail2ban 程序將這些攻擊 IP 阻擋到防火牆之外,也因此可以節省您的網路頻寬和主機資源。
什麼是 Fail2Ban?
Fail2ban 是一個日誌解析應用程序,它監視系統日誌中,是否存在針對您的伺服器的自動攻擊的狀態,當找到嘗試的折衷方案時,使用定義的參數,Fail2ban 將向 iptables 添加新規則以阻止攻擊者的 IP,Fail2ban 還可以通過電子郵件提醒您正在發生攻擊。
Fail2ban 主要的是用來防止 SSH 攻擊,但是,我們可以利用定義的參數來保護 WordPress 不受損害。
我們使用 Webinoly LNMP (Ubuntu 18.04) 系統 + Fail2ban 來說明配置方法。
安裝 Fail2ban
確保您的系統是最新的:
sudo apt update
apt list --upgradable
sudo apt -y upgrade
sudo apt -y autoremove
安裝 Fail2ban
apt-get install fail2ban
安裝好該服務將自動啟動。
配置 Fail2ban
Fail2ban 首先讀取 .conf 配置文件,然後 .local 文件覆蓋任何設置;因此,對配置的所有更改通常都在 .local 文件中完成,而 .conf 文件保持不變。
安裝完成後,創建一個 jail.local 用於編輯:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
清除原本 jail.local 內容,參考以下內容:
[DEFAULT]
ignoreip = 127.0.0.1/8
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 86400
findtime = 60
[wordpress]
enabled = true
filter = wordpress
logpath = /var/log/nginx/f2b.woowp.tw.access.log
port = 80,443
maxretry = 5
bantime = 86400
findtime = 60
上面的設置說明:
- 白名單 IP:特定的白名單 IP,請將它們添加到該 ignoreip 行,默認情況下,此命令不會禁止 localhost。
- bantime: 禁止 IP 的時間長度 (以秒為單位),如果設置為負數 (-1),將是永久禁止的。
- findtime:設置禁止之前登錄嘗試之間的時間長度,例如:如果在 5 次登錄嘗試失敗後,Fail2ban 將禁止該 IP 為 24 小時,那麼這 5 次嘗試登入必須在設置的 60 秒鐘 (findtime) 時間內發生。
- maxretry:在實施禁令之前,可以嘗試從單個 IP 訪問服務器的次數 (5 次)。
- logpath:提供服務日誌的位置。我們告訴 Fail2Ban 網站 f2b.woowp.tw 的日誌位置,並分析 f2b.woowp.tw.access.log 文件,以查找與過濾器中的規則匹配的項目來封鎖 IP。
注意:每一個主機系統的日誌位置會有所不同,logpath 請依照您的日誌正確路徑。
為 WordPress 編寫過濾規則:
在 /etc/fail2ban/filter.d 目錄下創建一個 wordpress.conf 文件,請參考以下內容:
[Definition]
failregex = .*(POST|GET).*(wp-login\.php|xmlrpc\.php).* 200
ignoreregex =
上面的過濾配置是對於 wp-login.php | xmlrpc.php 發出 GET 與 POST 的請求,請注意,我們只需要追蹤到 200 的回應,編寫的參數是依照 log 文件的格式,log 文件格式類是於:
123.45.67.89 0.016 - [03/Apr/2019:23:00:33 +0800] f2b.woowp.tw "GET /wp-login.php HTTP/1.1" 200 1127 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
保存好文件後,然後重新啟動 Fail2ban
sudo systemctl restart fail2ban
最後別忘了,主機開機後就啟動 Fail2ban 程序:
sudo systemctl enable fail2ban
使用 Fail2ban Client 命令,fail2ban-client,可用方便命令行運行 Fail2ban:
- start:啟動 Fail2ban 和 jails 服務。
- reload:重新加載 Fail2ban 的配置文件。
- stop:停止服務。
- status:顯示 Fail2ban 服務狀態。
例如:要檢查 Fail2Ban 是否正在運行並且啟用了 SSHd | jail
fail2ban-client status
將會回應:
Status
|- Number of jail: 3
`- Jail list: ssh, sshd, wordpress
SSH 和 WordPress 過濾規則已經在運行了。
好了,現在可以將 bantime 秒數調低一點,來測試一下您的 WordPress 網站後台,看看有沒有阻擋 wp-login.php 攻擊的效果,按 F5 或輸入錯誤的登入密碼 5 次,應該就被 Fail2Ban 所阻擋了。
如果都沒有效果,請再檢視 wordpress.conf 文件與 log 文件,使用以下命令,檢視是否出現 error 錯誤 (請修改為您的網站日誌路徑及文件)。
fail2ban-regex /var/log/nginx/f2b.woowp.tw.access.log /etc/fail2ban/filter.d/wordpress.conf
回應:
Running tests
=============
Use failregex filter file : wordpress, basedir: /etc/fail2ban
Use log file : /var/log/nginx/f2b.woowp.tw.access.log
Use encoding : ANSI_X3.4-1968
Results
=======
Failregex: 148 total
|- #) [# of hits] regular expression
| 1) [148] .*(POST|GET).*(wp-login\.php|xmlrpc\.php).* 200
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [313] Day(?P<_sep>[-/])MON(?P=_sep)ExYear[ :]?24hour:Minute:Second(?:\.Microseconds)?(?: Zone offset)?
`-
Lines: 313 lines, 0 ignored, 148 matched, 165 missed
[processed in 0.58 sec]
Missed line(s): too many to print. Use --print-all-missed to print all 165 lines
有關 fail2ban 命令或其他資訊,請參閱 Fail2ban wiki。
http://www.fail2ban.org/wiki/index.php/Fail2ban:Community_Portal
結語
DDoS 攻擊先不談,自建 VPS 主機後,最常遇到的是 robot 蜘蛛和 xmlrpc | wp-login 這一類的機器人攻擊方式,雖然對網站不會有太大的傷害,但是,這種高密度、持續式的造訪網站,也不知道何時才會停止;如果您的 VPS 主機效能不好,Web 服務和 MySQL 服務,是很容易造成崩潰而停止。
而這一類的機器人攻擊方式,會一直變換 IP 來訪問,我們無法使用 iptables 防火牆來一一封鎖,最好的方法,就是使用 fail2ban 程序,分析網站日誌自動封鎖掉這些不友善的 IP 地址,維持主機的穩定、安全。
參考資料:
https://www.linode.com/docs/security/using-fail2ban-for-security/
發佈留言