Einschränkungen für Anthos Service Mesh-Sicherheitsrichtlinien verwenden

Policy Controller enthält eine Standardbibliothek mit Einschränkungsvorlagen, die mit dem Sicherheits-Bundle von Cloud Service Mesh verwendet werden können, um die Compliance Ihrer Best Practices bezüglich Sicherheitslücken von Mesh-Netzwerken zu prüfen.

Dieses Bundle mit Einschränkungen setzt Richtlinien in den folgenden Domains durch:

  • Cloud Service Mesh erzwingt mTLS-Traffic
  • Best Practices für Cloud Service Mesh-AuthorizationPolicy
  • Erzwingung der Arbeitslastsicherheit von Cloud Service Mesh

Einschränkungen für Cloud Service Mesh-Richtlinien-Bundles

Name der Einschränkung Beschreibung der Einschränkung Einstellungs-ID
asm-policy-v0.0.1-asm-ingressgateway-label Erzwingen Sie die Labelverwendung von Istio-Ingressgateways nur für Ingressgateway-Pods 1.1.1
asm-policy-v0.0.1-asm-sidecar-injection Erzwingen Sie, dass die istio-Proxy-Sidecar-Datei immer in die Workload-Pods eingefügt wird 1.1.2
asm-policy-v0.0.1-asm-authz-policy-mesh-default-deny Erzwingen Sie die AuthorizationPolicy für standardmäßige Ablehnung auf Mesh-Ebene 1.2.1
asm-policy-v0.0.1-asm-authz-policy-normalization Erzwingen Sie die Normalisierung der AuthorizationPolicy 1.2.2
asm-policy-v0.0.1-asm-authz-policy-safe-pattern Erzwingen Sie die sicheren Muster der AuthorizationPolicy 1.2.3
asm-policy-v0.0.1-asm-peer-authn-mesh-strict-mtls Erzwingen Sie die strikte mTLS PeerAuthentication auf Mesh-Ebene 1.3.1
asm-policy-v0.0.1-asm-peer-authn-strict-mtls Erzwingen Sie, dass alle PeerAuthentications keine strikten mTLS überschreiben können 1.3.2
asm-policy-v0.0.1-asm-request-authn-prohibited-output-headers Erzwingen, dass der jwtRulesoutputPayloadToHeader keine bekannten HTTP-Anfrageheader enthält 1.4.1

Bundle-Profile

Im Cloud Service Mesh-Sicherheitsrichtlinien-Bundle können Sie zwei Profile verwenden, die auf dem Strengheitsgrad basieren. Bei einem niedrigen Strengheitsgrad werden weniger Beschränkungen angewandt, was mehr Flexibilität bietet. Bei einem hohen Strengheitsgrad werden mehr Beschränkungen angewandt, was eine sicherere Richtlinienkontrolle ermöglicht.

Niedriger Strengheitsgrad

Für das Profil mit niedrigem Strengheitsgrad gelten folgende Richtlinieneinschränkungen:

  • Das Label istio:ingressgateway kann nur von Istio-Ingress-Gateway-Pods verwendet werden.

  • In AuthorizationPolicy können die Felder hosts oder notHosts nur verwendet werden, wenn das Istio-Ingress-Gateway mit dem Label istio:ingressgateway ausgewählt wird.

  • Wenn in AuthorizationPolicy die Felder methods oder notMethods verwendet werden, müssen die Werte Großbuchstaben sein.

  • Wenn in AuthorizationPolicy das Feld request.headers verwendet wird, dürfen die Werte keine Leerzeichen enthalten.

  • Wenn in AuthorizationPolicy die Felder paths oder notPaths verwendet werden, müssen die Werte normalisierte Werte sein.

Hoher Strengheitsgrad

Der hohe Strengheitsgrad umfasst alle Einschränkungen aus dem niedrigen Strengheitsgrad sowie die folgenden Einschränkungen:

  • Bei allen Arbeitslast-Pods kann die Annotation sidecar.istio.io/inject: false nicht angewendet werden, um die Proxy-Injektion zu umgehen.

  • Eine AuthorizationPolicy einer Mesh-Ebene, die eine Standardregel zum Ablehnen definiert, wird erzwungen.

  • Die AuthorizationPolicy muss entweder auf ALLOW-with-positive-matching oder DENY-with-negative-match folgen.

  • Wenn in AuthorizationPolicy die Felder hosts oder notHosts verwendet werden, müssen die Werte Paare von <host-name> und <host-name>:* sein.

  • Eine PeerAuthentication einer Mesh-Ebene, die strikte mTLS definiert, wird erzwungen.

  • Für alle PeerAuthentication im Mesh-Netzwerk kann der mTLS-Modus nur entweder UNSET oder STRICT sein, um strikter mTLS zu folgen.

Gruppierungseinstellungen

KPT-Setter Beschreibung
Strengheitsgrad Strengheitsgradsprofil des Cloud Service Mesh-Bundles, Optionen sind "Niedrig" oder "Hoch" (Standardeinstellung)

Hinweise

  1. Installieren und initialisieren Sie das Google Cloud CLI, das 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 v.1.11.2 oder höher in Ihrem Cluster mit der Standardbibliothek mit Einschränkungsvorlagen. Sie müssen auch die Unterstützung für referenzielle Einschränkungen aktivieren, da dieses Bundle referenzielle Einschränkungen enthält.
  3. Prüfen Sie, ob Cloud Service Mesh in Ihrem Cluster installiert ist.

Policy Controller für referenzielle Einschränkungen konfigurieren

  1. Speichern Sie das folgende YAML-Manifest als policycontroller-config.yaml:

    apiVersion: config.gatekeeper.sh/v1alpha1
    kind: Config
    metadata:
      name: config
      namespace: "gatekeeper-system"
    spec:
      sync:
        syncOnly:
          - group: ""
            version: "v1"
            kind: "Namespace"
          - group: "security.istio.io"
            version: "v1beta1"
            kind: "AuthorizationPolicy"
          - group: "security.istio.io"
            version: "v1beta1"
            kind: "PeerAuthentication"
    

    Dieses Manifest konfiguriert Policy Controller so, dass bestimmte Arten von Objekten beobachtet werden.

  2. Wenden Sie das policycontroller-config.yaml-Manifest an:

    kubectl apply -f policycontroller-config.yaml
    

Cloud Service Mesh-Richtlinien-Bundle prüfen

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 Cloud Service Mesh-Sicherheitsrichtlinien testen können, können Sie diese Einschränkungen im „Audit”-Modus bereitstellen, um Verstöße aufzudecken und vor allem selbst eine Gelegenheit zu geben, um sie 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

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

    kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/asm-policy-v0.0.1
    
  2. Wenden Sie die Richtlinieneinschränkungen mit kubectl an:

    kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/asm-policy-v0.0.1
    

    Die Ausgabe sieht so aus:

    asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-mesh-default-deny created
    asmauthzpolicynormalization.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-normalization created
    asmauthzpolicysafepattern.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-safe-pattern created
    asmingressgatewaylabel.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-ingressgateway-label created
    asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-mesh-strict-mtls created
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-strict-mtls created
    asmrequestauthnprohibitedoutputheaders.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-request-authn-prohibited-output-headers created
    asmsidecarinjection.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-sidecar-injection 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/bundles/asm-policy-v0.0.1
    

    Die Ausgabe sieht in etwa so aus:

    NAME                                                                                                       ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-mesh-default-deny   dryrun               0
    
    NAME                                                                                                     ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmauthzpolicynormalization.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-normalization   dryrun               0
    
    NAME                                                                                                  ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmauthzpolicysafepattern.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-safe-pattern   dryrun               0
    
    NAME                                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmingressgatewaylabel.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-ingressgateway-label   dryrun               0
    
    NAME                                                                                                     ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-mesh-strict-mtls   dryrun               0
    
    NAME                                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-strict-mtls   dryrun               0
    
    NAME                                                                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmrequestauthnprohibitedoutputheaders.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-request-authn-prohibited-output-headers   dryrun               0
    
    NAME                                                                                    ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmsidecarinjection.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-sidecar-injection   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 Cloud Service Mesh-Sicherheitsrichtlinien-Bundle von GitHub mit kpt herunter:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/asm-policy-v0.0.1
    
  3. Führen Sie die kpt-Funktion set-enforcement-action aus, um die Maßnahme der Richtlinien auf dryrun festzulegen:

    kpt fn eval asm-policy-v0.0.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \
      -- enforcementAction=dryrun
    
  4. Führen Sie die kpt-Setter-Funktion aus, um spezifische Felder für Cloud Service Mesh-Sicherheitsrichtlinien festzulegen:

    kpt fn eval asm-policy-v0.0.1 --image gcr.io/kpt-fn/apply-setters:v0.2.0 -- \
    strictness-level="Low"
    
  5. Initialisieren Sie das Arbeitsverzeichnis mit kpt, wodurch eine Ressource erstellt wird, um Änderungen verfolgen zu können:

    cd asm-policy-v0.0.1
    kpt live init
    
  6. Wenden Sie die Richtlinieneinschränkungen mit kpt an:

    kpt live apply
    

    Die Ausgabe sieht so aus:

    asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/asm-authz-policy-mesh-default-deny created
    asmauthzpolicynormalization.constraints.gatekeeper.sh/asm-authz-policy-normalization created
    asmauthzpolicysafepattern.constraints.gatekeeper.sh/asm-authz-policy-safe-pattern created
    asmingressgatewaylabel.constraints.gatekeeper.sh/asm-ingressgateway-label created
    asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/asm-peer-authn-mesh-strict-mtls created
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/asm-peer-authn-strict-mtls created
    asmsidecarinjection.constraints.gatekeeper.sh/asm-sidecar-injection created
    7 resource(s) applied. 7 created, 0 unchanged, 0 configured, 0 failed
    
  7. 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 Sie resourcegroup.yaml oder hängen es an .gitignore an:

    echo resourcegroup.yaml >> .gitignore
    

  2. Erstellen Sie ein dediziertes policies-Verzeichnis:

    mkdir -p policies
    
  3. Laden Sie das Cloud Service Mesh-Sicherheitsrichtlinien-Bundle von GitHub mit kpt herunter:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/asm-policy-v0.0.1 policies/asm-policy-v0.0.1
    
  4. Führen Sie die kpt-Funktion set-enforcement-action aus, um die Maßnahme der Richtlinien auf dryrun festzulegen:

    kpt fn eval policies/asm-policy-v0.0.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
    
  5. Führen Sie die kpt-Setter-Funktion aus, um spezifische Felder für Cloud Service Mesh-Sicherheitsrichtlinien festzulegen:

    kpt fn eval policies/asm-policy-v0.0.1 --image gcr.io/kpt-fn/apply-setters:v0.2.0 -- \
    strictness-level="Low"
    
  6. (Optional) Sehen Sie sich eine Vorschau der Richtlinieneinschränkungen an, die erstellt werden sollen:

    kpt live init policies/asm-policy-v0.0.1
    kpt live apply --dry-run policies/asm-policy-v0.0.1
    

    Die Ausgabe sieht so aus:

    Dry-run strategy: client
    inventory update started
    inventory update finished
    apply phase started
    asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-mesh-default-deny apply successful
    asmauthzpolicynormalization.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-normalization apply successful
    asmauthzpolicysafepattern.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-safe-pattern apply successful
    asmingressgatewaylabel.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-ingressgateway-label apply successful
    asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-mesh-strict-mtls apply successful
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-strict-mtls apply successful
    asmrequestauthnprohibitedoutputheaders.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-request-authn-prohibited-output-headers apply successful
    asmsidecarinjection.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-sidecar-injection apply successful
    apply phase finished
    inventory update started
    inventory update finished
    apply result: 8 attempted, 8 successful, 0 skipped, 0 failed
    
  7. Wenn Ihr Synchronisierungsverzeichnis für Config Sync Kustomize verwendet, fügen Sie policies/asm-policy-v0.0.1 Ihrer Stamm-kustomization.yaml hinzu. Andernfalls entfernen Sie die Datei policies/asm-policy-v0.0.1/kustomization.yaml:

    rm SYNC_ROOT_DIR/policies/asm-policy-v0.0.1/kustomization.yaml
    
  8. Übertragen Sie Änderungen per Push in das Config Sync-Repository:

    git add SYNC_ROOT_DIR/policies/asm-policy-v0.0.1
    git commit -m 'Adding ASM security policy audit enforcement'
    git push
    
  9. 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=asm-policy-v0.0.1 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'

Wenn Verstöße vorhanden sind, kann eine Liste der Verstoßmeldungen pro Einschränkung angezeigt werden; dazu nutzen Sie:

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

Erzwingungsaktion für das Cloud Service Mesh-Richtlinien-Bundle ä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

  1. Verwenden Sie kubectl, um die Maßnahme der Richtlinien auf warn festzulegen:

    kubectl get constraint -l policycontroller.gke.io/bundleName=asm-policy-v0.0.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 für Richtlinieneinschränkungen aktualisiert wurde:

    kubectl get constraint -l policycontroller.gke.io/bundleName=asm-policy-v0.0.1
    

kpt

  1. Führen Sie die kpt-Funktion set-enforcement-action aus, um die Maßnahme 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 Maßnahme der Richtlinien auf warn festzulegen:

    kpt fn eval policies/asm-policy-v0.0.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/asm-policy-v0.0.1
    git commit -m 'Adding ASM security 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: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: non-compliant-authz-policy
spec:
  action: ALLOW
  rules:
  - to:
    - operation:
        methods: ["get"]
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: [asm-policy-v0.0.1-asm-authz-policy-normalization] in rules-to-operation, methods or notMethods must be uppercase
authorizationpolicy.security.istio.io/non-compliant-authz-policy created

Cloud Service Mesh-Richtlinien-Bundle entfernen

Bei Bedarf kann das Cloud Service Mesh-Richtlinien-Bundle aus dem Cluster entfernt werden.

kubectl

  • Verwenden Sie kubectl, um die Richtlinien zu entfernen:

    kubectl delete constraint -l policycontroller.gke.io/bundleName=asm-policy-v0.0.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/asm-policy-v0.0.1
    git commit -m 'Removing Cloud Service Mesh  policies'
    git push
    
  2. 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.