Kubernetes domina el mercado de la orquestación de contenedores. Según varios informes, el 87 por ciento de las organizaciones están administrando una parte de sus cargas de trabajo de contenedores con Kubernetes y esta es una de las mayores tecnologías que están siendo adoptadas.

Adopción de Kubernetes

Y con ello, vemos el lado oscuro de dicha adopción temprana. Y es que el 94 por ciento de las organizaciones que usan kubernetes, han experimentado un problema de seguridad grave en los últimos 12 meses en su entorno de contenedores, casi el 70 por ciento ha detectado configuraciones incorrectas, el 27 por ciento ha experimentado incidentes de ciberseguridad  y el 24 por ciento ha descubierto vulnerabilidades importantes en dichos entornos de contenedores.

En términos generales, cada uno de estos problemas de ciberseguridad corresponde a una fase del ciclo de vida del contenedor:

  • Debemos remediar las vulnerabilidades conocidas durante la fase de compilación
  • Corregir las configuraciones incorrectas durante la fase de compilación / implementación
  • Responder a las amenazas en tiempo de ejecución.
Arquitectura Kubernetes

Prácticas recomendadas de ciberseguridad en Kubernetes: Fase de compilación

La protección de contenedores y Kubernetes comienza en la fase de compilación con la protección de las imágenes del contenedor. El tiempo que pasemos en este punto, pagará dividendos más adelante. Las mejores prácticas de ciberseguridad que se hayan perdido en este punto serán significativamente más costosas de corregir en fases posteriores.

Las dos cosas principales que se deben hacer aquí son crear imágenes seguras y escanear esas imágenes en busca de vulnerabilidades conocidas.

Recomendaciones

  1. Utiliza imágenes mínimas : Evita el uso de imágenes con shells o administradores de paquetes del sistema operativo, ya que podrían contener vulnerabilidades desconocidas. Si debemos incluir paquetes de sistema operativo, elimina el administrador de los mismos en un paso posterior.
  2. No agregues componentes innecesarios : Asegúrate de eliminar las herramientas de depuración de los contenedores en producción. Las herramientas comunes, como CURL, son muy útiles para los atacantes, como de un buen hardening hablásemos, bórralas.
  3. Utiliza solo imágenes actualizadas : Asegúrate de que sus imágenes (y cualquier herramienta de terceros que incluya) están actualizadas y utilizan las últimas versiones de sus componentes.
  4. Utiliza un escáner de imágenes para identificar vulnerabilidades : El escáner debería poder identificar las vulnerabilidades dentro de las imágenes, incluso por capas, y decirnos si se pueden parchear o no. Debemos poder buscar vulnerabilidades en paquetes de sistema operativo y bibliotecas para todas las  aplicaciones en contenedores. Os dejo por aquí una lista interesante de scanner de vulnerabilidades para kubernetes.
  5. Integra y automatiza la ciberseguridad : Haz que el escaneo de imágenes y otras comprobaciones de ciberseguridad formen parte de su canal para automatizar la seguridad  y generar alertas cuando el escáner detecte vulnerabilidades de altas, pero reparables
  6. Etiqueta vulnerabilidades no reparables : A veces, no existe una solución para una vulnerabilidad conocida, o la vulnerabilidad no es crítica y, por lo tanto, no garantiza una solución inmediata. En este caso, agrégalos a una lista blanca o filtra la salida del escáner para que no interrumpa el flujo de trabajo del equipo de desarrollo.
  7. Implementar defensa en profundidad : Cuando se descubre un problema de ciberseguridad en una imagen de un contenedor o una implementación en ejecución que usa esa imagen, asegúrate de tener verificaciones de políticas y un flujo de trabajo de corrección para detectar y actualizar esas imágenes.

Prácticas recomendadas de ciberseguridad en Kubernetes: Fase de implementación

La infraestructura de Kubernetes debe configurarse de forma segura antes de implementar las cargas de trabajo. Desde una perspectiva de ciberseguridad, primero necesitamos la visibilidad de lo que está implementando y cómo. Luego, podemos identificar y así responder a las brechas de la política de seguridad. Como mínimo, necesitamos saber:

  • Qué se está implementando : Incluyendo información sobre la imagen que se está utilizando, que componentes o vulnerabilidades, y los pods que se implementarán.
  • Dónde se implementará : Qué clústeres, espacios de nombres y nodos
  • Cómo se implementa : Si se ejecuta con privilegios, con qué otras implementaciones se puede comunicar, el contexto de seguridad del pod que se aplica, si corresponde
  • A qué puede acceder : Incluyendo secretos, volúmenes y otros componentes de la infraestructura, como el host o la API del orquestador.
  • Es compatible : Si cumple con nuestras políticas y requisitos de ciberseguridad

Con esta información, puede comenzar a apuntar a áreas para remediación y endurecimiento e implementar la segmentación adecuada.

Recomendaciones

  1. Utiliza espacios de nombres para aislar cargas de trabajo sensibles : Los espacios de nombres son un límite de aislamiento clave para los recursos de Kubernetes. Proporcionan una referencia para las políticas de red, las restricciones de control de acceso y otros controles de seguridad importantes. La separación de las cargas de trabajo en espacios de nombres puede ayudar a contener los ataques y limitar el impacto de errores o acciones destructivas por parte de los usuarios autorizados.
  2. Utiliza las políticas de red de Kubernetes para controlar el tráfico ( Entrada / Salida ) entre pods y clústeres : De forma predeterminada, Kubernetes permite que cada pod se ponga en contacto con los demás. Las políticas de segmentación de red son un control de seguridad clave que puede evitar el movimiento lateral a través de contenedores en caso de que un atacante ingrese. Cubrimos cómo configurar políticas de red de Kubernetes en dos publicaciones de blog anteriores.
  3. Evita el acceso con excesivos permisos a los secretos : Como primer paso, asegúrate de que las implementaciones recopilan solo los secretos que realmente requieren para evitar una exposición innecesaria.
  4. Evaluar los privilegios utilizados por los contenedores : El conjunto de capacidades, roles y privilegios otorgados a los contenedores pueden tener un gran impacto en ciberseguridad. El objetivo aquí es adherirse al principio de mínimo privilegio  y proporcionar los privilegios y capacidades mínimas que permitirían al contenedor realizar su función.

Las políticas de ciberseguridad de los pods son una forma de controlar los atributos relacionados con la misma en estos, incluidos los niveles de privilegio de los contenedores. Estos pueden permitir que un operador especifique lo siguiente:

  • No ejecutar los procesos de aplicación como root.
  • No permitir la escalada de privilegios.
  • Utilizar un sistema de archivos raíz de solo lectura.
  • Utilizar el montaje del sistema de archivos predeterminado  ( proc )
  • No utilizar la red del host ni el espacio de proceso.
  • Eliminar las capacidades de Linux no utilizadas e innecesarias.
  • Utilizar las opciones de SELinux para controles de proceso más detallados.
  • Otorgar a cada aplicación su propia cuenta de servicio de Kubernetes.
  • No montar las credenciales de la cuenta de servicio en un contenedor si no necesita acceder a la API de Kubernetes.
  1. Evaluar la procedencia de la imagen, incluidos los registros : Como regla general, no implemente código de fuentes desconocidas. Para Kubernetes, esto significa usar imágenes de registros conocidos que solo están en listas de permitidos.
  2. Extiende el escaneo de imágenes : Como una extensión del escaneo de imágenes, aplica políticas en la fase de implementación según los resultados del escaneo. Una forma de hacer que se cumpla sería utilizar el controlador de admisión de validación, una función de Kubernetes para rechazar la creación de la implementación cuando especifican imágenes sin resultados de escaneo o vulnerabilidades críticas, o si las imágenes se crearon hace más de 90 días. Las imágenes que no se han escaneado recientemente pueden contener vulnerabilidades con lo que ello conlleva.
  3. Utiliza etiquetas y anotaciones de forma adecuada : Por ejemplo, considera etiquetar o anotar las implementaciones con el nombre, el alias de correo electrónico o el canal de Slack del equipo responsable de una aplicación. Esto hará que sea más fácil alertar al equipo responsable sobre la clasificación de problemas de ciberseguridad.
  4. Habilita el control de acceso basado en roles de Kubernetes (RBAC) , este proporciona un método para controlar la autorización para acceder al servidor de API de Kubernetes de un clúster, tanto para los usuarios como para las cuentas de servicio del clúster. La función de Kubernetes RBAC es altamente configurable.

Prácticas recomendadas de ciberseguridad en Kubernetes: Fase de ejecución

La fase de ejecución expone las aplicaciones en contenedores a una gran cantidad de nuevos desafíos de ciberseguridad. Nuestro objetivo aquí es ganar visibilidad en el entorno de ejecución, y detectar / responder a las amenazas a medida que van surgiendo.

La protección proactiva de los contenedores y las implementaciones de Kubernetes en las fases de compilación e implementación puede reducir en gran medida la probabilidad de incidentes de ciberseguridad en la fase de ejecución y el esfuerzo posterior necesario para corregir los errores.

Primero, debemos monitorizar las actividades del contenedor más relevantes para la ciberseguridad :

  • Actividad de proceso
  • Comunicaciones de red entre servicios en contenedores
  • Comunicaciones de red entre servicios en contenedores y clientes y servidores externos

Observar el comportamiento de los contenedores para detectar anomalías es generalmente más fácil en los contenedores que en las máquinas virtuales debido a la naturaleza declarativa de los contenedores y Kubernetes. Estos atributos permiten conocer de una forma más sencilla, lo implementado y su actividad esperada.

Recomendaciones

  1. Aprovecha la información contextual en Kubernetes : Utiliza la información de tiempo de compilación e implementación en Kubernetes para evaluar la actividad observada frente a la esperada durante el tiempo de ejecución a fin de detectar actividad sospechosa.
  2. Amplía el análisis de vulnerabilidades a las implementaciones en ejecución : Supervisa las implementaciones en ejecución para detectar vulnerabilidades Zero Day, además de analizar las vulnerabilidades que existen en las imágenes del contenedor.
  3. Utiliza los controles de ciberseguridad integrados de Kubernetes : Configura el contexto de ciberseguridad para los pods para limitar sus capacidades. Estos controles pueden eliminar clases enteras de ataques que dependen del acceso privilegiado.
  4. Monitoriza el tráfico de la red para limitar las comunicaciones innecesarias o inseguras : Observa el tráfico de la red y compara ese tráfico con el permitido según las políticas de Kubernetes. Observar el tráfico de redes activas es una buena manera de comprender cómo las aplicaciones interactúan entre sí e identificar comunicaciones inesperadas.

Al mismo tiempo, comparar el tráfico activo con lo permitido nos brinda información valiosa sobre lo que no está sucediendo pero sí está permitido. Con esa información, podemos ajustar aún más las políticas permitidas para que  disminuya la superficie de ataque.

Los proyectos de código abierto como https://github.com/kinvolk/inspektor-gadget pueden ayudar con esto, y las soluciones de seguridad comercial brindan diversos grados de análisis del tráfico de la red de contenedores.

  1. Proceso de apalancamiento de listas permitidas : El proceso de usar listas blancas es una práctica probada para identificar procesos en ejecución inesperados. Primero, observa la aplicación durante un período de tiempo para identificar todos los procesos que se ejecutan en el curso normal del comportamiento de la aplicación, luego usa esta lista como su lista de procesos permitidos con el fin de comparar el comportamiento futuro de la aplicación.
  2. Compara y analiza diferentes actividades en tiempo de ejecución en pods : Las aplicaciones en contenedores se replican por motivos de alta disponibilidad, tolerancia a fallos o escala. Las réplicas deben comportarse de forma casi idéntica, las réplicas con desviaciones significativas de las demás justifican una mayor investigación y sospecha a priori.
  3. Integra la herramienta de ciberseguridad de Kubernetes con otros sistemas externos: Correo electrónico, PagerDuty, Slack, Google Cloud Security Command Center, SIEM , etc.) y aprovecha a alertar al equipo responsable de una aplicación determinada cuando se detecta una amenaza potencial. Los proveedores de seguridad comerciales de Kubernetes deben admitir una amplia gama de integraciones con herramientas externas.
  4. Utiliza los controles nativos de Kubernetes para contener una brecha de ciberseguridad : Indicar automáticamente a Kubernetes que escale los pods sospechosos a cero o elimine y luego reinicie las instancias de aplicaciones infringidas.

Ciberseguridad en infraestructuras Kubernetes

La ciberseguridad para Kubernetes, debe extenderse más allá de las imágenes y las cargas de trabajo y proteger todo el entorno, incluida la infraestructura del clúster.

  1. Actualiza Kubernetes : Siempre a la última versión sque sea posible. Recuerda que solo se admiten las últimas tres versiones de Kubernetes, incluidos los parches de seguridad para las vulnerabilidades recientes. Por lo tanto, si se descubre una vulnerabilidad alta para Kubernetes y tenemos cuatro versiones por detrás, nuestra versión no recibirá parche. ( Estos nos fuerza a estar siempre actualizados, o es la intención)
  2. Configura de forma segura el servidor API de Kubernetes : Asegúrate de deshabilitar el acceso no autenticado / anónimo y de usar el cifrado TLS ( mínimo 1.2 ) para las conexiones entre los kubelets y el servidor API.
  3. Asegura el kubelet : Como agente de nodo principal que se ejecuta en cada nodo, la configuración incorrecta de kubelet nos expone a un acceso de puerta trasera a través del mismo. Asegúrese de haber deshabilitado el acceso anónimo al kubelet ( iniciando el kubelet con la --anonymous-auth=falsebandera ) y usa NodeRestriction para limitar que el kubelet puede acceder.

Kubernetes incluye muchos más componentes, incluido el programador de kube, el administrador de controlador de kube, los archivos de configuración en el nodo principal y el nodo de trabajo, etc. Pero esto nos daría para muchísimo más ... os dejo una charla de Ian Lewis

Puesta en funcionamiento de la ciberseguridad en Kubernetes

La llegada de los contenedores y Kubernetes no ha cambiado la misión de ciberseguridad, el mismo es prácticamente igual independientemente de la tecnología ( Con sus particularidades, claro ). Su objetivo sigue siendo dificultar que los "malos" entren en nuestras aplicaciones e infraestructura y, si por lo que fuese tienen éxito, detectarlos y detenerlos lo más rápido posible. Sin embargo, las herramientas y metodologías deben adaptarse para adaptarse a las necesidades de las prácticas de DevSecOps y los principios nativos de la nube.

Recomendaciones

  1. Integrar la ciberseguridad antes en el ciclo de vida del contenedor : Debemos integrar la ciberseguridad antes del ciclo de vida del contenedor y garantizar la alineación y los objetivos compartidos entre los equipos de ciberseguridad y DevOps, transformando los mismos hacia los DevSecOps.
  2. Utiliza controles de seguridad nativos de Kubernetes para reducir el riesgo operativo : Aprovecha los controles nativos integrados en Kubernetes siempre que estén disponibles para hacer cumplir las políticas de ciberseguridad y que los mismos no choquen con el orquestador. En lugar de utilizar un proxy de terceros , utiliza las políticas de red de Kubernetes para garantizar una comunicación de red segura.
  3. Aprovecha el contexto que proporciona Kubernetes para priorizar los esfuerzos de remediación : En entornos de Kubernetes en expansión, la clasificación manual de los incidentes de ciberseguridad y las infracciones de políticas lleva mucho tiempo. Una implementación que contenga una vulnerabilidad con una puntuación de gravedad de 7 o más debe moverse hacia arriba en la prioridad de corrección si esa implementación contiene contenedores privilegiados y está abierta a Internet, pero hacia abajo si está en un entorno de prueba y admite una aplicación no crítica. Misma metodología que las tecnologías tradicionales.