本文將介紹如何在 Ubuntu 22.04 上設定 SSH 金鑰認證,並透過多項安全加固措施來保護您的伺服器免受未授權存取。
金鑰認證設定
在客戶端產生金鑰對
建立 SSH 目錄並設定權限
1 2mkdir -p ~/.ssh chmod 700 ~/.ssh產生 ED25519 金鑰(推薦,比 RSA 更安全且效能更好)
1ssh-keygen -t ed25519 -C "your_email@example.com"或者使用 4096 位元的 RSA 金鑰
1ssh-keygen -t rsa -b 4096 -C "your_email@example.com"將公鑰複製到伺服器
1ssh-copy-id -i ~/.ssh/id_ed25519.pub username@server_ip
在伺服器端設定
確認公鑰已正確新增至
~/.ssh/authorized_keys1cat ~/.ssh/authorized_keys設定正確的檔案權限
1 2chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
停用密碼登入
確認金鑰認證正常運作後,停用密碼登入可大幅提升安全性。
編輯 SSH 設定檔
1sudo nano /etc/ssh/sshd_config修改或新增以下設定
1 2 3 4 5 6 7 8 9 10 11 12 13 14# 停用密碼認證 PasswordAuthentication no # 停用空密碼 PermitEmptyPasswords no # 停用挑戰回應認證 ChallengeResponseAuthentication no # 啟用公鑰認證 PubkeyAuthentication yes # 停用 root 直接登入 PermitRootLogin no檢查設定檔語法是否正確
1sudo sshd -t重新啟動 SSH 服務
1sudo systemctl restart ssh
更改預設埠
將 SSH 從預設的 22 埠改為其他埠號,可以減少自動化掃描攻擊。
編輯 SSH 設定檔
1sudo nano /etc/ssh/sshd_config修改埠號(例如改為 2222)
1Port 2222更新防火牆規則
1 2 3 4 5# 允許新埠號 sudo ufw allow 2222/tcp # 移除舊的 SSH 規則(在確認新埠可用後) sudo ufw delete allow ssh重新啟動 SSH 服務
1sudo systemctl restart ssh測試新埠連線(開啟新終端機測試,不要關閉現有連線)
1ssh -p 2222 username@server_ip
Fail2ban 整合
Fail2ban 可以自動封鎖多次登入失敗的 IP 位址。
安裝 Fail2ban
| |
設定 Fail2ban
建立本地設定檔
1sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local編輯設定檔
1sudo nano /etc/fail2ban/jail.local在
[sshd]區段加入以下設定1 2 3 4 5 6 7 8[sshd] enabled = true port = 2222 filter = sshd logpath = /var/log/auth.log maxretry = 3 findtime = 300 bantime = 3600maxretry: 最大嘗試次數findtime: 計算嘗試次數的時間範圍(秒)bantime: 封鎖時間(秒),設為 -1 表示永久封鎖
啟動並設定開機自動啟動
1 2sudo systemctl enable fail2ban sudo systemctl start fail2ban檢查狀態
1sudo fail2ban-client status sshd
管理被封鎖的 IP
| |
其他安全建議
限制可登入的使用者
在 /etc/ssh/sshd_config 中加入
| |
設定連線逾時
| |
停用不安全的功能
| |
使用更強的加密演算法
| |
啟用雙因素認證(選用)
可以整合 Google Authenticator 實現雙因素認證
| |
定期檢查登入日誌
| |
完整的安全設定範例
以下是一份完整的 /etc/ssh/sshd_config 安全設定範例
| |
結語
透過以上設定,您的 SSH 服務將具備更高的安全性。請記住:
- 一定要在設定完成後保持一個 SSH 連線測試新設定
- 定期更新系統和 SSH 套件
- 定期檢查日誌檔案
- 備份您的私鑰並妥善保管
- 考慮使用 SSH 跳板機(Jump Host)來進一步保護內部伺服器