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.