SSD Nodes Learn
指南 Matt Connor作者: Matt Connor · 已更新 2026-07-24

VPS SSH 安全強化教學:如何防範暴力破解攻擊

透過設定 SSH key-only 登入、停用 root 登入與密碼驗證,有效阻斷針對 port 22 的暴力破解。本文介紹如何使用 drop-in 檔案修改 sshd 設定,並搭配 Fail2ban 與 VPN 建立多層防禦機制,確保 VPS 安全。

為什麼 SSH 是強化首選

SSH 是控制伺服器的主要手段,因此也是攻擊者首要嘗試的鎖。VPS 一上線,掃描器就會開始針對 port 22 進行使用者名稱與密碼的暴力破解。您在幾分鐘內即可從日誌中觀察到此現象。強化 SSH 的核心在於消除可被猜測的因素:完全停用密碼登入、停用 root 登入,並僅允許使用加密金鑰。完成後,由於不再有密碼可供破解,持續的暴力破解將無法成功。

這前提是您的 SSH 已經可以正常運作。只要目前可以登入,就能進行強化。請依序執行步驟,並在新的連線成功前保持目前的連線開啟,以避免操作錯誤導致無法登入。

Step 1: 首先確認金鑰驗證功能正常

金鑰驗證使用金鑰對取代密碼:私鑰保留在您的電腦中,公鑰則部署於伺服器。伺服器會在不傳輸私鑰的情況下,驗證您是否持有該私鑰。在停用密碼功能前,請務必確認金鑰運作正常,否則您可能會被鎖在系統之外。

若您的電腦尚未建立金鑰,請執行以下指令:

ssh-keygen -t ed25519

將公鑰部分複製到伺服器:

ssh-copy-id user@your-server

接著開啟一個新的 SSH 連線。若系統未要求輸入密碼即可登入,代表金鑰運作正常,您可以安全地停用密碼驗證。如果您對金鑰管理不熟悉,或使用多台電腦,請參閱 SSH 金鑰管理基礎 以了解完整機制:包含每台裝置使用單一金鑰、sshd 要求的文件權限,以及筆電遺失時如何撤銷金鑰。

Step 2: 使用 drop-in 檔案強化 sshd

請勿直接編輯 /etc/ssh/sshd_config。Ubuntu 24.04 會從 /etc/ssh/sshd_config.d/ 讀取 drop-in 檔案;使用該目錄下的微型檔案更簡潔,且在套件升級時不會被覆蓋,若發生問題也易於移除。檔案名稱至關重要:sshd 會保留讀取到的第一個設定值,而 Ubuntu cloud images 在此目錄中預設提供 50-cloud-init.conf 且包含 PasswordAuthentication yes。請將檔案命名為 00-,使其排序優於原檔以生效;99- 檔案則會靜默失效。請建立一個檔案:

sudo nano /etc/ssh/sshd_config.d/00-hardening.conf

將以下內容寫入:

# Key-only login: no passwords to guess.
PasswordAuthentication no
KbdInteractiveAuthentication no

# No direct root login. Log in as your user, then use sudo.
PermitRootLogin no

每一行都會關閉一個漏洞。PasswordAuthentication no 是最重要的設定:停用密碼驗證後,暴力破解攻擊將失去目標。KbdInteractiveAuthentication no 關閉了第二種密碼類型的路徑。PermitRootLogin no 代表攻擊者必須同時擁有你的使用者名稱與金鑰,而不僅僅是針對每個系統都存在的 root 帳號進行攻擊。

Step 3: 測試設定並重新載入

在套用設定前,請檢查設定檔是否有誤,以避免因打錯字導致服務失效:

sudo sshd -t

若未輸出任何內容,代表設定檔有效。重新載入 SSH:

sudo systemctl reload ssh

接著檢查 sshd 實際使用的設定,以確認設定沒有被其他檔案覆蓋:

sudo sshd -T | grep -Ei 'passwordauthentication|permitrootlogin'

兩者結果皆應顯示 no。現在,請勿關閉目前的連線,從另一個終端機開啟一個全新的連線。若能使用金鑰成功登入,即表示完成。若發生錯誤,目前的連線仍保持開啟以供修正。這種重疊機制是安全保障,請務必執行。

Step 4: 選用的非標準連接埠

將 SSH 從 port 22 移至 2222 等連接埠並不會在實質上提升安全性,因為有目的的攻擊者會掃描所有連接埠。這樣做的目的是減少日誌雜訊,因為大多數自動化掃描器僅嘗試 22。若有需求,請在 drop-in 檔案中加入 Port 2222,先在防火牆中允許新連接埠,接著執行 sudo systemctl daemon-reload && sudo systemctl restart ssh.socket 並使用 ssh -p 2222 連線。在 Ubuntu 24.04 上,由 ssh.socket 管理監聽連接埠,因此單純執行 reload ssh 會使 sshd 仍維持在 22;必須重啟 socket 才能套用新連接埠。請將此視為整理環境的手段,而非防護手段。

Step 5: 建立額外的防禦層

強化後的 SSH key 是基礎,其上還需建立另外兩層防禦。

Fail2ban 會監控日誌,並封鎖持續失敗的 IP 位址,藉此減少掃描器雜訊並及早驅逐攻擊者。它與僅限金鑰驗證(key-only auth)的機制相得益彰:請參閱 在 Ubuntu 上使用 Fail2ban 阻止 SSH 攻擊

更進一步的做法是完全將 SSH 移出公網。如果你 將 SSH 置於 WireGuard VPN 後方,並將防火牆的 port 22 限制在隧道內,則 VPN 外部的任何人皆無法連線,這讓暴力破解從「變得困難」轉變為「完全不可能」。以上所有設定皆建立在預設拒絕(default-deny)的防火牆基礎之上,請參考 在 VPS 上設定 UFW

SSH 僅是完整檢查清單中的一項:新 VPS 的前 10 分鐘 會按順序列出步驟,而 Ubuntu 的自動安全性更新 則能在後續持續修補系統。

FAQ

如何在 Ubuntu 24.04 停用 SSH 密碼登入?

/etc/ssh/sshd_config.d/00-hardening.conf 建立一個 drop-in 檔案(使用 00 前綴可確保其排序在 50-cloud-init.conf 之前,否則會被 PasswordAuthentication yes 的設定覆蓋,因為 sshd 會採用讀取到的第一個值)。檔案內容須包含 PasswordAuthentication noKbdInteractiveAuthentication no,接著執行 sudo sshd -t 進行檢查,最後執行 sudo systemctl reload ssh。在正式啟用前,請務必開啟新連線以確認金鑰登入正常。修改 drop-in 檔案而非直接編輯 sshd_config,既能避免套件升級時設定被覆蓋,也方便還原。

我應該停用 SSH 的 root 登入嗎?

是的。請設定 PermitRootLogin no 以防止任何人直接以 root 身分登入。請使用一般使用者登入,並透過 sudo 執行管理任務。由於每個 Linux 系統都存在 root 使用者,若保持其可連線狀態,攻擊者便能利用已知的使用者名稱進行攻擊。停用 root 登入後,攻擊者必須知道您的帳號名稱並持有您的金鑰才能入侵。

更改 SSH port 會讓伺服器更安全嗎?

效果有限。將服務移出 port 22 可以避開僅掃描 port 22 的簡易掃描器,這能減少日誌中的雜訊,但真正的攻擊者會掃描所有 port 並找到它。金鑰驗證才是防止入侵的關鍵。若要更改 port,請先在防火牆開啟新 port,然後執行 sudo systemctl daemon-reload && sudo systemctl restart ssh.socket;在 Ubuntu 24.04 中,由 socket 管理監聽程序,僅執行 reload 會讓 sshd 仍留在 port 22。

如果我使用 SSH keys,還需要 Fail2ban 嗎?

這是選配項目,但仍具備價值。在使用金鑰驗證的情況下,暴力破解密碼無法成功,因此 Fail2ban 並非防止攻擊者的主要手段。它的功能是限制單一 IP 的重複失敗次數,這能減少日誌中的掃描雜訊並及早封鎖違規者;然而,緩慢且分散式的攻擊仍會避開其封鎖閾值。建議在金鑰驗證的基礎上執行 Fail2ban,並理想情況下將 SSH 放在 VPN 後方。

如果我被鎖在 SSH 外面該如何復原?

請使用供應商提供的 Web console,它透過不經過 SSH 的 serial 或 VNC 連線存取伺服器。透過該方式登入後,您可以修正 sshd drop-in 檔案並重新載入服務。這正是為什麼在關閉目前的連線前,必須在第二個終端機測試新的 SSH 設定,以及為什麼在停用密碼前應先確保金鑰驗證已運作正常。