關閉

Ubuntu 22.04 SSH 安全最佳實務:防止暴力破解與入侵的完整強化指南(2026)

為什麼 Ubuntu 22.04 的 SSH 一定要強化? SSH 是 Linux Server 最重要的遠端管理入口。只要你的 Ubuntu 22.04 主機對外開放 SSH,就很容易被自動化掃描器、殭屍網路、弱密碼字典攻擊與暴力破解工具盯上。

為什麼 Ubuntu 22.04 的 SSH 一定要強化?

SSH 是 Linux Server 最重要的遠端管理入口。只要你的 Ubuntu 22.04 主機對外開放 SSH,就很容易被自動化掃描器、殭屍網路、弱密碼字典攻擊與暴力破解工具盯上。

很多入侵事件不是因為系統太複雜,而是因為 SSH 使用預設連接埠 22、允許 root 登入、允許密碼登入、沒有 Fail2ban、沒有防火牆限制,導致攻擊者只要不斷嘗試帳號密碼,就有機會進入伺服器。

本文會用實戰角度整理 Ubuntu 22.04 SSH 安全最佳實務,從基本檢查、設定檔修改、SSH Key、UFW、Fail2ban 到登入紀錄分析,建立一套比較完整的 SSH 防護流程。

本文會完成哪些內容?

SSH 常見攻擊風險

SSH 的主要風險來自帳號密碼被猜中、弱密碼、root 帳號直接開放、漏洞掃描與暴力破解。攻擊者通常會先掃描 SSH 連接埠 22,確認 SSH 開放後,再嘗試 root、admin、test、ubuntu、user 等常見帳號。

如果伺服器使用弱密碼,又允許密碼登入,攻擊者只要有足夠時間,就可能透過字典攻擊登入成功。因此 SSH 安全強化的核心不是只修改預設連接埠 22,而是要改成 SSH Key 登入、禁止 root、限制使用者、搭配防火牆與 Fail2ban。

Step 1:檢查 SSH 服務狀態

在修改 SSH 設定前,先確認 SSH 服務是否正在運作。Ubuntu 22.04 的 SSH Server 服務名稱通常是 ssh。

sudo systemctl status ssh

如果尚未安裝 OpenSSH Server,可以使用 apt 安裝。

sudo apt update
sudo apt install openssh-server -y

安裝完成後,啟動 SSH 並設定開機自動啟動。

sudo systemctl enable ssh
sudo systemctl start ssh
sudo systemctl status ssh

Step 2:備份 SSH 設定檔

修改 SSH 設定前一定要先備份,避免設定錯誤後無法回復。SSH Server 的主要設定檔是 /etc/ssh/sshd_config。

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%Y%m%d_%H%M%S)

備份完成後再進行修改。正式主機建議保留一個已登入的 SSH 視窗,不要立刻關閉,避免新設定錯誤導致無法重新連線。

Step 3:修改 SSH 預設連接埠

SSH 預設使用 SSH Port 22,這是所有掃描器最先嘗試的目標。修改 SSH 連接埠不能取代真正的安全設定,但可以降低大量低階自動掃描與暴力破解噪音。

修改 SSH 連接埠前,請先確認防火牆會開放新 SSH Port,否則可能會把自己鎖在伺服器外面。

sudo nano /etc/ssh/sshd_config

找到或新增以下設定,例如將 SSH 連接埠改為 2222。

Port 2222

修改 SSH 連接埠後,先不要重啟 SSH,下一步要先開放防火牆。

Step 4:設定 UFW 防火牆允許新的 SSH Port

如果你的 Ubuntu 22.04 使用 UFW,請先允許新的 SSH 連接埠,再重啟 SSH。以下範例允許 2222/tcp。

sudo ufw allow 2222/tcp
sudo ufw status

如果 UFW 尚未啟用,請確認你已允許必要的管理用 SSH 連接埠,再啟用防火牆。

sudo ufw allow 2222/tcp
sudo ufw enable
sudo ufw status verbose

Step 5:禁止 root 直接登入

root 是攻擊者最常嘗試的帳號。正式主機不應該允許 root 直接透過 SSH 登入。正確做法是使用一般帳號登入,再透過 sudo 執行管理指令。

sudo nano /etc/ssh/sshd_config

設定如下:

PermitRootLogin no

Step 6:建立一般管理帳號並加入 sudo

如果目前只有 root 帳號,請先建立一般管理帳號,並加入 sudo 群組。以下以 adminuser 為例,實際使用時請改成你的管理帳號名稱。

sudo adduser adminuser
sudo usermod -aG sudo adminuser

建立完成後,請先用新帳號登入測試,確認 sudo 可以正常使用。

ssh adminuser@your-server-ip -p 2222
sudo whoami

Step 7:啟用 SSH Key 登入

SSH Key 比密碼登入安全很多。建議使用金鑰登入後,再停用密碼登入。這樣就算攻擊者持續暴力破解,也無法透過密碼進入伺服器。

在你的本機電腦產生 SSH Key。

ssh-keygen -t ed25519 -C "adminuser@ubuntu-server"

將公鑰複製到伺服器。

ssh-copy-id -p 2222 adminuser@your-server-ip

如果 Windows 沒有 ssh-copy-id,也可以手動將本機 id_ed25519.pub 的內容加入伺服器的 ~/.ssh/authorized_keys。

Step 8:確認 SSH Key 可以登入

停用密碼登入前,務必先開一個新的終端機視窗測試 SSH Key 是否可以正常登入。不要關閉原本已登入的 SSH 視窗。

ssh -p 2222 adminuser@your-server-ip

登入後確認目前使用者。

whoami
sudo whoami

Step 9:停用 SSH 密碼登入

確認 SSH Key 登入正常後,就可以停用密碼登入。這是 SSH 安全強化中最重要的設定之一。

sudo nano /etc/ssh/sshd_config

設定如下:

PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes

如果你的系統設定檔中仍有 ChallengeResponseAuthentication,也可以設定為 no。

ChallengeResponseAuthentication no

Step 10:限制允許登入的使用者

如果只有少數帳號需要 SSH 登入,可以用 AllowUsers 明確限制允許登入的使用者。這能降低其他帳號被嘗試登入的風險。

AllowUsers adminuser

如果有多個管理者,可以用空白分隔。

AllowUsers adminuser deploy backupadmin

Step 11:檢查 SSH 設定語法

重啟 SSH 前,務必先檢查設定檔語法。這一步很重要,可以避免因為設定檔錯誤導致 SSH 無法啟動。

sudo sshd -t

如果沒有輸出錯誤,代表語法檢查通過。若出現錯誤,請依照錯誤行號修正後再繼續。

Step 12:重新啟動 SSH 服務

語法檢查通過後,重新啟動 SSH 服務。

sudo systemctl restart ssh
sudo systemctl status ssh

重新啟動後,請開新的終端機測試新 SSH 連接埠與 SSH Key 是否可以登入。確認正常前,不要關閉原本的連線。

ssh -p 2222 adminuser@your-server-ip

SSH 服務啟動、停止、重啟與查詢指令

日常維運時,以下是 Ubuntu 22.04 SSH 常用服務管理指令。

sudo systemctl start ssh
sudo systemctl stop ssh
sudo systemctl restart ssh
sudo systemctl reload ssh
sudo systemctl status ssh

如果只是修改部分設定,也可以使用 reload,但涉及 SSH 連接埠或重要安全設定時,建議用 restart 並保留既有連線測試。

Step 13:安裝 Fail2ban 防止 SSH 暴力破解

即使已經改用 SSH Key,仍建議安裝 Fail2ban。Fail2ban 可以監控 /var/log/auth.log,當同一個 IP 短時間內多次登入失敗,就自動封鎖來源 IP。

sudo apt update
sudo apt install fail2ban -y

建立 jail.local。

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

加入或修改 sshd jail。若你已將 SSH 改為 2222,SSH 連接埠也要跟著調整。

[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 300
bantime = 86400

這代表 5 分鐘內失敗 3 次,就封鎖 1 天。正式主機可以依照使用情境調整。

Step 14:啟動 Fail2ban 並查看狀態

sudo systemctl enable fail2ban
sudo systemctl restart fail2ban
sudo systemctl status fail2ban

查看 Fail2ban jail 狀態。

sudo fail2ban-client status
sudo fail2ban-client status sshd

Step 15:查看 SSH 登入失敗紀錄

SSH 登入失敗通常會記錄在 /var/log/auth.log。你可以用 grep 查看最近的失敗登入紀錄。

sudo grep "Failed password" /var/log/auth.log | tail -n 30

常見攻擊紀錄可能像這樣。

Failed password for invalid user admin from 185.143.223.15 port 44512 ssh2
Failed password for root from 45.133.1.22 port 51234 ssh2
Failed password for invalid user test from 91.200.12.33 port 49321 ssh2

Step 16:查看成功登入紀錄

除了失敗登入,也要定期檢查成功登入紀錄,確認是否有可疑來源。

last -a | head -n 20
sudo grep "Accepted" /var/log/auth.log | tail -n 30

如果看到不認識的 IP 或異常登入時間,就應該立刻檢查帳號、SSH Key、sudo 紀錄與系統變更。

Step 17:測試 SSH 安全設定是否生效

完成設定後,至少要測試以下幾件事:新 SSH 連接埠是否可以登入、root 是否無法登入、密碼登入是否被拒絕、SSH Key 是否可以登入、Fail2ban 是否能看到 sshd jail。

# 測試新 Port
ssh -p 2222 adminuser@your-server-ip

# 測試 root 是否被拒絕
ssh -p 2222 root@your-server-ip

# 測試 Fail2ban 狀態
sudo fail2ban-client status sshd

# 測試 SSH 設定語法
sudo sshd -t

建議的 sshd_config 安全設定範例

以下是一份較安全的 Ubuntu 22.04 SSH 設定範例。請依照你的環境修改 SSH 連接埠、AllowUsers 與其他設定。

Port 2222
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
X11Forwarding no
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers adminuser

常見故障排除

問題 1:修改 SSH 連接埠後無法連線

最常見原因是防火牆沒有開放新 SSH 連接埠、雲端安全群組沒有放行,或連線時忘記指定 -p 參數。

sudo ufw status
sudo ss -tulpn | grep ssh
ssh -p 2222 adminuser@your-server-ip

問題 2:重啟 SSH 失敗

通常是 sshd_config 語法錯誤。請先用 sshd -t 檢查設定。

sudo sshd -t
sudo systemctl status ssh
sudo journalctl -xeu ssh

問題 3:SSH Key 無法登入

請檢查 authorized_keys 權限、.ssh 目錄權限、使用者是否正確,以及本機是否使用正確私鑰。

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
ssh -i ~/.ssh/id_ed25519 -p 2222 adminuser@your-server-ip

問題 4:停用密碼登入後被鎖在外面

如果 SSH Key 尚未設定成功就停用密碼登入,可能會無法連線。這時需要透過雲端主控台、VNC、實體 Console 或救援模式登入,恢復 sshd_config。

sudo cp /etc/ssh/sshd_config.bak.YYYYMMDD_HHMMSS /etc/ssh/sshd_config
sudo systemctl restart ssh

問題 5:Fail2ban 沒有封鎖 SSH 攻擊

請確認 sshd jail 已啟用、logpath 正確、SSH 連接埠設定正確,以及失敗次數是否達到 maxretry。

sudo fail2ban-client status
sudo fail2ban-client status sshd
sudo tail -n 50 /var/log/fail2ban.log
sudo tail -n 50 /var/log/auth.log

2026 年 SSH 安全最佳實務整理

進階強化:只允許固定 IP 登入 SSH

如果你的管理來源 IP 固定,最安全的方式之一是只允許特定 IP 連入 SSH。這可以透過 UFW 或上層防火牆完成。以下範例只允許 203.0.113.10 連線到 2222。203.0.113.10 是文件示範 IP,請替換成實際固定公網 IP。若管理端使用浮動 IP,請勿直接套用,否則可能失去 SSH 連線。

sudo ufw allow from 203.0.113.10 to any port 2222 proto tcp
sudo ufw deny 2222/tcp
sudo ufw status numbered

如果你使用 VPN 管理伺服器,也可以只允許 VPN 網段連入 SSH,公開網路則完全不開放 SSH。

進階強化:SSH 搭配 GateKeeper 或安全監控

SSH 安全不應該只看 sshd_config。實務上還可以把 SSH 登入失敗、成功登入、異常來源 IP、國家來源、Fail2ban 封鎖紀錄整合到安全監控系統。

如果你的網站或伺服器已有 GateKeeper 類似的安全系統,可以將 SSH 登入事件、Fail2ban 封鎖事件與 Web 攻擊紀錄一起分析,建立更完整的主機風險判斷。

Internet
   ↓
UFW / Firewall:限制 SSH Port 與來源 IP
   ↓
OpenSSH:SSH Key、禁止 root、停用密碼
   ↓
Fail2ban:封鎖暴力破解 IP
   ↓
Log Monitor:分析 auth.log / fail2ban.log
   ↓
GateKeeper / Dashboard:整合攻擊來源與風險事件

Q&A 常見問題

Q1:只修改 SSH 連接埠就安全了嗎?

不夠。修改 SSH 連接埠只能降低低階掃描噪音,不能真正防止入侵。真正重要的是禁止 root 登入、使用 SSH Key、停用密碼登入、限制使用者、設定防火牆與 Fail2ban。

Q2:SSH Key 一定比密碼安全嗎?

一般情況下是。SSH Key 不容易被暴力破解,尤其使用 ed25519 或高強度金鑰時,比傳統密碼安全許多。不過私鑰也必須妥善保管,建議加上 passphrase。

Q3:停用密碼登入前要注意什麼?

一定要先確認 SSH Key 可以成功登入,並且保留一個已登入的 SSH 視窗。確認新連線可以登入後,再關閉舊連線。

Q4:Fail2ban 還需要裝嗎?如果已經停用密碼登入?

建議仍然安裝。即使停用密碼登入,Fail2ban 仍能降低惡意登入嘗試、掃描噪音與 log 壓力,也能讓你掌握有哪些來源正在攻擊 SSH。

Q5:Ubuntu 22.04 的 SSH 設定檔是哪一個?

SSH Server 的主要設定檔是 /etc/ssh/sshd_config。注意 sshd_config 是伺服器設定,ssh_config 則是 SSH Client 設定,不要改錯檔案。

Q6:如何知道有沒有人嘗試暴力破解?

可以查看 /var/log/auth.log 中的 Failed password、Invalid user 等紀錄,也可以使用 fail2ban-client status sshd 查看目前被封鎖的 IP。

sudo grep "Failed password" /var/log/auth.log | tail -n 30
sudo fail2ban-client status sshd

總結

Ubuntu 22.04 SSH 安全強化的核心不是單一設定,而是一整套防護流程。只修改 SSH 連接埠不夠,只安裝 Fail2ban 也不夠。真正有效的做法是使用 SSH Key、停用密碼登入、禁止 root 登入、限制允許登入的使用者、設定 UFW 防火牆,並搭配 Fail2ban 封鎖暴力破解來源。

修改 SSH 設定時,最重要的是不要把自己鎖在伺服器外面。每次修改前都要備份 sshd_config,修改後先執行 sshd -t 檢查語法,重啟服務後用新的終端機測試登入,確認成功後再關閉舊連線。