Utiliser les contraintes liées aux règles du benchmark CIS de Kubernetes

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 CIS pour auditer la conformité de votre cluster par rapport au benchmark CIS de Kubernetes. Ce benchmark est un ensemble de recommandations permettant de configurer Kubernetes pour garantir un niveau de sécurité élevé.

Ce groupe de contraintes aborde et applique les règles 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
  • Règles générales

Ces éléments n'ont pas encore été certifiés par le CIS.

Le groupe comprend les contraintes suivantes pour satisfaire aux contrôles correspondants dans les analyses comparatives CIS :

Contrainte ID de contrôle Description du contrôle
restrict-clusteradmin-rolebindings 5.1.1 Assurez-vous que le rôle d'administrateur de cluster n'est utilisé que lorsque cela est nécessaire
prohibit-role-wildcard-access 5.1.3 Réduisez l'utilisation des caractères génériques dans les objets Roles et ClusterRoles
psp-privileged-container 5.2.1 Limitez l'admission de conteneurs privilégiés
psp-host-namespace 5.2.2 Limitez l'admission des conteneurs souhaitant partager l'espace de noms de l'ID de processus hôte
5.2.3 Limitez l'admission des conteneurs souhaitant partager l'espace de noms de l'IPC hôte
psp-host-network-ports 5.2.4 Limitez l'admission des conteneurs souhaitant partager l'espace de noms du réseau hôte
psp-allow-privilege-escalation-container 5.2.5 Limitez l'admission des conteneurs avec allowPrivilegeEscalation
psp-pods-must-run-as-nonroot 5.2.6 Limitez l'admission des conteneurs racine
psp-capabilities 5.2.7 Limitez l'admission des conteneurs avec la fonctionnalité NET_RAW
5.2.8 Limitez l'admission des conteneurs avec des fonctionnalités supplémentaires
5.2.9 Limitez l'admission des conteneurs avec des fonctionnalités attribuées
require-namespace-network-policies 5.3.2 Assurez-vous que des règles de réseau sont définies pour tous les espaces de noms
no-secrets-as-env-vars 5.4.1 Préférez l'utilisation de secrets sous forme de fichiers plutôt que sous forme de variables d'environnement
psp-seccomp-docker-default 5.7.2 Assurez-vous que le profil seccomp est défini sur "docker/default" dans vos définitions de pods
pods-require-security-context 5.7.3 Appliquez le contexte de sécurité à vos pods et conteneurs
restrict-default-namespace 5.7.4 L'espace de noms par défaut ne doit pas être utilisé

Avant de commencer

  1. Installez et initialisez le SDK Cloud, qui fournit les commandes gcloud et kubectl utilisées dans les présentes instructions. Si vous utilisez Cloud Shell, le SDK Cloud est pré-installé.
  2. Installez et configurez kpt. kpt est utilisé dans ces instructions pour personnaliser et déployer les ressources Kubernetes.
  3. Si vous utilisez Anthos Config Management pour la première fois, activez Anthos Config Management.
  4. Créez un cluster exécutant Kubernetes version 1.14.x ou ultérieure avec Policy Controller installé sur le cluster, ou assurez-vous que vous y avez accès. Pour en savoir plus sur l'installation de Policy Controller, consultez la page Installer Policy Controller.
  5. Facultatif : si vous prévoyez d'utiliser Config Sync pour appliquer des ressources à votre cluster, assurez-vous d'avoir installé Config Sync.

Auditer les règles CIS avec Policy Controller

Policy Controller vous permet d'appliquer des règles à votre cluster Kubernetes. Pour tester vos charges de travail et leur conformité avec les règles CIS 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.

kpt

  1. Téléchargez le groupe de règles CIS à partir de GitHub à l'aide de Kpt :

    kpt pkg get https://github.com/GoogleCloudPlatform/acm-policy-controller-library.git/bundles/cis-k8s-1.5.1
    
  2. Exécutez la fonction kpt set-enforcement-action pour définir l'action d'application des règles sur dryrun :

    kpt fn eval cis-k8s-1.5.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \
      -- enforcementAction=dryrun
    
  3. Initialisez le répertoire de travail avec kpt, qui crée une ressource pour suivre les modifications :

    cd cis-k8s-1.5.1
    kpt live init
    
  4. Appliquez les contraintes de règles avec kpt :

    kpt live apply
    

    Le résultat est le suivant :

    k8spspseccomp.constraints.gatekeeper.sh/psp-seccomp-docker-default created
    k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/pods-require-security-context created
    k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/prohibit-role-wildcard-access created
    k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/require-namespace-network-policies created
    k8snoenvvarsecrets.constraints.gatekeeper.sh/no-secrets-as-env-vars created
    k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/psp-allow-privilege-escalation-container created
    k8spspallowedusers.constraints.gatekeeper.sh/psp-pods-must-run-as-nonroot created
    k8spsphostnetworkingports.constraints.gatekeeper.sh/psp-host-network-ports created
    k8srestrictnamespaces.constraints.gatekeeper.sh/restrict-default-namespace created
    k8srestrictrolebindings.constraints.gatekeeper.sh/restrict-clusteradmin-rolebindings created
    k8spspcapabilities.constraints.gatekeeper.sh/psp-capabilities created
    k8spsphostnamespace.constraints.gatekeeper.sh/psp-host-namespace created
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/psp-privileged-container created
    13 resource(s) applied. 13 created, 0 unchanged, 0 configured, 0 failed
    
  5. 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

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

    kpt pkg get git@github.com:GoogleCloudPlatform/acm-policy-controller-library.git/bundles/cis-k8s-1.5.1 policy/cis
    
  3. Exécutez la fonction kpt set-enforcement-action pour définir l'action d'application des règles sur dryrun :

    kpt fn eval policy/cis/cis-k8s-1.5.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
    
  4. Prévisualisez les contraintes de règles qui seront créées :

    kpt live init policy/cis/cis-k8s-1.5.1
    kpt live apply --dry-run policy/cis/cis-k8s-1.5.1
    

    Le résultat est le suivant :

    k8spsphostnamespace.constraints.gatekeeper.sh/psp-host-namespace created (dry-run)
    k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/pods-require-security-context created (dry-run)
    k8srestrictnamespaces.constraints.gatekeeper.sh/restrict-default-namespace created (dry-run)
    k8srestrictrolebindings.constraints.gatekeeper.sh/restrict-clusteradmin-rolebindings created (dry-run)
    k8snoenvvarsecrets.constraints.gatekeeper.sh/no-secrets-as-env-vars created (dry-run)
    k8spspallowedusers.constraints.gatekeeper.sh/psp-pods-must-run-as-nonroot created (dry-run)
    k8spsphostnetworkingports.constraints.gatekeeper.sh/psp-host-network-ports created (dry-run)
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/psp-privileged-container created (dry-run)
    k8spspseccomp.constraints.gatekeeper.sh/psp-seccomp-docker-default created (dry-run)
    k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/prohibit-role-wildcard-access created (dry-run)
    k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/require-namespace-network-policies created (dry-run)
    k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/psp-allow-privilege-escalation-container created (dry-run)
    k8spspcapabilities.constraints.gatekeeper.sh/psp-capabilities created (dry-run)
    13 resource(s) applied. 13 created, 0 unchanged, 0 configured, 0 failed (dry-run)
    
  5. Transférez les modifications au dépôt Config Sync :

    git add SYNC_ROOT_DIR/policy/cis
    git commit -m 'Adding CIS policy audit enforcement'
    git push
    
  6. Vérifiez l'état de l'installation :

    watch gcloud beta container hub 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, les cas de non-respect sur le cluster peuvent être visualisés à l'aide de la commande suivante :

kubectl get constraint -o json | jq -cC '.items[]| [.kind,.status.totalViolations]

Si vous préférez afficher les cas de non-respect dans Cloud Logging, accédez à la page Explorateur de journaux.

Accéder à l'explorateur de journaux

Utilisez les filtres suivants dans l'éditeur de requête pour surveiller les journaux des cas de non-respect :

resource.type="k8s_container"
resource.labels.location=CLUSTER_LOCATION
resource.labels.namespace_name="gatekeeper-system"
resource.labels.pod_name:"gatekeeper-audit-"
jsonPayload.process: "audit"
jsonPayload.event_type: "violation_audited"
jsonPayload.constraint_name:*
jsonPayload.constraint_namespace:*

Appliquer les règles CIS

Une fois que vous avez examiné les cas de non-respect des règles sur votre cluster, l'étape suivante consiste à appliquer ces règles de sorte que le contrôleur d'admission empêche toute ressource non conforme d'être appliquée au cluster.

kpt

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

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

    kpt fn eval policy/cis/cis-k8s-1.5.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=deny
    
  3. Transférez les modifications au dépôt Config Sync :

    git add SYNC_ROOT_DIR/policy/cis
    git commit -m 'Enforcing CIS policies for GKE'
    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

Effectuez un test rapide pour confirmer l'application des règles et le blocage des ressources non conformes sur le cluster.

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: wp
  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 une erreur répertoriant les cas de violation des règles que cette ressource ne respecte pas.