新
| | |
SSH 金鑰安全登入設定指南
第一步:在本機電腦產生 SSH 金鑰對
此步驟需在您的個人電腦(客戶端)上執行,用於建立一對憑證:私鑰(Private Key) 與 公鑰(Public Key)。
- 開啟本機電腦的終端機(Terminal)。
- 執行以下指令產生金鑰。建議使用
ed25519演算法,安全性更高且效能更佳。
# 將 your_email@example.com 替換為您的電子郵件或其他識別資訊
ssh-keygen -t ed25519 -C "your_email@example.com"
- 根據提示進行操作:
- 儲存位置:直接按下 Enter,使用預設路徑(
~/.ssh/id_ed25519)。 - 密碼短語(Passphrase):強烈建議設定。這相當於為您的私鑰增加額外保護,即使私鑰檔案外洩,沒有密碼短語也無法使用。
- 儲存位置:直接按下 Enter,使用預設路徑(
完成後,~/.ssh/ 目錄中會產生以下兩個檔案:
id_ed25519:私鑰,請妥善保管,切勿外洩。id_ed25519.pub:公鑰,可安全分享並部署至伺服器。
第二步:將公鑰部署至伺服器
此步驟會將您的「鎖」(公鑰)安裝到目標伺服器上。
建議方式:使用 ssh-copy-id
這是最簡單且不容易出錯的方法。請在您的本機電腦上執行:
# 建立使用者帳號
adduser user
passwd user
# 將 user 替換為伺服器使用者名稱
# 將 your_server_ip 替換為伺服器 IP 位址
ssh-copy-id user@your_server_ip
輸入一次伺服器密碼後,系統會自動完成以下操作:
- 建立
~/.ssh目錄及authorized_keys檔案。 - 將您的公鑰新增至
authorized_keys。 - 設定正確的目錄與檔案權限。
備用方式:手動安裝公鑰
若系統未安裝 ssh-copy-id,可透過以下方式手動設定。
1. 在本機電腦複製公鑰內容
# macOS
pbcopy < ~/.ssh/id_ed25519.pub
# Linux(需安裝 xclip)
# xclip -selection clipboard < ~/.ssh/id_ed25519.pub
2. 使用密碼登入伺服器
3. 在伺服器上安裝公鑰
# 建立 SSH 目錄並設定權限
mkdir -p ~/.ssh && chmod 700 ~/.ssh
# 將公鑰加入 authorized_keys
echo "在此貼上您的公鑰內容" >> ~/.ssh/authorized_keys
# 設定正確權限
chmod 600 ~/.ssh/authorized_keys
第三步:測試 SSH 金鑰登入
回到您的本機電腦,再次嘗試登入伺服器:
ssh user@your_server_ip
若設定正確:
- 系統會要求輸入 SSH 金鑰密碼短語(Passphrase)(若有設定),或
- 直接登入成功,不再需要輸入伺服器帳號密碼。
第四步:安全性強化(停用密碼登入)
請務必確認 SSH 金鑰登入可正常使用後,再執行此步驟。
- 登入您的伺服器。
- 編輯 SSH 設定檔:
sudo nano /etc/ssh/sshd_config
# 或使用 vim
sudo vim /etc/ssh/sshd_config
- 找到並修改以下設定(若前方有
#請移除):
# 停用密碼登入
PasswordAuthentication no
# 建議:禁止 root 帳號直接登入
PermitRootLogin no
# 確保公鑰驗證已啟用
PubkeyAuthentication yes
- 儲存檔案並重新啟動 SSH 服務:
sudo systemctl restart sshd
完成後,您的伺服器將僅允許 SSH 金鑰登入,大幅提升系統安全性。
附錄:SSH 安全強化自動化腳本
以下腳本可自動完成「第四步:安全性強化」中的所有設定。
警告
執行此腳本前,請務必確認 SSH 金鑰登入已經設定完成且測試成功,否則您可能會被鎖定在伺服器之外,無法再次登入。
將以下內容儲存為 Shell 腳本(例如 secure_ssh.sh),並賦予執行權限:
chmod +x secure_ssh.sh
之後使用 Root 權限執行:
sudo ./secure_ssh.sh
#!/bin/bash
#
# SSH 安全強化自動化腳本
#
# 功能:
# 1. 停用密碼登入
# 2. 禁止 Root 遠端登入
# 3. 確保公鑰驗證已啟用
# 4. 重新啟動 SSH 服務
#
# 檢查是否以 Root 身份執行
if [ "$EUID" -ne 0 ]; then
echo "❌ 錯誤:請使用 Root 權限執行此腳本。"
exit 1
fi
# 最終警告
echo "================================================================="
echo "⚠️ 警告:此腳本將停用 SSH 密碼登入,並禁止 Root 遠端登入。"
echo "請確認 SSH 金鑰登入已完成設定並測試成功。"
echo "================================================================="
echo "5 秒後開始執行,按 Ctrl+C 可取消..."
sleep 5
echo "開始執行安全強化設定..."
SSHD_CONFIG="/etc/ssh/sshd_config"
# 建立備份
cp "$SSHD_CONFIG" "${SSHD_CONFIG}.bak_$(date +%F)"
echo "✅ 已建立備份:${SSHD_CONFIG}.bak_$(date +%F)"
# 修改 SSH 設定
sed -i -r 's/^#?PasswordAuthentication\s+.*/PasswordAuthentication no/' "$SSHD_CONFIG"
sed -i -r 's/^#?PermitRootLogin\s+.*/PermitRootLogin no/' "$SSHD_CONFIG"
sed -i -r 's/^#?PubkeyAuthentication\s+.*/PubkeyAuthentication yes/' "$SSHD_CONFIG"
echo "✅ sshd_config 已更新"
echo " - PasswordAuthentication = no"
echo " - PermitRootLogin = no"
echo " - PubkeyAuthentication = yes"
# 重新啟動 SSH
echo "正在重新啟動 SSH 服務..."
systemctl restart sshd
# 檢查服務狀態
if systemctl is-active --quiet sshd; then
echo "✅ SSH 服務已成功重新啟動,新設定已生效!"
else
echo "❌ 錯誤:SSH 服務重新啟動失敗!"
echo "請執行以下指令檢查:"
echo "systemctl status sshd"
echo ""
echo "如有需要,可使用以下備份檔進行還原:"
echo "${SSHD_CONFIG}.bak_$(date +%F)"
fi