使用 Fail2ban 保護您的 WordPress

Fail2ban for WordPress

使用 Fail2ban 來阻止暴力攻擊 WordPress 控制台登入,WordPress 建置網站的數量一直成長,相對的網路上針對 WordPress 的攻擊就越來越多,雖然防範都有作了,像是 xmlrpc.php 與 wp-login.php 的暴力攻擊,卻耗掉主機及網路不少的資源。

WordPress 最常見被入侵的問題,大多數是 wp-login 的暴力攻擊,管理者的密碼太弱,就很容易被猜測到導致網站被入侵;即使用安全外掛或更改控制台路徑,這樣的暴力入侵方式,一樣對 wp-login.php 不停的發出請求,一直消耗您的主機資源,直到網站資源耗盡而停止服務

Fail2ban for WordPress

wp-login 暴力攻擊的 log 文件

針對這樣的攻擊方式,最好的方法就是利用 Fail2ban 程序將這些攻擊 IP 阻擋到防火牆之外,也因此可以節省您的網路頻寬和主機資源。

Advertisement

什麼是 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 請依照您的日誌正確路徑。

Fail2ban for WordPress

暴力攻擊造成的主機高負載

為 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。

結語

DDoS 攻擊先不談,自建 VPS 主機後,最常遇到的是 robot 蜘蛛和 xmlrpc | wp-login 這一類的機器人攻擊方式,雖然對網站不會有太大的傷害,但是,這種高密度、持續式的造訪網站,也不知道何時才會停止;如果您的 VPS 主機效能不好,Web 服務和 MySQL 服務,是很容易造成崩潰而停止。

而這一類的機器人攻擊方式,會一直變換 IP 來訪問,我們無法使用 iptables 防火牆來一一封鎖,最好的方法,就是使用 fail2ban 程序,分析網站日誌自動封鎖掉這些不友善的 IP 地址,維持主機的穩定、安全。

參考資料:

Featured Photo by Free-Photos from Pixabay

yungke
Follow me
Advertisement

Follow Me

查看本文
喜愛 Like 點擊數!!
Back to top