Jak zarządzać moim plikiem .ssh / known_hosts

47

Korzystam z pulpitu Ubuntu z kilkoma wirtualnymi serwerami w Virtual Box, aby przetestować rzeczy itp. W przeszłości łączyłem się również z innymi rodzajami zdalnych VPS Linux. Obecnie mój .ssh/known_hostsplik zawiera całą masę kluczy, z których większość nie jest już używana.

Chcę wyczyścić mój .ssh/known_hostsplik, ale skąd mam wiedzieć, który klucz należy do jakiego hosta? Skąd mam wiedzieć, które klucze mogę bezpiecznie usunąć, a które mam zostawić w spokoju?

Łukasz
źródło

Odpowiedzi:

64

Aby dowiedzieć się, który wpis dotyczy znanej nazwy hosta w znanych hostach:

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

Aby usunąć pojedynczy wpis ze znanych hostów:

 # ssh-keygen -R <hostname or IP address>
mikehapner
źródło
27

Jeśli masz listę wszystkich hostów, możesz zrobić coś takiego

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

Spowoduje to zastąpienie pliku .ssh / known_hosts nowo wygenerowanym plikiem opartym na skanowaniu hostów.

A także rób to, co sugeruje ta inna metoda; HashKnownHosts jest bardziej denerwujący niż pomoc tutaj.

freiheit
źródło
ssh-keyscanma bardzo surowe reguły formatowania list_of_hostspliku. Musi to być tylko adres, a nie każdy inny biały znak niż LF po każdym adresie. Obejmuje to LF po ostatnim adresie. W przeciwnym razie w wygenerowanym pliku pojawi się dużo śmieci.
Nux
21

Z trudem...

Ubuntu domyślnie szyfruje nazwy hostów w pliku znane_hosty (nie jest to domyślne zachowanie openssh), aby utrudnić każdemu czytającemu plik znajomość systemów, do których masz dostęp.

Jeśli naprawdę chcesz wyczyścić plik, najprostszą opcją jest prawdopodobnie po prostu usunięcie go i sprawdzenie kluczy serwerów, które znasz, gdy się pojawiają, ale tak naprawdę zostawiłbym znane_hosty w spokoju.

Możesz zatrzymać mieszanie wpisów nowych hostów, komentując opcję w / etc / ssh / ssh_config

#HashKnownHosts yes
inne
źródło
Czyszczenie ~ / .ssh / known_hosts pomaga również, gdy zmienia się konfiguracja zdalnego hosta i ssh wyświetla ostrzeżenie. Należy jednak zachować ostrożność i zignorować ostrzeżenie tylko dla zaufanych hostów.
Alex
6
Lepszą opcją może być wyjaśnienie, jak wygenerować skrót dla określonej nazwy hosta, umożliwiając mu wyszukiwanie tego skrótu w znanych hostach, aby mógł go zaktualizować.
Cerin
1
Po powyższej zmianie po prostu dodaj nowy wpis, np. Łącząc się z nowym serwerem za pomocą ssh root@something-new-or-new-dns-alias. Spowoduje to odświeżenie oryginalnego known_hostspliku i odszyfrowanie nazw hostów / adresów IP.
Nux
2

Miałem ponad 300 starych starych wpisów w moim pliku znane_hosty. Nie jestem pewien, czy to zadziała dla wszystkich systemów (lub nawet większości systemów), ale oto mój skrypt Q&D. Konieczne może być dopasowanie pasujących ciągów lub lokalizacji.

#!/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
użytkownik1953828
źródło
Nie działa to w przypadku known_hostspliku z haszowaniem , a ponieważ pytający pyta: „skąd mam wiedzieć, który klucz należy do jakiego hosta?” Myślę, że jest bardzo prawdopodobne, że jego plik jest haszowany. Mówi, że jest na Ubuntu i, jak theotherreceivemówi, Ubuntu domyślnie ma skrót.
Neil Mayhew