GKE Enterprise bietet eine einheitliche Plattform für den Aufbau und die Bereitstellung sicherer Dienste mit integrierten Sicherheitsfunktionen auf jeder Ebene, die separat oder zusammen arbeiten können, um Sicherheitsprobleme zu vermeiden. In dieser Anleitung lernen Sie einige der leistungsstarken Sicherheitsfunktionen von GKE Enterprise mithilfe des Anthos-Beispiel-Deployments in Google Cloud kennen. Mit dem Anthos-Beispiel-Deployment wird eine praxisorientierte GKE Enterprise-Umgebung mit einem GKE-Cluster, Service Mesh und einer Bank of GKE Enterprise-Anwendung mit mehreren Mikrodiensten bereitgestellt.
Ziele
In dieser Anleitung lernen Sie einige der Sicherheitsfunktionen von GKE mithilfe der folgenden Aufgaben kennen:
Gegenseitige TLS (mTLS) in Ihrem Service Mesh durch Config Sync, um eine sichere Ende-zu-Ende-Kommunikation zu gewährleisten
Sicherheitsmechanismen einrichten, um sicherzustellen, dass Pods mit privilegierten Containern nicht versehentlich mithilfe von Policy Controller bereitgestellt werden.
Kosten
Für die Bereitstellung der Bank of Anthos-Anwendung fallen für GKE Enterprise in Google Cloud „Pay as you go“-Gebühren gemäß unserer Preisseite an, sofern Sie nicht bereits ein Abo erworben haben.
Sie sind auch für andere Google Cloud-Kosten verantwortlich, die während der Ausführung der Bank of Anthos-Anwendung entstehen, z. B. Gebühren für Compute Engine-VMs und Load-Balancer.
Wir empfehlen, nach Abschluss der Anleitung ein Clean-up durchzuführen, um weitere Kosten zu vermeiden.
Hinweise
Diese Anleitung ist ein Nachtrag zur Anleitung Anthos kennenlernen. Bevor Sie mit der Anleitung beginnen, folgen Sie der Anleitung auf dieser Seite, um Ihr Projekt einzurichten und das Anthos-Beispiel-Deployment zu installieren.
Cloud Shell-Umgebung einrichten
In dieser Anleitung verwenden Sie die Cloud Shell-Befehlszeile und den Editor, um Änderungen an der Clusterkonfiguration vorzunehmen.
Zum Initialisieren der Shell-Umgebung für diese Anleitung enthält das Anthos-Beispiel-Deployment ein Skript, das Folgendes ausführt:
Installiert alle fehlenden Befehlszeilentools, um interaktiv mit dem Deployment zu arbeiten und Änderungen daran zu prüfen:
Legt den Kubernetes-Kontext für
anthos-sample-cluster1
festKlont das Repository, das Config Sync zum Synchronisieren von Konfigurationsänderungen mit Ihrem Cluster verwendet. Änderungen, die Sie per Commit übertragen und an das vorgelagerte Repository übertragen haben, werden von Config Sync mit Ihrer Infrastruktur synchronisiert. Dies ist die empfohlene Vorgehensweise, um Änderungen an der Infrastruktur anzuwenden.
So richten Sie Ihre Umgebung ein:
Sie benötigen eine aktive Cloud Shell-Sitzung. Sie können Cloud Shell starten, indem Sie in der Google Cloud Console in Ihrem Anleitungsprojekt auf Cloud Shell aktivieren klicken.
Erstellen Sie ein Arbeitsverzeichnis:
mkdir tutorial cd tutorial
Laden Sie das Initialisierungsskript herunter:
curl -sLO https://github.com/GoogleCloudPlatform/anthos-sample-deployment/releases/latest/download/init-anthos-sample-deployment.env
Fügen Sie das Initialisierungsskript in Ihre Cloud Shell-Umgebung ein:
source init-anthos-sample-deployment.env
Ausgabe:
/google/google-cloud-sdk/bin/gcloud /google/google-cloud-sdk/bin/kubectl Your active configuration is: [cloudshell-13605] export PROJECT as anthos-launch-demo-1 export KUBECONFIG as ~/.kube/anthos-launch-demo-1.anthos-trial-gcp.config Fetching cluster endpoint and auth data. kubeconfig entry generated for anthos-sample-cluster1. Copying gs://config-management-release/released/latest/linux_amd64/nomos... \ [1 files][ 40.9 MiB/ 40.9 MiB] Operation completed over 1 objects/40.9 MiB. Installed nomos into ~/bin. Cloned ACM config repo: ./anthos-sample-deployment-config-repo
Wechseln Sie in das Konfigurations-Repository und verwenden Sie es als Arbeitsverzeichnis für den Rest dieser Anleitung:
cd anthos-sample-deployment-config-repo
mTLS in Ihrem Dienst-Mesh erzwingen
In Hinblick auf die globale Expansion hat Ihr CIO erzwungen, dass alle Nutzerdaten bei der Übertragung verschlüsselt werden müssen, um sensible Informationen gemäß den regionalen Datenschutzgesetzen zu schützen.
Ist Ihr Traffic derzeit sicher?
Rufen Sie die Seite Cloud Service Mesh in Ihrem Projekt auf, in dem Sie das Anthos-Beispiel-Deployment bereitgestellt haben:
Klicken Sie in der Liste der Dienste auf transactionhistory. Wie Sie in GKE Enterprise entdecken gesehen haben, werden auf der Seite mit den Dienstdetails alle Telemetriedaten für diesen Dienst angezeigt.
Wählen Sie auf der Seite transactionhistory im Menü Navigation die Option Verbundene Dienste aus. Hier können Sie die eingehende und ausgehende Verbindungen für den Dienst sehen. Ein entsperrtes Schloss-Symbol bedeutet, dass Traffic an diesem Port erkannt wurde, der kein gegenseitiges TLS (mTLS) verwendet.
mTLS ist ein Sicherheitsprotokoll, das garantiert, dass der Traffic zwischen beiden Diensten sicher und vertrauenswürdig ist. Jeder Dienst akzeptiert nur verschlüsselten Traffic von authentifizierten Diensten. Wie Sie sehen, zeigt Cloud Service Mesh deutlich, dass in Ihrem Mesh unverschlüsselter Traffic vorhanden ist. In Cloud Service Mesh werden unterschiedliche Farben verwendet, um anzugeben, ob der unverschlüsselte Traffic eine Mischung aus Klartext und mTLS (orange) oder nur Klartext (rot) enthält.
Mit GKE Enterprise sind es nur noch wenige Schritte, bis Sie die Vorgaben einhalten. Anstatt Änderungen auf Quellcodeebene vorzunehmen, Ihre Anwendung in dieser Situation neu zu erstellen und noch einmal bereitzustellen, können Sie die neue Verschlüsselungsrichtlinie mithilfe von Config Sync deklarativ durch Konfiguration anwenden, um Ihre neue Konfiguration automatisch aus einem zentralen Git-Repository bereitzustellen.
In diesem Abschnitt tun Sie Folgendes:
Sie passen die Richtlinienkonfiguration in Ihrem Git-Repository an, um zu erzwingen, dass Dienste verschlüsselte Kommunikation über mTLS verwenden.
Sie nutzen Config Sync, um die Richtlinienänderung automatisch aus dem Repository zu übernehmen und die Cloud Service Mesh-Richtlinie anzupassen.
Sie prüfen, ob die Richtlinienänderung auf Ihrem Cluster erfolgt ist, der für die Synchronisierung mit dem Repository konfiguriert ist.
Config Sync-Einrichtung bestätigen
Der
nomos
-Befehl ist ein Befehlszeilentool, mit dem Sie mit dem Config Management Operator interagieren und andere nützliche Config Sync-Aufgaben über Ihren lokalen Computer oder Cloud Shell ausführen können. Um zu prüfen, ob Config Sync korrekt auf Ihrem Cluster installiert und konfiguriert ist, führen Sienomos status
aus:nomos status
Ausgabe:
Connecting to clusters... Current Context Sync Status Last Synced Token Sync Branch Resource Status ------- ------- ----------- ----------------- ----------- --------------- * anthos-sample-cluster1 SYNCED abef0b01 master Healthy
Die Ausgabe bestätigt, dass Config Sync so konfiguriert ist, dass Ihr Cluster mit dem Master-Zweig Ihres Konfigurations-Repositorys synchronisiert wird. Das Sternchen in der ersten Spalte gibt an, dass der aktuelle Kontext auf
anthos-sample-cluster1
gesetzt ist. Wenn Sie dies nicht sehen, ändern Sie den aktuellen Kontext aufanthos-sample-cluster1
:kubectl config use-context anthos-sample-cluster1
Ausgabe:
Switched to context "anthos-sample-cluster1".
Prüfen Sie, ob Sie sich im
master
-Zweig befinden:git checkout master
Ausgabe:
Already on 'master' Your branch is up to date with 'origin/master'.
Prüfen Sie Ihr vorgelagertes Konfigurations-Repository:
git remote -v
Ausgabe:
origin https://source.developers.google.com/.../anthos-sample-deployment-config-repo (fetch) origin https://source.developers.google.com/.../anthos-sample-deployment-config-repo (push)
Prüfen Sie, ob Sie sich noch im Verzeichnis
anthos-sample-deployment-config-repo
befinden, und führen Sie den folgenden Befehl aus, um die Git-Einrichtung zu prüfen: Diese Hilfsfunktion wird vom Initialisierungsskript in Ihre Umgebung eingebunden und führtgit config
-Befehle aus, um die vorhandenenuser.email
- unduser.name
-Werte Ihrer Git-Konfiguration zu prüfen. Wenn diese Werte nicht konfiguriert sind, legt die Funktion Standardwerte auf Repository-Ebene anhand des derzeit aktiven Google Cloud-Kontos fest.init_git
Ausgabe (Beispiel):
Configured local git user.email to user@example.com Configured local git user.name to user
Sie können nun Änderungen an den Richtlinien im Repository speichern. Wenn Sie diese Commits in Ihr vorgelagertes Repository (Ursprung) übertragen, sorgt Config Sync dafür, dass die Änderungen auf den Cluster angewendet werden, für den Sie es konfiguriert haben.
Richtlinie zum Verschlüsseln des gesamten Diensttraffics aktualisieren
Die Konfiguration für Cloud Service Mesh wird mithilfe von YAML-Dateien deklarativ angegeben. Um den gesamten Diensttraffic zu verschlüsseln, müssen Sie sowohl die YAML-Datei mit den Traffictypen ändern, die von den Diensten angenommen werden können und die YAML-Datei, die den Typ des Traffics angibt, den Dienste an bestimmte Ziele senden.
Die erste YAML-Datei, die Sie sich vornehmen müssen, ist
namespaces/istio-system/peer-authentication.yaml
. Dabei handelt es sich um eine Authentifizierungsrichtlinie auf Mesh-Ebene, die angibt, welche Traffictypen alle Dienste in Ihrem Mesh-Netzwerk standardmäßig akzeptieren.cat namespaces/istio-system/peer-authentication.yaml
Ausgabe:
apiVersion: "security.istio.io/v1beta1" kind: "PeerAuthentication" metadata: name: "default" namespace: "istio-system" spec: mtls: mode: PERMISSIVE
Wie Sie sehen, ist der
PeerAuthentication
-mTLS-ModusPERMISSIVE
. Dies bedeutet, dass Dienste sowohl Klartext- als auch mTLS-Traffic akzeptieren.Ändern Sie
namespaces/istio-system/peer-authentication.yaml
so, dass nur verschlüsselte Kommunikation zwischen Diensten zulässig ist. Dazu setzen Sie den mTLS-Modus aufSTRICT
:cat <<EOF> namespaces/istio-system/peer-authentication.yaml apiVersion: "security.istio.io/v1beta1" kind: "PeerAuthentication" metadata: name: "default" namespace: "istio-system" spec: mtls: mode: STRICT EOF
Sehen Sie sich als Nächstes die Zielregel in
namespaces/istio-system/destination-rule.yaml
an. Damit werden Regeln zum Senden von Traffic an die angegebenen Ziele angegeben, einschließlich der Frage, ob der Traffic verschlüsselt ist. Der TLSmode lautetDISABLE
. Das bedeutet, dass Traffic als Klartext an alle übereinstimmenden Hosts gesendet wird.cat namespaces/istio-system/destination-rule.yaml
Ausgabe:
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: annotations: meshsecurityinsights.googleapis.com/generated: "1561996419000000000" name: default namespace: istio-system spec: host: '*.local' trafficPolicy: tls: mode: DISABLE
Ändern Sie
namespaces/istio-system/destination-rule.yaml
so, dass Istio eine Trafficrichtlinie festlegt, die TLS für alle übereinstimmenden Hosts im Cluster mit dem TLS-ModusISTIO_MUTUAL
aktiviert:cat <<EOF> namespaces/istio-system/destination-rule.yaml apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: annotations: meshsecurityinsights.googleapis.com/generated: "1561996419000000000" name: default namespace: istio-system spec: host: '*.local' trafficPolicy: tls: mode: ISTIO_MUTUAL EOF
Änderungen per Push in das Repository übertragen
Sie sind fast bereit, Ihre Konfigurationsänderungen zu übertragen. Wir empfehlen Ihnen jedoch, ein paar Prüfungen durchzuführen, bevor Sie mit dem Commit der Updates fortfahren.
Führen Sie
nomos vet
aus, um sicherzustellen, dass Ihre Konfiguration gültig ist:nomos vet
Keine Ausgabe bedeutet, dass keine Validierungsfehler aufgetreten sind.
Sobald Sie Ihre Änderungen per Push übertragen, übernimmt Config Sync sie und wendet sie auf Ihr System an. Um unerwartete Ergebnisse zu vermeiden, sollten Sie prüfen, ob sich der aktuelle Live-Status Ihrer Konfiguration seit der Bearbeitung geändert hat. Prüfen Sie mit
kubectl
, obdestinationrule
angibt, dass mTLS für den Cluster deaktiviert ist:kubectl get destinationrule default -n istio-system -o yaml
Ausgabe:
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule ... spec: host: '*.local' trafficPolicy: tls: mode: DISABLE
Führen Sie nun ein Commit und das Hochladen der Änderungen in das vorgelagerte Repository durch. Der folgende Befehl verwendet eine Hilfsfunktion mit dem Namen
watchmtls
, die vom Skriptinit
in Ihre Umgebung übergeben wurde. Diese Hilfsfunktion führt eine Kombination ausnomos status
und demkubectl
-Befehl aus, den Sie zuvor ausprobiert haben. Es prüft den Cluster auf Veränderungen, bis SieCtrl+C
gedrückt halten, um ihn zu beenden. Beobachten Sie die Anzeige, bis Sie sehen, dass die Änderungen auf dem Cluster angewendet und synchronisiert werden.git commit -am "enable mtls" git push origin master && watchmtls
Sie können die Änderungen auch auf den Cloud Service Mesh-Seiten unter GKE Enterprise aufrufen.
Zur Seite „Cloud Service Mesh“
Es sollte jetzt das rote Schlosssymbol Entsperrt angezeigt werden. Das Schlosssymbol wird orange (gemischt) angezeigt und nicht grün (vollständig verschlüsselter Traffic), da wir standardmäßig in der letzten Stunde mit einer Mischung aus mTLS und Klartext suchen. Wenn Sie die Seite nach einer Stunde noch einmal prüfen, sollten Sie ein grünes Schloss sehen, das anzeigt, dass Sie den gesamten Diensttraffic erfolgreich verschlüsselt haben.
Mit "Policy Controller" Sicherheitsmechanismen einrichten
Ihr Sicherheitsteam ist besorgt über potenzielle Root-Angriffe, die auftreten können, wenn Pods mit privilegierten Containern ausgeführt werden (Container mit Root-Zugriff). Während die aktuelle Konfiguration keine privilegierten Container bereitstellt, sollten Sie so viele Bedrohungsvektoren wie möglich schützen, die die Leistung beeinträchtigen oder sogar Kundendaten beeinträchtigen.
Trotz der Sorgfalt des Teams besteht weiterhin das Risiko, dass Sie im Rahmen zukünftiger Konfigurationsaktualisierungen durch den Continuous Delivery-Prozess anfällig für Root-Angriffe sind. Sie beschließen, einen Sicherheitsmechanismus einzurichten, der Schutz vor dieser Gefahr ermöglicht.
Sicherheitsmaßnahmen anwenden
Guardrails sind automatisierte administrative Steuerelemente, mit denen Richtlinien erzwungen werden können, um Ihre Umgebung zu schützen. Policy Controller bietet Unterstützung für das Definieren und Durchsetzen benutzerdefinierter Regeln, die nicht durch native Kubernetes-Objekte abgedeckt werden. Mit dem Policy Controller werden Prüfungen, Audits und Durchsetzungsmechanismen geprüft, die den speziellen Sicherheits-, behördlichen und organisatorischen Anforderungen Ihrer Organisation entsprechen.
Policy Controller verwenden
Policy Controller basiert auf einer Open-Source-Richtlinien-Engine namens Gatekeeper, die jedes Mal zum Erzwingen von Richtlinien verwendet wird, wenn eine Ressource im Cluster erstellt, aktualisiert oder gelöscht wird. Diese Richtlinien werden mithilfe von Einschränkungen aus der Vorlagenbibliothek "Policy Controller" oder anderen Gatekeeper-Einschränkungsvorlagen definiert.
Für das Anthos-Beispiel-Deployment in Google Cloud ist Policy Controller bereits installiert und die Vorlagenbibliothek "Policy Controller" ist aktiviert. Sie können diese Vorgehensweise bei der Implementierung Ihres Sicherheitsmechanismus nutzen, indem Sie eine vorhandene Einschränkung für privilegierte Container aus der Bibliothek verwenden.
Richtlinieneinschränkung für privilegierte Container anwenden
Zur Behebung des Problems Ihres Sicherheitsteams wenden Sie die Einschränkung K8sPSPPrivilegedContainer
an.
Durch diese Einschränkung wird verhindert, dass Pods mit privilegierten Containern ausgeführt werden.
Erstellen Sie im Cloud Shell-Terminal eine neue
constraint.yaml
-Datei mit dem Text aus der Bibliothekseinschränkung:cat <<EOF> ~/tutorial/anthos-sample-deployment-config-repo/cluster/constraint.yaml apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sPSPPrivilegedContainer metadata: name: psp-privileged-container spec: match: kinds: - apiGroups: [""] kinds: ["Pod"] excludedNamespaces: ["kube-system"] EOF
Prüfen Sie mit
nomos vet
, ob die aktualisierte Konfiguration gültig ist, bevor Sie sie anwenden.nomos vet
Der Befehl wird ohne Rückmeldung zurückgegeben, solange keine Fehler vorliegen.
Übernehmen Sie die Änderungen per Commit und übertragen Sie sie, um die Richtlinie anzuwenden. Sie können
nomos status
mit dem Befehlwatch
verwenden, um zu prüfen, ob die Änderungen auf den Cluster angewendet werden. Drücken SieCtrl+C
, um den Wiedergabebefehl zu beenden, wenn Sie fertig sind.git add . git commit -m "add policy constraint for privileged containers" git push && watch nomos status
Ausgabe:
Connecting to clusters... Current Context Sync Status Last Synced Token Sync Branch Resource Status ------- ------- ----------- ----------------- ----------- --------------- * anthos-sample-cluster1 SYNCED f2898e92 master Healthy
Richtlinie testen
Nachdem Sie die Richtlinie angewendet haben, können Sie sie testen, indem Sie versuchen, einen Pod mit einem privilegierten Container auszuführen.
Erstellen Sie im Cloud Shell-Terminal mit dem folgenden Befehl eine neue Datei im Verzeichnis der Anleitung,
nginx-privileged.yaml
, mit den Inhalten von diese Beispielspezifikation:cat <<EOF> ~/tutorial/nginx-privileged.yaml apiVersion: v1 kind: Pod metadata: name: nginx-privileged-disallowed labels: app: nginx-privileged spec: containers: - name: nginx image: nginx securityContext: privileged: true EOF
Versuchen Sie, den Pod mit
kubectl apply
zu starten.kubectl apply -f ~/tutorial/nginx-privileged.yaml
Ausgabe:
Error from server ([denied by psp-privileged-container] Privileged container is not allowed: nginx, securityContext: {"privileged": true}): error when creating "~/nginx-privileged.yaml": admission webhook "validation.gatekeeper.sh" denied the request: [denied by psp-privileged-container] Privileged container is not allowed: nginx, security Context: {"privileged": true}
Der Fehler zeigt, dass der Gatekeeper-Admission-Controller, der Ihre Kubernetes-Umgebung prüft, Ihre neue Richtlinie erzwungen hat. Die Ausführung des Pods wurde verhindert, da ein privilegierter Container in der Pod-Spezifikation vorhanden war.
Das Konzept der versionsgesteuerten Richtlinien, die Sie zur Einrichtung von Sicherheitsmechanismen mit Policy Controller anwenden können, ist eine leistungsfähige Maßnahme, da die Governance Ihrer Cluster standardisiert, vereinheitlicht und zentralisiert wird und Ihre Richtlinien über ein aktives Monitoring der Umgebung nach der Bereitstellung erzwungen werden.
Im Gatewaykeeper-Repository finden Sie viele weitere Arten von Richtlinien, die Sie als Sicherheitsmechanismen für Ihre Umgebung verwenden können.
Weitere Informationen zum Deployment
In dieser Anleitung haben Sie gelernt, wie Sie mit einigen GKE Enterprise-Sicherheitsfunktionen arbeiten können. In unserem Deployment gibt es aber noch viel mehr in GKE Enterprise zu sehen und zu tun. Sie können auch eine weitere Anleitung ausprobieren oder das Anthos-Beispiel-Deployment selbst in Google Cloud weiter kennenlernen, bevor Sie im nächsten Abschnitt die Bereinigungsanleitung befolgen.
Bereinigen
Nachdem Sie sich mit der Bank of Anthos-Anwendung vertraut gemacht haben, können Sie die in Google Cloud erstellten Ressourcen bereinigen, damit sie keine Kontingente verbrauchen und Sie dafür nicht künftig zahlen müssen.
Option 1: Sie können das Projekt löschen. Wenn Sie das Projekt jedoch behalten möchten, können Sie das Deployment mit Option 2 löschen.
Option 2: Wenn Sie Ihr aktuelles Projekt behalten möchten, können Sie die Beispielanwendung und den Beispielcluster mit
terraform destroy
löschen.
Projekt löschen (Option 1)
Sie vermeiden weitere Kosten am einfachsten, wenn Sie das für die Anleitung erstellte Projekt löschen.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Bereitstellung löschen (Option 2)
Bei diesem Ansatz werden die Bank of Anthos-Anwendung und der Cluster gelöscht, aber nicht das Projekt. Führen Sie die folgenden Befehle in Ihrer Cloud Shell aus:
Wechseln Sie in das Verzeichnis, in dem die Installationsscripts gehostet werden:
cd bank-of-anthos/iac/tf-anthos-gke
Löschen Sie das Beispiel und den Cluster:
terraform destroy
Geben Sie die Projekt-ID ein, wenn Sie dazu aufgefordert werden.
Wenn Sie ein neues Deployment vornehmen möchten, prüfen Sie, ob alle Anforderungen wie im Abschnitt Vorbereitung beschrieben erfüllt sind.
Nächste Schritte
In unserer GKE Enterprise-Dokumentation gibt es noch viel mehr zu entdecken.
Weitere Anleitungen ausprobieren
Informationen zur Dienstverwaltung mit dem Anthos-Beispiel-Deployment finden Sie unter Dienste mit GKE Enterprise verwalten.
Referenzarchitekturen, Diagramme und Best Practices zu Google Cloud kennenlernen. Weitere Informationen zu Cloud Architecture Center
Weitere Informationen zu GKE Enterprise
Weitere Informationen zu GKE Enterprise finden Sie in unserer Technische Übersicht.
Informationen zum Einrichten von GKE Enterprise in einer echten Produktionsumgebung finden Sie in unserer Einrichtungsanleitung.
Weitere Informationen zu Cloud Service Mesh finden Sie in der Dokumentation zu Cloud Service Mesh.
Weitere Informationen zum Policy Controller finden Sie in der Policy Controller-Richtlinie.
Weitere Informationen zur deklarativen, zentralisierten Konfiguration und Richtlinienverwaltung finden Sie in der Config Sync-Dokumentation und in der Dokumentation zu Policy Controller.