Les versions 1.25 et ultérieures de Tanzu Kubernetes prennent en charge le contrôleur d'admission de sécurité de l'espace (PSA, Pod Security Admission). Avec PSA, vous pouvez appliquer uniformément la sécurité de l'espace à l'aide d'étiquettes d'espace de noms.

PSA activé dans TKR 1.25 et versions ultérieures

Le contrôleur d'admission de sécurité de l'espace est un contrôleur Kubernetes qui vous permet d'appliquer des normes de sécurité aux espaces s'exécutant sur vos clusters TKG. Par défaut, les versions v1.25 et ultérieures de Tanzu Kubernetes activent le contrôleur d'admission de sécurité de l'espace (PSA). Le contrôleur PSA remplace le contrôleur PSP (Pod Security Policy), qui est obsolète et supprimé. Voir aussi Configurer PSP pour TKR 1.24 et versions ultérieures.

Tanzu Kubernetes version v1.25 est une version de transition avec PSA configuré pour avertir. À partir de Tanzu Kubernetes version v1.26, PSA est appliqué. Vous devez planifier la migration des charges de travail d'espace de PSP vers PSA en prévision de la mise à niveau des clusters TKG. Pour obtenir des instructions, reportez-vous à la section Migrer de la stratégie de sécurité de l'espace au contrôleur d'admission de sécurité de l'espace intégré.

Configuration de PSA à l'échelle du cluster

À partir de vSphere 8 Update 3, vous pouvez configurer PSA à l'échelle du cluster à l'aide de la variable ClusterClass podSecurityStandard disponible avec l'API v1beta1. Reportez-vous à la section API de cluster v1beta1.

Modes PSA

Le contrôleur PSA prend en charge trois modes de sécurité de l'espace : enforce, audit et warn. Le tableau répertorie et décrit chacun des modes PSA.
Tableau 1. Modes PSA
MODE Description
enforce Les violations de sécurité entraînent le rejet de l'espace.
audit Les violations de sécurité déclenchent l'ajout d'une annotation d'audit à l'événement, enregistrée dans le journal d'audit, mais sont autorisées par ailleurs.
warn Les violations de sécurité déclenchent un avertissement pour l'utilisateur, mais sont autorisées par ailleurs.

Normes PSA

Le contrôleur PSA définit trois niveaux de normes de sécurité de l'espace destinées à couvrir le spectre de sécurité. Ces normes de sécurité de l'espace sont cumulatives et vont de permissives à restrictives. Le tableau répertorie et décrit chacune des normes PSA.
Tableau 2. Normes PSA
NIVEAU Description
privileged Contrôle sans restriction, fournissant le niveau d'autorisations le plus large possible. Cette norme de sécurité permet des escalades de privilèges connus.
baseline Contrôle très peu restrictif, qui empêche les escalades de privilèges connus. Cette norme de sécurité permet la configuration de l'espace par défaut (minimale).
restricted Contrôle fortement restrictif, conformément aux meilleures pratiques de sécurisation renforcée des espaces.

Étiquettes d'espace de noms PSA

Le contrôleur PSA applique la sécurité de l'espace au niveau de l'espace de noms Kubernetes. Vous utilisez des étiquettes d'espace de noms pour définir les modes et les niveaux PSA que vous souhaitez utiliser pour les espaces dans un espace de noms donné.

Kubernetes fournit un ensemble d'étiquettes que vous pouvez utiliser pour définir les normes à utiliser pour un espace de noms. L'étiquette que vous appliquez définit l'action effectuée par le plan de contrôle Kubernetes en cas de détection d'une violation PSA. Pour un espace de noms Kubernetes donné, vous pouvez configurer n'importe quel mode ou tous les modes, ou définir un niveau différent pour différents modes.

La syntaxe d'étiquette de l'espace de noms PSA est la suivante :
# MODE must be one of `enforce`, `audit`, or `warn`.
# LEVEL must be one of `privileged`, `baseline`, or `restricted`.
pod-security.kubernetes.io/<MODE>=<LEVEL>

Vous pouvez également appliquer une étiquette de version par mode qui peut être utilisée pour épingler la norme de sécurité à la version de Kubernetes. Pour plus d'informations, reportez-vous à la section Appliquer les normes de sécurité d'espace aux étiquettes d'espace de noms.

PSA par défaut pour les clusters TKG

Par défaut, les clusters TKG provisionnés avec Tanzu Kubernetes version v1.25 ont des modes PSA warn et audit définis sur restricted pour les espaces de noms non-système. Il s'agit d'un paramètre non forcé : le contrôleur PSA génère un avertissement et une notification d'audit si un espace enfreint la sécurité, mais l'espace n'est pas rejeté.

Par défaut, les clusters TKG provisionnés avec Tanzu Kubernetes versions v1.26 et ultérieures ont le mode PSA enforce défini sur restricted pour les espaces de noms non-système. Si un espace enfreint la sécurité, il est rejeté. Vous devez configurer PSA sur l'espace de noms pour exécuter des espaces avec un contrôle moins restrictif.
Important : Certains espaces système s'exécutant dans les espaces de noms kube-system, tkg-system et vmware-system-cloud-provider nécessitent des privilèges élevés. Ces espaces de noms sont exclus de la sécurité de l'espace. En outre, la sécurité de l'espace sur les espaces de noms système ne peut pas être modifiée.
Le tableau répertorie la configuration PSA par défaut pour les clusters TKG.
Tableau 3. PSA par défaut pour les clusters TKG
Version de TKR PSA par défaut
TKR v1.25

mode : avertissement | niveau : limité

mode : audit | niveau : limité

mode : application | niveau : non défini

TKR v1.26 et ultérieures

mode : application | niveau : limité

Configuration de PSA à l'aide d'étiquettes d'espace de noms

Pour Tanzu Kubernetes version v1.25, utilisez l'exemple de commande suivant pour modifier les niveaux de sécurité d'un espace de noms donné afin que les avertissements PSA et les notifications d'audit ne soient pas générés.
kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/audit=privileged 
kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/warn=privileged
Pour Tanzu Kubernetes versions v1.26 et ultérieures, utilisez l'exemple de commande suivant pour rétrograder la norme PSA de restricted à baseline.
kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/enforce=baseline
Par exemple, pour appliquer la norme baseline sur l'espace de noms par défaut :
kubectl label --overwrite ns default pod-security.kubernetes.io/enforce=baseline
Pour Tanzu Kubernetes versions v1.26 et ultérieures, utilisez l'exemple de commande suivant pour rétrograder la norme PSA de restricted à privileged.
kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/enforce=privileged
Par exemple, pour appliquer la norme privileged sur l'espace de noms par défaut :
kubectl label --overwrite ns default pod-security.kubernetes.io/enforce=privileged

Pour Tanzu Kubernetes versions v1.26 et ultérieures, utilisez les exemples de commandes suivants pour assouplir PSA sur tous les espaces de noms non-système.

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

Configuration du contexte de sécurité pour des espaces individuels

Si vous tentez d'exécuter un espace qui enfreint PSA, vous relancez un message d'erreur l'indiquant. Par exemple :
{"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":[]}
Au lieu de définir PSA sur l'intégralité d'un espace de noms, vous pouvez configurer le contexte de sécurité d'un espace individuel. Pour autoriser l'exécution d'un espace individuel, dans la spécification de l'espace, vous pouvez définir le contexte de sécurité comme suit :
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