~/blog/wordpress-ubuntu-server-hardening-guide.md
WordPress 開發與技巧 · 2025 / 08 / 22

別只會裝外掛!從 0 到 1 打造 Ubuntu WordPress 安全堡壘

Eric — 浪花科技創辦人 / AI 架構師
Eric
浪花科技創辦人 · AI 架構師
別只會裝外掛!從 0 到 1 打造 Ubuntu WordPress 安全堡壘
目錄 table-of-contents.md

裝了安全外掛的網站為什麼還是被黑?因為外掛保護的是 WordPress 本身,沒人保護底下的 Ubuntu 主機。SSH 弱密碼、沒設防火牆、過期的系統套件,每一個都是安全外掛管不到的破口。這篇從 0 到 1,把伺服器層的安全堡壘一磚一瓦砌起來。

這就是今天我想跟大家聊聊的,一個很常被忽略、卻是攸關網站生死的根本問題:伺服器層級的安全設定。很多人以為 WordPress 的安全,裝個 Wordfence 或 Sucuri 就萬事大吉了。這就好比你家裝了最高級的保全系統,結果地基是豆腐渣工程,大門連鎖都沒上。駭客根本不用破解你的保全,直接從地基或大門闖進來,你的一切防禦都形同虛設。

所以,今天我們不談外掛,不談 WordPress 後台設定。我們要捲起袖子,回到一切的源頭——你的 Ubuntu 伺服器。我會帶你一步步、從零開始,為你的 WordPress 網站打造一個銅牆鐵壁般的堡壘。這篇會有點硬核,但相信我,搞懂這些,你的網站安全等級會直接三級跳。

地基不穩,蓋再高的樓都會倒:為什麼伺服器安全是 WordPress 的第一道防線?

在我們動手之前,先來個工程師的小囉嗦。你必須理解安全是「分層」的,就像洋蔥一樣,一層一層剝開才有核心。一個網站的防禦體系大致可以分為:

  • 伺服器層 (OS Level): 就是我們今天的主角 Ubuntu。
  • 網路服務層 (Web Server): 像是 Nginx 或 Apache。
  • 應用程式語言層 (PHP): WordPress 的主要語言。
  • 應用程式核心層 (WordPress Core): WordPress 本身。
  • 擴充層 (Plugins & Themes): 你安裝的各種外掛與佈景主題。

你裝的資安外掛,主要是在「擴充層」和「應用程式核心層」發揮作用。但如果駭客從最底層的「伺服器層」就取得了控制權,那上面的一切防護都會瞬間瓦解。這就是為什麼,一個真正安全的 WordPress 網站,必須從最底層的 Ubuntu 伺服器設定開始做起。

新手上路第一課:拿到 Ubuntu 伺服器後必做的 3 件初始設定

當你從主機商那裡拿到一台全新的 Ubuntu 伺服器時,千萬別急著安裝 WordPress。請先深呼吸,跟著我完成這三個至關重要的初始步驟。

1. 更新你的系統:別用過期的地圖打仗

這聽起來像廢話,但重要性堪比吃飯喝水。任何軟體都有漏洞,作業系統也不例外。開發者會持續發布安全更新來修補這些漏洞。你一拿到手的系統映像檔,肯定不是最新的。第一件事就是把它更新到最新狀態。

apt update 是更新軟體包列表,apt upgrade 才是真正執行升級。我們通常會把它們串在一起執行。

sudo apt update && sudo apt upgrade -y

2. 拋棄 root 帳號:給自己一把更安全的鑰匙

root 是 Linux 系統的超級管理員,權力無邊。直接用 root 帳號操作伺服器,就像拿著核彈發射鈕在街上閒晃,非常危險。任何一個手殘的指令都可能毀掉整個系統,而且一旦 root 密碼外洩,後果不堪設想。

正確的做法是建立一個普通使用者帳號,然後賦予它 sudo (Super User Do) 權限。這樣一來,每次執行需要管理員權限的指令時,都必須在前面加上 sudo 並輸入你自己的密碼,多了一層確認,也方便追蹤操作紀錄。

# 建立一個新使用者,例如 eric
adduser eric

# 將 eric 加入 sudo 群組,讓他擁有管理員權限
usermod -aG sudo eric

# 切換到新使用者身份,接下來的操作都用這個帳號
su - eric

3. 啟用 SSH 金鑰登入:跟密碼暴力破解說再見

SSH 是我們遠端連線到伺服器的主要方式。預設情況下,它使用密碼登入。但密碼,無論多複雜,都有被暴力破解(Brute-force attack)的風險。駭客可以用程式日以繼夜地嘗試各種密碼組合。

最一勞永逸的方法,就是改用 SSH 金鑰登入。它會產生一對公鑰 (public key) 和私鑰 (private key)。公鑰放在伺服器上,就像一個鎖;私鑰放在你自己的電腦裡,是唯一能打開這個鎖的鑰匙。私鑰極長且複雜,幾乎不可能被破解。

第一步:在本機電腦產生金鑰對
打開你電腦的終端機(不是伺服器),執行以下指令:

ssh-keygen -t rsa -b 4096

第二步:將公鑰複製到伺服器
最簡單的方式是使用 ssh-copy-id 指令:

ssh-copy-id eric@your_server_ip

第三步:禁用密碼登入(最關鍵!)
成功用金鑰登入伺服器後,我們就可以把密碼登入這個後門徹底關上。這一步非常重要,請務必確認你已經可以不用密碼、透過金鑰成功登入後再執行。

# 編輯 SSH 設定檔
sudo nano /etc/ssh/sshd_config

在檔案中找到 PasswordAuthentication yes 這一行,把它改成 PasswordAuthentication no。然後存檔離開,並重啟 SSH 服務讓設定生效。

sudo systemctl restart sshd

恭喜!你已經完成了伺服器安全最關鍵的初始設定。現在,只有擁有你私鑰的電腦才能登入這台伺服器。

打造數位護城河:使用 UFW (Uncomplicated Firewall) 建立基本防火牆

防火牆是伺服器的第一道大門。它的作用是控制哪些網路流量可以進來、哪些可以出去。Ubuntu 內建了一個非常簡單好用的防火牆工具叫做 UFW (Uncomplicated Firewall)。

設定預設規則:關上所有非必要的門

一個安全的策略是「預設全部拒絕,只開放必要的」。我們先設定拒絕所有連線請求,然後再一個個把需要的服務加到白名單。

# 拒絕所有傳入的連線
sudo ufw default deny incoming

# 允許所有傳出的連線(伺服器需要對外連線來更新或抓取資料)
sudo ufw default allow outgoing

開放必要通道:SSH 與 Web 服務

關上大門後,我們得開幾個小門,讓我們自己(SSH)和訪客(HTTP/HTTPS)可以進來。

# 允許 SSH 連線 (UFW 很聰明,知道 ssh 預設是 port 22)
sudo ufw allow ssh

# 允許 HTTP 流量 (port 80)
sudo ufw allow http

# 允許 HTTPS 流量 (port 443)
sudo ufw allow https

啟動防火牆並檢查狀態

設定好規則後,就可以啟動防火牆了。執行 `enable` 指令時,它會再次警告你可能會中斷現有連線,確保你已經把 SSH 加到允許列表了。

# 啟動 UFW
sudo ufw enable

# 檢查防火牆狀態和規則
sudo ufw status verbose

讓機器人為你站崗:自動化安全措施

作為一個有點懶的工程師,我堅信能自動化的就不要手動。以下兩個工具可以 24 小時不間斷地幫你守護伺服器。

1. Unattended-Upgrades:自動安裝安全更新

我們不可能每天都登入伺服器跑一次 `apt upgrade`。`unattended-upgrades` 這個套件可以幫我們自動在背景安裝重要的安全性更新,讓你高枕無憂。

# 安裝套件
sudo apt install unattended-upgrades

# 啟用自動更新設定
sudo dpkg-reconfigure --priority=low unattended-upgrades

在跳出的設定畫面選擇「是」即可。

2. Fail2Ban:自動封鎖惡意 IP

Fail2Ban 是一個入侵防禦工具。它會持續掃描伺服器上的日誌檔案(例如 SSH 登入失敗的紀錄),一旦發現某個 IP 在短時間內多次嘗試失敗,就會自動呼叫防火牆(UFW)將該 IP 封鎖一段時間。這是抵禦暴力破解攻擊的絕佳利器。

# 安裝 Fail2Ban
sudo apt install fail2ban

# 複製預設設定檔到本地設定檔(不要直接修改 .conf 檔,以免升級時被覆蓋)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# 編輯本地設定檔
sudo nano /etc/fail2ban/jail.local

在 `jail.local` 檔案中,你可以客製化設定。例如,找到 `[sshd]` 區塊,確認 `enabled = true`。你還可以調整 `bantime`(封鎖時間)、`findtime`(偵測時間)和 `maxretry`(最大嘗試次數)。

設定完成後,重啟 Fail2Ban 服務。

sudo systemctl enable fail2ban
sudo systemctl restart fail2ban

深入核心:WordPress 運行環境強化

伺服器本身安全了,我們還要確保運行 WordPress 的環境(檔案系統、PHP)也是安全的。

檔案權限設定:不給駭客可趁之機

這是很多新手會搞錯的地方。為了方便,很多人會把 WordPress 目錄權限設成 `777`,這等於是把家門鑰匙複製一百份到處發。正確的設定應該遵循「最小權限原則」。

一般來說,目錄權限設為 `755`,檔案權限設為 `644`。這代表只有檔案擁有者可以寫入,其他人只能讀取和執行。

# 假設你的 WordPress 網站路徑在 /var/www/your-site
# 將所有目錄權限設為 755
find /var/www/your-site -type d -exec chmod 755 {} \;

# 將所有檔案權限設為 644
find /var/www/your-site -type f -exec chmod 644 {} \;

特別注意,`wp-config.php` 這個檔案包含了你的資料庫連線資訊,是駭客最愛的目標。它的權限應該更嚴格,設為 `600`,只允許檔案擁有者讀寫。

chmod 600 /var/www/your-site/wp-config.php

PHP 安全設定:關閉不必要的危險功能

PHP 有一些功能強大但也可能被濫用的函式,例如可以直接執行系統指令的 `exec()`, `shell_exec()`, `system()` 等。如果你的 WordPress 網站用不到這些功能,最好在 `php.ini` 設定檔中把它們禁用,以防萬一有漏洞被利用。

找到你的 `php.ini` 檔案(路徑可能依版本而異,例如 `/etc/php/8.1/fpm/php.ini`),編輯 `disable_functions` 這一行:

disable_functions = exec,passthru,shell_exec,system,proc_open,popen,show_source

結論:安全是一場永無止境的旅程

跟著走到這裡,你已經為你的 WordPress 網站打下了極為堅實的安全基礎。從限制登入、設定防火牆,到自動化防禦和強化檔案權限,你建立的是一個多層次的「縱深防禦」體系。這遠比單純依賴一個安全外掛來得可靠得多。

但請記住,資安沒有終點。這是一場持續的對抗。你需要定期檢查日誌、保持系統更新,並隨時關注新的安全威脅。今天你所做的,是讓駭客的攻擊成本大幅提高,讓他們寧願去尋找那些還在「裸奔」的伺服器。這,就是我們最大的勝利。

延伸閱讀

如果你覺得這些伺服器設定太過複雜,或是希望有專業團隊為你的網站架構與安全性把關,浪花科技隨時準備好提供協助。我們專注於提供穩健、高效能且安全的 WordPress 解決方案。

立即聯繫浪花科技,讓我們為你的網站打造一個真正安心的家。

// FAQ

常見問題

為什麼裝了安全外掛的 WordPress 網站仍可能被入侵?
因為安全性是分層的,安全外掛主要在 WordPress 核心層與擴充層發揮作用,無法保護最底層的伺服器層。若駭客從 Ubuntu 伺服器層就取得控制權,上面所有外掛防護都會瞬間瓦解,因此真正安全的網站必須從伺服器設定做起。
拿到全新 Ubuntu 伺服器後,安裝 WordPress 前該先做哪些安全設定?
建議先完成三件事:用 sudo apt update && sudo apt upgrade -y 把系統更新到最新;建立一個普通使用者並加入 sudo 群組以取代直接用 root 操作;以及啟用 SSH 金鑰登入。完成這些再安裝 WordPress 會安全許多。
為什麼不該直接用 root 帳號操作伺服器?
root 是權限無邊的超級管理員,任何手誤指令都可能毀掉整個系統,且 root 密碼一旦外洩後果不堪設想。正確做法是建立普通使用者並用 usermod -aG sudo 賦予 sudo 權限,執行管理指令時加上 sudo 並輸入自己的密碼,多一層確認也方便追蹤操作紀錄。
如何設定 SSH 金鑰登入並關閉密碼登入?
先在本機用 ssh-keygen -t rsa -b 4096 產生金鑰對,再用 ssh-copy-id 把公鑰複製到伺服器。確認能以金鑰成功登入後,編輯 /etc/ssh/sshd_config 把 PasswordAuthentication 改為 no,存檔後執行 sudo systemctl restart sshd 重啟 SSH 服務。如此可徹底杜絕密碼暴力破解。
Fail2Ban 在 WordPress 伺服器防護中扮演什麼角色?
Fail2Ban 是入侵防禦工具,會持續掃描伺服器日誌(例如 SSH 登入失敗紀錄),一旦發現某 IP 在短時間內多次嘗試失敗,就自動呼叫防火牆封鎖該 IP 一段時間,是抵禦暴力破解的利器。安裝後建議將設定複製成 jail.local 再修改,可調整 bantime、findtime 與 maxretry。
~/roamer-tech/newsletter // FREE
// newsletter

訂閱免費電子報

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

$
// final.exec()

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