So verwalten Sie meine .ssh / known_hosts-Datei

47

Ich verwende einen Ubuntu-Desktop mit einer Reihe von virtuellen Servern in Virtual Box, um Dinge zu testen usw. In der Vergangenheit habe ich mich auch mit anderen Arten von Remote-VPS-Linux-Boxen verbunden. Derzeit enthält meine .ssh/known_hostsDatei eine ganze Reihe von Schlüsseln, von denen die meisten nicht mehr verwendet werden.

Ich möchte meine .ssh/known_hostsDatei bereinigen , aber woher weiß ich, welcher Schlüssel zu welchem ​​Host gehört? Dh woher weiß ich, welche Schlüssel ich sicher entfernen kann und welche ich in Ruhe lassen sollte?

Luke
quelle

Antworten:

64

So finden Sie heraus, welcher Eintrag für einen bekannten Hostnamen in known_hosts gilt:

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

So löschen Sie einen einzelnen Eintrag aus known_hosts:

 # ssh-keygen -R <hostname or IP address>
mikehapner
quelle
27

Wenn Sie eine Liste aller Ihrer Gastgeber haben, können Sie so etwas tun

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

Dadurch wird Ihre .ssh / known_hosts-Datei mit einer neu generierten Datei überschrieben, die auf dem Scannen der Hosts basiert.

Und auch das tun, was das andere Empfangen nahelegt; HashKnownHosts ist hier mehr Ärger als Hilfe.

freiheit
quelle
ssh-keyscanhat eine sehr strenge Formatierungsregeln der list_of_hostsDatei. Es muss nur die Adresse und kein anderes Leerzeichen als LF nach jeder Adresse sein. Das schließt LF nach der letzten Adresse ein. Andernfalls wird in der generierten Datei viel Papierkorb angezeigt.
Nux
21

Mit Schwierigkeiten...

Ubuntu hasht standardmäßig den Hostnamen der Datei known_hosts (dies ist nicht das standardmäßige Verhalten von openssh), damit niemand beim Lesen der Datei weiß, auf welche Systeme Sie zugreifen.

Wenn Sie die Datei wirklich bereinigen wollten, ist es wahrscheinlich die einfachste Option, sie einfach zu löschen und die Schlüssel der Server zu überprüfen, die Sie kennen, sobald sie entstehen. In Wirklichkeit würde ich known_hosts einfach in Ruhe lassen.

Sie können verhindern, dass neue Host-Einträge gehasht werden, indem Sie die Option in / etc / ssh / ssh_config auskommentieren

#HashKnownHosts yes
theotherreceive
quelle
Das Aufräumen von ~ / .ssh / known_hosts hilft auch, wenn sich die Konfiguration des Remote-Hosts ändert und ssh eine Warnung anzeigt. Allerdings sollte man damit vorsichtig sein und die Warnung nur für vertrauenswürdige Hosts ignorieren.
Alex
6
Eine bessere Möglichkeit könnte darin bestehen, zu erklären, wie der Hash für einen bestimmten Hostnamen generiert wird, damit er in known_hosts nach diesem Hash suchen und ihn aktualisieren kann.
Cerin
1
Nach obiger Änderung fügen Sie einfach einen neuen Eintrag hinzu, zB indem Sie sich mit auf einen neuen Server verbinden ssh root@something-new-or-new-dns-alias. Dadurch wird die Originaldatei known_hostsaktualisiert und die Hostnamen / IPs werden entschlüsselt.
Nux
2

Ich hatte über 300 veraltete alte Einträge in meiner Datei known_hosts. Ich bin nicht sicher, ob es für alle Systeme (oder sogar für die meisten Systeme) funktioniert, aber hier ist mein Q & D-Skript. Möglicherweise müssen Sie die entsprechenden Zeichenfolgen oder Positionen anpassen.

#!/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
user1953828
quelle
Dies funktioniert nicht bei einer gehashten known_hostsDatei, und da der Fragesteller fragt, "woher weiß ich, welcher Schlüssel zu welchem ​​Host gehört", ist es sehr wahrscheinlich, dass seine Datei gehasht ist. Er sagt, er ist auf Ubuntu und wie theotherreceivegesagt, Ubuntu hasht standardmäßig.
Neil Mayhew