In dieser Anleitung erfahren Sie, was Autorisierung ist und wie Sie sie mit Cloud Service Mesh in einer Beispielanwendung aktivieren. Außerdem erfahren Sie, wie Sie Autorisierungsrichtlinien für Ihre Mikrodienste aktivieren. Sie erstellen ein
AuthorizationPolicy
, um DENY
-Zugriff auf einen Mikrodienst zu gewähren, dann erstellen Sie einen
AuthorizationPolicy
für den ALLOW
-spezifischen Zugriff auf einen Mikrodienst.
Was ist Autorisierung?
Mit der Authentifizierung wird eine Identität bestätigt. Ist dieser Dienst die Identität, für die sie sich ausgeben?
Die Autorisierung bestätigt die Berechtigung. Darf dieser Dienst das tun?
Identität ist für diese Idee von grundlegender Bedeutung. Mit dem Cloud Service Mesh
AuthorizationPolicies
ermöglichen die Kommunikation zwischen Arbeitslasten in Ihrem
für mehr Sicherheit und Zugang
zu sorgen.
In einer Mikrodienstarchitektur, in der Aufrufe über Netzwerkgrenzen hinweg erfolgen, IP-basierte Firewallregeln reichen oft nicht aus, um den Zugriff zwischen Arbeitsbelastungen. Mit Cloud Service Mesh können Sie Autorisierungsregeln für Folgendes festlegen:
- Steuern Sie den Zugriff auf Arbeitslasten in Ihrem Mesh, entweder Arbeitslast-zu-Arbeitslast oder end-user-to-workload
- Definieren Sie Richtlinien je nach Ihren Anforderungen breit oder detailliert.
Ausführliche Informationen zum Konfigurieren von Richtlinien und Best Practices finden Sie unter Autorisierung mit Cloud Service Mesh.
Kosten
In dieser Anleitung werden die folgenden kostenpflichtigen Komponenten von Google Cloud verwendet:
Nach Abschluss dieser Anleitung können Sie weitere Kosten durch Löschen von erstellten Ressourcen vermeiden. Weitere Informationen finden Sie unter Bereinigen.
Hinweis
Achten Sie darauf, dass die Abrechnung für Ihr Projekt aktiviert ist.
Cloud Service Mesh in einem GKE-Cluster bereitstellen. Es gibt verschiedene unterstützte Einrichtungsmethoden:
Klonen Sie das Repository:
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples cd anthos-service-mesh-samples
Ingress-Gateway bereitstellen
Legen Sie den aktuellen Kontext für
kubectl
auf den Cluster fest:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Erstellen Sie einen Namespace für Ihr Ingress-Gateway:
kubectl create namespace asm-ingress
Aktivieren Sie den Namespace für die Injection: Die Schritte hängen von Ihrer Steuerungsebenenimplementierung ab.
Verwaltet (TD)
Wenden Sie das Standard-Injection-Label auf den Namespace an:
kubectl label namespace asm-ingress \ istio.io/rev- istio-injection=enabled --overwrite
Verwaltet (Istiod)
Empfohlen: Führen Sie den folgenden Befehl aus, um das Standard-Injektionslabel auf den Namespace anzuwenden:
kubectl label namespace asm-ingress \ istio.io/rev- istio-injection=enabled --overwrite
Bereits bestehende Nutzer der verwalteten Istio-Steuerungsebene: Wir empfehlen die Standard-Injection, aber auch die revisionsbasierte Injection wird unterstützt. Gehe dazu so vor:
Führen Sie den folgenden Befehl aus, um die verfügbaren Release-Versionen zu finden:
kubectl -n istio-system get controlplanerevision
Die Ausgabe sieht in etwa so aus:
NAME AGE asm-managed-rapid 6d7h
In der Ausgabe ist der Wert in der Spalte
NAME
das Überarbeitungslabel, das der verfügbaren Release-Version für die Cloud Service Mesh-Version entspricht.Wenden Sie das Überarbeitungslabel auf den Namespace an.
kubectl label namespace asm-ingress \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
Clusterintern
Empfohlen:Führen Sie den folgenden Befehl aus, um das Standard-Injection-Label auf den Namespace anzuwenden:
kubectl label namespace asm-ingress \ istio.io/rev- istio-injection=enabled --overwrite
Wir empfehlen die Verwendung der Standard-Injection, aber auch die revisionsbasierte Injection wird unterstützt: Folgen Sie dazu dieser Anleitung:
Verwenden Sie den folgenden Befehl, um das Überarbeitungslabel für
istiod
zu finden:kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
Wenden Sie das Überarbeitungslabel auf den Namespace an. Im folgenden Befehl ist
REVISION_LABEL
der Wert des Überarbeitungslabelsistiod
, den Sie im vorherigen Schritt notiert haben.kubectl label namespace asm-ingress \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
Stellen Sie das Beispielgateway im Repository
anthos-service-mesh-samples
bereit:kubectl apply -n asm-ingress \ -f docs/shared/asm-ingress-gateway
Erwartete Ausgabe:
serviceaccount/asm-ingressgateway configured service/asm-ingressgateway configured deployment.apps/asm-ingressgateway configured gateway.networking.istio.io/asm-ingressgateway configured
Beispielanwendung Online Boutique bereitstellen
Falls nicht, legen Sie den aktuellen Kontext für
kubectl
auf den Cluster fest:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Erstellen Sie den Namespace für die Beispielanwendung:
kubectl create namespace onlineboutique
Fügen Sie dem Namespace
onlineboutique
ein Label hinzu, um Envoy-Proxys automatisch einzufügen. Führen Sie die Schritte zum Aktivieren der automatischen Sidecar-Einfügung aus.Stellen Sie die Beispielanwendung, die
VirtualService
für das Front-End und die Dienstkonten für die Arbeitslasten bereit. In dieser Anleitung stellen Sie Online Boutique bereit, eine Mikrodienst-Demo-App.kubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/virtual-service.yaml kubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/service-accounts
Meine Dienste ansehen
Sehen Sie sich die Pods im Namespace
onlineboutique
an:kubectl get pods -n onlineboutique
Erwartete Ausgabe:
NAME READY STATUS RESTARTS AGE adservice-85598d856b-m84m6 2/2 Running 0 2m7s cartservice-c77f6b866-m67vd 2/2 Running 0 2m8s checkoutservice-654c47f4b6-hqtqr 2/2 Running 0 2m10s currencyservice-59bc889674-jhk8z 2/2 Running 0 2m8s emailservice-5b9fff7cb8-8nqwz 2/2 Running 0 2m10s frontend-77b88cc7cb-mr4rp 2/2 Running 0 2m9s loadgenerator-6958f5bc8b-55q7w 2/2 Running 0 2m8s paymentservice-68dd9755bb-2jmb7 2/2 Running 0 2m9s productcatalogservice-84f95c95ff-c5kl6 2/2 Running 0 114s recommendationservice-64dc9dfbc8-xfs2t 2/2 Running 0 2m9s redis-cart-5b569cd47-cc2qd 2/2 Running 0 2m7s shippingservice-5488d5b6cb-lfhtt 2/2 Running 0 2m7s
Alle Pods für Ihre Anwendung sollten mit dem Wert
2/2
in der SpalteREADY
ausgeführt werden. Dieser Wert weist darauf hin, dass die Pods einen Envoy-Sidecar-Proxy erfolgreich eingefügt haben. Wenn2/2
nach einigen Minuten nicht angezeigt wird, lesen Sie den Leitfaden zur Fehlerbehebung.Rufen Sie die externe IP-Adresse ab und legen Sie sie auf eine Variable fest:
kubectl get services -n asm-ingress export FRONTEND_IP=$(kubectl --namespace asm-ingress \ get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}' \ )
Die Ausgabe sollte in etwa so aussehen:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE asm-ingressgateway LoadBalancer 10.19.247.233 35.239.7.64 80:31380/TCP,443:31390/TCP,31400:31400/TCP 27m
Rufen Sie in Ihrem Webbrowser die Adresse
EXTERNAL-IP
auf. Sie sollten zum Online-Boutique-Shop in Ihrem Browser.
DenyAll-Autorisierung für eine Arbeitslast
In diesem Abschnitt wird ein AuthorizationPolicy
hinzugefügt, um den gesamten eingehenden Traffic für den
Währungsservice. AuthorizationPolicies
funktioniert, indem AuthorizationPolicies
in Envoy-lesbare Konfigurationen umgewandelt und die Konfigurationen auf Ihre Sidecar-Proxys angewendet werden. So kann der Envoy-Proxy eingehende Anfragen an einen Dienst autorisieren oder ablehnen.
Wenden Sie ein
AuthorizationPolicy
auf diecurrencyservice
an. Beachten Sie die Übereinstimmung mit dem Labelcurrencyservice
in der YAML-Datei.kubectl apply -f docs/authorization/currency-deny-all.yaml -n onlineboutique
Versuchen Sie, über die
EXTERNAL-IP
Ihres Gateways auf Online Boutique im Webbrowser zuzugreifen. Du solltest voncurrency service
einen Autorisierungsfehler (500 Interner Dienstfehler) erhalten.
Sidecar-Proxy-Logs beobachten
Um zu sehen, was im Sidecar-Proxy geschieht, können Sie die Logs in der Pod.
Rufen Sie den Namen Ihres
currencyservice
-Pods ab:CURRENCY_POD=$(kubectl get pod -n onlineboutique |grep currency|awk '{print $1}')
Legen Sie den Envoy-Proxy so fest, dass Protokolle auf Trace-Ebene zulässig sind. Blockierte Autorisierungsanfragen werden standardmäßig nicht protokolliert:
kubectl debug --image istio/base --target istio-proxy -it $CURRENCY_POD -n onlineboutique -- curl -X POST "http://localhost:15000/logging?level=trace"
Erwartete Ausgabe:
none {:.devsite-disable-click-to-copy} active loggers: admin: trace alternate_protocols_cache: trace ... tracing: trace upstream: trace udp: trace wasm: trace
Verwenden Sie
curl
, um Traffic an IhreEXTERNAL_IP
zu senden und Protokolle zu generieren:for i in {0..10}; do curl -s -I $FRONTEND_IP ; done
Rufen Sie die Logs zur rollenbasierten Zugriffssteuerung (Role-Based Access Control, RBAC) in Ihrem Istio-Proxy auf:
kubectl logs -n onlineboutique $CURRENCY_POD -c istio-proxy | grep -m5 rbac
Erwartete Ausgabe:
2022-07-08T14:19:20.442920Z debug envoy rbac checking request: requestedServerName: outbound_.7000_._.currencyservice.onlineboutique.svc.cluster.local, sourceIP: 10.8.8.5:34080, directRemoteIP: 10.8.8.5:34080, remoteIP: 10.8.8.5:34080,localAddress: 10.8.0.6:7000, ssl: uriSanPeerCertificate: spiffe://christineskim-tf-asm.svc.id.goog/ns/onlineboutique/sa/default, dnsSanPeerCertificate: , subjectPeerCertificate: OU=istio_v1_cloud_workload,O=Google LLC,L=Mountain View,ST=California,C=US, headers: ':method', 'POST' 2022-07-08T14:19:20.442944Z debug envoy rbac enforced denied, matched policy none 2022-07-08T14:19:20.442965Z debug envoy http [C73987][S13078781800499437460] Sending local reply with details rbac_access_denied_matched_policy[none] ```
In den Protokollen sollte eine enforced denied
-Meldung angezeigt werden, aus der hervorgeht, dass currencyservice
so konfiguriert ist, dass eingehende Anfragen blockiert werden.
Eingeschränkten Zugriff zulassen
Anstelle einer DENYALL
-Richtlinie können Sie den Zugriff für bestimmte
Arbeitsbelastungen. Dies ist in einer Mikrodienstarchitektur relevant, wenn Sie dafür sorgen möchten, dass nur autorisierte Dienste miteinander kommunizieren können.
In diesem Abschnitt aktivieren Sie die Kommunikation zwischen den Diensten frontend
und checkout
und dem Dienst currency
.
- In der folgenden Datei ist zu sehen, dass eine bestimmte
source.principal
(Client) aufcurrencyservice
zugreifen darf:
Wenden Sie die Richtlinie an:
kubectl apply -f docs/authorization/currency-allow-frontend-checkout.yaml -n onlineboutique
Rufen Sie
EXTERNAL-IP
in Ihrem Webbrowser auf. Sie sollten jetzt auf Online Boutique zugreifen können.
Bereinigen
Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.
So vermeiden Sie, dass Ihrem Google Cloud-Konto weitere Gebühren für die in dieser Anleitung verwendeten Ressourcen, können Sie entweder Projekt löschen oder Projekt löschen einzelnen Ressourcen.
Projekt löschen
Löschen Sie das Projekt in Cloud Shell:
gcloud projects delete PROJECT_ID
Ressourcen löschen
Wenn Sie den Cluster behalten und das Online Boutique-Beispiel entfernen möchten:
Löschen Sie die Anwendungs-Namespaces:
kubectl delete namespace onlineboutique
Erwartete Ausgabe:
namespace "onlineboutique" deleted
Löschen Sie den Namespace des Ingress-Gateways:
kubectl delete namespace asm-ingress
Erwartete Ausgabe:
amespace "asm-ingress" deleted
Wenn Sie zusätzliche Gebühren vermeiden möchten, löschen Sie den Cluster:
gcloud container clusters delete CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Nächste Schritte
- Eine allgemeine Anleitung zum Konfigurieren von
PeerAuthentication
-Richtlinien finden Sie unter Transportsicherheit konfigurieren. - Informationen zum Sicherheitsdashboard Ihres Mesh finden Sie unter Mesh-Sicherheit überwachen.
- Ausführliche Informationen zu Autorisierungsrichtlinien unter Erweiterte Funktionen für Autorisierungsrichtlinien konfigurieren
- Machen Sie sich mit den Best Practices für die Sicherheit von Cloud Service Mesh vertraut.