Skip to main content

De la seguridad de imágenes a la seguridad de las cargas de trabajo

Escrito por

31 de octubre de 2019

0 minutos de lectura

Esta es la tercera parte de una serie de cuatro partes sobre cómo crear una estrategia de seguridad de aplicaciones (AppSec) para Kubernetes. Encuentra aquí la parte I y aquí la parte II.


En una de nuestras publicaciones anteriores, hablamos sobre cómo el empaquetado de aplicaciones está pasando a manos de los desarrolladores a medida que las organizaciones adoptan los contenedores. Pero no solo el empaquetado está pasando de la administración de sistemas al desarrollo: la gestión de la configuración también.

Kubernetes y el desafío de la configuración

La API de Kubernetes es una potente abstracción para crear sistemas nativos de la nube. Sin embargo, una consecuencia imprevista de esta API tan completa es que los desarrolladores escriben manualmente grandes cantidades de configuración, principalmente en YAML. Por ejemplo, considera esta descripción de un Deployment de Kubernetes:

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80

Estos archivos de configuración suelen almacenarse en sistemas de control de versiones, a veces junto con el código de la aplicación y otras veces por separado. Solo en GitHub hay más de 1,5 millones de archivos de configuración de Kubernetes públicos.

Inseguros de forma predeterminada

Por desgracia, la amplia superficie de configuración de Kubernetes da lugar a varios posibles problemas de seguridad. La presentación The Path Less Travelled, de Ian Coldwater y Duffie Cooley, resume muy bien algunos de los problemas de seguridad de la configuración predeterminada de Kubernetes. Estas son algunas propiedades comunes de configuración que suelen quedar sin configurar: 

Límites de CPU y memoria

Establecer límites para la CPU y la memoria previstas aporta beneficios operativos y de seguridad. En cuanto a la seguridad, se trata de limitar el impacto que pueden tener los posibles ataques de denegación de servicio en la aplicación, en lugar de afectar al nodo y, potencialmente, a todo el clúster.

runAsNonRoot

De forma predeterminada, los contenedores se ejecutan como usuario root. Esta propiedad lo impide en el entorno de ejecución del contenedor; es decir, si un atacante logra ejecutar un comando en el contexto del contenedor, solo tendrá permisos limitados.

readOnlyRootFilesystem

De forma predeterminada, el sistema de archivos montado para el contenedor permite escritura. Esto significa que un atacante que comprometa el contenedor también puede escribir en el disco, lo que facilita ciertos ataques. Si tus contenedores no mantienen estado, no necesitas un sistema de archivos con permisos de escritura.

Capacidades

Las capacidades de Linux controlan, a bajo nivel, lo que hacen los procesos dentro del contenedor: desde escribir en el disco hasta comunicarse por la red. Es posible eliminar todas las capacidades y agregar las necesarias, pero para hacerlo hay que conocer la lista de capacidades.

Estas propiedades de configuración no son vulnerabilidades en sí mismas, pero por lo general facilitan que un atacante aproveche una vulnerabilidad en una imagen. Si se produce un exploit, las propiedades de configuración pueden amplificar el daño. El nivel de exposición al riesgo no depende solo de las vulnerabilidades que tengas, sino también del contexto en el que se presentan.

La configuración a lo largo del SDLC

A medida que trasladamos más responsabilidades de seguridad a los desarrolladores, resulta interesante analizar el desafío de la configuración segura desde la perspectiva del SDLC, como hacemos con las vulnerabilidades de las imágenes. 

Etapa

Descripción

Comentarios

Completitud

Local

Herramientas locales que ayudan a crear configuraciones teniendo en cuenta la seguridad, desde la integración con los flujos de trabajo de pruebas unitarias hasta las sugerencias en los IDE. Sin embargo, resuelven problemas individuales, no los de equipos u organizaciones.

Rápida

Baja

CI/CD

Fallar rápidamente la compilación si los archivos de configuración son potencialmente inseguros o no cumplen alguna política interna. Sin embargo, esto debe implementarse en todos los pipelines pertinentes.

Rápida

Variable

Repositorio

Actualmente, la configuración se almacena principalmente en un sistema de control de versiones (aunque cabe señalar que Helm 3 agrega compatibilidad para almacenar imágenes en registros OCI compatibles). ¿Cómo ayudamos a los desarrolladores a escribir configuraciones seguras entre el envío de pull requests y la creación de ramas?

Media

Media

Admisión

Los controladores de admisión de Kubernetes bloquean las solicitudes a la API y permiten impedir configuraciones inseguras prohibidas.

Sin embargo, es posible que distintos clústeres tengan políticas diferentes. Además, esto afecta las solicitudes nuevas, no las cargas de trabajo existentes.

Lenta

Alta

Producción

La API de Kubernetes representa la configuración en ejecución: aquí es donde debes prestar más atención a la configuración. Sin embargo, los problemas en esta etapa pueden afectar cargas de trabajo reales, y los ciclos de respuesta para resolverlos pueden ser lentos.

Lenta

Alta

Al igual que cuando analizamos las pruebas de imágenes de contenedores, hay distintas ventajas y desventajas según la etapa. Probar solo en una etapa puede ofrecer comentarios rápidos, pero menos control, o viceversa. Como ocurre al analizar las vulnerabilidades de las imágenes, un proceso de seguridad moderno y maduro probablemente incluya pruebas de configuración en varias etapas.

Conclusiones

Nuestras aplicaciones no son solo las imágenes que usamos para empaquetarlas, sino también la configuración que usamos para ejecutarlas. En el mejor de los casos, hemos considerado que son dos áreas distintas que deben protegerse. Sin embargo, en la mayoría de los casos, las conversaciones sobre seguridad de contenedores para desarrolladores se han centrado exclusivamente en las vulnerabilidades de las imágenes. A medida que la responsabilidad por la seguridad de las aplicaciones pasa a los equipos de desarrollo, es cada vez más importante entender la relación entre las vulnerabilidades de las imágenes y la configuración, y contar con herramientas que ayuden a proteger ambas.

Empieza con Capture the Flag

Aprende a resolver desafíos de Capture the Flag viendo nuestro taller virtual introductorio a pedido.

Leer más

feature insights announcement
Blog

Compromiso de la cadena de suministro de node-gyp: un gusano de npm que se propaga solo y se oculta en binding.gyp

Un nuevo gusano de npm abusa de binding.gyp para activar node-gyp durante la instalación y permitir que paquetes maliciosos ejecuten código sin scripts del ciclo de vida. Roba credenciales, persiste en GitHub y se propaga entre mantenedores.

Article

Versiones maliciosas de node-ipc publicadas en npm tras una presunta toma de control de la cuenta de un mantenedor

El 14 de mayo de 2026, se publicaron varias versiones maliciosas del popular paquete npm node-ipc en el registro de npm. Los informes públicos actuales identifican node...

blog feature toolkit
Blog

Publicación maliciosa del paquete elementary-data en PyPI roba credenciales en la nube de ingenieros de datos

Los atacantes aprovecharon una vulnerabilidad de inyección de scripts en GitHub Actions para publicar una versión maliciosa de la CLI de Python elementary-data (v0.23.3), que incluía una puerta trasera para robar credenciales de perfiles de dbt, claves de proveedores de nube y secretos SSH en entornos de ingeniería de datos.