SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor · 已更新 2026-08-07

SSH 金鑰管理入門:每台裝置一把 ed25519

了解 SSH 金鑰如何運作與管理:每台裝置使用 1 把 ed25519、符合 sshd 要求的檔案權限、設定檔 Host 區塊,以及筆記型電腦遺失時撤銷金鑰的方法。

SSH 金鑰的運作方式

SSH 金鑰由一對檔案組成:留在裝置上的私密金鑰,以及複製到每台要登入之伺服器的公開金鑰。建立連線時,伺服器會使用公開金鑰傳送一項挑戰,只有相符的私密金鑰能夠回應。私密金鑰不會離開裝置,因此不會有秘密資料經由網路傳送;即使伺服器遭入侵,攻擊者也無法從中竊取有用的內容。這就是金鑰比密碼更安全的原因。妥善管理 SSH 金鑰可歸納為 4 個習慣:每台裝置使用 1 把金鑰、設定 sshd 要求的檔案權限、建立 ~/.ssh/config 檔案以免反覆輸入選項,以及知道在筆記型電腦遺失當天如何移除金鑰。

本指南以 Ubuntu 24.04 為例說明這些習慣,但其中幾乎所有內容都適用於任何 Linux 伺服器和近期版本的 OpenSSH。

開始前先說明一個詞彙,避免造成實際錯誤。公開金鑰不是秘密。你可以將它貼到工單、透過電子郵件傳送,或直接公開,而任何人都無法只靠它登入。私密金鑰才是秘密。任何人只要複製該檔案,並知道它的 passphrase(如果有設定),對你的伺服器而言就等同於你本人。

建立金鑰:ed25519 是正確的預設選項

請在您自己的電腦上執行,不要在伺服器上執行:

ssh-keygen -t ed25519 -C "laptop"

-t ed25519 用來選擇金鑰類型。Ed25519 是現代預設選項:金鑰較短、速度較快,而且 2014 年起的每個 OpenSSH 版本都支援。只有在必須連線到不支援 ed25519 的舊裝置時,才改用 ssh-keygen -t rsa -b 4096-C "laptop" 用來設定註解。註解不具備密碼學功能,但兩年後,您可透過伺服器的 authorized_keys 檔案辨識這把金鑰,因此請填入保存該金鑰的裝置名稱。

ssh-keygen 會詢問金鑰的儲存位置。請接受預設值 ~/.ssh/id_ed25519。接著系統會要求您設定 passphrase。請設定一組;下方的 passphrase 段落會說明為何日常使用幾乎不會增加負擔。最後會產生兩個檔案:~/.ssh/id_ed25519 是私密金鑰,~/.ssh/id_ed25519.pub 是公開金鑰。查看公開金鑰:

cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF3k2s0vQx7GdKQhX1yBz... laptop

內容只有一行:金鑰類型、金鑰資料與您的註解。這一行就是最後會放到伺服器上的內容。

每台裝置使用一把金鑰,而不是每台伺服器一把

大家首先都會問:每台伺服器都需要新的金鑰嗎?不需要。每台需要輸入指令的裝置建立一把金鑰,然後將這把公開金鑰放到該裝置需要連線的每台伺服器上。金鑰可識別裝置。每台伺服器上的 authorized_keys 檔案會列出允許連入的裝置。

這種模型可隨規模擴充,其他做法則會以可預期的方式失效。每台伺服器使用一把金鑰,表示一台需要連線到 20 台伺服器的筆記型電腦必須持有 20 把私密金鑰,而且你會逐漸無法分辨各金鑰的用途。所有裝置共用一把金鑰則更糟:筆記型電腦遭竊時,你無法只撤銷該筆記型電腦的存取權,因為桌上型電腦也持有相同的私密金鑰。你必須在所有伺服器上替換金鑰,並同時重新分發給每台裝置。

每台裝置使用一把金鑰時,筆記型電腦遺失只需在每台伺服器刪除一行:從 authorized_keys 刪除該筆記型電腦的行,其他裝置仍可正常運作。使用 -C 設定的註解可協助你快速找到該行。

這個模型背後的規則是:私密金鑰在裝置上建立,也隨該裝置失效。絕不將私密金鑰複製到第二台機器,也不要將私密金鑰上傳到伺服器。新裝置需要存取權時,請在該裝置上產生新的金鑰。

將公開金鑰放到伺服器上

最簡單的方法是使用 OpenSSH 隨附的 ssh-copy-id

ssh-copy-id matt@10.0.0.10

它會使用目前仍可用的方式登入,通常是密碼,將您的公開金鑰附加到伺服器上的 ~/.ssh/authorized_keys。如果目錄或檔案不存在,也會建立它們,並設定正確的權限。開啟新的 SSH 工作階段進行測試:伺服器應允許您登入,而不要求輸入帳戶密碼。如果金鑰設有密碼片語,您的本機電腦可能會改為要求輸入該密碼片語;這個提示由本機顯示,不是伺服器的密碼提示。

如果已停用密碼登入,ssh-copy-id 就無法登入,因此必須手動加入該行。透過仍可使用的工作階段或供應商的 Web 主控台登入,然後在伺服器上執行:

mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF3k2s0vQx7GdKQhX1yBz... laptop" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

將您實際的公開金鑰貼到引號內,也就是 id_ed25519.pub 中的完整單行內容。authorized_keys 每行放置一個公開金鑰,這就是完整的存取資料庫:新增裝置就是附加一行,撤銷裝置就是刪除一行。在全新的伺服器上,這個步驟應在新 VPS 的前 10 分鐘內完成,並且緊接在停用密碼登入之前。

導致金鑰登入失敗的權限

這是金鑰登入失敗最常見的原因,而且用戶端通常不會顯示任何錯誤。Ubuntu 24.04 的 sshd 預設以 StrictModes yes 執行,因此拒絕使用其他使用者可以修改的 authorized_keys 檔案。如果檔案、~/.ssh 目錄或家目錄可由除了你以外的任何人寫入,sshd 就會忽略你的金鑰,改為要求密碼,且不會在用戶端說明原因。(Ubuntu 的 OpenSSH 僅容許一種範圍非常狹窄的例外:檔案可由你自己的私有群組寫入,且該群組中沒有其他人。不要依賴這項例外;請使用下方的權限模式。)原因只會出現在伺服器日誌中:

sudo grep 'Authentication refused' /var/log/auth.log

在沒有 rsyslog 的精簡映像中,不會有 auth.log;相同內容會出現在 journal 中:sudo journalctl -u ssh | grep 'Authentication refused'

Authentication refused: bad ownership or modes for file /home/matt/.ssh/authorized_keys

修正方式是在伺服器上以受影響的使用者身分執行兩項權限變更,並檢查擁有者:

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

請記住這項規則:.ssh 目錄設為 700,其中所有內容設為 600。你自己的電腦也適用相同數值,因為用戶端同樣會檢查權限。其他使用者若能讀取私密金鑰,ssh 就會直接拒絕使用該金鑰;這次會明確顯示錯誤:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/home/matt/.ssh/id_ed25519' are too open.

chmod 600 ~/.ssh/id_ed25519 可修正此問題。

~/.ssh/config:不再重複輸入選項

本機上的 ~/.ssh/config 檔案可為每台伺服器設定簡短名稱,並記住經常輸入的選項。請以 600 權限建立此檔案,並為每台伺服器加入一個 Host 區塊:

Host web1
    HostName 10.0.0.10
    User matt
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes

Host db1
    HostName 10.0.0.11
    User matt
    Port 2222
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes

現在 ssh web1 可取代 ssh -p 22 matt@10.0.0.10。由於 scprsyncgit 都會讀取此檔案,因此相同的簡短名稱也能在其中使用。HostName 是實際位址,User 可免去輸入帳號名稱,IdentityFile 則可指定要提供的金鑰。

IdentitiesOnly yes 值得特別說明,因為它能解決一個容易混淆的失敗情況。當 agent 中載入多把金鑰時,client 會逐一提供這些金鑰,而伺服器會將每次提供都計為一次失敗嘗試。載入的金鑰過多時,您會先收到 Received disconnect: Too many authentication failures,正確金鑰甚至尚未嘗試。IdentitiesOnly yes 會讓 client 只提供 IdentityFile 中指定的金鑰,因此不會發生這項失敗。

Passphrase 與 ssh-agent

Passphrase 會加密磁碟上的 private key 檔案。沒有 passphrase 時,任何複製該檔案的人都能立即使用它;有 passphrase 時,竊取的檔案必須先猜中 passphrase 才能使用。對於筆記型電腦上的 key,這正是所需的保護,因為筆記型電腦可能遭竊,備份也可能外洩。

Passphrase 在實務上不會增加操作負擔,原因是 ssh-agent。agent 會將解密後的 key 保存在記憶體中,因此每次登入工作階段只需輸入一次 passphrase,之後的連線都能立即建立。大多數 Linux 桌面發行版與 macOS 已經會替你執行 agent。使用以下指令將 key 載入其中:

ssh-add ~/.ssh/id_ed25519

ssh-add -l 會列出 agent 目前保存的 keys。請注意:agent forwarding(ssh -A)可讓遠端伺服器在你連線期間使用你的 agent,繼續向其他伺服器進行驗證。因此,只應對完全信任的伺服器啟用此功能,預設應保持停用。

輪替與撤銷:遺失筆電演練

撤銷一般 SSH key,只需從所有已安裝該 key 的伺服器上的 authorized_keys 移除對應那一行。不需要通知憑證授權單位,也不必等待到期日。該行移除後,使用該 key 的新登入就會失敗。

現在就進行演練,不要等到緊急情況發生。選擇一台伺服器,開啟 ~/.ssh/authorized_keys,依註解尋找該 key。使用編輯器刪除該行,或依註解將它篩除:

grep -v ' laptop$' ~/.ssh/authorized_keys > ~/.ssh/authorized_keys.tmp
mv ~/.ssh/authorized_keys.tmp ~/.ssh/authorized_keys

接著,從剛撤銷 key 的裝置確認登入已失敗,再從另一台裝置確認登入仍可運作。請注意:移除 key 不會中斷已建立的工作階段,因為系統只會在登入時檢查 key。若要撤銷遭竊裝置的 key,也請檢查伺服器上的 who,並終止任何無法辨識的工作階段。

輪替的操作相同,但順序不同:先在裝置上產生新的 key,使用 ssh-copy-id 安裝,確認新 key 可以登入,然後刪除舊的那一行。裝置轉交他人、key 可能已外洩,或成員離開團隊時,都應執行輪替。手動處理兩台伺服器沒有問題;若有二十台,則應使用自動化工具,而 管理多台 Linux 伺服器 說明如何將相同的 authorized_keys 狀態推送到整個伺服器群組。

不要採取的做法

  • 不要在所有裝置上共用同一組私密金鑰。這會導致單一裝置遭竊時,無法只撤銷該裝置的存取權,除非在所有位置更換金鑰。
  • 不要將私密金鑰提交至 git repository,即使是 private repository 也不行。自動掃描器會監控 public repository,並在推送後幾分鐘內嘗試使用外洩的金鑰;如果之後將 repository 設為 public,整段歷史記錄也會一併外洩。
  • 不要將 laptop 的私密金鑰上傳到 server,讓該 server 存取另一台 server。請直接在 server 上產生獨立的金鑰,並只在需要的位置授權該金鑰。
  • 不要將私密金鑰貼到 chat、email 或 ticket 中。公鑰,也就是 .pub file,才是唯一需要分享的部分。

確認使用金鑰能穩定登入後,下一步是關閉 password authentication,讓針對 server 的持續猜測完全無法成功。相關的 drop-in configuration 位於 VPS 上的 SSH 強化設定

FAQ

SSH key 不輸入密碼時如何運作?

伺服器會將您的公開 key 儲存在 ~/.ssh/authorized_keys。登入時,伺服器會傳送 challenge,您的 client 使用私密 key 對 challenge 簽章,伺服器再使用公開 key 驗證簽章。私密 key 不會離開您的裝置,因此傳輸過程中沒有可攔截的內容,伺服器端也沒有可重複使用的祕密可供竊取。遭入侵的伺服器只會洩漏公開 key,而公開 key 無法用於登入任何位置。

所有伺服器都應使用相同的 SSH key 嗎?

可以在多台伺服器使用同一個 key,前提是該 key 始終保留在單一裝置上。原則是每台裝置一個 key,而不是每台伺服器一個 key:將 laptop 的公開 key 放到 laptop 需要登入的每台伺服器上,而 desktop 使用自己的 key。這能簡化撤銷作業,因為裝置遺失時,只需從每台伺服器移除一行可識別的項目,其他裝置仍可正常使用。

.ssh 目錄和 authorized_keys 應設定哪些權限?

~/.ssh 上設定 700,並在 authorized_keys 和每個私密 key 上設定 600;這些項目都應由使用它們的帳號擁有。sshd 預設以 StrictModes yes 執行,因此只要檔案或 home directory 可由您以外的任何人寫入,sshd 就會靜默忽略您的 key。唯一的紀錄是伺服器 auth log 或 journal 中的 Authentication refused: bad ownership or modes

如何從伺服器移除 SSH key?

在該 key 獲授權的帳號中,從 ~/.ssh/authorized_keys 刪除該 key 所在的行。可依 comment 找到正確的行,也就是 key material 後面的標籤。使用該 key 的新登入會立即失敗,但已開啟的 session 仍會保持連線;如果裝置遭竊,也應一併結束該裝置的所有現有 session。對複製過該 key 的每台伺服器重複執行此操作。

SSH key 需要設定 passphrase 嗎?

如果 key 位於 laptop 或 desktop 上,需要。passphrase 會加密 key 檔案,因此遭竊或洩漏的副本本身無法使用,而 ssh-agent 代表每個 session 只需輸入一次,不必每次建立連線都輸入。伺服器上供無人值守自動化使用的 key 通常不設定 passphrase,因為沒有人工可輸入;應改以限制目標帳號可執行的操作來保護這些 key。