526 - Sobre seguridad en Docker y selfhosted

526 - Sobre seguridad en Docker y selfhosted

Descubre las mejores prácticas de seguridad y actualización para tus servicios autoalojados en #Docker en modo #selfhosted. Asegura un entorno confiable

1:25
-3:15

En la era digital actual, el despliegue de servicios y aplicaciones se ha vuelto más ágil y versátil gracias a tecnologías como Docker. Este contenedor de aplicaciones ha revolucionado la forma en que desplegamos y gestionamos nuestras aplicaciones, permitiéndonos aislarlas, mantener entornos consistentes y, lo más importante, desplegarlas en cualquier lugar sin preocuparnos por las diferencias de configuración. Sin embargo, con esta gran flexibilidad vienen responsabilidades, especialmente cuando se trata de la seguridad y la actualización de servicios autoalojados en Docker. En este artículo, exploraremos algunas mejores prácticas para mantener tu entorno Docker seguro y actualizado.

Sobre seguridad en Docker y selfhosted

Actualizaciones y Parches

Mantener Docker actualizado es una práctica fundamental para la seguridad. Docker se esfuerza constantemente en corregir vulnerabilidades y mejorar la estabilidad. Para actualizar Docker, ejecuta el siguiente comando:

docker --version

Si estás utilizando una versión obsoleta, puedes descargar la última versión desde el sitio web oficial de Docker o utilizar el administrador de paquetes de tu sistema operativo.

Uso de Imágenes Oficiales

Cuando despliegues contenedores, es preferible utilizar imágenes oficiales o de fuentes confiables. Por ejemplo, para obtener una imagen oficial de NGINX, simplemente ejecuta:

docker pull nginx

Estas imágenes suelen ser más seguras y confiables, ya que están respaldadas por los desarrolladores de las aplicaciones.

Revisión Regular de Imágenes

Para garantizar que tus imágenes de Docker estén libres de vulnerabilidades conocidas, utiliza herramientas de escaneo como Trivy, Clair o Anchore. Por ejemplo, para escanear una imagen llamada «mi_imagen»:

trivy image mi_imagen

Estas herramientas te proporcionarán información sobre cualquier vulnerabilidad que pueda existir en tus imágenes.

Minimiza el Tamaño de la Imagen

Elige imágenes base minimalistas como Alpine para reducir el tamaño de tus contenedores. En tu archivo Dockerfile, puedes especificar la imagen base de la siguiente manera:

FROM alpine:3.14

Esto ayuda a minimizar las posibles superficies de ataque y a mantener tus contenedores más ligeros y ágiles.

Limita los Privilegios

Nunca ejecutes contenedores en modo --privileged a menos que sea absolutamente necesario. Esto otorga al contenedor un nivel elevado de control sobre el sistema anfitrión. Si necesitas ajustar los privilegios, utiliza las opciones --cap-add y --cap-drop. Por ejemplo:

docker run --cap-add=SYS_ADMIN mi_contenedor

Esto limita las capacidades del contenedor de acuerdo a tus necesidades específicas.

Control de Usuarios

Cuando ejecutes procesos dentro de contenedores, hazlo como usuario no root siempre que sea posible. Esto ayuda a reducir el impacto de posibles vulnerabilidades en caso de que un atacante logre comprometer el contenedor. Puedes especificar un usuario en tu Dockerfile:

USER myuser

Configuración de Red Segura

Utiliza redes Docker personalizadas en lugar de la red predeterminada. Esto aislará tus contenedores y reducirá la superficie de ataque. Puedes crear una red personalizada con el siguiente comando:

docker network create mi_red

Y luego, al ejecutar un contenedor, conéctalo a esta red personalizada para asegurar su aislamiento.

Almacenamiento Seguro

Evita montar directorios sensibles del host en contenedores, ya que esto podría exponer datos importantes. En su lugar, utiliza volúmenes de Docker para gestionar el almacenamiento de manera segura. Por ejemplo:

docker volume create volumen
docker run -v volumen:/ruta/en/el/contenedor mi_contenedor

Logging y Monitorización

Activa la monitorización y registro de actividad utilizando herramientas como ELK stack o Prometheus. Estas herramientas te permiten supervisar el rendimiento y detectar posibles problemas de seguridad o problemas de rendimiento en tiempo real.

Para esto, en lugar de utilizar ELK, utilizo una herramienta conocida como ZincObserve, sobre la que te hablé en el episodio 485 del podcast, titulado la alternativa a ElasticSearch y otras fricadas, que tiene la ventaja de que al estar implementado en Rust, tiene un consumo de recursos mucho mas reducido que cualquiera de las otras alternativas.

Limita Recursos

Utiliza las opciones --memory y --cpu-shares para limitar los recursos que un contenedor puede utilizar. Esto evita que un contenedor agote todos los recursos del sistema y afecte a otros contenedores. Por ejemplo:

docker run --memory=512m --cpu-shares=512 mi_contenedor

###Firma de Imágenes

Para garantizar la integridad de las imágenes, utiliza Docker Content Trust para firmarlas y verificar su autenticidad antes de ejecutarlas. Esto ayuda a prevenir la ejecución de imágenes modificadas o maliciosas.

Runtime Protegido

Utiliza herramientas como Falco para monitorear actividad anómala en tiempo de ejecución. Falco puede detectar comportamientos sospechosos y alertarte sobre posibles amenazas en tus contenedores en ejecución.

Control de Acceso al Demonio Docker

Asegúrate de que solo los usuarios que realmente lo necesiten tengan acceso al socket de Docker. Limitar el acceso al demonio Docker es esencial para prevenir accesos no autorizados y ataques.

En mi caso particular, yo lo estoy utilizando en algunos contenedores como puede ser precisamente Traefik que es el que se encarga de actualizar las imágenes, para tener siempre la última versión.

Deshabilita la Comunicación entre Contenedores

Deshabilita ICC (Inter-Container Communication) si no necesitas que los contenedores se comuniquen entre sí en la misma red. Esto puede reducir posibles vectores de ataque al evitar que los contenedores se conecten entre sí de forma predeterminada.

Control de Versiones de Imágenes

Evita utilizar la etiqueta latest al descargar imágenes y, en su lugar, especifica versiones concretas. Esto te permite tener un control más estricto sobre las actualizaciones y evitar sorpresas en caso de cambios no deseados en las imágenes.

De cualquier forma, deberías de actualizar frecuentemente las imágenes. Para ello, herramientas como WatchTower, tal y como expliqué en el episodio 341 del podcast, titulado como actualizar imágenes Docker automáticamente, te puede venir perfectamente.

Auditorías

Considera realizar auditorías regulares a tus contenedores y configuraciones utilizando herramientas como Docker Bench for Security. Estas auditorías pueden ayudarte a identificar posibles vulnerabilidades y configuraciones incorrectas.

Siguiendo estas mejores prácticas, podrás mantener tus servicios autoalojados en Docker seguros, actualizados y protegidos contra amenazas en constante evolución.

Conclusiones

Docker es una herramienta poderosa para el despliegue de servicios, pero su seguridad y mantenimiento requieren atención constante. Siguiendo estas mejores prácticas, puedes mantener tu ecosistema Docker seguro y actualizado, reduciendo el riesgo de vulnerabilidades y problemas de configuración. Mantén un enfoque proactivo en la seguridad y la gestión de Docker para asegurarte de que tus servicios autoalojados sigan siendo confiables y resistentes a las amenazas en constante evolución. ¡Buena suerte en tu viaje con Docker!


Espero que te haya gustado este nuevo episodio del podcast. Si puedes, te agradecería una valoración en iVoox y/o en Apple Podcast.

Más información,

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *