別只會裝外掛!資深工程師帶你從 0 到 1 打造 Ubuntu 終極 WordPress 安全堡壘

2025/08/22 | 網站安全與防護

別只會裝外掛!資深工程師帶你從 0 到 1 打造 Ubuntu 終極 WordPress 安全堡壘

嗨,我是浪花科技的 Eric。在 WordPress 的世界打滾了這麼多年,我看過太多太多網站被黑的慘案。每次客戶心急如焚地跑來求救,十之八九都會聽到這句話:「我有裝安全外掛啊!怎麼還會這樣?」

這就是今天我想跟大家聊聊的,一個很常被忽略、卻是攸關網站生死的根本問題:伺服器層級的安全設定。很多人以為 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)

Q1: 為什麼只靠 WordPress 安全外掛是不夠的?

A1: 因為 WordPress 安全外掛主要作用在應用程式層級。如果駭客從更底層的伺服器作業系統(OS)層級入侵,例如透過未修補的系統漏洞或破解了 SSH 密碼,那麼外掛的所有防禦都會被繞過。伺服器安全是整個網站安全的基石,地基不穩,上層建築再堅固也沒用。

Q2: 我設定了 UFW 防火牆,還需要 Cloudflare 這樣的 WAF 嗎?

A2: 絕對需要!這是兩種不同層級的防護。UFW 是網路層防火牆,主要根據 IP 和 Port 來過濾流量,像是社區大門的保全。而 WAF(Web Application Firewall)是應用層防火牆,能分析 HTTP 請求的內容,阻擋像 SQL Injection、XSS 這樣的攻擊,像是你家門口的指紋鎖。兩者相輔相成,構成更完整的防禦體系。

Q3: 禁用了 SSH 密碼登入後,如果我的私鑰遺失了怎麼辦?

A3: 這是個好問題,也是為什麼備份私鑰非常重要的原因!如果真的不幸遺失了,唯一的辦法通常是透過主機商提供的「控制台存取 (Console Access)」或「救援模式 (Rescue Mode)」登入伺服器。這種方式繞過了 SSH,讓你像直接操作實體機器一樣,可以進去修改 /etc/ssh/sshd_config 檔案,暫時重新啟用密碼登入,或是加入新的公鑰。

Q4: 按照這篇文章設定完後,我的網站就 100% 安全了嗎?

A4: 以一個工程師的角度來說,世界上沒有 100% 的安全。安全是一個持續的過程,而不是一個一次性的設定。這篇文章教你的是建立一個非常高標準的安全基線,能擋掉 99% 以上的自動化攻擊。但你仍然需要保持系統和 WordPress 核心、外掛、主題的更新,並定期備份你的網站。記住,安全是場永無止境的攻防戰!

 
立即諮詢,索取免費1年網站保固