Comment crypter des fichiers binaires dans Ansible?

9

Nous utilisons Ansible Vault pour stocker les mots de passe, les clés privées des certificats, etc. dans notre référentiel git Ansible Playbook. Toutes nos données privées existantes sont sous forme de texte, nous pouvons donc les stocker dans des variables. Ceux-ci sont ensuite utilisés dans des modèles ou avec le contentparamètre du module de copie.

Maintenant, nous avons un fichier Java KeyStore, qui a malheureusement un format binaire. En tant que tel, il ne peut pas être stocké dans une variable - ou du moins je ne sais pas comment le faire. Quelle serait la façon la plus simple d'avoir notre fichier correctement chiffré pendant qu'il se trouve dans git, mais disponible lors de l'exécution ansible-playbook?

Ce que j'ai déjà essayé sans succès:

  • Encodage du fichier binaire en base64, stockage des données encodées dans une variable et utilisation du module modèle avec {{base64_data | b64decode}}. Conduit à beaucoup de EF BF BDvidage hexadécimal du fichier résultant. Les trois octets codent le caractère de remplacement Unicode en UTF-8, il y a donc un problème avec l'interprétation des données binaires comme du texte.
  • Encodage du fichier binaire en base64, stockage des données encodées dans une variable et utilisation du module de copie avec content="{{base64_data | b64decode}}". Ansible se plaint de "Une variable a inséré un nouveau paramètre dans les arguments du module." Lors de l'utilisation de guillemets simples au lieu de guillemets doubles, Ansible se plaint de la "chaîne d'arguments d'analyse d'erreur" et d'une copie de toutes les données binaires, vidées sur le terminal ...
Daniel Seither
la source
À partir d'une discussion dans groups.google.com/d/topic/ansible-project/IinZK14FyX4, je conclus qu'ansible ne le prend pas en charge et que vous devez faire des trucs base64 par vous-même, mais qu'il peut y avoir des trucs de tiers cela peut le rendre plus facile.
Antonis Christofides
Merci, ça va bien. Je vais l'essayer et faire un rapport ...
Daniel Seither
Non, cela ne fonctionne malheureusement pas (voir la question modifiée). Il y a une discussion autour d'une demande d'extraction ansible qui pourrait être pertinente: github.com/ansible/ansible-modules-extras/pull/142
Daniel Seither
Avez-vous pensé à envelopper cela avec des appels GPG? Vous pouvez avoir la représentation ASCII d'une clé privée GPG stockée dans Ansible Vault, et l'utiliser pour décrypter votre fichier binaire, qui pourrait ensuite être stocké dans git sans problème.
Christopher Karel
Merci pour votre suggestion, mais cette solution de contournement est un peu plus complexe que je ne le souhaiterais. J'ai déjà pensé à copier le KeyStore encodé en base64 sur la machine cible et à avoir un gestionnaire qui décode le fichier lors de la mise à jour, mais je préférerais une solution qui ne jette pas les fichiers temporaires.
Daniel Seither

Réponses:

4

Pour ce faire, vous pouvez utiliser une commande shell avec une variable base64.

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

Eric

elhostis
la source
C'est définitivement une option, d'autant plus qu'elle n'utilise pas de fichier temporaire. Malheureusement, cela ne permet pas à Ansible de détecter si un changement a été effectué, mais c'est mieux que toutes les autres solutions que j'ai vues.
Daniel Seither
1
Je pense que le coffre-fort le prend en charge maintenant: "La fonction de coffre-fort peut également chiffrer des fichiers arbitraires, même des fichiers binaires. Si un fichier chiffré par le coffre-fort est donné comme argument src au module de copie, le fichier sera placé à la destination sur l'hôte cible déchiffré (en supposant qu'un mot de passe de coffre-fort valide est fourni lors de l'exécution de la lecture). " - docs.ansible.com/ansible/playbooks_vault.html
Mike Gleason jr Couturier
2
Notez qu'ils semblent avoir déplacé le texte cité par @MikeGleasonjrCouturier vers une autre page de la documentation ansible; voir docs.ansible.com/ansible/latest/vault.html maintenant.
Liam
2

La façon dont nous le faisons pour notre configuration ansible est la suivante:

-Nous cryptons le matériel sensible individuel (un petit sous-ensemble de notre référentiel) en utilisant https://www.agwa.name/projects/git-crypt/ -Nous nous engageons toujours en utilisant des balises git sign -Nous vérifions périodiquement s'il y a des fichiers non signés

L'avantage de git-crypt est que, puisqu'il s'appuie sur des filtres git, le cryptage est transparent. De plus, vous pouvez donner accès au référentiel aux développeurs sans compromettre le contenu chiffré (il ignorera les fichiers chiffrés si aucune clé de déchiffrement ne peut être obtenue).

MemCtrl
la source