307 votos

¿Puedo añadir automáticamente un nuevo host a known_hosts?

Esta es mi situación: Estoy configurando un arnés de pruebas que, desde un cliente central, lanzará una serie de instancias de máquinas virtuales y luego ejecutará comandos en ellas a través de ssh . Las máquinas virtuales tendrán nombres de host y direcciones IP no utilizadas previamente, por lo que no estarán en el ~/.ssh/known_hosts en el cliente central.

El problema que tengo es que la primera ssh que se ejecuta contra una nueva instancia virtual siempre aparece un prompt interactivo:

The authenticity of host '[hostname] ([IP address])' can't be established.
RSA key fingerprint is [key fingerprint].
Are you sure you want to continue connecting (yes/no)?

¿Hay alguna manera de evitar esto y conseguir que el nuevo host sea conocido por la máquina cliente, tal vez utilizando una clave pública que ya está incorporada en la imagen de la máquina virtual? Realmente me gustaría evitar tener que usar Expect o lo que sea para responder al prompt interactivo si puedo.

6 votos

Para un entorno de pruebas autónomo y físicamente seguro, la aceptación automatizada de claves puede funcionar bien. Pero la aceptación automática de claves públicas en un entorno de producción o a través de una red que no sea de confianza (como Internet) evita por completo cualquier protección contra los ataques del hombre en el medio que SSH podría ofrecer. El sólo Una forma válida de garantizar la seguridad contra los ataques MITM es verificar la clave pública del host a través de algún canal de confianza fuera de banda. No hay una forma segura de automatizarlo sin configurar una infraestructura de firma de claves moderadamente complicada.

270voto

Alexandru Puntos 3999

En mi opinión, la mejor manera de hacerlo es la siguiente:

ssh-keygen -R [hostname]
ssh-keygen -R [ip_address]
ssh-keygen -R [hostname],[ip_address]
ssh-keyscan -H [hostname],[ip_address] >> ~/.ssh/known_hosts
ssh-keyscan -H [ip_address] >> ~/.ssh/known_hosts
ssh-keyscan -H [hostname] >> ~/.ssh/known_hosts

Esto asegurará que no haya entradas duplicadas, que esté cubierto tanto el nombre de host como la dirección IP, y también hará un hash de la salida, una medida de seguridad adicional.

4 votos

¿Por qué necesitas los 3 ssh-keyscan? ¿No puedes arreglártelas con sólo la primera ya que funciona tanto para el nombre de host como para la ip?

9 votos

¿Puedes estar seguro de que la máquina que responde a la petición de ssh-keyscan es realmente con la que quieres hablar? Si no es así, te has abierto a un ataque de hombre en el medio.

3 votos

@JasperWallace Sí, para eso necesitas al menos la huella dactilar o incluso mejor la clave pública, en cuyo caso puedes añadirla directamente a known_hosts, convirtiendo esta cuestión en discutible. Si sólo tienes la huella digital, tendrás que escribir un paso extra que verifique la clave pública descargada con tu huella digital...

180voto

Ignacio Vazquez-Abrams Puntos 30600

Establezca el StrictHostKeyChecking opción de no en el archivo de configuración o a través de -o :

ssh -o StrictHostKeyChecking=no username@hostname.com

92 votos

Esto te deja abierto a los ataques del hombre en el medio, probablemente no es una buena idea.

14 votos

@JasperWallace, aunque esto suele ser un buen consejo, el caso de uso específico (desplegar VMs de prueba y enviarles comandos) debería ser lo suficientemente seguro.

10 votos

Esto da una Warning: Permanently added 'hostname,1.2.3.4' (RSA) to the list of known hosts. Para evitar la advertencia, y para evitar que la entrada se añada a cualquier archivo known_hosts, lo hago: ssh -o StrictHostKeyChecking=no -o LogLevel=ERROR -o UserKnownHostsFile=/dev/null username@hostname.com

122voto

fivef Puntos 141

Para los perezosos:

ssh-keyscan -H <host> >> ~/.ssh/known_hosts

-H hace un hash del nombre de host / dirección IP

2 votos

"ssh-keyscan -H <host> >> ~/.ssh/known_hosts" produce una entrada más parecida a lo que hace ssh con la interacción del usuario. (El -H hash el nombre del host remoto).

9 votos

Vulnerable a los ataques MITM. No se comprueba la huella digital de la clave.

10 votos

@Mnebuerquo Dices lo que hay que hacer pero no el cómo, que sería útil.

43voto

ysawej Puntos 171

Como se ha mencionado, el uso de key-scan sería la forma correcta y discreta de hacerlo.

ssh-keyscan -t rsa,dsa HOST 2>&1 | sort -u - ~/.ssh/known_hosts > ~/.ssh/tmp_hosts
mv ~/.ssh/tmp_hosts ~/.ssh/known_hosts

Lo anterior hará el truco para añadir un host, SÓLO si no se ha añadido todavía. Tampoco es seguro para la concurrencia; usted no debe ejecute el fragmento en la misma máquina de origen más de una vez al mismo tiempo, ya que el archivo tmp_hosts puede quedar saturado, lo que en última instancia lleva a que el archivo known_hosts se infle...

1 votos

¿Hay alguna manera de comprobar si la clave está en known_hosts antes de ssh-keyscan ? La razón es que requiere algo de tiempo y una conexión de red adicional.

1 votos

La versión del cartel original de este archivo tenía cat ~/.ssh/tmp_hosts > ~/.ssh/known_hosts pero una edición posterior lo cambió por >> . Utilizando >> es un error. Desaprovecha el propósito de la unicidad en la primera línea, y hace que vuelque las nuevas entradas en known_hosts cada vez que se ejecuta. (Acabo de publicar una edición para cambiarlo de nuevo).

1 votos

Esto está sujeto a los mismos ataques MITM que los otros.

19voto

Jake Siemer Puntos 11

Puede utilizar ssh-keyscan para obtener la clave pública y añadirla a su known_hosts archivo.

5 votos

Asegúrese de comprobar la huella digital para asegurarse de que es la clave correcta. De lo contrario, te abres a los ataques MITM.

5 votos

@Mnebuerquo Es justo en el contexto general, pero ¿por qué alguien trataría de reunir claves mediante programación si ya sabe cuál es la clave correcta?

1 votos

Esta no es la manera de hacerlo. MITM.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: