Seguridad contenedores Docker
Hoy os voy a entregar varias pautas para mejorar la seguridad de vuestros contenedores Docker. Lo voy a hacer tomando de referencia un sistema linux Debian.
La seguridad de los contenedores Docker es un tema crucial dado que los contenedores, por su naturaleza efímera y dinámica, presentan desafíos únicos de seguridad. Aquí os doy una visión detallada de las mejores prácticas y estrategias para asegurar contenedores Docker, desde la configuración inicial hasta el despliegue y la operación continua.
1. Seguridad en la creación de imágenes de contenedor Docker
- Minimizar la imagen base: Utiliza imágenes base minimalistas para reducir la superficie de ataque.
- Por ejemplo: Utilizar imágenes base de Docker más pequeñas y seguras como debian:slim o alpine, que tienen menos paquetes y por lo tanto, menos vectores de ataque.
1 |
FROM debian:slim |
- Escaneo de vulnerabilidades: Implementa herramientas de escaneo de vulnerabilidades como Clair, Trivy o Snyk para detectar problemas de seguridad en las imágenes antes de desplegarlas. Realiza estos escaneos regularmente.
- Os detallo como se instala y se lanza sobre una imagen:
1 2 |
sudo apt-get install trivy trivy image debian:slim |
- No instalar Software innecesario: Evita instalar paquetes que no sean necesarios para la ejecución de tu aplicación para mantener la imagen limpia y segura. Relacionado con el punto anterior.
- Usar Multi-stage Builds: Esta práctica en Dockerfile permite crear imágenes más limpias y seguras al separar los entornos de construcción y de ejecución. Los “Multi-stage Builds” son un método para estructurar un Dockerfile de manera que se dividan los procesos de compilación y configuración en pasos o “etapas” separadas dentro de un único Dockerfile.
- Ventajas de Usar Multi-stage Builds
- Reducción de Tamaño: Al no incluir herramientas y archivos innecesarios en la imagen final, el tamaño de la imagen se reduce considerablemente. Esto es especialmente útil para la distribución y el despliegue rápido de contenedores.
- Seguridad Mejorada: Menos software en la imagen final significa menos superficie de ataque para explotar. Esto ayuda a mejorar la seguridad de las aplicaciones en ejecución.
- Simplificación del Mantenimiento: Al mantener las herramientas de compilación separadas de la imagen de ejecución, se simplifica el mantenimiento del Dockerfile y se clarifica el proceso de construcción.
- Optimización de Caché: Docker puede reutilizar las cachés de compilación intermedias para las etapas iniciales, lo que acelera significativamente el proceso de reconstrucción de imágenes cuando solo se modifican los pasos finales
- Os dejo un ejemplo:
- Explicación:
- Etapa 1: Utiliza una imagen gcc que contiene todas las herramientas necesarias para compilar aplicaciones C++. Aquí, el código fuente se copia y compila en el contenedor.
- Etapa 2: Comienza con una imagen base debian:buster-slim, que es mucho más ligera que la imagen gcc. Solo el ejecutable myapp, que es el artefacto necesario de la etapa de compilación, se copia en esta imagen. Finalmente, esta imagen contiene solo el binario necesario para ejecutar la aplicación, sin herramientas ni archivos de compilación adicionales.
- Explicación:
- Ventajas de Usar Multi-stage Builds
1 2 3 4 5 6 7 8 9 10 |
# Etapa 1: Compilación FROM gcc:latest as builder WORKDIR /app COPY . . RUN g++ -o myapp main.cpp # Etapa 2: Imagen de Ejecución FROM debian:buster-slim COPY --from=builder /app/myapp /app/myapp CMD ["/app/myapp"] |
2. Gestión de Configuraciones y Secretos
- Manejo de Secretos: Evita almacenar secretos, como claves API y contraseñas, directamente en imágenes o en archivos Dockerfile. Utiliza en su lugar secretos de Docker, Kubernetes Secrets, o herramientas especializadas como HashiCorp Vault.
1 |
echo "MiSecreto" | docker secret create my_secret - |
- Configuraciones seguras: Configura contenedores para que se ejecuten con los menores privilegios posibles. Usa el usuario “no root” siempre que sea posible.
- Configura tus contenedores para ejecutarse como un usuario “no root” agregando lo siguiente a tu Dockerfile:
1 2 3 |
FROM debian:slim RUN useradd -m myuser USER myuser |
3. Seguridad en la Red de Contenedores
- Segmentación de Red: Utiliza redes Docker personalizadas para separar los contenedores en diferentes segmentos de red lógicos, reduciendo así la posibilidad de tráfico no deseado entre contenedores.
1 2 |
docker network create --driver bridge isolated_network docker run --network=isolated_network --name mycontainer debian:slim |
- Limitar la Comunicación Intercontenedor: Configura políticas de red para limitar la comunicación entre contenedores a lo estrictamente necesario.
1 |
sudo iptables -I DOCKER-USER -i src_net -o dst_net -j REJECT |
4. Operaciones de Contenedores Seguros
- Actualizaciones Regulares: Mantén el sistema operativo del host y los contenedores actualizados con las últimas parches de seguridad.
1 2 |
sudo apt-get update && sudo apt-get upgrade docker images |grep -v REPOSITORY|awk '{print $1}'|xargs -L1 docker pull |
- Monitorización y Logging: Implementa soluciones de monitorización y registra adecuadamente los logs de contenedores para detectar y responder a actividades sospechosas. Herramientas como ELK Stack o Fluentd pueden ser útiles.
1 |
docker run -d -p 5601:5601 -p 9200:9200 -p 5044:5044 --name elk sebp/elk |
- Limitar Recursos: Configura límites de recursos en los contenedores para prevenir ataques de denegación de servicio (DoS) y asegurar que un contenedor no consuma recursos excesivos.
5. Uso de Herramientas y Mejoras de Seguridad
- Docker Bench for Security: Utiliza esta herramienta que comprueba automáticamente muchas de las configuraciones de mejores prácticas en cuanto a la despliegue de Docker.
1 2 3 |
git clone https://github.com/docker/docker-bench-security.git cd docker-bench-security sudo sh docker-bench-security.sh |
- Usar AppArmor o SELinux: Estos módulos de seguridad de Linux pueden ofrecer políticas que limitan las capacidades de los contenedores y ayudan a mitigar los riesgos.
1 2 |
sudo apt-get install apparmor sudo aa-status |
- Orquestadores de Contenedores: Cuando se usan orquestadores como Kubernetes, asegúrate de aprovechar sus características de seguridad, como Roles y Policies para controlar el acceso y las operaciones permitidas.
- Os dejo unas entradas relacionadas:
6. Educación y Concienciación
- Capacitación en Seguridad: Asegúrate de que los desarrolladores y operadores de tu empresa, estén capacitados en las mejores prácticas de seguridad de contenedores y comprendan los riesgos asociados.
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?