POR WALTER MEDINA / BACKEND SOFTWARE ENGINEER
Los contenedores Docker son cruciales para el desarrollo y el despliegue de aplicaciones modernas, debido a que ofrecen ventajas como portabilidad, eficiencia de recursos, escalabilidad y un entorno aislado y eficiente que cambia la forma en que se implementan los servicios, tanto en la nube, como en infraestructuras locales. Por todo lo anterior es vital mantenerlos seguros.

No hacerlo implica la exposición a ataques, vulnerabilidades en las imágenes de los contenedores, configuraciones inseguras y riesgos de acceso no autorizado, así que lo mejor es aplicar medidas de seguridad en todas las fases del ciclo de vida del contenedor, con lo que podemos reducir significativamente la superficie de ataque.

¿Qué es un contenedor Docker?

Pero antes de continuar es preciso ahondar en qué es un contenedor Docker, el cual es definido de la siguiente manera por Oracle:

  • Es un formato que empaqueta todo el código y las dependencias de una aplicación en un formato estándar que permite su ejecución rápida y fiable en entornos informáticos.
  • Es un conocido contenedor ejecutable, independiente y ligero, que integra todo lo necesario para ejecutar una aplicación, incluidas bibliotecas, herramientas del sistema, código y tiempo de ejecución.
  • Es una plataforma de software que permite a los desarrolladores crear, probar e implementar aplicaciones en contenedores de forma rápida.

¿Cómo incrementar la seguridad en el Docker Host?

En una computadora, los contenedores comparten un componente crucial llamado kernel, que es esencial para el funcionamiento del sistema operativo, por lo que es muy importante dedicar esfuerzos para darle seguridad, lo que se logra tomando las siguientes medidas:

  1. Seguridad en el Docker daemon: Es importante no activar la opción de "insecure-registry" al iniciar Docker y sólo permitir conexiones seguras HTTPS al usar réplicas de registro. Además, se debe prestar atención a los permisos cuando se usa la opción "docker.sock", como indica José Manuel Ortega Candel en el libro Docker. Seguridad y monitorización en contenedores e imágenes (Alfaomega, 2020, p. 124).
  2. Seguridad en el kernel de Linux: Docker aprovecha varias tecnologías de Linux para reforzar la seguridad. Entre ellas están:
    • Security-Enhanced Linux (SELinux): Proporciona controles de acceso rigurosos para usuarios, aplicaciones, procesos y archivos.
    • AppArmor: Limita las acciones de las aplicaciones mediante reglas específicas, controlando el acceso a otros procesos y recursos.
    • Secure Computing mode (Seccomp): Funciona como un firewall dentro del kernel de Linux, restringiendo las llamadas al sistema.

Seguridad en las imágenes Docker


Además de configurar correctamente los contenedores es crucial asegurarse de que todas las capas de imagen de un contenedor estén libres de vulnerabilidades conocidas. Esto se puede lograr mediante el uso de herramientas de escaneo estático de imágenes, ya sea en los repositorios o antes de su publicación.

Algunas herramientas destacadas para este propósito son:

  • Docker Security Scanning: Escanea imágenes de contenedores en busca de vulnerabilidades de seguridad conocidas.
  • CoreOS Clair Scanner: Analiza vulnerabilidades en contenedores, verificando el sistema operativo de las imágenes Docker y sus paquetes instalados.
  • Anchore Engine: Ofrece un servicio para inspeccionar y analizar imágenes de contenedores, aplicando políticas definidas por el usuario.
  • OpenScap: Proporciona herramientas de auditoría automatizadas para examinar configuraciones y vulnerabilidades, siguiendo estándares certificados por el Instituto Nacional de Estándares y Tecnología (NIST, por sus siglas en inglés).
  • OWASP Dependency Check: Escanea imágenes de contenedores capa por capa, analizando bibliotecas y componentes en varios lenguajes de programación.

Además, herramientas de integración continua como Jenkins, TeamCity, Bamboo, TFS, Travis CI, CircleCi, GitLab Ci y Team Services pueden configurarse para automatizar el escaneo de imágenes como parte de sus procesos.

Seguridad en volúmenes Docker

Una práctica recomendada es mantener los datos separados de los contenedores. Esto se logra mediante el uso de volúmenes Docker, que permiten almacenar datos de manera independiente de la ejecución del contenedor. Los volúmenes aseguran que la información se conserve, incluso si el contenedor se detiene o se elimina, ya que se almacena en el sistema de archivos del host, no dentro del contenedor.

Por cierto, los volúmenes de Docker tienen características especiales:

  • Son directorios separados del sistema de archivos principal del contenedor.
  • Son administrados por Docker y pueden compartirse entre varios contenedores.
  • Permiten integrar un directorio del sistema del host dentro de un contenedor, facilitando la gestión y el acceso a los datos.

Ventajas de utilizar contenedores de volumen de datos

Un contenedor de volumen de datos en Docker permite que varios contenedores compartan almacenamiento persistente. Esto significa que los contenedores pueden acceder a volúmenes almacenados en un contenedor específico, facilitando el uso compartido de datos entre ellos. Una gran ventaja de este sistema es que los contenedores no necesitan conocer la ubicación exacta de los datos en el disco, debido a que Docker gestiona el acceso a estos archivos, lo que reduce el riesgo de que procesos ajenos a Docker alteren los datos.

Además, este enfoque es similar al funcionamiento de un servidor Network File System (NFS), donde los datos se distribuyen en una red, así que los contenedores pueden crearse y eliminarse sin afectar la información, que permanece centralizada en el contenedor de datos. Esto añade una capa adicional de abstracción y eficiencia en la gestión de datos en entornos Docker.

Consideraciones al utilizar contenedor de volumen de datos

Pero no todo es tan sencillo, así que hay que tener cuidado al realizar algunos procesos relacionados con los contenedores de volumen de datos, como podemos leer en el libro Seguridad y monitorización en contenedores e imágenes (p. 318):

  • Seguridad: La seguridad de los volúmenes, donde se almacenan los datos, depende de los permisos asignados. Es vital controlar quién tiene acceso al sistema de archivos, ya que esto determina quién puede acceder a los volúmenes.
  • Almacenamiento huérfano: Si se eliminan los contenedores, pero se deja el contenedor de datos, el volumen de este último se convierte en "huérfano". Esto significa que sigue ocupando espacio en el sistema de archivos del host, pero ya no está conectado a ningún contenedor activo.
  • Integridad de los datos: Aunque los contenedores de datos se compartan sigue siendo necesario usar sistemas de bloqueo para gestionar las operaciones sobre estos datos. Es importante mencionar que Docker no proporciona herramientas integradas para hacer copias de seguridad instantáneas o replicar los datos automáticamente.

En conclusión, al implementar sistemas de software utilizando contenedores Docker es recomendable utilizar prácticas que contemplen la seguridad durante el desarrollo, como lo es DevSecOps, que AWS define como “la práctica de integrar las pruebas de seguridad en cada etapa del proceso de desarrollo de software. Incluye herramientas y procesos que fomentan la colaboración entre los desarrolladores, los especialistas en seguridad y los equipos de operaciones para crear un software que sea eficiente y seguro".

Haciendo esto, nos aseguramos de que los contenedores Docker no sólo sean eficientes y escalables, sino también seguros, fortaleciendo así la infraestructura tecnológica y la confianza de los usuarios en las aplicaciones desarrolladas.