Linux 伺服器安全設定完整教學|SSH、MySQL、Apache、UFW 強化

Linux 伺服器安全設定完整教學|SSH、MySQL、Apache、UFW 強化

Linux Server 安裝完成後,並不代表伺服器已經具備完整的安全防護。 如果伺服器直接暴露在 Internet,應進一步處理系統更新、使用者權限、SSH、Firewall、資料庫與 Web Server 等項目。

本篇以 Ubuntu Server 為主要環境,整理一套實務上的 Linux 伺服器安全設定流程,從最基本的系統更新開始,再逐步設定一般使用者、SSH Key、UFW、防止不必要的網路服務暴露,以及 MySQL 與 Apache 的基本安全措施。

安全強化核心: 更新系統 → 最小權限 → SSH 強化 → UFW 防火牆 → 關閉不必要服務 → MySQL 安全設定 → Apache 安全設定 → 日誌與持續更新

Linux 伺服器安全設定基本原則

Linux 伺服器安全不是只設定一個防火牆就完成,而是由多個層次共同組成。 Ubuntu 官方安全建議包含最小權限、使用 Firewall,以及透過 SSH 進行安全的遠端管理。

安全項目主要目的
系統更新修補已知漏洞
一般使用者降低直接使用 root 的風險
SSH Key降低密碼暴力破解風險
UFW限制不必要的網路連線
Fail2ban對反覆失敗的登入來源進行暫時封鎖
MySQL限制資料庫帳號與網路暴露
Apache減少資訊洩漏與不必要的網站功能

系統更新與建立管理員帳號

第一步:更新 Ubuntu

新安裝完成後,先更新套件索引與已安裝套件。

sudo apt update
sudo apt upgrade -y

若環境需要進行完整發行版升級,應另外確認升級相容性,不要在正式伺服器上未經測試直接執行大型版本升級。

第二步:建立一般使用者

sudo adduser user1
sudo usermod -aG sudo user1

日常管理建議使用一般帳號,需要系統管理權限時再透過 sudo 執行。 這符合最小權限原則。

第三步:確認帳號

id user1
groups user1

確認帳號已正確建立並加入 sudo 群組後,再進行 SSH 登入測試。

UFW 防火牆設定

Ubuntu 常用 UFW(Uncomplicated Firewall)管理主機型防火牆。 啟用之前最重要的是先允許 SSH,否則遠端操作伺服器時可能把自己鎖在門外。Ubuntu 官方文件提供 ufw allow 與指定來源網段的設定方式。

查看目前狀態

sudo ufw status verbose

先允許 SSH

如果 SSH 使用預設 Port 22:

sudo ufw allow 22/tcp

更好的作法是在有固定管理來源時,只允許特定 IP 或管理網段:

sudo ufw allow proto tcp from 192.168.1.0/24 to any port 22

實際網段請依你的管理環境修改。

允許網站服務

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

啟用 UFW

sudo ufw enable
sudo ufw status numbered

不要把所有 Port 都開放。 例如 MySQL 使用的 3306,如果資料庫只供本機或 Docker/內部網路使用,通常不需要直接對 Internet 開放。

SSH 安全設定

SSH 是 Linux Server 最重要的遠端管理入口之一,因此建議使用 SSH Key,並限制可以登入的帳號。 OpenSSH 提供 PermitRootLogin、PasswordAuthentication 與 AllowUsers 等設定項目。

第一步:先建立 SSH Key

在管理電腦建立金鑰:

ssh-keygen -t ed25519

然後將公開金鑰放到伺服器帳號的:

~/.ssh/authorized_keys

Ubuntu 官方也提醒,即使使用者密碼被停用,如果該帳號仍然存在 SSH 公開金鑰,仍可能可以透過 SSH 登入,因此帳號、authorized_keys 與登入權限必須一起管理。

第二步:修改 SSH 設定

sudo nano /etc/ssh/sshd_config

常見安全設定可以依環境調整:

PermitRootLogin no
PasswordAuthentication no
AllowUsers user1

其中 PasswordAuthentication no 只有在確認 SSH Key 登入正常後再啟用。 否則可能導致自己無法登入伺服器。

第三步:先檢查設定語法

sudo sshd -t

沒有錯誤後,再重新載入 SSH 服務:

sudo systemctl reload ssh

建議保留目前的 SSH 工作階段,另外開一個終端機測試新的 SSH 登入,確認成功後再關閉原本的管理連線。

SSH Port 是否需要修改?

有些管理員會把 SSH 從 22 改成其他 Port,例如 2222。 這可以減少大量自動化掃描與雜訊,但不能把它視為真正的資安防護措施。 真正重要的是 SSH Key、限制登入帳號、Firewall、Fail2ban 與正確的存取控制。

如果真的修改 Port:

Port 2222

必須同步更新 UFW:

sudo ufw allow 2222/tcp

並確認 SSH 設定已通過 sshd -t。

Fail2ban 防止 SSH 暴力破解

Fail2ban 可以監控服務日誌,對符合規則的反覆失敗登入來源進行暫時封鎖。 它適合作為 SSH 的額外防護層,但不能取代 SSH Key 與 Firewall。

安裝 Fail2ban

sudo apt update
sudo apt install fail2ban -y

啟動服務

sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban

查看 Jail 狀態

sudo fail2ban-client status

實際 Jail 名稱與設定方式應依 Ubuntu、OpenSSH 版本及 Fail2ban 套件版本確認,不建議直接複製網路上的舊版設定檔。

MySQL 安全設定

MySQL 不應該在沒有需求的情況下直接暴露於 Internet。 如果應用程式與 MySQL 位於同一台主機,通常可以讓資料庫只接受本機或受控的內部連線。

使用 mysql_secure_installation

MySQL 官方提供 mysql_secure_installation,用來協助進行初始安全設定。

sudo mysql_secure_installation

實際提示項目會依 MySQL 版本與目前設定而有所不同,請閱讀每一項提示後再決定是否套用。

確認 MySQL 監聽位置

sudo ss -lntp | grep 3306

如果 MySQL 只需要本機使用,就應檢查 MySQL 的 bind address 與網路需求,避免不必要地監聽所有介面。

不要直接修改 mysql.user

原本常見的做法是直接執行:

UPDATE mysql.user SET Host='localhost' WHERE User='root';

不建議把直接修改系統表當成一般安全設定步驟。 MySQL 官方提供完整的帳號、權限與帳號管理機制,應使用對應的 SQL 帳號管理語法與最小權限原則。

正式應用程式也不應使用 root 帳號連線,而應建立專用資料庫帳號,只給予該應用程式真正需要的權限。

確認資料庫帳號

SELECT User, Host
FROM mysql.user;

確認帳號來源與用途,移除不需要的帳號或權限。

Apache 安全設定

Apache Web Server 的安全設定重點之一,是不要公開不必要的伺服器資訊,同時避免讓網站目錄被任意瀏覽。

隱藏 Apache 版本資訊

編輯:

sudo nano /etc/apache2/conf-available/security.conf

可使用:

ServerTokens Prod
ServerSignature Off

修改後先測試 Apache 設定:

sudo apache2ctl configtest

如果顯示:

Syntax OK

再重新載入:

sudo systemctl reload apache2

關閉目錄瀏覽

如果網站不需要目錄索引,不應讓訪客直接看到伺服器目錄中的檔案清單。 在適當的 Apache Directory 設定中,可以使用:

Options -Indexes

但要注意這個設定必須放在正確的 VirtualHost、Directory 或相關設定區塊中,不能只把一行文字隨便加到任何 Apache 設定檔。

限制敏感路徑

對設定檔、備份檔、管理目錄等敏感內容,應從檔案系統與 Apache 配置兩方面限制存取。 不要把「Require all denied」直接套用到網站根目錄,否則整個網站可能會被禁止存取。

Linux 伺服器安全檢查清單

完成基本設定後,可以用以下清單快速檢查:

檢查項目確認內容
系統更新Ubuntu 套件已更新
管理帳號日常操作不直接使用 root
SSHSSH Key 可正常登入
SSH Root確認 root SSH 登入政策
SSH Password確認停用密碼登入前已有可用 Key
UFW只開放必要 Port
Fail2ban服務正常運作
MySQL沒有不必要的 Internet 暴露
Apache設定檔通過 configtest
備份重要資料具有可還原的備份

FAQ 常見問題

Linux 伺服器一定要做安全設定嗎?

如果伺服器需要對外提供 SSH、Web、資料庫或其他服務,建議至少完成基本的更新、帳號權限、Firewall、SSH 與服務存取控制。安全設定不是一次完成,而是持續維護的工作。

SSH Key 一定比密碼安全嗎?

SSH Key 可以避免依賴傳統密碼登入,而且可以搭配限制帳號與 Firewall 使用。實際安全性仍取決於金鑰保護、主機設定與整體存取控制。

可以直接禁止 SSH root 登入嗎?

可以,但必須先確認至少有一個具備 sudo 權限的管理帳號,而且該帳號已成功使用 SSH 登入。完成測試後再停用 root SSH 登入。

SSH 改成 2222 就安全了嗎?

不是。修改 Port 主要可以減少部分自動化掃描與登入雜訊,不能取代 SSH Key、Firewall、Fail2ban 與正確的權限控制。

UFW 啟用前要注意什麼?

最重要的是確認目前使用的 SSH Port 已經加入允許規則。如果遠端伺服器直接啟用 UFW 卻沒有允許 SSH,可能導致遠端管理連線中斷。

MySQL 需要開放 3306 嗎?

不一定。如果應用程式與 MySQL 在同一台主機,通常不需要讓 Internet 直接連線到 3306。是否需要遠端連線應根據實際架構決定,並限制允許來源。

Fail2ban 可以完全防止 SSH 暴力破解嗎?

不能。Fail2ban 是額外的防護層,主要針對反覆失敗的登入行為進行暫時封鎖。仍然應搭配 SSH Key、Firewall、帳號限制與持續更新。

Apache 隱藏版本資訊就安全了嗎?

不是。隱藏版本資訊只能減少部分資訊洩漏,真正重要的是保持 Apache 與作業系統更新、限制檔案與目錄存取,以及正確設定網站權限。