Policy Controller umfasst eine Standardbibliothek mit Einschränkungsvorlagen, die mit dem Pod-Sicherheitsrichtlinien-Bundle verwendet werden können, um viele der Schutzmaßnahmen zu nutzen, die auch die Kubernetes Pod-Sicherheitsrichtlinie (PSP) einsetzt. Außerdem können Sie Ihre Richtlinien testen, bevor Sie diese erzwingen, und die Abdeckung bestimmter Ressourcen ausschließen.
Diese Seite richtet sich an IT-Administratoren und Operatoren, die sicherstellen möchten, dass alle auf der Cloud Platform ausgeführten Ressourcen die Compliance-Anforderungen der Organisation erfüllen, indem sie Automatisierung zur Prüfung oder Durchsetzung bereitstellen und aufrechterhalten. Weitere Informationen zu gängigen Rollen und Beispielaufgaben, auf die wir in Google Cloud-Inhalten verweisen, finden Sie unter Häufig verwendete GKE Enterprise-Nutzerrollen und -Aufgaben.
Das Bundle enthält diese Einschränkungen, die Parameter bereitstellen, welche den folgenden Feldnamen (Control IDs) für Kubernetes Pod-Sicherheitsrichtlinien (PSP) zugeordnet sind:
Name der Einschränkung | Beschreibung der Einschränkung | Kontroll-ID |
---|---|---|
psp-v2022-psp-allow-privilege-escalation | Eskalation auf Root-Berechtigungen beschränken | allowPrivilegeEscalation |
psp-v2022-psp-apparmor | Das von Containern verwendete AppArmor-Profil | annotations |
psp-v2022-psp-capabilities | Linux-Funktionen | allowedCapabilities, requiredDropCapabilities |
psp-v2022-flexvolume-drivers | Bestimmte FlexVolume-Treiber zulassen | allowedFlexVolumes |
psp-v2022-psp-forbidden-sysctls | Das von Containern verwendete sysctl-Profil | forbiddenSysctls |
psp-v2022-psp-fsgroup | Steuert die Zuweisung einer FSGroup, die die Volumes des Pods besitzt. | fsGroup |
psp-v2022-psp-host-filesystem | Verwendung des Hostdateisystems | allowedHostPaths |
psp-v2022-psp-host-namespace | Host-Namespaces verwenden | hostPID, hostIPC |
psp-v2022-psp-host-network-ports | Hostnetzwerk und Ports verwenden | hostNetwork, hostPorts |
psp-v2022-psp-privileged-container | Privilegierte Container ausführen | privilegiert |
psp-v2022-psp-proc-mount | Die zulässigen Proc-Bereitstellungstypen für den Container | allowedProcMountTypes |
psp-v2022-psp-readonlyrootfilesystem | Verwendung eines schreibgeschützten Root-Dateisystems erforderlich machen | readOnlyRootFilesystem |
psp-v2022-psp-seccomp | Das von Containern verwendete seccomp-Profil | annotations |
psp-v2022-psp-selinux-v2 | Der SELinux-Kontext des Containers | seLinux |
psp-v2022-psp-pods-allowed-user-ranges | Die Nutzer- und Gruppen-IDs des Containers | runAsUser, runAsGroup, supplementalGroups, fsGroup |
psp-v2022-psp-volume-types | Nutzung von Volume-Typen | volumes |
Vorbereitung
- Installieren und initialisieren Sie das Google Cloud CLI, das die in dieser Anleitung verwendeten Befehle
gcloud
undkubectl
enthält. Wenn Sie Cloud Shell verwenden, ist Google Cloud CLI vorinstalliert. - Installieren Sie den Policy Controller auf Ihrem Cluster mit der Standardbibliothek an Einschränkungsvorlagen.
Audit-Pod-Sicherheitsrichtlinienrichtlinien-Bundle
Mit Policy Controller können Sie Richtlinien für Ihren Kubernetes-Cluster erzwingen. Damit Sie Ihre Arbeitslasten und deren Compliance in Bezug auf die in der vorherigen Tabelle beschriebenen, von Google empfohlenen Best Practices testen können, können Sie diese Einschränkungen im „Audit”-Modus bereitstellen. So können Sie Verstöße aufdecken und haben Gelegenheit, diese zu beheben, bevor Sie sie auf Ihrem Kubernetes-Cluster erzwingen.
Sie können diese Richtlinien mit kpt oder Config Sync festlegen, wobei spec.enforcementAction
auf dryrun
gesetzt ist.
kubectl
(Optional) Sehen Sie sich eine Vorschau der Richtlinieneinschränkungen mit kubectl an:
kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022
Wenden Sie die Richtlinieneinschränkungen mit kubectl an:
kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022
Die Ausgabe sieht so aus:
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
Prüfen Sie, ob Richtlinieneinschränkungen installiert wurden, und prüfen Sie, ob im Cluster Verstöße vorliegen:
kubectl get -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022
Die Ausgabe sieht in etwa so aus:
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
(Optional) Passen Sie den PSP-Feldnamen
parameters
in den Einschränkungsdateien entsprechend Ihrer Clusterumgebung an. Weitere Informationen erhalten Sie über den Link zum jeweiligen PSP-Feldnamen in der obigen Tabelle. Wie zum Beispiel inpsp-host-network-ports
:parameters: hostNetwork: true min: 80 max: 9000
KPT
Installieren und richten Sie kpt ein. kpt wird in dieser Anleitung verwendet, um Kubernetes-Ressourcen anzupassen und bereitzustellen.
Laden Sie das Richtlinien-Bundle v2022 der Pod-Sicherheitsrichtlinie (PSP) von GitHub mit kpt herunter:
kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022
Führen Sie die kpt-Funktion
set-enforcement-action
aus, um die Erzwingungsaktion der Richtlinien aufdryrun
festzulegen:kpt fn eval psp-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \ -- enforcementAction=dryrun
Initialisieren Sie das Arbeitsverzeichnis mit kpt, wodurch eine Ressource erstellt wird, um Änderungen verfolgen zu können:
cd psp-v2022 kpt live init
(Optional) Passen Sie den PSP-Feldnamen
parameters
in den Einschränkungsdateien entsprechend Ihrer Clusterumgebung an. Weitere Informationen erhalten Sie über den Link zum jeweiligen PSP-Feldnamen in der obigen Tabelle. Wie zum Beispiel inpsp-host-network-ports
:parameters: hostNetwork: true min: 80 max: 9000
Wenden Sie die Richtlinieneinschränkungen mit kpt an:
kpt live apply
Prüfen Sie, ob Richtlinieneinschränkungen installiert wurden, und prüfen Sie, ob im Cluster Verstöße vorliegen:
kpt live status --output table --poll-until current
Der Status
CURRENT
bestätigt die erfolgreiche Installation der Einschränkungen.
Config Sync
- Installieren und richten Sie kpt ein. kpt wird in dieser Anleitung verwendet, um Kubernetes-Ressourcen anzupassen und bereitzustellen.
Operatoren, die Config Sync zum Bereitstellen von Richtlinien für ihre Cluster verwenden, können die folgende Anleitung verwenden:
Wechseln Sie in das Synchronisierungsverzeichnis für Config Sync:
cd SYNC_ROOT_DIR
So erstellen Sie
resourcegroup.yaml
oder hängen es an.gitignore
an:echo resourcegroup.yaml >> .gitignore
Erstellen Sie ein dediziertes
policies
-Verzeichnis:mkdir -p policies
Laden Sie das Richtlinien-Bundle v2022 der Pod-Sicherheitsrichtlinie (PSP) von GitHub mit kpt herunter:
kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022 policies/psp-v2022
Führen Sie die kpt-Funktion
set-enforcement-action
aus, um die Erzwingungsaktion der Richtlinien aufdryrun
festzulegen:kpt fn eval policies/psp-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
(Optional) Passen Sie den PSP-Feldnamen
parameters
in den Einschränkungsdateien entsprechend Ihrer Clusterumgebung an. Weitere Informationen erhalten Sie über den Link zum jeweiligen PSP-Feldnamen in der obigen Tabelle. Wie zum Beispiel inpsp-host-network-ports
:parameters: hostNetwork: true min: 80 max: 9000
(Optional) Sehen Sie sich eine Vorschau der Richtlinieneinschränkungen an, die erstellt werden sollen:
kpt live init policies/psp-v2022 kpt live apply --dry-run policies/psp-v2022
Die Ausgabe sieht so aus:
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
Wenn Ihr Synchronisierungsverzeichnis für Config Sync Kustomize verwendet, fügen Sie
policies/psp-v2022
Ihrer Stamm-kustomization.yaml
hinzu. Andernfalls entfernen Sie die Dateipolicies/psp-v2022/kustomization.yaml
:rm SYNC_ROOT_DIR/policies/psp-v2022/kustomization.yaml
Übertragen Sie Änderungen per Push in das Config Sync-Repository:
git add SYNC_ROOT_DIR/policies/psp-v2022 git commit -m 'Adding Pod Security Policy audit enforcement' git push
Prüfen Sie den Status der Installation:
watch gcloud beta container fleet config-management status --project PROJECT_ID
Der Status
SYNCED
bestätigt die Installation der Richtlinien.
Richtlinienverstöße ansehen
Sobald die Richtlinieneinschränkungen im Prüfmodus installiert sind, können Verstöße im Cluster in der UI über das Policy Controller-Dashboard angezeigt werden.
Mit kubectl
können Sie auch Verstöße im Cluster mit dem folgenden Befehl aufrufen:
kubectl get constraint -l policycontroller.gke.io/bundleName=psp-v2022 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'
Wenn Verstöße vorhanden sind, kann eine Liste der Nachrichten zu Verstößen pro Einschränkung angezeigt werden mit:
kubectl get constraint -l policycontroller.gke.io/bundleName=psp-v2022 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'
Erzwingungsaktion des Pod-Sicherheitsrichtlinien-Bundles ändern
Nachdem Sie die Richtlinienverstöße in Ihrem Cluster überprüft haben, können Sie den Erzwingungsmodus ändern, sodass der Zulassungs-Controller entweder den Modus warn
aktiviert oder sogar deny
verhindert, dass nicht konforme Ressourcen auf das Cluster angewendet werden.
kubectl
Verwenden Sie kubectl, um die Maßnahme der Richtlinien auf
warn
festzulegen: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"}]'
Prüfen Sie, ob die Maßnahme für Richtlinieneinschränkungen aktualisiert wurde:
kubectl get constraint -l policycontroller.gke.io/bundleName=psp-v2022
KPT
Führen Sie die kpt-Funktion
set-enforcement-action
aus, um die Maßnahme der Richtlinien aufwarn
festzulegen:kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
Wenden Sie die Richtlinieneinschränkungen an:
kpt live apply
Config Sync
Operatoren, die Config Sync zum Bereitstellen von Richtlinien für ihre Cluster verwenden, können die folgende Anleitung verwenden:
Wechseln Sie in das Synchronisierungsverzeichnis für Config Sync:
cd SYNC_ROOT_DIR
Führen Sie die kpt-Funktion
set-enforcement-action
aus, um die Maßnahme der Richtlinien aufwarn
festzulegen:kpt fn eval policies/psp-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
Übertragen Sie Änderungen per Push in das Config Sync-Repository:
git add SYNC_ROOT_DIR/policies/psp-v2022 git commit -m 'Adding Pod Security Policy policy bundle warn enforcement' git push
Prüfen Sie den Status der Installation:
gcloud alpha anthos config sync repo list --project PROJECT_ID
Ihr Repository, das in der Spalte
SYNCED
angezeigt wird, bestätigt die Installation der Richtlinien.
Richtlinienerzwingung testen
Erstellen Sie mit dem folgenden Befehl eine nicht konforme Ressource im Cluster:
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
Der Admission-Controller sollte eine Warnung ausgeben, in der die Richtlinienverstöße aufgeführt sind, gegen die diese Ressource verstößt, wie im folgenden Beispiel gezeigt:
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
Richtlinien-Bundle für Pod-Sicherheitsrichtlinien entfernen
Bei Bedarf kann das Pod-Sicherheitsrichtlinien-Bundle aus dem Cluster entfernt werden.
kubectl
Verwenden Sie kubectl, um die Richtlinien zu entfernen:
kubectl delete constraint -l policycontroller.gke.io/bundleName=psp-v2022
KPT
Entfernen Sie die Richtlinien:
kpt live destroy
Config Sync
Operatoren, die Config Sync zum Bereitstellen von Richtlinien für ihre Cluster verwenden, können die folgende Anleitung verwenden:
Übertragen Sie Änderungen per Push in das Config Sync-Repository:
git rm -r SYNC_ROOT_DIR/policies/psp-v2022 git commit -m 'Removing PSP policies' git push
Prüfen Sie den Status:
gcloud alpha anthos config sync repo list --project PROJECT_ID
Ihr Repository, das in der Spalte
SYNCED
angezeigt wird, bestätigt das Entfernen der Richtlinien.