Como en cualquier infraestructura informática, la seguridad es fundamental. Pero si además hablamos de herramientas tan potentes como Ansible, es importante que protejamos los datos que estamos usando todo lo posible.
Ya vimos como utilizar claves SSH para la comunicación entre nuestro nodo central de Ansible y los hosts bajo su control. Además de ser la opción recomendada por Ansible, nos permite evitar el uso de contraseñas para establecer la conexión.
Hoy vamos a estudiar la herramienta de la que dispone Ansible para realizar tareas de encriptación de nuestros datos.
En una entrda anterior vimos como definir la password utilizada para el escalado de privilegios, es decir para el comando sudo en los hosts remotos. Vimos que la password la definimos en el fichero group_vars/all del siguinte modo:
Password de sudo como variable. |
Como es lógico esta password está en claro en dicho fichero, lo cual requiere que nos aseguremos que tiene los permisos correctos y que solo las personas autorizadas tengan acceso al mismo.
Para conseguir más seguridad, podemos usar vault para encriptar dicha password. El uso de vault para encriptar una cadena de caracteres es tan sencillo como lo siguiente:
Encriptación de una cadena de caracteres con ansible-vault. |
Con esta cadena de caracteres, podemos editar el fichero group_vars/all y sustituir la password en claro por la salida del comando ansible-vault:
Password encriptada en fichero group_vars/all. |
Al encriptar la cadena, Ansible nos ha solicitado una password de encriptación con lo que, a la hora de lanzar un playbook o un comando ad-hoc será necesario que proporcionemos dicha contraseña para desencriptar la variable correspondiente. Para esto usaremos la opción --ask-vault-pass como podemos ver en el siguiente comando:
Uso de variable encriptada. |
Para evitar tener que introducir la password manualmente, en caso de ser necesario automatizar alguna tarea, podemos guardar la password empleada para encriptar la password en un fichero y lanzar el comando ad-hoc anterior del siguiente modo:
Comando ad-hoc especificando fichero con password de Vault. |
Especificando la opción --vault-password-file y la ruta al fichero que contiene la password, ansible es capaz de desencriptar la password empleada parael escalado de privilegios. Como es lógico, este fichero deberá tener los permisos correctos para proteger la contraseña usada para el desencriptado.
El comando ansible-vault también nos permite encriptar ficheros completos, con lo que podemos, por ejemplo, hacer lo siguiente:
Encriptación de un fichero completo. |
Ahora, suponiendo que necesitamos instalar el paquete de base de datos en ciertos hosts, podremos lanzar el comando ad-hoc siguiente, especificando el fichero que contiene la password empleada para encriptar el fichero:
Instalación de paquete. Especificamos la variable y el fichero con la password de encriptación. |
Podemos desencriptar el fichero con el subcomando decrypt del siguiente modo:
Desencriptación de fichero. |
Por sencillez, lo lógico sería utilizar la misma password de encriptación en todos los casos, pero si nos encontramos en un entorno con unos requisitos de seguridad muy estrictos, o si somos muy paranoicos, podemos usar diferentes passwords para diferentes vaults. Para esto asignamos lo que se denomina vault IDs en el momento de realizar la encriptación. Por ejemplo, si al encriptar el fichero anterior, hacemos lo siguiente:
Usando un identificador al encriptar un fichero. |
Con el comando anterior, encriptamos el fichero dbservers de group_vars, y lo identificamos con el vault ID dbserver. Al emplear la opción dbserver@prompt, estamos indicando que se solicite la password para la encriptación. Una vez guardada esta password, que es diferente a la que hemos empleado para encriptar la password de sudo, podemos desinstalar el paquete especificado por la variable db_package, usando un comando ad-hoc como el siguiente:
Usando varias vaults con diferentes passwords de encriptación. |
En este caso, tenemos encriptada la password de sudo y el fichero group_vars/dbservers así que, para poder usar la información encriptada correctamente:
- Mediante la opción --vault-password-file vault_pass.info, especifico el fichero que contiene la password para desencriptar la variable que contiene la contraseña necesaria para sudo.
- Mediante la opción --vault-id dbserver@another_vault_pass.info, especifico que, para el vault identificado con la cadena dbserver, la password debe buscarse en el fichero another_vault_pass_info.
El identificador se almacena con la cadena o fichero encriptado en el momento de crearlo, en la cabecera del mismo:
Cabecera de vault con ID. |
En general, sino especificamos un ID en el momento de realizar una encriptación con ansible-vault, la cadena o fichero encriptado no tendrá ningún identificador asociado pero, si necesitamos emplear diferentes contraseñas, entonces lo mejor es emplear IDs para cada una y tenerlas bien registradas.
Con todo esto, tenemos una idea de como proteger la información sensible, como por ejemplo passwords, en los ficheros de proyecto de Ansible.