Policy Controller est fourni avec une bibliothèque par défaut de modèles de contraintes qui peuvent être utilisés avec le lot CIS pour auditer la conformité de votre cluster par rapport au benchmark CIS de Kubernetes v1.5.1. Ce benchmark est un ensemble de recommandations permettant de configurer Kubernetes pour garantir un niveau de sécurité élevé.
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 la section Rôles utilisateur et tâches courantes de GKE Enterprise.
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
Contraintes liées au lot de règles CIS Kubernetes v1.5.1
Nom de la contrainte | Description du contrôle | ID de commande |
---|---|---|
cis-k8s-v1.5.1-restrict-clusteradmin-rolebindings.yaml | Limitez l'utilisation du rôle "cluster-admin" | 5.1.1 |
cis-k8s-v1.5.1-prohibit-role-wildcard-access.yaml | Limitez l'utilisation des caractères génériques dans "Roles" et "ClusterRoles" | 5.1.3 |
cis-k8s-v1.5.1-psp-privileged-container.yaml | Limitez l'admission de conteneurs privilégiés | 5.2.1 |
cis-k8s-v1.5.1-psp-host-namespace.yaml | Limitez l'admission des conteneurs souhaitant partager l'espace de noms de l'ID de processus hôte | 5.2.2 |
Limitez l'admission des conteneurs souhaitant partager l'espace de noms de l'IPC hôte | 5.2.3 | |
cis-k8s-v1.5.1-psp-host-network-ports | Limitez l'admission des conteneurs souhaitant partager l'espace de noms du réseau hôte | 5.2.4 |
cis-k8s-v1.5.1-psp-allow-privilege-escalation-container | Limitez l'admission des conteneurs avec allowPrivilegeEscalation | 5.2.5 |
cis-k8s-v1.5.1-psp-pods-must-run-as-nonroot | Limitez l'admission des conteneurs racine | 5.2.6 |
cis-k8s-v1.5.1-psp-capabilities | Limitez l'admission des conteneurs avec la fonctionnalité NET_RAW | 5.2.7 |
Limitez l'admission des conteneurs avec des fonctionnalités supplémentaires | 5.2.8 | |
Limitez l'admission des conteneurs avec des fonctionnalités attribuées | 5.2.9 | |
cis-k8s-v1.5.1-require-namespace-network-policies | Assurez-vous que des règles de réseau sont définies pour tous les espaces de noms | 5.3.2 |
cis-k8s-v1.5.1-no-secrets-as-env-vars | Préférez l'utilisation de secrets sous forme de fichiers plutôt que sous forme de variables d'environnement | 5.4.1 |
cis-k8s-v1.5.1-psp-seccomp-default | Assurez-vous que le profil seccomp est défini sur "docker/default" dans vos définitions de pods | 5.7.2 |
cis-k8s-v1.5.1-pods-require-security-context | Appliquez le contexte de sécurité à vos pods et conteneurs | 5.7.3 |
Avant de commencer
- Installez et initialisez Google Cloud CLI, qui fournit les commandes
gcloud
etkubectl
utilisé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. Vous devez également activer la compatibilité avec les contraintes référentielles, car ce bundle contient des contraintes référentielles.
Configurer Policy Controller pour les contraintes référentielles
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: "" version: "v1" kind: "Namespace" - group: "networking.k8s.io" version: "v1" kind: "NetworkPolicy"
Appliquez le fichier manifeste
policycontroller-config.yaml
:kubectl apply -f policycontroller-config.yaml
Groupe de règles d'audit CIS Kubernetes 1.5.1
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.
kubectl
(Facultatif) Prévisualisez les contraintes de règle avec kubectl :
kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/cis-k8s-v1.5.1
Appliquez les contraintes de règle avec kubectl :
kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/cis-k8s-v1.5.1
Le résultat est le suivant :
k8snoenvvarsecrets.constraints.gatekeeper.sh/cis-k8s-v1.5.1-no-secrets-as-env-vars created k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-allow-privilege-escalation created k8spspallowedusers.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-pods-must-run-as-nonroot created k8spspcapabilities.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-capabilities created k8spsphostnamespace.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-host-namespace created k8spsphostnetworkingports.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-host-network-ports created k8spspprivilegedcontainer.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-privileged-container created k8spspseccomp.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-seccomp-default created k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/cis-k8s-v1.5.1-pods-require-security-context created k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/cis-k8s-v1.5.1-prohibit-role-wildcard-access created k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/cis-k8s-v1.5.1-require-namespace-network-policies created k8srestrictrolebindings.constraints.gatekeeper.sh/cis-k8s-v1.5.1-restrict-clusteradmin-rolebindings 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/cis-k8s-v1.5.1
Le résultat ressemble à ce qui suit :
NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8snoenvvarsecrets.constraints.gatekeeper.sh/cis-k8s-v1.5.1-no-secrets-as-env-vars dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-allow-privilege-escalation dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspallowedusers.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-pods-must-run-as-nonroot dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspcapabilities.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-capabilities dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spsphostnamespace.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-host-namespace dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spsphostnetworkingports.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-host-network-ports dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspprivilegedcontainer.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-privileged-container dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspseccomp.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-seccomp-default dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/cis-k8s-v1.5.1-pods-require-security-context dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/cis-k8s-v1.5.1-prohibit-role-wildcard-access dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/cis-k8s-v1.5.1-require-namespace-network-policies dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srestrictrolebindings.constraints.gatekeeper.sh/cis-k8s-v1.5.1-restrict-clusteradmin-rolebindings dryrun 0
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 CIS à partir de GitHub à l'aide de Kpt :
kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/cis-k8s-v1.5.1
Exécutez la fonction kpt
set-enforcement-action
pour définir la mesure coercitive des règles surdryrun
:kpt fn eval cis-k8s-v1.5.1 -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 cis-k8s-v1.5.1 kpt live init
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 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
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
- 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
.gitignore
avecresourcegroup.yaml
, procédez comme suit :echo resourcegroup.yaml >> .gitignore
Créez un répertoire
policies
dédié :mkdir -p policies
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/bundles/cis-k8s-v1.5.1 policies/cis-k8s-v1.5.1
Exécutez la fonction kpt
set-enforcement-action
pour définir la mesure coercitive des règles surdryrun
:kpt fn eval policies/cis-k8s-v1.5.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
(Facultatif) Prévisualisez les contraintes de règles à créer :
kpt live init policies/cis-k8s-v1.5.1 kpt live apply --dry-run policies/cis-k8s-v1.5.1
Le résultat est le suivant :
Dry-run strategy: client inventory update started inventory update finished apply phase started k8snoenvvarsecrets.constraints.gatekeeper.sh/cis-k8s-v1.5.1-no-secrets-as-env-vars apply successful k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-allow-privilege-escalation apply successful k8spspallowedusers.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-pods-must-run-as-nonroot apply successful k8spspcapabilities.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-capabilities apply successful k8spsphostnamespace.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-host-namespace apply successful k8spsphostnetworkingports.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-host-network-ports apply successful k8spspprivilegedcontainer.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-privileged-container apply successful k8spspseccomp.constraints.gatekeeper.sh/cis-k8s-v1.5.1-psp-seccomp-default apply successful k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/cis-k8s-v1.5.1-pods-require-security-context apply successful k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/cis-k8s-v1.5.1-prohibit-role-wildcard-access apply successful k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/cis-k8s-v1.5.1-require-namespace-network-policies apply successful k8srestrictrolebindings.constraints.gatekeeper.sh/cis-k8s-v1.5.1-restrict-clusteradmin-rolebindings apply successful apply phase finished inventory update started inventory update finished apply result: 12 attempted, 12 successful, 0 skipped, 0 failed
Si votre répertoire de synchronisation pour Config Sync utilise Kustomize, ajoutez
policies/cis-k8s-v1.5.1
à votre fichierkustomization.yaml
racine. Sinon, supprimez le fichierpolicies/cis-k8s-v1.5.1/kustomization.yaml
:rm SYNC_ROOT_DIR/policies/cis-k8s-v1.5.1/kustomization.yaml
Transférez les modifications au dépôt Config Sync :
git add SYNC_ROOT_DIR/policies/cis-k8s-v1.5.1 git commit -m 'Adding CIS 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
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 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=cis-k8s-v1.5.1 -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=cis-k8s-v1.5.1 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'
Modifier la mesure coercitive du bundle de règles CIS Kubernetes v1.5.1
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 génère un avertissement (warn
) ou bloque (deny
) 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=cis-k8s-v1.5.1 -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=cis-k8s-v1.5.1
kpt
Exécutez la fonction kpt
set-enforcement-action
pour définir la mesure coercitive des règles surwarn
: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-action
pour définir la mesure coercitive des règles surwarn
:kpt fn eval policies/cis-k8s-v1.5.1 -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/cis-k8s-v1.5.1 git commit -m 'Adding CIS Kubernetes v1.5.1 policy bundle warn enforcement' git push
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 répertoriant les cas de violation des règles que cette ressource ne respecte pas, comme indiqué dans l'exemple suivant :
Warning: [cis-k8s-v1.5.1-psp-pods-must-run-as-nonroot] Container wordpress is attempting to run without a required securityContext/runAsNonRoot or securityContext/runAsUser != 0 Warning: [cis-k8s-v1.5.1-psp-allow-privilege-escalation] Privilege escalation container is not allowed: wordpress Warning: [cis-k8s-v1.5.1-psp-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-k8s-v1.5.1-psp-capabilities] container <wordpress> is not dropping all required capabilities. Container must drop all of ["NET_RAW"] or "ALL" Warning: [cis-k8s-v1.5.1-pods-require-security-context] securityContext must be defined for all Pod containers pod/wp-non-compliant created
Supprimer le groupe de règles CIS v1.5.1 de Kubernetes
Si nécessaire, le groupe de règles CIS K8s peut être supprimé du cluster.
kubectl
Utilisez kubectl pour supprimer les règles :
kubectl delete constraint -l policycontroller.gke.io/bundleName=cis-k8s-v1.5.1
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/cis-k8s-v1.5.1 git commit -m 'Removing CIS policies' git push
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.