Las versiones 1.25 y posteriores de Tanzu Kubernetes admiten la controladora de admisión de seguridad de pods (Pod Security Admission, PSA). Con PSA, puede aplicar de manera uniforme la seguridad de pods mediante etiquetas de espacio de nombres.

PSA habilitada en TKR 1.25 y versiones posteriores

La controladora de admisión de seguridad de pods es una controladora de Kubernetes que permite aplicar estándares de seguridad a los pods que se ejecutan en los clústeres de TKG. De forma predeterminada, las Tanzu Kubernetes versiones 1.25 y posteriores habilitan la controladora de PSA. La controladora de PSA reemplaza a la controladora de la directiva de seguridad de pods (Pod Security Policy, PSP), que está obsoleta y se eliminó. Consulte también Configurar PSP para TKR 1.24 y versiones anteriores.

Tanzu Kubernetes v1.25 es una versión de transición con PSA configurada como advertencia. A partir de Tanzu Kubernetes v1.26, PSA entrará en vigor. Debe planificar la migración de las cargas de trabajo de pods de PSP a PSA antes de actualizar los clústeres de TKG. Para obtener instrucciones, consulte Migrar de la directiva de seguridad de pods a la controladora de admisión de seguridad de pods integrada.

Configurar PSA en todo el clúster

A partir de vSphere 8 Update 3, puede configurar PSA en todo el clúster mediante la variable ClusterClass de podSecurityStandard que está disponible con la API v1beta1. Consulte API de clúster v1beta1.

Modos de PSA

La controladora de PSA admite tres modos de seguridad de pods: enforce, audit y warn. En la tabla se enumera y describe cada modo de PSA.
Tabla 1. Modos de PSA
MODO Descripción
enforce Las infracciones de seguridad hacen que se rechace el pod.
audit Las infracciones de seguridad generan la adición de una anotación de auditoría al evento consignado en el registro de auditoría, pero por lo demás están permitidas.
warn Las infracciones de seguridad activan una advertencia orientada al usuario, pero por lo demás están permitidas.

Estándares de PSA

La controladora de PSA define tres niveles de estándares de seguridad de pods destinados a cubrir el espectro de seguridad. Los estándares de seguridad de pods son acumulativos y van de permisivos a restrictivos. En la tabla se enumera y describe cada estándar de PSA.
Tabla 2. Estándares de PSA
NIVEL Descripción
privileged Control sin restricciones, que brinda el nivel más amplio posible de permisos. Este estándar de seguridad permite escalaciones de privilegios conocidos.
baseline Control poco restrictivo que impide escalaciones de privilegios conocidos. Este estándar de seguridad permite la configuración predeterminada (mínimamente especificada) de pods.
restricted Control muy restringido, que sigue las prácticas recomendadas de protección de pods.

Etiquetas de espacio de nombres de PSA

La controladora de PSA aplica la seguridad de pods en el nivel del espacio de nombres de Kubernetes. Las etiquetas de espacio de nombres se utilizan para definir los modos y los niveles de PSA que desea utilizar para los pods en un espacio de nombres determinado.

Kubernetes proporciona un conjunto de etiquetas que pueden utilizarse para definir cuáles de los estándares se utilizarán para un espacio de nombres. La etiqueta que aplique define la acción que realiza el plano de control de Kubernetes si se detecta una posible infracción de la PSA. Para un espacio de nombres de Kubernetes dado, puede configurar algún modo o todos, o incluso establecer un nivel diferente para los distintos modos.

La sintaxis de las etiquetas del espacio de nombres de PSA es la siguiente:
# MODE must be one of `enforce`, `audit`, or `warn`.
# LEVEL must be one of `privileged`, `baseline`, or `restricted`.
pod-security.kubernetes.io/<MODE>=<LEVEL>

También puede aplicar una etiqueta de versión por modo que se pueda utilizar para fijar el estándar de seguridad a la versión de Kubernetes. Consulte Aplicar estándares de seguridad de pods con etiquetas de espacio de nombres para obtener más información.

PSA predeterminada para clústeres de TKG

De forma predeterminada, los clústeres de TKG aprovisionados con Tanzu Kubernetes versión 1.25 tienen modos PSA warn y audit establecidos en restricted para espacios de nombres que no son del sistema. Esta es una configuración sin fuerza: la controladora de PSA genera una advertencia y una notificación de auditoría si un pod infringe la seguridad, pero no se rechaza el pod.

De forma predeterminada, los clústeres de TKG aprovisionados con Tanzu Kubernetes versión 1.26 y posteriores tienen el modo PSA enforce establecido en restricted para espacios de nombres que no son del sistema. Si un pod infringe la seguridad, se rechaza. Debe configurar PSA en el espacio de nombres para ejecutar pods con un control menos restrictivo.
Importante: Algunos pods del sistema que se ejecutan en los espacios de nombres kube-system, tkg-system y vmware-system-cloud-provider requieren privilegios elevados. Estos espacios de nombres se excluyen de la seguridad de pods. Además, no se puede cambiar la seguridad de los pods en los espacios de nombres del sistema.
En la tabla se muestra la configuración de PSA predeterminada para clústeres de TKG.
Tabla 3. PSA predeterminada para clústeres de TKG
Versión de TKr PSA predeterminada
TKr v1.25

modo: advertencia | nivel: restringido

modo: auditoría | nivel: restringido

modo: aplicación | nivel: no establecido

TKr v1.26 y versiones posteriores

modo: aplicación | nivel: restringido

Configurar PSA mediante etiquetas de espacio de nombres

Para Tanzu Kubernetes versión 1.25, utilice el siguiente comando de ejemplo a fin de cambiar los niveles de seguridad de un espacio de nombres determinado, de modo que no se generen las advertencias de PSA ni las notificaciones de auditoría.
kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/audit=privileged 
kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/warn=privileged
Para Tanzu Kubernetes versiones 1.26 y posteriores, utilice el siguiente comando de ejemplo para cambiar el estándar PSA de restricted a baseline.
kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/enforce=baseline
Por ejemplo, para aplicar el estándar baseline en el espacio de nombres predeterminado:
kubectl label --overwrite ns default pod-security.kubernetes.io/enforce=baseline
Para Tanzu Kubernetes versiones 1.26 y posteriores, utilice el siguiente comando de ejemplo para cambiar el estándar PSA de restricted a privileged.
kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/enforce=privileged
Por ejemplo, para aplicar el estándar privileged en el espacio de nombres predeterminado:
kubectl label --overwrite ns default pod-security.kubernetes.io/enforce=privileged

Para Tanzu Kubernetes versiones 1.26 y posteriores, utilice los siguientes comandos de ejemplo para relajar la PSA en todos los espacios de nombres que no sean del sistema.

kubectl label --overwrite ns --all pod-security.kubernetes.io/enforce=privileged
kubectl label --overwrite ns --all pod-security.kubernetes.io/warn=restricted

Configurar el contexto de seguridad para pods individuales

Si intenta ejecutar un pod que infringe la PSA, se reactiva un mensaje de error que lo indica. Por ejemplo:
{"opType":"CREATE_POD","succeeded":false,"err":"creating pod example-pod: pods 
\"example-pod\" is forbidden: violates PodSecurity \"restricted:latest\": 
allowPrivilegeEscalation != false (container \"example-container\" must set 
securityContext.allowPrivilegeEscalation=false), unrestricted capabilities 
(container \"example-container\" must set securityContext.capabilities.drop=[\"ALL\"]), 
runAsNonRoot != true (pod or container \"example-container\" must set securityContext.runAsNonRoot=true), 
seccompProfile (pod or container \"example-container\" must set securityContext.seccompProfile.type to 
\"RuntimeDefault\" or \"Localhost\")","events":[]}
En lugar de establecer PSA en un espacio de nombres completo, puede configurar el contexto de seguridad para un pod individual. Para permitir que se ejecute un pod individual, en la especificación del pod, puede establecer el contexto de seguridad de la siguiente manera:
apiVersion: v1
kind: Pod
metadata:
  name: example-pod 
spec:
  containers:
  - image: gcr.io/google_containers/busybox:1.24
    name: example-container
    command: ["/bin/sh", "-c", "echo 'hello' > /mnt/volume1/index.html && chmod o+rX /mnt /mnt/volume1/index.html && while true ; do sleep 2 ; done"]
    securityContext:
      allowPrivilegeEscalation: false
      runAsNonRoot: true
      seccompProfile:
        type: "RuntimeDefault"
      capabilities:
        drop: [all]
    volumeMounts:
    - name: example-volume-mount
      mountPath: /mnt/volume1
  restartPolicy: Never
  volumes:
  - name: example-volume
    persistentVolumeClaim:
    claimName: example-pvc