He trabajado en TI durante más de 20 años, pero de alguna manera nunca llegué a dedicarme a los contenedores. En teoría, entendí cómo estaban estructurados y cómo funcionaban. Pero como nunca los había encontrado en la práctica, no estaba seguro de cómo giraban y giraban exactamente los engranajes debajo de su capó.
Además, no tenía idea de cómo era su seguridad. Pero, una vez más, la teoría suena bien y la vieja canción “a medida que aumenta la seguridad, disminuye la usabilidad” se me quedó grabada en la cabeza. Entonces pensé que como todo es tan fácil de hacer con los contenedores, entonces la seguridad allí es inferior a la media. Resulta que tenía razón.
Para comenzar rápidamente, me inscribí en cursos
El curso, impartido por Sheila A. Berta y Sol Ozzan, comenzó inmediatamente con una descripción de cómo funcionan los contenedores Docker y el viaje que realizan cuando se implementan en Kubernetes. Esta fue una clase completamente práctica: los estudiantes tuvieron que instalar Docker y microk8 en sus máquinas antes de la clase; una excelente manera de ver cómo las herramientas interactúan entre sí, encontrar puntos débiles y, lo más importante, intentar bloquearlos.
Desafortunadamente, aunque los cursos prometían convertirme en un “príncipe” después de dos días, sentí que todo apenas comenzaba y todavía tenía mucho que aprender.
Antes de profundizar en mis elevadas observaciones, es importante explicar qué es un contenedor. En el mundo del desarrollo, se considera normal que el código escrito en su máquina personal funcione perfectamente, pero cuando intenta ejecutarlo en algún servidor, simplemente no funciona. Los contenedores intentan superar este problema proporcionando máquinas autónomas que se pueden mover fácilmente de un servidor a otro, sabiendo que siempre funcionarán. Como sugiere el nombre, contienen el código, las bibliotecas y otro software necesario para realizar el trabajo. Kubernetes, por otro lado, es
A continuación se presentan algunos de mis hallazgos desde la perspectiva del equipo rojo y azul.
equipo rojo
La mayor parte del contenido del contenedor se ejecuta como raíz: Esto significa que si el contenedor se ve comprometido, tendrá acceso completo al contenedor. Esto hace que los siguientes pasos sean mucho más fáciles.
Montar docker.sock dentro de un contenedor es peligroso: Si tiene root dentro de un contenedor y también instaló Docker dentro de un contenedor que tiene un socket Docker (/var/run/docker.sock), tiene el potencial de explorar todo el clúster, incluido el acceso a cualquier otro contenedor. Dicho acceso no puede impedirse mediante el aislamiento de la red u otros medios.
Las variables de entorno suelen contener datos secretos.: En la mayoría de los casos, las personas envían contraseñas al contenedor utilizando variables de entorno normales. Entonces, si tienes acceso a la cuenta, podrás espiar estas variables de entorno para luego ampliar tus poderes.
La API de Docker puede proporcionar mucha información: La API de Docker, cuando está configurada de forma predeterminada, se ejecuta sin autorización y puede producir una gran cantidad de información. Con Shodan, puede encontrar fácilmente una lista de puertos abiertos, luego obtener información detallada sobre el clúster y proceder a su captura completa. TrendMicro escribió sobre esto
Equipo azul
No ejecute el contenido del contenedor como root: Aunque es más fácil ejecutarlo como root, no deberías hacerlo. En su lugar, ejecute aplicaciones con permisos de reinicio mostrando el uid, ya sea usando la opción --user cuando se ejecuta desde la CLI o especificando USER en el Dockerfile.
No permitir que se instale software en contenedores: Casi todos los ataques comienzan plantando algo. Desde nmap hasta ifconfig y el propio Docker (dentro de un contenedor), instalar cualquier cosa en un contenedor ha sido algo común. Por la misma razón, siempre debes bloquear todos los puertos no utilizados. Esto también ayuda a evitar que se transmitan comandos de control cuando su máquina está infectada. Además de impedir la instalación de programas, conviene asegurarse de que en el propio contenedor estén instaladas el número mínimo de aplicaciones necesarias para completar la tarea.
Proteger docker.sock: Debe estar protegido porque la comunicación entre el contenedor y el clúster se procesa a través de este socket. Como no quiero entrar en detalles en este artículo, lea
Utilice secretos de Docker en lugar de variables de entorno: Hay secretos
Si el artículo ha despertado su interés en los contenedores, puede instalar fácilmente Docker o microk8s (una versión pequeña de Kubernetes).
Después de la instalación puedes ir
Si desea o necesita realizar un curso completo sobre Docker, en el que oradores prácticos examinen todas sus herramientas: desde abstracciones básicas hasta parámetros de red, matices del trabajo con varios sistemas operativos y lenguajes de programación, intente "
Fuente: habr.com