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 Felderhosts
odernotHosts
nur verwendet werden, wenn das Istio-Ingress-Gateway mit dem Labelistio:ingressgateway
ausgewählt wird.Wenn in
AuthorizationPolicy
die Feldermethods
odernotMethods
verwendet werden, müssen die Werte Großbuchstaben sein.Wenn in
AuthorizationPolicy
das Feldrequest.headers
verwendet wird, dürfen die Werte keine Leerzeichen enthalten.Wenn in
AuthorizationPolicy
die Felderpaths
odernotPaths
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 Felderhosts
odernotHosts
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 entwederUNSET
oderSTRICT
sein, um strikter mTLS zu folgen.
Gruppierungseinstellungen
KPT-Setter | Beschreibung |
---|---|
Strengheitsgrad | Strengheitsgradsprofil des Cloud Service Mesh-Bundles, Optionen sind "Niedrig" oder "Hoch" (Standardeinstellung) |
Hinweise
- 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 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.
- Prüfen Sie, ob Cloud Service Mesh in Ihrem Cluster installiert ist.
Policy Controller für referenzielle Einschränkungen konfigurieren
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.
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
(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
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
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
Installieren und richten Sie kpt ein. kpt wird in dieser Anleitung verwendet, um Kubernetes-Ressourcen anzupassen und bereitzustellen.
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
Führen Sie die kpt-Funktion
set-enforcement-action
aus, um die Maßnahme der Richtlinien aufdryrun
festzulegen:kpt fn eval asm-policy-v0.0.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \ -- enforcementAction=dryrun
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"
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
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
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 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
Führen Sie die kpt-Funktion
set-enforcement-action
aus, um die Maßnahme der Richtlinien aufdryrun
festzulegen:kpt fn eval policies/asm-policy-v0.0.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
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"
(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
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 Dateipolicies/asm-policy-v0.0.1/kustomization.yaml
:rm SYNC_ROOT_DIR/policies/asm-policy-v0.0.1/kustomization.yaml
Ü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
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
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"}]'
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
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/asm-policy-v0.0.1 -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/asm-policy-v0.0.1 git commit -m 'Adding ASM security 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: 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:
Ü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
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.