ssh: acepta claves automáticamente

218

He escrito este pequeño script de utilidad:

for h in $SERVER_LIST; do ssh $h "uptime"; done

Cuando se agrega un nuevo servidor $SERVER_LIST, el script se detiene con:

The authenticity of host 'blah.blah.blah (10.10.10.10)' can't be established.
RSA key fingerprint is a4:d9:a4:d9:a4:d9a4:d9:a4:d9a4:d9a4:d9a4:d9a4:d9a4:d9.
Are you sure you want to continue connecting (yes/no)?

He intentado yes:

for h in $SERVER_LIST; do yes | ssh $h "uptime"; done

sin suerte

¿Hay alguna forma de parametrizar sshpara aceptar automáticamente cualquier clave nueva?

Adam Matan
fuente
66
La respuesta de Lekensteyn es excelente y correcta, pero solo quería señalar que dado que ssh espera "sí" y yesgenera "y", es posible que haya tenido mejor suerte con for h in $SERVER_LIST; do yes yes | ssh $h "uptime"; done(tenga en cuenta el sí adicional, que le dice a sí qué decir en lugar de "y" ").
chazomaticus

Respuestas:

240

Use la opción StrictHostKeyChecking, por ejemplo:

ssh -oStrictHostKeyChecking=no $h uptime

Esta opción también se puede agregar a ~ / .ssh / config, por ejemplo:

Host somehost
    Hostname 10.0.0.1
    StrictHostKeyChecking no

Tenga en cuenta que cuando las claves del host hayan cambiado, recibirá una advertencia, incluso con esta opción:

$ ssh -oStrictHostKeyChecking=no somehost uptime
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
31:6f:2a:d5:76:c3:1e:74:f7:73:2f:96:16:12:e0:d8.
Please contact your system administrator.
Add correct host key in /home/peter/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/peter/.ssh/known_hosts:24
  remove with: ssh-keygen -f "/home/peter/.ssh/known_hosts" -R 10.0.0.1
Password authentication is disabled to avoid man-in-the-middle attacks.
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.
ash: uptime: not found

Si sus hosts no se reinstalan con frecuencia, puede hacer esto menos seguro (pero más conveniente para las claves de host que cambian a menudo) con la -oUserKnownHostsFile=/dev/nullopción. Esto descarta todas las claves de host recibidas para que nunca genere la advertencia.


Con 18.04, hay una nueva posibilidad: StrictHostKeyChecking=accept-new. De man 5 ssh_config:

If this flag is set to accept-new then ssh will automatically
add new host keys to the user known hosts files, but will not
permit connections to hosts with changed host keys.  If this flag
is set to no or off”, ssh will automatically add new host keys
to the user known hosts files and allow connections to hosts with
changed hostkeys to proceed, subject to some restrictions.
Lekensteyn
fuente
10
Esta no es la mejor solución, ya que evita las herramientas de seguridad integradas. ssh-keyscanes preferible, si está disponible en su sistema.
Stefan Lasiewski
2
@StefanLasiewski Permite ataques de hombre en el medio si estás en redes no confiables. Para aceptar nuevas claves para hosts fijos, el ssh-keyscanenfoque es más sensato. Para máquinas virtuales locales y otros hosts en redes confiables con direcciones IP dinámicas / reutilizadas, el enfoque descrito es lo suficientemente bueno.
Lekensteyn
8
Solo para aclarar la diferencia entre las dos soluciones: la ssh-keyscansolución solo es propensa a un ataque de hombre en el medio la única vez que ssh-keyscanse ejecuta. La -oStrictHostKeyChecking=nosolución es propensa a un ataque de hombre en el medio cada vez que sshse ejecuta.
Erik Sjölund
121

Puede usar el siguiente comando para agregar la huella digital de un servidor a sus conocidos_hosts

ssh-keyscan -H <ip-address> >> ~/.ssh/known_hosts
ssh-keyscan -H <hostname> >> ~/.ssh/known_hosts

NOTA: Reemplace <dirección IP> y <nombre de host> con la IP y el nombre DNS del servidor que desea agregar.

El único problema con esto es que terminará con algunos servidores en su conocido_hosts dos veces. No es realmente un gran problema, solo mencionarlo. Para asegurarse de que no haya duplicados, primero puede eliminar todos los servidores ejecutando lo siguiente primero:

ssh-keygen -R <ip-address>
ssh-keygen -R <hostname>

Para que puedas correr:

for h in $SERVER_LIST; do
    ip=$(dig +search +short $h)
    ssh-keygen -R $h
    ssh-keygen -R $ip
    ssh-keyscan -H $ip >> ~/.ssh/known_hosts
    ssh-keyscan -H $h >> ~/.ssh/known_hosts
done

Una cosa a tener en cuenta al eliminar solo para volver a agregar, esencialmente está eliminando la seguridad de verificar la huella digital. Por lo tanto, definitivamente no querrá ejecutar este script antes de cada ejecución de su script de utilidad.

fantasma
fuente
1
ejecutándolo a través de ordenar | uniq y luego buscar un host duplicado usando awk after haría que el script sea capaz de detectar hosts modificados y advertir a los usuarios solo sobre eso, ya que el mismo host con diferentes claves podría significar problemas
Lennart Rolland
2
Es posible que desee agregar una nota que -Hnumere los nombres de host y las direcciones.
David Cullen
25

Llego un poco tarde con esta respuesta, pero la forma más sensata sería hacer un ssh-keyscan en la nueva máquina antes de ejecutar la reunión de tiempo de actividad.

ssh-keyscan  <newhost> >> ~/.ssh/known_hosts

Desactivar la comprobación de cordura por conveniencia parece un mal plan, incluso si crees que tienes el control total del medio ambiente.

tink
fuente
ejecutar el comando anterior y no verificar las claves del host contra las huellas digitales que adquirió fuera de banda es vulnerable exactamente de la misma manera queStrictHostKeyChecking no
code_monk
3
@code_monk: no, no lo es. Abro una oportunidad única para fallar (aceptar una clave de un host incorrecto para agregarla a hosts conocidos). StrictHostKeyChecking no permitirá repeticiones aceptadas para otras máquinas.
Tink
0

Para agregar una lista de servidores automáticamente, podemos hacer lo siguiente:

Agregar servidores IP en la lista de servidores de archivos

Las IP deben agregarse en el siguiente formato.

Salida de cat servers-list

123.1.2.3
124.1.2.4
123.1.2.5

Cambie las IP anteriores reemplazando las suyas.

El siguiente comando agregará todos los servidores de la lista.

ssh-keyscan -p61 -H "`cat servers-list`" >> ~/.ssh/known_hosts
Waqas Khan
fuente