Multicloud-Apps mit Istio
Mit dem App Identity and Access Adapter können Sie das gesamte Identitätsmanagement an einem zentralen Ort zentralisieren.
Der App Identity and Access-Adapter wird derzeit nicht unterstützt.
Da Unternehmen Clouds von mehreren Anbietern oder eine Kombination von On- und Off-Premises-Lösungen verwenden, können heterogene Bereitstellungsmodelle Ihnen dabei helfen, die vorhandene Infrastruktur zu erhalten und die Abhängigkeit von einem Anbieter zu vermeiden. Der Adapter kann für die Arbeit mit einem beliebigen OIDC-kompatiblen Identitätsprovider wie App IDkonfiguriert werden. Der Dienst ermöglicht dem Adapter die Steuerung von Authentifizierungs-und Berechtigungsrichtlinien in allen Umgebungen, einschließlich Front-End-und Back-End-Anwendungen. Das alles geschieht ohne Änderung Ihres Codes oder die Notwendigkeit, Ihre Anwendung erneut bereitzustellen.
Multicloud-Architektur
Eine Multi-Cloud-Computing-Umgebung kombiniert mehrere Cloud-und/oder private IT-Umgebungen in einer einzigen Netzwerkarchitektur. Durch die Verteilung der Workloads über mehrere Umgebungen können Sie eine höhere Ausfallsicherheit, Flexibilität und eine größere Kosteneffizienz erreichen. Um diese Vorteile zu nutzen, ist es üblich, eine containerbasierte Anwendung mit einer Orchestrierungsebene wie beispielsweise Kubernetes zu verwenden.
Verstehen von Istio und dem Adapter
Istio ist ein Open-Source-Servicenetz, das sich transparent über vorhandene, verteilte Anwendungen legt, die in Kubernetes integriert werden können. Um die Komplexität von Implementierungen zu reduzieren, bietet Istio Einblicke in das Verhalten und die Betriebssteuerung des gesamten Servicenetzes. Wenn App ID mit Istio kombiniert wird, wird es zu einer skalierbaren, integrierten Identitätslösung für Multicloud-Architekturen, die keine Änderungen des angepassten Anwendungscodes erfordern. Weitere Informationen finden Sie unter Was ist Istio.
Istio verwendet ein Envoy-Proxy-Sidedcar, um den gesamten eingehenden und ausgehenden Datenverkehr für alle Services im Servicenetz zu auszugleichen. Durch die Verwendung des Proxy extrahiert Istio Informationen zum Datenverkehr (auch als Telemetrie bezeichnet), die an die Istio-Komponente mit der Bezeichnung Mixer gesendet werden, um Richtlinienentscheidungen zu erzwingen. Der App Identity and Access-Adapter erweitert die Mixer-Funktionalität, indem er die Telemetrie (Attribute) gegen benutzerdefinierte Richtlinien analysiert, um die Identitäts- und Zugriffsverwaltung in und über das Servicenetz zu steuern. Die Richtlinien für das Zugriffsmanagement sind mit einzelnen Kubernetes-Services verknüpft und können auf bestimmte Serviceendpunkte optimiert werden. Weitere Informationen zu Richtlinien und Telemetrie finden Sie in der Dokumentation Istio.
Aufgrund einer Istio-Einschränkung speichert der App Identity and Access-Adapter derzeit Benutzersitzungsinformationen intern und speichert die Informationen nicht über Replikate hinweg oder über Failover-Konfigurationen. Wenn Sie den Adapter verwenden, beschränken Sie Ihre Workloads auf ein einzelnes Replikat, bis die Einschränkung behoben ist.
Front-End-Apps schützen
Wenn Sie eine browserbasierte Anwendung verwenden, können Sie den Open ID Connect(OIDC) / OAuth 2.0 authorization_grant Fluss
verwenden, um Ihre Benutzer zu authentifizieren. Wenn ein nicht authentifizierter Benutzer erkannt wurde, wird dieser automatisch an die Authentifizierungsseite weitergeleitet. Wenn die Authentifizierung abgeschlossen ist, wird der Browser
zu einem impliziten /oidc/callback-Endpunkt umgeleitet, an dem der Adapter die Anfrage abfängt. An diesem Punkt erhält der Adapter Token vom Identity Provider und leitet den Benutzer dann zurück zu seiner ursprünglich angeforderten
URL um.
Um die Informationen zur Benutzersitzung einschließlich der Sitzungstoken anzuzeigen, können Sie den Header Authorization anzeigen.
Authorization: Bearer <accessToken> <IDToken>
Sie können ferner authentifizierte Benutzer abmelden. Wenn ein authentifizierter Benutzer auf einen geschützten Endpunkt zugreift und dabei oidc/logout wie im Beispiel dargestellt angehängt hat, wird er abgemeldet.
https://myhost/path/oidc/logout
Bei Bedarf kann ein Aktualisierungstoken verwendet werden, um neuen Zugriff automatisch anzufordern, ohne dass die Benutzer sich erneut authentifizieren müssen. Wenn der konfigurierte Identitätsprovider ein Aktualisierungstoken zurückgibt, wird dieses persistent in der Sitzung gespeichert und verwendet, um neue Token abzurufen, wenn das Identitätstoken abläuft.
Back-End-Apps schützen
Der Adapter kann in Zusammenarbeit mit dem OAuth 2.0 JWT Bearer flow verwendet werden, um Service-APIs durch die Validierung von JWT Bearer-Tokens
zu schützen. Der Bearer-Autorisierungsablauf erwartet eine Antwort mit einem Berechtigungsheader, der ein gültiges Zugriffstoken und ein optionales Identitätstoken enthält. Die erwartete Headerstruktur ist Authorization=Bearer {access_token} [{id_token}].
Für nicht authentifizierte Clients wird der Antwortstatus HTTP 401 mit einer Liste von Bereichen zurückgegeben, die erforderlich sind, um die Autorisierung abzurufen. Wenn die Token ungültig oder abgelaufen sind, gibt die API-Strategie die
Antwort HTTP 401 mit einer optionalen Fehlerkomponente zurück, die wie folgt lautet: Www-Authenticate=Bearer scope="{scope}" error="{error}".
Weitere Informationen zu Token und deren Verwendung finden Sie in Informationen zu Token.
Vorbereitende Schritte
Stellen Sie vor Beginn sicher, dass die folgenden Voraussetzungen installiert sind.
-
Ein kostenpflichtiger Kubernetes-Cluster
-
IBM Cloud Kubernetes Service Managed Istio unterstützt momentan keine Richtliniendurchsetzung. Zur Verwendung des Adapters müssen Sie ein manuell installiertes Istio verwenden.
Adapter installieren
Um das Chart zu installieren, initialisieren Sie Helm in Ihrem Cluster, definieren die Optionen, die Sie verwenden möchten, und führen anschließend den Installationsbefehl aus.
-
Wenn Sie mit dem IBM Cloud Kubernetes-Service arbeiten, müssen Sie sich anmelden und den Kontext für Ihren Cluster festlegen.
-
Überprüfen Sie, ob Sie die Durchsetzung von Istio Richtlinien aktiviert haben. Wenn das nicht der Fall ist, aktivieren Sie sie.
-
Fügen Sie das Repository hinzu.
helm repo add appidentityandaccessAdapter https://raw.githubusercontent.com/ibm-cloud-security/app-identity-and-access-Adapter/master/helm/appidentityandaccessAdapter -
Installieren Sie das Chart.
helm install --name appidentityandaccessAdapter appidentityandaccessAdapter/appidentityandaccessAdapterSie können während der Installation einen Image-Tag angeben, indem Sie das Flag
image.tagfestlegen. Beispiel:--set image.tag=0.5.0. Sie können das Chart auch lokal installieren. Klonen Sie dazu das Projektarchiv, indem Siegit clone git@github.com:ibm-cloud-security/app-identity-and-access-Adapter.gitausführen, bevor Sie den Installationsbefehl ausführen.
Berechtigungs- und Authentifizierungsrichtlinie anwenden
Eine Authentifizierungs- oder Berechtigungsrichtlinie ist eine Gruppe von Bedingungen, die erfüllt sein müssen, bevor eine Anforderung auf einen Ressourcenzugriff zugreifen kann. Durch die Definition der Servicekonfiguration eines Identitätsproviders und einer Richtlinie, die festlegt, wann ein bestimmter Ablauf verwendet werden muss, können Sie den Zugriff auf alle Ressourcen in Ihrem Servicenetz steuern. Beispiele für CRDs finden Sie im Verzeichnis samples.
So erstellen Sie eine Richtlinie:
- Definieren Sie eine Konfiguration.
- Registrieren Sie den Endpunkt.
Eine Konfiguration definieren
Abhängig davon, ob Sie Front-End- oder Back-End-Anwendungen schützen, erstellen Sie eine Richtlinienkonfiguration mit einer der folgenden Optionen.
-
Front-End-Anwendungen: Browserbasierte Anwendungen, die eine Benutzerauthentifizierung erfordern, können so konfiguriert werden, dass Sie den Authentifizierungsablauf OIDC / OAuth 2.0 verwenden. Um eine
OidcConfig-CRD zu definieren, die den Client enthält, der den Authentifizierungsablauf mit dem Identitätsprovider erleichtert, verwenden Sie folgendes Beispiel als Leitfaden.apiVersion: "security.cloud.ibm.com/v1" kind: OidcConfig metadata: name: oidc-provider-config namespace: sample-namespace spec: discoveryUrl: https://us-south.appid.cloud.ibm.com/oauth/v4/<tenantID>/.well-known/openid-configuration clientId: <clientID> clientSecret: <randomlyGeneratedClientSecret> clientSecretRef: name: <nameOfKubeSecret> key: <keyInKubeSecret>Komponenten der YAML-Konfigurationsdatei erklärt Feld Typ Erforderlich Beschreibung discoveryUrlZeichenfolge Ja Ein bekannter Endpunkt, der das JSON-Dokument mit den OIDC/OAuth 2.0-Konfigurationsdaten enthält. clientIdZeichenfolge Ja Eine ID für den Client, die für die Authentifizierung verwendet wird. clientSecretZeichenfolge *Nein Ein geheimer Schlüssel in Klartext, der verwendet wird, um den Client zu authentifizieren. Wenn dieser nicht bereitgestellt wird, muss ein clientSecretRefvorhanden sein.clientSecretRefObjekt Nein Ein geheimer Referenzschlüssel, der verwendet wird, um den Client zu authentifizieren. Die Referenz kann anstelle von clientSecretverwendet werden.clientSecretRef.nameZeichenfolge Ja Der Name des geheimen Kubernetes-Schlüssels, der clientSecretenthält.clientSecretRef.keyZeichenfolge Ja Das Feld im geheimen Kubernetes-Schlüssel, das clientSecretenthält. -
Für Backend-Anwendungen: Die Spezifikation OAuth 2.0 Bearer token definiert ein Muster für den Schutz von APIs durch die Verwendung von JSON Web Tokens(JWTs ). Definieren Sie eine
JwtConfigCRD, die die öffentliche Schlüsselressource enthält, die für die Überprüfung der Tokensignaturen verwendet wird, indem Sie die folgende Konfiguration als Beispiel verwenden.apiVersion: "security.cloud.ibm.com/v1" kind: JwtConfig metadata: name: jwt-config namespace: sample-app spec: jwksUrl: https://us-south.appid.cloud.ibm.com/oauth/v4/<tenantID>/publickeys
Anwendungsendpunkte registrieren
Registrieren Sie die Anwendungsendpunkte innerhalb der Policy CRD, um eingehende Anforderung zu überprüfen und Authentifizierungsregeln zu erzwingen. Jede Policy gilt exklusiv für den Kubernetes-Namespace, in dem
das Objekt vorhanden ist, und kann die Services, Pfade und Methoden angeben, die Sie schützen möchten.
apiVersion: "security.cloud.ibm.com/v1"
kind: Policy
metadata:
name: samplepolicy
namespace: sample-app
spec:
targets:
-
serviceName: <svcSampleApp>
paths:
- exact: /web/home
method: ALL
policies:
- policyType: oidc
config: <oidcProviderConfig>
rules:
- claim: scope
match: ALL
source: access_token
values:
- appid_default
- openid
- claim: amr
match: ANY
source: id_token
values:
- cloud_directory
- google
- exact: /web/user
method: GET
policies:
- policyType: oidc
config: <oidcProviderConfig>
redirectUri: https://github.com/ibm-cloud-security/app-identity-and-access-Adapter
- prefix: /
method: ALL
policies:
-
policyType: jwt
config: <jwtConfig>
| Serviceobjekt | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
serviceName |
string |
Ja | Der Name des Kubernetes-Service im Richtliniennamespace, den Sie schützen möchten. |
paths |
array[Path Object] |
Ja | Eine Liste mit Pfadobjekten, die die Endpunkte definieren, die Sie schützen möchten. Ohne Angabe sind alle Pfade geschützt. |
| Pfadobjekt | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
exact or prefix |
string |
Ja | Der Pfad, auf den Sie die Richtlinien anwenden möchten. Zu den Optionen gehören exact und prefix. exact, die den angegebenen Endpunkten exakt entsprechen, wobei die letzte / abgeschnitten
wurde. prefix stimmt mit den Endpunkten überein, die mit dem von Ihnen angegebenen Routenpräfix beginnen. |
method |
enum |
Nein | Die geschützte HTTP-Methode. Gültige Optionen sind ALL, GET, PUT, POST, DELETE, PATCH - Der Standardwert lautet ALL: |
policies |
array[Policy] |
Nein | Die OIDC/JWT-Richtlinien, die Sie anwenden möchten. |
| Richtlinienobjekt | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
policyType |
enum |
Ja | Der Typ der OIDC-Richtlinie. Die Optionen umfassen: jwt oder oidc. |
config |
string |
Ja | Der Name der Providerkonfiguration, die Sie verwenden möchten. |
redirectUri |
string |
Nein | Die URL, zu der der Benutzer nach erfolgreicher Authentifizierung weitergeleitet wird. Der Standardwert ist: die ursprüngliche Anforderungs-URL. |
rules |
array[Rule] |
Nein | Die Gruppe von Regeln, die Sie für die Tokenvalidierung verwenden möchten. |
| Regelobjekt | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
claim |
string |
Ja | Der Claim, den Sie validieren möchten. |
match |
enum |
Nein | Die erforderlichen Kriterien für die Claimvalidierung. Die Optionen umfassen: ALL, ANY oder NOT. Der Standardwert lautet ALL. |
source |
enum |
Nein | Das Token, auf das Sie die Regel anwenden möchten. Die Optionen umfassen: access_token oder id_token. Der Standardwert lautet access_token. |
values |
array[string] |
Ja | Die erforderliche Gruppe von Werten für die Validierung. |
Adapter löschen
Zum Löschen des Adapters und aller zugehörigen CRDs müssen Sie das Diagramm Helm und die zugehörigen Signatur-und Verschlüsselungsschlüssel löschen.
helm delete --purge appidentityandaccessAdapter
kubectl delete secret appidentityandaccessAdapter-keys -n istio-system
Protokollierung konfigurieren
Standardmäßig werden Protokolle als JSON dargestellt und auf der Sichtbarkeitsstufe info zur Verfügung gestellt, um eine einfache Durchführbarkeit der Integration mit externen Protokollierungssystemen zu ermöglichen. Zur Aktualisierung
der Protokollierungskonfiguration können Sie das Helm-Chart verwenden. Unterstützte Protokollierungsstufen umfassen den Bereich [-1, 7] wie in Zap Core dargestellt. Weitere Informationen zu den Ebenen finden Sie in der Zap-Kerndokumentation.
Adapter
Um die Adapter-Protokolle zu sehen, können Sie kubectl verwenden oder auf den Pod über den appidentityandaccessAdapter-Pod der Kubernetes-Konsole zugreifen.
alias Adapter_logs="kubectl -n istio-system logs -f $(kubectl -n istio-system get pods -lapp=appidentityandaccessAdapter -o jsonpath='{.items[0].metadata.name}')"
Adapter_logs | jq
Mixer
Wenn der Adapter scheinbar keine Anforderungen empfängt, überprüfen Sie die Mixerprotokolle, um sicherzustellen, dass die Verbindung zum Adapter erfolgreich hergestellt wurde.
alias mixer_logs="kubectl -n istio-system logs -f $(kubectl -n istio-system get pods -lapp=telemetry -o jsonpath='{.items[0].metadata.name}') -c mixer"
mixer_logs | jq