Marcio Cunha

¿Fuga de datos en Kubernetes? Cómo aislar workloads

Aprende a blindar tu clúster de Kubernetes contra invasiones laterales entre pods usando NetworkPolicies nativas. Restringe tráfico en capa 3 y 4 con ejemplos prácticos.

Marcio Cunha•5 min
También disponible en:PortuguêsEnglish
Resumen
  • El comportamiento predeterminado de Kubernetes permite que cualquier pod se comunique libremente con cualquier otro pod en la red.
  • Las NetworkPolicies actúan en las capas de red 3 y 4 del modelo OSI, controlando direcciones IP, puertos y protocolos.
  • La implementación de políticas de denegación predeterminada crea un perímetro seguro donde el tráfico debe ser autorizado explícitamente.
  • Problemas graves como pods atascados en CrashLoopBackOff exigen diagnósticos rápidos para evitar brechas duraderas de seguridad.
  • El aislamiento adecuado de namespaces evita que el compromiso de una aplicación se propague a bases de datos críticas.

El peligro invisible de la comunicación abierta entre pods en Kubernetes

Cuando creamos un clúster de Kubernetes, la configuración predeterminada es sorprendentemente abierta. En la práctica, esto significa que cualquier pod, que es la unidad mínima de cómputo que gestiona uno o más contenedores, puede hablar libremente con cualquier otro pod o servicio en cualquier namespace, el cual funciona como una división lógica para separar entornos. Si un atacante logra comprometer una aplicación web expuesta a internet, gana vía libre para escanear la red interna y tratar de derribar la base de datos. Es exactamente aquí donde surge la necesidad urgente de implementar barreras de seguridad en las capas inferiores de la red.

Muchos equipos confían ciegamente en la seguridad del perímetro de la nube y olvidan que el movimiento lateral dentro del clúster es uno de los vectores favoritos de ataque. Para mitigar este riesgo de forma eficiente, la ingeniería de redes debe mirar hacia las capas 3 y 4 del modelo OSI, controlando direcciones IP y puertos TCP o UDP. Así como resolvemos problemas complejos de infraestructura, por ejemplo cuando investigamos por qué los pods de Kubernetes se quedan en CrashLoopBackOff o cuando limitamos recursos de CPU usando cgroups en Docker, la seguridad de red exige rigor técnico, previsibilidad y pruebas constantes para garantizar que no queden brechas abiertas.

Qué son las NetworkPolicies y cómo blindan tu clúster

Las NetworkPolicies son reglas declarativas nativas de Kubernetes que actúan como un cortafuegos inteligente para tus pods. En la práctica, utilizan selectores basados en etiquetas, conocidos como labels, para decidir qué conexiones entran y salen de un conjunto determinado de pods. Cuando aplicas una política de denegación predeterminada, conocida como default deny, el clúster bloquea todo el tráfico por defecto, exigiendo que escribas reglas específicas para permitir únicamente lo estricto y necesario. Esto transforma una red totalmente abierta en un entorno segmentado y de menor privilegio.

Para entender el funcionamiento técnico, imagina el tráfico de red como un edificio de oficinas donde las puertas están abiertas. Sin una NetworkPolicy, cualquiera puede entrar a cualquier habitación. Con la política activa, cada puerta exige una credencial específica basada en quién llama y a qué puerto de servicio intenta acceder. Este enfoque protege aplicaciones sensibles frente a escaneos maliciosos y evita que una filtración de credenciales en un servicio menor comprometa todo el ecosistema de microservicios. El esfuerzo operativo de configuración se compensa ampliamente con las ganancias de seguridad.

Creando tu primera regla de aislamiento en capa 3 y 4

La implementación práctica de una NetworkPolicy exige atención a los selectores de namespaces y pods para garantizar precisión quirúrgica. A continuación, presentamos un manifiesto YAML funcional que bloquea todo el tráfico de entrada en un namespace específico, permitiendo únicamente que un pod de frontend se comunique con la base de datos en el puerto 5432. Este es un excelente punto de partida para blindar entornos productivos contra accesos no autorizados de pods vecinos que no deberían ver información confidencial.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: aislar-base-de-datos
  namespace: produccion
spec:
  podSelector:
    matchLabels:
      app: postgresql
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 5432

En este manifiesto, el bloque podSelector identifica el objetivo de la regla, que en este caso es la base de datos etiquetada como app: postgresql. El bloque ingress define estrictamente quién tiene permiso de entrada, limitando el origen a los pods etiquetados como app: frontend y restringiendo el protocolo de transporte estrictamente al puerto TCP 5432. Cualquier intento de conexión desde otra procedencia o puerto será descartado silenciosamente por el plugin de red del clúster, asegurando la integridad y confidencialidad de la información almacenada.

Errores comunes y el papel crucial del CNI en Kubernetes

Un error clásico cometido por administradores novatos es aplicar NetworkPolicies sin verificar si su CNI, que es la interfaz de red del contenedor encargada de implementar reglas de conectividad a nivel de nodo, ofrece soporte para esta funcionalidad. Los plugins de red básicos, como el kubenet predeterminado en entornos sencillos, simplemente ignoran estas políticas sin generar ninguna advertencia de error, dejando al operador con una falsa sensación de seguridad. Para que el aislamiento funcione de verdad, debes utilizar CNI robustos y compatibles como Calico, Cilium o Flannel con soporte para políticas habilitado.

Otro punto crítico de atención se refiere al tráfico de salida, conocido como Egress. Si solo configuras el tráfico de entrada, las aplicaciones aún podrán realizar peticiones arbitrarias hacia fuera del namespace, abriendo posibles brechas para la exfiltración de datos hacia servidores externos controlados por atacantes. La planificación de seguridad de red debe abarcar tanto la entrada como la salida, estableciendo perímetros rígidos que dificulten cualquier intento de comunicación lateral no deseada o fuga de información confidencial hacia la internet pública.

Validando y probando el aislamiento de tráfico en la práctica

Tras aplicar tus políticas de red, nunca asumas que funcionan a la perfección sin realizar pruebas prácticas de validación. La manera más simple y directa de probar el bloqueo es crear un pod temporal con herramientas de línea de comandos como curl o netcat dentro de un namespace no autorizado e intentar alcanzar el servicio protegido. Si el tráfico se corta con éxito, la conexión se quedará esperando un tiempo límite o devolverá un error de conexión rechazada, confirmando que el cortafuegos del clúster cumple su función correctamente.

Mantener esta rutina de pruebas debe formar parte del ciclo de vida de entrega continua de tu infraestructura, integrando verificaciones de seguridad cada vez que cambien las reglas de enrutamiento. Al combinar una red rigurosamente segmentada con buenas prácticas de observabilidad y control de recursos, transformamos Kubernetes en un entorno resiliente capaz de resistir incidentes graves de seguridad, protegiendo los datos de los usuarios y la reputación de la empresa frente a amenazas persistentes.