Guía para asegurar secretos de configuración usando Ansible Vault de manera efectiva
Asegura secretos de Ansible con comandos de Vault, archivos de variables cifrados, manejo de contraseñas y uso práctico en playbooks.
Guía para asegurar secretos de configuración usando Ansible Vault de manera efectiva
Ansible Vault te ayuda a mantener los secretos de configuración fuera del texto plano mientras sigues usando variables normales de Ansible. Si tus playbooks contienen contraseñas de bases de datos, claves API o claves privadas, comprometerlos sin cifrar puede convertir una fuga de repositorio rutinaria en un incidente de infraestructura.
Ansible Vault cifra archivos de variables estructuradas o valores individuales y los descifra solo cuando Ansible tiene la contraseña de Vault. Esta guía muestra los comandos que realmente usarás, cómo cargar variables cifradas en playbooks y dónde suelen cometer errores los equipos.
Comprendiendo los conceptos básicos de Ansible Vault
Ansible Vault utiliza un cifrado simétrico fuerte (AES256) para proteger los datos. El mecanismo central requiere una Contraseña de Vault que actúa como clave maestra. Esta contraseña debe proporcionarse a Ansible cada vez que necesite acceder o modificar contenido cifrado.
¿Por qué usar Ansible Vault?
- Seguridad: Mantiene los datos sensibles cifrados en reposo, protegiendo contra violaciones de repositorio.
- Cumplimiento: Ayuda a cumplir con estándares de la industria (por ejemplo, PCI DSS, SOC 2) que requieren cifrado de credenciales.
- Flujo de trabajo: Permite que los archivos de configuración que contienen secretos se comprometan de manera segura en sistemas de control de versiones (como Git).
Comandos esenciales de Ansible Vault
El comando ansible-vault es una utilidad independiente utilizada para gestionar archivos cifrados fuera de la ejecución de un playbook.
1. Crear un nuevo archivo cifrado
Para crear un nuevo archivo destinado específicamente a secretos, usa el comando create. Esto te solicita inmediatamente una nueva contraseña de Vault y luego abre el archivo en tu editor de texto predeterminado ($EDITOR).
ansible-vault create secrets/db_passwords.yml
Contenido de ejemplo (db_passwords.yml después de guardar):
# Este archivo está cifrado
db_user: app_admin
db_pass: ContraseñaAltamenteSegura123!
api_key: abc-123-def-456
Después de guardar y cerrar el editor, el contenido está cifrado y el archivo está listo para ser comprometido en el control de versiones.
2. Ver contenido cifrado
Si necesitas inspeccionar rápidamente el contenido de un archivo cifrado sin editarlo, usa el comando view. Se te solicitará la contraseña de Vault.
ansible-vault view secrets/db_passwords.yml
3. Editar un archivo cifrado existente
El comando edit es la forma principal de modificar secretos. Ansible descifra el archivo, lo abre en tu editor y, al guardarlo, vuelve a cifrar el archivo automáticamente.
ansible-vault edit secrets/db_passwords.yml
Consejo: Asegúrate de que tu variable de entorno
$EDITOResté configurada correctamente (por ejemplo,export EDITOR=vim) para una experiencia de edición fluida.
4. Cifrar y descifrar archivos existentes
Si tienes un archivo de texto plano existente que necesita ser asegurado, usa el comando encrypt. Por el contrario, decrypt se usa para revertir un archivo cifrado a texto plano (úsalo con precaución, generalmente para migración).
# Cifrar un archivo existente
ansible-vault encrypt plain_vars.yml
# Descifrar un archivo cifrado existente (¡Peligroso! Solo úsalo si es necesario)
ansible-vault decrypt secured_vars.yml
5. Cambiar la contraseña de Vault (Reclave)
Para actualizar la contraseña maestra de un archivo cifrado, usa el comando rekey. Esto requiere que proporciones la contraseña actual y luego establezcas una nueva.
ansible-vault rekey secrets/db_passwords.yml
Esto es esencial para rotaciones de seguridad o al hacer la transición a un nuevo sistema de gestión de credenciales.
Integración de secretos cifrados en playbooks de Ansible
Una vez que los archivos están cifrados, necesitas un método para cargarlos durante la ejecución del playbook y proporcionar la contraseña de Vault necesaria.
Cargar variables cifradas
Los archivos de variables cifradas se cargan como cualquier otro archivo de variable, típicamente usando la directiva vars_files en tu playbook.
Ejemplo de playbook (site.yml):
---
- name: Desplegar aplicación que requiere secretos de base de datos
hosts: servidores_web
vars_files:
- secrets/db_passwords.yml # Ansible detecta automáticamente que está cifrado
tasks:
- name: Asegurar que el usuario de la base de datos esté configurado
ansible.builtin.template:
src: config.j2
dest: /etc/app/config.conf
mode: '0600'
# Las variables como {{ db_user }} y {{ db_pass }} ahora están disponibles
Proporcionar la contraseña de Vault durante la ejecución
Ansible ofrece varios métodos seguros para proporcionar la contraseña de Vault sin dejarla expuesta en el historial o scripts.
Método 1: Solicitud interactiva
El método más simple es usar la bandera --ask-vault-pass, que solicita al usuario la contraseña de forma segura en tiempo de ejecución.
ansible-playbook site.yml --ask-vault-pass
Método 2: Usar un archivo de contraseña
Para automatización, pipelines CI/CD o entornos donde las solicitudes interactivas no son deseables, puedes usar un archivo de contraseña en texto plano (a menudo almacenado fuera del repositorio principal y asegurado mediante permisos de archivo restrictivos).
# Nota: El archivo de contraseña DEBE contener SOLO el texto de la contraseña de Vault.
ansible-playbook site.yml --vault-password-file ~/.ansible/vault_key.txt
Método 3: Cifrar variables individuales (encrypt_string)
Si solo necesitas cifrar una variable única y pequeña (por ejemplo, en un archivo de inventario) en lugar de un archivo YAML completo, usa ansible-vault encrypt_string.
# Usa 'echo' o 'printf' para pasar el secreto directamente
ansible-vault encrypt_string 'MiClaveAPISuperSecreta' --name 'prod_api_key'
Este comando genera la cadena cifrada que se puede pegar directamente en un archivo de inventario o variable:
prod_api_key: !vault |
$ANSIBLE_VAULT;1.1;AES256
37666236613364656165386638323438646132646337326462613134373463353434613861313361
... (resto de datos cifrados)
Mejores prácticas para la gestión empresarial de Vault
La gestión efectiva de secretos va más allá de simplemente cifrar un archivo. Adoptar estas mejores prácticas garantiza seguridad y mantenibilidad:
1. Archivo de contraseña de Vault dedicado
Siempre usa el método --vault-password-file en entornos automatizados. El archivo que contiene la contraseña debe tener permisos extremadamente restrictivos (chmod 400) y nunca debe ser comprometido en Git.
2. Segregación de entornos
Usa archivos de Vault separados para diferentes entornos (Desarrollo, Staging, Producción). Esto evita que entornos de bajo riesgo accedan a credenciales de producción de alto riesgo.
vars/prod_vault.ymlvars/stage_vault.yml
Carga estos archivos condicionalmente usando grupos de inventario o lógica condicional en tus playbooks.
3. Usa almacenes de secretos externos cuando Vault no sea suficiente
Para entornos más grandes, considera almacenes de secretos externos como HashiCorp Vault, AWS Secrets Manager o gestión de claves nativa de la nube. Los plugins de búsqueda de Ansible pueden obtener esos valores en tiempo de ejecución, mientras que Ansible Vault sigue siendo útil para secretos pequeños, valores de arranque o equipos que aún no tienen una plataforma de secretos dedicada.
4. Variables de grupo vs. variables de playbook
A menudo es más limpio almacenar variables cifradas bajo group_vars o host_vars usando nombres de archivo de variables normales. Ansible descifra el contenido cifrado cuando se carga el archivo; la extensión es solo una convención, no la característica que desencadena el descifrado.
# Ejemplo de estructura
inventory/
├── hosts
└── group_vars/
└── servidores_web/
└── vault.yml
Mantén Vault práctico
Comienza cifrando los secretos que tus playbooks ya cargan, luego estandariza cómo tu equipo proporciona la contraseña de Vault. Mantén la contraseña de Vault fuera de Git, separa los secretos de producción de los entornos inferiores y rota la contraseña con ansible-vault rekey cuando cambie el acceso.