it-swarm.com.de

ansible ssh Eingabeaufforderung known_hosts Problem

Ich verwende Ansible Playbook und es funktioniert einwandfrei auf einem Computer.

Wenn ich es zum ersten Mal auf einem neuen Computer versuche, wird die folgende Fehlermeldung angezeigt.

17:04:34 PLAY [appservers] ************************************************************* 
17:04:34 
17:04:34 GATHERING FACTS *************************************************************** 
17:04:34 fatal: [server02.cit.product-ref.dev] => {'msg': "FAILED: (22, 'Invalid argument')", 'failed': True}
17:04:34 fatal: [server01.cit.product-ref.dev] => {'msg': "FAILED: (22, 'Invalid argument')", 'failed': True}
17:04:34 
17:04:34 TASK: [common | remove old ansible-tmp-*] ************************************* 
17:04:34 FATAL: no hosts matched or all hosts have already failed -- aborting
17:04:34 
17:04:34 
17:04:34 PLAY RECAP ******************************************************************** 
17:04:34            to retry, use: --limit @/var/lib/jenkins/site.retry
17:04:34 
17:04:34 server01.cit.product-ref.dev      : ok=0    changed=0    unreachable=1    failed=0   
17:04:34 server02.cit.product-ref.dev      : ok=0    changed=0    unreachable=1    failed=0   
17:04:34 
17:04:34 Build step 'Execute Shell' marked build as failure
17:04:34 Finished: FAILURE

Dieser Fehler kann behoben werden, wenn ich zuerst zum Quellcomputer gehe (von wo aus ich das ansible Playbook ausführe) und manuell ssh zum Zielcomputer (als angegebener Benutzer) und "yes" für den Eintrag der Datei known_hosts eingebe.

Wenn ich jetzt das gleiche ansible Playbook zum zweiten Mal starte, funktioniert es fehlerfrei.

Wie kann ich daher die Aufforderung unterdrücken, die SSH beim erstmaligen Eintragen von ssh known_hosts für einen bestimmten Benutzer ausgibt (~/.ssh-Ordner, Datei known_hosts)?

Ich habe festgestellt, dass ich dies tun kann, wenn ich die folgenden Konfigurationseinträge in der Datei ~/.ssh/config verwende.

~/.ssh/config

# For vapp virtual machines
Host *
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null
  User kobaloki
  LogLevel ERROR

dh wenn ich den obigen Code in die ~/.ssh/config-Datei des Benutzers eines Remote-Computers lege und Ansible-Playbook zum ersten Mal versuche, werde ich nicht zur Eingabe von "yes" aufgefordert, und das Playbook wird erfolgreich ausgeführt (ohne dass das erforderlich ist) Benutzer, um manuell einen Eintrag für die Datei known_hosts vom Quellcomputer zum Zielcomputer/Remote-Computer zu erstellen).

Meine Fragen: 1. Auf welche Sicherheitsprobleme sollte ich achten, wenn ich ~/.ssh/config gehe? 2. Wie kann ich die Einstellungen (was in der Konfigurationsdatei enthalten ist) als Parameter/Optionen an ansible in der Befehlszeile übergeben, damit es funktioniert? wird das erste Mal auf einem neuen Computer ausgeführt (ohne Aufforderung/abhängig vom Eintrag der Datei known_hosts auf dem Quellcomputer für den Zielcomputer)?

33
Arun Sangal

Die ansible docs haben ein Abschnitt daz . Zitat:

In Ansible 1.2.1 und höher ist die Überprüfung des Hostschlüssels standardmäßig aktiviert.

Wenn ein Host neu installiert wird und ein anderer Schlüssel in "known_hosts" vorhanden ist, wird eine Fehlermeldung angezeigt, bis diese behoben ist. Befindet sich ein Host anfangs nicht in "known_hosts", werden Sie zur Bestätigung des Schlüssels aufgefordert, was zu einer interaktiven Erfahrung führt, wenn Sie Ansible, z. B. cron, verwenden. Das möchten Sie vielleicht nicht.

Wenn Sie die Auswirkungen verstehen und dieses Verhalten deaktivieren möchten, können Sie dies tun, indem Sie /etc/ansible/ansible.cfg oder ~/.ansible.cfg bearbeiten:

[defaults]
Host_key_checking = False

Alternativ kann dies durch eine Umgebungsvariable festgelegt werden:

$ export ANSIBLE_Host_KEY_CHECKING=False

Beachten Sie auch, dass die Überprüfung der Host-Taste im Paramiko-Modus relativ langsam ist. Daher wird bei Verwendung dieser Funktion auch die Umstellung auf "ssh" empfohlen.

38
Ben Whaley

Um die lokale known_hosts - Datei zu aktualisieren, habe ich eine Kombination aus ssh-keyscan (Mit Dig, um einen Hostnamen in eine IP-Adresse aufzulösen) und einem anzeigbaren Modul known_hosts Als verwendet folgt: (Dateiname ssh-known_hosts.yml)

- name: Store known hosts of 'all' the hosts in the inventory file
  hosts: localhost
  connection: local

  vars:
    ssh_known_hosts_command: "ssh-keyscan -T 10"
    ssh_known_hosts_file: "{{ lookup('env','HOME') + '/.ssh/known_hosts' }}"
    ssh_known_hosts: "{{ groups['all'] }}"

  tasks:

  - name: For each Host, scan for its ssh public key
    Shell: "ssh-keyscan {{ item }},`Dig +short {{ item }}`"
    with_items: "{{ ssh_known_hosts }}"
    register: ssh_known_Host_results
    ignore_errors: yes

  - name: Add/update the public key in the '{{ ssh_known_hosts_file }}'
    known_hosts:
      name: "{{ item.item }}"
      key: "{{ item.stdout }}"
      path: "{{ ssh_known_hosts_file }}"
    with_items: "{{ ssh_known_Host_results.results }}"

Um solch ein yml auszuführen, mache

ANSIBLE_Host_KEY_CHECKING=false ansible-playbook path/to/the/yml/above/ssh-known_hosts.yml

Infolgedessen werden für jeden Host in Inventar alle unterstützten Algorithmen in der Datei known_hosts Unter Hostname, IP-Adresse Pair Record hinzugefügt/aktualisiert. sowie

atlanta1.my.com,10.0.5.2 ecdsa-sha2-nistp256 AAAAEjZHN ... NobYTIGgtbdv3K+w=
atlanta1.my.com,10.0.5.2 ssh-rsa AAAAB3NaC1y ... JTyWisGpFeRB+VTKQ7
atlanta1.my.com,10.0.5.2 ssh-ed25519 AAAAC3NaCZD ... UteryYr
denver8.my.com,10.2.13.3 ssh-rsa AAAAB3NFC2 ... 3tGDQDSfJD
...

(Vorausgesetzt, die Inventar Datei sieht so aus:

[master]
atlanta1.my.com
atlanta2.my.com

[slave]
denver1.my.com
denver8.my.com

)

Im Gegensatz zur Antwort von Xiong würde dies den Inhalt der Datei known_hosts Korrekt behandeln.

Dieses Spiel ist besonders hilfreich, wenn Sie eine virtualisierte Umgebung verwenden, in der die Zielhosts neu abgebildet werden (daher werden die SSH-Pub-Schlüssel geändert).

29
Stepan Vavra

Das vollständige Deaktivieren der Host-Schlüsselüberprüfung ist aus Sicherheitssicht eine schlechte Idee, da Sie sich Man-in-the-Middle-Angriffen aussetzen können.

Wenn Sie davon ausgehen können, dass das aktuelle Netzwerk nicht gefährdet ist (dh, wenn Sie zum ersten Mal auf dem Computer sshen und ein Schlüssel angezeigt wird, handelt es sich bei diesem Schlüssel um den Computer und nicht um einen Angreifer), können Sie Folgendes verwenden: ssh-keyscan und das Shell-Modul um die Schlüssel der neuen Server zu Ihrer bekannten Hosts-Datei hinzuzufügen (edit: Stepans Antwort geht das besser):

- name: accept new ssh fingerprints
  Shell: ssh-keyscan -H {{ item.public_ip }} >> ~/.ssh/known_hosts
  with_items: ec2.instances

(Demonstriert hier wie nach ec2 provisioning .)

16
Xiong Chiamiov

Folgen Sie der richtigen Antwort von @Stepan Vavra. Eine kürzere Version ist:

- known_hosts:
    name: "{{ item }}"
    key: "{{ lookup('pipe', 'ssh-keyscan {{ item }},`Dig +short {{ item }}`') }}"
  with_items:
   - google.com
   - github.com
7
user1634074

Würde nicht so etwas tun, um die known_hosts-Datei vorzubereiten:

ANSIBLE_Host_KEY_CHECKING=false ansible all -m ping

Dies sollte eine Verbindung zu jedem Host in der Bestandsliste herstellen, die Datei known_hosts für jeden Host aktualisieren, ohne für jede Eingabeaufforderung "yes" eingeben zu müssen, und dann das Modul "ping" auf jedem Host ausführen.

Ein schneller Test (Löschen meiner known_hosts-Datei, dann Ausführen der obigen, auf einer Ubuntu 16.04-Instanz) schien die known_hosts-Datei mit ihren aktuellen Fingerabdrücken zu füllen.

Die Lösung von @Stepan Vavra hat bei mir nicht funktioniert, da ich Alias-Hosts verwendet habe (es wurde eine Verbindung zu internen IP-Adressen hergestellt, für die kein DNS verfügbar war). Daher wollte ich aussagekräftigere Namen für jeden Host im Inventar und eine ansible_Host-Variable zeigen Sie auf die tatsächliche IP für jeden). Das obige Verfahren war viel einfacher und hat meine known_hosts-Datei vorbereitet, ohne dass die Überprüfung des Hostschlüssels in ansible oder ssh deaktiviert werden musste.

5
Nick Istre

sie können dies auch auf Serverebene einstellen. Sie müssen die ssh-Konfigurationsdatei konfigurieren, um eine ssh-Prüfung auf Eingabeaufforderung zu vermeiden:

bearbeiten Sie den Dateipfad:

/etc/ssh/ssh_config

jetzt die Zeile auskommentieren:

StrictHostKeyChecking no

speichern Sie die Änderungen und das wars

Warnung: Ansible führt keine SSH-Hostschlüsselüberprüfung mehr für Verbindungen mit den obigen Einstellungen durch

1
dsaydon