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?

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>

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í.


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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.