Wie führe ich Ansible Azure-Playbooks aus, ohne Anmeldeinformationen in Dateien zu speichern?


12

Hintergrund

  1. 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.
  2. Wahrscheinlich nicht relevant, aber wir verwalten unser Inventar mithilfe eines dynamischen Skripts azure_rm.py.
  3. Wir werden ermutigt, so sicher wie möglich zu sein, dh
    1. Speichern Sie Vault-Passwörter nicht in ~/.vault_passoder in einer lokalen Datei
    2. Speichern Sie keine Azure-Geheimnisse in ~/.azure/credentials
    3. Bewahren Sie nichts Sicheres auf .bashrc.

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

  1. fragt den Benutzer nach dem Tresorkennwort
  2. Verwendet dies zum Entschlüsseln eines Vaulted Shell-Skripts
  3. Wertet das Skript aus, das Azure-Umgebungsvariablen in die Umgebung lädt.
  4. Führt das Playbook in der so eingestellten Umgebung aus.

Gibt es bessere (elegantere, weniger komplizierte, "ansible") Lösungen?


Was stört Sie an diesem Workflow am meisten?
Konstantin Suworow

@KonstantinSuvorov hauptsächlich ist es die Anzahl der Reifen, die ich springen muss, um das zu erreichen, was (zumindest für mich) eine ziemlich häufige Anforderung in Compliance-Unternehmen ist.
Vish

Antworten:


8

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-agentoder keychainspeichern und es bei Bedarf entsperren. Lesen Sie mehr in diesem Blog-Beitrag: https://benincosa.com/?p=3235

Wenn Sie ein bisschen paranoid sind, können Sie eine Benachrichtigung hinzufügen, wenn Ihr Passwortskript aufgerufen wird, wie folgt:

#!/bin/bash
PARENT_PROCESS=$(ps -p $PPID -o args | tail -n 1)
osascript -e "display notification \"Vault password used by ${PARENT_PROCESS}\" with title \"Ansible\" sound name \"default\""
gpg --batch --use-agent --no-tty --decrypt key.gpg 2>/dev/null

Dieses Tresorkennwortskript wird key.gpgals 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.shin deine ansible.cfg.

Umgebung

Sie sagten, dass Sie azure_rm.pyals 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):

export AZURE_SECRET=xxx;export AZURE_SUBSCRIPTION_ID=xxx;

set_env (Klartext):

echo -n "Setting secure vars... "
eval $(ansible-vault view secure_env)
echo "done."

Wenn Sie ein neues Terminal öffnen, um Ihre Automatisierungsaufgaben auszuführen, müssen Sie Folgendes ausführen:

source set_env

In diesem Moment wertet bash aus set_envund secure_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:

ansible-playbook provision-my-azure-instances.yml

Mit diesen beiden Ansätzen können Sie also in Ihrem Repository speichern key.gpgund speichern secure_env. source set_envGeben Sie dann im neuen Terminalaufruf einmal das gpg-Passwort ein (um die zukünftige Verwendung von key.gpg freizuschalten). Rufen ansible-playbookSie dann so oft an, wie Sie möchten, ohne Passwörter.


Danke für Ihre Antwort. Lassen Sie mich das über die Woche ausprobieren.
Vish

Der Hauptvorteil gegenüber meinem ursprünglichen Ansatz besteht also darin, dass GPG verwendet wird - was Caching-Vorteile bringt - richtig? Der Umweltansatz ähnelt dem, den ich mir ausgedacht habe.
Vish

1
Aus Ihrem OP geht hervor, dass Sie Wrapper jedes Mal verwenden, wenn Sie ein Playbook ausführen. Mit dem sourceAnsatz legen Sie die Umgebung einmal pro Terminalsitzung fest und können alle Tools separat verwenden: Ansible-Playbooks, Inventarskripte, Azure Cli, ohne Wrapper.
Konstantin Suworow

Ah, verstanden. Ich werde das meinem Team vorlegen. Akzeptieren Sie Ihre Antwort als bequemere Lösung. Danke für die Recherche und Erklärung! Auch ich mochte Ihren Blog :)
Vish

Der Hauptvorteil der Verwendung von GPG (oder eines Schlüsselbunds unter MacOS oder Linux) besteht darin, dass jedes Teammitglied über eine eigene Authentifizierung verfügt, um einen für ihn eindeutigen privaten Schlüssel freizuschalten. Dieser Schlüssel wird dann verwendet, um das Ansible Vault-Passwort zu entsperren, das ein gemeinsames Geheimnis ist. Sie müssen alle Ihre Geheimnisse ändern, wenn jemand das Team verlässt, einschließlich des Ansible Vault-Passworts, aber zumindest die GPG- / Schlüsselbund-Passwörter müssen sich nicht ändern.
RichVel

2

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:

ansible-vault encrypt /path/to/encrypted/file

Führen Sie das Playbook aus und es führt zu:

fatal: [localhost]: FAILED! => {"msg": "A vault password or secret must be
specified to decrypt /path/to/encrypted/file"}

Es gibt mehrere Optionen zum Entschlüsseln von Dateien, darunter @prompt:

ansible-playbook some-playbook --vault-id @prompt

wird aufgefordert:

Vault password (default):

Sobald das Tresorkennwort eingegeben wurde, sollte das Playbook erfolgreich sein.


1
Beim Lesen der Seite sieht es so aus, als gäbe es dort eine Lösung, die jedoch nicht nur über den Link herausgefunden werden kann. Könnten Sie bitte näher darauf eingehen?
Vish

Vielen Dank für die Ausarbeitung. Ich muss den Benutzer tatsächlich nach einem Tresorkennwort fragen - mit der älteren --ask-vault-passOption. Und ich verstehe nicht, wie das Ersetzen durch --vault-iddie größere Frage nach einem besseren Workflow beantwortet werden kann.
Vish

Als Sie mich auf den Link verwiesen haben, sah ich eine interessante Option : 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.
Vish
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.