Ansible Secrets mit Lookup Plugins
Wenn man Server mit Ansible verwaltet müssen früher oder später natürlich auch Kennwörter und andere Geheimnisse abgelegt werden. Mit ansible-vault
1 bietet Ansible hier auch entsprechende Tools an, um diese Geheimnisse sicher zu speichern. Mit ansible-vault
lassen sich entweder komplette Dateien oder einzelne Zeichenketten verschlüsseln. Zum Entschlüsseln muss entweder ein Kennwort für den Vault in einer Datei hinterlegt, oder bei der Ausführung von Ansible manuell angegeben werden.
Gerade wenn man von der Möglichkeit Gebrauch macht, eine Datei vollständig zu verschlüsseln, besteht natürlich die Gefahr dass man diese versehentlich unverschlüsselt z.B. in ein Versionskontrollrepository eincheckt, denn um die Datei zu erweitern, muss man diese natürlich jeweils erst entschlüsseln. Verschlüsselt man nur die zu schützenden Zeichenketten, ist dieses Risiko zwar deutlich minimiert, dafür ist es relativ umständlich, bei Bedarf wieder an den Klartext zu kommen.
Je nachdem wie die Aufgaben in einem Projekt oder Unternehmen verteilt sind, möchte man vielleicht auch nicht, dass alle MItarbeiter die mit Ansible arbeiten, auf alle Geheimnisse im Vault zugreifen können. Hier könnte man zwar mit unterschiedlichen Vaults für unterschiedliche Aufgabenbereiche agieren, muss dann aber natürlich auch unterschiedliche Kennwörter zum Entsperren der jeweiligen Vaults nutzen, was es zumindest erschwert, alle Playbooks/Roles gemeinsam ausführen zu lassen. Auch wenn Werte dynamisch geändert, oder oft neue Werte hinzugefügt werden müssen, oder das Team so groß ist, dass konkurrierende Schreibzugriffe wahrscheinlich werden, ist ein Vault nicht die schönste Option.
Abhilfe schaffen hier Lookup-Plugins. Mit diesen lassen sich z.B. externe Dienste wie Bitwarden Secrets Manager2. Entweder schreibt man sich das Lookup-Plugin selbst, oder schaut, was ansible-galaxy
3 so zu bieten hat, z.B. community.general.bitwarden_secrets_manager_lookup
4.
Anstelle die benötigten Variablen in eine YAML-Datei zu schreiben und diese ggf. mit ansible-vault
zu verschlüsseln, kann man nun einfach das Lookup-Plugin die notwendigen Werte zur Laufzeit auslesen lassen. Im Bitwarden Secrets Manager erhält jeder Wert eine eindeutige ID, die man im Lookup-Plugin angibt: {{ lookup("community.general.bitwarden_secrets_manager", "2bc23e48-4932-40de-a047-5524b7ddc972").value }}
Der Wert wird dann Automatisch abgefragt, wenn das Playbook ausgeführt wird.