🐧 Linux SSH 安全強化指南:金鑰登入、Port 轉移與 Fail2Ban 整合
只要一台 Linux 伺服器對外開放 SSH,幾乎可以保證: 不到幾分鐘,log 裡就會開始出現來自世界各地的暴力破解嘗試。 攻擊者不一定鎖定你,但「掃描 22 port、亂試帳號密碼」早已是背景噪音。
本篇以實務角度,整理一套 可複製的 SSH 安全基準(Baseline), 主要目標包括:
- 改用 SSH 金鑰登入,降低密碼被猜中的風險。
- 調整 Port、允許帳號、來源 IP,減少被掃描與誤用。
- 透過 Fail2Ban 自動封鎖暴力破解 IP。
- 搭配 sshd_config 的各種細節,形塑一套可重複套用的安全配置。
一、基本觀念:SSH、sshd 與設定檔位置
先釐清幾個名詞:
- SSH Client(ssh):你用來連線到伺服器的程式。
- SSH Server(sshd):伺服器端守護程式,負責接受連線。
- OpenSSH:最常見的 SSH 實作,大部分 Linux 發行版預設採用。
常見設定檔位置:
/etc/ssh/sshd_config:伺服器端(sshd)的主設定檔。~/.ssh/:各使用者本機的 SSH 設定與金鑰。~/.ssh/authorized_keys:伺服器端記錄「允許登入的公鑰」。
修改 sshd_config 後,記得:
sudo sshd -t # 檢查設定檔語法
sudo systemctl reload sshd # 或 ssh,依發行版服務名稱
在遠端改設定時,務必保留舊連線視窗不要關閉,先開第二個 SSH 測試新設定,確認可用再退出舊連線。
二、SSH 金鑰登入:從密碼到公鑰驗證
SSH 金鑰登入利用「非對稱加密」:
- 本機保存私鑰(
id_ed25519、id_rsa)。 - 伺服器保存公鑰(
authorized_keys)。 - 登入時伺服器用公鑰驗證你是否擁有對應的私鑰,而不傳輸密碼。
1. 在本機產生 SSH 金鑰
建議使用 ed25519 演算法(較新且金鑰短)。
# 在本機(不是伺服器)執行:
ssh-keygen -t ed25519 -C "你的註解(例如 email)"
若系統不支援 ed25519,也可以使用 rsa:
ssh-keygen -t rsa -b 4096 -C "你的註解"
指令執行後會問你:
- 要將金鑰存在哪裡(預設
~/.ssh/id_ed25519)。 - 是否設定 passphrase(建議設定,等於給私鑰再上一層鎖)。
完成後,本機會得到:
~/.ssh/id_ed25519:私鑰(請妥善保護,絕不外流)。~/.ssh/id_ed25519.pub:公鑰(可放心放到伺服器)。
三、將公鑰部署到伺服器:ssh-copy-id 或手動設定
1. 使用 ssh-copy-id(最方便)
若目前伺服器仍允許密碼登入,可以在本機直接執行:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server-ip
這會:
- 以目前的密碼登入伺服器。
- 自動把公鑰附加到
~user/.ssh/authorized_keys。 - 調整正確的檔案權限。
2. 手動設定 authorized_keys
若沒有 ssh-copy-id,可改用手動方式:
- 在本機檢視公鑰內容:
cat ~/.ssh/id_ed25519.pub
- 登入伺服器,假設帳號為
user:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 在 authorized_keys 中貼上剛剛的公鑰一整行
nano ~/.ssh/authorized_keys # 或 vi / vim
chmod 600 ~/.ssh/authorized_keys
權限非常重要,錯誤權限會導致 SSH 拒絕使用金鑰登入。
四、調整 sshd_config:啟用金鑰登入、準備關閉密碼登入
編輯伺服器上的 /etc/ssh/sshd_config:
sudo nano /etc/ssh/sshd_config
確認或加入以下設定(將註解 # 拿掉):
# 啟用公鑰驗證
PubkeyAuthentication yes
# 確認有讀取 authorized_keys
AuthorizedKeysFile .ssh/authorized_keys
# 暫時保留密碼登入,等測試金鑰沒問題再關
PasswordAuthentication yes
ChallengeResponseAuthentication no
# 僅允許 protocol 2(新版本預設即為 2)
Protocol 2
重新載入設定:
sudo sshd -t
sudo systemctl reload sshd
接著在本機試著用金鑰登入:
ssh -i ~/.ssh/id_ed25519 user@server-ip
若不再要求輸入帳號密碼,而是直接連上(或只問你私鑰的 passphrase),就代表金鑰登入已成功。
確認無問題後關閉密碼登入
再次編輯 sshd_config:
PasswordAuthentication no
KbdInteractiveAuthentication no
ChallengeResponseAuthentication no
然後重新載入 sshd,並用新的終端機視窗測試連線。如果一切正常,之後就只能透過金鑰登入,大幅降低暴力破解成功的機會。
五、Port 轉移與帳號限制:降低被掃描與誤用風險
改 Port 並不是「真正的防禦」,但能有效降低掃描噪音; 搭配「只允許特定帳號 / 群組登入」,會是實務上很常見的一層防護。
1. 調整 SSH Port
在 sshd_config 中:
# 預設是 22,可改為 2222 之類的非知名 Port
Port 2222
記得同步更新防火牆設定,例如使用 firewalld:
# 加入新 port
sudo firewall-cmd --permanent --add-port=2222/tcp
# 若已確認不再使用 22 也可關閉
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
重新載入 sshd 前,務必先確認防火牆已放行新 port,避免把自己關在門外。
2. 限制可登入帳號與群組
在 sshd_config 中加入:
# 僅允許特定帳號登入
AllowUsers wwfandy devuser
# 或是允許特定群組
AllowGroups sshusers
搭配群組管理,可以將「有 SSH 登入權的使用者」集中到一個群組中,方便控管與稽核。
3. 禁止 root 直接登入
PermitRootLogin no
建議做法:
- 建立一個一般帳號(例如 admin 或你的名字),授予 sudo 權限。
- 平時以一般帳號登入,必要時用
sudo執行管理操作。
六、整合 Fail2Ban:自動封鎖暴力破解 IP
即使關掉密碼登入,仍然會有程式不斷嘗試連線、耗費資源或塞滿 log。 Fail2Ban 可以監控 log 中的異常登入行為,達到一定次數就自動用防火牆封鎖該 IP。
1. 安裝 Fail2Ban
Debian / Ubuntu:
sudo apt update
sudo apt install -y fail2ban
RHEL / CentOS / Rocky / AlmaLinux:
sudo dnf install -y fail2ban
啟動 Fail2Ban:
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
七、設定 Fail2Ban 監控 SSH
官方預設設定放在 /etc/fail2ban/jail.conf,
建議不要直接修改,而是在 /etc/fail2ban/jail.local 中覆蓋或新增設定。
1. 建立 jail.local 並啟用 sshd jail
sudo nano /etc/fail2ban/jail.local
加入以下範例:
[DEFAULT]
# 信任的 IP(永不封鎖),可加入自己公司或管理端 IP
ignoreip = 127.0.0.1/8 ::1
# 封鎖時間(秒),例如 30 分鐘
bantime = 1800
# 在 findtime 秒內失敗達 maxretry 次就封鎖
findtime = 600
maxretry = 5
[sshd]
enabled = true
port = 2222 # 若你改過 SSH Port,記得同步修改
logpath = /var/log/auth.log ; Debian/Ubuntu
# logpath = /var/log/secure ; RHEL/CentOS
backend = systemd
儲存後重新啟動 Fail2Ban:
sudo systemctl restart fail2ban
2. 查詢 Fail2Ban 狀態與封鎖 IP
# 查看所有 jail
sudo fail2ban-client status
# 查看 sshd jail 詳細狀態
sudo fail2ban-client status sshd
輸出中可以看到目前被封鎖的 IP 清單。
3. 手動解除封鎖某 IP
sudo fail2ban-client set sshd unbanip 1.2.3.4
如果誤封到合法管理端 IP,可以用這個方式解除。
八、更多 sshd_config 安全相關參數建議
除了 Port 與登入方式,還有一些細節可以進一步強化安全性:
1. 降低暴力破解效率
# 使用者有多少時間可以輸入密碼(關閉密碼登入後仍影響金鑰失敗)
LoginGraceTime 30
# 單一連線允許的認證嘗試數
MaxAuthTries 3
# 每個連線的最大同時 session 數
MaxSessions 3
2. 控制閒置連線
# 每 60 秒對 client 發送 keepalive 檢查
ClientAliveInterval 60
# 若連續 5 次沒有收到回應就斷線
ClientAliveCountMax 5
可以避免「掛著不動」多小時卻忘記關閉的連線。
3. 關閉不需要的轉發功能
# 若不需要 X11 轉發,建議關閉
X11Forwarding no
# 若不需要 TCP Forwarding,可視情況關閉或改用 more strict 設定
AllowTcpForwarding no
# 若不提供 SFTP,亦可關閉相關子系統(依實際需求調整)
# Subsystem sftp /usr/lib/openssh/sftp-server
原則是:沒在用的功能,就不要開著。
九、Log 與稽核:掌握 SSH 活動紀錄
SSH 相關的 log 位置通常在:
- Debian / Ubuntu:
/var/log/auth.log - RHEL / CentOS:
/var/log/secure
常用檢查方式:
# 看最近登入失敗紀錄
sudo grep "Failed password" /var/log/auth.log | tail -n 20
# 看登入成功紀錄
sudo grep "Accepted" /var/log/auth.log | tail -n 20
# 持續即時監控(搭配 sshd 關鍵字)
sudo tail -f /var/log/auth.log | grep sshd
若有導入集中式日誌系統(例如 Loki + Grafana、ELK Stack),可以把 SSH log 納入統一監控, 更容易發現「奇怪時間點、奇怪來源」的登入行為。
十、整理:一套可重複套用的 SSH 安全基準
把本文內容整理成一套「上線新主機時必做清單」:
- 在管理端本機產生 SSH 金鑰(ed25519 或 RSA 4096)。
- 將公鑰部署至伺服器的
authorized_keys,並確認金鑰登入正常。 - 在
sshd_config啟用PubkeyAuthentication,準備關閉密碼登入。 - 在確認金鑰登入穩定之後,將
PasswordAuthentication改為 no。 - 修改 SSH Port(例如 2222),並同步更新防火牆規則。
- 設定
PermitRootLogin no,建立一般管理帳號 + sudo 權限。 - 使用
AllowUsers/AllowGroups限定可登入帳號或群組。 - 安裝並設定 Fail2Ban,啟用 sshd jail,自動封鎖暴力破解來源。
- 調整 LoginGraceTime、MaxAuthTries、ClientAliveInterval 等細節。
- 建立固定的 log 檢視與稽核流程(搭配集中式日誌更佳)。
✅ 當這套 SSH 安全基準成為你或團隊的「標準流程」,每一台新上線的 Linux 伺服器就能在 一致的安全水準 下運作。之後若再搭配防火牆規則、IDS/IPS、VPN 與跳板機, 就能逐步建構出更完整的伺服器安全架構。
沒有留言: