Utilisez les contraintes de stratégie CIS du benchmark Google Kubernetes Engine v1.4.0

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 GKE v1.4.0 Center for Internet Security (CIS) pour vous aider à auditer la conformité de votre cluster GKE sur Google Cloud par rapport aux benchmarks CIS Google Kubernetes Engine (GKE) v1.4.0. Ce benchmark est un ensemble de contrôles de sécurité recommandés pour la configuration de GKE.

Cet ensemble de contraintes inclut des commandes dans les domaines suivants:

  • RBAC et comptes de service
  • Règles de sécurité relatives aux pods
  • Règles de réseau et CNI
  • Gestion des secrets
  • Contrôle d'admission extensible
  • Règles générales
  • Services gérés

Contraintes de groupe de règles CIS GKE v1.4.0

Nom de la contrainte Description de la contrainte ID de commande
cis-gke-v1.4.0-restrict-apparmor Limite le profil AppArmor pour les pods. 4.6.3
cis-gke-v1.4.0-restrict-creation-with-default-serviceaccount Limitez la création de ressources à l'aide d'un ServiceAccount par défaut. 4.1.5
cis-gke-v1.4.0-restrict-loadbalancer Interdit tous les services de type LoadBalancer. 5.6.8
cis-gke-v1.4.0-restrict-secrets-of-type-basic-auth Limite l'utilisation des secrets de type "basic-auth". 4.4.2
cis-gke-v1.4.0-require-binauthz Nécessite le Binary Authorization Validating Admission Webhook. 4.5.1, 5.1.1, 5.1.4, 5.10.5
cis-gke-v1.4.0-require-cos-node-image Nécessite Container-Optimized OS comme image d'OS du nœud. 5.5.1
cis-gke-v1.4.0-require-gke-metadata-server-enabled Nécessite que le service de métadonnées GKE soit activé sur chaque nœud du cluster. 5.4.2
cis-gke-v1.4.0-require-ingress.class-gce Tous les objets Ingress doivent comporter une annotation kubernetes.io/ingress.class: gce. 5.6.8
cis-gke-v1.4.0-require-managed-certificates Tous les objets Ingress doivent comporter une annotation networking.gke.io/managed-certificates. 5.6.8
cis-gke-v1.4.0-require-namespace-networkpolicy Chaque Namespace défini dans le cluster doit disposer d'un NetworkPolicy. 4.3.2
cis-gke-v1.4.0-require-seccomp-default Tous les objets Ingress doivent comporter une annotation networking.gke.io/managed-certificates. 4.6.2
cis-gke-v1.4.0-require-securitycontext Nécessite que les pods définissent securityContext. 4.6.3
cis-gke-v1.4.0-restrict-capabilities Les conteneurs doivent supprimer toutes les fonctionnalités, et ne sont pas autorisés à en ajouter de nouveau. 4.2.7, 4.2.8, 4.6.3, 5.10.3
cis-gke-v1.4.0-restrict-cluster-admin-role Limite l'utilisation du rôle cluster-admin. 4.1.1
cis-gke-v1.4.0-restrict-default-namespace Empêche les pods d'utiliser la valeur par défaut Namespace. 4.6.1, 4.6.4
cis-gke-v1.4.0-restrict-env-var-secrets Limite l'utilisation des secrets en tant que variables d'environnement dans les définitions de conteneur. 4.4.1
cis-gke-v1.4.0-restrict-host-namespace Limite les conteneurs pour lesquels hostPID ou hostIPC est défini sur "true". 4.2.2, 4.2.3, 5.10.3
cis-gke-v1.4.0-restrict-hostnetwork Empêche l'exécution des conteneurs lorsque l'option hostNetwork est définie sur true. 4.2.4 et 5.10.3
cis-gke-v1.4.0-restrict-pods-create Limite la création de pods dans Roles et ClusterRoles. 4.1.4
cis-gke-v1.4.0-restrict-privilege-escalation Limite les conteneurs avec allowPrivilegeEscalation défini sur "true". 4.2.5, 5.10.3
cis-gke-v1.4.0-restrict-privileged-containers Limite les conteneurs avec securityContext.privileged défini sur "true". 4.2.1, 5.10.3
cis-gke-v1.4.0-restrict-rbac-subjects Limite l'utilisation des noms dans les sujets RBAC aux valeurs autorisées. 5.8.3
cis-gke-v1.4.0-restrict-role-wildcards Limite l'utilisation des caractères génériques dans Roles et ClusterRoles. 4.1.3
cis-gke-v1.4.0-restrict-root-containers Empêche l'exécution des conteneurs en tant qu'utilisateur racine. 4.2.6, 5.10.3
cis-gke-v1.4.0-restrict-role-secrets Limite l'utilisation des secrets dans Roles et ClusterRoles. 4.1.2
cis-gke-v1.4.0-restrict-automountserviceaccounttoken Limite l'utilisation des jetons de compte de service pour les pods. 4.1.5, 4.1.6
cis-gke-v1.4.0-restrict-selinux Impossible de définir le type SELinux ou de définir une option d'utilisateur ou de rôle SELinux personnalisée. 4.6.3

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. Vous devez également activer la prise en charge des contraintes référentielles, car ce groupe contient des contraintes référentielles.

Configurer Policy Controller pour les contraintes référentielles

  1. Enregistrez le fichier manifeste YAML suivant dans un fichier sous le nom policycontroller-config.yaml. Le fichier manifeste configure Policy Controller pour surveiller des types d'objets spécifiques.

    apiVersion: config.gatekeeper.sh/v1alpha1
    kind: Config
    metadata:
      name: config
      namespace: "gatekeeper-system"
    spec:
      sync:
        syncOnly:
          - group: "admissionregistration.k8s.io"
            version: "v1"
            kind: "ValidatingWebhookConfiguration"
          - group: "networking.k8s.io"
            version: "v1"
            kind: "NetworkPolicy"
    
  2. Appliquez le fichier manifeste policycontroller-config.yaml :

    kubectl apply -f policycontroller-config.yaml
    

Configurer votre cluster et votre charge de travail

  1. L'activation et la configuration de Google Groupes pour RBAC sont requises dans cis-gke-v1.4.0-restrict-rbac-subjects.
  2. L'activation et la configuration de l'autorisation binaire sont requises dans cis-gke-v1.4.0-require-binauthz.

Auditer les règles CIS GKE v1.4.0 avec Policy Controller

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 règles CIS de GKE v1.4.0 décrites dans le tableau précédent, vous pouvez déployer ces contraintes en mode "audit" afin d'identifier et de résoudre les cas de non-respect.

Vous pouvez appliquer ces règles avec 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/anthos-bundles/cis-gke-v1.4.0
    
  2. Appliquez les contraintes de la règle avec kubectl:

    kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/cis-gke-v1.4.0
    

    Le résultat est le suivant :

    k8sblockcreationwithdefaultserviceaccount.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-creation-with-default-serviceaccount created
    k8sblockloadbalancer.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-loadbalancer created
    k8sblockobjectsoftype.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-secrets-of-type-basic-auth created
    k8snoenvvarsecrets.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-env-var-secrets created
    k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-privilege-escalation created
    k8spspallowedusers.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-root-containers created
    k8spspapparmor.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-apparmor created
    k8spspcapabilities.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-capabilities created
    k8spsphostnamespace.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-host-namespace created
    k8spsphostnetworkingports.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-hostnetwork created
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-privileged-containers created
    k8spspselinuxv2.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-selinux created
    k8spspseccomp.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-seccomp-default created
    k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-securitycontext created
    k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-role-wildcards created
    k8srequirebinauthz.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-binauthz created
    k8srequirecosnodeimage.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-cos-node-image created
    k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-namespace-networkpolicy created
    k8srequiredannotations.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-ingress.class-gce created
    k8srequiredannotations.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-managed-certificates created
    k8srequiredlabels.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-gke-metadata-server-enabled created
    k8srestrictautomountserviceaccounttokens.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-automountserviceaccounttoken created
    k8srestrictnamespaces.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-default-namespace created
    k8srestrictrbacsubjects.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-rbac-subjects created
    k8srestrictrolebindings.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-cluster-admin-role created
    k8srestrictrolerules.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-pods-create created
    k8srestrictrolerules.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-role-secrets 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 constraints -l policycontroller.gke.io/bundleName=cis-gke-v1.4.0
    

    Le résultat ressemble à ce qui suit :

    NAME                                                                                                                               ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sblockcreationwithdefaultserviceaccount.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-creation-with-default-serviceaccount   dryrun               0
    
    NAME                                                                                  ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sblockloadbalancer.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-loadbalancer   dryrun               0
    
    NAME                                                                                                 ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sblockobjectsoftype.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-secrets-of-type-basic-auth   dryrun               0
    
    NAME                                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8snoenvvarsecrets.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-env-var-secrets   dryrun               0
    
    NAME                                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-securitycontext   dryrun               0
    
    NAME                                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-role-wildcards   dryrun               0
    
    NAME                                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspallowedusers.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-root-containers   dryrun               0
    
    NAME                                                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-privilege-escalation   dryrun               0
    
    NAME                                                                        ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspapparmor.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-apparmor   dryrun               0
    
    NAME                                                                                ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspcapabilities.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-capabilities   dryrun               0
    
    NAME                                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spsphostnamespace.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-host-namespace   dryrun               0
    
    NAME                                                                                      ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spsphostnetworkingports.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-hostnetwork   dryrun               0
    
    NAME                                                                                                ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-privileged-containers   dryrun               0
    
    NAME                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspseccomp.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-seccomp-default   dryrun               0
    
    NAME                                                                        ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspselinuxv2.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-selinux   dryrun               0
    
    NAME                                                                           ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequirebinauthz.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-binauthz   dryrun               0
    
    NAME                                                                                     ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequirecosnodeimage.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-cos-node-image   dryrun               0
    
    NAME                                                                                           ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequiredannotations.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-ingress.class-gce      dryrun               0
    k8srequiredannotations.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-managed-certificates   dryrun               0
    
    NAME                                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequiredlabels.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-gke-metadata-server-enabled   dryrun               0
    
    NAME                                                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-namespace-networkpolicy   dryrun               0
    
    NAME                                                                                                                      ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictautomountserviceaccounttokens.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-automountserviceaccounttoken   dryrun               0
    
    NAME                                                                                        ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictnamespaces.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-default-namespace   dryrun               0
    
    NAME                                                                                      ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictrbacsubjects.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-rbac-subjects   dryrun               0
    
    NAME                                                                                           ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictrolebindings.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-cluster-admin-role   dryrun               0
    
    NAME                                                                                  ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictrolerules.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-pods-create    dryrun               0
    k8srestrictrolerules.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-role-secrets   dryrun               0
    

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 groupe de règles CIS à partir de GitHub à l'aide de Kpt :

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/cis-gke-v1.4.0
    
  3. Exécutez la fonction kpt set-enforcement-action pour définir l'action d'application des règles sur dryrun :

    kpt fn eval cis-gke-v1.4.0 -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 cis-gke-v1.4.0
    kpt live init
    
  5. Appliquez les contraintes de règles avec kpt :

    kpt live apply
    

    Le résultat est le suivant :

    k8sblockcreationwithdefaultserviceaccount.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-creation-with-default-serviceaccount created
    k8sblockloadbalancer.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-loadbalancer created
    k8sblockobjectsoftype.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-secrets-of-type-basic-auth created
    k8snoenvvarsecrets.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-env-var-secrets created
    k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-privilege-escalation created
    k8spspallowedusers.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-root-containers created
    k8spspapparmor.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-apparmor created
    k8spspcapabilities.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-capabilities created
    k8spsphostnamespace.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-host-namespace created
    k8spsphostnetworkingports.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-hostnetwork created
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-privileged-containers created
    k8spspselinuxv2.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-selinux created
    k8spspseccomp.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-seccomp-default created
    k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-securitycontext created
    k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-role-wildcards created
    k8srequirebinauthz.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-binauthz created
    k8srequirecosnodeimage.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-cos-node-image created
    k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-namespace-networkpolicy created
    k8srequiredannotations.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-ingress.class-gce created
    k8srequiredannotations.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-managed-certificates created
    k8srequiredlabels.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-gke-metadata-server-enabled created
    k8srestrictautomountserviceaccounttokens.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-automountserviceaccounttoken created
    k8srestrictnamespaces.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-default-namespace created
    k8srestrictrbacsubjects.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-rbac-subjects created
    k8srestrictrolebindings.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-cluster-admin-role created
    k8srestrictrolerules.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-pods-create created
    k8srestrictrolerules.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-role-secrets created
    27 resource(s) applied. 27 created, 0 unchanged, 0 configured, 0 failed
    
  6. 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 bundle de règles CIS GKE v1.4.0 depuis GitHub à l'aide de kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/cis-gke-v1.4.0 policies/cis-gke-v1.4.0
    
  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/cis-gke-v1.4.0 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
    
  5. (Facultatif) Prévisualisez les contraintes de règle à créer:

    kpt live init policies/cis-gke-v1.4.0
    kpt live apply --dry-run policies/cis-gke-v1.4.0
    

    Le résultat est le suivant :

    Dry-run strategy: client
    inventory update started
    inventory update finished
    apply phase started
    k8sblockcreationwithdefaultserviceaccount.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-creation-with-default-serviceaccount successful
    k8sblockloadbalancer.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-loadbalancer successful
    k8sblockobjectsoftype.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-secrets-of-type-basic-auth successful
    k8snoenvvarsecrets.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-env-var-secrets successful
    k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-privilege-escalation successful
    k8spspallowedusers.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-root-containers successful
    k8spspapparmor.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-apparmor successful
    k8spspcapabilities.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-capabilities successful
    k8spsphostnamespace.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-host-namespace successful
    k8spsphostnetworkingports.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-hostnetwork successful
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-privileged-containers successful
    k8spspselinuxv2.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-selinux successful
    k8spspseccomp.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-seccomp-default successful
    k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-securitycontext successful
    k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-role-wildcards successful
    k8srequirebinauthz.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-binauthz successful
    k8srequirecosnodeimage.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-cos-node-image successful
    k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-namespace-networkpolicy successful
    k8srequiredannotations.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-ingress.class-gce successful
    k8srequiredannotations.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-managed-certificates successful
    k8srequiredlabels.constraints.gatekeeper.sh/cis-gke-v1.4.0-require-gke-metadata-server-enabled successful
    k8srestrictautomountserviceaccounttokens.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-automountserviceaccounttoken successful
    k8srestrictnamespaces.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-default-namespace successful
    k8srestrictrbacsubjects.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-rbac-subjects successful
    k8srestrictrolebindings.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-cluster-admin-role successful
    k8srestrictrolerules.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-pods-create successful
    k8srestrictrolerules.constraints.gatekeeper.sh/cis-gke-v1.4.0-restrict-role-secrets successful
    apply phase finished
    inventory update started
    inventory update finished
    apply result: 27 attempted, 27 successful, 0 skipped, 0 failed
    
  6. Si votre répertoire de synchronisation pour Config Sync utilise Kustomize, ajoutez policies/cis-gke-v1.4.0 à votre kustomization.yaml racine. Sinon, supprimez le fichier policies/cis-gke-v1.4.0/kustomization.yaml:

    rm SYNC_ROOT_DIR/policies/cis-gke-v1.4.0/kustomization.yaml
    
  7. Déployez les modifications dans le dépôt Config Sync:

    git add SYNC_ROOT_DIR/policies/cis-gke-v1.4.0
    git commit -m 'Adding CIS GKE v1.4.0 policy bundle'
    git push
    
  8. 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ègle installées en mode audit, vous pouvez afficher les cas de non-respect des règles du cluster dans l'interface utilisateur à l'aide du tableau de bord Policy Controller.

Vous pouvez également utiliser kubectl pour afficher les cas de non-respect des règles sur le cluster à l'aide de la commande suivante:

kubectl get constraint -l policycontroller.gke.io/bundleName=cis-gke-v1.4.0 -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-conformité par contrainte à l'aide de la commande suivante:

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

Modification de l'action d'application du groupe de règles CIS GKE v1.4.0

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 warn (ou même deny) bloque l'application des ressources non conformes au cluster.

kubectl

  1. Utilisez kubectl pour définir l'action coercitive des règles sur warn:

    kubectl get constraint -l policycontroller.gke.io/bundleName=cis-gke-v1.4.0 -o name | xargs -I {} kubectl patch {} --type='json' -p='[{"op":"replace","path":"/spec/enforcementAction","value":"warn"}]'
    
  2. Vérifiez que l'action coercitive des contraintes de la règle a été mise à jour:

    kubectl get constraints -l policycontroller.gke.io/bundleName=cis-gke-v1.4.0
    

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/cis-gke-v1.4.0 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  3. Déployez les modifications dans le dépôt Config Sync:

    git add SYNC_ROOT_DIR/policies/cis-gke-v1.4.0
    git commit -m 'Adding CIS GKE v1.4.0 policy bundle warn enforcement'
    git push
    
  4. Vérifiez l'état de l'installation :

    gcloud alpha anthos config sync repo list --project PROJECT_ID
    

    Votre dépôt qui apparaît 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 que cette ressource ne respecte pas, comme illustré dans l'exemple suivant:

Warning: [cis-gke-v1.4.0-restrict-default-namespace] <default> namespace is restricted
Warning: [cis-gke-v1.4.0-restrict-root-containers] Container wordpress is attempting to run without a required securityContext/runAsNonRoot or securityContext/runAsUser != 0
Warning: [cis-gke-v1.4.0-restrict-privilege-escalation] Privilege escalation container is not allowed: wordpress
Warning: [cis-gke-v1.4.0-require-seccomp-default] Seccomp profile 'not configured' is not allowed for container 'wordpress'. Found at: no explicit profile found. Allowed profiles: {"RuntimeDefault", "docker/default", "runtime/default"}
Warning: [cis-gke-v1.4.0-restrict-capabilities] container <wordpress> is not dropping all required capabilities. Container must drop all of ["ALL"] or "ALL"
Warning: [cis-gke-v1.4.0-require-securitycontext] securityContext must be defined for all Pod containers
pod/wp-non-compliant created

Supprimer le groupe de règles CIS GKE v1.4.0

Si nécessaire, le groupe de règles CIS GKE v1.4.0 peut être supprimé du cluster.

kubectl

Utilisez kubectl pour supprimer les règles:

  kubectl delete constraint -l policycontroller.gke.io/bundleName=cis-gke-v1.4.0
  

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. Déployez les modifications dans le dépôt Config Sync:

    git rm -r SYNC_ROOT_DIR/policies/cis-gke-v1.4.0
    git commit -m 'Removing CIS GKE v1.4.0 policy bundle'
    git push
    
  2. Vérifiez l'état:

    gcloud alpha anthos config sync repo list --project PROJECT_ID
    

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