Tanzu Kubernetes v1.25 e versioni successive abilitano il controller PSA (Pod Security Admission). Con PSA è possibile applicare in modo uniforme la sicurezza dei pod utilizzando le etichette dello spazio dei nomi.

PSA abilitato in TKR 1.25 e versioni successive

Il controller Pod Security Admission è un controller Kubernetes che consente di applicare gli standard di sicurezza ai pod in esecuzione nei cluster TKG. Per impostazione predefinita, Tanzu Kubernetes v1.25 e versioni successive abilitano il controller Pod Security Admission (PSA). Il controller PSA sostituisce il controller PSP (Pod Security Policy), che è stato deprecato e rimosso. Vedere anche Configurazione di PSP per TKR 1.24 e versioni precedenti.

Tanzu Kubernetes v1.25 è una versione di transizione con PSA impostato su warn. A partire da Tanzu Kubernetes v1.26, viene applicato PSA. È consigliabile pianificare la migrazione dei carichi di lavoro del pod da PSP a PSA prima dell'aggiornamento dei cluster TKG. Per istruzioni, fare riferimento a Migrazione da Pod Security Policy al controller Pod Security Admission integrato.

Configurazione di PSA a livello di cluster

A partire da vSphere 8 Update 3, è possibile configurare PSA a livello di cluster utilizzando la variabile ClusterClass podSecurityStandard disponibile con l'API v1beta1. Vedere API v1beta1 del cluster.

Modalità di PSA

Il controller PSA supporta tre modalità di sicurezza del pod, ovvero enforce, audit e warn. La tabella include e descrive tutte le modalità di PSA.
Tabella 1. Modalità di PSA
MODALITÀ Descrizione
enforce Le violazioni della sicurezza causano il rifiuto del pod.
audit Le violazioni della sicurezza attivano l'aggiunta di un'annotazione audit all'evento registrato nel registro di controllo, ma sono comunque consentite.
warn Le violazioni della sicurezza attivano un avviso per l'utente, ma sono comunque consentite.

Standard di PSA

Il controller PSA definisce tre livelli di standard di sicurezza del pod che coprono tutta la gamma di eventi relativi alla sicurezza. Gli standard di sicurezza del pod sono cumulativi e vanno da quelli permissivi a quelli restrittivi. La tabella include e descrive tutti gli standard di PSA.
Tabella 2. Standard di PSA
LIVELLO Descrizione
privileged Controllo senza restrizioni che fornisce il più ampio livello di autorizzazioni possibile. Questo standard di sicurezza consente l'escalation nota dei privilegi.
baseline Criterio minimamente restrittivo che impedisce l'escalation nota dei privilegi. Questo standard di sicurezza consente la configurazione del pod predefinita (con specifica minima).
restricted Criterio con molte restrizioni che applica le procedure consigliate per la protezione avanzata del pod.

Etichette dello spazio dei nomi di PSA

Il controller PSA applica la sicurezza del pod a livello dello spazio dei nomi di Kubernetes. È possibile utilizzare le etichette dello spazio dei nomi per definire le modalità e i livelli di PSA che si desidera utilizzare per i pod in un determinato spazio dei nomi.

Kubernetes include un set di etichette che è possibile utilizzare per definire quale standard utilizzare per uno spazio dei nomi. L'etichetta applicata definisce l'azione che il piano di controllo Kubernetes esegue se viene rilevata una violazione di PSA. Per uno spazio dei nomi specifico, è possibile configurare una o tutte le modalità oppure impostare un livello diverso per ogni modalità.

La sintassi dell'etichetta dello spazio dei nomi di PSA è la seguente:
# MODE must be one of `enforce`, `audit`, or `warn`.
# LEVEL must be one of `privileged`, `baseline`, or `restricted`.
pod-security.kubernetes.io/<MODE>=<LEVEL>

È inoltre possibile applicare un'etichetta di versione per modalità che possa essere utilizzata per aggiungere lo standard di sicurezza alla versione di Kubernetes. Per ulteriori informazioni, vedere Applicazione degli standard di sicurezza del pod con etichette dello spazio dei nomi.

PSA predefinito per i cluster TKG

Per impostazione predefinita, i cluster TKG di cui è stato eseguito il provisioning con Tanzu Kubernetes v1.25 hanno le modalità di PSA warn e audit impostate su restricted per gli spazi dei nomi non di sistema. Si tratta di un'impostazione senza imposizione. Il controller PSA genera un avviso e una notifica di controllo se un pod viola la sicurezza, ma il pod non viene rifiutato.

Per impostazione predefinita, nei cluster TKG di cui è stato eseguito il provisioning con Tanzu Kubernetes v1.26 e versioni successive la modalità enforce di PSA è impostata su restricted per gli spazi dei nomi non di sistema. Se un pod viola la sicurezza, viene rifiutato. È necessario configurare PSA nello spazio dei nomi per eseguire i pod con un controllo meno restrittivo.
Importante: Alcuni pod di sistema in esecuzione negli spazi dei nomi kube-system, tkg-system e vmware-system-cloud-provider richiedono privilegi elevati. Questi spazi dei nomi sono esclusi dalla sicurezza del pod. Inoltre, la sicurezza del pod negli spazi dei nomi del sistema non può essere modificata.
Nella tabella è indicata la configurazione di PSA predefinita per i cluster TKG.
Tabella 3. PSA predefinito per i cluster TKG
Versione di TKr PSA predefinito
TKr v1.25

modalità: warn | livello: limitato

modalità: audit | livello: limitato

modalità: enforce | livello: non impostato

TKr v1.26 e versioni successive

modalità: enforce | livello: limitato

Configurazione di PSA mediante le etichette dello spazio dei nomi

Per Tanzu Kubernetes v1.25, utilizzare il comando di esempio seguente per modificare i livelli di sicurezza per un determinato spazio dei nomi in modo che gli avvisi e le notifiche di controllo di PSA non vengano generati.
kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/audit=privileged 
kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/warn=privileged
Per Tanzu Kubernetes v1.26 e versioni successive, utilizzare il comando di esempio seguente per eseguire il downgrade dello standard PSA da restricted a baseline.
kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/enforce=baseline
Ad esempio, per applicare lo standard baseline nello spazio dei nomi predefinito:
kubectl label --overwrite ns default pod-security.kubernetes.io/enforce=baseline
Per Tanzu Kubernetes v1.26 e versioni successive, utilizzare il comando di esempio seguente per eseguire il downgrade dello standard PSA da restricted a privileged.
kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/enforce=privileged
Ad esempio, per applicare lo standard privileged nello spazio dei nomi predefinito:
kubectl label --overwrite ns default pod-security.kubernetes.io/enforce=privileged

Per Tanzu Kubernetes v1.26 e versioni successive, utilizzare i comandi di esempio seguenti per rilassare rendere PSA meno restrittivo in tutti gli spazi dei nomi non di sistema.

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

Configurazione del contesto di sicurezza per singoli pod

Se si tenta di eseguire un pod che viola PSA, viene visualizzato un messaggio di errore che lo indica. Ad esempio:
{"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":[]}
Anziché impostare PSA su un intero spazio dei nomi, è possibile configurare il contesto di sicurezza per un singolo pod. Per consentire l'esecuzione di un singolo pod, nella specifica del pod è possibile impostare il contesto di sicurezza nel modo seguente:
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