Type d'autorisation d'échange de jetons : Échange d'un jeton Web JSON pour un UPST

L'échange de jetons entre JWT et UPST permet aux identités fédérées (utilisateurs ou applications authentifiés à l'aide d'IDCS ou d'un autre fournisseur d'identités) d'accéder en toute sécurité aux services OCI (plan de contrôle OCI) sans gérer les utilisateurs natifs ou les clés d'API OCI.

  • JWT (JSON Web Token) : Émis par un IdP approuvé tel que des fournisseurs d'identité externes ou natifs OCI (IdPs), il contient des réclamations signées concernant l'utilisateur ou le service.
  • UPST (User Principal Security Token) : Jeton de courte durée OCI accepté comme authentification pour l'accès à l'API.
  • Le point d'extrémité Token Exchange valide le jeton JWT, extrait les réclamations et émet un UPST de courte durée.

Cela permet aux utilisateurs authentifiés à l'aide de IdPs externes, tels que Okta, Microsoft Entra ID et d'autres, ou d'OCI IdP lui-même, d'accéder aux ressources OCI.

Termes de jeton JWT
Terme Description
API du service IAM Token Exchange Service de domaine d'identité IAM OAuth : /oauth2/v1/token. L'API accepte les en-têtes/données utiles d'authentification standard basés sur OAuth et les signatures OCI. Pour savoir comment utiliser un client OAuth avec un domaine d'identité pour accéder aux API REST, voir Utilisation de OAuth 2 pour accéder à l'API REST.
Configuration de l'approbation de propagation d'identité Utilisez des configurations de confiance pour la propagation sécurisée des identités de bout en bout d'un fournisseur d'identités externe (IdP) vers Oracle Cloud Infrastructure (OCI). Ce mécanisme permet à OCI Identity de valider le jeton du fournisseur d'identités externe et d'établir un mappage sécurisé entre l'identité de l'utilisateur externe et un utilisateur ou un principal de service IAM dans OCI.

En envoyant le contexte de sécurité de l'utilisateur authentifié du frontend (par exemple, un IdP externe) aux services dorsaux dans OCI, la propagation des identités élimine le besoin de comptes génériques ou privilégiés. Il améliore la sécurité, permet une vérification détaillée des appels d'API et prend en charge des scénarios d'authentification avancés. Le point d'extrémité de l'API /IdentityPropagationTrust est indépendant du nuage et prend en charge les intégrations avec n'importe quel fournisseur de nuage.

Pour créer une configuration d'approbation de propagation d'identité, voir Étape 4 : Créer une configuration d'approbation de propagation d'identité.
Utilisateur du service Utilisateur sans privilèges de connexion interactive. Les utilisateurs de service peuvent être accordés à des groupes et à des rôles de service. Les applications peuvent utiliser les utilisateurs du service ou les utilisateurs connectés peuvent se faire passer pour eux afin d'obtenir un UPST temporaire. L'utilisation d'un utilisateur de service est facultative. Pour plus d'informations sur l'utilisation des utilisateurs de service, voir Étape 3 : (Facultatif) Utiliser un utilisateur de service.
Jeton de session principal d'utilisateur (UPST) Jeton généré par le service IAM pour OCI qui peut être utilisé pour accéder aux services OCI (plan de contrôle OCI). Un UPST est également connu sous le nom de jeton de sécurité lorsque vous l'utilisez avec une trousse SDK ou Terraform. Il représente le principal d'utilisateur du service authentifié.

Flux

Diagramme illustrant le flux JWT vers UPST.

Avis de non-responsabilité : Tous les noms de produit, logos et marques et logos sont des marques de commerce de leurs propriétaires respectifs et sont utilisés ici à titre informatif seulement.

Étapes d'échange de jetons JWT vers UPST

Pour échanger un jeton JWT contre un UPST, procédez comme suit :

  1. Step1 : (Facultatif) Création d'un domaine d'identité
  2. Étape 2 : Créer des applications de domaine d'identité
  3. Étape 3 : (Facultatif) Utiliser un utilisateur de service
  4. Étape 4 : Créer une configuration d'approbation de propagation d'identité
  5. Étape 5 : Génération d'une clé publique
  6. Étape 6 : Générer un jeton JWT pour échanger contre UPST
  7. Étape 7 : Obtenir OCI UPST

Step1 : (Facultatif) Création d'un domaine d'identité

Créez un nouveau domaine d'identité s'il n'existe pas. Voir Création d'un domaine d'identité.

Étape 2 : Créer des applications de domaine d'identité

Un client OAuth est une application approuvée enregistrée auprès d'Identity Cloud Service pour authentifier et obtenir des jetons d'accès à l'aide de flux OAuth 2.0. Vous utilisez ce client pour :

  • Obtenez un jeton d'accès pour appeler les API d'administration IDCS.

  • Fédérez l'identité de l'application pour échanger JWT contre UPST.

Voir Ajouter une application confidentielle. Après avoir créé l'application, enregistrez l'ID client et la clé secrète client dans un emplacement sécurisé. Vous avez besoin de deux applications de domaine d'identité suivant le principe du moindre privilège (PoLP) :

  • Application dotée du rôle d'application Administrateur de domaine d'identité (IDA). Vous utilisez un jeton d'accès généré à l'aide de cette application pour effectuer des opérations sur l'approbation de propagation d'identité (étape 4 : Créer une configuration d'approbation de propagation d'identité) et l'utilisateur de service (étape 3 : (Facultatif) Utiliser un utilisateur de service).
  • Une autre application de domaine d'identité sans le rôle d'application d'administrateur de domaine d'identité ou un rôle d'administrateur. Vous utilisez les données d'identification de client pour cette deuxième application de domaine d'identité pour appeler l'API d'échange de jetons. Vous devez autoriser l'utilisation de cette application avec l'échange de jetons en configurant un ID client pour l'application dans IdentityPropagationTrust.

En outre, l'application dotée d'un rôle d'application d'administrateur de domaine d'identité élevé peut également effectuer JWT vers UPST Token Exchange.

Génération d'un jeton d'accès avec le rôle d'administrateur de domaine d'identité

Utilisez l'application avec le rôle d'application Administrateur de domaine d'identité défini pour générer un jeton d'accès. Voir Génération de jetons d'accès. Utilisez le jeton d'accès généré pour effectuer des opérations CRUD (Créer, Remplacer, Mettre à jour, Supprimer) sur IdentityPropagationTrusts (Étape 4 : Créer une configuration de confiance de propagation d'identité) et l'utilisateur de service (Étape 3 : (Facultatif) Utiliser un utilisateur de service).

Note

Vous pouvez également générer un jeton d'accès personnel à utiliser sans créer d'applications. Cela offre l'avantage de ne pas laisser une application confidentielle avec le rôle d'administrateur de domaine d'identité. Vous devez être connecté au même domaine que celui dans lequel vous configurez l'approbation. Pour plus d'informations sur la génération d'un jeton d'accès personnel, voir Génération d'un jeton d'accès.

Étape 3 : (Facultatif) Utiliser un utilisateur de service

Un utilisateur de service est un utilisateur de domaine d'identité sans privilèges de connexion interactive. Ils ont des privilèges minimes.

Les utilisateurs du service peuvent être accordés aux groupes et aux applications. Les applications peuvent utiliser des utilisateurs de service ou l'utilisateur connecté peut emprunter l'identité de ceux-ci pour obtenir un jeton UPST temporaire.

Les utilisateurs du service ont les caractéristiques suivantes :

  • Vous devez avoir un userName. Le prénom et le nom de famille ne sont pas obligatoires.
  • Peut avoir une adresse de courriel (facultatif).
  • Peut être membre de groupes et de rôles d'application.
  • Impossible d'avoir des clés d'API.
  • Impossible d'utiliser des points d'extrémité en libre-service.
  • Impossible d'avoir des mots de passe et les politiques de mot de passe ne s'appliquent pas.
Note

L'utilisation d'un utilisateur de service est facultative. Si l'emprunt d'identité d'utilisateur est utilisé dans le cadre de la configuration Trust, les utilisateurs du service sont nécessaires. Sinon, tout autre utilisateur du domaine d'identité est utilisé. Seuls les administrateurs de domaine d'identité peuvent créer, remplacer, mettre à jour ou supprimer un utilisateur de service. D'autres administrateurs peuvent lire les utilisateurs du service et leurs attributs.

Exemple de demande : Créer un utilisateur de service

Voici un exemple de demande avec les attributs minimum requis pour créer un utilisateur de service avec l'attribut serviceUser réglé à true.

## POST on https://<domainURL>/admin/v1/Users
 
## Header:
"Authorization: Bearer <IDA_Access_Token>" \
"Content-Type: application/json"
 
## Payload:
{
    "schemas": [
        "urn:ietf:params:scim:schemas:core:2.0:User"
    ],
    "urn:ietf:params:scim:schemas:oracle:idcs:extension:user:User": {
        "serviceUser": true
    },
    "userName": "myServiceUserName"
}

Exemple de réponse : Créer un utilisateur de service

Voici un exemple de réponse lors de la création d'un utilisateur de service.

{
    "idcsCreatedBy": {
        "type": "App",
        "display": "admin"
    },
    "id": "<user_id>",
    "urn:ietf:params:scim:schemas:oracle:idcs:extension:user:User": {
        "isFederatedUser": false,
        "isGroupMembershipSyncedToUsersGroups": true,
        "serviceUser": true
    },
    "meta": {
        "created": "2023-12-07T06:52:55.380Z",
        "lastModified": "2023-12-07T06:52:55.380Z",
        "version": "<version>",
        "resourceType": "User",
        "location": "https://<domainURL>/admin/v1/Users/<user_id>"
    },
    "active": true,
    "idcsLastModifiedBy": {
        "display": "admin",
        "type": "App"
    },
    "urn:ietf:params:scim:schemas:oracle:idcs:extension:userState:User": {
        "locked": {
            "on": false
        }
    },
    "ocid": "ocid1.user.region1...<ocid>",
    "userName": "myServiceUserName",
    "schemas": [
        "urn:ietf:params:scim:schemas:core:2.0:User",
        "urn:ietf:params:scim:schemas:oracle:idcs:extension:userState:User",
        "urn:ietf:params:scim:schemas:oracle:idcs:extension:capabilities:User",
        "urn:ietf:params:scim:schemas:oracle:idcs:extension:user:User"
    ]
}

Étape 4 : Créer une configuration d'approbation de propagation d'identité

La configuration de l'approbation de propagation d'identité permet d'établir l'approbation entre l'identité OCI et les fournisseurs en nuage externes, la validation du jeton du fournisseur en nuage et le mappage de l'identité de l'utilisateur du fournisseur en nuage avec les domaines d'identité service de l'identité de l'utilisateur.

Description détaillée d'une configuration d'approbation de propagation d'identité
Attribut Obligatoire? Descriptions et exemples
name Oui

Nom de la fiducie.

type Oui

Type de jeton : jwt

issuer Oui

Utilisez un émetteur unique pour trouver l'identification de fiducie.

active Oui

Si cette option est activée, true.

Si cette option est désactivée, false.

oauthClients Oui

Liste des clients OAuth autorisés à obtenir des jetons pour un partenaire approuvé spécifique.

Exemple :
"oauthClients": [
 "oauthclient-id"
 ],
allowImpersonation (utiliser serviceUser) Nombre

Valeur booléenne. Indique si l'UPST résultant doit contenir l'utilisateur authentifié en tant que sujet ou s'il doit emprunter l'identité d'un utilisateur de service dans IAM.

impersonatingServiceUsers

Oui, si allowImpersonation est réglé à true.

Indique le principal résultant qui va emprunter l'identité en fonction du nom de la revendication de jeton et des conditions de valeur. Vous pouvez :

  • Autoriser un principal d'emprunt d'identité spécifique pour tous les utilisateurs authentifiés par le fournisseur d'identités (IdP).
  • Définissez des règles pour définir les conditions d'emprunt d'identité :
    • Basé sur le nom de la réclamation de jeton
    • Condition : contient (co) ou est égale à (eq)
    • Valeur :
      • Peut être une chaîne.
      • Le tableau de valeurs et les valeurs complexes/composites ne sont pas pris en charge.
      • Avec la condition égal à : la carte générique (*) est autorisée.
      • Avec la condition contient : la carte générique (*) n'est pas prise en charge.
    • Emprunt d'identité de principal.

Exemple :

  • Règle : "username" eq kafka*
  • Utilisateur de service mappé : kafka
  • Résultat : Tous les utilisateurs authentifiés commençant par le préfixe kafka reçoivent l'identité de l'utilisateur du service IAM kafka. L'UPST résultant contient kafka comme principal d'utilisateur authentifié.

Si l'emprunt d'identité est autorisé, le jeton de sécurité OCI (UPST) résultant aura la réclamation liée à l'utilisateur authentifié d'origine (source_authn_prin) ainsi que pour indiquer au nom duquel l'emprunt d'identité est effectué.

  • Si le nom de la revendication d'objet est configuré, il est utilisé pour extraire cette valeur de revendication.
  • Si le nom de la réclamation d'objet n'est pas configuré, la valeur par défaut est sub dans le jeton entrant. Si la revendication sub elle-même n'est pas présente, elle est ignorée.
L'évaluation s'arrête avec la première règle mise en correspondance et le principal résultant correspondant est retourné à l'aide de l'attribut de nom d'affichage. Si aucune règle n'est mise en correspondance, la demande de jeton échoue avec des erreurs.
publicCertificate Si le point d'extrémité de clé publique n'est pas fourni ou n'est pas disponible avec le fournisseur. Assurez-vous que la clé publique est obligatoire si aucun point d'extrémité de clé publique n'est indiqué.
publicKeyEndpoint Indiquez l'URL de l'API de clé publique ou la clé publique doit être chargée comme dans l'exemple suivant. API de clé publique du fournisseur de services infonuagiques. Les fournisseurs SAML et OIDC exposent l'API pour extraire la clé publique aux fins de validation de signature.

Vous pouvez également stocker le certificat public dans la configuration elle-même.

Exemple de demande : Créer une configuration d'approbation de propagation d'identité

Voici un exemple de demande de création d'une configuration d'approbation de propagation d'identité.
## POST on https://<secureDomainURL>/admin/v1/IdentityPropagationTrusts
## Header:
"Authorization: Bearer <IDA_Access_Token>" \
"Content-Type: application/json"
 
## Payload:
{
  "active": true,
  "allowImpersonation": true,
  "issuer": "<<UNIQUE_ISSUER_VALUE>>",
  "name": "Token Trust JWT to UPST",
  "oauthClients": [
  "<oauthclient-id>"
  ],
  "publicCertificate": "<public_certificate_value>",
  "publicKeyEndpoint": "https://example.identityprovider.com/publickey/<publickey_value>",
  "clientClaimName": "client_claim_name",
  "clientClaimValues": [
  "<<client_claim_value>>"
  ],
  "impersonationServiceUsers": [
    {
      "rule": "sub eq *",
      "value": "<<user_id>>"
    }
  ],
  "subjectType": "User",
  "type": "JWT",
  "schemas": [
  "urn:ietf:params:scim:schemas:oracle:idcs:IdentityPropagationTrust"
  ]
}

Exemple de réponse

{
  "active": true,
  "allowImpersonation": true,
  "issuer": "<<UNIQUE_ISSUER_VALUE>>",
  "name": "Token Trust JWT to UPST",
  "oauthClients": [
  "<oauthclient-id>"
  ],
  "publicCertificate": "<public_certificate_value>",
  "publicKeyEndpoint": "https://example.identityprovider.com/publickey/<publickey_value>",
  "clientClaimName": "client_claim_name",
  "clientClaimValues": [
  "<<client_claim_value>>"
  ],
  "subjectType": "User",
  "type": "JWT",
  "schemas": [
  "urn:ietf:params:scim:schemas:oracle:idcs:IdentityPropagationTrust"
  ]
}

Exemple de demande : Pour allowImpersonation, réglez la valeur à false Identity Propagation Trust Configuration

{
    "active": true,
    "allowImpersonation": false,
    "issuer": "<<issuer_value>>",
    "name": "Token Trust JWT to UPST",
    "oauthClients": [
        "25d123....."
    ],
    "publicKeyEndpoint": "https://<<secureDomainURL>>/admin/v1/SigningCert/jwk",
    "clientClaimName": "client_name",
    "clientClaimValues": ["<<client_name_value>>"],
    "subjectClaimName": "sub",
    "subjectMappingAttribute": "userName",
    "subjectType": "User",
    "type": "JWT",
    "schemas": [
        "urn:ietf:params:scim:schemas:oracle:idcs:IdentityPropagationTrust"
    ]
}

Exemple de demande : Extraction d'une configuration d'approbation de propagation d'identité

## GET on https://<secureDomainURL>/admin/v1/IdentityPropagationTrusts/{{id}}
## Header:
"Authorization: Bearer <IDA_Access_Token>"

Si allowImpersonation est réglé à "true" et que impersonationServiceUsers est défini dans la fiducie de propagation d'identité, utilisez l'exemple de demande suivant.

## GET on https://<secureDomainURL>/admin/v1/IdentityPropagationTrusts/{{id}}?attributes=impersonationServiceUsers
## Header:
"Authorization: Bearer <IDA_Access_Token>"

Exemple de réponse

{
  "active": true,
  "allowImpersonation": true,
  "issuer": "<<UNIQUE_ISSUER_VALUE>>",
  "name": "Token Trust JWT to UPST",
  "oauthClients": [
  "<oauthclient-id>"
  ],
  "publicCertificate": "<public_certificate_value>",
  "publicKeyEndpoint": "https://example.identityprovider.com/publickey/<publickey_value>",
  "clientClaimName": "client_claim_name",
  "clientClaimValues": [
  "<<client_claim_value>>"
  ],
  "subjectClaimName": "sub",
  "subjectMappingAttribute": "userName",
  "subjectType": "User",
  "type": "JWT",
  "impersonationServiceUsers": [
  {
       "ocid": "ocid1.user.oc1..this.is.user.ocid",
       "rule": "sub eq *",
       "value": "<<user_id>>",
       "$ref": "https://<<secureDomainURL>>/admin/v1/Users/<<user_id>>"
  }
  "schemas": [
  "urn:ietf:params:scim:schemas:oracle:idcs:IdentityPropagationTrust"
  ]
}

Étape 5 : Génération d'une clé publique

Utilisez les commandes suivantes dans un terminal (Linux/macOS) ou Git Bash sous Windows :

# Generate a 2048-bit RSA private key
openssl genrsa -out private_key.pem 2048
 
# Extract the public key in PEM format
openssl rsa -in private_key.pem -pubout -out public_key.pem

Après les avoir exécutées :

  • private_key.pem est la clé privée utilisée pour signer le jeton JWT.

  • public_key.pem est la clé publique utilisée par OCI pour vérifier la signature JWT.

Note

Gardez la clé privée sécurisée. Partagez uniquement la clé publique avec OCI.

Étape 6 : Générer un jeton JWT pour échanger contre UPST

Générez un jeton JWT avec le flux de travail des données d'identification par mot de passe du responsable de la ressource, le flux de travail des données d'identification du client et le flux de travail d'assertion d'utilisateur d'OCI, ou avec toute IdPs externe telle que Microsoft Entra ID, Google Firebase Authentication, AWS Cognito, Okta, etc. Le jeton JWT généré :

  • Contient les réclamations relatives à l'utilisateur ou à la charge de travail.

  • Est signé par la clé privée du fournisseur d'identités afin qu'OCI puisse vérifier son authenticité à l'aide de la clé publique.

  • Est échangé au point d'extrémité du jeton de sécurité d'OCI contre une UPST.

Étape 7 : Obtenir OCI UPST

JWT est échangé au niveau du point d'extrémité d'échange de jetons OCI. Le point d'extrémité du jeton décode et vérifie la signature JWT à l'aide de la clé publique de la configuration d'approbation, valide l'émetteur et les revendications correspondantes, comme défini dans l'approbation de propagation d'identité, et génère UPST.

La réception UPST générée est utilisée pour accéder aux ressources à l'aide de la trousse SDK/de l'API OCI.

Description détaillée des données utiles de demande de jeton UPST
Paramètre de demande Valeur valide
grant_type

'grant_type=urn:ietf:params:oauth:grant-type:token-exchange'

requested_token_type

'requested_token_type=urn:oci:token-type:oci-upst'

public_key

'public_key=<public-key-value>'

Le flux de travail de la clé publique :

  1. La charge globale génère une paire de clés.
  2. La clé publique est envoyée dans le cadre de la demande d'échange de jetons, qui est ajoutée en tant que réclamation, jwk, dans l'UPST résultant.
  3. La clé privée est utilisée pour générer les signatures OCI pour l'appel d'API des services natifs OCI avec l'UPST.
  4. L'authentification des services OCI valide l'UPST, extrait la revendication jwk de l'UPST, puis l'utilise pour valider la signature OCI.
subject_token_type

'subject_token_type=jwt

  • jwt
subject_token

'subject_token=<subject-token>'

Si le type de jeton est :

  • jwt ou assertion la valeur telle quelle.

Exemple de demande de jeton UPST : Basé sur une application de domaine d'identité

Voici un exemple de demande cURL basée sur une application de domaine d'identité OCI.

## IAM Domain App Based Request. Note that client credentials can be sent as part of basic authn header or in the payload. 
curl --location ' https://<domainURL>/oauth2/v1/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic <auth_code>' \
--data-urlencode 'grant_type=urn:ietf:params:oauth:grant-type:token-exchange' \
--data-urlencode 'requested_token_type=urn:oci:token-type:oci-upst' \
--data-urlencode 'public_key=<public_key>' \
--data-urlencode 'subject_token=<subject_token>' \
--data-urlencode 'subject_token_type=jwt' -k
{
   "token": "<token_id>"
}