Cómo usar Ansible Vault para almacenar claves secretas

Contenidos

Con la mayoría de la automatización, se necesitan credenciales para autenticar y usar recursos seguros. Lo que siempre ha sido un desafío es cuál es la mejor forma de almacenar esas credenciales de forma segura. Ansible es un sistema de automatización que proporciona aprovisionamiento de software, administración de la configuración e implementaciones de aplicaciones.

Del mismo modo que con cualquier sistema de automatización, Ansible necesita una forma segura de almacenar secretos. En el caso de Ansible, ese sistema se llama Bóveda Ansible. Ansible Vault proporciona una solución multiplataforma para guardar credenciales de forma segura.

Presentamos Ansible Vault

Ansible Vault se puede usar para cifrar cualquier archivo, o variables en sí mismas, desde dentro de un libro de jugadas. De forma predeterminada, se utiliza AES, que es un cifrado basado en secretos compartidos. Tanto los métodos de cifrado de archivos como los de variables disponen sus ventajas e inconvenientes.

Cifrado de archivos

Para crear un nuevo archivo cifrado llamado secrets.yml, simplemente use lo siguiente ansible-vault mando.

ansible-vault create secrets.yml

Después de solicitar una contraseña, el ansible-vault El comando iniciará el editor de archivos del sistema predeterminado, lo que dará como consecuencia un archivo cifrado al guardar.

De manera equivalente, para encriptar un archivo previamente no encriptado, use lo siguiente ansible-vault mando. Tenga en cuenta que esto utiliza el encrypt parámetro en lugar del create parámetro.

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 variable

Dentro de un libro de jugadas, es factible utilizar una variable encriptada anteponiendo los datos encriptados con el !vault etiqueta. Ejecutando el encrypt_string argumento de la ansible_vault El comando dará como consecuencia una cadena encriptada que puede utilizar dentro de sus libros de jugadas.

ansible-vault encrypt_string 'secret_data' --name 'my_secret'

Después de solicitarle una contraseña, obtendrá la próxima cadena encriptada.

my_secret: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          37636561366636643464376336303466613062633537323632306566653533383833366462366662
          6565353063303065303831323539656138653863353230620a653638643639333133306331336365
          62373737623337616130386137373461306535383538373162316263386165376131623631323434
          3866363862363335620a376466656164383032633338306162326639643635663936623939666238
          3161

El cifrado variable es excelente para la legibilidad, pero se sacrifica la capacidad de utilizar el cambio de clave de la línea de comandos cuando se utiliza este método.

Uso de Ansible Vault en la práctica

Es factible que se dé cuenta de que utilizar Ansible Vault en producción es un desafío. Para usar Ansible Vault de forma eficaz, las siguientes técnicas facilitan este procedimiento.

  • Descifrado espontáneo
  • Varias bóvedas
  • Rekeying

Descifrado espontáneo

Una opción para descifrar de forma transparente un archivo o variable mientras utiliza 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 pase la ubicación del archivo usando el vault-password-file parámetro.

ansible-playbook --vault-password-file /path/vault-password-file secrets.yml

Esto descifrará todos los archivos o variables cifrados incluidos usando 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 equivalente, proteja este archivo solo para el usuario o grupo que necesite ingresar a la contraseña almacenada en el sistema de archivos a través de listas de control de acceso (ACL).

Varias bóvedas

Aún cuando es conveniente tener una única bóveda con todos los secretos encriptados, una mejor práctica de seguridad es separar las credenciales seguras en bóvedas relevantes independientes. Un ejemplo de esto sería separar un entorno de producción y desarrollo. Por suerte, Ansible Vault nos posibilita crear múltiples bóvedas y referencias de las que provienen los datos cifrados a través de una etiqueta.

ansible-vault create --vault-id prod@prompt prod-secrets.yml

El código anterior creará un prod bóveda y solicite su contraseña en tiempo de ejecución (como se indica en el @prompt cuerda). Si ya tiene un archivo de contraseña que le gustaría utilizar, simplemente pase la ruta al archivo.

ansible-vault create --vault-id prod@/path/prod-vault-password-file prod-secrets.yml

Digamos que queremos cifrar lo mismo my_secret variable, pero esta vez almacene eso en nuestro prod bóveda. Del mismo modo que antes, usando encrypt_string pero con lo relevante vault-id posibilita 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ás que después de la AES256 cadena, una nueva pieza de texto, prod se muestra. 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 en múltiples vault-id declaraciones en un ansible-playbook línea de comando.

ansible-playbook --vault-id dev@/path/dev-vault-password-file --vault-id prod@/path/prod-vault-password-file site.yml

Rekeying

Por último, es esencial realizar un ciclo regular de contraseñas. Para los archivos que están encriptados, puede utilizar la línea de comando a continuación. Pasando en el new-vault-id El parámetro 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 señaló previamente, el cambio de clave de la línea de comandos no funciona para las variables cifradas. En esta circunstancia, 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 utilizar secretos dentro de los sistemas de automatización. Teniendo esto en cuenta, a continuación se muestran algunas de las mejores prácticas para usar cuando se utiliza Ansible Vault. Aún cuando hemos cubierto algunos de estos previamente, es prudente reiterar esas prácticas.

  • Archivos de contraseña protegidos y sin versión de ACLLos archivos de contraseña no deben almacenarse en sistemas de control de versiones, como GIT. Al mismo tiempo, asegúrese de que solo los usuarios adecuados puedan ingresar al archivo de contraseñas.
  • Bóvedas separadasRegularmente, se usan muchos entornos diferentes. Por eso, es mejor separar las credenciales requeridas en las bóvedas apropiadas.
  • Cambio de clave regular de archivos y contraseñas variablesEn el caso de la reutilización o filtración de contraseñas, es mejor volver a introducir las contraseñas en uso con regularidad para limitar la exposición.

Conclusión

Del mismo modo que con cualquier sistema de automatización, es de vital relevancia que los secretos estén debidamente protegidos y controlados. Con Ansible Vault, ese procedimiento se hace fácil y flexible. Usando las mejores prácticas descritas previamente, almacenar y utilizar secretos dentro de Ansible es seguro.

Para extender Ansible Vault aún más y llevar este procedimiento al siguiente nivel, puede utilizar scripts que se integran en las soluciones de administración de contraseñas. Como puede ver, Ansible Vault es una magnífica manera de utilizar secretos dentro de los libros de jugadas de Ansible.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.