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.
-
Un cluster Kubernetes payant
-
Actuellement, le module complémentaire Istio géré d'IBM Cloud Kubernetes Service ne prend pas en charge la fonction d'application des règles (policy enforcement). Pour utiliser l'adaptateur, vous devez utiliser Istio installé manuellement.
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.
-
Si vous utilisez IBM Cloud Kubernetes Service, veillez à vous connecter et à définir le contexte de votre cluster.
-
Vérifiez que vous avez activé l'application de la politique Istio. Dans le cas contraire, activez-la.
-
Ajoutez le référentiel.
helm repo add appidentityandaccessAdapter https://raw.githubusercontent.com/ibm-cloud-security/app-identity-and-access-Adapter/master/helm/appidentityandaccessAdapter -
Installez la charte.
helm install --name appidentityandaccessAdapter appidentityandaccessAdapter/appidentityandaccessAdapterVous 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 commandegit clone git@github.com:ibm-cloud-security/app-identity-and-access-Adapter.gitavant 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 :
- Définissez une configuration.
- 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
OidcConfigcontenant 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 discoveryUrlchaîne Oui Noeud final courant qui fournit un document JSON contenant les informations de configuration pour OIDC/OAuth 2.0. clientIdchaîne Oui Identificateur du client utilisé pour l'authentification. clientSecretchaî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.clientSecretRefobjet 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.namechaîne Oui Nom de la valeur confidentielle (secret) Kubernetes contenant la valeur de clientSecret.clientSecretRef.keychaî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
JwtConfigcontenant 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>
| 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. |
| 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. |
| 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. |
| 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