Información sensible en los contenedores con Docker Secrets

Publicado por pico.dev el .
blog blog-stack planeta-codigo planeta-linux
Comentarios

Parte de la información que usan los contenedores de Docker se debe proteger de accesos no deseados. Anteriormente en algunos casos se usaban variables de entorno para lanzar los contenedores lo que no es seguro si se listan los procesos del sistema con sus parámetros, incluir archivos en las imágenes de los contenedores tampoco es recomendable. Docker Secrets permite proporcionar y mantener segura la información sensible que usen los contenedores.

Docker

Los contenedores de Docker necesitan acceder a algunos datos sensibles desde el punto de vista de la seguridad como usuarios y contraseñas, certificados SSL, claves privadas SSH o cualquier otra información de acceso restringido. Algunos de estos datos en Docker se proporcionan mediante variables de entorno al lanzar los contenedores, esto es inseguro ya que al hacer un listado de los procesos con sus parámetros de invocación los relativos a Docker mostrarán esta información, lo que es un posible problema de seguridad.

Con Docker Secrets se puede gestionar esta información que se necesita en tiempo de ejecución pero que no se quiere almacenar en la imagen de Docker o en el repositorio de código fuente. Algunos ejemplos de información sensible son:

  • Nombres de usuario y contraseñas.
  • Certificados TLS y claves.
  • Claves SSH.
  • Otra información sensible como el nombre de una base de datos o el nombre de un servidor interno.

Los secretos de Docker se proporcionan a los contenedores que los necesitan y se transmiten de forma cifrada al nodo en el que se ejecuten. Los secretos se montan en el sistema de archivos en la ruta /run/secrets/<secret_name> de forma descifrada al que el servicio del contenedor puede acceder.

Algunos comandos para manejar los secretos son los siguientes:

  • docker secret create secreto: crea un secreto.
  • docker secret inspect secreto: muestra los detalles de un secreto.
  • docker secret ls: lista los secretos creados.
  • docker secret rm secreto: elimina un secreto.
  • Se usa el parámetro –secret para docker service create y –secret-add y –secret-rm flags para docker service update.

Usando un stack de servicios con un archivo de Docker Compose en la sección secrets de los servicios se indica cuales usa, en la sección secrets se definen los secretos de los servicios con sus nombres y su contenido referenciando archivos que pueden ser binarios o de text no superior a 500 KiB.

Al servicio de nginx la clave privada y certificado para configurar el acceso mediante el protocolo seguro HTTPS se le proporciona a través de secretos que son referenciados en el archivo de configuración del servidor web nginx.conf.

Por otra parte la aplicación Java con Spring Boot lista el contenido de los secretos incorporados en el contenedor cuando se solicita en la URL https://192.168.99.100/system/info/, esto no se debe hacer porque se pierde la seguridad que proporcionan los secretos pero sirve a modo de muestra en el ejemplo.

Contenido del archivo message.txt

Para probar el ejemplo hay que ejecutar varios comandos, la secuencia completa es la siguiente:

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub.

Yo apoyo al software libre