Ich möchte ansible verwenden , um eine Gruppe vorhandener Server zu verwalten. Ich habe eine ansible_hosts
Datei erstellt und erfolgreich (mit der -K
Option) mit Befehlen getestet , die nur auf einen einzelnen Host abzielen
ansible -i ansible_hosts host1 --sudo -K # + commands ...
Mein Problem ist jetzt, dass die Benutzerkennwörter auf jedem Host unterschiedlich sind, aber ich finde keine Möglichkeit, dies in Ansible zu handhaben.
Unter Verwendung von -K
wird nur ein einziges Sudo-Kennwort im Voraus abgefragt, das dann ohne Aufforderung für alle nachfolgenden Hosts versucht zu werden scheint:
host1 | ...
host2 | FAILED => Incorrect sudo password
host3 | FAILED => Incorrect sudo password
host4 | FAILED => Incorrect sudo password
host5 | FAILED => Incorrect sudo password
Bisherige Forschung:
eine StackOverflow-Frage mit einer falschen Antwort ("use
-K
") und einer Antwort des Autors "Found out I needed passwordless sudo"In den Ansible-Dokumenten heißt es: "Die Verwendung von Sudo ohne Passwort erleichtert die Automatisierung, ist jedoch nicht erforderlich ." (Hervorhebung von mir)
Diese Sicherheits-StackExchange-Frage wird als gelesen betrachtet und
NOPASSWD
ist erforderlichArtikel "Skalierbare und verständliche Bereitstellung ...", der besagt:
"Für die Ausführung von sudo muss möglicherweise ein Kennwort eingegeben werden. Dies ist eine sichere Methode, um Ansible für immer zu blockieren. Eine einfache Lösung besteht darin, visudo auf dem Zielhost auszuführen und sicherzustellen, dass der Benutzer, mit dem sich Ansible anmeldet, kein Kennwort eingeben muss."
Artikel "Basic Ansible Playbooks" , in dem es heißt
"Ansible könnte sich als root auf dem Zielserver anmelden und die Notwendigkeit von sudo vermeiden oder dem ansiblen Benutzer sudo ohne Passwort erlauben, aber der Gedanke daran lässt meine Milz drohen, meine Speiseröhre aufzuspringen und meine Luftröhre zu blockieren, so dass ich nicht "
Meine Gedanken genau, aber wie soll man sich dann über einen einzelnen Server hinaus erstrecken?
ansible Ausgabe # 1227 , "Ansible sollte alle Benutzer in einem Wiedergabebuch nach dem Sudo-Passwort fragen", die vor einem Jahr von mpdehaan mit dem Kommentar "Habe keine große Nachfrage dafür gesehen, ich denke, die meisten Leute reden nur von einem Benutzerkonto oder die meiste Zeit mit Schlüsseln. "
Also ... wie nutzen Menschen Ansible in solchen Situationen? Einstellung NOPASSWD
in /etc/sudoers
, über Hosts Wiederverwendung Passwort oder ermöglicht Root SSH - Login alle scheinen ziemlich drastische Verringerungen der Sicherheit.
sudo
(für die noch ein Kennwort erforderlich sein sollte).ansible_ssh_password
Einstellung gilt nur für das SSH-Passwort (der Hinweis ist im Namen ...). & Ich verwende bereits die schlüsselbasierte SSH-Anmeldung.Antworten:
Sie haben sicherlich Ihre Forschung getan ...
Nach all meinen Erfahrungen mit Ansible wird das, was Sie erreichen möchten, nicht unterstützt. Wie Sie bereits erwähnt haben, gibt ansible an, dass kein passwortloses sudo erforderlich ist, und Sie haben Recht, dass dies nicht der Fall ist. Aber ich habe noch keine Methode gefunden, um mehrere sudo-Passwörter in ansible zu verwenden, ohne natürlich mehrere configs auszuführen.
Also, ich kann nicht genau die Lösung anbieten, die Sie suchen, aber Sie haben gefragt ...
Ich kann Ihnen eine Ansicht dazu geben. Mein Anwendungsfall sind 1k-Knoten in mehreren Rechenzentren, die eine globale SaaS-Firma unterstützen, in der ich aufgrund der Art unseres Geschäfts einige wahnsinnig strenge Sicherheitskontrollen entwerfen / implementieren muss. Sicherheit ist immer ein Balanceakt, mehr Benutzerfreundlichkeit und weniger Sicherheit. Dieser Prozess ist nicht anders, wenn Sie 10 Server oder 1.000 oder 100.000 ausführen.
Es ist absolut richtig, dass Sie keine Root-Anmeldungen verwenden, weder über ein Kennwort noch über SSH-Schlüssel. Tatsächlich sollte die Root-Anmeldung vollständig deaktiviert werden, wenn die Server mit einem Netzwerkkabel verbunden sind.
Sprechen wir über die Wiederverwendung von Kennwörtern. Ist es in einem großen Unternehmen sinnvoll, Sysadmins aufzufordern, auf jedem Knoten unterschiedliche Kennwörter zu haben? für ein paar Knoten vielleicht, aber meine Admins / Ingenieure würden meutern, wenn sie auf 1000 Knoten unterschiedliche Passwörter haben müssten. Um dies zu realisieren, müsste jeder Benutzer irgendwo seine eigenen Passwörter speichern, hoffentlich einen Schlüsselpass, keine Tabellenkalkulation. Und jedes Mal, wenn Sie ein Kennwort an einer Stelle ablegen, an der es im Klartext abgerufen werden kann, hat sich die Sicherheit erheblich verringert. Ich würde es vorziehen, wenn sie auswendig ein oder zwei wirklich sichere Kennwörter kennen, als jedes Mal, wenn sie sich bei einem Computer anmelden oder sudo aufrufen müssen, eine Keypass-Datei zu konsultieren.
Daher ist die Wiederverwendung und Standardisierung von Passwörtern auch in einer sicheren Umgebung völlig akzeptabel und Standard. Andernfalls müssten LDAP, KEYSTONE und andere Verzeichnisdienste nicht vorhanden sein.
Wenn wir auf automatisierte Benutzer umsteigen, funktionieren ssh-Schlüssel hervorragend, um Sie einzubinden, aber Sie müssen immer noch durch sudo kommen. Sie können ein standardisiertes Kennwort für den automatisierten Benutzer auswählen (was in vielen Fällen akzeptabel ist) oder NOPASSWD aktivieren, wie Sie bereits erwähnt haben. Die meisten automatisierten Benutzer führen nur wenige Befehle aus, daher ist es durchaus möglich und wünschenswert, NOPASSWD zu aktivieren, jedoch nur für vorab genehmigte Befehle. Ich würde vorschlagen, dass Sie Ihre sudoers-Datei mithilfe Ihrer Konfigurationsverwaltung (in diesem Fall nicht möglich) verwalten, damit Sie die Liste der Befehle ohne Kennwort problemlos aktualisieren können.
Sobald Sie mit der Skalierung beginnen, können Sie einige Schritte ausführen, um das Risiko weiter einzugrenzen. Zwar haben wir etwa 1000 Knoten, aber nicht alle sind Produktionsserver, einige sind Testumgebungen usw. Nicht alle Administratoren können auf Produktionsserver zugreifen, obwohl sie denselben SSO-Benutzer / Pass-Schlüssel verwenden können wie an anderer Stelle . Automatisierte Benutzer sind jedoch etwas sicherer. So verfügt beispielsweise ein automatisiertes Tool, auf das Administratoren außerhalb der Produktion zugreifen können, über Benutzer- und Berechtigungsnachweise, die in der Produktion nicht verwendet werden können. Wenn Sie ansible auf allen Knoten starten möchten, müssen Sie dies in zwei Stapeln tun, einmal für die Nicht-Produktion und einmal für die Produktion.
Wir verwenden jedoch auch Puppet, da es sich um ein erzwingendes Konfigurationsmanagement-Tool handelt, sodass die meisten Änderungen an allen Umgebungen dadurch herausgedrückt würden.
Wenn die von Ihnen angegebene Featureanforderung erneut geöffnet / abgeschlossen wird, wird das, was Sie tun möchten, selbstverständlich vollständig unterstützt. Sicherheit ist jedoch ein Prozess der Risikobewertung und des Kompromisses. Wenn Sie nur wenige Knoten haben, für die Sie sich die Kennwörter merken können, ohne auf eine Post-It-Notiz zurückzugreifen, sind separate Kennwörter etwas sicherer. Für die meisten von uns ist dies jedoch keine praktikable Option.
quelle
NOPASSWD
sowieso aus Gründen der Sicherheit (wahrscheinlich unterstützt durch strengere Firewall-Regeln usw. ) verwenden würden, aber es ist gut, Ihren Anwendungsfall und Ihre Gedanken zur Bedrohung zu lesen Modell.sudo
Befehle zu beschränken (was mir einfiel, als ich feststellte, dass diesNOPASSWD
ziemlich notwendig ist). Leider scheint dies auch völlig ununterstützt zu sein - Ansible macht keine Zusagen, zBchown
odermkdir
Binaries direkt aufzurufen , und muss in der Lage sein,sudo /bin/sh
damit die meisten Module funktionieren.Ab Ansible 1.5 ist es möglich, ein verschlüsseltes Depot für host_vars und andere Variablen zu verwenden. Auf diese Weise können Sie zumindest eine
ansible_sudo_pass
Variable pro Host (oder pro Gruppe) sicher speichern . Leider--ask-vault-pass
wird nur ein einziges Tresorkennwort pro anzeigbarem Aufruf abgefragt, sodass Sie weiterhin für alle Hosts, die Sie zusammen verwenden, auf ein einziges Tresorkennwort beschränkt sind.Für einige Anwendungen kann dies jedoch eine Verbesserung gegenüber der Verwendung eines einzigen Sudo-Kennworts für mehrere Hosts sein, da ein Angreifer ohne Zugriff auf Ihre verschlüsselten host_vars weiterhin ein separates Sudo-Kennwort für jede Maschine (oder Maschinengruppe) benötigt, die er oder sie angreift.
quelle
ansible_sudo_pass
Option scheint ebenfalls neu zu sein - und scheint das zu tun, wonach ich gefragt habe. Ein einziges Tresorkennwort ist auch für meine Zwecke ideal. Vielen Dank!host_vars
mit dieser Methode? (eine mögliche Einschränkung von Alex Dupuy bemerkt)Mit Ansible 1.5 ist es möglich, die Variable ansible_sudo_pass wie folgt festzulegen
lookup('password', …)
:Ich finde das
host_vars/
aus mehreren Gründen praktischer als die Verwendung von Dateien in :Ich verwende eigentlich,
with_password: "passwords/{{ inventory_hostname}} encrypt=sha256_crypt"
um die Passwörter für den Deploy- Remote-Benutzer (der dann für sudo benötigt wird) bereitzustellen , damit sie bereits in den Dateien vorhanden sind (obwohl bei diesen Klartext-Suchen der in der Datei gespeicherte Salt-Wert verloren geht, wenn der Hash-Wert generiert wird). .Dies behält nur die Passwörter in der Datei (kein
ansible_sudo_pass:
bekannter Klartext) bei, um die kryptografische Sicherheit zu erhöhen. Insbesondere bedeutet dies, dass Sie nicht alle anderen hostspezifischen Variablen verschlüsseln, sodass sie ohne das Tresorkennwort gelesen werden können.Wenn Sie die Passwörter in einem separaten Verzeichnis ablegen, können Sie die Quellcodeverwaltung für die Dateien aufheben oder mithilfe eines Tools wie git-crypt verschlüsselt speichern. Ich verwende git-crypt und da ich das Repository nur in entschlüsselter Form auf verschlüsselten Dateisystemen auschecke, kümmere ich mich nicht um den Tresor und muss daher kein Tresorkennwort eingeben. (Beides wäre natürlich sicherer.)
Sie können auch die Verwendung Lookup - Funktion mit ansible_ssh_pass ; Dies ist möglicherweise sogar mit früheren Versionen von Ansible möglich, die keinen ansible_sudo_pass haben .
quelle
git-crypt
; soweit ich das beurteilen kann. Es scheint, dass Ansible noch keine Unterstützung für die Verwendunglookup
in einem verschlüsselten Tresor hat. Diepassword
Dokumentation des Moduls besagt , dass es eine noch nicht dokumentierte Unterstützung für verschlüsselte Speicherung gibt, aber ich habe noch keine Details gefunden. Irgendwelche Hinweise?Die Verwendung von pass ist eine einfache Methode, um sudo-Passwörter ansible zu machen. pass speichert ein Passwort pro Datei, was das Teilen von Passwörtern über git oder andere Methoden vereinfacht. Es ist auch sicher (mit GnuPG) und wenn Sie gpg-agent verwenden, können Sie ansible verwenden, ohne bei jeder Verwendung ein Passwort einzugeben.
Verwenden Sie dieses Kennwort in einer Inventardatei wie der folgenden, um das
servers/foo
für den Server gespeicherte Kennwortfoo
sichtbar zu machen:Vorausgesetzt, Sie haben den Schlüssel für gpg-agent früher entsperrt, läuft dies ohne Eingabe eines Passworts anzeigbar.
quelle
Dies ist jedoch ein ziemlich alter Thread:
vars_plugin
für Ansible geschrieben (eine ziemlich vollständige Implementierung finden Sie unter https://gist.github.com/mfriedenhagen/e488235d732b7becda81 ), das verschiedene Authentifizierungssysteme unterscheidet:quelle
python-keepass
funktioniert?gnome-keyring
, müssen Sie doppelte Aufzeichnungen führen. Immer noch viel schöner als mitNOPASSWD
, obwohl ...Ein möglicher Weg, dies zu tun, ist die Verwendung von Umgebungsvariablen.
z.B
Dann können Sie in den Spielen das sudo-Passwort nachschlagen mit:
quelle