Pregunta ¿Puedo agregar automáticamente un nuevo host a known_hosts?


Esta es mi situación: estoy configurando un arnés de prueba que, desde un cliente central, lanzará varias 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 utilizados previamente, por lo que no estarán en el ~/.ssh/known_hosts archivo en el cliente central.

El problema que tengo es que el primero ssh el comando ejecutado contra una nueva instancia virtual siempre presenta un indicador 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 hacer que el nuevo servidor ya 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 el aviso interactivo si puedo.


217
2018-04-16 04:15


origen


Para un entorno de prueba que sea autónomo y físicamente seguro, la aceptación de una clave automatizada puede funcionar bien. Sin embargo, la aceptación automática de claves públicas en un entorno de producción o en una red no confiable (como Internet) omite por completo cualquier protección contra los ataques de intermediarios que SSH podría permitir. los solamente Una forma válida de asegurarse de estar seguro contra los ataques MITM es verificar la clave pública del host a través de algún canal confiable fuera de banda. No hay una forma segura de automatizarlo sin configurar una infraestructura de firma de claves moderadamente complicada. - Eil


Respuestas:


Selecciona el StrictHostKeyChecking opción a no, ya sea en el archivo de configuración o vía -o :

ssh -o StrictHostKeyChecking=no username@hostname.com


126
2018-04-16 04:34



Esto te deja abierto al hombre en los ataques medios, probablemente no sea una buena idea. - JasperWallace
@JasperWallace, si bien este suele ser un buen consejo, el caso de uso específico (implementar VM de prueba y enviarles comandos) debería ser lo suficientemente seguro. - Massimo
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 agregue a cualquier archivo conocido_hosts, hago: ssh -o StrictHostKeyChecking=no -o LogLevel=ERROR -o UserKnownHostsFile=/dev/null username@hostname.com - Peter V. Mørch
Realice una votación descendente ya que esto no responde a la pregunta y se abre a vulnerabilidades de seguridad graves. - marcv81
@Mnebuerquo: Si estuviera preocupado por la seguridad, no tendría nada que ver con esta pregunta. Tendría la clave de host correcta frente a usted, reunida en la consola del sistema al que desea conectarse, y lo verificará manualmente al conectarse. Ciertamente no harías nada "automáticamente". - Ignacio Vazquez-Abrams


OMI, 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

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


209
2017-09-27 20:51



¿Por qué necesitas los 3 ssh-keyscan's? ¿No puedes sobrevivir solo con el primero, ya que funciona tanto para el nombre de host como para la ip? - Robert
¿Puede estar seguro de que la máquina que responde a la solicitud de ssh-keyscan es realmente con la que desea hablar? Si no te has abierto a un hombre en el ataque medio. - JasperWallace
@JasperWallace Sí, para eso necesita al menos la huella digital o incluso mejor la clave pública, en cuyo caso puede agregarla directamente a known_hosts, convirtiendo esta pregunta en discutible. Si solo tiene la huella digital, tendrá que escribir un paso adicional que verifique la clave pública descargada con su huella digital ...
Llamadas a ssh-keyscan fallaron para mí porque mi host de destino no admite el tipo de clave de la versión 1 predeterminada. Añadiendo -t rsa,dsa al comando arreglado esto. - phasetwenty
Esta es probablemente una mala idea. Te estás abriendo a un ataque de hombre en el medio actualizando estas claves. Para evitar entradas duplicadas, verifique el estado de retorno de ssh-keygen -F [address] en lugar. medium.com/@wblankenship/… - retrohacker


Para los perezosos:

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

78
2017-09-25 10:03



+1 por ser culpable según lo acusado. Gracias. - SaxDaddy
Vulnerable a los ataques MITM. No estás comprobando la huella digital clave. - Mnebuerquo
@Mnebuerquo Usted dice qué hacer pero no cómo, lo que sería útil. - Jim
@jameshfisher Sí, es vulnerable a los ataques MITM, pero ¿alguna vez ha comparado la huella dactilar RSA, que le fue mostrada con la del servidor, cuando estaba haciendo esto manualmente? ¿No? Así que esta respuesta es la manera de hacerlo por ti. En caso afirmativo, no debe usar esta respuesta y hacerlo manualmente o implementar otras medidas de seguridad ... - fivef
@Mnebuerquo Me alegraría mucho que también nos informara sobre una mejor manera de manejar esto, cuando necesitamos clonar un repositorio utilizando scripts de lotes sin asistencia y queremos evitar este aviso. ¡Por favor arroje algo de luz sobre una solución real si cree que esta no es la correcta! - Waqas Shah


Como se mencionó, 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 agregar un host, SOLAMENTE si aún no se ha agregado. Tampoco es seguro de concurrencia; tú no debe ejecuta el fragmento en la misma máquina de origen más de una vez al mismo tiempo, ya que el archivo tmp_hosts puede ser obstruido, lo que finalmente lleva a que el archivo conocido_hosts se hinche ...


38
2018-03-06 09:00



¿Hay alguna forma de verificar si la clave está en hosts_ conocidos? antes de  ssh-keyscan? La razón es que requiere algún tiempo y conexión de red adicional. - utapyngo
La versión original del póster de este archivo tenía cat ~/.ssh/tmp_hosts > ~/.ssh/known_hosts, pero una edición posterior lo cambió a >>. Utilizando >> es un error Derrota el propósito de la unicidad en la primera línea, y causa que vuelque nuevas entradas en known_hosts cada vez que se ejecuta. (Acabo de publicar una edición para volver a cambiarla). - paulmelnikow
Esto está sujeto a los mismos ataques MITM que los otros. - Mnebuerquo
@utapyngo ssh-keygen -F le dará la huella digital actual. Si vuelve a estar en blanco con el código de retorno de 1, entonces no lo tiene. Si imprime algo y el código de retorno es 0, entonces ya está presente. - Rich L
Si le importa mucho el MITM, implemente registros DNSSEC y SSHFP o use algún otro medio seguro para distribuir las claves y esta solución de kludge será irrelevante. - Zart


Usted podría usar ssh-keyscan comando para tomar la clave pública y adjuntar eso a su known_hosts expediente.


18
2018-04-16 05:09



Asegúrese de verificar la huella digital para asegurarse de que es la clave correcta. De lo contrario, te abres a los ataques MITM. - Mnebuerquo
@Mnebuerquo Punto justo en el contexto general, pero ¿por qué alguien intentaría reunir claves mediante programación si ya sabía cuál era la clave correcta? - Brian Cline
Esta no es la manera de hacerlo. MITM. - jameshfisher


Así es como puedes incorporar ssh-keyscan en tu juego

---
# ansible playbook that adds ssh fingerprints to known_hosts
- hosts: all
  connection: local
  gather_facts: no
  tasks:
  - command: /usr/bin/ssh-keyscan -T 10 {{ ansible_host }}
    register: keyscan
  - lineinfile: name=~/.ssh/known_hosts create=yes line={{ item }}
    with_items: '{{ keyscan.stdout_lines }}'

6
2018-02-03 03:12



¿Está cargando un archivo conocido conocido de host_hosts o está haciendo ssh-keyscan y descargando la salida en conocido_post sin verificar las huellas dactilares? - Mnebuerquo
Esto es simplemente volcar la salida de un keyscan, sí. Entonces, en efecto, es lo mismo que StrictHostKeyChecking = no, solo con la actualización silenciosa de known_hosts sin tener que tocar con las opciones de ssh. Esta solución tampoco funciona bien debido a que ssh-keyscan devuelve varias líneas, lo que hace que esta tarea siempre se marque como "cambiada" - Zart
Esta no es la manera de hacerlo. MITM. - jameshfisher
@jameshfisher Me encantaría que nos informara sobre una mejor manera de manejar esto, cuando necesitamos clonar un repositorio utilizando scripts de lotes sin asistencia y queremos evitar este aviso. ¡Por favor arroje algo de luz sobre una solución real si cree que esta no es la correcta! Por favor, háganos saber "cómo" hacerlo, si cree que esta no es la forma correcta de hacerlo. - Waqas Shah


Tuve un problema similar y descubrí que algunas de las respuestas proporcionadas solo me ayudaron a encontrar una solución automatizada. Lo siguiente es lo que terminé usando, espero que ayude:

ssh -o "StrictHostKeyChecking no" -o PasswordAuthentication=no 10.x.x.x

Agrega la clave a known_hosts y no pide la contraseña.


5
2017-10-21 17:27



Vulnerable a los ataques MITM. No estás revisando la huella digital. - Mnebuerquo
Nadie comprueba la huella dactilar. - Brendan Byrd
Esta no es la manera de hacerlo. MITM. - jameshfisher


Esta sería una solución completa, aceptando la clave de host solo por primera vez

#!/usr/bin/env ansible-playbook
---
- name: accept ssh fingerprint automatically for the first time
  hosts: all
  connection: local
  gather_facts: False

  tasks:
    - name: "check if known_hosts contains server's fingerprint"
      command: ssh-keygen -F {{ inventory_hostname }}
      register: keygen
      failed_when: keygen.stderr != ''
      changed_when: False

    - name: fetch remote ssh key
      command: ssh-keyscan -T5 {{ inventory_hostname }}
      register: keyscan
      failed_when: keyscan.rc != 0 or keyscan.stdout == ''
      changed_when: False
      when: keygen.rc == 1

    - name: add ssh-key to local known_hosts
      lineinfile:
        name: ~/.ssh/known_hosts
        create: yes
        line: "{{ item }}"
      when: keygen.rc == 1
      with_items: '{{ keyscan.stdout_lines|default([]) }}'

5
2017-11-23 13:51



Esta no es la manera de hacerlo. MITM. - jameshfisher