Policy Controller est fourni avec une bibliothèque par défaut de modèles de contrainte qui peuvent être utilisés avec le lot de règles de sécurité des pods afin d'obtenir la plupart des protections offertes par la règle de sécurité des pods de Kubernetes. Il permet en outre de tester vos règles avant leur application et d'exclure certaines ressources de la couverture.
Cette page explique comment appliquer manuellement un bundle de règles. Vous pouvez également appliquer directement des ensembles de règles.
Cette page s'adresse aux administrateurs et opérateurs informatiques qui souhaitent s'assurer que toutes les ressources exécutées sur la plate-forme cloud répondent aux exigences de conformité organisationnelle en fournissant et en maintenant l'automatisation des audits ou des applications. Pour en savoir plus sur les rôles courants et les exemples de tâches que nous citons dans le contenu Google Cloud , consultez Rôles utilisateur et tâches courantes de GKE.
Le groupe comprend ces contraintes qui fournissent des paramètres qui correspondent aux noms de champs de la règle de sécurité des pods Kubernetes (PSP) suivants (ID de contrôle) :
| Nom de la contrainte | Description de la contrainte | ID du contrôle | 
|---|---|---|
| psp-v2022-psp-allow-privilege-escalation | Limiter l'élévation des privilèges racine | allowPrivilegeEscalation | 
| psp-v2022-psp-apparmor | Profil AppArmor utilisé par les conteneurs | annotations | 
| psp-v2022-psp-capabilities | Fonctionnalités Linux | allowedCapabilities, requiredDropCapabilities | 
| psp-v2022-flexvolume-drivers | Autoriser des pilotes FlexVolume spécifiques | allowedFlexVolumes | 
| psp-v2022-psp-forbidden-sysctls | Profil sysctl utilisé par les conteneurs | forbiddenSysctls | 
| psp-v2022-psp-fsgroup | Allocation d'un FSGroup qui est propriétaire des volumes du pod | fsGroup | 
| psp-v2022-psp-host-filesystem | Utilisation du système de fichiers hôte | allowedHostPaths | 
| psp-v2022-psp-host-namespace | Utilisation des espaces de noms hôtes | hostPID, hostIPC | 
| psp-v2022-psp-host-network-ports | Utilisation des ports et du réseau hôte | hostNetwork, hostPorts | 
| psp-v2022-psp-privileged-container | Exécution de conteneurs privilégiés | privilégiée | 
| psp-v2022-psp-proc-mount | Types Allowed Proc Mount pour le conteneur | allowedProcMountTypes | 
| psp-v2022-psp-readonlyrootfilesystem | Exiger l'utilisation d'un système de fichiers racine en lecture seule | readOnlyRootFilesystem | 
| psp-v2022-psp-seccomp | Profil seccomp utilisé par les conteneurs | annotations | 
| psp-v2022-psp-selinux-v2 | Contexte SELinux du conteneur | seLinux | 
| psp-v2022-psp-pods-allowed-user-ranges | ID d'utilisateur et de groupe du conteneur | runAsUser, runAsGroup, supplementalGroups, fsGroup | 
| psp-v2022-psp-volume-types | Utilisation des types de volumes | volumes | 
Avant de commencer
- Installez et initialisez Google Cloud CLI, qui fournit les commandes gcloudetkubectlutilisées dans ces instructions. Si vous utilisez Cloud Shell, Google Cloud CLI est préinstallé.
- Installez Policy Controller sur votre cluster avec la bibliothèque par défaut de modèles de contrainte.
Auditer le bundle de règles de sécurité des pods
Policy Controller vous permet d'appliquer des règles à votre cluster Kubernetes. Pour tester vos charges de travail et leur conformité avec les bonnes pratiques recommandées par Google décrites dans le tableau précédent, vous pouvez déployer ces contraintes en mode "audit" pour révéler les cas de non-respect et, plus important, vous donner la possibilité de les corriger avant de les appliquer à votre cluster Kubernetes.
Vous pouvez appliquer ces règles en définissant le paramètre spec.enforcementAction sur dryrun à l'aide de kpt ou de Config Sync.
kubectl
- (Facultatif) Prévisualisez les contraintes de règle avec kubectl : - kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022 
- Appliquez les contraintes de règle avec kubectl : - kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022 - Le résultat est le suivant : - k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/psp-v2022-psp-allow-privilege-escalation created k8spspallowedusers.constraints.gatekeeper.sh/psp-v2022-psp-pods-allowed-user-ranges created k8spspapparmor.constraints.gatekeeper.sh/psp-v2022-psp-apparmor created k8spspcapabilities.constraints.gatekeeper.sh/psp-v2022-psp-capabilities created k8spspfsgroup.constraints.gatekeeper.sh/psp-v2022-psp-fsgroup created k8spspflexvolumes.constraints.gatekeeper.sh/psp-v2022-psp-flexvolume-drivers created k8spspforbiddensysctls.constraints.gatekeeper.sh/psp-v2022-psp-forbidden-sysctls created k8spsphostfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-host-filesystem created k8spsphostnamespace.constraints.gatekeeper.sh/psp-v2022-psp-host-namespace created k8spsphostnetworkingports.constraints.gatekeeper.sh/psp-v2022-psp-host-network-ports created k8spspprivilegedcontainer.constraints.gatekeeper.sh/psp-v2022-psp-privileged-container created k8spspprocmount.constraints.gatekeeper.sh/psp-v2022-psp-proc-mount created k8spspreadonlyrootfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-readonlyrootfilesystem created k8spspselinuxv2.constraints.gatekeeper.sh/psp-v2022-psp-selinux-v2 created k8spspseccomp.constraints.gatekeeper.sh/psp-v2022-psp-seccomp created k8spspvolumetypes.constraints.gatekeeper.sh/psp-v2022-psp-volume-types created 
- Vérifiez que les contraintes de règles ont été installées et si des cas de non-respect existent dans le cluster : - kubectl get -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022 - Le résultat ressemble à ce qui suit : - NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/psp-v2022-psp-allow-privilege-escalation dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspallowedusers.constraints.gatekeeper.sh/psp-v2022-psp-pods-allowed-user-ranges dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspapparmor.constraints.gatekeeper.sh/psp-v2022-psp-apparmor 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspcapabilities.constraints.gatekeeper.sh/psp-v2022-psp-capabilities dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspfsgroup.constraints.gatekeeper.sh/psp-v2022-psp-fsgroup 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspflexvolumes.constraints.gatekeeper.sh/psp-v2022-psp-flexvolume-drivers 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspforbiddensysctls.constraints.gatekeeper.sh/psp-v2022-psp-forbidden-sysctls 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spsphostfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-host-filesystem 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spsphostnamespace.constraints.gatekeeper.sh/psp-v2022-psp-host-namespace dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spsphostnetworkingports.constraints.gatekeeper.sh/psp-v2022-psp-host-network-ports dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspprivilegedcontainer.constraints.gatekeeper.sh/psp-v2022-psp-privileged-container dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspprocmount.constraints.gatekeeper.sh/psp-v2022-psp-proc-mount 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspreadonlyrootfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-readonlyrootfilesystem 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspselinuxv2.constraints.gatekeeper.sh/psp-v2022-psp-selinux-v2 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspseccomp.constraints.gatekeeper.sh/psp-v2022-psp-seccomp dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspvolumetypes.constraints.gatekeeper.sh/psp-v2022-psp-volume-types 0 
- (Facultatif) Ajustez le nom du champ PSP - parametersdans les fichiers de contrainte en fonction des besoins de votre environnement de cluster. Pour en savoir plus, consultez le lien correspondant au nom du champ PSP dans le tableau ci-dessus. Par exemple, dans- psp-host-network-ports:- parameters: hostNetwork: true min: 80 max: 9000 
kpt
- Installez et configurez kpt. kpt est utilisé dans ces instructions pour personnaliser et déployer les ressources Kubernetes. 
- Téléchargez le groupe de règles PSP v2022 à partir de GitHub à l'aide de kpt : - kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022 
- Exécutez la fonction kpt - set-enforcement-actionpour définir l'action d'application des règles sur- dryrun:- kpt fn eval psp-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \ -- enforcementAction=dryrun 
- Initialisez le répertoire de travail avec kpt, qui crée une ressource pour suivre les modifications : - cd psp-v2022 kpt live init 
- (Facultatif) Ajustez le nom du champ PSP - parametersdans les fichiers de contrainte en fonction des besoins de votre environnement de cluster. Pour en savoir plus, consultez le lien correspondant au nom du champ PSP dans le tableau ci-dessus. Par exemple, dans- psp-host-network-ports:- parameters: hostNetwork: true min: 80 max: 9000 
- Appliquez les contraintes de règles avec kpt : - kpt live apply 
- Vérifiez que les contraintes de règles ont été installées et si des cas de non-respect existent dans le cluster : - kpt live status --output table --poll-until current - L'état - CURRENTconfirme l'installation correcte des contraintes.
Config Sync
- Installez et configurez kpt. kpt est utilisé dans ces instructions pour personnaliser et déployer les ressources Kubernetes.
Les opérateurs qui utilisent Config Sync pour déployer des règles sur leurs clusters peuvent suivre ces instructions :
- Accédez au répertoire de synchronisation pour Config Sync : - cd SYNC_ROOT_DIR - Pour créer ou ajouter - .gitignoreavec- resourcegroup.yaml, procédez comme suit :- echo resourcegroup.yaml >> .gitignore 
- Créez un répertoire - policiesdédié :- mkdir -p policies 
- Téléchargez le groupe de règles PSP v2022 à partir de GitHub à l'aide de kpt : - kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022 policies/psp-v2022 
- Exécutez la fonction kpt - set-enforcement-actionpour définir l'action d'application des règles sur- dryrun:- kpt fn eval policies/psp-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun 
- (Facultatif) Ajustez le nom du champ PSP - parametersdans les fichiers de contrainte en fonction des besoins de votre environnement de cluster. Pour en savoir plus, consultez le lien correspondant au nom du champ PSP dans le tableau ci-dessus. Par exemple, dans- psp-host-network-ports:- parameters: hostNetwork: true min: 80 max: 9000 
- (Facultatif) Prévisualisez les contraintes de règles à créer : - kpt live init policies/psp-v2022 kpt live apply --dry-run policies/psp-v2022 - Le résultat est le suivant : - Dry-run strategy: client inventory update started inventory update finished apply phase started k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/psp-v2022-psp-allow-privilege-escalation apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspallowedusers.constraints.gatekeeper.sh/psp-v2022-psp-pods-allowed-user-ranges apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspapparmor.constraints.gatekeeper.sh/psp-v2022-psp-apparmor apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspcapabilities.constraints.gatekeeper.sh/psp-v2022-psp-capabilities apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspfsgroup.constraints.gatekeeper.sh/psp-v2022-psp-fsgroup apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspflexvolumes.constraints.gatekeeper.sh/psp-v2022-psp-flexvolume-drivers apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspforbiddensysctls.constraints.gatekeeper.sh/psp-v2022-psp-forbidden-sysctls apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spsphostfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-host-filesystem apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spsphostnamespace.constraints.gatekeeper.sh/psp-v2022-psp-host-namespace apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spsphostnetworkingports.constraints.gatekeeper.sh/psp-v2022-psp-host-network-ports apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspprivilegedcontainer.constraints.gatekeeper.sh/psp-v2022-psp-privileged-container apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspprocmount.constraints.gatekeeper.sh/psp-v2022-psp-proc-mount apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspreadonlyrootfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-readonlyrootfilesystem apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspselinuxv2.constraints.gatekeeper.sh/psp-v2022-psp-selinux-v2 apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspseccomp.constraints.gatekeeper.sh/psp-v2022-psp-seccomp apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspvolumetypes.constraints.gatekeeper.sh/psp-v2022-psp-volume-types apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) apply phase finished inventory update started inventory update finished apply result: 16 attempted, 0 successful, 16 skipped, 0 failed 
- Si votre répertoire de synchronisation pour Config Sync utilise Kustomize, ajoutez - policies/psp-v2022à votre fichier- kustomization.yamlracine. Sinon, supprimez le fichier- policies/psp-v2022/kustomization.yaml:- rm SYNC_ROOT_DIR/policies/psp-v2022/kustomization.yaml 
- Transférez les modifications au dépôt Config Sync : - git add SYNC_ROOT_DIR/policies/psp-v2022 git commit -m 'Adding Pod Security Policy audit enforcement' git push 
- Vérifiez l'état de l'installation : - watch gcloud beta container fleet config-management status --project PROJECT_ID - L'état - SYNCEDconfirme l'installation des règles .
Consulter les notifications de non-respect des règles
Une fois les contraintes de règle installées en mode audit, les cas de non-respect du cluster peuvent être visualisés dans l'interface utilisateur à l'aide du tableau de bord Policy Controller.
Vous pouvez également utiliser kubectl pour afficher les cas de non-respect sur le cluster à l'aide de la commande suivante :
kubectl get constraint -l policycontroller.gke.io/bundleName=psp-v2022 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'
En cas de non-respect des règles, vous pouvez consulter la liste des messages de non-respect par contrainte avec :
kubectl get constraint -l policycontroller.gke.io/bundleName=psp-v2022 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'
Modifier l'action d'application du bundle de règles de sécurité des pods
Une fois que vous avez examiné les cas de non-respect des règles sur votre cluster, vous pouvez envisager de modifier le mode d'application afin que le contrôleur d'admission warn ou deny bloque l'application des ressources non conformes sur le cluster.
kubectl
- Utilisez kubectl pour définir la mesure coercitive des règles sur - warn:- kubectl get constraint -l policycontroller.gke.io/bundleName=psp-v2022 -o name | xargs -I {} kubectl patch {} --type='json' -p='[{"op":"replace","path":"/spec/enforcementAction","value":"warn"}]'
- Vérifiez que la mesure coercitive des contraintes de règle a été mise à jour : - kubectl get constraint -l policycontroller.gke.io/bundleName=psp-v2022 
kpt
- Exécutez la fonction kpt - set-enforcement-actionpour définir la mesure coercitive des règles sur- warn:- kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn 
- Appliquez les contraintes de règles : - kpt live apply 
Config Sync
Les opérateurs qui utilisent Config Sync pour déployer des règles sur leurs clusters peuvent suivre ces instructions :
- Accédez au répertoire de synchronisation pour Config Sync : - cd SYNC_ROOT_DIR 
- Exécutez la fonction kpt - set-enforcement-actionpour définir la mesure coercitive des règles sur- warn:- kpt fn eval policies/psp-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn 
- Transférez les modifications au dépôt Config Sync : - git add SYNC_ROOT_DIR/policies/psp-v2022 git commit -m 'Adding Pod Security Policy policy bundle warn enforcement' git push 
- Vérifiez l'état de l'installation : - nomos status - Le cluster doit afficher l'état - SYNCEDavec les règles installées.
Tester l'application des règles
Créez une ressource non conforme sur le cluster à l'aide de la commande suivante :
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: wp-non-compliant
  labels:
    app: wordpress
spec:
  containers:
    - image: wordpress
      name: wordpress
      ports:
      - containerPort: 80
        name: wordpress
EOF
Le contrôleur d'admission doit générer un avertissement répertoriant les cas de violation des règles que cette ressource ne respecte pas, comme indiqué dans l'exemple suivant :
Warning: [psp-v2022-psp-pods-allowed-user-ranges] Container wordpress is attempting to run without a required securityContext/fsGroup. Allowed fsGroup: {"ranges": [{"max": 200, "min": 100}], "rule": "MustRunAs"}
Warning: [psp-v2022-psp-pods-allowed-user-ranges] Container wordpress is attempting to run without a required securityContext/runAsGroup. Allowed runAsGroup: {"ranges": [{"max": 200, "min": 100}], "rule": "MustRunAs"}
Warning: [psp-v2022-psp-pods-allowed-user-ranges] Container wordpress is attempting to run without a required securityContext/runAsUser
Warning: [psp-v2022-psp-pods-allowed-user-ranges] Container wordpress is attempting to run without a required securityContext/supplementalGroups. Allowed supplementalGroups: {"ranges": [{"max": 200, "min": 100}], "rule": "MustRunAs"}
Warning: [psp-v2022-psp-allow-privilege-escalation] Privilege escalation container is not allowed: wordpress
Warning: [psp-v2022-psp-seccomp] Seccomp profile 'not configured' is not allowed for container 'wordpress'. Found at: no explicit profile found. Allowed profiles: {"RuntimeDefault", "docker/default", "runtime/default"}
Warning: [psp-v2022-psp-capabilities] container <wordpress> is not dropping all required capabilities. Container must drop all of ["must_drop"] or "ALL"
Warning: [psp-v2022-psp-readonlyrootfilesystem] only read-only root filesystem container is allowed: wordpress
pod/wp-non-compliant created
Supprimer le bundle de règles des stratégies de sécurité des pods
Si nécessaire, le bundle de règles de la stratégie de sécurité des pods peut être supprimé du cluster.
kubectl
- Utilisez kubectl pour supprimer les règles : - kubectl delete constraint -l policycontroller.gke.io/bundleName=psp-v2022 
kpt
- Supprimez les règles : - kpt live destroy 
Config Sync
Les opérateurs qui utilisent Config Sync pour déployer des règles sur leurs clusters peuvent suivre ces instructions :
- Transférez les modifications au dépôt Config Sync : - git rm -r SYNC_ROOT_DIR/policies/psp-v2022 git commit -m 'Removing PSP policies' git push 
- Vérifiez l'état : - nomos status - L'état du cluster doit être - SYNCED, et les ressources doivent avoir été supprimées.