Ansible Vault Anleitung
In früheren Tutorials haben wir Ansible besprochen, ein großartiges Tool, das wir für die Automatisierung und Bereitstellung verwenden können. Wir haben über grundlegende Ansible-Konzepte gesprochen, wir haben einige der am häufigsten verwendeten Ansible-Module gesehen, wie man Variablen verwaltet und wie man grundlegende Schleifen in Playbooks durchführt; Jetzt ist es an der Zeit zu sehen, wie sensible Informationen geschützt werden können, die manchmal zum Ausführen einiger Aufgaben erforderlich sind. Um sensible Informationen bei der Nutzung von Ansible zu schützen, verschlüsseln wir diese mit Ansible Vault.
In diesem Artikel besprechen wir die Grundlagen von Ansible Vault und sehen, wie wir es verwenden können, um Variablen oder ganze Playbooks zu verschlüsseln.
In diesem Tutorial lernen Sie:
- Was ist Ansible Vault?
- So verschlüsseln und entschlüsseln Sie einzelne Variablen
- So verschlüsseln und entschlüsseln Sie ganze Playbooks
Einleitung
Ansible Vault ist ein Tool, mit dem wir einzelne Variablenwerte oder ganze Playbooks verschlüsseln und entschlüsseln können, um sensible Informationen zu schützen, die sonst als Klartext sichtbar wären. Die Userspace-Anwendung, mit der wir arbeiten, um solche Operationen durchzuführen, heißt ansible-vault und ist in jeder Standard-Ansible-Installation enthalten.
Variablen verschlüsseln
Warum sollten wir den Wert einzelner Variablen verschlüsseln, wenn wir ganze Playbooks verschlüsseln können? Das Verschlüsseln von Variablen hat einen großen Vorteil: Da die Datei, in der sie verwendet werden, im Klartextformat bleibt, ist es immer noch einfach, sie zu lesen und zu ändern. Um den Wert einer Variablen zu verschlüsseln, rufen wir das Dienstprogramm ansible-vault auf und verwenden den Befehl "encrypt_string". Hier ist ein Beispiel: Nehmen wir an, wir möchten in einem Playbook eine Variable namens "password" verwenden, aber wir möchten aus offensichtlichen Gründen vermeiden, ihren Wert im Klartext zu speichern. Um es mit Ansible Vault zu verschlüsseln, könnten wir den folgenden Befehl ausführen:
ansible-vault encrypt_string "secret_value_to_encrypt" --name passwordWir haben den Befehl "encrypt_string" von ansible-vault verwendet: Dieser Befehl verschlüsselt die bereitgestellte Zeichenkette (den sensiblen Inhalt, den wir schützen möchten – in diesem Beispiel "secret_value_to_encrypt") und schützt ihn mit einem Passwort. Der Name der Variablen wird über die Option --name angegeben. Sobald wir den Befehl starten, werden wir aufgefordert, das Verschlüsselungspasswort einzugeben und zu bestätigen. Für die Entschlüsselung des Inhalts wird dasselbe Passwort angefordert:
New Vault password:
Confirm New Vault password:Sobald wir das Passwort bereitstellen, werden die Inhalte verschlüsselt. Das Ergebnis des Befehls wird auf dem Bildschirm gedruckt:
password: !vault |
$ANSIBLE_VAULT;1.1;AES256
64313761333061643861656539643036396538363063343736316362333736313035386636396536
6564356435343135643161363033626535393832343733320a323633393637643462643866393536
38363435336539353532356530373033663862363234343035643632306665343165656634303563
6636613562396531360a333861356337346536323063653964373833633739346664363664396537
35346537353930316535613638626233343433323039386262363232376230353131
Wenn wir das Verschlüsselungskennwort nicht interaktiv bereitstellen möchten, können wir es in eine Datei schreiben und stattdessen auf die Datei verweisen. Angenommen, wir schreiben unser Passwort in eine Datei namens "password.txt", dann würden wir zum Beispiel Folgendes ausführen:
ansible-vault encrypt_string --vault-password-file password.txt "secret_value_to_encrypt" --name passwordDas Passwort muss in einer einzigen Zeile geschrieben werden. Wie Sie im obigen Beispiel sehen können, wird die Datei mit dem Passwort über die Option --vault-password-file referenziert. Der Rest des Befehls bleibt unverändert.
Eine weitere, potenziell sicherere Option besteht darin, ein Skript zu erstellen, das mit unserer bevorzugten Passwort-Manager-Anwendung interagiert. Die ID, die vom Passwort-Manager abgerufen werden soll, kann über die Option --vault-id angegeben werden, sodass das Skript diese Option akzeptieren muss. Wenn ein Kennwort für den Zugriff auf den Passwort-Manager erforderlich ist, sollte das Skript im Terminal zur Eingabe auffordern, und sobald das Kennwort zum Verschlüsseln/Entschlüsseln der Variablen oder Datei mit ansible-vault abgerufen wurde, muss es in der Standardausgabe ausgegeben werden. Der Skriptname muss auf "-client" oder "-client.extension" enden (z. B. "-client.py"). Sehen wir uns ein Beispiel an.
In einem früheren Artikel haben wir gesehen, wie wir unser Passwort mit dem Passwort-Manager "pass" organisieren können. Ein solcher Manager basiert auf der Verwendung von GPG-Schlüsseln und kann direkt von der Befehlszeile aus über das Pass-Dienstprogramm verwendet werden. Hier ist ein Beispiel für ein Python-Skript, das mit diesem Passwort-Manager interagiert und mit ansible-vault verwendet werden kann:
#!/usr/bin/env python3
import argparse
import sys
from subprocess import run, CalledProcessError
def parse_args():
parser = argparse.ArgumentParser(description="Get password from pass password manager")
parser.add_argument('--vault-id', help='The password to retrieve', default='vault')
return parser.parse_args()
def main(args):
try:
completed_process = run(['pass', args.vault_id], capture_output=True, check=True)
except CalledProcessError:
sys.stderr.write('There was an error retrieving the password')
return 1
sys.stdout.write(completed_process.stdout.decode('utf8'))
return 0
if __name__ == '__main__':
sys.exit(main(parse_args()))
Das obige Skript akzeptiert, wie angefordert, die Option --vault-id, die verwendet wird, um den "Namen" der ID zu kommunizieren, die mit dem Passwort-Manager abgerufen werden soll. In diesem Fall setzen wir den Standardwert "vault" für die Option: Er wird verwendet, wenn der Benutzer keine Identität explizit angibt. Der Aufruf von "pass" erfolgt mithilfe des Python-Unterprozessmoduls (werfen Sie einen Blick auf unser Tutorial zum Unterprozess, wenn Sie damit nicht vertraut sind). Hier haben wir die run-Methode verwendet und die capture_output- und check-Parameter auf True festgelegt, sodass die Standardausgabe des Befehls erfasst wird (später kann im "stdout"-Attribut des von der Methode zurückgegebenen CompletedProcess-Objekts darauf zugegriffen werden) und eine CalledProcessError-Ausnahme ausgelöst wird, wenn der Beendigungsstatus des Befehls nicht 0 ist.
In diesem Fall muss das Skript den Benutzer nicht selbst zur Eingabe des Kennworts auffordern, da das Pass-Dienstprogramm dies ausführt. Übrigens, um sicherzugehen, dass das Passwort in der Kommandozeile abgefragt wird, müssen wir das Paket pinentry-tty installieren und die folgende Zeile in die Datei ~/.gnupg/gpg-agent.conf schreiben:
pinentry-program /usr/bin/pinentry-ttySo können wir das Verschlüsselungspasswort mit dem Skript abrufen:
ansible-vault encrypt_string --vault-id vault@vault-client.py 'secret_value_to_encrypt' --name password
Beachten Sie, dass wir die Option --vault-id verwenden, um die zu verwendende Identität anzugeben, die in diesem Fall die links vom @ ist. Rechts neben dem Symbol befindet sich stattdessen der Pfad des Skripts, das aufgerufen werden soll. Wie bereits erwähnt, wird die Standardidentität verwendet, die wir im Skript verwendet haben, wenn wir es versäumen, eine Identität anzugeben:
ansible-vault encrypt_string --vault-id vault-client.py 'secret_value_to_encrypt' --name passwordWenn wir die Identität explizit angeben, wird sie stattdessen in der generierten Ausgabe gemeldet, z. B.:
password: !vault |
$ANSIBLE_VAULT;1.2;AES256;vault
39393237653832393365366436353734343736366263366232656265313763623739346565653837
3065656639616432646435393466633463336262353231330a633739633336633939333731643538
63386462323561346334376633366134623862366462333066333563656464373633303533323439
3038643639373966350a303065663830643635386630616263666636386537356233656330666239
66393939633833643066643931326435633631626138373363303430626539356564
Entschlüsseln einer Variablen
Um die umgekehrte Operation durchzuführen, also den ursprünglichen Wert einer Variablen zu überprüfen, können wir das Ansible-Debug-Modul verwenden. Stellen Sie sich vor, wir haben die Variable in der variable.yml Datei gespeichert. Um den ursprünglichen Inhalt zu lesen und das Passwort mit dem oben verwendeten Skript abzurufen, würden wir Folgendes ausführen:
ansible localhost -m debug -a var="password" -e @variable.yml --vault-id vault@vault-client.pyIm obigen Beispiel haben wir "localhost" als den Rechner angegeben, auf dem die Aufgabe ausgeführt werden soll, und als Argument für die Option -m haben wir den Namen des Moduls übergeben, das wir verwenden möchten. Die Option -a wird verwendet, um Argumente an das Modul zu übergeben, im Paarformat "Schlüssel=Wert" (var="password"), und -e wird verwendet, um zusätzliche Variablen zu übergeben (es ist die Abkürzung für -extra-vars): zusätzliche Variablen müssen auch in Schlüssel/Wert-Paaren angegeben werden; Da wir in diesem Fall jedoch den Pfad einer Datei übergeben (diejenige, in der wir die Variable gespeichert haben), stellen wir ihr einfach ein @ voran (weitere Anweisungen finden Sie im Ansible-Handbuch). Wie Sie sehen können, haben wir schließlich, genau wie im vorherigen Beispiel, das vault-client.py-Skript verwendet, um das Kennwort für die Verschlüsselung/Entschlüsselung abzurufen. Der Befehl gibt das folgende Ergebnis zurück:
localhost | SUCCESS => {
"password": "secret_value_to_encrypt"
}Verschlüsseln von Dateien
Ansible-Vault kann auch verwendet werden, um ganze Playbooks oder andere Arten von Dateien zu verschlüsseln. Angenommen, wir möchten ein Playbook mit dem Namen play.yml verschlüsseln. Um unsere Mission zu erfüllen, würden wir den Befehl "encrypt" verwenden:
ansible-vault encrypt play.ymlIn diesem Fall würde das Passwort interaktiv abgefragt. Genau wie in den vorherigen Beispielen können wir es jedoch in einer Datei speichern oder ein Skript verwenden, um es abzurufen:
ansible-vault encrypt --vault-password-file=password.txt play.ymlMit dem obigen Befehl haben wir eine vorhandene Datei, "play.yml", verschlüsselt. Wenn wir eine verschlüsselte Datei von Grund auf neu erstellen möchten, können wir stattdessen einfach den Befehl "create" verwenden. Wenn wir dies tun, wird der Standard-Texteditor geöffnet, damit wir den Inhalt der Datei schreiben können. Sobald wir sie speichern, wird die Datei mit dem angegebenen Passwort verschlüsselt. Um beispielsweise eine verschlüsselte Datei mit dem Namen playbook.yml zu erstellen, würden wir Folgendes ausführen:
ansible-vault create playbook.yml --vault-password-file=password.txtBeachten Sie, dass die Datei direkt verschlüsselt wird. Wenn wir es bearbeiten möchten, müssen wir es nicht manuell entschlüsseln. Wir können bequem den Befehl "Bearbeiten" verwenden, der die Arbeit für uns erledigt und ihn in unserem bevorzugten Texteditor öffnet:
ansible-vault edit playbook.yml --vault-password-file=password.txtUm die Datei einfach zu entschlüsseln, verwenden wir stattdessen den Befehl "decrypt":
ansible-vault decrypt playbook.yml --vault-password-file=password.txtBereitstellen des Verschlüsselungskennworts beim Ausführen eines Playbooks
Wenn wir ein verschlüsseltes Playbook oder ein Playbook, das eine oder mehrere verschlüsselte Variablen enthält, ausführen möchten, können wir eine der oben genannten Methoden verwenden oder Ansible sogar interaktiv nach dem Passwort fragen lassen, indem wir die Option --ask-vault-password verwenden. Angenommen, wir möchten die Aufgaben ausführen, die im Playbook für verschlüsselte playbook.yml enthalten sind. Wir könnten laufen:
ansible-playbook --ask-vault-password playbook.yml
Um das Kennwort aus einer Datei lesen zu lassen, gehen Sie stattdessen wie folgt vor:
ansible-playbook --vault-password-file=password.txt playbook.ymlSo rufen Sie das Kennwort mithilfe eines Skripts ab, genau wie zuvor:
ansible-playbook --vault-id vault@vault-client.py playbook.ymlSchlüsse
In diesem Artikel haben wir gelernt, wie Sie Ansible-Vault verwenden können, um sensible Inhalte in Playbooks zu schützen. Wir haben gesehen, wie man den Wert einzelner Variablen und ganzer Dateien verschlüsselt und entschlüsselt. Wenn Sie mehr über Ansible-Vault erfahren möchten, werfen Sie bitte einen Blick in die offizielle Dokumentation.
