Wie verschlüssle ich Binärdateien in Ansible?

9

Wir verwenden Ansible Vault , um Passwörter, private Schlüssel für Zertifikate usw. in unserem Ansible Playbook Git-Repository zu speichern. Alle unsere vorhandenen privaten Daten liegen in Textform vor, sodass wir sie in Variablen speichern können. Diese werden dann in Vorlagen oder mit dem contentParameter des Kopiermoduls verwendet.

Jetzt haben wir eine Java KeyStore-Datei, die leider ein Binärformat hat. Als solches kann es nicht in einer Variablen gespeichert werden - oder zumindest weiß ich nicht, wie es geht. Was wäre der einfachste Weg, um unsere Datei ordnungsgemäß zu verschlüsseln, während sie in Git ruht, aber beim Ausführen verfügbar ist ansible-playbook?

Was ich schon ohne Erfolg versucht habe:

  • Codieren der Binärdatei in base64, Speichern der codierten Daten in einer Variablen und Verwenden des Vorlagenmoduls mit {{base64_data | b64decode}}. Führt zu vielen EF BF BDHex-Dumps der resultierenden Datei. Die drei Bytes codieren das Unicode-Ersetzungszeichen in UTF-8, sodass bei der Interpretation der Binärdaten als Text ein Problem auftritt.
  • Codieren der binären Datei in Base64, die codierten Daten in einer Variablen zu speichern und unter Verwendung des Kopiermoduls mit content="{{base64_data | b64decode}}". Ansible beschwert sich mit "Eine Variable hat einen neuen Parameter in die Modulargumente eingefügt." Bei der Verwendung von einfachen Anführungszeichen anstelle von doppelten Anführungszeichen beschwert sich Ansible mit einer "Fehleranalyse-Argumentationszeichenfolge" und einer Kopie aller Binärdaten, die an das Terminal ausgegeben werden ...
Daniel Seither
quelle
Aus einer Diskussion in groups.google.com/d/topic/ansible-project/IinZK14FyX4 schließe ich, dass ansible dies nicht unterstützt und dass Sie einige base64-Dinge selbst erledigen müssen, aber dass es möglicherweise Dinge von Drittanbietern gibt das kann es einfacher machen.
Antonis Christofides
Danke, das sieht gut aus. Ich werde es versuchen und zurückmelden ...
Daniel Seither
Nein, es funktioniert leider nicht (siehe bearbeitete Frage). Es gibt einige Diskussionen über eine Ansible-Pull-Anfrage, die relevant sein könnte: github.com/ansible/ansible-modules-extras/pull/142
Daniel Seither
Haben Sie darüber nachgedacht, dies mit GPG-Aufrufen zu verpacken? Sie können die ASCII-Darstellung eines privaten GPG-Schlüssels in Ansible Vault speichern und damit Ihre Binärdatei entschlüsseln, die dann problemlos in git gespeichert werden kann.
Christopher Karel
Vielen Dank für Ihren Vorschlag, aber diese Problemumgehung ist etwas komplizierter, als ich es gerne hätte. Ich habe bereits darüber nachgedacht, den Base64-codierten KeyStore auf den Zielcomputer zu kopieren und einen Handler zu haben, der die Datei beim Update dekodiert, aber ich würde eine Lösung bevorzugen, die keine temporären Dateien herumwirft.
Daniel Seither

Antworten:

4

Sie können dazu einen Shell-Befehl mit einer base64-Variablen verwenden.

- vars:
  - myvar: "<my_base64_var>"
- name: Create binary file
  shell: "echo '{{myvar}}' | base64 -d > /var/tmp/binary.dat"

Eric

elhostis
quelle
Dies ist definitiv eine Option, zumal keine temporäre Datei verwendet wird. Leider kann Ansible nicht erkennen, ob eine Änderung vorgenommen wurde, aber es ist besser als alle anderen Lösungen, die ich gesehen habe.
Daniel Seither
1
Ich denke, Vault unterstützt es jetzt: "Die Vault-Funktion kann auch beliebige Dateien verschlüsseln, sogar Binärdateien. Wenn eine tresorverschlüsselte Datei als src-Argument für das Kopiermodul angegeben wird, wird die Datei am Ziel auf dem Zielhost abgelegt entschlüsselt (vorausgesetzt, beim Ausführen des Spiels wird ein gültiges Tresorkennwort angegeben). " - docs.ansible.com/ansible/playbooks_vault.html
Mike Gleason jr. Couturier
2
Beachten Sie, dass sie den von @MikeGleasonjrCouturier zitierten Text anscheinend auf eine andere Seite in der ansible-Dokumentation verschoben haben. Siehe jetzt docs.ansible.com/ansible/latest/vault.html .
Liam
2

Die Art und Weise, wie wir das für unser ansibles Setup tun, ist:

- Wir verschlüsseln einzelnes sensibles Material (eine kleine Teilmenge unseres Repositorys) mit https://www.agwa.name/projects/git-crypt/. - Wir alle verpflichten uns immer mit Git-Sign-Tags. - Wir überprüfen regelmäßig, ob nicht signierte Dateien vorhanden sind

Der Vorteil von Git-Crypt ist, dass die Verschlüsselung transparent ist, da sie auf Git-Filtern basiert. Außerdem können Sie Entwicklern Zugriff auf das Repository gewähren, ohne den verschlüsselten Inhalt zu beeinträchtigen (verschlüsselte Dateien werden ignoriert, wenn kein Entschlüsselungsschlüssel verfügbar ist).

MemCtrl
quelle