Comment ignorer la vérification d'authenticité SSH ansible?

165

Existe-t-il un moyen d'ignorer la vérification d'authenticité SSH effectuée par Ansible? Par exemple, lorsque je viens de configurer un nouveau serveur, je dois répondre oui à cette question:

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)?

Je sais que c'est généralement une mauvaise idée, mais j'intègre cela dans un script qui crée d'abord un nouveau serveur virtuel chez mon fournisseur de cloud, puis appelle automatiquement mon playbook ansible pour le configurer. Je souhaite éviter toute intervention humaine au milieu de l'exécution du script.

Johan
la source

Réponses:

248

Deux options - la première, comme vous l'avez dit dans votre propre réponse, consiste à définir la variable d'environnement ANSIBLE_HOST_KEY_CHECKINGsur False.

La deuxième façon de le définir est de le placer dans un fichier ansible.cfg, et c'est une option très utile car vous pouvez soit définir cela globalement (au niveau du système ou de l'utilisateur, dans /etc/ansible/ansible.cfgou ~/.ansible.cfg), soit dans un fichier de configuration dans le même répertoire en tant que playbook que vous exécutez.

Pour ce faire, créez un ansible.cfgfichier dans l'un de ces emplacements et incluez ceci:

[defaults]
host_key_checking = False

Vous pouvez également définir de nombreux autres paramètres par défaut utiles, comme s'il faut ou non rassembler des faits au début d'une lecture, fusionner les hachages déclarés à plusieurs endroits ou en remplacer un par un autre, etc. Il y a une grande liste d'options ici dans la documentation Ansible.


Edit: une note sur la sécurité.

La validation de la clé d'hôte SSH est une couche de sécurité significative pour les hôtes persistants - si vous vous connectez plusieurs fois à la même machine, il est utile d'accepter la clé d'hôte localement.

Pour les instances EC2 à plus longue durée de vie, il serait logique d'accepter la clé d'hôte avec une tâche exécutée une seule fois lors de la création initiale de l'instance:

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

Il n'y a pas de valeur de sécurité pour vérifier les clés d'hôte sur les instances que vous mettez en place dynamiquement et supprimez juste après l'exécution du playbook, mais il y a une valeur de sécurité dans la vérification des clés d'hôte pour les machines persistantes. Vous devez donc gérer la vérification des clés d'hôte différemment par environnement logique.

  • Laisser la vérification activée par défaut (dans ~/.ansible.cfg)
  • Désactivez la vérification des clés d'hôte dans le répertoire de travail pour les playbooks que vous exécutez sur des instances éphémères ( ./ansible.cfgparallèlement au playbook pour les tests unitaires contre les VM vagabondes, l'automatisation pour les instances ec2 de courte durée)
Nikobelia
la source
5
Quelqu'un sait quelle est la meilleure pratique ici? Par exemple, vous pouvez exécuter périodiquement un script pour réinitialiser vos hôtes connus, ce qui serait plus sûr (à moins d'être soumis à une attaque MITM pendant cette fenêtre). Ignorer l'authenticité par défaut élimine l'un des principaux mécanismes de sécurité SSH
TonyH
3
J'aime le modèle utilisé par mon équipe: nous mettons des fichiers ansible.cfg qui désactivent la vérification des clés d'hôte dans les répertoires de travail des playbooks que nous exécutons sur des instances éphémères (tests unitaires exécutés sur des VM vagabondes, des instances AWS ec2, etc.) et laissons la vérification activée à niveau système.
nikobelia
1
De cette façon, vous pouvez gérer la vérification des clés d'hôte par environnement logique . Il n'y a pas de valeur de sécurité pour vérifier les clés d'hôte sur les instances que vous mettez en place dynamiquement et supprimez juste après l'exécution du playbook, mais il y a une valeur de sécurité dans la vérification des clés d'hôte pour les machines persistantes. Vous devriez donc avoir des valeurs par défaut différentes pour ces différents cas d'utilisation.
nikobelia
2
Si un mécanisme est utilisé pour provisionner de nouvelles machines, permanentes ou temporaires, ce mécanisme devrait vous fournir la clé publique SSH de cette machine. Vous pouvez ensuite le stocker dans vos différents known_hostsfichiers locaux pour que SSH et Ansible reconnaissent la machine. Ne pas le faire, notamment en désactivant la vérification des clés d'hôte, dégrade la sécurité de SSH à presque zéro et autorise les attaques MITM. De nombreuses machines considérées comme faisant partie d'un «réseau interne» sont en fait connectées à Internet, où une seule réponse DNS plus rapide vous permet de parler à l'attaquant plutôt qu'à votre cible.
aef
2
@TonyH lors de la configuration de nombreux hôtes via AWS Cloudformation et Ansible, j'ai exécuté ssh-keyscan <ip list>sur une machine de confiance (pour moi, c'est un hôte bastion / jump) dans le même réseau, et j'ai mis les résultats dans known_hosts Pour configurer cet hôte de confiance, AWS expose le clé hôte dans les journaux de démarrage de l'instance, donc la recherche de cette clé était une étape manuelle que je n'ai jamais supprimée si je faisais une recréation complète de mon environnement. Mais cet hôte n'avait généralement pas besoin d'être supprimé. Cela peut aider.
dcc310
34

J'ai trouvé la réponse, vous devez définir la variable d'environnement ANSIBLE_HOST_KEY_CHECKINGsur False. Par exemple:

ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook ...
Johan
la source
2
Oui, mais vous avez dit que vous l'utilisiez pour un nouveau serveur que vous venez de configurer. Cela évite d'avoir à gérer la clé d'hôte cette fois, mais qu'en est-il des connexions SSH suivantes? Votre script d'installation s'exécute, configure le serveur et c'est fait. Vous avez maintenant d'autres playbooks que vous exécutez, par exemple, ou vous avez des scripts qui utilisent SSH. Maintenant, ils sont cassés car la clé d'hôte n'est toujours pas dans known_hosts. Vous avez seulement retardé votre problème. En bref, ce que vous avez écrit ici ne semble pas être une bonne réponse à la question que vous avez posée.
Todd Walton
Ceci est utilisé dans un script bash lors de la création de nouveaux serveurs, il ne sert à rien d'autre.
Johan le
8

hâte à nikobelia

Pour ceux qui utilisent jenkins pour exécuter le livre de jeu, je viens d'ajouter à mon travail jenkins avant d'exécuter le livre de jeu ansible la variable d'environnement ANSIBLE_HOST_KEY_CHECKING = False Par exemple ceci:

export ANSIBLE_HOST_KEY_CHECKING=False
ansible-playbook 'playbook.yml' \
--extra-vars="some vars..." \
--tags="tags_name..." -vv
Dsaydon
la source
6

La modification host_key_checkingde falsetous les hôtes est une très mauvaise idée.

La seule fois où vous voulez l'ignorer, c'est au «premier contact», que ces deux tâches accompliront:

    - 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'

Nous désactivons donc la vérification de la clé d'hôte uniquement si nous n'avons pas la clé d'hôte dans notre known_hostsfichier.

Davidolrik
la source
3

Vous pouvez le transmettre en tant qu'argument de ligne de commande lors de l'exécution du playbook:

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

paresh patil
la source
2

Si vous ne souhaitez pas modifier ansible.cfgou le, playbook.ymlvous pouvez simplement définir une variable d'environnement:

export ANSIBLE_HOST_KEY_CHECKING=False
René B.
la source
1

Ignorer la vérification est une mauvaise idée car cela vous rend vulnérable aux attaques de l'homme du milieu.

J'ai pris la liberté d'améliorer la réponse de nikobelia en n'ajoutant qu'une seule fois la clé de chaque machine et en définissant le statut ok / changé dans Ansible:

- name: Accept EC2 SSH host keys
  connection: local
  become: false
  shell: |
    ssh-keygen -F {{ inventory_hostname }} || 
      ssh-keyscan -H {{ inventory_hostname }} >> ~/.ssh/known_hosts
  register: known_hosts_script
  changed_when: "'found' not in known_hosts_script.stdout"

Cependant, Ansible commence à rassembler des faits avant l'exécution du script, ce qui nécessite une connexion SSH, nous devons donc désactiver cette tâche ou la déplacer manuellement vers plus tard:

- name: Example play
  hosts: all
  gather_facts: no  # gather facts AFTER the host key has been accepted instead

  tasks:

  # /programming/32297456/
  - name: Accept EC2 SSH host keys
    connection: local
    become: false
    shell: |
      ssh-keygen -F {{ inventory_hostname }} ||
        ssh-keyscan -H {{ inventory_hostname }} >> ~/.ssh/known_hosts
    register: known_hosts_script
    changed_when: "'found' not in known_hosts_script.stdout"
  
  - name: Gathering Facts
    setup:

Un problème que je n'ai pas réussi à résoudre est qu'il marque tout comme modifié même s'il n'ajoute qu'une seule clé. Si quelqu'un pouvait apporter une solution, ce serait génial!

xjcl
la source
0

Utilisez le paramètre nommé validate_certs pour ignorer la validation ssh

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

En faisant cela, il ignore le processus de validation ssh

Nitesh Jain
la source
Le validate_certsparamètre indique simplement à boto de ne pas valider le certificat HTTPS de l'API AWS. Cela n'affecte pas la vérification de la clé SSH.
Matthew Dutton
0

Je sais que la question a été répondue et qu'elle est correcte aussi, mais je voulais juste lier le document ansible où il est expliqué clairement quand et pourquoi la vérification respective devrait être ajoutée: vérification de la clé de l'hôte

Justjais
la source
0

La plupart des problèmes apparaissent lorsque vous souhaitez ajouter un nouvel hôte à l'inventaire dynamique (via le module add_host) dans le playbook. Je ne veux pas désactiver de manière permanente la vérification de l'hôte d'empreintes digitales, donc des solutions telles que la désactivation dans un fichier de configuration globale ne me conviennent pas. Exporter var comme ANSIBLE_HOST_KEY_CHECKINGavant d'exécuter playbook est une autre chose à faire avant de l'exécuter et dont il faut se souvenir.

Il est préférable d'ajouter le fichier de configuration local dans le même répertoire que celui du playbook. Créez le fichier nommé ansible.cfget collez le texte suivant:

[defaults]
host_key_checking = False

Inutile de vous rappeler d'ajouter quelque chose dans les variables d'environnement ou d'ajouter des ansible-playbookoptions. Il est facile de mettre ce fichier dans un repo git ansible.

QkiZ
la source