Die Anthos Service Mesh-Nutzerauthentifizierung ist eine integrierte Lösung für die browserbasierte Endnutzerauthentifizierung und Zugriffssteuerung für Ihre bereitgestellten Arbeitslasten. Sie ermöglicht die Einbindung in vorhandene Identitätsanbieter (Identity Providers, IdP) für die Nutzerauthentifizierung und verwendet Istio APIs und Autorisierungsrichtlinien für die Zugriffsverwaltung. Dies ist eine nutzerfreundliche Alternative zur JWT-Authentifizierung (JSON Web Token) von Istio.
Ein typischer Anwendungsfall ist, wenn eine Organisation Anthos Service Mesh verwendet, um eine Webanwendung zu hosten, auf die ihre Mitarbeiter über einen Webbrowser zugreifen können. Darüber hinaus muss die Organisation ihren vorhandenen Identitätsanbieter verwenden, um die Nutzeridentitäten zu verwalten. Die Nutzerauthentifizierung von Anthos Service Mesh erleichtert Nutzern die Authentifizierung über einen standardmäßigen webbasierten Anmelde- und Einwilligungsvorgang über OpenID Connect (OIDC). Wenn der Nutzer sich authentifiziert, erzwingt Anthos Service Mesh Istio-Autorisierungsrichtlinien und überträgt bei der erfolgreichen Autorisierung die Identität in einem sicheren Anmeldedatenformat an Arbeitslasten.
Funktionsweise
Die Nutzerauthentifizierung von Anthos Service Mesh führt die neue Komponente authservice
ein.
Diese Komponente lässt sich in den Envoy-basierten Ingress als externen Autorisierungsdienst einbinden, der alle eingehenden Authentifizierungsanfragen abfängt. authservice
implementiert die Clientseite des OIDC-Protokolls und ermöglicht dem Nutzer den Zugriff auf Anwendungen über einen Browser, wobei Nutzer eine interaktive Authentifizierung und Einwilligung erteilen, um eine kurzlebige Sitzung einzurichten.
authservice
implementiert Branchenstandardprotokolle zur Integration in jeden Identitätsanbieter, der als OIDC-Autorisierungsserver fungieren kann. Wenn der Nutzer authentifiziert wird, sind die Hauptinformationen in einem RCToken
im JWT-Format gekapselt, das von authservice
signiert ist und an die Istio-Autorisierungsebene im eingehenden Traffic weitergeleitet wird. Dieses Modell bietet Perimeterzugriffssteuerung für den Traffic in das Mesh. Wenn der Nutzer berechtigt ist, auf eine Ressource zuzugreifen, wird dieses RCToken auch an die Mikrodienste weitergeleitet, um Hauptinformationen abzurufen und eine detaillierte Zugriffssteuerung zu erzwingen.
Das folgende Diagramm zeigt den Standort von authservice
im Mesh-Netzwerk und dessen Bezug zu den anderen Teilen des Mesh-Netzwerks. Dazu zählen der eingehende Traffic, Arbeitslasten und der Browser des Nutzers sowie ein vorhandener IdP.
Administratoren können authservice
als Add-on für eine Anthos Service Mesh-Installation installieren. Nach der Installation liest authservice
die OIDC-Endpunktkonfiguration und andere zugehörige Einstellungen, die in der benutzerdefinierten Ressource UserAuth
definiert sind. Der Administrator kann die Anthos Service Mesh ExternalAuthorization
APIs verwenden, um auth_server
als Filter für den eingehenden Traffic zu konfigurieren.
Nutzerauthentifizierungsdienst installieren
In den folgenden Schritten wird erläutert, wie authservice
konfiguriert wird.
Vorbereitung
Führen Sie die folgenden Schritte aus, um sicherzustellen, dass Sie die Voraussetzungen erfüllen.
Installation mithilfe des Overlays für die Nutzerauthentifizierung anpassen
Zum Installieren des Nutzerauthentifizierungsdienstes müssen Sie die ASM-Installation anpassen, um einen externen Autorisierungsanbieter auf Mesh-Ebene hinzuzufügen.
Rufen Sie das Beispiel-Overlay zur Nutzerauthentifizierung ab und aktualisieren Sie es, wenn in Ihrem Mesh Anpassungen vorgenommen werden. Es wird empfohlen, diese Overlay-Datei in Ihrer Versionsverwaltung zu pflegen.
curl https://raw.githubusercontent.com/GoogleCloudPlatform/asm-user-auth/release-0.1/overlay/user-auth-overlay.yaml > user-auth-overlay.yaml
Folgen Sie der Anleitung zum Installieren von ASM mit Overlay, um Anthos Service Mesh mit einem von Google bereitgestellten Skript mit dem Overlay zur Nutzerauthentifizierung zu installieren. Beispiel:
/install_asm \ --project_id "PROJECT_ID" \ --cluster_name "CLUSTER_NAME" \ --cluster_location "CLUSTER_LOCATION" \ --mode install \ --enable_all \ --custom_overlay user-auth-overlay.yaml
Die
kpt
-Pakete für die Nutzerauthentifizierung erstellen eineAuthorizationPolicy
, die auf den vonpkg/ext-authz.yaml
angegebenen externen Autorisierungsanbieter verweist.
Konfiguration des OIDC-Clients vorbereiten
Legen Sie die OIDC-Clientkonfiguration mit den folgenden Schritten fest. In dieser Anleitung wird Google als IDP verwendet. Sie können aber auch jeden IDP verwenden, der die OIDC-Authentifizierung unterstützt.
Rufen Sie in der Google Cloud Console API & Dienste > Anmeldedaten auf.
Wechseln Sie zu Anmeldedaten erstellen und wählen Sie OAuth-Client-ID aus. Legen Sie gegebenenfalls die Optionen für den OAuth-Zustimmungsbildschirm fest und konfigurieren Sie die folgenden Optionen:
- Setzen Sie den Anwendungstyp auf Webanwendung.
- Setzen Sie Autorisierter Weiterleitungs-URI auf
https://localhost:8443/_gcp_anthos_callback
.
Klicken Sie anschließend auf Speichern.
Speichern Sie die Client-ID und den Clientschlüssel, um sie später zu verwenden:
export OIDC_CLIENT_ID='<your-client-id>' export OIDC_CLIENT_SECRET='<your-client-secret>' export OIDC_ISSUER_URI='https://accounts.google.com'
kpt
-Pakete herunterladen
Führen Sie die folgenden Schritte aus, um die empfohlene authservice
-Konfiguration aus dem öffentlichen Repository zu installieren.
Diese Befehle rufen den neuesten authservice
-Container ab und starten ihn als Pod im Namespace asm-user-auth
. Darüber hinaus wird der Ingress so konfiguriert, dass alle Anfragen abgefangen werden.
Rufen Sie das kpt-Paket ab:
kpt pkg get https://github.com/GoogleCloudPlatform/asm-user-auth@release-0.1 . cd asm-user-auth/
Weiterleitungs-URL und -Secret für Ingress-Gateway festlegen
OAuth2
erfordert eine Weiterleitungs-URL, die auf einem HTTPS-geschützten Endpunkt gehostet wird. Diese Befehle dienen als Beispiel und vereinfachen die Einrichtung, da ein selbst signiertes Zertifikat für das Istio-Ingress-Gateway generiert wird. In einer Produktionsbereitstellung sollten keine selbst signierten Zertifikate verwendet werden.
Generieren Sie ein selbstsigniertes Zertifikat:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem \ -days 365 -nodes -subj '/CN=localhost'
Erstellen Sie ein Secret für das Ingress-Gateway, um HTTPS-Traffic zu hosten:
kubectl create -n istio-system secret tls userauth-tls-cert --key=key.pem \ --cert=cert.pem
Verschlüsselungs- und Signaturschlüssel anwenden
authservice
benötigt zwei Schlüsselsätze, um ordnungsgemäß zu funktionieren. Der erste ist ein symmetrischer Schlüssel für die Ver- und Entschlüsselung. Dieser Schlüssel wird zum Verschlüsseln des Sitzungsstatus verwendet, bevor er als Cookie festgelegt wird.
Der zweite Schlüsselsatz ist ein öffentliches/privates Schlüsselpaar. Mit diesem Schlüssel werden die authentifizierten Nutzerinformationen im JWT-Format als RCToken signiert. Der öffentliche Schlüssel dieses Paars wird an einem vordefinierten Endpunkt veröffentlicht, mit dem die Sidecars das JWT prüfen können.
Das kpt
-Paket zur Nutzerauthentifizierung enthält zwei Beispielschlüssel für die schnelle Einrichtung.
Sie können diese Schlüssel jedoch auch mit Ihrem bevorzugten Schlüsselverwaltungssystem generieren.
Nachdem Sie die Schlüssel generiert haben, legen Sie die Schlüsseldaten im selben Format fest:
cat ./samples/rctoken_signing_key.json { "keys":[ { "kty":"RSA", "kid":"rsa-signing-key", "K":"YOUR_KEY", # k contains a Base64 encoded PEM format RSA signing key. "useAfter": 1612813735, # unix timestamp } ] }
cat ./samples/cookie_encryption_key.json { "keys":[ { "kty":"oct", "kid":"key-0", "K":"YOUR_KEY", "useAfter": 1612813735 } ] }
Erstellen Sie das Kubernetes-Secret, das
authservice
in einem eigenen Dateisystem bereitstellt.kubectl create namespace asm-user-auth kubectl label namespace asm-user-auth istio-injection=enabled istio.io/rev=default --overwrite kubectl create secret generic secret-key \ --from-file="session_cookie.key"="./samples/cookie_encryption_key.json" \ --from-file="rctoken.key"="./samples/rctoken_signing_key.json" \ --namespace=asm-user-auth
Nutzerauthentifizierungsdienst bereitstellen
Mit den folgenden Befehlen werden der Nutzerauthentifizierungsdienst und die Bereitstellung im Namespace asm-user-auth
erstellt.
Legen Sie die
oauth
-Variablen fest:kpt cfg set pkg anthos.servicemesh.user-auth.oidc.clientID ${OIDC_CLIENT_ID} kpt cfg set pkg anthos.servicemesh.user-auth.oidc.clientSecret ${OIDC_CLIENT_SECRET} kpt cfg set pkg anthos.servicemesh.user-auth.oidc.issuerURI ${OIDC_ISSUER_URI}
Wenden Sie das Paket
kpt
an:kubectl apply -f ./pkg/asm_user_auth_config_v1alpha1.yaml kubectl apply -f ./pkg
Der authservice
nutzt die UserAuthConfig
-CRD, um die Endnutzerauthentifizierung bereitzustellen. UserAuthConfig
ist in der Laufzeit konfigurierbar und Sie können sie aktualisieren, um das Verhalten von authservice
zu ändern und mit Endpunkten für jeden OIDC-Autorisierungsserver zu konfigurieren. Sie enthält die folgenden Felder:
cat pkg/user_auth_config.yaml
apiVersion: security.anthos.io/v1alpha1
kind: UserAuthConfig
metadata:
name: auth-config
namespace: user-auth
spec:
authentication:
- oidc:
clientID: "${OIDC_CLIENT_ID}"
clientSecret: "${OIDC_CLIENT_SECRET}"
issuerURI: "${OIDC_ISSUER_URI}"
redirectURIHost: ""
redirectURIPath: "/_gcp_anthos_callback"
outputJWTAudience: "test_audience"
Eine ausführliche Beschreibung der user_auth_config.yaml
-Felder finden Sie unter Konfigurationsdetails für die Nutzerauthentifizierung.
Aufgaben nach der Installation ausführen
Die folgenden Aufgaben werden nach Abschluss der vorherigen Installationsschritte erforderlich.
Nutzerauthentifizierung für Anwendungen aktivieren
In diesem Abschnitt wird gezeigt, wie Sie die Nutzerauthentifizierung aktivieren. Als Beispiel wird die Beispielanwendung "Online Boutique" verwendet.
Die Nutzerauthentifizierung für Anthos Service Mesh verwendet eine als CUSTOM
typisierte Autorisierungsrichtlinie, um den OIDC-Ablauf auszulösen.
Beim Installationsvorgang wird auch ein Istio-Gateway erstellt, um HTTPS-Traffic mit dem oben erstellten TLS-Zertifikat userauth-tls-cert
bereitzustellen.
Hier ist die Konfiguration von pkg/gateway.yaml
.
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: userauth
namespace: asm-user-auth
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- '*'
port:
name: https
number: 443
protocol: HTTPS
tls:
mode: SIMPLE
credentialName: userauth-tls-cert
---
# This ensures the OIDC endpoint has at least some route defined.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: userauth-oidc
namespace: asm-user-auth
spec:
gateways:
- userauth
hosts:
- '*'
http:
- match:
- uri:
prefix: /status
- uri:
prefix: /_gcp_anthos_callback
name: user-auth-route
route:
- destination:
host: authservice
port:
number: 10004
Aktualisieren Sie die Online Boutique-Anwendung so, dass sie dieses Gateway für die Bereitstellung von HTTPS-Traffic verwendet, und verwenden Sie die Portweiterleitung für den lokalen Zugriff auf die Anwendung:
kubectl apply -f./samples/boutique-route.yaml -n demo kubectl port-forward service/istio-ingressgateway 8443:443 -n istio-system
Das Ingress-Gateway an Port 8443 wird an
localhost
weitergeleitet, damit die Anwendung lokal zugänglich ist.Prüfen Sie, ob die Beispielanwendung "Online Boutique" unter
https://localhost:8443/
zugänglich ist.
Nutzerauthentifizierung prüfen
Bei den Online Boutique-Anwendungsdiensten müssen sich die Endnutzer nun über ihre Google-Konten anmelden.
Prüfen Sie unter
https://localhost:8443/
, ob die OIDC-Anmeldeseite unter angezeigt wird.Klicken Sie nach der Anmeldung auf Weiter und prüfen Sie, ob Sie auf die Startseite von Online Boutique weitergeleitet werden.
Autorisierungsrichtlinien konfigurieren
Nachdem Sie die Konfiguration in den vorherigen Schritten abgeschlossen haben, wird jeder Nutzer über einen webbasierten Authentifizierungsvorgang weitergeleitet. Wenn der Vorgang abgeschlossen ist, generiert authservice
einen RCToken
im JWT-Format, mit dem die authentifizierten Nutzerinformationen übertragen werden.
Fügen Sie am Ingress Autorisierungsrichtlinien von Istio hinzu, damit für jeden authentifizierten Nutzer eine Autorisierungsprüfung durchgeführt wird:
kubectl apply -f ./samples/rctoken-authz.yaml
Die Datei
rctoken-authz.yaml
konfiguriert das Ingress-Gateway so, dass das von authservice ausgestellte RC-Token validiert und nur autorisiert wird, wenn das JWT die gewünschten Felder wie Zielgruppen und Aussteller enthält.Sehen Sie sich die folgende Beispiel-Autorisierungsrichtlinie an:
apiVersion: security.istio.io/v1beta1 kind: RequestAuthentication metadata: name: require-rc-token namespace: istio-system spec: selector: matchLabels: istio: ingressgateway jwtRules: - issuer: "authservice.asm-user-auth.svc.cluster.local" audiences: - "test_audience" jwksUri: "http://authservice.asm-user-auth.svc.cluster.local:10004/_gcp_user_auth/jwks" fromHeaders: - name: X-ASM-RCTOKEN forwardOriginalToken: true --- apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: require-rc-token namespace: istio-system spec: selector: matchLabels: istio: ingressgateway action: ALLOW rules: - when: - key: request.auth.claims[iss] values: - authservice.asm-user-auth.svc.cluster.local - key: request.auth.claims[aud] values: - test_audience
Umgebungsspezifische Einstellungen konfigurieren
In den vorherigen Schritten werden localhost
und ein selbst signiertes HTTPS-Zertifikat für eine schnelle Einrichtung verwendet. Verwenden Sie für eine reale Produktionsumgebung Ihre eigene Domain, z. B. example.com
.
Achten Sie außerdem darauf, dass die in der CRD UserAuthConfig
konfigurierten Parameter tokenEndpoint
und authorizationEndpoint
eine Route haben, die in VirtualService
konfiguriert ist. In den vorherigen Installationsschritten wurde dies in asm-user-auth/userauth-oidc
VirtualService
festgelegt.
Schlüssel verwalten und rotieren
authservice
verwendet zwei Gruppen von Schlüsseln. Sie können jeden Schlüssel unabhängig rotieren. Bevor Sie die Schlüssel rotieren, sollten Sie jedoch wissen, wie die Rotation funktioniert.
Beide Schlüssel haben das JSON-Format. Das Feld useAfter
gibt den Zeitstempel an, seit der Schlüssel als zu verwenden betrachtet wird. Während einer Schlüsselrotation sollten Sie sowohl alte als auch neue Schlüssel in die JSON-Datei aufnehmen. Im folgenden Beispiel wird new-key
nur nach dem Zeitstempel 1712813735
verwendet.
{
"keys":[
{
"kty":"RSA",
"kid":"old-key",
"K":"...", # k contains a Base64 encoded PEM format RSA signing key.
"useAfter": 1612813735, # unix timestamp
}
{
"kty":"RSA",
"kid":"new-key",
"K":"...", # k contains a Base64 encoded PEM format RSA signing key.
"useAfter": 1712813735, # unix timestamp
}
]
}
Anthos Service Mesh verwendet den symmetrischen Schlüssel zum Verschlüsseln von Sitzungsdaten, die in Browser-Cookies gespeichert sind. Um die Gültigkeit vorhandener Sitzungen sicherzustellen, versucht authservice
, alle Schlüssel im Schlüsselsatz zu entschlüsseln. Bei der Rotation verwendet authservice
den neuen Schlüssel zum Verschlüsseln neuer Sitzungen und versucht weiterhin, die Entschlüsselung mit den alten Schlüsseln durchzuführen.
Das öffentliche/private Schlüsselpaar wird zum Signieren von RCToken
verwendet. Der öffentliche Schlüssel wird von istiod
zur JWT-Überprüfung an die Sidecar-Dateien übertragen. Sidecar-Dateien müssen den neuen öffentlichen Schlüssel erhalten, bevor authservice
mit dem neuen privaten Schlüssel zum Signieren von RCToken
beginnt. Dazu beginnt authservice
mit der Veröffentlichung des öffentlichen Schlüssels unmittelbar nach dem Hinzufügen des Schlüssels, wartet jedoch einige Zeit, bevor dieser mit RCToken
signiert wird.
Zusammengefasst empfehlen wir bei der Schlüsselrotation Folgendes:
- Führen Sie Schlüsselrotationen in regelmäßigen Abständen oder nach Bedarf durch.
- Geben Sie im JSON-Format sowohl den aktuellen als auch den neuen Schlüssel an. Die neuen Schlüssel sollten einem Zeitstempel in der Zukunft zugeordnet werden. Wir empfehlen, einen Zeitstempel mindestens einige Stunden nach der aktuellen Uhrzeit anzugeben.
- Überwachen Sie, ob die Dienste weiterhin fehlerfrei sind, wenn der neue Schlüssel in Verwendung ist. Warten Sie nach der Verwendung des neuen Schlüssels mindestens einen Tag, bevor Sie mit dem nächsten Schritt fortfahren.
- Entfernen Sie die alten Schlüssel aus den JSON-Einträgen. Sie werden nicht mehr benötigt.
Details zur Konfiguration der Nutzerauthentifizierung
In der folgenden Tabelle werden die einzelnen Felder der CRD beschrieben:
Feldname | Beschreibung |
---|---|
authentication.oidc |
Dieser Abschnitt enthält die OIDC-Endpunktkonfiguration und die im OIDC-Ablauf verwendeten Parameter. |
authentication.oidc.certificateAuthorityData |
Dies ist das SSL-Zertifikat der Domain des OIDC-Autorisierungsservers. |
authentication.oidc.clientID |
Der OAuth-Clientschlüssel, der für den OIDC-Authentifizierungsablauf verwendet werden soll. |
authentication.oidc.clientSecret |
Der OAuth-Clientschlüssel, der für den OIDC-Authentifizierungsablauf verwendet werden soll. |
authentication.oidc.issuerURI |
Der URI, der als Aussteller im Ausgabe-RCToken verwendet werden soll. |
authentication.oidc.redirectURIHost |
Der Host, der für den OAuth-Beendigungs-URI verwendet werden soll. Wenn Sie dieses Feld leer lassen, wird der Host der Ziel-URL verwendet und der Weiterleitungs-URI wird dynamisch zusammengestellt. Dieser Wert kann verwendet werden, wenn eine Nutzerauthentifizierungs-SSO in einer übergeordneten Domain erwünscht ist. Wenn Sie beispielsweise SSO zwischen profile.example.com/ und admin.example.com/ aktivieren möchten, kann dieser Wert auf example.com festgelegt werden. Dadurch kann bei example.com eine Nutzerauthentifizierungssitzung eingerichtet werden, die von allen Subdomains gemeinsam genutzt wird. Hinweis: Wenn mehrere Domains vom selben Mesh-Netzwerk, example1.com und example2.com, bereitgestellt werden, kann das Feature nicht verwendet werden. Deshalb sollte es leer bleiben. |
authentication.oidc.redirectURIPath |
Der Endpunktpfad, an dem "authservice" den OAuth-Ablauf beendet. Sie sollten diesen URI-Pfad sowie den Host als autorisierten Weiterleitungs-URI im Autorisierungsserver für authentication.oidc.clientID registrieren.Außerdem sollte der URI vom selben Service Mesh und demselben Ingress bereitgestellt werden, für den "authservice" aktiviert ist. |
authentication.oidc.scopes |
Der OAuth-Bereich, der in der Authentifizierungsanfrage angefordert werden soll. |
authentication.oidc.groupsClaim |
Wenn das „idtoken“ eine Gruppenanforderung enthält, geben Sie den Namen in diesem Feld an. Wenn angegeben, leitet der Dienst die Daten in dieser Anforderung an die Anforderung „groups“ im Ausgabe-RCToken weiter. |
authentication.outputJWTAudience |
Die Zielgruppe des RCToken, das von „authservice“ generiert wurde. Die Sidecars können das eingehende RCToken mit diesem Zielgruppenwert validieren. |
Multi-Cluster-Bereitstellung
Die Anthos Service Mesh-Nutzerauthentifizierung unterstützt die Multicluster-Bereitstellung. Sie müssen die Nutzerauthentifizierung in jedem Cluster wie oben beschrieben bereitstellen. Die Konfiguration der Nutzerauthentifizierung wie die benutzerdefinierte UserAuth-Ressource, der OIDC-Clientschlüssel und die Verschlüsselungsschlüssel müssen in jedem Cluster repliziert werden.
Standardmäßig leitet das Ingress-Gateway die Authentifizierungsanfragen an eine der authservice
-Instanzen weiter. Mit der Zielregel können Sie das Ingress-Gateway so konfigurieren, dass Anfragen an den authservice
im selben Cluster gesendet werden und ein Failover nur auf den authservice
anderer Cluster erfolgt.
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: authservice-fail-over
namespace: asm-user-auth
spec:
host: authservice.asm-user-auth.svc.cluster.local
trafficPolicy:
loadBalancer:
localityLbSetting:
enabled: true
failover:
- from: us-east
to: us-west
- from: us-west
to: us-east
Wie bei jeder anderen Konfiguration muss dies in jedem Cluster konfiguriert werden.
Häufig gestellte Fragen
Wie führe ich ein Upgrade von Anthos Service Mesh mit aktivierter Nutzerauthentifizierung durch?
Folgen Sie dem Anthos Service Mesh-Upgradeprozess und geben Sie die Overlay-Datei
user-auth.yaml
in der Befehlszeile fürinstall_asm
an.