Slide 1

Slide 1 text

Docker, infraestructuras seguras y Hardening José Juan Sánchez Hernández IES Celia Viñas (Almería)

Slide 2

Slide 2 text

Índice • Desarrollo y despliegue de aplicaciones siguiendo prácticas DevOps • Fundamentos básicos de Docker • Principales amenazas de Docker • Cómo mejorar la seguridad en Docker (Hardening) 2

Slide 3

Slide 3 text

Desarrollo y despliegue de aplicaciones siguiendo prácticas DevOps • DevOps = Desarrollo y Operaciones. • Metodología donde los desarrolladores y los equipos de operaciones trabajan juntos durante todo el ciclo de vida del software. • Antes de DevOps la entrega del software era un proceso manual y lento. • Ventajas: • Ha permitido acelerar la entrega continua y el despliegue del software. • Mejorar la calidad del software y reducir los errores debido a la automatización de los procesos. • ... 3 CI CD Imagen obtenida de Medium.

Slide 4

Slide 4 text

Herramientas DevOps 4 Imagen obtenida de TL Consulting Group

Slide 5

Slide 5 text

DevOps vs DevSecOPs 5 • Ventajas: • Mejora la seguridad. • Reducción de costes por detección temprana de errores. • Facilita el cumplimiento de la normativa (NIS2, DORA, ISO 27001, etc.). • ... • DevSecOps = Desarrollo, Seguridad y Operaciones. • Integra la seguridad en todo el ciclo de vida de desarrollo del software, automatizando controles para detectar y corregir vulnerabilidades lo antes posible. Imagen obtenida de CloudBolt

Slide 6

Slide 6 text

Herramientas DevSecOps 6 Imagen obtenida de SPOCLEARN

Slide 7

Slide 7 text

¿Dónde vamos a utilizar Docker? 7 • Servidores físicos • Máquinas virtuales • Cloud IaaS • Kubernetes • Serverlesss Containers • PaaS • Equipos de los desarrolladores Imagen obtenida de CloudBolt

Slide 8

Slide 8 text

¿Qué es Docker? • Es una tecnología que permite empaquetar las aplicaciones en contenedores que incluyen todo lo necesario para que se puedan ejecutar en un entorno de manera aislada. • Permite tener un entorno de desarrollo limpio, seguro y portátil. • Facilita la automatización de pruebas, integración y empaquetado. • Elimina inconsistencias entre los entornos de desarrollo, pruebas y producción. • El proceso de despliegue es rápido y repetible. 8

Slide 9

Slide 9 text

Docker vs Máquinas Virtuales 9 Imagen obtenida de Docker

Slide 10

Slide 10 text

Arquitectura de Docker 10 Imagen obtenida de Docker

Slide 11

Slide 11 text

11 ¿Docker es seguro? Imagen obtenida de Wikimedia Commons

Slide 12

Slide 12 text

Principales amenazas de Docker 12 OWASP: Proyecto de código abierto dedicado combatir las causas que hacen que el software sea inseguro

Slide 13

Slide 13 text

Noticias de imágenes inseguras 13 Agosto 2025 - [Ver noticia] Backdoor en el paquete XZ Utils (CVE-2024-3094) que permite a un usuario tener accesos no autorizados Marzo 2021 - [Ver noticia] Imágenes maliciosas que contenían criptominers

Slide 14

Slide 14 text

Noticia de exposición de secretos y claves 14 Septiembre 2023 - [Ver noticia]

Slide 15

Slide 15 text

Noticia de mala configuración que permite acceder al host de Docker 15 Septiembre 2025 - [Ver noticia] Uso de APIs de Docker mal configuradas en el puerto 2375 para acceder al host de Docker y lanzar un contenedor con software malicioso.

Slide 16

Slide 16 text

Búsqueda de puertos abiertos de Docker APIs inseguras sin TLS 16 https://www.shodan.io Es un motor de búsqueda que indexa servicios, puertos abiertos y dispositivos expuestos en Internet

Slide 17

Slide 17 text

Configuramos nuestro CLI de Docker para usar la API del Docker Engine remoto 17 El cliente usa la API de Docker local. unix:///var/run/docker.sock

Slide 18

Slide 18 text

Configuramos nuestro CLI de Docker para usar la API del Docker Engine remoto 18 El cliente usa la API insegura del Docker Engine remoto. tcp://34.53.26.90:2375

Slide 19

Slide 19 text

Configuramos nuestro CLI de Docker para usar la API del Docker Engine remoto 19 Una vez que nuestro CLI de docker usa la API del Docker Engine remoto podemos obtener una root shell en la máquina remota con este comando: docker run -it --privileged -v /:/mnt alpine chroot /mnt /bin/sh • --privileged: Le da al contenedor permisos equivalentes al root del host. • -v /:/mnt: Monta el sistema de archivos completo del host / dentro del contenedor, en el directorio /mnt. • chroot /mnt /bin/sh: Cambia el directorio raíz del proceso actual a /mnt y lanza un shell.

Slide 20

Slide 20 text

¿Cómo podemos mejorar la seguridad de Docker? • Hardening del Host de Docker • Hardening de las imágenes • Hardening de los contenedores 20 ¿Qué es el Hardening? Conjunto de técnicas para reforzar la seguridad de un sistema, reduciendo al mínimo su exposición a ataques.

Slide 21

Slide 21 text

¿Qué técnicas de hardening aplico? • Documentación oficial de Docker. https://docs.docker.com/security/ • CIS Benchmarks para Docker. https://www.cisecurity.org/benchmark/docker • OWASP • OWASP Docker Top 10. https://owasp.org/www-project-docker-top-10/ • OWASP Docker Security Cheat Sheet. https://cheatsheetseries.owasp.org • NIST SP 800-190. Application Container Security Guide https://csrc.nist.gov/pubs/sp/800/190/final 21

Slide 22

Slide 22 text

Buenas prácticas para mejorar la seguridad en el Host de Docker Mantener actualizados el kernel del host y Docker Engine. No exponer el socket del Docker daemon. • El socket unix:///var/run/docker.sock es un socket propiedad de root. Sólo es accesible por root y el grupo docker. Quien pueda escribir en él tiene control total del Docker Engine y del host. • No exponga el socket por TCP de forma insegura, si tiene que hacerlo, hágalo por SSH o TLS. Utilizar Docker en modo rootless. • Tenga en cuenta que este modo no es adecuado para todos los escenarios. https://docs.docker.com/engine/security/rootless/ 22 ...

Slide 23

Slide 23 text

Buenas prácticas para crear Imágenes Seguras Utiliza siempre imágenes fiables y mantenidas por fuentes confiables. 23

Slide 24

Slide 24 text

24 • Las imágenes oficiales de Docker pueden contener vulnerabilidades de seguridad conocidas, ya que pueden incluir paquetes mantenidos por terceros. • La mayoría suelen ser de bajo riesgo o difíciles de explotar en un contenedor, pero es importante analizarlas y mantenerlas actualizadas.

Slide 25

Slide 25 text

25 Docker Scout https://docs.docker.com/scout/

Slide 26

Slide 26 text

Buenas prácticas para crear Imágenes Seguras Utiliza herramientas de escaneo de vulnerabilidades en imágenes Docker. 26 • Docker Scout https://docs.docker.com/scout/ • Grype https://github.com/anchore/grype • Trivy https://github.com/aquasecurity/trivy • Clair https://github.com/quay/clair • Snyk https://github.com/snyk/cli

Slide 27

Slide 27 text

Buenas prácticas para crear Imágenes Seguras Utiliza imágenes libres de vulnerabilidades. Zero CVE (Common Vulnerabilites and Exposures). • Docker Hardened Images • Chainguard Images, ... 27

Slide 28

Slide 28 text

Buenas prácticas para crear Imágenes Seguras No uses imágenes con la etiqueta latest en tus Dockerfile, mejor usa versiones específicas. 28

Slide 29

Slide 29 text

Utiliza imágenes ligeras como imágenes base y minimiza el contenido de las imágenes. Cuanto menor sea el código que se ejecute en el contenedor, menor será su superficie de ataque. Evita incluir librerías, paquetes y dependencias innecesarias. 29 Buenas prácticas para crear Imágenes Seguras

Slide 30

Slide 30 text

Buenas prácticas para crear Imágenes Seguras Utiliza usuarios sin privilegios en tus imágenes. En la mayoría de las imágenes base, si no defines un usuario específico, el contenedor se ejecutará como root por defecto. 30

Slide 31

Slide 31 text

Utiliza archivos Dockerfile con múltiples etapas, para reducir el tamaño de la imagen final y mejorar la seguridad. 31

Slide 32

Slide 32 text

Buenas prácticas para crear Imágenes Seguras Utiliza archivos .dockerignore para evitar que se copien archivos innecesarios a la imagen (secretos, dependencias locales, etc.) 32

Slide 33

Slide 33 text

Buenas prácticas para crear Imágenes Seguras 33 No guardes secretos, API keys, passwords, encryption keys, private keys en tus Dockerfiles. Algunas opciones para la gestión de secretos son: • Para la fase de build puedes utilizar los secretos de Docker BuildKit. • Para la fase de ejecución puedes utilizar gestores de secretos como Hashicorp Vault.

Slide 34

Slide 34 text

34 Escanea tus Dockerfiles con herramientas como Trivy o Hadolint para detectar configuraciones incorrectas. Las puedes instalar como plugins en Visual Studio Code. ... 1 Hadolint

Slide 35

Slide 35 text

Buenas prácticas para crear Contenedores Seguros No cree contenedores con el flag --privileged si no está seguro de lo que está haciendo. Este flag asigna al contenedor todas las capacidades del kernel y elimina la mayoría de las medidas de seguridad del contenedor. Utilice el flag --cap-drop ALL para eliminar todas las capacidades el kernel y con --cap-add añada sólo las que necesite. • NET_BIND_SERVICE: Permite que un proceso escuche en puertos inferiores a 1024, como 80, 443, etc. • NET_ADMIN: Permite modificar la configuración de red, como interfaces, iptables, túneles. • ... 35 Limitar privilegios y capacidades del Kernel

Slide 36

Slide 36 text

Buenas prácticas para crear Contenedores Seguros Utilice el flag --security-opt no-new-privileges para evitar que ningún proceso pueda ganar más privilegios y capacidades del kernel de los que tenía en su inicio, aunque ejecute un binario con bits setuid y setguid. Los bits setuid y setgid permiten a los binarios ejecutarse con permisos de root. Por lo tanto, si esos binarios tienen vulnerabilidades, un atacante puede usarlos para escalar privilegios. 36 Limitar privilegios y capacidades del Kernel

Slide 37

Slide 37 text

Buenas prácticas para crear Contenedores Seguros Evita ataques DoS (Denial of Service) limitando los recursos que puede usar el contenedor. docker run -d --memory=512m --cpus=1 --ulimit nofile=1024 --restart=on-failure:5 … • Límite de memoria: --memory • Límite de CPU: --cpus • Número máximo de archivos abiertos por proceso: --ulimit nofile • Número máximo de reintentos de inicio después de un error: --restart=on-failure • ... 37 Limitar los recursos del host

Slide 38

Slide 38 text

Buenas prácticas para crear Contenedores Seguros 38 Evite la escritura en el sistema de archivos del contenedor con el flag --read-only. Este flag monta el sistema de archivos raíz como inmutable y cualquier intento de modificación será bloqueado. Utilice el flag --tmpfs para crear sistemas de archivos temporales en memoria cuando necesite escritura sin persistencia. Utilice los volúmenes en modo de sólo lectura para limitar su acceso. Proteger el sistema de archivos y volúmenes

Slide 39

Slide 39 text

Buenas prácticas para crear Contenedores Seguros 39 No comparta la red del host de Docker con el contenedor, ya que elimina el aislamiento de red entre el host y el contenedor. Se recomienda utilizar redes bridge definidas por el usuario. docker run --network=host docker network create app-net docker run --network app-net ... Seguridad en la red

Slide 40

Slide 40 text

Buenas prácticas para crear Contenedores Seguros En entornos con múltiples contenedores se recomienda segmentar la red para aislarlos. No comparta el socket del Docker daemon del host con los contenedores. docker run -v /var/run/docker.sock:/var/run/docker.sock …. 40 ... ... Seguridad en la red 1

Slide 41

Slide 41 text

Gracias