.ssh / known_hostsファイルを管理する方法


47

Virtual Boxに多数の仮想サーバーを配置したUbuntuデスクトップを実行して、テストなどを行います。過去には、他の種類のリモートVPS Linuxボックスにも接続していました。現在、私の.ssh/known_hostsファイルにはたくさんのキーがあり、そのほとんどはもう使用されていません。

.ssh/known_hostsファイルをクリーンアップしたいのですが、どのキーがどのホストに属しているかを知るにはどうすればよいですか?つまり、どのキーを安全に削除でき、どのキーをそのままにしておくべきかをどのようにして知ることができますか?

回答:


64

known_hostsの既知のホスト名に対応するエントリを見つけるには:

 # ssh-keygen -H  -F <hostname or IP address>

known_hostsから単一のエントリを削除するには:

 # ssh-keygen -R <hostname or IP address>

27

すべてのホストのリストがあれば、次のようなことができます

ssh-keyscan -t rsa,dsa -f list_of_hosts > ~/.ssh/known_hosts

これにより、.ssh / known_hostsファイルが、ホストのスキャンに基づいて新しく生成されたファイルで上書きされます。

そして、他の人が提案することも行います。HashKnownHostsはここでのヘルプよりも厄介です。


ssh-keyscanlist_of_hostsファイルのフォーマット規則は非常に厳格です。各アドレスの後には、アドレスだけでLF以外の空白がない必要があります。これには、最後のアドレスの後のLFが含まれます。そうしないと、生成されたファイルに大量のゴミが入ります。
-Nux

21

苦労して...

デフォルトでは、Ubuntuはknown_hostsファイルのホスト名をハッシュし(これはデフォルトのopensshの動作ではありません)、ファイルを読んでいる人がアクセスするシステムを知るのを困難にします。

本当にファイルをきれいにしたい場合、最も簡単なオプションはおそらくそれを削除して、発生したことがわかっているサーバーのキーをチェックすることですが、実際にはknown_hostsをそのままにしておきます。

/ etc / ssh / ssh_configのオプションをコメント化することにより、新しいホストエントリがハッシュされないようにすることができます。

#HashKnownHosts yes

〜/ .ssh / known_hostsのクリーンアップは、リモートホストの構成が変更され、sshが警告を表示する場合にも役立ちます。ただし、これには注意が必要であり、信頼できるホストについてのみ警告を無視する必要があります。
アレックス

6
より良いオプションは、特定のホスト名のハッシュを生成する方法を説明し、known_hostsでそのハッシュを検索して更新できるようにすることです。
セリン

1
上記の変更の後、新しいサーバーに接続するなどして、新しいエントリを追加しますssh root@something-new-or-new-dns-alias。これにより、元のknown_hostsファイルが更新され、ホスト名/ IPの暗号化が解除されます。
-Nux

2

known_hostsファイルに300を超える古いエントリがありました。すべてのシステム(またはほとんどのシステム)で機能するかどうかはわかりませんが、ここに私のQ&Dスクリプトを示します。一致する文字列または場所を調整する必要がある場合があります。

#!/bin/sh
list=`cat ~/.ssh/known_hosts | awk '{print $1}' |sed -e 's/,/ /g' | sort -u `

listsorted=$(printf "%s\n" ${list[@]} | sort -u)
echo $listsorted
#listsorted="10.2.10.1"
echo > /tmp/sshstat.txt
for host in $listsorted ;
do
echo $host 
ssh -oBatchMode=yes -oConnectTimeout=2  root@${host} "exit" >/tmp/sshstat.txt 2>&1 
ret=$?
if [ $ret -ne 0 ]; then
     echo "Failed: $host"
     echo sed -i.bak \"/$host/d\" "~/.ssh/known_hosts" | sh
else
    grep "Offending RSA" /tmp/sshstat.txt |  sed -e 's/:/ /g' | awk '{printf "sed -i.bak -e \"%dd\" %s  \n", $6, "~/.ssh/known_hosts" }' | sh
   fi
done
#echo $list

これはハッシュ化されたknown_hostsファイルでは機能せず、質問者は「どのキーがどのホストに属しているかをどうやって知るのか」と尋ねるので、彼のファイルはハッシュ化される可能性が高いと思います。彼はUbuntuを使用してtheotherreceiveいると言っており、言うようにUbuntuはデフォルトでハッシュします。
ニールメイヒュー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.