Wie ignoriere ich die ansible SSH-Authentizitätsprüfung?

164

Gibt es eine Möglichkeit, die von Ansible durchgeführte SSH-Authentizitätsprüfung zu ignorieren? Wenn ich zum Beispiel gerade einen neuen Server eingerichtet habe, muss ich diese Frage mit Ja beantworten:

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

Ich weiß, dass dies im Allgemeinen eine schlechte Idee ist, aber ich baue dies in ein Skript ein, das zuerst einen neuen virtuellen Server bei meinem Cloud-Anbieter erstellt und dann automatisch mein ansible Playbook aufruft, um ihn zu konfigurieren. Ich möchte jegliche menschliche Intervention während der Skriptausführung vermeiden.

Johan
quelle

Antworten:

246

Zwei Optionen - die erste, wie Sie in Ihrer eigenen Antwort gesagt haben, besteht darin, die Umgebungsvariable ANSIBLE_HOST_KEY_CHECKINGauf False zu setzen.

Die zweite Möglichkeit, es festzulegen, besteht darin, es in einer ansible.cfg-Datei abzulegen. Dies ist eine sehr nützliche Option, da Sie diese entweder global (auf System- oder Benutzerebene, in /etc/ansible/ansible.cfgoder ~/.ansible.cfg) oder in einer Konfigurationsdatei im selben Verzeichnis festlegen können als das Playbook, das Sie ausführen.

Erstellen Sie dazu eine ansible.cfgDatei an einem dieser Speicherorte und fügen Sie Folgendes hinzu:

[defaults]
host_key_checking = False

Sie können dort auch viele andere praktische Standardeinstellungen festlegen, z. B. ob zu Beginn eines Spiels Fakten gesammelt werden sollen oder nicht, ob an mehreren Stellen deklarierte Hashes zusammengeführt oder durch andere ersetzt werden sollen usw. Hier in den Ansible-Dokumenten finden Sie eine große Liste von Optionen .


Bearbeiten: ein Hinweis zur Sicherheit.

Die SSH-Hostschlüsselüberprüfung ist eine sinnvolle Sicherheitsschicht für persistente Hosts. Wenn Sie mehrmals eine Verbindung zu demselben Computer herstellen, ist es hilfreich, den Hostschlüssel lokal zu akzeptieren.

Bei längerlebigen EC2-Instanzen ist es sinnvoll, den Hostschlüssel mit einer Aufgabe zu akzeptieren, die bei der ersten Erstellung der Instanz nur einmal ausgeführt wird :

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

Es gibt keinen Sicherheitswert für die Überprüfung von Hostschlüsseln in Instanzen, die Sie dynamisch aufstehen und direkt nach der Ausführung des Playbooks entfernen. Es gibt jedoch einen Sicherheitswert für die Überprüfung von Hostschlüsseln auf persistente Computer. Daher sollten Sie die Überprüfung des Hostschlüssels je nach logischer Umgebung unterschiedlich verwalten.

  • Lassen Sie die Überprüfung standardmäßig aktiviert (in ~/.ansible.cfg).
  • ./ansible.cfgDeaktivieren Sie die Hostschlüsselprüfung im Arbeitsverzeichnis für Playbooks, die Sie für kurzlebige Instanzen ausführen ( neben dem Playbook für Komponententests gegen vagabundierende VMs, Automatisierung für kurzlebige ec2-Instanzen).
Nikobelia
quelle
5
Weiß jemand, was hier die beste Praxis ist? Sie können beispielsweise regelmäßig ein Skript ausführen, um Ihre bekannten Hosts zurückzusetzen. Dies wäre sicherer (es sei denn, Sie sind in diesem Fenster einem MITM-Angriff ausgesetzt). Das standardmäßige Ignorieren der Authentizität eliminiert einen der primären SSH-Sicherheitsmechanismen
TonyH
3
Ich mag das Muster, das mein Team verwendet: Wir fügen ansible.cfg-Dateien, die die Überprüfung von Hostschlüsseln deaktivieren, in die Arbeitsverzeichnisse für Playbooks ein, die wir für kurzlebige Instanzen ausführen (Komponententests, die auf vagabundierenden VMs, AWS ec2-Instanzen usw. ausgeführt werden), und lassen die Überprüfung bei aktiviert System Level.
Nikobelia
1
Auf diese Weise können Sie die Überprüfung des Hostschlüssels pro logischer Umgebung verwalten . Es gibt keinen Sicherheitswert für die Überprüfung von Hostschlüsseln in Instanzen, die Sie dynamisch aufstehen und direkt nach der Ausführung des Playbooks entfernen. Es gibt jedoch einen Sicherheitswert für die Überprüfung von Hostschlüsseln auf persistente Computer. Sie sollten also unterschiedliche Standardeinstellungen für diese unterschiedlichen Anwendungsfälle haben.
Nikobelia
2
Wenn ein Mechanismus zum Bereitstellen neuer permanenter oder temporärer Computer verwendet wird, sollte dieser Mechanismus Ihnen den öffentlichen SSH-Schlüssel dieses Computers bereitstellen. Sie können es dann in Ihren verschiedenen lokalen known_hostsDateien speichern, damit SSH und Ansible den Computer erkennen können. Wenn Sie dies nicht tun, insbesondere durch Deaktivieren der Hostschlüsselprüfung, wird die Sicherheit von SSH auf nahezu Null herabgesetzt und MITM-Angriffe werden zugelassen. Viele Computer, die sich in einem "internen Netzwerk" befinden, sind tatsächlich mit dem Internet verbunden. Über eine einzige schnellere DNS-Antwort können Sie mit dem Angreifer anstelle Ihres Ziels sprechen.
Aef
2
@TonyH Beim Einrichten vieler Hosts über AWS Cloudformation und Ansible lief ich ssh-keyscan <ip list>auf einem vertrauenswürdigen Computer (für mich ist es ein Bastion / Jump-Host) im selben Netzwerk und gab die Ergebnisse in ein. known_hosts Zum Einrichten dieses vertrauenswürdigen Hosts stellt AWS das zur Verfügung Host-Schlüssel in den Startprotokollen der Instanz, daher war die Suche nach diesem Schlüssel ein manueller Schritt, den ich nie herausgeschnitten habe, wenn ich meine Umgebung vollständig neu erstellt habe. Dieser Host musste jedoch normalerweise nicht gelöscht werden. Dies kann helfen.
dcc310
34

Ich habe die Antwort gefunden, Sie müssen die Umgebungsvariable ANSIBLE_HOST_KEY_CHECKINGauf setzen False. Beispielsweise:

ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook ...
Johan
quelle
2
Ja, aber Sie sagten, Sie verwenden dies für einen neuen Server, den Sie gerade eingerichtet haben. Dadurch wird vermieden, dass Sie sich diesmal mit dem Hostschlüssel befassen müssen. Wie steht es jedoch mit nachfolgenden SSH-Verbindungen? Ihr Setup-Skript wird ausgeführt, der Server konfiguriert und fertig. Jetzt haben Sie andere Playbooks, die Sie beispielsweise ausführen, oder Sie haben Skripte, die SSH verwenden. Jetzt sind sie kaputt, weil sich der Hostschlüssel immer noch nicht in unknown_hosts befindet. Sie haben Ihr Problem nur verzögert. Kurz gesagt, was Sie hier geschrieben haben, klingt nicht nach einer guten Antwort auf die Frage, die Sie gestellt haben.
Todd Walton
Dies wird in einem Bash-Skript beim Erstellen neuer Server verwendet, es wird für nichts anderes verwendet.
Johan
7

vorwärts zu nikobelia

Für diejenigen, die Jenkins zum Ausführen des Playbooks verwenden, habe ich meinem Jenkins-Job vor dem Ausführen des Ansible-Playbooks die Umgebungsvariable ANSIBLE_HOST_KEY_CHECKING = False hinzugefügt. Beispiel:

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

Ändern host_key_checkingan falsefür alle Hosts ist eine sehr schlechte Idee.

Das einzige Mal, wenn Sie es ignorieren möchten, ist der "erste Kontakt", den diese beiden Aufgaben ausführen:

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

Daher deaktivieren wir die Hostschlüsselprüfung nur, wenn wir den Hostschlüssel nicht in unserer known_hostsDatei haben.

davidolrik
quelle
3

Sie können es als Befehlszeilenargument übergeben, während Sie das Playbook ausführen:

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

Paresh Patil
quelle
2

Wenn Sie nicht wollen , ändern ansible.cfgoder die playbook.ymldann können Sie nur eine Umgebungsvariable gesetzt:

export ANSIBLE_HOST_KEY_CHECKING=False
Rene B.
quelle
0

Verwenden Sie den Parameter validate_certs, um die SSH-Validierung zu ignorieren

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

Auf diese Weise wird der SSH-Validierungsprozess ignoriert

Nitesh Jain
quelle
Der validate_certsParameter weist boto einfach an, das HTTPS-Zertifikat der AWS-API nicht zu validieren. Dies hat keinen Einfluss auf die Überprüfung des SSH-Schlüssels.
Matthew Dutton
0

Ich weiß, dass die Frage beantwortet wurde und auch richtig ist, wollte aber nur das ansible Dokument verknüpfen, in dem klar erklärt wird, wann und warum die jeweilige Prüfung hinzugefügt werden sollte: Host-Key-Prüfung

justjais
quelle
0

Die meisten Probleme treten auf, wenn Sie dem dynamischen Inventar (über das Modul add_host) im Playbook einen neuen Host hinzufügen möchten. Ich möchte die Überprüfung des Fingerabdruck-Hosts nicht dauerhaft deaktivieren, daher sind Lösungen wie das Deaktivieren in einer globalen Konfigurationsdatei für mich nicht in Ordnung. Das Exportieren von var wie ANSIBLE_HOST_KEY_CHECKINGvor dem Ausführen von Playbook ist eine weitere Aufgabe, die vor dem Ausführen ausgeführt werden muss.

Es ist besser, eine lokale Konfigurationsdatei in demselben Verzeichnis hinzuzufügen, in dem sich das Playbook befindet. Erstellen Sie eine Datei mit dem Namen ansible.cfgund fügen Sie folgenden Text ein:

[defaults]
host_key_checking = False

Sie müssen nicht daran denken, etwas in env vars hinzuzufügen oder ansible-playbookOptionen hinzuzufügen . Es ist einfach, diese Datei auf ansible git repo zu stellen.

QkiZ
quelle