¿Cómo ejecuto los playbooks de Ansible Azure mientras evito almacenar credenciales en archivos?


12

Antecedentes

  1. Usamos Ansible para aprovisionar y administrar la infraestructura de Azure. En este momento ejecutamos Ansible "manualmente", es decir, ejecutamos manualmente libros de jugadas para diversas tareas automatizadas. No hay infraestructura de CI.
  2. Probablemente no sea relevante, pero gestionamos nuestro inventario mediante un script dinámico azure_rm.py.
  3. Nos alienta a ser lo más seguro posible, es decir
    1. No almacene las contraseñas de Vault en ~/.vault_passo en ningún archivo local
    2. No almacene los secretos de Azure en ~/.azure/credentials
    3. No almacene nada seguro .bashrc.

En tal escenario, tengo problemas para encontrar una estrategia coherente para garantizar que mis libros de jugadas puedan acceder a los secretos de Azure, mientras sigo las pautas anteriores.

Pregunta

¿Cómo puedo evitar almacenar las credenciales de Ansible Vault y Azure en los archivos, sin dejar de garantizar que mis libros de jugadas puedan acceder a ellos?

Lo que he intentado

Hasta ahora he creado un script de envoltura que

  1. pide al usuario la contraseña de Vault
  2. Utiliza eso para descifrar un script de Vaulted Shell
  3. Evalúa el script, que carga las variables de entorno de Azure en el entorno;
  4. Ejecuta el libro de jugadas en el entorno que se ha configurado de este modo.

¿Hay alguna solución mejor (más elegante, menos complicada, más "Ansible")?


¿Qué te molesta más en este flujo de trabajo?
Konstantin Suvorov

@KonstantinSuvorov es principalmente la cantidad de aros que necesito saltar para lograr lo que parece (al menos para mí) un requisito bastante común en las empresas con un alto nivel de cumplimiento.
Vish

Respuestas:


8

Contraseña de la bóveda

En primer lugar, debe familiarizarse con el hecho de que el archivo de contraseña de bóveda puede ser un script ejecutable. En este caso, Ansible lo ejecuta y espera recibir la contraseña como salida.

Por ejemplo, puede usar gpg-agento keychainalmacenar su contraseña real y desbloquearla cuando sea necesario. Lea más en esta publicación de blog: https://benincosa.com/?p=3235

Si eres un poco paranoico, puedes agregar una notificación cuando se llama a tu script de contraseña, así:

#!/bin/bash
PARENT_PROCESS=$(ps -p $PPID -o args | tail -n 1)
osascript -e "display notification \"Vault password used by ${PARENT_PROCESS}\" with title \"Ansible\" sound name \"default\""
gpg --batch --use-agent --no-tty --decrypt key.gpg 2>/dev/null

Este script de contraseña de almacén utiliza key.gpgcomo clave de almacén real y también muestra una notificación emergente (para MacOS) con el nombre del proceso principal cuando se utiliza el script. Gpg-agent almacena en caché la contraseña de desbloqueo durante algún tiempo, por lo que no es necesario ingresar la contraseña cada vez que inicie el libro de jugadas.

Solo ponte vault_password_file = ./vault_pass.shen tu ansible.cfg.

Medio ambiente

Dijiste que lo usas azure_rm.pycomo script de inventario dinámico. Esto significa que debe establecer credenciales en sus variables de entorno antes de iniciar ansible-playbook para que pueda usarlas.

Puedes hacer dos archivos:

secure_env (cifrado con bóveda):

export AZURE_SECRET=xxx;export AZURE_SUBSCRIPTION_ID=xxx;

set_env (Texto sin formato):

echo -n "Setting secure vars... "
eval $(ansible-vault view secure_env)
echo "done."

Cuando abre una nueva terminal para ejecutar sus tareas de automatización, debe ejecutar:

source set_env

En este momento, bash evalúa set_envy secure_env(descifrado a través de ansible-vault). Después de este comando, tiene credenciales de Azure definidas para el shell actual, por lo que puede ejecutar libros de jugadas como de costumbre:

ansible-playbook provision-my-azure-instances.yml

Entonces, utilizando estos dos enfoques, puede almacenar key.gpgy secure_enven su repositorio; luego, en la nueva llamada de terminal source set_envuna vez, ingrese la contraseña de gpg una vez (para desbloquear el uso futuro de key.gpg); luego llame ansible-playbooktantas veces como quiera sin ninguna contraseña.


Gracias por la respuesta. Déjame probar esto durante la semana.
Vish

Entonces, la principal ventaja sobre mi enfoque original es que usa GPG, que trae beneficios de almacenamiento en caché, ¿verdad? El enfoque ambiental es similar al que se me ocurrió.
Vish

1
Desde su OP, entiendo que usa wrapper cada vez que ejecuta un libro de jugadas. Con el sourceenfoque, configura el entorno una vez por sesión de terminal y puede utilizar toda la gama de herramientas por separado: ansible-playbooks, scripts de inventario, cli azul, sin envoltorios.
Konstantin Suvorov

Ah, entendido. Le diré esto a mi equipo. Aceptar su respuesta como una solución más conveniente. Gracias por la investigación y explicación! Además, me gustó tu blog :)
Vish

El principal beneficio de usar GPG (o un llavero en macOS o Linux) es que cada miembro del equipo tiene su propia autenticación para desbloquear una clave privada exclusiva para ellos. Esta clave se usa para desbloquear la contraseña de Ansible Vault, que es un secreto compartido. Debe rotar todos sus secretos si alguien abandona el equipo de todos modos, incluida la contraseña de Ansible Vault, pero al menos las contraseñas GPG / llavero no tienen que cambiar.
RichVel

2

Lea https://docs.ansible.com/ansible/2.4/vault.html Desde Ansible 2.4 se podría usar --vault-id @prompt.

Cifre un archivo usando ansible-vault:

ansible-vault encrypt /path/to/encrypted/file

Ejecute el libro de jugadas y dará como resultado:

fatal: [localhost]: FAILED! => {"msg": "A vault password or secret must be
specified to decrypt /path/to/encrypted/file"}

Hay varias opciones para descifrar archivos, que incluyen @prompt:

ansible-playbook some-playbook --vault-id @prompt

preguntará:

Vault password (default):

Una vez que se ha ingresado la contraseña de la bóveda, el libro de jugadas debe tener éxito.


1
Al leer la página, parece que hay una solución allí, pero no se puede resolver usando solo el enlace. ¿Podría por favor elaborar?
Vish

Gracias por elaborar De hecho, estoy pidiendo al usuario una contraseña de bóveda, usando la --ask-vault-passopción anterior . Y no entiendo cómo reemplazarlo con --vault-idrespondería la gran pregunta de un mejor flujo de trabajo.
Vish

Cuando me hizo referencia al vínculo que lo veo una opción interesante: ansible-playbook --vault-id my-vault-password.py. Pensé que quizás tenías una solución para usar un script de Python :) También estoy pensando en esto.
Vish
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.