Applications multi-cloud avec Istio

En utilisant l'App Identity and Access Adapter, vous pouvez centraliser toute la gestion de votre identité en un seul endroit.

L'adaptateur App Identity and Access n'est pas pris en charge actuellement.

Comme les entreprises utilisent des clouds de plusieurs fournisseurs ou une combinaison de solutions sur site et hors site, des modèles de déploiement hétérogènes peuvent vous aider à conserver l'infrastructure existante et éviter toute dépendance vis à vis du fournisseur. L'adaptateur peut être configuré pour fonctionner avec n'importe quel fournisseur d'identité conforme à l'OIDC, tel que App ID. Le service permet à l'adaptateur de contrôler les politiques d'authentification et d'autorisation dans tous les environnements, y compris les applications front end et backend. Et tout ceci s'effectue sans modification de votre code ou sans avoir à redéployer votre application.

Architecture multi-cloud

Un environnement informatique multicloud combine plusieurs environnements de cloud et / ou privé dans une architecture de réseau unique. En répartissant les charges de travail sur plusieurs environnements, vous pouvez constater des améliorations en termes de résilience et de flexibilité, ainsi qu'une rentabilité accrue. Pour tirer parti de ces avantages, il est courant d'utiliser une application reposant sur un conteneur avec une couche d'orchestration, comme par exemple Kubernetes.

{: caption="d'architecture de l'adaptateur d'identité et d'accès AppDéploiement multi-nuages - réalisé avec l'" caption-side="bottom"} d'identité et d'accès App

Description d'Istio et de l'adaptateur

Istio est un maillage de services open source qui s'ajoute en toute transparence sur les applications distribuées existantes pouvant s'intégrer à Kubernetes. Pour réduire la complexité des déploiements, Istio fournit des informations comportementales et un contrôle opérationnel sur le maillage de service dans son ensemble. Lorsque le service App ID est combiné avec Istio, vous obtenez une solution d'identité adaptable et intégrée pour des architectures multi-cloud qui n'a pas besoin de modification de code d'application personnalisé. Pour plus d'informations, consultez le site Qu'est-ce que Istio.

Istio utilise un proxy sidecar Envoy pour assurer tout le trafic entrant et sortant pour tous les services du maillage de services. A l'aide de ce proxy, Istio extrait les informations sur le trafic (que l'on appelle aussi télémétrie) qui sont envoyées au composant Istio nommé Mixer pour appliquer les décisions en termes de politique. L'adaptateur App Identity and Access étend les fonctionnalités du composant Mixer en analysant la télémétrie (attributs) par rapport à des règles personnalisées pour contrôler la gestion des entités et des accès vers et à l'intérieur du maillage de services. Les règles de gestion d'accès sont liées à des services Kubernetes particuliers et peuvent être ajustées sur des noeuds finaux de service spécifiques. Pour plus d'informations sur les politiques et la télémétrie, voir la documentation Istio.

En raison d'une limitation d'Istio, l'adaptateur App Identity and Access stocke actuellement les informations de session utilisateur en interne et ne conserve pas les informations sur les répliques ou sur les configurations de reprise après incident. Lorsque vous utilisez l'adaptateur, limitez vos charges de travail à une seule réplique tant que cette limitation n'est pas résolue.

Protection des applications de front end

Si vous utilisez une application basée sur un navigateur, vous pouvez utiliser le flux Open ID Connect(OIDC ) / OAuth 2.0 authorization_grant pour authentifier vos utilisateurs. Lorsqu'un utilisateur non authentifié est détecté, il est automatiquement redirigé vers la page d'authentification. Lorsque l'authentification aboutit, le navigateur est redirigé sur un noeud final /oidc/callback implicite où l'adaptateur intercepte la demande. A ce stade, l'adaptateur obtient des jetons du fournisseur d'identité, puis redirige l'utilisateur sur l'URL que celui-ci demandait au départ.

Pour afficher les informations de session utilisateur, notamment les jetons de session, vous pouvez regarder dans l'en-tête Authorization.

Authorization: Bearer <accessToken> <IDToken>

Vous pouvez également déconnecter des utilisateurs authentifiés. Lorsqu'un utilisateur authentifié accède à un noeud final protégé avec oidc/logout ajouté comme illustré dans l'exemple suivant, il est déconnecté.

https://myhost/path/oidc/logout

Si nécessaire, un jeton d'actualisation peut être utilisé pour obtenir automatiquement de nouveaux jetons d'accès et d'identité sans que l'utilisateur ait besoin de s'authentifier à nouveau. Si le fournisseur d'identité configuré renvoie un jeton d'actualisation, ce jeton est conservé dans la session et utilisé pour récupérer de nouveaux jetons lorsque le jeton d'identité arrive à expiration.

Protection des applications de back end

L'adaptateur peut être utilisé en collaboration avec OAuth 2.0 Flux du porteur JWT pour protéger les API des services en validant les jetons JWT Bearer. Le flux d'autorisation Bearer s'attend à ce qu'une demande contienne un en-tête Authorization avec un jeton d'accès valide et un jeton d'identité facultatif. La structure de l'en-tête attendue se présente comme suit : Authorization=Bearer {access_token} [{id_token}]. Un statut de réponse HTTP 401 est renvoyé aux clients non authentifiés avec la liste des portées qui leur sont nécessaires pour obtenir l'autorisation. Si les jetons ne sont pas valides ou ont expiré, la stratégie de l'API renvoie une réponse HTTP 401 avec un composant d'erreur facultatif indiquant Www-Authenticate=Bearer scope="{scope}" error="{error}".

Pour plus d'informations sur les jetons et leur mode d'utilisation, voir Connaissance des jetons.

Avant de commencer

Avant de commencer, vérifiez que vous avez installé les prérequis suivants.

Installation de l'adaptateur

Pour installer la charte, initialisez Helm dans votre cluster, définissez les options que vous souhaitez utiliser et exécutez ensuite la commande d'installation.

  1. Si vous utilisez IBM Cloud Kubernetes Service, veillez à vous connecter et à définir le contexte de votre cluster.

  2. Vérifiez que vous avez activé l'application de la politique Istio. Dans le cas contraire, activez-la.

  3. Ajoutez le référentiel.

    helm repo add appidentityandaccessAdapter https://raw.githubusercontent.com/ibm-cloud-security/app-identity-and-access-Adapter/master/helm/appidentityandaccessAdapter
    
  4. Installez la charte.

    helm install --name appidentityandaccessAdapter appidentityandaccessAdapter/appidentityandaccessAdapter
    

    Vous pouvez spécifier une étiquette d'image lors de l'installation en définissant l'indicateur image.tag. Par exemple, --set image.tag=0.5.0. Vous pouvez également installer la charte en local. Pour cela, clonez le référentiel en exécutant la commande git clone git@github.com:ibm-cloud-security/app-identity-and-access-Adapter.git avant la commande d'installation.

Application d'une règle d'autorisation et d'authentification

Une règle d'authentification et d'autorisation est un ensemble de conditions à remplir avant qu'une demande accède à une ressource. En définissant la configuration de service d'un fournisseur d'identité et une règle qui indique quand un flux particulier doit être utilisé, vous pouvez contrôler l'accès à n'importe quelle ressource de votre maillage de service. Pour voir des exemples de CRD, consultez le répertoire samples.

Pour créer une politique :

  1. Définissez une configuration.
  2. Enregistrez le noeud final.

Définition d'une configuration

En fonction de la protection que vous envisagez sur les applications de front end ou de back end, créez une configuration de règle avec l'une des options suivantes.

  • Pour les applications de front end : des applications reposant sur un navigateur qui nécessitent l'authentification des utilisateurs peuvent être configurées pour utiliser le flux d'authentification OIDC / OAuth 2.0. Pour créer une définition CRD OidcConfig contenant le client utilisé pour faciliter le flux d'authentification avec le fournisseur d'identité, servez-vous de l'exemple suivant pour vous guider.

    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>
    
    Explication des composants du fichier de configuration YAML
    Zone Type Obligatoire Description
    discoveryUrl chaîne Oui Noeud final courant qui fournit un document JSON contenant les informations de configuration pour OIDC/OAuth 2.0.
    clientId chaîne Oui Identificateur du client utilisé pour l'authentification.
    clientSecret chaîne *Non Valeur confidentielle (secret) en texte brut utilisée pour authentifier le client. Si elle n'est pas fournie, il doit exister une référence clientSecretRef.
    clientSecretRef objet Non Valeur confidentielle (secret) de référence utilisée pour authentifier le client. Cette référence peut être utilisée à la place de clientSecret.
    clientSecretRef.name chaîne Oui Nom de la valeur confidentielle (secret) Kubernetes contenant la valeur de clientSecret.
    clientSecretRef.key chaîne Oui Zone au sein de la valeur confidentielle (secret) Kubernetes renfermant la valeur de clientSecret.
  • Pour les applications dorsales : La spécification OAuth 2.0 Bearer token définit un modèle de protection des API à l'aide de JSON Web Tokens(JWT). En utilisant la configuration suivante à titre d'exemple, créez une définition CRD JwtConfig contenant la ressource de la clé publique, qui est utilisée pour valider les signatures de jeton.

    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
    

Enregistrements des noeuds finaux d'application

Enregistrez les noeuds finaux d'application au sein d'une définition CRD Policy pour valider les demandes entrantes et appliquer des règles d'authentification. Chaque règle (Policy) s'applique exclusivement à l'espace de nom Kubernetes dans lequel réside l'objet et peut spécifier les services, les chemins et les méthodes que vous souhaitez protéger.

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>
Comprendre les composants de l'objet de service
Objet de service Type Obligatoire Description
serviceName string Oui Nom du service Kubernetes dans l'espace de nom Policy que vous souhaitez protéger.
paths array[Path Object] Oui Liste d'objets de chemin qui définissent les noeuds finaux que vous souhaitez protéger. Si elle n'est pas spécifiée, tous les chemins sont protégés.
Comprendre les composants de l'objet chemin
Objet de chemin (path) Type Obligatoire Description
exact or prefix string Oui Chemin sur lequel vous souhaitez appliquer les règles. Les options incluent exact et prefix. exact correspondent exactement aux endpoints fournis avec le dernier / relimité. prefix correspond aux endpoints qui commencent par le préfixe de route que vous fournissez.
method enum Non Méthode HTTP protégée. Options valides : ALL, GET, PUT, POST, DELETE, PATCH (valeur par défaut : ALL).
policies array[Policy] Non Règles OIDC/JWT que vous souhaitez appliquer.
Comprendre les composants de l'objet politique
Objet de règle Type Obligatoire Description
policyType enum Oui Type de règle OIDC. Options possibles : jwt ou oidc.
config string Oui Nom de la configuration de fournisseur que vous souhaitez utiliser.
redirectUri string Non URL vers laquelle vous souhaitez que l'utilisateur soit redirigé après une authentification réussie. Par défaut, il s'agit de l'URL de la demande d'origine.
rules array[Rule] Non Ensemble de règles que vous souhaitez utiliser pour la validation des jetons.
Comprendre les composants de l'objet politique
Objet de règle (rule) Type Obligatoire Description
claim string Oui Revendication que vous souhaitez valider.
match enum Non Critères requis pour valider la revendication. Options possibles : ALL, ANY ou NOT. La valeur par défaut est ALL.
source enum Non Jeton dans lequel vous souhaitez appliquer la règle. Options possibles : access_token ou id_token. La valeur par défaut est access_token.
values array[string] Oui Ensemble de valeurs requises pour la validation.

Suppression de l'adaptateur

Pour supprimer l'adaptateur et toutes les CRDs associées, vous devez supprimer le graphique Helm et les clés de signature et de chiffrement associées.

helm delete --purge appidentityandaccessAdapter
kubectl delete secret appidentityandaccessAdapter-keys -n istio-system

Configuration de la journalisation

Par défaut, les journaux sont de style JSON avec un niveau de visibilité info pour faciliter leur intégration avec des systèmes de journalisation externes. Pour mettre à jour la configuration de journalisation, vous pouvez utiliser la charte Helm. Les niveaux de journalisation pris en charge incluent la plage [-1, 7] comme indiqué dans le cœur Zap. Pour plus d'informations sur les niveaux, voir la documentation de base de Zap.

Adaptateur

Pour voir les journaux de l'adaptateur, vous pouvez utiliser kubectl ou accéder au pod à partir du pod appidentityandaccessAdapter dans la console Kubernetes.

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

Si l'adaptateur ne semble pas recevoir de demandes, vérifiez les journaux Mixer pour vous assurer qu'il a été correctement connecté à l'adaptateur.

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