¿Cómo cifrar archivos binarios en Ansible?

9

Estamos utilizando Ansible Vault para almacenar contraseñas, claves privadas para certificados, etc. en nuestro repositorio git de Ansible Playbook. Todos nuestros datos privados existentes están en forma de texto, por lo que podemos almacenarlos en variables. Estos se utilizan en plantillas o con el contentparámetro del módulo de copia.

Ahora, tenemos un archivo Java KeyStore, que lamentablemente tiene un formato binario. Como tal, no se puede almacenar dentro de una variable, o al menos no sé cómo hacerlo. ¿Cuál sería la forma más fácil de cifrar nuestro archivo correctamente mientras descansa en git, pero disponible cuando se ejecuta ansible-playbook?

Lo que ya he intentado sin éxito:

  • Codificar el archivo binario en base64, almacenar los datos codificados en una variable y usar el módulo de plantilla con {{base64_data | b64decode}}. Lleva a muchos EF BF BDvolcados hexadecimales del archivo resultante. Los tres bytes codifican el carácter de reemplazo Unicode en UTF-8, por lo que hay un problema con la interpretación de los datos binarios como texto.
  • Codificar el archivo binario en base64, almacenar los datos codificados en una variable y usar el módulo de copia con content="{{base64_data | b64decode}}". Ansible se queja con "Una variable inserta un nuevo parámetro en los argumentos del módulo". Al usar comillas simples en lugar de comillas dobles, Ansible se queja con "cadena de argumento de análisis de error", y una copia de todos los datos binarios, volcados al terminal ...
Daniel Seither
fuente
De una discusión en groups.google.com/d/topic/ansible-project/IinZK14FyX4 , concluyo que ansible no es compatible con esto, y que tiene que hacer algunas cosas de base64 por su cuenta, pero que puede haber algunas cosas de terceros eso puede hacerlo más fácil.
Antonis Christofides
Gracias, esto se ve bien. Lo intentaré e informaré ...
Daniel Seither
No, lamentablemente no funciona (ver pregunta editada). Hay una discusión sobre una solicitud de extracción ansible que podría ser relevante: github.com/ansible/ansible-modules-extras/pull/142
Daniel Seither
¿Has pensado en envolver esto con llamadas GPG? Podría tener la representación ASCII de una clave privada GPG almacenada en Ansible Vault, y usarla para descifrar su archivo binario, que luego podría almacenarse en git sin ningún problema.
Christopher Karel
Gracias por su sugerencia, pero esta solución es un poco más complicada de lo que me gustaría. Ya pensé en copiar el KeyStore codificado en base64 en la máquina de destino y tener un controlador que decodifique el archivo en la actualización, pero preferiría una solución que no arroje archivos temporales.
Daniel Seither

Respuestas:

4

Puede usar un comando de shell con una variable base64 para hacer eso.

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

Eric

elhostis
fuente
Esta es definitivamente una opción, especialmente porque no usa un archivo temporal. Lamentablemente, no permite que Ansible detecte si se realizó un cambio, pero es mejor que todas las otras soluciones que he visto.
Daniel Seither
1
Creo que vault lo admite ahora: "La función de bóveda también puede encriptar archivos arbitrarios, incluso archivos binarios. Si se entrega un archivo encriptado en bóveda como argumento src al módulo de copia, el archivo se colocará en el destino en el host de destino. descifrado (suponiendo que se proporcione una contraseña de bóveda válida al ejecutar la reproducción) ". - docs.ansible.com/ansible/playbooks_vault.html
Mike Gleason jr Couturier el
2
Tenga en cuenta que parecen haber movido el texto citado por @MikeGleasonjrCouturier a una página diferente en la documentación ansible; ver docs.ansible.com/ansible/latest/vault.html ahora.
Liam
2

La forma en que hacemos eso para nuestra configuración ansible es:

-Ciframos material sensible individual (un pequeño subconjunto de nuestro repositorio) usando https://www.agwa.name/projects/git-crypt/ -Todos nos comprometemos siempre usando etiquetas de signo git -Verificamos periódicamente si hay archivos sin firmar

La ventaja de git-crypt es que, como se basa en filtros git, el cifrado es transparente. Además, puede dar acceso al repositorio a los desarrolladores sin comprometer el contenido cifrado (ignorará los archivos cifrados si no se puede obtener una clave de descifrado).

MemCtrl
fuente