前言
SSH(Secure Shell)是現代 Linux 系統管理中不可或缺的遠端連線工具。它提供了加密的通訊通道,讓系統管理員能夠安全地遠端存取和管理伺服器。相較於傳統的 Telnet 等明文傳輸協定,SSH 具備以下優勢:
- 加密傳輸:所有通訊內容都經過加密,防止中間人攻擊和竊聽
- 身份驗證:支援密碼驗證和更安全的公鑰驗證機制
- 完整性校驗:確保傳輸的資料未被篡改
- 通道轉發:支援 Port Forwarding 和 X11 轉發等進階功能
在 Ubuntu 22.04 LTS 上建置 SSH 伺服器是許多管理任務的第一步。本文將詳細介紹從安裝到安全強化的完整流程。
安裝 OpenSSH Server
OpenSSH 是最廣泛使用的 SSH 實作,Ubuntu 官方套件庫提供了穩定且持續更新的版本。
步驟說明
更新套件清單並安裝 OpenSSH Server:
1 2sudo apt update sudo apt install openssh-server -y設定 SSH 服務開機自動啟動:
1sudo systemctl enable ssh啟動 SSH 服務:
1sudo systemctl start ssh確認服務狀態:
1sudo systemctl status ssh如果看到
Active: active (running)表示服務已正常運作。確認 SSH 正在監聽的連接埠:
1sudo ss -tlnp | grep ssh預設應該會看到監聽在
0.0.0.0:22和[::]:22。
允許防火牆
Ubuntu 22.04 預設使用 UFW(Uncomplicated Firewall)作為防火牆管理工具。必須開放 SSH 連接埠才能讓外部連線進入。
允許 SSH 連線通過防火牆:
1sudo ufw allow ssh這會開放 TCP 22 連接埠。如果您使用自訂連接埠(例如 2222),請改用:
1sudo ufw allow 2222/tcp啟用防火牆:
1sudo ufw enable確認防火牆規則:
1sudo ufw status verbose
此時已能使用密碼登入
SSH 設定檔重要參數說明
SSH 伺服器的主要設定檔位於 /etc/ssh/sshd_config。以下是一些重要參數的說明:
| |
常用參數
| 參數 | 預設值 | 說明 |
|---|---|---|
Port | 22 | SSH 服務監聽的連接埠 |
PermitRootLogin | prohibit-password | 是否允許 root 登入 |
PasswordAuthentication | yes | 是否允許密碼驗證 |
PubkeyAuthentication | yes | 是否允許公鑰驗證 |
MaxAuthTries | 6 | 最大驗證嘗試次數 |
MaxSessions | 10 | 每個連線允許的最大 session 數 |
ClientAliveInterval | 0 | 客戶端存活檢查間隔(秒) |
ClientAliveCountMax | 3 | 客戶端存活檢查最大次數 |
LoginGraceTime | 120 | 登入寬限時間(秒) |
AllowUsers | 無 | 允許登入的使用者清單 |
DenyUsers | 無 | 禁止登入的使用者清單 |
設定範例
| |
修改設定後,務必重新載入設定:
| |
RSA 金鑰認證
使用金鑰認證比密碼驗證更安全,因為金鑰難以被暴力破解。
Client 端
建立存放金鑰的目錄:
1 2mkdir -p $HOME/.ssh chmod 0700 $HOME/.ssh產生 RSA 金鑰對:
1ssh-keygen -t rsa -b 4096 -C "my key for ubuntu server"-t rsa:指定金鑰類型為 RSA-b 4096:指定金鑰長度為 4096 位元-C:添加註解,方便識別金鑰用途
按
Enter使用預設路徑,或輸入自訂路徑設定金鑰密碼(passphrase),可留空但建議設定
將公鑰傳送到 SSH Server:
1ssh-copy-id -i ~/.ssh/id_rsa.pub <username>@<server-ip>
Server 端
編輯 SSH 設定檔:
1sudo nano /etc/ssh/sshd_config找到並修改以下參數:
1 2PubkeyAuthentication yes PasswordAuthentication no重新啟動 SSH 服務:
1sudo systemctl restart ssh
Ed25519 金鑰(推薦)
Ed25519 是一種基於橢圓曲線的現代加密演算法,相較於 RSA 具有以下優勢:
- 更短的金鑰長度:Ed25519 金鑰只有 256 位元,但安全性等同於 RSA 3072 位元
- 更快的運算速度:簽章和驗證速度都比 RSA 快
- 更安全:設計上避免了許多已知的密碼學弱點
- 抗側信道攻擊:對時序攻擊等側信道攻擊有更好的抵抗力
產生 Ed25519 金鑰
| |
產生的金鑰會存放在:
- 私鑰:
~/.ssh/id_ed25519 - 公鑰:
~/.ssh/id_ed25519.pub
傳送公鑰到伺服器
| |
使用 Ed25519 金鑰連線
| |
建議:對於新的部署,優先選擇 Ed25519 金鑰。除非需要與舊系統相容,否則不建議使用 RSA。
SSH 安全強化建議
為了保護您的伺服器免受未授權存取,以下是一些重要的安全強化措施:
1. 禁用 root 直接登入
| |
| |
2. 限制可登入的使用者
只允許特定使用者透過 SSH 登入:
| |
或使用群組限制:
| |
3. 變更預設連接埠
將 SSH 連接埠改為非標準埠可以減少自動化攻擊:
| |
記得更新防火牆規則:
| |
4. 限制登入嘗試次數
| |
5. 設定閒置超時
| |
6. 停用空密碼登入
| |
7. 停用 X11 轉發(如不需要)
| |
8. 使用強加密演算法
在 /etc/ssh/sshd_config 中指定允許的演算法:
| |
完整安全設定範例
| |
套用設定:
| |
使用 fail2ban 防護
fail2ban 是一個入侵防護工具,可以自動封鎖多次登入失敗的 IP 位址。
安裝 fail2ban
| |
建立本地設定檔
| |
設定 SSH 保護
在 jail.local 中找到 [sshd] 區段並修改:
| |
參數說明:
maxretry:允許的最大失敗次數findtime:在此時間內(秒)超過 maxretry 次失敗則封鎖bantime:封鎖時間(秒),設為 -1 為永久封鎖
啟動 fail2ban
| |
查看封鎖狀態
| |
SSH 連線除錯技巧
當 SSH 連線出現問題時,以下技巧可以幫助您診斷問題:
1. 啟用詳細輸出模式
在客戶端使用 -v 參數查看詳細連線過程:
| |
2. 檢查伺服器日誌
| |
3. 測試 SSH 設定檔語法
| |
如果有語法錯誤會顯示錯誤訊息。
4. 檢查 SSH 服務狀態
| |
5. 確認連接埠開放
| |
6. 檢查防火牆規則
| |
7. 權限問題檢查
SSH 對檔案權限有嚴格要求:
| |
修正權限:
| |
8. 常見錯誤及解決方案
| 錯誤訊息 | 可能原因 | 解決方案 |
|---|---|---|
Connection refused | SSH 服務未運行或防火牆阻擋 | 檢查服務狀態和防火牆規則 |
Permission denied (publickey) | 金鑰驗證失敗 | 檢查金鑰權限和 authorized_keys |
Host key verification failed | 伺服器金鑰變更 | 移除 known_hosts 中的舊記錄 |
Connection timed out | 網路問題或防火牆阻擋 | 檢查網路連線和防火牆 |
Too many authentication failures | 嘗試過多金鑰 | 使用 -i 指定正確金鑰 |
後記:轉移金鑰
當您需要在不同機器間轉移 SSH 金鑰時:
複製私鑰檔案
~/.ssh/id_rsa(或id_ed25519)重要:確保檔案結尾有換行符號
- 用文字編輯器開啟檔案
- 確認最後一行有按
Enter(換行符號) - 儲存檔案
- 如果缺少換行符號,可能會出現
invalid format錯誤
設定正確的權限:
1chmod 600 ~/.ssh/id_rsa使用金鑰連線:
1ssh -i ~/.ssh/id_rsa ubuntu@192.168.1.102
結語
建置安全的 SSH 伺服器需要注意多個層面,從基本的安裝設定到進階的安全強化。本文涵蓋了:
- OpenSSH Server 的安裝與設定
- 防火牆規則設定
- RSA 和 Ed25519 金鑰認證
- 重要的安全強化措施
- fail2ban 入侵防護
- 連線問題除錯技巧
建議您根據實際需求調整設定,並定期檢查日誌以確保系統安全。記住,安全是一個持續的過程,需要定期更新系統並關注最新的安全建議。