Ansible Vault Secrets Verschlüsseln
Ansible Vault – Secrets und Passwörter in Playbooks verschlüsseln
Warum ist Ansible Vault wichtig?
Eine der kritischsten Fehler in der Infrastruktur-Automatisierung ist das Speichern von Passwörtern und API-Keys im Plaintext. Dies gilt besonders in Git-Repositories, wo ein versehentlicher Commit sensible Daten exponiert. Ansible Vault verschlüsselt solche Secrets und ermöglicht es, sie sicher in Versionskontrolle zu speichern.
Ansible Vault nutzt AES-256 Verschlüsselung und ist vollständig in Ansible integriert. Es funktioniert mit allen Ansible-Befehlen: ansible-playbook, ansible-pull, etc.
Grundkonzepte von Ansible Vault
Was kann verschlüsselt werden?
- Komplette YAML-Dateien (vars, host_vars, group_vars)
- Einzelne Variablen in Dateien
- Strings (in Playbooks verwendbar)
- Dateiinhalte
Vault ID und Identifizierer
Seit Ansible 2.4 können Sie mehrere Vault-IDs verwenden, um verschiedene Passwörter für verschiedene Umgebungen zu trennen (prod, staging, dev).
Verschlüsselte Datei erstellen
Neue Vault-Datei mit Interaktion
# Neue Datei erstellen und direkt bearbeiten ansible-vault create secrets.yml # Sie werden aufgefordert, ein Passwort zu enternen: # New Vault password: # Confirm New Vault password: # Dann öffnet sich Ihr Standard-Editor (vi/nano) # Geben Sie die Secrets ein: db_user: admin db_password: MySecurePassword123 api_key: sk-12345678901234567890 api_secret: sk-secret-987654321 mysql_root_password: RootSecure123!@# # Speichern und Datei ist verschlüsselt # Die Datei wird gespeichert mit Vault-Header: # $ANSIBLE_VAULT;1.1;AES256;...
Bestehende Datei verschlüsseln
# Bereits existierende YAML-Datei verschlüsseln ansible-vault encrypt vars.yml # Passwort eingeben und bestätigen # New Vault password: # Confirm New Vault password: # Datei ist nun verschlüsselt file vars.yml # vars.yml: ASCII text (encrypted)
Verschlüsselte Dateien ansehen und bearbeiten
# Verschlüsselte Datei anzeigen (ohne zu bearbeiten) ansible-vault view secrets.yml # Passwort eingeben # Enter vault password: # Inhalte werden angezeigt aber nicht bearbeitet # Verschlüsselte Datei bearbeiten ansible-vault edit secrets.yml # Passwort eingeben # Enter vault password: # Editor öffnet sich mit entschlüsseltem Inhalte # Nach dem Speichern wird die Datei wieder verschlüsselt
Einzelne Strings verschlüsseln
# Einzelnen String verschlüsseln (für Playbooks) ansible-vault encrypt_string 'MySecurePassword123' --name 'db_password' # Ausgabe: # db_password: !vault | # $ANSIBLE_VAULT;1.1;AES256;... # ... # Diese Zeilen können direkt in Playbooks verwendet werden # Sie können auch mit --vault-id arbeiten: ansible-vault encrypt_string 'Secret123' --name 'api_key' --vault-id prod@prompt
Vault-Dateien in Playbooks verwenden
Komplette Datei als vars_files laden
---
- hosts: webservers
vars_files:
- secrets.yml
- vars/common.yml
tasks:
- name: Database verbindung
mysql_db:
name: mydb
login_user: "{{ db_user }}"
login_password: "{{ db_password }}"
state: present
- name: API-Key setzen
shell: echo "{{ api_key }}" > /etc/app/config
Playbook mit Vault Passwort ausführen
# Mit Passwort-Abfrage ansible-playbook playbook.yml --ask-vault-pass # Sie werden aufgefordert: # Vault password: # Mit Passwort-Datei ansible-playbook playbook.yml --vault-password-file ~/.vault_pass # Mit Multiple Vault-IDs (verschiedene Umgebungen) ansible-playbook playbook.yml \ --vault-id prod@prompt \ --vault-id staging@~/.vault_staging # Mit Umgebungsvariable export ANSIBLE_VAULT_PASSWORD_FILE=~/.vault_pass ansible-playbook playbook.yml # Vault-Passwort aus Script export ANSIBLE_VAULT_PASSWORD_EXEC=fetch_password.sh ansible-playbook playbook.yml
Vault-Passwort-Datei Best Practices
# .gitignore Datei echo ".vault_pass" >> .gitignore echo ".vault_*" >> .gitignore echo "vault_password" >> .gitignore # Passwort-Datei mit restriktiven Permissions umask 077 echo "your-secure-password" > ~/.vault_pass chmod 600 ~/.vault_pass # Git Workflow - .vault_pass wird nicht committed git status # .vault_pass ist nicht in der Liste
Group Vars und Host Vars mit Vault
# Struktur:
# ansible/
# ├── group_vars/
# │ ├── all/
# │ │ ├── common.yml
# │ │ └── vault.yml (verschlüsselt)
# │ └── webservers/
# │ └── vault.yml (verschlüsselt)
# └── host_vars/
# └── web01/
# └── vault.yml (verschlüsselt)
# Vault-Datei in group_vars erstellen
ansible-vault create group_vars/all/vault.yml
# Inhalt:
db_user: admin
db_password: SecurePassword123
api_token: token-xyz-123
# In Playbook referenzieren
---
- hosts: all
tasks:
- name: Database-Benutzer konfigurieren
debug:
msg: "User: {{ db_user }}, Password: {{ db_password }}"
Multi-Vault Setup für verschiedene Umgebungen
# Verschiedene Vault-Passwörter pro Umgebung # Production Vault ansible-vault create group_vars/production/vault.yml --vault-id prod # Staging Vault ansible-vault create group_vars/staging/vault.yml --vault-id staging # Development Vault ansible-vault create group_vars/development/vault.yml --vault-id dev # Playbook mit Multiple Vault IDs ausführen ansible-playbook playbook.yml \ --vault-id prod@~/.vault_prod \ --vault-id staging@~/.vault_staging \ --vault-id dev@~/.vault_dev # Oder mit Prompt ansible-playbook playbook.yml \ --vault-id prod@prompt \ --vault-id staging@prompt
CI/CD Integration mit Ansible Vault
# GitLab CI/CD Beispiel
# .gitlab-ci.yml
deploy_production:
script:
- ansible-playbook playbook.yml \
--vault-password-file $VAULT_PASS_FILE
variables:
VAULT_PASS_FILE: /tmp/vault_pass
before_script:
- echo $VAULT_PASSWORD > /tmp/vault_pass
- chmod 600 /tmp/vault_pass
# GitHub Actions Beispiel
# .github/workflows/deploy.yml
- name: Run Ansible Playbook
env:
ANSIBLE_VAULT_PASSWORD_FILE: /tmp/vault_pass
run: |
echo "${{ secrets.ANSIBLE_VAULT_PASSWORD }}" > /tmp/vault_pass
chmod 600 /tmp/vault_pass
ansible-playbook playbook.yml
# Jenkins Beispiel
# Jenkinsfile
pipeline {
stages {
stage('Deploy') {
steps {
sh '''
echo $VAULT_PASSWORD > /tmp/vault_pass
chmod 600 /tmp/vault_pass
ansible-playbook playbook.yml --vault-password-file /tmp/vault_pass
'''
}
}
}
}
Vault Datei entschlüsseln (Passwort vergessen)
# Vault-Passwort ändern ansible-vault rekey secrets.yml # Altes Passwort eingeben # Vault password: # Neues Passwort eingeben # New Vault password: # Datei ist mit neuem Passwort verschlüsselt # Vault-Datei vollständig entschlüsseln (ACHTUNG!) ansible-vault decrypt secrets.yml # Passwort eingeben # Vault password: # Datei ist jetzt unverschlüsselt (SECURITY RISK!)
HashiCorp Vault als Alternative
Für größere Umgebungen ist HashiCorp Vault eine bessere Alternative zu Ansible Vault. Es bietet dynamisches Secrets-Management, Audit-Logging und bessere Sicherheit.
| Kriterium | Ansible Vault | HashiCorp Vault |
|---|---|---|
| Komplexität | Einfach | Komplex |
| Statische Secrets | Ja | Ja |
| Dynamische Secrets | Nein | Ja |
| Audit-Logging | Begrenzt | Umfassend |
| Multi-Team Support | Eingeschränkt | Ja |
| Secret Rotation | Manuell | Automatisch |
| Kosten | Kostenlos (Teil von Ansible) | Kommerziell oder Open Source |
Security Best Practices
| Best Practice | Beschreibung |
|---|---|
| Niemals Plaintext Secrets | Alle sensiblen Daten müssen verschlüsselt sein |
| .gitignore verwenden | Vault-Passwort-Dateien aus Git ausschließen |
| Separate Passwörter pro Umgebung | Production, Staging, Development Secrets trennen |
| Passwort rotieren | Regelmäßig Vault-Passwort ändern |
| Nur Datei-Permissions | chmod 600 für Passwort-Dateien |
| CI/CD Secrets | Passwort nur als CI/CD Secret speichern, nicht in Code |
| Audit-Logging | Wer hat Secrets zugegriffen? (mit HashiCorp Vault) |
| Minimal Privilege | Nur notwendige Secrets pro Role/Team |
Weitere Ressourcen
- 📖 Ansible Grundlagen und Automatisierung
- 📖 HashiCorp Vault Installation und Konfiguration
- 📖 Secrets Management Best Practices
- 📖 Git Sicherheit und SSH-Keys
- 📖 CI/CD Pipeline Sicherheit
- 🔧 Enjyn Gen Tools – Passwörter & Keys generieren
- 🔧 Sichere Server bei Enjyn mieten
Letzte Aktualisierung: April 2026 | Ansible 2.10+