Wie benutze ansible mit Zwei-Faktor-Authentifizierung?

8

Ich habe die Zwei-Faktor-Authentifizierung für ssh mit Duosecurity aktiviert (mit diesem Playbook Ссылка ).

Wie kann ich mit ansible den Server jetzt verwalten? Die SSH-Aufrufe scheitern deswegen beim Sammeln von Fakten. Ich möchte, dass die Person, die das Playbook ausführt, den Code mit den beiden Faktoren eingibt, bevor das Playbook ausgeführt wird.

Die Deaktivierung von zwei Faktoren für den Bereitstellungsbenutzer ist eine mögliche Lösung, erzeugt aber ein Sicherheitsproblem, das ich gerne vermeiden möchte.

    
Harshil Mathur 16.04.2014, 16:56
quelle

2 Antworten

6

Es ist ein Hack, aber Sie können eine nicht-2fac-fähige SSH-Verbindung durch eine 2fac-fähige SSH-Verbindung tunneln.

Überblick

Wir werden zwei Benutzer einrichten: ansible wird der Benutzer sein, den Ansible benutzen wird. Es sollte auf eine Weise authentifiziert werden, die von Ansible unterstützt wird (d. H. Nicht 2fac). Dieser Benutzer wird eingeschränkt, so dass er sich nicht von irgendwo außer 127.0.0.1 verbinden kann. Daher ist er von außerhalb des Rechners nicht erreichbar.

Der zweite Benutzer, ansible_tunnel , ist für die Außenwelt offen, wird jedoch durch zwei Faktoren authentifiziert und erlaubt nur das Tunneln von SSH-Verbindungen zum lokalen Rechner.

Sie müssen die 2-Faktor-Authentifizierung nur für einige Benutzer (nicht alle) konfigurieren können.

Einige Informationen auf SSH-Tunnel .

Auf dem Zielrechner:

  1. Erstellen Sie zwei Benutzer: ansible und ansible_tunnel
  2. Setzen Sie Ihren öffentlichen Schlüssel in ~/.ssh/authorized_keys beider Benutzer
  3. Setzen Sie die Shell von ansible_tunnel auf /bin/false , oder sperren Sie den Benutzer - er wird ausschließlich zum Tunneln verwendet, nicht zum Ausführen von Befehlen
  4. Fügen Sie Folgendes zu /etc/ssh/sshd_config hinzu:

    %Vor%
  5. Setup 2-Faktor-Authentifizierung nur für ansible_tunnel
  6. Starten Sie sshd neu

Auf der Maschine läuft Ansible:

  1. Bevor Sie Ansible ausführen, führen Sie Folgendes aus (auf der Ansible-Maschine, nicht auf dem Ziel):

    %Vor%

    Sie werden mit zwei Faktoren authentifiziert.

  2. Sobald der Tunnel fertig ist (überprüfen Sie mit netstat ), führen Sie Ansible mit ansible_ssh_user=ansible , ansible_ssh_port=8022 und ansible_ssh_host=localhost .
  3. aus

Wiederholen

  • Nur ansible_tunnel kann sich von außen verbinden und wird mit zwei Faktoren authentifiziert:
  • Sobald der Tunnel eingerichtet ist, ist die Verbindung zum Port 8022 auf dem lokalen Rechner identisch mit der Verbindung zu sshd auf dem entfernten Rechner
  • Wir erlauben ansible , sich nur dann über SSH zu verbinden, wenn dies über den localhost geschieht, so dass nur Verbindungen erlaubt sind, die getunnelt sind

Maßstab

Dies ist für mehrere Server nicht gut skalierbar, da für jede Maschine ein separater Tunnel geöffnet werden muss, der manuelle Aktionen erfordert. Wenn Sie jedoch die 2-Faktor-Authentifizierung für Ihre Server gewählt haben, sind Sie bereits bereit, einige manuelle Maßnahmen zu ergreifen, um eine Verbindung zu jedem Server herzustellen, und diese Lösung fügt nur einen kleinen Overhead mit etwas Script-Wrapping hinzu.

[BEARBEITET]

Bonus

Aus praktischen Gründen möchten wir uns möglicherweise direkt in das Wartungskonto einloggen, um einige manuelle Arbeiten durchzuführen, ohne den Tunnel einzurichten. Wir können SSH so konfigurieren, dass in diesem Fall die 2fac-Authentifizierung erforderlich ist, während die Verbindung ohne 2fac durch den Tunnel aufrechterhalten werden kann:

%Vor%     
z9u2k 27.09.2015 21:26
quelle
2

Lösung, die einen Bastion-Host verwendet

Selbst mit einem SSH-Bastion-Host brauchte ich eine ganze Weile, bis das funktionierte. Falls es jemand anderem hilft, hier ist, was ich mir ausgedacht habe. Es verwendet die Konfigurationsoptionen ControlMaster ssh und da ansible reguläre SSH verwendet, kann es so konfiguriert werden, dass es dieselben ssh-Funktionen verwendet und die Verbindung zum Bastion-Host unabhängig von der Anzahl der Verbindungen zu Remote-Hosts wiederverwendet. Ich habe diese Control-Optionen im Allgemeinen empfohlen (vermutlich aus Performance-Gründen, wenn Sie viele Hosts haben), aber nicht im Kontext von 2FA zu einem Bastion-Host.

Bei diesem Ansatz brauchen Sie keine sshd-Konfigurationsänderungen, daher sollten Sie AuthenticationMethods publickey,keyboard-interactive als einzige Authentifizierungsmethode auf dem Bastion-Server und publickey nur für alle anderen Server, die Sie als Proxy-Server verwenden, verwenden durch die Bastion zu kommen. Da der Bastion-Host der einzige ist, der externe Verbindungen aus dem Internet akzeptiert, ist dies der einzige, der 2FA benötigt, und interne Hosts verlassen sich auf die Weiterleitung des Agenten für die Authentifizierung mit öffentlichen Schlüsseln, verwenden aber nicht 2FA.

Auf dem Client habe ich eine neue ssh config-Datei für meine ansible-Umgebung in dem Verzeichnis der obersten Ebene erstellt, auf dem ich ansible (so sibling of ansible.cfg) namens ssh.config ausführe. Es enthält:

%Vor%

Dann in ansible.cfg habe ich:

%Vor%

Ein paar Dinge zu beachten:

  • Mein privates Subnetz ist in diesem Fall 10.0.0.0/16, das der Host-Platzhalteroption oben zugeordnet ist. Die Bastion stellt alle SSH-Verbindungen zu Servern in diesem Subnetz her.

  • Das ist ein bisschen spröde, da ich nur meine ssh- oder ansible-Befehle in diesem Verzeichnis ausführen kann, weil ProxyCommand den lokalen Pfad zu dieser Konfigurationsdatei übergibt. Leider glaube ich nicht, dass es eine ssh-Variable gibt, die der aktuellen Konfigurationsdatei entspricht, so dass ich die gleiche Konfigurationsdatei automatisch an den ProxyCommand übergeben kann. Abhängig von Ihrer Umgebung ist es möglicherweise besser, hierfür einen absoluten Pfad zu verwenden.

Das eine ist, dass es das Laufen komplexer macht. Leider kann ich sagen, dass ich keinerlei Unterstützung für 2FA habe. Wenn Sie also keine SSH-Verbindung zur Bastion haben, wird ansible Verification code: einmal für jeden privaten Server ausgeben, mit dem es sich verbindet, aber es hört nicht wirklich auf die Eingabe, so dass die Verbindungen nicht funktionieren.

>

Also starte ich zuerst: ssh -F ssh.config bastion-persistent-connection

Dies erstellt die Socket-Datei in ~/.ssh/ansible-* , und der ssh-Agent schließt lokal & amp; entferne diesen Socket nach der konfigurierbaren Zeit (was ich auf 10m eingestellt habe).

Sobald der Sockel offen ist, kann ich wie üblich Befehle ausführen, z. ansible all -m ping und sie sind erfolgreich.

    
danny 13.02.2017 19:55
quelle