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.
Es ist ein Hack, aber Sie können eine nicht-2fac-fähige SSH-Verbindung durch eine 2fac-fähige SSH-Verbindung tunneln.
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 .
ansible
und ansible_tunnel
~/.ssh/authorized_keys
beider Benutzer ansible_tunnel
auf /bin/false
, oder sperren Sie den Benutzer - er wird ausschließlich zum Tunneln verwendet, nicht zum Ausführen von Befehlen Fügen Sie Folgendes zu /etc/ssh/sshd_config
hinzu:
ansible_tunnel
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.
netstat
), führen Sie Ansible mit ansible_ssh_user=ansible
, ansible_ssh_port=8022
und ansible_ssh_host=localhost
. ansible_tunnel
kann sich von außen verbinden und wird mit zwei Faktoren authentifiziert: 8022
auf dem lokalen Rechner identisch mit der Verbindung zu sshd auf dem entfernten Rechner ansible
, sich nur dann über SSH zu verbinden, wenn dies über den localhost geschieht, so dass nur Verbindungen erlaubt sind, die getunnelt sind 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]
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%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:
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.
Tags und Links ssh ansible ansible-playbook two-factor-authentication