ESC

開始輸入,可搜尋發票、服務、域名、工單,以及 更多...

搜尋... Ctrl+K
Linux 伺服器

Linux 配置 SSH 金鑰登入並停用密碼登入(ed25519 免密登入教程)

6 個步驟 7 分鐘閱讀 1090 次閱讀 49
本文目錄

與密碼相比,SSH 金鑰幾乎無法被暴力破解,配合停用密碼登入可以大幅提升伺服器安全性,同時還能實現免密登入。本文介紹 Linux 配置 SSH 金鑰登入的完整流程:在本地用 ssh-keygen 生成 ed25519 金鑰,把公鑰上傳到伺服器,設定 authorized_keys 許可權,驗證成功後再停用密碼登入。伺服器端適用於 Debian/Ubuntu 與 CentOS/Rocky/AlmaLinux,本地支援 Windows、macOS 與 Linux。

步驟 1:使用 ssh-keygen 生成 ed25519 金鑰

在你自己的電腦上(不是伺服器)執行以下命令。ed25519 金鑰短小、安全、速度快,是目前推薦的演算法。生成時可以設定金鑰口令(passphrase),即使私鑰檔案洩露也無法直接使用;直接回車則不設口令。

# Works in macOS/Linux terminals and Windows PowerShell
ssh-keygen -t ed25519 -C "me@my-laptop"

# Result:
#   ~/.ssh/id_ed25519       private key - never share it
#   ~/.ssh/id_ed25519.pub   public key  - goes to the server
私鑰 id_ed25519 相當於伺服器的鑰匙,絕不能發給任何人或上傳到伺服器、網盤、程式碼倉庫。請將其備份在安全的位置,丟失後將無法用金鑰登入。

步驟 2:用 ssh-copy-id 上傳公鑰到伺服器

macOS 和 Linux 可以直接使用 ssh-copy-id,它會自動把公鑰追加到伺服器的 ~/.ssh/authorized_keys 並設定許可權。執行時需要輸入一次伺服器密碼。

# macOS / Linux
ssh-copy-id -i ~/.ssh/id_ed25519.pub [email protected]
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 [email protected]   # custom port

Windows 自帶的 OpenSSH 沒有 ssh-copy-id,可以在 PowerShell 中用下面的命令實現相同效果:

# Windows PowerShell (no ssh-copy-id)
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh [email protected] "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

步驟 3:檢查 authorized_keys 許可權

sshd 對許可權要求很嚴格:如果 ~/.ssh 目錄或 authorized_keys 檔案的許可權過寬,金鑰會被直接忽略。手動上傳公鑰後請在伺服器上執行以下命令。啟用了 SELinux 的系統還需要恢復安全上下文。

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R root:root ~/.ssh

# CentOS / Rocky / AlmaLinux with SELinux: restore the correct context
restorecon -Rv ~/.ssh

步驟 4:測試 SSH 金鑰登入

保持當前會話不要關閉,在本地新開一個終端測試。如果不再要求輸入伺服器密碼(設定了口令的話會要求輸入金鑰口令),說明金鑰登入已經生效。

# From your computer: should log in without asking for the server password
ssh -i ~/.ssh/id_ed25519 [email protected]

步驟 5:停用 SSH 密碼登入

確認金鑰登入成功後,編輯 /etc/ssh/sshd_config 關閉密碼認證。PermitRootLogin prohibit-password 表示 root 只能用金鑰登入。注意很多雲映象會在 /etc/ssh/sshd_config.d/ 中放置開啟密碼登入的配置檔案(如 50-cloud-init.conf),需要一併修改,否則主配置檔案的設定不會生效。

# /etc/ssh/sshd_config
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password

# Drop-in files can override the main file - check them
grep -rn 'PasswordAuthentication' /etc/ssh/sshd_config.d/ 2>/dev/null

步驟 6:驗證配置並重啟 sshd

用 sshd -t 檢查語法,再用 sshd -T 檢視最終生效的值,確認 passwordauthentication 為 no 後重啟服務。隨後在新視窗再次測試金鑰登入,同時可以嘗試用密碼登入,應當被拒絕。

sshd -t
sshd -T | grep -Ei 'passwordauthentication|pubkeyauthentication|permitrootlogin'

systemctl restart sshd    # CentOS / Rocky / AlmaLinux / Debian
systemctl restart ssh     # Ubuntu

常見問題

配置後仍然提示輸入密碼?

通常是許可權問題或公鑰沒有寫對。檢查 authorized_keys 中公鑰是否完整佔一行,目錄和檔案許可權是否為 700/600,並用 ssh -v 檢視客戶端是否傳送了正確的金鑰。

多台電腦如何登入同一台伺服器?

每台電腦各自生成金鑰,把各自的公鑰逐行追加到 authorized_keys 即可。某臺電腦丟失時,只需刪除對應那一行公鑰。

停用密碼後私鑰丟失了怎麼辦?

通過客戶中心的 VNC 控制臺用 root 密碼登入(控制臺不受 SSH 配置影響),重新新增新的公鑰;如果 root 密碼也忘記,請提交工單協助。

如按以上步驟操作後仍無法解決,歡迎提交工單聯絡 IMIDC 7×24 技術支援。提交時請註明伺服器 IP、作業系統、已執行的命令和報錯截圖,工程師可以更快定位問題。

這篇文章有幫助嗎?

相關教程