注意事項

注意事項

讓我們想像以下場景。

ABCDEF1234我有給定主機名的主機密鑰,因此我的known_hosts文件如下所示(未散列版本):

example.com ssh-rsa ABCDEF1234

現在我連接到它,主機名稱解析為 10.11.12.13 我收到這樣的訊息

Warning: Permanently added the ECDSA host key for IP address '10.11.12.13' to the list of known hosts.

我的known_hosts 看起來像這樣

example.com ssh-rsa ABCDEF1234
192.0.2.1 ssh-rsa ABCDEF1234 

現在幾個月後,example.com管理員告訴我 RSA 金鑰已被刪除並更改為有利於1234ABCDEF金鑰。所以我使用刪除有問題的密鑰ssh-keygen -R example.com,然後我第一次連接,接受密鑰,並知道我的known_host樣子是這樣的:

192.0.2.1 ssh-rsa ABCDEF1234 
example.com  ssh-rsa 1234ABCDEF

每次我連接時,我都會收到這條很好的警告訊息:

Warning: the ECDSA host key for 'example.com' differs from the key for the IP address '192.0.2.1'
Offending key for IP in /home/jenkins/.ssh/known_hosts:162
Matching host key in /home/jenkins/.ssh/known_hosts:182

現在想像一下該特定主機名稱有數十或數百個 IP,這需要清理大量的行。一種解決方案是使用來刪除匹配行,但這不是避免弄亂sed的目標嗎?ssh-keygen -Rsed

sed -i '/ABCDEF1234/d' known_hosts

是否有另一種解決方案,可以從known_host檔案中刪除與給定金鑰(而不是主機名稱或 IP 位址)關聯的所有條目?

答案1

的目的ssh-keygen -R不是避免使用sed,而是刪除例如sed無法找到的雜湊主機。從ssh-keygen(1)

-R hostname

hostname從檔案中刪除屬於的所有鍵known_hosts。此選項對於刪除雜湊主機很有用(請參閱-H上面的選項)。

-H

對文件進行哈希處理known_hosts。這會將指定檔案中的所有主機名稱和位址替換為雜湊表示形式;原始內容被移動到帶有後綴的文件中.old。這些哈希值通常可以被ssh和所使用sshd,但如果文件內容被洩露,它們不會洩露識別資訊。此選項不會修改現有的雜湊主機名,因此可以安全地在混合雜湊名稱和非雜湊名稱的檔案上使用。

注意事項

避免碰撞

請注意,最好使用以 Base64 編碼的完整公鑰,以避免刪除其他密鑰。例如,如果您只使用部分標頭你最終會刪除相同類型的所有鍵:

 Base64 ASCII碼 參考號
AAAAE2VjZHNhLXNoYTItbmlzdHAyNTY
AAAAIbmlzdHAyNTYAAABBB
....ecdsa-sha2-nistp256
....nistp256...A
RFC 5656,3.1
AAAAC3NzaC1lZDI1NTE5AAAAIFKy ....ssh-ed25519... R² RFC 8709, 4
AAAAB3NzaC1yc2EAAAADAQABAAABAQ ...ssh-rsa........... RFC 4253,6.6

調整您的sedBase64

Base64 編碼的公鑰包含字元A-Za-z0-9+/=。由於它可以包含範例/中使用的sed,因此您想使用另一個字符,例如:

工作範例

在範例中:

  • AAAA+OLD/KEY=是一個佔位符滿的舊的公鑰。
  • AAAA+NEW/KEY=是一個佔位符滿的新的公鑰。

刪除所有具有相同金鑰的主機

使用完整的舊金鑰刪除包含它的所有行:

sed -i ':AAAA+OLD/KEY=:d' ~/.ssh/known_hosts

用新鑰匙取代舊鑰匙

使用完整鍵(舊的和新的)在包含舊鍵的所有行上替換它:

sed -i 's:AAAA+OLD/KEY=:AAAA+NEW/KEY=:g' ~/.ssh/known_hosts

如果金鑰類型也發生變化,則必須將其包含在內,例如,

sed -i 's:ssh-rsa AAAA+OLD/KEY=:ecdsa-sha2-nistp256 AAAA+NEW/KEY=:g' ~/.ssh/known_hosts

刪除主機名稱或 IP 的鍵

這是您將使用的唯一用例ssh-keygen

ssh-keygen -R example.com

ssh-keygen -R 192.0.2.1

答案2

首先避免這個問題是一個很好的解決方案。如果known_hosts 沒有填入給定主機名稱的每個IP 的項目,則無需搞亂sed。ssh_keygen -R hostname足以執行密鑰輪換。

所以我的解決方案是在 ssh 配置中設定CheckHostIP為。no

SSH 選項 CheckHostIP=yes 對我有何幫助?

相關內容