WordPress 目前已經是世界上最多人使用的 CMS 系統,隨之而來的就是對於他的攻擊也越來越多,不過根據個人經驗,如果有在定期更新核心、外掛、主題,其實比較常見的問題反而是,使用者的密碼太弱被猜測到導致網站被入侵。
除了確保自己的密碼難易度夠之外,比較常看到的做法會是加上像是 Google reCAPTCHA,或是其他驗證的方式,不過你有想過嗎?駭客是不需要對你的 wp-login.php 做嘗試,很多驗證用的外掛也僅能保護從 wp-login.php 的登入,如果走的是 wp-json 甚至是單純對 xmlrpc.php 不斷的發出請求,持續消耗資源導致網站不堪負荷而停止服務,透過外掛也難防這些討厭的攻擊。
聰明的你一定想過,使用外掛來選擇停用 xmlrpc.php 或是其他功能,不過就以最常見的外掛 Jetpack 來說,你知道他需要使用 xmlrpc.php 來跟你的網站溝通嗎?停用後 Jetpack 部分的功能就會不正常運作,因此比較好的方法不是去停用它,而是阻止攻擊。
以下使用 CentOS 7 與 iptables 作為防火牆。
首先輸入以下指令進行安裝 fail2ban:yum install fail2ban
安裝完成後可以透過常用的編輯器編輯一個空的檔案/etc/fail2ban/jail.local
可以參考以下的內容:[DEFAULT]
ignoreip = 118.163.92.212
banaction = iptables-multiport
[wordpress-rule]
enabled = true
port = http,https
filter = wordpress-rule
logpath = /var/log/nginx/site.log
maxretry = 30
findtime = 60
bantime = -1
上面的設定是指在 60 秒內符合規則 30 次就永久封鎖 ip,對於其他設定值有興趣,可以再透過 Google 搜尋一下這些設定值對於 fail2ban 的意義,本次不多作介紹。
接著則是比對規則的設定,透過常用的編輯器編輯/etc/fail2ban/filter.d/wordpress-rule.conf
可以參考以下內容:
上面的設定就是比對出對於 wp-json、wp-login.php、xmlrpc.php 發出 GET 與 POST 的請求,不過要注意的是,如果 log 的格式跟我的不同,那就需要進行修改,以下是我的 log 格式。
可以透過 fail2ban-regex 來測試規則是否可以比對到,使用方法如下fail2ban-regex <log-檔案> <fail2ban-規則>
,例如:fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/wordpress-rule.conf
都設定完成後,輸入systemctl enable fail2ban
開機時啟用systemctl start fail2ban
現在啟動 fail2ban
現在可以輸入 iptables -L
,看一下是不是有一個新的區域叫做 f2b-wordpress-rule,透過 fail2ban-client status
也能看到是不是你的規則出現在列表中。
相關推薦:
CVE-2018-6389 Fail2ban Rule
Fedora 安裝 Fail2ban 防止暴力破解 ssh
抱歉, 實在找不出解法, 所以向您請教…
log如下
[Tue May 21 21:42:00.307142 2019] [:error] [pid 8730] [client 60.191.38.77:51924] PHP Warning: mysqli::mysqli(): (28000/1045): Access denied for user ‘opcart’@’localhost’ (using password: YES) in /var/www/html/system/library/db/mysqli.php on line 7
[Tue May 21 21:42:00.307300 2019] [:error] [pid 8730] [client 60.191.38.77:51924] PHP Warning: DB\\MySQLi::__construct(): Couldn’t fetch mysqli in /var/www/html/system/library/db/mysqli.php on line 10
[Tue May 21 21:42:00.307374 2019] [:error] [pid 8730] [client 60.191.38.77:51924] PHP Warning: DB\\MySQLi::__construct(): Couldn’t fetch mysqli in /var/www/html/system/library/db/mysqli.php on line 10
failregex 怎麼設都不對, 可否賜教, 或 指引方向
謝謝..
你的 log 是撈哪個檔案,看起來是 error_log 而不是一般的 access_log
訂得太嚴格,結果把自己給ban在外面了???
只能說要留意一下,可以把自己的 IP 加入白名單