WordPress 安全健檢自動化:每週掃什麼,哪些絕對不能讓它自己處理
☰ 目錄 table-of-contents.md
網站被入侵這件事,多數人不是從自己的監控知道的。比較常見的版本是:Google 搜尋結果突然被標上警告、客戶打電話來說點進去跳到奇怪的頁面、或是主機商寄信通知你的伺服器在對外發垃圾信。等到這些訊號出現,攻擊者通常已經在裡面待了一段時間。
安全檢查的價值不在於發現當下正在發生的攻擊,在於縮短「被入侵」到「你發現」之間的那段空白。這件事的本質是定期比對,而定期比對正好是人最不擅長、程式最擅長的工作。這篇談怎麼把 WordPress 的安全健檢寫成每週會自己跑一次的 Skill。
安全檢查跟一般維運檢查不是同一件事
兩者的差別大到不該寫在同一份清單裡。一般維運看的是「狀態好不好」,備份有沒有產生、憑證還剩幾天、磁碟夠不夠用,這些看當下的數值就能判斷。安全檢查看的是「有沒有跟上次不一樣」,重點在變化而不是絕對值,所以它必須要有前一次的紀錄可以比對。
頻率也不同。維運月檢就夠了,安全檢查建議至少每週,因為攻擊者拿到權限之後的動作通常在幾天內就會展開。我們在WordPress 維運交給 AI 代理人那篇談的是前者,這裡專講後者。
每週該掃的六件事
清單不用長,但每一項的判斷門檻要寫死,而且要能跟上次比對。
| 項目 | 看什麼 | 異常的判斷 |
|---|---|---|
| 核心檔案完整性 | WordPress 核心檔案的雜湊值 | 與官方版本不符即為異常,沒有例外 |
| 外掛與主題檔案 | 上次掃描後有異動的檔案清單 | 非更新造成的異動都要人看 |
| 管理員帳號 | 管理員層級帳號數量與清單 | 新增即為高風險,需立即確認 |
| 可疑檔案 | 上傳目錄裡的可執行檔 | uploads 底下出現 php 檔一律當異常 |
| 排程任務 | cron 事件清單 | 出現不認得的 hook 要追來源 |
| 登入失敗 | 失敗次數與來源分布 | 單一來源短時間大量嘗試 |
第四項是投報率最高的一項。合法的 WordPress 運作幾乎不需要在上傳目錄放可執行檔,所以那裡出現 php 檔的意義相當明確,而這個檢查用一行指令就能做完。
檔案異動偵測:最有效,也最吵
檔案異動比對是這份清單裡最能抓到真問題的一項,但如果直接開下去,第一週你會收到幾百個異動通知然後就再也不想看了。雜訊主要來自三個地方:快取檔、日誌檔、以及外掛正常更新造成的大量檔案變動。
處理方式是先把已知會變動的路徑排除掉,再把外掛更新的時間點記進去,讓那段時間的異動自動標為預期內。剩下的通常就不多了,而剩下的每一筆都值得看。
---
name: wp-weekly-security-scan
description: WordPress 站台的每週安全掃描,比對核心檔案、異動檔案、管理員帳號與排程異常。當使用者要求安全檢查、掃描網站、看有沒有被入侵、資安健檢時使用。
---
# WordPress 每週安全掃描
## 前置
讀取 references/baseline.json(上次掃描的結果)。不存在就建立基準線並註明這是第一次。
## 掃描項目(不要跳項)
1. wp core verify-checksums,任何不符都列為高風險
2. 比對 uploads 目錄有無 .php/.phtml/.phar 檔案
3. 列出管理員帳號,與 baseline 比對,新增的列為高風險
4. 列出 cron 事件,與 baseline 比對,新增的要追來源
5. 檔案異動:排除 references/ignore-paths.txt 列出的路徑
6. 統計登入失敗次數與來源
## 判斷原則
不確定的一律標為「需人工確認」,不要自己判斷是誤報。
寧可多報,不要漏報。
## 界線
只做讀取與回報。不要刪除任何檔案、不要停用外掛、不要改權限、不要封鎖 IP。
發現高風險項目時,把處理建議寫出來,等人決定。
## 結束時
更新 baseline.json,並在報告開頭寫明這次與上次的間隔天數。
為什麼不讓它自己處理
看到可疑檔案就刪掉,聽起來很合理,實務上會出事。
第一個問題是誤判的代價不對稱。刪錯一個外掛的檔案,網站可能直接白畫面,而你還要花時間才會意識到是自動化幹的。第二個問題更麻煩:如果真的被入侵了,那些檔案是證據。急著清乾淨會讓你失去追查入侵途徑的機會,而沒找到入口就清檔案,過幾天同樣的東西會再出現一次。
所以我們的界線是:偵測與回報交給它,隔離與清除留給人。要縮短反應時間的話,做法是把通知管道接好,不是把處理權限放寬。
它跟 WAF 是互補的
常有人問裝了 WAF 還需不需要做這件事。需要,因為兩者防守的時間點不同。WAF 擋的是進來之前,掃描找的是已經進來的東西。實務上真正造成損失的入侵,很多不是從網頁請求進來的,而是外掛漏洞、被外洩的密碼、或是共用主機上的其他站被打下來之後橫向移動。這些 WAF 都攔不到。
把兩層一起做才有意義:WAF 降低被打中的機率,週掃縮短沒被發現的時間。WAF 這一側的設定我們在 WordPress WAF 防火牆設定完整指南寫過三層防線的完整做法,規則調校的部分在智能 WAF 防禦策略。
帳號那一項值得多花點力氣
管理員帳號的檢查看起來簡單,但它是少數能直接抓到入侵結果的訊號。攻擊者拿到權限之後很常做的第一件事就是留一個自己的帳號,方便原本的漏洞被補起來之後還能回來。
除了數量比對,還有兩件值得一起看:長期沒登入的管理員帳號(離職同事、前一個廠商留下的),以及權限比工作需要更高的帳號。這兩類帳號平常不會出事,但一旦密碼外洩就是完整的管理權。權限收斂的做法可以參考WordPress 自訂使用者角色與權限管理實戰。
第一次跑會很醜,這是正常的
第一次執行沒有基準線可以比對,所以它只能建立基準,順便把當下的問題全部列出來。這份清單通常會很長,包含一堆陳年的小問題。不用一次清完,把高風險的處理掉,其餘的當作待辦。
真正的價值從第二次開始出現,因為那時候才有「跟上次不一樣」這個訊號。所以這件事的門檻不是第一次跑得多完整,是有沒有跑第二次、第三次。這也是為什麼要把它寫成 Skill 而不是寫成一份文件,文件不會自己跑。
這些做法我們實際用在客戶的站上,成品可以看作品案例,像立朋工業、集羽珠寶、辰羿起重這幾個都是 WordPress 做的,維運也一起接手。
如果你的站已經上線一段時間卻從來沒做過完整的安全盤點,或是管著多個站不知道從哪個開始查,這正是我們AI 自動化開發在幫客戶處理的事。跟我們聊聊你手上的站現在的狀況。
延伸閱讀
RoamerHost 幫你把開源 AI 與自動化工具一鍵代管:獨立 Docker、自動 SSL、24/7 監控,60 秒上線。省下租機器、裝環境、顧維運的力氣,訂閱就能開始用。
▶立即免費註冊常見問題
裝了 WAF 還需要做每週掃描嗎?
發現可疑檔案可以讓它直接刪掉嗎?
檔案異動偵測通知量太大怎麼辦?
投報率最高的單項檢查是哪個?
第一次掃出一大堆問題,是不是設定錯了?
訂閱免費電子報
把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。