從零建立安全的 SSH 登入環境
在伺服器管理與開發工作中,SSH (Secure Shell) 是最常用的遠端連線協定。然而,預設的 SSH 設定往往為了相容性而犧牲了安全性,例如允許密碼登入、使用標準埠號 22,甚至允許 root 直接登入。這些設定會讓伺服器暴露在暴力破解(Brute-force)與資安風險之下。
本文將以 Ubuntu 22.04 或 Debian 12 為基礎,帶領中階使用者逐步建立一個高安全性的 SSH 登入環境。我們將透過停用密碼登入、改用金鑰認證、變更預設埠號以及限制 root 存取等步驟,大幅提升伺服器的防禦能力。
前置準備:建立專屬使用者
在調整 SSH 設定之前,請務必確保你擁有一個具備 sudo 權限的一般使用者帳號。絕對不要直接使用 root 帳號進行後續操作,以免設定錯誤導致無法連線。
假設我們要建立一個名為 devops 的使用者,請執行以下指令:
sudo adduser devops
sudo usermod -aG sudo devops
步驟一:生成 SSH 金鑰對
金鑰認證比密碼認證更安全,因為它抵抗暴力破解攻擊。我們需要在本地端(你的電腦)生成金鑰對,並將公鑰上傳至伺服器。
在本地端終端機執行:
ssh-keygen -t ed25519 -C "your_email@example.com"
建議使用 ed25519 演算法,它比傳統的 RSA 更快速且同樣安全。系統會詢問金鑰儲存位置,直接按下 Enter 使用預設路徑 ~/.ssh/id_ed25519 即可。接著輸入兩次密碼(Passphrase),這將作為金鑰的第二重保護。
步驟二:將公鑰複製到伺服器
使用 ssh-copy-id 指令可以輕鬆將公鑰安裝到伺服器上:
ssh-copy-id devops@<伺服器IP>
輸入該使用者的密碼後,公鑰便會自動寫入伺服器的 ~/.ssh/authorized_keys 檔案中。此時,你應該已經可以不用密碼,直接透過金鑰登入該使用者帳號。
步驟三:強化 SSH 伺服器設定
現在我們來修改 SSH 的配置文件 /etc/ssh/sshd_config。請先備份原始設定,以防萬一:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
使用編輯器開啟設定檔:
sudo nano /etc/ssh/sshd_config
請依照以下建議修改或新增對應的參數:
- 變更預設埠號:避免常見的掃描攻擊。
Port 2222 - 停用 root 直接登入:強制使用者以一般身份登入,再透過
sudo提升權限。PermitRootLogin no - 停用密碼登入:強制使用金鑰認證,這是提升安全性最关键的一步。
PasswordAuthentication no - 啟用金鑰認證:確保相關功能已開啟。
PubkeyAuthentication yes - 限制允許登入的使用者:僅允許特定使用者連線。
AllowUsers devops
修改完成後,儲存並離開編輯器。
步驟四:重新啟動 SSH 服務並測試
在重啟服務前,請務必保持當前連線開啟,並開啟另一個終端視窗進行測試,以免設定錯誤導致斷線。
重新啟動 SSH 服務:
sudo systemctl restart sshd
在新終端視窗中,嘗試使用新埠號與金鑰登入:
ssh -p 2222 devops@<伺服器IP>
如果成功登入且未提示輸入密碼(僅提示金鑰密碼),代表設定成功。若失敗,請檢查 /var/log/auth.log 或 /var/log/secure 中的錯誤訊息。確認無誤後,可將舊的 SSH 埠號 22 關閉或透過防火牆封鎖,僅開放新埠號 2222。
常見問題
Q1:修改設定後無法連線怎麼辦?
請回到原本的連線視窗,檢查 /etc/ssh/sshd_config 是否有語法錯誤。若完全斷線,可透過主控台的 VNC 或 Console 功能登入伺服器,並恢復備份的設定檔:
sudo mv /etc/ssh/sshd_config.bak /etc/ssh/sshd_config
sudo systemctl restart sshd
Q2:金鑰登入失敗,提示 "Permission denied (publickey)"?
最常見的原因是檔案權限問題。請確保伺服器上 ~/.ssh 目錄權限為 700,authorized_keys 檔案權限為 600:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
小結
透過上述步驟,我們成功建立了一個僅允許金鑰認證、限制 root 存取且使用非標準埠號的 SSH 環境。這不僅能有效抵擋絕大多數的自動掃描與暴力破解攻擊,也符合資安合規的基本要求。記住,安全性是一個持續的過程,建議定期更新 SSH 版本並監控登入日誌,以確保伺服器的長期安全。