Ansible Vault: Como proteger datos sensitivos en tus playbooks

Luego de mas de siete (7) meses sin lanzar una publicación, reaparezco con un post dedicado a mi herramienta favorita para hacer automatizaciones y deployments, en este caso te mostrare como encriptar datos sensitivos en los playbooks para Ansible.

Algunos ya deben tener idea de lo que es Ansible, pero para los que no, Ansible es una simple herramienta open source desarrollada en python que ha sido categorizada como un motor de orquestación que nos permite automatizar las tareas necesarias para el aprovisionamiento y despliegue de infraestructuras informáticas.

Ansible Vault es una herramienta incluida dentro de Ansible que permite generar y encriptar datos sensitivos tales como password o variables en los playbooks y no incluirlos como texto plano.

Ahora bien, para continuar con este post, tienes que contar con la ultima instalación de Ansible, las pueden instalar a través del manejador de paquetes de tu distro favorita o bien utilizando el manejador de paquetes para python llamado pip.

Para este caso usaremos como ejemplo, subir una archivo cualquiera a un bucket Amazon Web Services S3, para ello deberemos contar con una cuenta en amazon y las credenciales de un usuario que permite hacer put en un bucket. Utilizaremos dos archivos uno llamado playbook-put-files.yml y el otro denominado playbook-vault-s3.yml

Para el playbook-put-files.yml , lo generamos con lo siguiente:

- name: 'localhost'
  hosts: 'localhost'
  port: 22
  user: root
  gather_facts: False
  vars:
  tasks:
  - name: Include variables for S3
    include_vars: ~/playbook-vault-s3.yml

  - name: Send file to AWS S3
     s3: "aws_access_key={{ aws_access }} aws_secret_key={{ aws_secret }} bucket=s3-backut object=files/testing src=~/testing-s3.tar.gz mode=put"


En lo anterior hemos establecido para la primera tarea que se incluya desde el archivo playbook-vault-s3.yml las variables para el playbook, y para la segunda tarea que envíe nuestro testing-s3.tar.gz al bucket de nombre s3-backut en el directorio files/testing. Ahora, crearemos nuestro vault llamado playbook-vault-s3.yml , para ello ejecutaremos:

ansible-vault create ~/playbook-vault-s3.yml
New Vault password:
Confirm New Vault password:

Generaremos las password correspondientes para el vault , luego de eso nuestro editor por defecto se abrirá y en el estableceremos lo siguiente, que corresponde al ID y Secret Key en AWS:

---
aws_secret: "3vLkeqAfETfQh+tBvDZXy...."
aws_access: "FGHP3LW44GFC..."

Cerramos el editor y ya se encuentra generado el vault con las variables almacenadas. Si intentemos editar ese archivo veremos que se encuentra encriptado utilizando la especificación AES256 y es parecido a lo siguiente:

$ANSIBLE_VAULT;1.1;AES256
31353536356232663761643635613863663532653563333763896435393739613165663564393065
33373032343232373339326261343231656634336239766650a393835313861616237663366663834
3632653764623137373539336123137613483565656530383764373238303735621236326130663861
6636356439373564340a393866366332613164303732396134646135626237613435333330393338
3238345636346336663362378538636665376266653165376530663965653137366239393562396539
38653033390338376133306662636432366639373433316434796130373837373830386366326639
646434366334616361623904566653264383262313833367531653434373637303733363634656637
30666562643131646665613036316437313261653536643966316236666339336136336165333933
6164

Para editar nuevamente el vault, ejecutaremos, Ansible vault te pedira que escribas la password que le colocamos anteriormente:

ansible-vault edit ~/playbook-vault-s3.yml
Vault password:

Una vez editado el archivo, lo guardamos. Si deseamos cambiar el password del vault creado anteriormente, tan solo debemos ejecutar lo siguiente:

ansible-vault rekey ~/playbook-vault-s3.yml
Vault password:
New Vault password:
Confirm New Vault password:
Rekey successful

Si tan solo queremos ver lo que se encuentra encriptado en el vault creado, ejecutamos:

ansible-vault view ~/playbook-vault-s3.yml

Ahora bien para desencriptar el anterior archivo al que ya hemos encriptado ejecutaremos:

ansible-vault decrypt ~/playbook-vault-s3.yml
Vault password:
Decryption successful

Y para volver a encriptarlo, ejecutaremos:

ansible-vault encrypt ~/playbook-vault-s3.yml
New Vault password:
Confirm New Vault password:
Encryption successful

Tambien, lo anterior ejecutado lo podemos utilizar para cuando tenemos un archivo creado al que queremos aplicarle la encriptacion. Llegados a este punto vamos a ver como agregar nuestro vault a los playbook o roles de Ansible. Volviendo al anterior playbook creado llamado playbook-put-files.yml, la primera task le indicamos que incluya el vault creado, por lo que al ejecutar ese playbook hay que hacerlo con la siguiente opción:

ansible-playbook ~/playbook-put-files.yml --step -vvvv --ask-vault-pass


Al iniciar, nos solicitara la password con la que encriptamos el vault, luego sera incluido dentro de nuestro playbook con las variables necesarias para ejecutar el resto de las tareas.

Adicional, es posible almacenar las password para desencriptar el vault, para ello creamos un archivo al que llamaremos playbook-vault-pass.passwd , le he agregado como extension .passwd para mejor manejo, en ese archivo tan solo tendremos que colocar las password que utilizamos para desencriptat el vault. Luego al playbook lo ejecutamos con los siguientes parametros:

ansible-playbook ~/playbook-put-files.yml --step -vvvv --vault-password-file ~/.playbook-vault-pass.passwd


Notese que el archivo .playbook-vault-pass.passwd contiene el punto (.) antes del nombre y extensión del archivo para agregarle el valor de archivo oculto.

Ya luego si somos creativos en ese mismo playbook , podemos almacenar la password en otro localización, traerla a donde estas ejecutando el playbook y luego eliminar el archivo con la password del vault, es cuestión de imaginárselo como hacerlo.

Hasta acá esta pequeña solucion que nos ayudara a elevar las políticas de seguridad a la hora de desplegar y aprovisionar nuestras infraestructura informaticas. Si tienes alguna pregunta, déjala abaja en la casilla de comentarios.