~/blog/wordpress-security-health-check-automation.md
網站安全與防護 ·

WordPress 安全健檢自動化:每週掃什麼,哪些絕對不能讓它自己處理

Eric,浪花科技創辦人 / AI 架構師
Eric
浪花科技創辦人 · AI 架構師
WordPress 安全健檢自動化:每週掃什麼,哪些絕對不能讓它自己處理
目錄 table-of-contents.md
font-size:

網站被入侵這件事,多數人不是從自己的監控知道的。比較常見的版本是: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 自動化開發在幫客戶處理的事。跟我們聊聊你手上的站現在的狀況

延伸閱讀

// 推薦服務
首月免費 · 月費 NT$249 起
想用 n8n、Dify、WordPress,卻不想自己養伺服器?

RoamerHost 幫你把開源 AI 與自動化工具一鍵代管:獨立 Docker、自動 SSL、24/7 監控,60 秒上線。省下租機器、裝環境、顧維運的力氣,訂閱就能開始用。

立即免費註冊
// FAQ

常見問題

裝了 WAF 還需要做每週掃描嗎?
需要,兩者防守的時間點不同。WAF 擋的是進來之前,掃描找的是已經進來的東西。實務上造成損失的入侵有不少不是從網頁請求進來的,而是外掛漏洞、外洩的密碼,或共用主機上其他站被打下來後橫向移動,這些 WAF 都攔不到。WAF 降低被打中的機率,週掃縮短沒被發現的時間,要一起做才有意義。
發現可疑檔案可以讓它直接刪掉嗎?
不建議,有兩個理由。一是誤判代價不對稱,刪錯外掛檔案可能讓網站直接白畫面;二是如果真的被入侵,那些檔案是證據,急著清乾淨會失去追查入侵途徑的機會,而沒找到入口就清檔案,過幾天同樣的東西會再出現。浪花科技的界線是偵測與回報自動化,隔離與清除留給人。
檔案異動偵測通知量太大怎麼辦?
雜訊主要來自三個地方:快取檔、日誌檔、外掛正常更新造成的大量變動。做法是先把已知會變動的路徑寫進排除清單,再把外掛更新的時間點記錄下來,讓那段期間的異動自動標為預期內。處理完這三類之後剩下的通常不多,而剩下的每一筆都值得看。
投報率最高的單項檢查是哪個?
檢查上傳目錄底下有沒有可執行檔。合法的 WordPress 運作幾乎不需要在 uploads 放 php 檔,所以那裡出現的意義相當明確,誤判率極低,而且一行指令就能做完。如果只有時間做一項,就做這個。管理員帳號數量比對是第二順位,因為攻擊者拿到權限後很常留一個自己的帳號。
第一次掃出一大堆問題,是不是設定錯了?
是正常的。第一次執行沒有基準線可比對,只能建立基準並把當下所有問題列出來,這份清單通常很長而且包含陳年小問題。不用一次清完,先處理高風險的,其餘當待辦。真正的價值從第二次開始,因為那時才有「跟上次不一樣」這個訊號,所以關鍵不是第一次跑得多完整,是有沒有持續跑下去。
#WordPress #網站安全 #Agent Skills #資安健檢 #WAF #自動化
// 本主題完整指南 · 網站安全與防護
網站資安縱深防禦完整指南:台灣中小企業的五層防護實戰

這個主題的完整脈絡、選型比較與導入建議,都整理在指南裡。

~/roamer-tech/newsletter // FREE
// newsletter

訂閱免費電子報

把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。

$
// final.exec()

準備好讓你的網站開始為你工作了嗎?