Saltar a contenido

Security Context

En Kubernetes, un securityContext define los privilegios y las configuraciones de control de acceso para un Pod o un Contenedor individual. Básicamente, le dice a Kubernetes quién ejecuta el proceso dentro del contenedor y qué puede hacer ese proceso en el sistema subyacente.

1. Los Dos Niveles: Pod vs. Contenedor

Esta es la regla de oro para el CKAD: el contexto de seguridad se puede definir a nivel de Pod o a nivel de Contenedor.

  • A nivel de Pod (pod.spec.securityContext): Las configuraciones se aplican a todos los contenedores dentro de ese Pod (y a los volúmenes).
  • A nivel de Contenedor (pod.spec.containers[*].securityContext): Las configuraciones se aplican solo a ese contenedor específico.

Regla de herencia: Si defines una misma configuración (como el usuario) en ambos niveles, la configuración del Contenedor sobrescribe a la del Pod.

2. Campos Clave que Debes Memorizar

Para el examen, no necesitas saber todos los campos, pero estos son obligatorios:

  • runAsUser: Especifica el ID del usuario (UID) que ejecutará el proceso (ej. 1000). Si no se especifica, suele ser root (0).
  • runAsGroup: Especifica el ID del grupo principal.
  • runAsNonRoot: Acepta true o false. Si es true, Kubelet validará la imagen antes de iniciarla para asegurar que no se ejecute como el usuario root (UID 0). Si intenta arrancar como root, el Pod fallará.
  • allowPrivilegeEscalation: Solo a nivel de contenedor. Si es true, el contenedor tiene casi los mismos privilegios que el nodo host (muy peligroso, pero a veces te lo piden en un escenario de troubleshooting).
  • capabilities: Solo a nivel de contenedor. Permite agregar (add) o quitar (drop) privilegios específicos del kernel de Linux sin dar acceso privileged total (ej. NET_ADMIN para modificar redes, SYS_TIME para cambiar la hora).
  • readOnlyRootFilesystem: Solo a nivel de contenedor.

3. Ejemplo de Manifiesto YAML

apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo
spec:
  # --- SEGURIDAD A NIVEL DE POD ---
  securityContext:
    runAsUser: 1000 # Todos los contenedores usarán este usuario por defecto
    fsGroup: 2000   # Permisos para volúmenes montados
  containers:
  - name: sec-ctx-container
    image: busybox
    command: [ "sh", "-c", "sleep 1h" ]
    # --- SEGURIDAD A NIVEL DE CONTENEDOR ---
    securityContext:
      runAsUser: 2000 # ¡ESTO SOBRESCRIBE EL 1000 DEL POD!
      allowPrivilegeEscalation: false
      capabilities:
        add: ["NET_ADMIN"] # Añade un privilegio específico