Utiliser des contraintes de règle de sécurité des pods

Policy Controller est fourni avec une bibliothèque par défaut de modèles de contraintes qui peuvent être utilisés avec le groupe de règles de sécurité des pods pour 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.

Le bundle inclut les contraintes suivantes, qui fournissent des paramètres correspondant aux noms de champs (ID de contrôle) de la règle de sécurité des pods de Kubernetes suivants :

Nom de la contrainte Description de la contrainte ID de contrôle
psp-v2022-psp-allow-privilege-escalation Limiter l'élévation aux 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 Attribuer un FSGroup 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 de l'hôte hostPID, hostIPC
psp-v2022-psp-host-network-ports Utilisation du réseau hôte et des ports hostNetwork, hostPorts
psp-v2022-psp-privileged-container Exécution de conteneurs privilégiés privilégiée
psp-v2022-psp-proc-mount Types d'installation de procédure autorisées pour le conteneur allowedProcMountTypes
psp-v2022-psp-readonlyrootfilesystem Nécessite 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 utilisateur et ID de groupe du conteneur runAsUser, runAsGroup, supplementalGroups, fsGroup
psp-v2022-psp-volume-types Utilisation des types de volumes volumes

Avant de commencer

  1. Installez et initialisez la Google Cloud CLI, qui fournit les commandes gcloud et kubectl utilisées dans ces instructions. Si vous utilisez Cloud Shell, Google Cloud CLI est préinstallé.
  2. Installez Policy Controller sur votre cluster avec la bibliothèque par défaut de modèles de contraintes.

Groupe de règles de sécurité des pods d'audit

Policy Controller vous permet d'appliquer des règles à votre cluster Kubernetes. Pour vous aider à tester vos charges de travail et leur conformité par rapport aux bonnes pratiques recommandées par Google décrites dans le tableau précédent, vous pouvez déployer ces contraintes en mode "audit" pour détecter les cas de non-respect et, surtout, vous permettre de les corriger avant de les appliquer à votre cluster Kubernetes.

Vous pouvez appliquer ces règles avec un spec.enforcementAction défini sur dryrun à l'aide de kubectl, kpt ou Config Sync.

kubectl

  1. (Facultatif) Prévisualisez les contraintes de la règle avec kubectl:

    kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022
    
  2. 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
    
  3. 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
    
  4. (Facultatif) Ajustez le nom du champ PSP parameters dans les fichiers de contraintes, selon les besoins de votre environnement de cluster. Pour plus de détails, cliquez sur 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

  1. Installez et configurez kpt. kpt est utilisé dans ces instructions pour personnaliser et déployer les ressources Kubernetes.

  2. Téléchargez le lot de règles PSP (Pod Security Policy) de GitHub à l'aide de kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022
    
  3. Exécutez la fonction kpt set-enforcement-action pour 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
    
  4. Initialisez le répertoire de travail avec kpt, qui crée une ressource pour suivre les modifications :

    cd psp-v2022
    kpt live init
    
  5. (Facultatif) Ajustez le nom du champ PSP parameters dans les fichiers de contraintes, selon les besoins de votre environnement de cluster. Pour plus de détails, cliquez sur 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
    
  6. Appliquez les contraintes de règles avec kpt :

    kpt live apply
    
  7. 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 CURRENT confirme l'installation correcte des contraintes.

Config Sync

  1. 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 :

  1. Accédez au répertoire de synchronisation pour Config Sync :

    cd SYNC_ROOT_DIR
    

    Pour créer ou ajouter .gitignore avec resourcegroup.yaml:

    echo resourcegroup.yaml >> .gitignore
    

  2. Créez un répertoire policies dédié:

    mkdir -p policies
    
  3. Téléchargez le lot de règles PSP (Pod Security Policy) de GitHub à l'aide de kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022 policies/psp-v2022
    
  4. Exécutez la fonction kpt set-enforcement-action pour 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
    
  5. (Facultatif) Ajustez le nom du champ PSP parameters dans les fichiers de contraintes, selon les besoins de votre environnement de cluster. Pour plus de détails, cliquez sur 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
    
  6. (Facultatif) Prévisualisez les contraintes de règle à 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
    
  7. Si votre répertoire de synchronisation pour Config Sync utilise Kustomize, ajoutez policies/psp-v2022 à votre kustomization.yaml racine. Sinon, supprimez le fichier policies/psp-v2022/kustomization.yaml:

    rm SYNC_ROOT_DIR/policies/psp-v2022/kustomization.yaml
    
  8. 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
    
  9. Vérifiez l'état de l'installation :

    watch gcloud beta container fleet config-management status --project PROJECT_ID
    

    L'état SYNCED confirme l'installation des règles .

Consulter les notifications de non-respect des règles

Une fois les contraintes de règles installées en mode audit, vous pouvez afficher les violations du cluster dans l'interface utilisateur à l'aide du tableau de bord de 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, la liste des messages de violation par contrainte peut être affichée avec:

kubectl get constraint -l policycontroller.gke.io/bundleName=psp-v2022 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'

Modification de l'action d'application du groupe 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 modifier le mode d'application afin que le contrôleur d'admission active warn ou deny bloque l'application des ressources non conformes au cluster.

kubectl

  1. Utilisez kubectl pour définir l'action coercitive de la règle 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"}]'
    
  2. 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

  1. Exécutez la fonction kpt set-enforcement-action pour définir l'action d'application des règles sur warn :

    kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  2. 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 :

  1. Accédez au répertoire de synchronisation pour Config Sync :

    cd SYNC_ROOT_DIR
    
  2. Exécutez la fonction kpt set-enforcement-action pour définir l'action d'application des règles sur warn :

    kpt fn eval policies/psp-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  3. 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
    
  4. Vérifiez l'état de l'installation :

    gcloud alpha anthos config sync repo list --project PROJECT_ID
    

    Le dépôt qui s'affiche dans la colonne SYNCED confirme l'installation des règles.

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 indiquant les cas de non-respect des règles enfreints par cette ressource, comme illustré 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 groupe de règles de sécurité des pods

Si nécessaire, le groupe de règles 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 :

  1. 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
    
  2. Vérifiez l'état:

    gcloud alpha anthos config sync repo list --project PROJECT_ID
    

    Le dépôt qui s'affiche dans la colonne SYNCED confirme la suppression des règles.