PCI-DSS v3.2.1-Richtlinieneinschränkungen verwenden

Policy Controller enthält eine Standardbibliothek mit Einschränkungsvorlagen, die mit dem PCI-DSS v3.2.1-Bundle verwendet werden können, um die Compliance Ihrer Clusterressourcen mit einigen Aspekten des Payment Card Industry Data Security Standard (PCI-DSS) v3.2.1 zu bewerten.

Einschränkungen für PCI-DSS v3.2.1-Richtlinien-Bundles

Name der Einschränkung Beschreibung der Einschränkung Einstellungs-ID Profil
pci-dss-v3.2.1-resources-have-required-labels Prüft die Anforderungen an eine Firewall, da damit alle Apps ein bestimmtes Label enthalten müssen. 1.1.4 Standard
pci-dss-v3.2.1-apps-must-have-certain-set-of-annotations Mit dieser Richtlinie werden die Anforderungen an Netzwerksteuerungen sichergestellt, da alle Apps eine bestimmte Annotation enthalten müssen. 1.1.5, 2.4 Standard
pci-dss-v3.2.1-require-default-deny-network-policies Erfordert, dass jeder im Cluster definierte Namespace eine standardmäßige Ablehnungs-NetworkPolicy für ausgehenden Traffic hat. 1.2, 1.3, 2.2.2 Erweitert
pci-dss-v3.2.1-block-all-ingress Beschränkt das Erstellen von Ingress-Objekten. 1,2; 1,3 Erweitert
pci-dss-v3.2.1-require-valid-network-ranges Beschränkt die CIDR-Bereiche, die für eingehenden und ausgehenden Traffic verwendet werden dürfen. 1.2, 1.3.2 Erweitert
pci-dss-v3.2.1-require-namespace-network-policies Erfordert, dass jeder im Cluster definierte Namespace eine NetworkPolicy hat. 1.2 Standard
pci-dss-v3.2.1-enforce-managed-by-configmanagement-label Erfordert ein gültiges app.kubernetes.io/managed-by=-Label für RoleBinding Ressourcen. 1.2.2, 8.1.2 Standard
pci-dss-v3.2.1-block-creation-with-default-serviceaccount Schränkt das Erstellen von Ressourcen mit einem Standarddienstkonto ein. 2.1 Standard
pci-dss-v3.2.1-restrict-default-namespace Schränkt die Verwendung des Standard-Namespace für Pods ein. 2.1 Standard
pci-dss-v3.2.1-asm-peer-authn-strict-mtls Bei „Alle PeerAuthentications erzwingen“ kann der strikte mMTLS-Modus nicht überschrieben werden. 4.1 Standard
pci-dss-v3.2.1-require-av-daemonset Erfordert ein Antiviren-Daemonset. 5.1.1, 5.3 Standard
pci-dss-v3.2.1-enforce-config-management Erzwingen Sie die Präsenz und Aktivierung von Config Sync. 5,3, 6,1, 6,4 Standard
pci-dss-v3.2.1-enforce-cloudarmor-backendconfig Erzwingen Sie die Cloud Armor-Konfiguration für BackendConfig Ressourcen. 6,5, 6,6 Standard
pci-dss-v3.2.1-restrict-rbac-subjects Beschränkt die Verwendung von Namen in RBAC-Subjekten auf zulässige Werte. 8.1, 8.1.5 Erweitert
pci-dss-v3.2.1-block-secrets-of-type-basic-auth Beschränkt die Verwendung von Secrets vom Typ „basic-auth“. 8.1.5, 8.2.3, 8.5 Standard
pci-dss-v3.2.1-nodes-have-consistent-time Sorgt für eine konsistente und korrekte Zeit auf Knoten, indem die Verwendung von COS als Betriebssystem-Image sichergestellt wird. 10.4.1, 10.4.3 Standard

Einschränkungen für Standard-Bundles im Vergleich zu erweiterten Sets

Das PCI-DSS v3.2.1-Bundle implementiert bestimmte Richtlinienanforderungen, um einige Aspekte der PCI-DSS v3.2.1-Einstellungen umzusetzen. Neben der Anpassung Ihrer Arbeitslast an die Anforderungen des Standard-Bundles ist auch eine optionale Reihe erweiterter Einschränkungen verfügbar, die eine Anpassung an Ihre Umgebung erfordern.

Hinweise

  1. Installieren und initialisieren Sie die Google Cloud CLI, die die in dieser Anleitung verwendeten Befehle gcloud und kubectl enthält. Wenn Sie Cloud Shell verwenden, ist Google Cloud CLI vorinstalliert.
  2. Installieren Sie Policy Controller Version 1.14.3 oder höher mit der Standardbibliothek der Einschränkungsvorlagen in Ihrem Cluster. Außerdem müssen Sie die Unterstützung für referenzielle Einschränkungen aktivieren, da dieses Bundle referenzielle Einschränkungen enthält.

Policy Controller für referenzielle Einschränkungen konfigurieren

  1. Speichern Sie das folgende YAML-Manifest in einer Datei als policycontroller-config.yaml. Das Manifest konfiguriert Policy Controller so, dass bestimmte Arten von Objekten beobachtet werden.

    apiVersion: config.gatekeeper.sh/v1alpha1
    kind: Config
    metadata:
      name: config
      namespace: "gatekeeper-system"
    spec:
      sync:
        syncOnly:
          - group: "apps"
            version: "v1"
            kind: "DaemonSet"
          - group: "networking.k8s.io"
            version: "v1"
            kind: "NetworkPolicy"
    
  2. Wenden Sie das policycontroller-config.yaml-Manifest an:

    kubectl apply -f policycontroller-config.yaml
    

Arbeitslast des Clusters für PCI-DSS v3.2.1 konfigurieren

Standardpaket

  1. Alle Apps (ReplicaSet, Deployment, StatefulSet und DaemonSet) müssen eine pci-dss-firewall-audit label mit dem Schema pci-dss-[0-9]{4}q[1-4] enthalten.
  2. Alle Apps (ReplicaSet, Deployment, StatefulSet, DaemonSet) müssen eine network-controls/date-Anmerkung mit dem Schema YYYY-MM-DD enthalten.
  3. Jede im Cluster definierte namespace muss eine NetworkPolicy haben.
  4. Die Verwendung von Config Sync für configmanagement.gke.io ist standardmäßig erforderlich. Die zulässigen app.kubernetes.io/managed-by-Werte können jedoch in der pci-dss-v3.2.1-enforce-managed-by-configmanagement-label-Einschränkung angepasst werden.
  5. Ressourcen können nicht mit dem Standarddienstkonto erstellt werden.
  6. Der Standard-namespace kann nicht für Pods verwendet werden.
  7. Bei Verwendung von Anthos Service Mesh muss ASM PeerAuthentication strikte mTLS-spec.mtls.mode: STRICT verwenden.
  8. Eine Antivirenlösung ist erforderlich. Die Standardeinstellung ist das Vorhandensein eines daemonset namens clamav in pci-dss-av namespace. Der Name und der Namespace von daemonset können jedoch an Ihre Implementierung in der pci-dss-v3.2.1-require-av-daemonset-Einschränkung angepasst werden.
  9. Config Sync muss vorhanden und aktiviert sein.
  10. Alle BackendConfig müssen für CloudArmor konfiguriert sein.
  11. Die Verwendung von Secrets des Typs basic-auth ist nicht zulässig.
  12. Für eine einheitliche Zeit müssen alle Knoten für ihr Image Container-Optimized OS von Google verwenden.

Erweitertes Set (optional, Anpassung erforderlich)

  1. Für jede namespace, die im Cluster definiert ist, gibt es eine standardmäßige Ablehnungs-NetworkPolicy für ausgehenden Traffic. Zulässige Ausnahmen können in pci-dss-v3.2.1-require-namespace-network-policies spezifisch sein.
  2. Es können nur zulässige Ingress-Objekte (Ingress, Gateway und Service-Typen von NodePort und LoadBalancer) erstellt werden. Diese können in pci-dss-v3.2.1-block-all-ingress angegeben werden.
  3. Für Ingress und Express können nur zulässige IP-Bereiche verwendet werden, die in pci-dss-v3.2.1-require-valid-network-ranges angegeben werden können.
  4. In RBAC-Bindungen können nur zulässige Subjekte verwendet werden. Ihre Domainnamen können in pci-dss-v3.2.1-restrict-rbac-subjects angegeben werden.

PCI-DSS v3.2.1-Richtlinien-Bundle prüfen

Mit Policy Controller können Sie Richtlinien für Ihren Kubernetes-Cluster erzwingen. Damit Sie Ihre Arbeitslasten und deren Einhaltung in Bezug auf die PCI-DSS v3.2.1-Richtlinien, die in der vorherigen Tabelle erläutert werden, einfacher testen können, können Sie diese Einschränkungen im Prüfmodus bereitstellen, um Verstöße aufzudecken und, was noch wichtiger ist, Ihnen die Möglichkeit zu geben, sie zu beheben, bevor Sie sie für Ihren Kubernetes-Cluster erzwingen.

Sie können diese Richtlinien anwenden, wenn spec.enforcementAction mit kubectl, kpt oder Config Sync auf dryrun festgelegt ist.

kubectl

  1. (Optional) Sehen Sie sich eine Vorschau der Richtlinieneinschränkungen mit kubectl an:

    kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/pci-dss-v3.2.1
    
  2. Wenden Sie die Richtlinieneinschränkungen mit kubectl an:

    kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/pci-dss-v3.2.1
    

    Die Ausgabe sieht so aus:

    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/pci-dss-v3.2.1-asm-peer-authn-strict-mtls created
    k8sblockcreationwithdefaultserviceaccount.constraints.gatekeeper.sh/pci-dss-v3.2.1-block-creation-with-default-serviceaccount created
    k8sblockobjectsoftype.constraints.gatekeeper.sh/pci-dss-v3.2.1-block-secrets-of-type-basic-auth created
    k8senforcecloudarmorbackendconfig.constraints.gatekeeper.sh/pci-dss-v3.2.1-enforce-cloudarmor-backendconfig created
    k8senforceconfigmanagement.constraints.gatekeeper.sh/pci-dss-v3.2.1-enforce-config-management created
    k8srequirecosnodeimage.constraints.gatekeeper.sh/pci-dss-v3.2.1-nodes-have-consistent-time created
    k8srequiredaemonsets.constraints.gatekeeper.sh/pci-dss-v3.2.1-require-av-daemonset created
    k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/pci-dss-v3.2.1-require-namespace-network-policies created
    k8srequiredannotations.constraints.gatekeeper.sh/pci-dss-v3.2.1-apps-must-have-certain-set-of-annotations created
    k8srequiredlabels.constraints.gatekeeper.sh/pci-dss-v3.2.1-enforce-managed-by-configmanagement-label created
    k8srequiredlabels.constraints.gatekeeper.sh/pci-dss-v3.2.1-resources-have-required-labels created
    k8srestrictnamespaces.constraints.gatekeeper.sh/pci-dss-v3.2.1-restrict-default-namespace created
    
  3. 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/anthos-bundles/pci-dss-v3.2.1
    

    Die Ausgabe sieht in etwa so aus:

    NAME                                                                                         ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/pci-dss-v3.2.1-asm-peer-authn-strict-mtls   dryrun               0
    
    NAME                                                                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sblockcreationwithdefaultserviceaccount.constraints.gatekeeper.sh/pci-dss-v3.2.1-block-creation-with-default-serviceaccount   dryrun               0
    
    NAME                                                                                              ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sblockobjectsoftype.constraints.gatekeeper.sh/pci-dss-v3.2.1-block-secrets-of-type-basic-auth   dryrun               0
    
    NAME                                                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8senforcecloudarmorbackendconfig.constraints.gatekeeper.sh/pci-dss-v3.2.1-enforce-cloudarmor-backendconfig   dryrun               0
    
    NAME                                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8senforceconfigmanagement.constraints.gatekeeper.sh/pci-dss-v3.2.1-enforce-config-management   dryrun               0
    
    NAME                                                                                         ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequirecosnodeimage.constraints.gatekeeper.sh/pci-dss-v3.2.1-nodes-have-consistent-time   dryrun               0
    
    NAME                                                                                 ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequiredaemonsets.constraints.gatekeeper.sh/pci-dss-v3.2.1-require-av-daemonset   dryrun               0
    
    NAME                                                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/pci-dss-v3.2.1-require-namespace-network-policies   dryrun               0
    
    NAME                                                                                                        ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequiredannotations.constraints.gatekeeper.sh/pci-dss-v3.2.1-apps-must-have-certain-set-of-annotations   dryrun               0
    
    NAME                                                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequiredlabels.constraints.gatekeeper.sh/pci-dss-v3.2.1-enforce-managed-by-configmanagement-label   dryrun               0
    k8srequiredlabels.constraints.gatekeeper.sh/pci-dss-v3.2.1-resources-have-required-labels              dryrun               0
    
    NAME                                                                                        ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictnamespaces.constraints.gatekeeper.sh/pci-dss-v3.2.1-restrict-default-namespace   dryrun               0
    

KPT

  1. Installieren und richten Sie kpt ein. kpt wird in dieser Anleitung verwendet, um Kubernetes-Ressourcen anzupassen und bereitzustellen.

  2. Laden Sie das PCI-DSS v3.2.1-Richtlinien-Bundle mithilfe von kpt von GitHub herunter:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/pci-dss-v3.2.1
    
  3. Führen Sie die kpt-Funktion set-enforcement-action aus, um die Erzwingungsaktion der Richtlinien auf dryrun festzulegen:

    kpt fn eval pci-dss-v3.2.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \
      -- enforcementAction=dryrun
    
  4. Initialisieren Sie das Arbeitsverzeichnis mit kpt, wodurch eine Ressource erstellt wird, um Änderungen verfolgen zu können:

    cd pci-dss-v3.2.1
    kpt live init
    
  5. Wenden Sie die Richtlinieneinschränkungen mit kpt an:

    kpt live apply
    
  6. 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

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

  1. Wechseln Sie in das Synchronisierungsverzeichnis für Config Sync:

    cd SYNC_ROOT_DIR
    

    So erstellen oder hängen Sie .gitignore mit resourcegroup.yaml an:

    echo resourcegroup.yaml >> .gitignore
    

  2. Erstellen Sie ein dediziertes policies-Verzeichnis:

    mkdir -p policies
    
  3. Laden Sie das PCI-DSS v3.2.1-Richtlinien-Bundle mithilfe von kpt von GitHub herunter:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/pci-dss-v3.2.1 policies/pci-dss-v3.2.1
    
  4. Führen Sie die kpt-Funktion set-enforcement-action aus, um die Erzwingungsaktion der Richtlinien auf dryrun festzulegen:

    kpt fn eval policies/pci-dss-v3.2.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
    
  5. (Optional) Sehen Sie sich eine Vorschau der zu erstellenden Richtlinieneinschränkungen an:

    kpt live init policies/pci-dss-v3.2.1
    kpt live apply --dry-run policies/pci-dss-v3.2.1
    
  6. Wenn Ihr Synchronisierungsverzeichnis für Config Sync Kustomize verwendet, fügen Sie policies/pci-dss-v3.2.1 dem Stammverzeichnis kustomization.yaml hinzu. Andernfalls entfernen Sie die Datei policies/pci-dss-v3.2.1/kustomization.yaml:

    rm SYNC_ROOT_DIR/policies/pci-dss-v3.2.1/kustomization.yaml
    
  7. Übertragen Sie Änderungen per Push in das Config Sync-Repository:

    git add SYNC_ROOT_DIR/policies/pci-dss-v3.2.1
    git commit -m 'Adding PCI-DSS v3.2.1 policy audit enforcement'
    git push
    
  8. 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

Nachdem die Richtlinieneinschränkungen im Prüfmodus installiert wurden, können Verstöße im Cluster über das Policy Controller-Dashboard in der Benutzeroberfläche angezeigt werden.

Sie können auch kubectl verwenden, um mit dem folgenden Befehl Verstöße im Cluster anzusehen:

kubectl get constraint -l policycontroller.gke.io/bundleName=pci-dss-v3.2.1 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'

Wenn Verstöße vorliegen, kann eine Liste der Verstoßmeldungen pro Einschränkung wie folgt angezeigt werden:

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

Erzwingungsaktion für PCI-DSS v3.2.1-Richtlinien-Bundle ändern

Nachdem Sie die Richtlinienverstöße in Ihrem Cluster geprüft haben, können Sie den Erzwingungsmodus so ändern, dass der Admission-Controller entweder warn auf den Cluster ausführt oder sogar deny die Anwendung nicht konformer Ressourcen auf den Cluster blockiert.

kubectl

  1. Legen Sie mit kubectl die Erzwingungsaktion der Richtlinien auf warn fest:

    kubectl get constraint -l policycontroller.gke.io/bundleName=pci-dss-v3.2.1 -o name | xargs -I {} kubectl patch {} --type='json' -p='[{"op":"replace","path":"/spec/enforcementAction","value":"warn"}]'
    
  2. Prüfen Sie, ob die Maßnahme zur Durchsetzung von Richtlinieneinschränkungen aktualisiert wurde:

    kubectl get constraint -l policycontroller.gke.io/bundleName=pci-dss-v3.2.1
    

KPT

  1. Führen Sie die kpt-Funktion set-enforcement-action aus, um die Erzwingungsaktion der Richtlinien auf warn festzulegen:

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

  1. Wechseln Sie in das Synchronisierungsverzeichnis für Config Sync:

    cd SYNC_ROOT_DIR
    
  2. Führen Sie die kpt-Funktion set-enforcement-action aus, um die Erzwingungsaktion der Richtlinien auf warn festzulegen:

    kpt fn eval policies/pci-dss-v3.2.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  3. Übertragen Sie Änderungen per Push in das Config Sync-Repository:

    git add SYNC_ROOT_DIR/policies/pci-dss-v3.2.1
    git commit -m 'Adding PCI-DSS v3.2.1 policy bundle warn enforcement'
    git push
    
  4. 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 aufgelistet sind, gegen die diese Ressource verstößt, wie im folgenden Beispiel gezeigt:

Warning: [pci-dss-v3.2.1-restrict-default-namespace] <default> namespace is restricted
pod/wp-non-compliant created

PCI-DSS v3.2.1-Richtlinien-Bundle entfernen

Bei Bedarf kann das PCI-DSS v3.2.1-Richtlinien-Bundle aus dem Cluster entfernt werden.

kubectl

  • Verwenden Sie kubectl, um die Richtlinien zu entfernen:

    kubectl delete constraint -l policycontroller.gke.io/bundleName=pci-dss-v3.2.1
    

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:

  1. Übertragen Sie Änderungen per Push in das Config Sync-Repository:

    git rm -r SYNC_ROOT_DIR/policies/pci-dss-v3.2.1
    git commit -m 'Removing PCI-DSS v3.2.1 policies'
    git push
    
  2. Prüfen Sie den Status:

    gcloud alpha anthos config sync repo list --project PROJECT_ID
    

    Das Repository, das in der Spalte SYNCED angezeigt wird, bestätigt das Entfernen der Richtlinien.