Cómo administrar mi archivo .ssh / known_hosts

47

Ejecuto un escritorio de Ubuntu con un montón de servidores virtuales en Virtual Box para probar cosas, etc. En el pasado también me he conectado a otros tipos de cajas remotas VPS Linux. Actualmente mi .ssh/known_hostsarchivo tiene un montón de claves, la mayoría de las cuales ya no se utilizan.

Quiero limpiar mi .ssh/known_hostsarchivo, pero ¿cómo sé qué clave pertenece a qué host? Es decir, ¿cómo sé qué claves puedo eliminar con seguridad y cuáles debo dejar en paz?

Luke
fuente

Respuestas:

64

Para averiguar qué entrada es para un nombre de host conocido en known_hosts:

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

Para eliminar una sola entrada de known_hosts:

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

Si tienes una lista de todos tus hosts, puedes hacer algo como

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

Eso sobrescribirá su archivo .ssh / known_hosts con uno recién generado basado en el escaneo de los hosts.

Y también haga lo que sugiere el otro receptor; HashKnownHosts es más molestia que ayuda aquí.

freiheit
fuente
ssh-keyscantiene unas reglas de formato muy estrictas del list_of_hostsarchivo. Debe ser solo la dirección y no otro espacio en blanco que LF después de cada dirección. Eso incluye LF después de la última dirección. De lo contrario, obtendrá mucha basura en el archivo generado.
Nux
21

Con dificultad...

Ubuntu de forma predeterminada agrega nombres de host al archivo known_hosts (este no es el comportamiento predeterminado de openssh), para dificultar que cualquiera que lea el archivo sepa a qué sistemas accede.

Si realmente quisieras limpiar el archivo, la opción más simple probablemente sea simplemente eliminarlo y verificar las claves de los servidores que conoces a medida que surgen, pero en realidad solo dejaría solo conocido_hosts.

Puede detener el hash de las nuevas entradas de hosts comentando la opción en / etc / ssh / ssh_config

#HashKnownHosts yes
el otro recibir
fuente
Limpiar ~ / .ssh / known_hosts también ayuda cuando la configuración del host remoto cambia y ssh muestra una advertencia. Sin embargo, uno debe tener cuidado con eso e ignorar la advertencia solo para hosts confiables.
Alex
66
Una mejor opción podría ser explicar cómo generar el hash para un nombre de host específico, permitiéndole buscar ese hash en conocido_hosts para que pueda actualizarlo.
Cerin
1
Después del cambio anterior, simplemente agregue una nueva entrada, por ejemplo, conectándose al nuevo servidor con ssh root@something-new-or-new-dns-alias. Esto actualizará el known_hostsarchivo original y descifrará los nombres de host / IP.
Nux
2

Tenía más de 300 entradas antiguas obsoletas en mi archivo conocido_hosts. No estoy seguro de que funcionará para todos los sistemas (o incluso la mayoría de los sistemas), pero aquí está mi script Q&D. Puede que tenga que ajustar las cadenas o la ubicación coincidentes.

#!/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
usuario1953828
fuente
Esto no funciona en un known_hostsarchivo hash , y dado que el interlocutor pregunta, "¿cómo sé qué clave pertenece a qué host"? Creo que es muy probable que su archivo esté hash. Él dice que está en Ubuntu, y como theotherreceivedice, Ubuntu tiene hash por defecto.
Neil Mayhew