In dieser Anleitung erfahren Sie, was Autorisierung ist und wie Sie sie mit Cloud Service Mesh in einer Beispielanwendung aktivieren. Außerdem lernen Sie, wie Sie Autorisierungsrichtlinien für Ihre Mikrodienste aktivieren.
Sie erstellen eine AuthorizationPolicy, um den Zugriff auf einen Mikrodienst zu DENY (verweigern), und dann eine AuthorizationPolicy, um den Zugriff auf einen Mikrodienst zu ALLOW (zulassen).
Was ist Autorisierung?
Bei der Authentifizierung wird eine Identität überprüft: Ist dieser Dienst der, für den er sich ausgibt? Bei der Autorisierung wird die Berechtigung überprüft: Darf dieser Dienst das tun?
Die Identität ist für dieses Konzept von grundlegender Bedeutung. Mit Cloud Service Mesh können Sie mit AuthorizationPolicies die Kommunikation zwischen Arbeitslasten in Ihrem Mesh-Netzwerk steuern, um die Sicherheit und den Zugriff zu verbessern.
In einer Mikrodienstarchitektur, in der Aufrufe über Netzwerkgrenzen hinweg erfolgen, sind herkömmliche IP-basierte Firewallregeln oft nicht ausreichend, um den Zugriff zwischen Arbeitslasten zu sichern. Mit Cloud Service Mesh können Sie Autorisierungsregeln festlegen, um:
- den Zugriff auf Arbeitslasten in Ihrem Mesh-Netzwerk zu steuern, entweder von Arbeitslast zu Arbeitslast oder von Endnutzer zu Arbeitslast.
- Richtlinien je nach Bedarf allgemein oder detailliert zu definieren. Eine ausführliche Erklärung 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 Cloudverwendet:
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.
Stellen Sie verwaltetes Cloud Service Mesh auf einem GKE-Cluster bereit. 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
kubectlauf den Cluster fest:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATIONErstellen Sie einen Namespace für Ihr Ingress-Gateway:
kubectl create namespace asm-ingressAktivieren Sie den Namespace für die Injektion. Die Schritte hängen vom Cloud Service Mesh-Typ ab (entweder verwaltet oder im Cluster):
Verwaltet
Wenden Sie das Überarbeitungslabel
asm-managedauf den Namespace an:kubectl label namespace asm-ingress \ istio-injection- istio.io/rev=asm-managed --overwriteDieses Label entspricht der aktuellen Release-Version des verwalteten Cloud Service Mesh Release-Kanal für die Cloud Service Mesh-Version.
Clusterintern
Verwenden Sie den folgenden Befehl, um das Überarbeitungslabel für
istiodzu 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
REVISIONder Wert des Überarbeitungslabelsistiod, den Sie im vorherigen Schritt notiert haben.kubectl label namespace asm-ingress \ istio-injection- istio.io/rev=REVISION --overwrite
Stellen Sie das Beispiel-Gateway im Repository
anthos-service-mesh-samplesbereit:kubectl apply -n asm-ingress \ -f docs/shared/asm-ingress-gatewayErwartete Ausgabe:
serviceaccount/asm-ingressgateway configured service/asm-ingressgateway configured deployment.apps/asm-ingressgateway configured gateway.networking.istio.io/asm-ingressgateway configured
Beispielanwendung für Online-Boutique bereitstellen
Wenn Sie es noch nicht getan haben, legen Sie den aktuellen Kontext für
kubectlauf den Cluster fest:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATIONErstellen Sie den Namespace für die Beispielanwendung:
kubectl create namespace onlineboutiqueLabeln Sie den Namespace
onlineboutique, um Envoy-Proxys automatisch einzuschleusen. Folgen Sie der Anleitung, um die automatische Sidecar-Injektion zu aktivieren.Stellen Sie die Beispielanwendung, den
VirtualServicefür das Frontend und Dienstkonten für die Arbeitslasten bereit. Im Rahmen dieser Anleitung stellen Sie die Mikrodienst-Demo-App „Online Boutique“ bereit.kubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/virtual-service.yaml kubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/service-accounts
Dienste aufrufen
Rufen Sie die Pods im Namespace
onlineboutiqueauf:kubectl get pods -n onlineboutiqueErwartete 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 2m7sAlle Pods für Ihre Anwendung sollten mit dem Wert
2/2in der SpalteREADYausgeführt werden. Dieser Wert weist darauf hin, dass die Pods einen Envoy-Sidecar-Proxy erfolgreich eingefügt haben. Wenn nach einigen Minuten nicht2/2angezeigt wird, lesen Sie die Anleitung 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 27mRufen Sie die Adresse
EXTERNAL-IPin Ihrem Webbrowser auf. Sie sollten den Online-Boutique-Shop in Ihrem Browser sehen.
`DenyAll`-Autorisierung für eine Arbeitslast
In diesem Abschnitt wird eine AuthorizationPolicy hinzugefügt, um den gesamten eingehenden Traffic zum Währungsservice zu verweigern.
AuthorizationPolicies funktionieren, indem sie AuthorizationPolicies in Envoy-lesbare Konfigurationen umwandeln und die Konfigurationen auf Ihre Sidecar-Proxys anwenden. Dadurch kann der Envoy-Proxy eingehende Anfragen an einen Dienst autorisieren oder verweigern.
Wenden Sie eine
AuthorizationPolicyauf dencurrencyservicean. Beachten Sie die Übereinstimmung mit dem Labelcurrencyservicein der YAML-Datei.kubectl apply -f docs/authorization/currency-deny-all.yaml -n onlineboutiqueVersuchen Sie, auf die
EXTERNAL-IPIhres Gateways zuzugreifen, um Online Boutique im Webbrowser aufzurufen. Sie sollten einen Autorisierungsfehler (500 Interner Serverfehler) vomcurrency servicesehen.
Sidecar-Proxy-Logs beobachten
Wenn Sie sehen möchten, was im Sidecar-Proxy passiert, können Sie die Logs im Pod prüfen.
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 Logs auf Trace-Ebene zugelassen werden. Standardmäßig werden blockierte Autorisierungsaufrufe nicht protokolliert:
kubectl exec -it $CURRENCY_POD -n onlineboutique -c istio-proxy -- curl -X POST "http://localhost:15000/logging?level=trace"Erwartete Ausgabe:
active loggers: admin: trace alternate_protocols_cache: trace ... tracing: trace upstream: trace udp: trace wasm: traceVerwenden Sie
curl, um Traffic an IhreEXTERNAL_IPzu senden, um Logs zu generieren:for i in {0..10}; do curl -s -I $FRONTEND_IP ; doneRufen 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 rbacErwartete 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 Logs sollte die Meldung enforced denied angezeigt werden, die darauf hinweist, dass currencyservice so festgelegt ist, dass eingehende Anfragen blockiert werden.
Eingeschränkten Zugriff zulassen
Anstelle einer DENYALL-Richtlinie können Sie den Zugriff für bestimmte Arbeitslasten zulassen. Dies ist in einer Mikrodienstarchitektur relevant, in der Sie sicherstellen möchten, dass nur autorisierte Dienste miteinander kommunizieren können.
In diesem Abschnitt aktivieren Sie die Möglichkeit für die Dienste frontend und checkout, mit dem Dienst currency zu kommunizieren.
- In der folgenden Datei sehen Sie, dass eine bestimmte
source.principal(Client) auf der Zulassungsliste für den Zugriff aufcurrencyservicesteht:
Wenden Sie die Richtlinie an:
kubectl apply -f docs/authorization/currency-allow-frontend-checkout.yaml -n onlineboutique
- Rufen Sie die
EXTERNAL-IPin 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.
Damit Ihrem Google Cloud Konto die in dieser Anleitung verwendeten Ressourcen nicht weiterhin in Rechnung gestellt werden, können Sie entweder das Projekt löschen oder die einzelnen Ressourcen löschen.
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 onlineboutiqueErwartete Ausgabe:
namespace "onlineboutique" deletedLöschen Sie den Namespace des Ingress-Gateways:
kubectl delete namespace asm-ingressErwartete 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
PeerAuthenticationRichtlinien finden Sie unter Transportsicherheit konfigurieren. - In dieser Anleitung erfahren Sie, wie Sie den Sicherheitsstatus Ihres Clusters und Ihrer Anwendung verbessern können: Sicherheit Ihrer Anwendung mit Cloud Service Mesh, Config Sync und Policy Controller erhöhen.
- Sehen Sie sich das Sicherheits-Dashboard Ihres Mesh-Netzwerks an: Mesh-Sicherheit überwachen.
- Weitere Informationen zu Autorisierungsrichtlinien finden Sie unter Erweiterte Features der Autorisierungsrichtlinie konfigurieren.
- Machen Sie sich mit den Best Practices für die Sicherheit von Cloud Service Mesh vertraut.