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.

App Identity and Access Adapter
- erreicht mit dem App Identity and Access

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.

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.

  1. Wenn Sie mit dem IBM Cloud Kubernetes-Service arbeiten, müssen Sie sich anmelden und den Kontext für Ihren Cluster festlegen.

  2. Überprüfen Sie, ob Sie die Durchsetzung von Istio Richtlinien aktiviert haben. Wenn das nicht der Fall ist, aktivieren Sie sie.

  3. 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
    
  4. Installieren Sie das Chart.

    helm install --name appidentityandaccessAdapter appidentityandaccessAdapter/appidentityandaccessAdapter
    

    Sie können während der Installation einen Image-Tag angeben, indem Sie das Flag image.tag festlegen. Beispiel: --set image.tag=0.5.0. Sie können das Chart auch lokal installieren. Klonen Sie dazu das Projektarchiv, indem Sie git clone git@github.com:ibm-cloud-security/app-identity-and-access-Adapter.git ausfü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:

  1. Definieren Sie eine Konfiguration.
  2. 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
    discoveryUrl Zeichenfolge Ja Ein bekannter Endpunkt, der das JSON-Dokument mit den OIDC/OAuth 2.0-Konfigurationsdaten enthält.
    clientId Zeichenfolge Ja Eine ID für den Client, die für die Authentifizierung verwendet wird.
    clientSecret Zeichenfolge *Nein Ein geheimer Schlüssel in Klartext, der verwendet wird, um den Client zu authentifizieren. Wenn dieser nicht bereitgestellt wird, muss ein clientSecretRef vorhanden sein.
    clientSecretRef Objekt Nein Ein geheimer Referenzschlüssel, der verwendet wird, um den Client zu authentifizieren. Die Referenz kann anstelle von clientSecret verwendet werden.
    clientSecretRef.name Zeichenfolge Ja Der Name des geheimen Kubernetes-Schlüssels, der clientSecret enthält.
    clientSecretRef.key Zeichenfolge Ja Das Feld im geheimen Kubernetes-Schlüssel, das clientSecret enthä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 JwtConfig CRD, 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>
Verstehen der Komponenten des Serviceobjekts
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.
Verstehen der Komponenten des Pfadobjekts
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.
Verstehen der Komponenten des Richtlinienobjekts
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.
Verstehen der Komponenten des Richtlinienobjekts
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