Uso de funciones del sistema Linux para implementar Clevis y Tang para el desbloqueo automático de volúmenes de LUKS

Uno de los aspectos clave de la seguridad del sistema es cifrar el almacenamiento en reposo. Sin almacenamiento encriptado, cada vez que un dispositivo de almacenamiento deja su presencia, puede estar en riesgo. El escenario más obvio en el que esto puede suceder es si un dispositivo de almacenamiento (ya sea solo el dispositivo de almacenamiento o todo el sistema, servidor o computadora portátil) se pierde o es robado.

Sin embargo, hay otros escenarios que también son una preocupación: tal vez tenga un dispositivo de almacenamiento que falle y se reemplace bajo garantía; muchas veces el proveedor le pedirá que devuelva el dispositivo original. Si el dispositivo estaba encriptado, es mucho menos preocupante devolverlo al proveedor de hardware.

Otra preocupación es que cada vez que su dispositivo de almacenamiento no esté a la vista, existe el riesgo de que los datos se copien o clonen del dispositivo sin que usted se dé cuenta. Nuevamente, si el dispositivo está encriptado, esto es mucho menos preocupante.

Fedora (y otras distribuciones de Linux) incluyen la funcionalidad de configuración de clave unificada de Linux (LUKS) para admitir el cifrado de disco. LUKS es fácil de usar, e incluso está integrado como opción en el Fedora Instalador de Anaconda.

Sin embargo, existe un desafío que frecuentemente impide que las personas implementen LUKS a gran escala, especialmente para el sistema de archivos raíz: cada vez que reinicia el host, generalmente tiene que acceder manualmente a la consola y escribir la frase de contraseña de LUKS para que el sistema pueda iniciarse. .

si estas corriendo Fedora en una sola computadora portátil, esto podría no ser un problema, después de todo, probablemente esté sentado frente a su computadora portátil cada vez que la reinicie. Sin embargo, si tiene una gran cantidad de Fedora instancias, esto rápidamente se vuelve poco práctico de manejar.

Si tiene cientos de sistemas, no es práctico escribir manualmente la frase de contraseña de LUKS en cada sistema en cada reinicio

Usted podría estar administrando Fedora sistemas que se encuentran en ubicaciones remotas, y es posible que ni siquiera tenga formas buenas o confiables de acceder a una consola en ellos. En este caso, reiniciar los hosts podría hacer que no se activen hasta que usted u otra persona viaje a su ubicación para escribir la frase de contraseña de LUKS.

Este artículo cubrirá cómo implementar una solución para habilitar el desbloqueo automático de volúmenes de LUKS (¡y el proceso para implementar estas funciones también se realizará mediante la automatización!)

Descripción general de Clevis y Tang

Clevis y Tang son una solución innovadora que puede ayudar con el desafío de tener sistemas con arranque de almacenamiento encriptado sin la intervención manual del usuario en cada arranque. En un nivel alto, Clevis, que está instalado en los sistemas cliente, puede permitir que los volúmenes LUKS se desbloqueen sin la intervención del usuario siempre que el sistema cliente tenga acceso a la red a una cantidad configurable de servidores Tang.

La premisa básica es que los servidores Tang están en una red interna/privada o protegida de otra manera, y si los dispositivos de almacenamiento se pierden, son robados o se eliminan del entorno, ya no tendrán acceso a la red de Tang. servidor(es) y, por lo tanto, ya no se desbloqueará automáticamente al arrancar.

Tang no tiene estado y no requiere autenticación ni TLS, lo que significa que es muy liviano y fácil de configurar, y puede ejecutarse desde un contenedor. En este artículo, solo estoy configurando un solo servidor Tang, sin embargo, también es posible tener múltiples servidores Tang en un entorno y configurar la cantidad de servidores Tang a los que los clientes Clevis deben conectarse para desbloquear el volumen encriptado. Para examplepodría tener tres servidores Tang y requerir que los clientes Clevis puedan conectarse al menos a dos de los tres servidores Tang.

Para obtener más información sobre cómo funcionan Tang y Clevis, consulte las páginas de GitHub: Pendiente y Espiga o para obtener una descripción general del funcionamiento interno de Tang y Clevis, consulte el Asegurar el descifrado automatizado Nuevas técnicas y criptografía Charla FOSDEM.

Descripción general de las funciones del sistema Linux

Linux System Roles es un conjunto de Ansible Roles/Collections que pueden ayudar a automatizar la configuración y administración de muchos aspectos de Fedora, CentOS Stream, RHEL y derivados de RHEL. Los roles del sistema Linux están empaquetados en Fedora como RPM (linux-system-roles) y también está disponible en Ansible Galaxy (como roles y como colección). Para obtener más información sobre las funciones del sistema Linux y ver una lista de las funciones incluidas, consulte la Página del proyecto Roles del sistema Linux .

En la lista de roles del sistema Linux se incluyen los roles nbde_client, nbde_server y firewall que se usarán en este artículo. Los roles nbde_client y nbde_server se centran en automatizar la implementación de Clevis y Tang, respectivamente. El “nbde” en los nombres de funciones significa cifrado de disco vinculado a la red, que es otro término para referirse al uso de Clevis y Tang para el desbloqueo automático de volúmenes cifrados LUKS. La función de cortafuegos puede automatizar la implementación de la configuración del cortafuegos y se utilizará para abrir un puerto en el cortafuegos en el servidor Tang.

Descripción general del entorno de demostración

En mi entorno, tengo una Raspberry Pi, funcionando Fedora 36 en el que instalaré Linux System Roles y lo usaré como mi nodo de control de Ansible. Además, usaré esta misma Raspberry Pi como mi servidor Tang. Este dispositivo está configurado con el pi.examplenombre de host .com.

Además, tengo otros cuatro sistemas en mi entorno: dos Fedora 36 y dos sistemas CentOS Stream 9, denominados fedora-server1.googlesyndication.com, fedora-servidor2.googlesyndication.com, c9s-servidor1.googlesyndication.com y c9s-server2.googlesyndication.com. Cada uno de estos cuatro sistemas tiene un sistema de archivos raíz encriptado con LUKS y, actualmente, la frase de contraseña de LUKS debe ingresarse manualmente cada vez que se inician los sistemas.

Usaré los roles nbde_server y firewall para instalar y configurar Tang en mi pi.googlesyndication.com, y use la función nbde_client para instalar y configurar Clevis en mis otros cuatro sistemas, lo que les permite desbloquear automáticamente su sistema de archivos raíz encriptado si pueden conectarse al pi.googlesyndication.com sistema Tang.

Instalación de funciones del sistema Linux y Ansible en Raspberry Pi

Comenzaré instalando el paquete linux-system-roles en el pi.googlesyndication.com host, que actuará como mi nodo de control de Ansible. Esto también instalará ansible-core y varios otros paquetes como dependencias. No es necesario instalar estos paquetes en los otros cuatro sistemas de mi entorno (a los que se hace referencia como nodos administrados).

                      $ sudo dnf install linux-system-roles
                    

claves SSH y sudo La configuración debe configurarse para que el host del nodo de control pueda conectarse a cada uno de los nodos administrados en el entorno y escalar a privilegios de raíz.

Definición del archivo de inventario de Ansible

Todavía en el pi.googlesyndication.com, crearé un archivo de inventario de Ansible para agrupar los cinco sistemas de mi entorno en dos grupos de inventario de Ansible. El grupo nbde_servers contendrá una lista de hosts que me gustaría configurar como servidores Tang (que en este example es solo el pi.googlesyndication.com host), y el grupo nbde_clients contendrá una lista de hosts que me gustaría configurar como clientes Clevis. Llamaré a este archivo de inventario inventario.yml y contiene el siguiente contenido:

                      all:
  children:
    nbde_servers:
      hosts:
        pi.googlesyndication.com:
    nbde_clients:
      hosts:
        fedora35-server1.googlesyndication.com:
        fedora35-server2.googlesyndication.com:
        c9s-server1.googlesyndication.com:
        c9s-server2.googlesyndication.com:

                    

Creación de archivos de variables de Ansible Group

Las variables de Ansible se establecen para especificar qué configuración deben implementar los roles del sistema de Linux. Cada rol tiene un archivo README.md que contiene información importante sobre cómo usar cada rol, incluida una lista de variables de roles disponibles. Los archivos README.md para las funciones nbde_server, nbde_client y firewall están disponibles en las siguientes ubicaciones, respectivamente:

  • /usr/share/doc/linux-system-roles/nbde_server/README.md
  • /usr/share/doc/linux-system-roles/nbde_client/README.md
  • /usr/share/doc/linux-system-roles/firewall/README.md

Crearé un directorio group_vars con el comando mkdir group_vars. Dentro de este directorio, crearé un archivo nbde_servers.yml y un archivo nbde_clients.yml, que definirán, respectivamente, las variables que deben establecerse para los sistemas enumerados en el grupo de inventario nbde_servers y el grupo de inventario nbde_clients.

El archivo nbde_servers.yml contiene el siguiente contenido, que le indicará a la función de firewall que abra el puerto TCP 80, que es el puerto predeterminado que utiliza Tang:

                      firewall:
  - port: ['80/tcp']
    state: enabled
                    

El archivo nbde_clients.yml contiene el siguiente contenido:

                      nbde_client_bindings:
  - device: /dev/vda2
    encryption_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          62666465373138636165326639633...
    servers:
      - https://pi.googlesyndication.com
                    

En nbde_client_bindings, el dispositivo especifica el dispositivo de respaldo del sistema de archivos raíz cifrado en los cuatro nodos administrados. La contraseña_cifrado especifica una frase de contraseña LUKS actual que se requiere para configurar Clevis. En esto example, he usado ansible-vault para cifrar la cadena en lugar de colocar la frase de contraseña de LUKS en texto claro. Y finalmente, en servidores, se especifica una lista de servidores Tang a los que Clevis debe vincularse. En esto examplelos clientes de Clevis se configurarán para vincularse al pi.exampleServidor Tang .com.

Creando el libro de jugadas

Crearé un libro de jugadas Ansible simple, llamado nbde.yml que llamará a los roles de firewall y nbde_server para los sistemas en el grupo de inventario nbde_servers, y llamará al rol nbde_client para los sistemas en el grupo nbde_clients:

                      - name: Open firewall for Tang
  hosts: nbde_servers
  roles:
    - linux-system-roles.firewall

- name: Deploy NBDE Tang server
  hosts: nbde_servers
  roles:
    - linux-system-roles.nbde_server

- name: Deploy NBDE Clevis clients
  hosts: nbde_clients
  roles:
    - linux-system-roles.nbde_client
                    

En este punto, tengo los siguientes archivos y directorios creados:

  • inventario.yml
  • nbde.yml
  • group_vars/ nbde_clients.yml
  • group_vars/nbde_servers.yml

Ejecutando el libro de jugadas

El libro de jugadas nbde.yml se puede ejecutar con el siguiente comando:

                      $ ansible-playbook nbde.yml -i inventory.yml --ask-vault-pass -b
                    

El indicador -i especifica qué archivo de inventario se debe usar, el indicador –ask-vault-pass solicitará la contraseña de Ansible Vault para descifrar la variable crypto_password y el indicador -b especifica que Ansible debe escalar a privilegios de root.

reproducir la salida de resumen del comando ansible-playbook que muestra el libro de jugadas completado con éxito

Validando la configuración

Para validar la configuración, reinicié cada uno de mis cuatro nodos administrados que estaban configurados como clientes Clevis del servidor Raspberry Pi Tang. Cada uno de los cuatro nodos administrados se inicia y se detiene brevemente en el indicador de la frase de contraseña de LUKS:

Los sistemas se inician con la solicitud de frase de contraseña de LUKS y continúan arrancando automáticamente después de una breve pausa

Sin embargo, después de la breve demora, cada uno de los cuatro sistemas continuó arrancando sin requerir que ingresara la frase de contraseña de LUKS.

Conclusión

Si desea proteger sus datos en reposo con el cifrado LUKS, pero necesita una solución que permita que los sistemas se inicien sin intervención, considere implementar Clevis y Tang. Los roles del sistema Linux pueden ayudarlo a implementar Clevis y Tang, así como una serie de otros aspectos de su sistema, de manera automatizada.

Related Posts