使用 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 地址,維持主機的穩定、安全。

參考資料:

Fail2ban monitors system logs for symptoms of an automated attack, bans the IP and alerts you of the attach through email. This guide helps you set up Fail2ban ...

Featured Photo by Free-Photos from Pixabay

Follow me

yungke

視咖啡如命的癮君子,沒有厲害的技術,只會小打小鬧的電腦工程師,其實是個打雜小弟,修電燈、水管也都是我的工作。
yungke
Follow me
Advertisement

Follow Me

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