網路攻擊猖獗,隨時都有駭客想要破解你的 WordPress,該怎麼防範才能保護自己的網站呢?這裡分享幾個我覺得還不錯的方法供大家參考!

基本方法

基本方法雖然不能阻擋駭客攻擊,但能夠減少攻擊容易度或損失,同時也是大部分使用者都能簡單做到的方法。

勤做備份

最基本的是備份,雖然網站被攻擊或是挾持,但只要有備份就能快速還原,減少損失。

如果是託管架站的方式,需要確認是否提供每天備份的服務。如果是自行架設,簡單寫個 script 跑 daily cronjob,dump MySQL 資料,並且壓縮整個 wp 資料夾即可。亦可將備份檔上傳到雲端或異地,增加備份安全性。

以下是一個簡單的備份 script 範例,dump db 並與 wordpress 檔案(包含 wordpress source code 以及 wp-content 等資料夾)一起壓縮後,用 rclone 上傳到雲端的流程。

#!/bin/bash

echo "========================================================="
echo "Dump db"
echo "========================================================="
docker exec wordpress_db bash -c "mysqldump -h localhost -u root -p<YOUR_PASSWORD> wordpress > /tmp/db_dump/wordpress_db_dump.sql"

echo "========================================================="
echo "Start tar wordpress files"
echo "========================================================="
sudo tar zcvPf /home/ubuntu/wordpress_$(date '+%Y%m%d').tar.gz /home/ubuntu/wordpress

echo "========================================================="
echo "Upload backup file: wordpress_$(date '+%Y%m%d').tar.gz"
echo "========================================================="
rclone copy /home/ubuntu/wordpress_$(date '+%Y%m%d').tar.gz backup:/ -P

echo "========================================================="
echo "Clean backup files"
echo "========================================================="
sudo rm /home/ubuntu/wordpress_$(date '+%Y%m%d').tar.gz
sudo rm /home/ubuntu/wordpress/db_dump/wordpress_db_dump.sql

echo "========================================================="
echo "Backup finish"
echo "========================================================="

用長密碼

根據自身觀察,駭客最喜歡做的是暴力破解 WordPress 帳號密碼,常常會看到 /wp-login.php 的訪問來自世界各地。因此使用長密碼的方式做最基本的保護,即能阻擋大部分的攻擊。

隱藏 WordPress 版本號

WordPress 預設會在 html 中寫入目前版本號,這無疑是給駭客最好的禮物,讓他可以針對版本特定的漏洞下去攻擊。

檢驗方式很簡單,在網頁按右鍵,選擇 檢視網頁原始碼,搜尋 generatorwordpress,在最初幾行就會看到

<meta name=generator content="WordPress x.x.x">

到後台 Appearance > Theme Editor 頁面,在右邊點選 functions.php,於文字編輯器最後一行的 ?> 前加入

remove_action('wp_head', 'wp_generator');

再次檢驗,版本號就會消失在網頁原始碼中

進階方法

以下進階方法需要一點基本網路概念,但操作起來也不難,就讓我們一起試試!

使用 CloudFlare

用 CloudFlare 擋在你的網站前面,避免駭客直接攻擊網站伺服器。透過 CloudFlare 可以簡單做防火牆規則,也能快速緩減 DDoS 攻擊(只需要一個開關),而且這些功能都是免費!何不使用看看呢?

以下皆以 CloudFlare 來實現各種限制。

限制後台訪問 IP

駭客最想要破解你的帳號密碼登入後台,因此我們直接阻斷破解帳密的管道,讓後台的登入和管理頁面只有特定 IP 能夠訪問。

在 CloudFlare Dashboard 中,進入 網路安全 > WAF 頁面,第一頁即是 防火牆規則,免費版可以設定 5 個,相當夠用!我們立刻新增一個阻擋後台登入的規則:

(
  http.request.uri.path contains "wp-login.php" or       
  http.request.uri.path contains "/admin" or
  http.request.uri.path contains "wp-admin"
) and not ip.src in {XXX.XXX.XXX.XXX}

其中 xxx.xxx.xxx.xxx 為特定 IP。

並在下方選擇 封鎖

整個規則意思為:當網頁路徑包含 wp-login.php/adminwp-admin ,且 IP 不是我們指定的值時,就封鎖他。

阻擋 xmlrpc.php

僅阻擋 login 和 admin 頁面可能不夠,WordPress 還提供 RPC API,讓使用者可以用 Mobile APP 登入 WordPress,因此駭客也能使用 RPC API 做暴力破解!如果平常不會使用的話,乾脆直接阻擋掉即可。

同時亦可在 nginx 阻擋 xmlrpc.php 的訪問,多一層保障!

server {
...
    location /xmlrpc.php {
        return 404;
    }
...
}

限制 wp-json 訪問 IP

駭客也會透過 WordPress 提供的 REST API 來探測使用者的資訊輔助暴力破解。但正常使用後台時仍需要 REST API ,不能完全阻擋,因此我們可以把路徑 wp-json 加在先前限制訪問 IP 的規則中

(
  http.request.uri.path contains "wp-login.php" or       
  http.request.uri.path contains "/admin" or
  http.request.uri.path contains "wp-admin" or
  http.request.uri.path contains "wp-json"
) and not ip.src in {XXX.XXX.XXX.XXX}

自動化監控

如果是自己的機器,可以使用 Datadog 等雲端監控服務,設定 Monitors 觀察系統參數,如果有不正常的 CPU 負載或是網路流量,可能正遭受暴力攻擊或是 DDoS 攻擊。

不正常的持續 CPU loading 和流量,封鎖後隨即下降

此時到 CloudFlare 開啟 Under Attack 模式先無條件過濾

再查看 request log 確定問題所在

駭客用 script 透過 xmlrpc.php 暴力破解密碼

以上是我覺得保護 WordPress 網站的 8 個方法,大家可以一起試試看!

延伸閱讀:
WordPress 部落格被攻擊全記錄
0元用 Raspberry pi 架設自己的 WordPress 網站 #3 速度優化

Written by J
雖然大學唸的是生物,但持著興趣與熱情自學,畢業後轉戰硬體工程師,與宅宅工程師們一起過著沒日沒夜的生活,做著台灣最薄的 intel 筆電,要與 macbook air 比拼。 離開後,憑著一股傻勁與朋友創業,再度轉戰軟體工程師,一手扛起前後端、雙平台 app 開發,過程中雖跌跌撞撞,卻也累計不少經驗。 可惜不是那 1% 的成功人士,於是加入其他成功人士的新創公司,專職開發後端。沒想到卻在採前人坑的過程中,拓寬了眼界,得到了深層的領悟。