Secrets schützen und verwenden mit Ansible Vault

AnsibleBeginner
Jetzt üben

Einführung

Ansible Vault verschlüsselt sensible Variablen, sodass sie zusammen mit Playbooks gespeichert werden können, ohne dass Geheimnisse im Klartext offengelegt werden. Ein Playbook kann den Wert nur verwenden, wenn Sie ein gültiges Vault-Passwort bereitstellen.

In diesem Lab erstellen Sie eine verschlüsselte Variable, beobachten den Fehler bei fehlendem Passwort und führen ein Playbook erfolgreich mit einer Vault-Passwortdatei aus.

Ein Vault-Übungsprojekt erstellen

In diesem Schritt erstellen Sie ein Projekt mit einem Inventory, einem Verzeichnis für Gruppenvariablen, einem Playbook-Verzeichnis und einem Berichtsverzeichnis.

cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars/managed,playbooks,managed,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[managed]
host ansible_connection=local
EOF

Die verschlüsselte Variable wird unter inventory/group_vars/managed abgelegt, sodass sie wie jede andere Variablendatei für die Gruppe managed geladen wird. Der Unterschied besteht darin, dass Ansible sie vor der Verwendung entschlüsseln muss.

Eine Vault-Passwortdatei erstellen

In diesem Schritt erstellen Sie eine Passwortdatei für die Lab-Automatisierung. In der Praxis sollten Sie diese Datei sorgfältig schützen oder einen Workflow verwenden, der zur Passworteingabe auffordert. Bevor Sie die Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück. Dies stellt sicher, dass die Befehle stabil bleiben, auch wenn LabEx jeden Schritt separat ausführt.

cd /home/labex/project/rhce-ansible
cat > vault_pass.txt <<'EOF'
labex-vault-pass
EOF
chmod 600 vault_pass.txt

Diese Passwortdatei ist nur für den Lab-Workflow bestimmt. Der Modus chmod 600 bedeutet, dass nur der Besitzer die Datei lesen und schreiben kann – dies ist die grundlegende Sicherheitsvorkehrung, die man treffen sollte, wenn eine Datei zum Entsperren von Geheimnissen dient.

ls -l vault_pass.txt

Achten Sie auf Berechtigungen ähnlich wie -rw-------. Falls die Datei für die Gruppe oder andere Benutzer lesbar ist, führen Sie den Befehl chmod 600 erneut aus.

Eine verschlüsselte Variable erstellen

In diesem Schritt verwenden Sie ansible-vault encrypt_string, um eine verschlüsselte Variable namens app_secret zu erstellen. Die verschlüsselte Datei kann wie jede andere Gruppenvariablendatei geladen werden. Bevor Sie die Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück.

cd /home/labex/project/rhce-ansible
ansible-vault encrypt_string --vault-password-file vault_pass.txt 'redhat' --name app_secret > inventory/group_vars/managed/vault.yml

Der Befehl schreibt eine verschlüsselte YAML-Variable namens app_secret. Der Variablenname bleibt lesbar, aber der Wert redhat wird innerhalb eines Vault-Blocks gespeichert.

sed -n "1,8p" inventory/group_vars/managed/vault.yml

Die Datei sollte app_secret: !vault und einen $ANSIBLE_VAULT;-Header anzeigen. Sie sollten das Klartext-Geheimnis in dieser Datei nicht sehen können.

Ein Playbook schreiben, das das Secret verwendet

In diesem Schritt schreiben Sie ein Playbook, das auf app_secret verweist. Ohne das Vault-Passwort kann Ansible diese Variable nicht entschlüsseln. Bevor Sie die Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück.

cd /home/labex/project/rhce-ansible
cat > playbooks/use-vault.yml <<'EOF'
---
- name: Use an encrypted variable
  hosts: managed
  gather_facts: false
  tasks:
    - name: Write secret-derived file
      ansible.builtin.copy:
        dest: /home/labex/project/rhce-ansible/managed/secret.txt
        content: |
          secret={{ app_secret }}
        mode: '0600'
EOF

Das Playbook verwendet app_secret wie eine normale Variable. Genau das ist der Zweck von Vault: Die Playbook-Logik bleibt übersichtlich, während der sensible Wert im Ruhezustand verschlüsselt bleibt.

ansible-playbook playbooks/use-vault.yml > reports/vault-missing.txt 2>&1 || true

Es wird erwartet, dass dieser Durchlauf fehlschlägt, da kein Vault-Passwort angegeben wurde. Die Ausgabe wird in einen Bericht umgeleitet, damit Sie den Fehler untersuchen können, ohne das Lab zu unterbrechen.

grep -Ei "vault|decrypt|password|secret" reports/vault-missing.txt

Die gefilterte Fehlermeldung sollte Begriffe wie Vault, Entschlüsselung (decrypt), Passwort oder Secret enthalten. Beachten Sie auch, dass die Überprüfung noch keine managed/secret.txt-Datei erwartet.

Das Playbook mit dem Vault-Passwort ausführen

In diesem Schritt stellen Sie die Vault-Passwortdatei bereit, damit Ansible die Variable entschlüsseln und die geschützte Ausgabedatei schreiben kann. Bevor Sie die Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück.

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/use-vault.yml --vault-password-file vault_pass.txt | tee reports/vault-run.txt

Jetzt kann Ansible app_secret entschlüsseln und den Klartextwert zur Laufzeit an den copy-Task übergeben. Die verschlüsselte Datei auf der Festplatte bleibt weiterhin verschlüsselt.

sudo ls -l managed/secret.txt && cat managed/secret.txt

Die Datei sollte den Modus 600 haben und secret=redhat enthalten. Dies beweist, dass das Playbook den entschlüsselten Wert verwendet hat, während das generierte Secret-File weiterhin geschützt bleibt.

Zusammenfassung

Sie haben eine mit Vault verschlüsselte Variable erstellt, beobachtet, dass das Playbook sie ohne Passwort nicht verwenden kann, und anschließend das Playbook mit einer Vault-Passwortdatei ausgeführt, um das Geheimnis zu entschlüsseln und anzuwenden.