Hintergrund
- Wir verwenden Ansible, um die Azure-Infrastruktur bereitzustellen und zu verwalten. Im Moment führen wir Ansible "manuell" aus, dh wir führen Playbooks für verschiedene automatisierte Aufgaben manuell aus . Keine CI-Infrastruktur.
- Wahrscheinlich nicht relevant, aber wir verwalten unser Inventar mithilfe eines dynamischen Skripts
azure_rm.py
. - Wir werden ermutigt, so sicher wie möglich zu sein, dh
- Speichern Sie Vault-Passwörter nicht in
~/.vault_pass
oder in einer lokalen Datei - Speichern Sie keine Azure-Geheimnisse in
~/.azure/credentials
- Bewahren Sie nichts Sicheres auf
.bashrc
.
- Speichern Sie Vault-Passwörter nicht in
In einem solchen Szenario habe ich Probleme, eine kohärente Strategie zu entwickeln, um sicherzustellen, dass meine Playbooks auf Azure-Geheimnisse zugreifen können, während ich die oben genannten Richtlinien befolge.
Frage
Wie kann ich vermeiden, Ansible Vault- und Azure-Anmeldeinformationen in Dateien zu speichern und gleichzeitig sicherzustellen, dass meine Playbooks darauf zugreifen können?
Was ich versucht habe
Bisher habe ich mir ein Wrapper-Skript ausgedacht
- fragt den Benutzer nach dem Tresorkennwort
- Verwendet dies zum Entschlüsseln eines Vaulted Shell-Skripts
- Wertet das Skript aus, das Azure-Umgebungsvariablen in die Umgebung lädt.
- Führt das Playbook in der so eingestellten Umgebung aus.
Gibt es bessere (elegantere, weniger komplizierte, "ansible") Lösungen?
ansible
ansible-vault
Vish
quelle
quelle
Antworten:
Tresorkennwort
Zunächst sollten Sie sich mit der Tatsache vertraut machen, dass die Tresorkennwortdatei ein ausführbares Skript sein kann. In diesem Fall führt Ansible es aus und erwartet, dass das Kennwort als Ausgabe empfangen wird.
Sie können beispielsweise Ihr aktuelles Passwort verwenden
gpg-agent
oderkeychain
speichern und es bei Bedarf entsperren. Lesen Sie mehr in diesem Blog-Beitrag: https://benincosa.com/?p=3235Wenn Sie ein bisschen paranoid sind, können Sie eine Benachrichtigung hinzufügen, wenn Ihr Passwortskript aufgerufen wird, wie folgt:
Dieses Tresorkennwortskript wird
key.gpg
als eigentlicher Tresorschlüssel verwendet und zeigt bei Verwendung des Skripts auch eine Popup-Benachrichtigung (für MacOS) mit dem Namen des übergeordneten Prozesses an. Gpg-Agent speichert das Entsperrkennwort für einige Zeit zwischen, sodass Sie nicht jedes Mal ein Kennwort eingeben müssen, wenn Sie das Playbook starten.Einfach
vault_password_file = ./vault_pass.sh
in deineansible.cfg
.Umgebung
Sie sagten, dass Sie
azure_rm.py
als dynamisches Inventarskript verwenden. Dies bedeutet, dass Sie Anmeldeinformationen in Ihre Umgebungsvariablen festlegen müssen, bevor Sie ansible-playbook starten, damit diese verwendet werden können.Sie können zwei Dateien erstellen:
secure_env
(mit Tresor verschlüsselt):set_env
(Klartext):Wenn Sie ein neues Terminal öffnen, um Ihre Automatisierungsaufgaben auszuführen, müssen Sie Folgendes ausführen:
In diesem Moment wertet bash aus
set_env
undsecure_env
(entschlüsselt über ansible-vault). Nach diesem Befehl haben Sie Azure-Anmeldeinformationen für die aktuelle Shell definiert, sodass Sie Playbooks wie gewohnt ausführen können:Mit diesen beiden Ansätzen können Sie also in Ihrem Repository speichern
key.gpg
und speichernsecure_env
.source set_env
Geben Sie dann im neuen Terminalaufruf einmal das gpg-Passwort ein (um die zukünftige Verwendung von key.gpg freizuschalten). Rufenansible-playbook
Sie dann so oft an, wie Sie möchten, ohne Passwörter.quelle
source
Ansatz legen Sie die Umgebung einmal pro Terminalsitzung fest und können alle Tools separat verwenden: Ansible-Playbooks, Inventarskripte, Azure Cli, ohne Wrapper.Bitte lesen Sie https://docs.ansible.com/ansible/2.4/vault.html Seit Ansible 2.4 könnte man verwenden
--vault-id @prompt
.Verschlüsseln Sie eine Datei mit ansible-vault:
Führen Sie das Playbook aus und es führt zu:
Es gibt mehrere Optionen zum Entschlüsseln von Dateien, darunter
@prompt
:wird aufgefordert:
Sobald das Tresorkennwort eingegeben wurde, sollte das Playbook erfolgreich sein.
quelle
--ask-vault-pass
Option. Und ich verstehe nicht, wie das Ersetzen durch--vault-id
die größere Frage nach einem besseren Workflow beantwortet werden kann.ansible-playbook --vault-id my-vault-password.py
. Ich dachte, Sie hätten vielleicht eine Lösung für die Verwendung eines Python-Skripts :) Ich denke auch über dieses nach.