Wie zu verwenden ansible mit zwei-Faktor-Authentifizierung?
Habe ich aktiviert zwei-Faktor-Authentifizierung für ssh mit duosecurity (mit diesem playbook https://github.com/CoffeeAndCode/ansible-duo ).
Wie kann ich mit ansible zum verwalten der server jetzt. Der SSH-Aufrufe fehlschlagen, auf das sammeln von Fakten, weil dieser. Ich möchte die person, die das playbook zu geben Sie die zwei-Faktor-code vor dem playbook laufen.
Deaktivieren zwei-Faktor-für die Bereitstellung Benutzer ist eine mögliche Lösung, schafft aber eine Frage der Sicherheit, die ich würde ich gerne vermeiden.
- In fast jedem Fall kann ich mir vorstellen, es wäre ein besseres design Wahl sperren ein bastion-host in Ihrem Netzwerk mit 2-Faktor-auth und ermöglichen Ansible ssh ohne es innerhalb des Netzwerks. Als die (technisch auf den Punkt!) Antwort unten sagt, jede Lösung mit, die viel schweres heben eingerichtet ist gonna be so schmerzhaft skalieren ' L entfernen viel von den Vorteil der Verwendung von Ansible in den ersten Platz.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist ein hack, aber man kann tunnel nicht-2fac Ansible SSH-Verbindung durch einen 2fac-fähigen SSH-Verbindung.
Übersicht
Wir richten zwei Benutzer:
ansible
wird der Benutzer Ansible verwenden. Sollte es authentifiziert werden, in einer Weise, die unterstützt von Ansible (d.h., nicht 2fac). Dieser Benutzer eingeschränkt werden, sodass keine Verbindung von überall aus herstellen, aber127.0.0.1
, so ist es nicht zugänglich von außerhalb der Maschine.Der zweite Benutzer
ansible_tunnel
wird offen sein für die Außenwelt, aber authentifiziert werden, von zwei Faktoren ab, und erlaubt nur das Tunneln von SSH-verbindungen auf dem lokalen Rechner.Müssen Sie konfigurieren können, die 2-Faktor-Authentifizierung nur für einige Benutzer (nicht alle).
Einige Infos über SSH-Tunnel.
Auf dem Zielcomputer aus:
ansible
undansible_tunnel
~/.ssh/authorized_keys
von Benutzernansible_tunnel
zu/bin/false
oder Sperre den Benutzer - es wird verwendet für das tunneling ausschließlich, nicht die Ausführung von BefehlenFügen Sie die folgenden
/etc/ssh/sshd_config
:ansible_tunnel
Auf der Maschine läuft Ansible:
Vor der Ausführung von Ansible, führen Sie die folgenden (auf der Ansible Maschine, nicht das Ziel):
Werden Sie authentifiziert werden mithilfe von zwei Faktoren ab.
netstat
), laufen Ansible mitansible_ssh_user=ansible
,ansible_ssh_port=8022
undansible_ssh_host=localhost
.Zusammenfassung
ansible_tunnel
verbinden können, von außen, und es authentifiziert werden mithilfe von zwei Faktoren8022
auf der lokalen Maschine ist die gleiche wie die Verbindung zum sshd auf der remote-Maschineansible
um eine Verbindung über SSH nur, wenn es fertig ist, über den localhost, also nur verbindungen getunnelt werden dürfen- Skala
Diese nicht gut skalierbar ist und auch für mehrere server, auf Grund der Notwendigkeit, öffnen Sie einen separaten tunnel für jede Maschine, die erfordert einen manuellen Eingriff. Allerdings, wenn Sie gewählt haben, zu 2-Faktor-Authentifizierung für den Server bist du schon bereit zu tun, einige manuelle Aktion zu jedem server herstellen, und diese Lösung wird nur hinzufügen, ein wenig overhead mit einigen script-Verpackung.
[BEARBEITET, UM HINZUFÜGEN]
Bonus
Für die Bequemlichkeit, können wir die Anmeldung in der Wartung-Konto direkt zu tun, einige manuelle arbeiten, die ohne Umweg über den Prozess der Einrichtung einen tunnel. Wir können konfigurieren, SSH zu verlangen, 2fac-Authentifizierung: in diesem Fall, unter Beibehaltung der Fähigkeit zu verbinden, ohne 2fac durch den tunnel:
- Lösung mit einem Bastion-Host
Sogar mit einem ssh-bastion host es dauerte eine Weile, bis dies funktioniert. Falls es hilft jemand anderes, hier ist was ich kam mit. Es verwendet die
ControlMaster
ssh-config-Optionen und da ansible verwendet reguläre ssh kann so konfiguriert werden, um den gleichen ssh-features und re-verwenden Sie die Verbindung zum bastion-host, unabhängig davon, wie viele verbindungen es öffnet sich auf remote-hosts. Ich habe gesehen, wie diese Kontrolle Optionen empfohlen im Allgemeinen (vermutlich aus performance-Gründen, wenn Sie eine Menge von hosts), aber nicht im Zusammenhang mit 2FA zu einem bastion-host.Mit diesem Ansatz müssen Sie keine sshd config ändert, so dass Sie wollen
AuthenticationMethods publickey,keyboard-interactive
als einzige Authentifizierungsmethode Einstellung auf dem bastion-server, undpublickey
nur für alle anderen Server, du bist proxying durch die bastion zu gelangen. Da der bastion-host ist die einzige, die akzeptiert externe verbindungen aus dem internet, es ist die einzige, die erfordert, 2FA, und interne hosts verlassen sich auf das agent-forwarding für public-key-Authentifizierung aber nicht verwenden 2FA.Auf dem client, ich habe eine neue ssh-config-Datei für meine ansible Umgebung, in der top-level-Verzeichnis, das ich laufen, ansible aus (also Geschwister von ansible.cfg) aufgerufen
ssh.config
. Es enthält:Dann in ansible.cfg habe ich:
Einige Dinge zu beachten:
Meiner privaten Subnetz ist in diesem Fall 10.0.0.0/16, - Karten an den host-wildcard-option von oben. Die bastion proxies alle ssh-verbindungen zu Servern auf dieses Subnetz.
Dies ist ein wenig spröde, ich kann nur meine ssh-oder ansible-Befehle in diesem Verzeichnis, weil der
ProxyCommand
übergabe ist der lokale Pfad zu dieser Konfigurationsdatei. Leider habe ich glaube nicht, dass es einen ssh-variable, die Karten für die aktuelle config-Datei verwendet, so dass ich an der selben config-Datei, um die ProxyCommand automatisch. Je nach Umgebung könnte es besser sein, verwenden Sie einen absoluten Pfad für dieses.Die eine gotcha ist, macht es ausgeführt ansible komplexer. Leider, was ich sagen kann, ansible hat keinerlei Unterstützung für 2FA. Also, wenn Sie keine bestehende ssh-Verbindung auf die bastion, ansible wird, drucken Sie
Verification code:
einmal für jeden privaten server herstellen, aber es ist nicht wirklich Zuhören für die Eingabe, so egal, was Sie tun, die verbindungen fehl.Also habe ich zuerst ausführen:
ssh -F ssh.config bastion-persistent-connection
Dies schafft die socket-Datei in
~/.ssh/ansible-*
ist und der ssh-agent lokal zu schließen & entfernen Sie den sockel nach der einstellbaren Zeit (was habe ich zu 10m).Sobald der socket ist offen, ich kann laufen, ansible Befehlen, wie normale, z.B.
ansible all -m ping
- und es gelingt.ControlPath ~/.ansible/cp/ansible-ssh-%h-%p-%r
entspricht Ansible Standardcontrol_path
. docs.ansible.com/ansible/intro_configuration.html#control-path