¿Cómo ignorar la comprobación de autenticidad SSH ansible?

164

¿Hay alguna forma de ignorar la comprobación de autenticidad SSH realizada por Ansible? Por ejemplo, cuando acabo de configurar un nuevo servidor, tengo que responder sí a esta pregunta:

GATHERING FACTS ***************************************************************
The authenticity of host 'xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx)' can't be established.
RSA key fingerprint is xx:yy:zz:....
Are you sure you want to continue connecting (yes/no)?

Sé que generalmente es una mala idea, pero estoy incorporando esto en un script que primero crea un nuevo servidor virtual en mi proveedor de la nube y luego llama automáticamente a mi libro de jugadas ansible para configurarlo. Quiero evitar cualquier intervención humana en medio de la ejecución del script.

Johan
fuente

Respuestas:

247

Dos opciones: la primera, como dijiste en tu propia respuesta, es establecer la variable de entorno ANSIBLE_HOST_KEY_CHECKINGen False.

La segunda forma de configurarlo es ponerlo en un archivo ansible.cfg, y esa es una opción realmente útil porque puede configurarlo globalmente (a nivel de sistema o usuario, en /etc/ansible/ansible.cfgo ~/.ansible.cfg), o en un archivo de configuración en el mismo directorio como el libro de jugadas que estás ejecutando.

Para hacer eso, cree un ansible.cfgarchivo en una de esas ubicaciones e incluya esto:

[defaults]
host_key_checking = False

También puedes establecer muchos otros valores predeterminados útiles, como si se recopilan o no los hechos al comienzo de una jugada, si se combinan los hashes declarados en varios lugares o se reemplaza uno por otro, y así sucesivamente. Hay una gran lista de opciones aquí en los documentos de Ansible.


Editar: una nota sobre seguridad.

La validación de clave de host SSH es una capa de seguridad significativa para hosts persistentes ; si se conecta a la misma máquina muchas veces, es valioso aceptar la clave de host localmente.

Para instancias EC2 de mayor duración, tendría sentido aceptar la clave de host con una tarea ejecutada solo una vez en la creación inicial de la instancia:

  - name: Write the new ec2 instance host key to known hosts
    connection: local
    shell: "ssh-keyscan -H {{ inventory_hostname }} >> ~/.ssh/known_hosts"

No hay un valor de seguridad para verificar las claves de host en instancias que se pone de pie dinámicamente y eliminar inmediatamente después de la ejecución del libro de jugadas, pero hay un valor de seguridad en la comprobación de claves de host para máquinas persistentes. Por lo tanto, debe administrar la comprobación de claves de host de manera diferente por entorno lógico.

  • Deje la comprobación habilitada de forma predeterminada (en ~/.ansible.cfg)
  • Deshabilite la comprobación de la clave de host en el directorio de trabajo para los libros de jugadas que ejecuta contra instancias efímeras ( ./ansible.cfgjunto con el libro de jugadas para pruebas unitarias contra máquinas virtuales vagabundas, automatización para instancias ec2 de corta duración)
nikobelia
fuente
55
¿Alguien sabe cuál es la mejor práctica aquí? Por ejemplo, puede ejecutar periódicamente un script para restablecer sus hosts conocidos, lo que sería más seguro (a menos que esté sujeto a un ataque MITM durante esa ventana). Haciendo caso omiso de la autenticidad por defecto elimina uno de los mecanismos de seguridad primaria SSH
tonyh
3
Me gusta el patrón que usa mi equipo: colocamos archivos ansible.cfg que deshabilitan la comprobación de la clave de host en los directorios de trabajo de los libros de jugadas que ejecutamos contra instancias efímeras (pruebas unitarias que se ejecutan en máquinas virtuales vagabundas, instancias AWS ec2, etc.) y dejamos la comprobación habilitada en Nivel del sistema.
nikobelia
1
De esa manera, puede administrar la comprobación de claves de host por entorno lógico . No hay un valor de seguridad para verificar las claves de host en las instancias que se pone de pie dinámicamente y eliminar inmediatamente después de la ejecución del libro de jugadas, pero sí existe un valor de seguridad al verificar las claves de host para máquinas persistentes. Por lo tanto, debe tener valores predeterminados diferentes para esos diferentes casos de uso.
nikobelia
2
Si se utiliza algún mecanismo para aprovisionar máquinas nuevas, permanentes o temporales, ese mecanismo debería proporcionarle la clave pública SSH de esta máquina. Luego puede almacenarlo en sus diversos known_hostsarchivos locales para SSH y Ansible para reconocer la máquina. Si no lo hace, especialmente al deshabilitar la comprobación de la clave del host, la seguridad de SSH se degrada a casi cero y permite ataques MITM. Muchas máquinas que parecen estar en una "red interna" están realmente conectadas a Internet, donde una respuesta de DNS más rápida le permite hablar con el atacante en lugar de su objetivo.
aef
2
@TonyH cuando configuré muchos hosts a través de AWS Cloudformation y Ansible, ejecuté ssh-keyscan <ip list>en una máquina confiable (para mí, es un host bastion / jump) dentro de la misma red, y puse los resultados en known_hosts Para configurar ese host confiable, AWS expone el clave de host en los registros de inicio de la instancia, por lo que buscar esa clave fue un paso manual que nunca eliminé si hacía una recreación completa de mi entorno. Pero ese host generalmente no necesitaba ser eliminado. Esto puede ayudar.
dcc310
34

Encontré la respuesta, debe establecer la variable de entorno ANSIBLE_HOST_KEY_CHECKINGen False. Por ejemplo:

ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook ...
Johan
fuente
2
Sí, pero dijiste que estás usando esto para un nuevo servidor que acabas de configurar. Esto evita tener que lidiar con la clave de host esta vez, pero ¿qué pasa con las conexiones SSH posteriores? Su script de configuración se ejecuta, configura el servidor y listo. Ahora tiene otros libros de jugadas que ejecuta, por ejemplo, o tiene scripts que usan SSH. Ahora están rotos porque la clave del host todavía no se encuentra en conocido_hosts. Solo has retrasado tu problema. En resumen, lo que ha escrito aquí no parece una buena respuesta a la pregunta que hizo.
Todd Walton
Esto se usa en un script bash cuando se crean nuevos servidores, no se usa para nada más.
Johan
8

adelante a Nikolaia

Para aquellos que usan jenkins para ejecutar el libro de jugadas, acabo de agregar a mi trabajo de jenkins antes de ejecutar el libro de jugadas ansible la variable de entorno ANSIBLE_HOST_KEY_CHECKING = False. Por ejemplo esto:

export ANSIBLE_HOST_KEY_CHECKING=False
ansible-playbook 'playbook.yml' \
--extra-vars="some vars..." \
--tags="tags_name..." -vv
dsaydon
fuente
6

Cambiar host_key_checkinga falsetodos los hosts es una muy mala idea.

El único momento en que desea ignorarlo es en el "primer contacto", que estas dos tareas lograrán:

    - name: Check SSH known_hosts for {{ inventory_hostname }}
      local_action: shell ssh-keygen -F {{ inventory_hostname }}
      register: checkForKnownHostsEntry
      failed_when: false
      changed_when: false
      ignore_errors: yes
    - name: Add {{ inventory_hostname }} to SSH known hosts automatically
      when: checkForKnownHostsEntry.rc == 1
      changed_when: checkForKnownHostsEntry.rc == 1
      set_fact:
        ansible_ssh_common_args: '-o StrictHostKeyChecking=no'

Por lo tanto, solo desactivamos la comprobación de la clave del host si no tenemos la clave del host en nuestro known_hostsarchivo.

davidolrik
fuente
3

Puede pasarlo como argumento de línea de comando mientras ejecuta el libro de jugadas:

ansible-playbook play.yml --ssh-common-args='-o StrictHostKeyChecking=no'

paresh patil
fuente
2

Si no desea modificar ansible.cfgo playbook.ymlsimplemente puede configurar una variable de entorno:

export ANSIBLE_HOST_KEY_CHECKING=False
Rene B.
fuente
0

Use el parámetro nombrado como validate_certs para ignorar la validación ssh

- ec2_ami:
    instance_id: i-0661fa8b45a7531a7
    wait: yes
    name: ansible
    validate_certs: false
    tags:
      Name: ansible
      Service: TestService

Al hacer esto, ignora el proceso de validación ssh

Nitesh Jain
fuente
El validate_certsparámetro simplemente le dice a boto que no valide el certificado HTTPS API de AWS. No afecta la verificación de la clave SSH.
Matthew Dutton el
0

Sé que la pregunta ha sido respondida y también es correcta, pero solo quería vincular el documento ansible donde se explica claramente cuándo y por qué se debe agregar la verificación respectiva: comprobación de clave de host

justjais
fuente
0

La mayoría de los problemas aparecen cuando desea agregar un nuevo host al inventario dinámico (a través del módulo add_host) en el libro de jugadas. No quiero deshabilitar la comprobación del host de huellas dactilares de forma permanente, por lo que las soluciones como deshabilitarlo en un archivo de configuración global no están bien para mí. Exportar var like ANSIBLE_HOST_KEY_CHECKINGantes de ejecutar Playbook es otra cosa que hacer antes de ejecutar que debe recordarse.

Es mejor agregar el archivo de configuración local en el mismo directorio donde está el libro de jugadas. Cree un archivo llamado ansible.cfgy pegue el siguiente texto:

[defaults]
host_key_checking = False

No es necesario recordar agregar algo en los entornos o agregar a las ansible-playbookopciones. Es fácil poner este archivo en ansible git repo.

QkiZ
fuente