Tema 14
El hardening de Kubernetes busca impedir configuraciones peligrosas antes del despliegue y detectar comportamientos anómalos durante la ejecución. No alcanza con tener un cluster operativo: debe rechazar workloads inseguros y limitar su impacto.
Kubernetes permite ejecutar workloads muy diversos. Esa flexibilidad también permite configuraciones peligrosas: pods privilegiados, contenedores root, montajes del host, capabilities innecesarias, secretos expuestos, comunicación libre entre namespaces y despliegues de imágenes no confiables.
El hardening consiste en definir límites técnicos para que los equipos puedan desplegar sin romper controles básicos. Debe combinar políticas preventivas, validación en admisión, segmentación de red, configuración segura de pods y monitoreo de runtime.
La meta es que el cluster no dependa solo de buenas intenciones o revisión manual.
Hardening es reducir superficie de ataque y aplicar configuraciones seguras por defecto. En Kubernetes implica controlar cómo se crean, configuran y ejecutan los workloads.
Áreas principales:
Pod Security Standards define niveles de seguridad para pods. Ayudan a establecer una línea base de controles que evitan configuraciones peligrosas.
| Nivel | Propósito | Uso típico |
|---|---|---|
| Privileged | Permite casi todo | Solo casos muy controlados de infraestructura |
| Baseline | Bloquea configuraciones claramente peligrosas | Punto inicial para workloads generales |
| Restricted | Aplica restricciones fuertes de seguridad | Workloads productivos que pueden operar con mínimo privilegio |
El nivel adecuado depende del tipo de workload, pero producción debería tender a Baseline o Restricted, dejando Privileged para excepciones justificadas.
SecurityContext define opciones de seguridad para pods y contenedores. Es una herramienta central para reducir privilegios.
Controles importantes:
runAsNonRoot: exige ejecución con usuario no root.runAsUser: define UID específico.readOnlyRootFilesystem: evita escritura en el filesystem raíz.allowPrivilegeEscalation: impide aumentar privilegios dentro del contenedor.capabilities.drop: elimina capabilities innecesarias.seccompProfile: limita llamadas al sistema.Un contenedor privilegiado puede acceder a recursos del host con muy pocas restricciones. Esto rompe gran parte del aislamiento esperado y debe evitarse salvo casos excepcionales.
Las capabilities permiten otorgar privilegios específicos sin dar todo el poder de root. La práctica recomendada es quitar todas las capabilities y agregar solo las estrictamente necesarias.
| Configuración | Riesgo | Enfoque seguro |
|---|---|---|
privileged: true |
Acceso amplio al host | Prohibir por defecto y aprobar excepciones |
| Capabilities amplias | Escalamiento o manipulación de red/sistema | drop: ["ALL"] y agregar solo lo necesario |
| HostPID o HostNetwork | Visibilidad o acceso a recursos del nodo | Evitar salvo componentes de infraestructura |
| Montajes del host | Lectura o escritura de archivos sensibles | Restringir rutas, modo solo lectura y auditoría |
Admission control intercepta solicitudes al API server antes de persistir objetos. Permite validar, modificar o rechazar recursos según políticas.
Usos comunes:
Policy as code expresa reglas de seguridad en archivos versionados y revisables. Esto permite probar, auditar y evolucionar políticas como parte del ciclo DevSecOps.
Beneficios:
Las políticas deben empezar midiendo impacto. Pasar directamente a bloqueo estricto puede romper despliegues legítimos si no se preparan los equipos.
Las network policies controlan tráfico entre pods, namespaces y destinos externos. Son esenciales para reducir movimiento lateral.
Una estrategia típica:
Las network policies requieren soporte del plugin de red. Si el CNI no las implementa, los manifiestos pueden existir sin efecto real.
El tráfico saliente desde pods suele recibir menos atención que el entrante. Sin control de egreso, un workload comprometido puede comunicarse con dominios externos, descargar herramientas o exfiltrar datos.
Controles posibles:
Los límites de recursos reducen riesgo de denegación de servicio interna. Un pod sin límites puede consumir CPU, memoria o almacenamiento hasta afectar otros workloads del nodo o namespace.
Controles recomendados:
Runtime security observa el comportamiento real de contenedores y nodos. Detecta acciones que no deberían ocurrir aunque el manifiesto haya pasado validaciones.
Ejemplos de señales:
Un filesystem raíz de solo lectura reduce la capacidad de un atacante para modificar el contenedor, instalar herramientas o persistir cambios. No todas las aplicaciones lo soportan sin ajustes, pero es una meta recomendable.
Para aplicarlo:
readOnlyRootFilesystem.El cluster debería desplegar solo imágenes provenientes de fuentes confiables. Esto se logra combinando registries aprobados, firmas, digest y políticas de admisión.
| Control | Qué evita | Observación |
|---|---|---|
| Allowlist de registries | Uso de imágenes externas no gobernadas | Debe incluir registries internos y aprobados |
| Firma obligatoria | Despliegue de imágenes no autorizadas | Requiere gestión de claves o identidad de firma |
| Digest en producción | Cambios silenciosos por tags mutables | Mejora reproducibilidad |
| Bloqueo de vulnerabilidades críticas | Ejecución de artefactos con riesgo conocido | Debe contemplar excepciones con vencimiento |
Aplicar hardening de golpe puede romper cargas existentes. Conviene avanzar por etapas.
Endurecer Kubernetes implica establecer controles técnicos que impidan configuraciones peligrosas, limiten comunicación, reduzcan privilegios y detecten actividad anómala. Estos controles convierten al cluster en una plataforma más segura para ejecutar aplicaciones.
En el próximo tema estudiaremos la seguridad de workloads: service accounts, límites, aislamiento, sidecars y service mesh.