Cómo usar Ansible Vault para almacenar claves secretas
Con la mayor parte de la automatización, se necesitan credenciales para autenticar y usar recursos seguros. Lo que siempre ha sido un desafío es la mejor manera de almacenar esas credenciales de forma segura. Ansible es un sistema de automatización que proporciona aprovisionamiento de software, gestión de configuración e implementación de aplicaciones.
Al igual que con cualquier sistema de automatización, Ansible necesita una forma segura de almacenar secretos. En el caso de Ansible, ese sistema se llama Ansible Vault. Ansible Vault proporciona una solución multiplataforma para almacenar credenciales de forma segura.
Presentación de Ansible Vault
Ansible Vault se puede utilizar para cifrar cualquier archivo, o las propias variables, desde un libro de jugadas. De forma predeterminada, se utiliza AES, que es un cifrado basado en secreto compartido. Tanto los métodos de cifrado de archivos como los de variables tienen sus ventajas e inconvenientes.
Cifrado de archivos
Para crear un nuevo archivo cifrado llamado secrets.yml
, simplemente use el siguiente comando ansible-vault
.
ansible-vault create secrets.yml
Después de solicitar una contraseña, el comando ansible-vault
iniciará el editor de archivos del sistema predeterminado, lo que resultará en un archivo cifrado al guardarlo.
De manera similar, para cifrar un archivo previamente sin cifrar, use el siguiente comando ansible-vault
. Tenga en cuenta que esto usa el parámetro encrypt
en lugar del parámetro create
.
ansible-vault encrypt secrets.yml
La desventaja de usar el cifrado de archivos es la legibilidad. Si abre el archivo, encontrará que sin el descifrado, es imposible descifrar el contenido.
Cifrado de variables
Dentro de un libro de jugadas, es posible usar una variable cifrada anteponiendo los datos cifrados con la etiqueta !vault
. Ejecutar el argumento encrypt_string
del comando ansible_vault
dará como resultado una cadena cifrada que puede usar dentro de sus playbooks.
ansible-vault encrypt_string 'secret_data' --name 'my_secret'
Después de solicitarle una contraseña, obtendrá la siguiente cadena cifrada.
my_secret: !vault |
$ANSIBLE_VAULT;1.1;AES256
37636561366636643464376336303466613062633537323632306566653533383833366462366662
6565353063303065303831323539656138653863353230620a653638643639333133306331336365
62373737623337616130386137373461306535383538373162316263386165376131623631323434
3866363862363335620a376466656164383032633338306162326639643635663936623939666238
3161
El cifrado variable es excelente para la legibilidad, pero la capacidad de usar el cambio de clave de la línea de comandos se sacrifica cuando se usa este método.
Uso de Ansible Vault en la práctica
Puede darse cuenta de que usar Ansible Vault en producción es un desafío. Para usar Ansible Vault de manera efectiva, las siguientes técnicas facilitan este proceso.
- Descifrado no solicitado
- Bóvedas múltiples
- Cambio de claves
Descifrado no solicitado
Una opción para descifrar de manera transparente un archivo o una variable mientras usa Ansible es almacenar la contraseña dentro de un archivo de contraseña protegido y sin versión. Para hacer referencia a esta contraseña almacenada, simplemente ingrese la ubicación del archivo usando el parámetro vault-password-file
.
ansible-playbook --vault-password-file /path/vault-password-file secrets.yml
Esto descifrará todos los archivos o variables cifrados incluidos utilizando la contraseña incluida.
Es muy importante no enviar su archivo de contraseña de texto sin formato a su sistema de control de versiones. De manera similar, proteja este archivo solo para el usuario o grupo que necesita acceso a la contraseña almacenada en el sistema de archivos usando listas de control de acceso (ACL).
Múltiples bóvedas
Aunque es conveniente tener una sola bóveda con todos los secretos cifrados, una mejor práctica de seguridad es separar las credenciales seguras en bóvedas relevantes separadas. Un ejemplo de esto sería separar un entorno de producción y desarrollo. Afortunadamente, Ansible Vault nos permite crear varias bóvedas y referencias de las que proceden los datos cifrados usando una etiqueta.
ansible-vault create --vault-id prod@prompt prod-secrets.yml
El código anterior creará una bóveda prod
y le solicitará su contraseña en tiempo de ejecución (como se indica en la cadena @prompt
). Si ya tiene un archivo de contraseña que le gustaría usar, simplemente ingrese la ruta al archivo.
ansible-vault create --vault-id prod@/path/prod-vault-password-file prod-secrets.yml
Digamos que queremos encriptar la misma variable my_secret
, pero esta vez almacenarla en nuestra bóveda prod
. Al igual que antes, usar encrypt_string
pero con el vault-id
relevante permite almacenar el secreto en la ubicación especificada.
ansible-vault encrypt_string --vault-id prod@/path/prod-vault-password-file 'secret_data' --name 'my_secret'
Notará que después de la cadena AES256
, se muestra un nuevo texto, prod
. Esto indica la bóveda en la que se encuentra el texto cifrado.
my_secret: !vault |
$ANSIBLE_VAULT;1.1;AES256;prod
37636561366636643464376336303466613062633537323632306566653533383833366462366662
6565353063303065303831323539656138653863353230620a653638643639333133306331336365
62373737623337616130386137373461306535383538373162316263386165376131623631323434
3866363862363335620a376466656164383032633338306162326639643635663936623939666238
3161
¿Qué sucede si desea incluir varias bóvedas en un solo libro de jugadas? Puede pasar fácilmente varias declaraciones vault-id
en una línea de comando ansible-playbook
.
ansible-playbook --vault-id dev@/path/dev-vault-password-file --vault-id prod@/path/prod-vault-password-file site.yml
Cambio de clave
Finalmente, es importante cambiar regularmente sus contraseñas. Para los archivos que están encriptados, puede usar la línea de comando a continuación. Pasar el parámetro new-vault-id
facilita el cambio de la contraseña con la que se cifran los secretos.
ansible-vault rekey --vault-id prod@/path/prod-vault-password-file-old --new-vault-id prod@/path/prod-vault-password-file-new site.yml
Como se indicó anteriormente, el cambio de clave de la línea de comandos no funciona para las variables cifradas. En este caso, deberá volver a cifrar individualmente las cadenas y reemplazarlas en un libro de jugadas determinado.
Mejores prácticas
La seguridad es difícil, especialmente cuando se trata de usar secretos dentro de los sistemas de automatización. Con eso en mente, a continuación se presentan varias prácticas recomendadas para usar al utilizar Ansible Vault. Aunque hemos cubierto algunos de estos anteriormente, es prudente reiterar esas prácticas.
- Archivos de contraseña no versionados y protegidos por ACLLos archivos de contraseña no deben almacenarse en sistemas de control de versiones, como GIT. Además, asegúrese de que solo los usuarios adecuados puedan acceder al archivo de contraseñas.
- Bóvedas separadasNormalmente, se utilizan muchos entornos diferentes. Por lo tanto, es mejor separar las credenciales requeridas en las bóvedas correspondientes.
- Reingreso regular de archivos y contraseñas variablesEn caso de reutilización o fuga de contraseñas, es mejor volver a ingresar regularmente las contraseñas en uso para limitar la exposición.
Conclusión
Al igual que con cualquier sistema de automatización, es de vital importancia que los secretos estén debidamente protegidos y controlados. Con Ansible Vault, ese proceso se vuelve fácil y flexible. Usando las mejores prácticas descritas anteriormente, almacenar y usar secretos dentro de Ansible es seguro y protegido.
Para extender Ansible Vault aún más y llevar este proceso al siguiente nivel, puede usar scripts que se integren en las soluciones de administración de contraseñas. Como puede ver, Ansible Vault es una excelente manera de usar secretos dentro de los libros de jugadas de Ansible.