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

L'échange de jetons JWT vers 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 OCI ni les clés d'API.

  • JWT (jeton Web JSON) : émis par un élément IdP sécurisé tel que les fournisseurs d'identités externes ou natifs OCI (IdPs), il contient des réclamations signées concernant l'utilisateur ou le service.
  • UPST (jeton de sécurité de principal utilisateur) : jeton de courte durée accepté par OCI comme authentification pour l'accès à l'API.
  • L'adresse d'échange de jetons valide le jeton JWT, extrait les demandes et émet un UPST de courte durée.

Les utilisateurs authentifiés à l'aide d'IdPs externe, tels qu'Okta, Microsoft Entra ID et autres, ou d'OCI IdP lui-même, peuvent ainsi accéder aux ressources OCI.

Termes du jeton JWT
Terme Description
API du service IAM Token Exchange Service OAuth de domaine d'identité IAM : /oauth2/v1/token. L'API accepte à la fois les en-têtes/la charge utile d'authentification standard basés sur OAuth et les signatures OCI. Pour savoir comment utiliser un client OAuth avec un domaine d'identité afin d'accéder aux API REST, reportez-vous à Utilisation de OAuth 2 pour accéder à l'API REST.
Configuration de sécurisation de propagation d'identité Utilisez des configurations sécurisées de propagation des identités pour activer la propagation sécurisée des identités de bout en bout à partir 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 une correspondance sécurisée entre l'identité de l'utilisateur externe et un utilisateur ou principal de service IAM dans OCI.

En envoyant le contexte de sécurité de l'utilisateur authentifié du front-end (par exemple, une adresse IdP externe) aux services back-end au sein d'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 auditabilité détaillée des appels d'API et prend en charge des scénarios d'authentification avancés. L'adresse d'API /IdentityPropagationTrust est indépendante du cloud et prend en charge les intégrations avec n'importe quel fournisseur cloud.

Pour créer une configuration sécurisée de propagation d'identité, reportez-vous à Etape 4 : création d'une configuration sécurisée de propagation d'identité.
Utilisateur de service Utilisateur sans privilèges de connexion interactifs. Les utilisateurs de service peuvent être accordés à des groupes et des rôles de service. Les applications peuvent utiliser les utilisateurs de service ou les utilisateurs connectés peuvent usurper leur identité pour obtenir un UPST temporaire. L'utilisation d'un utilisateur de service est facultative. Pour plus d'informations sur l'utilisation des utilisateurs de service, reportez-vous à Etape 3 : (Facultatif) Utiliser un utilisateur de service.
Jeton de session utilisateur principal (UPST) Jeton généré par OCI IAM pouvant être utilisé pour accéder aux services OCI (plan de contrôle OCI). Un UPST est également appelé jeton de sécurité lorsque vous l'utilisez avec un kit SDK ou Terraform. Il représente le principal d'utilisateur de service authentifié.

Flux

Diagramme illustrant le flux JWT vers UPST.

Avis de non-responsabilité : tous les noms de produits, logos, marques et logos sont des marques commerciales de leurs propriétaires respectifs et utilisés ici à titre informatif uniquement.

Etapes d'échange de jetons JWT vers UPST

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

  1. Step1 : (facultatif) création d'un domaine d'identité
  2. Etape 2 : création d'applications de domaine d'identité
  3. Etape 3 : (facultatif) utilisation d'un utilisateur de service
  4. Etape 4 : création d'une configuration sécurisée de propagation d'identité
  5. Etape 5 : génération d'une clé publique
  6. Etape 6 : génération d'un jeton JWT à échanger contre UPST
  7. Etape 7 : Obtention de l'UPST OCI

Step1 : (facultatif) création d'un domaine d'identité

Créez un domaine d'identité s'il n'existe pas. Reportez-vous à Création d'un domaine d'identité.

Etape 2 : création d'applications de domaine d'identité

Un client OAuth est une application sécurisée inscrite auprès d'Identity Cloud Service pour l'authentification et l'obtention de 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.

Reportez-vous à Ajout d'une application confidentielle. Une fois l'application créée, 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é en suivant le principe du moindre privilège (PoLP) :

  • Application avec le 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 la sécurisation de propagation d'identité (Etape 4 : création d'une configuration de sécurisation de propagation d'identité) et l'utilisateur de service (Etape 3 : utilisation d'un utilisateur de service (facultatif)).
  • Une autre application de domaine d'identité sans rôle d'application d'administrateur de domaine d'identité ou aucun rôle d'administrateur. Vous utilisez les informations d'identification client pour cette deuxième application de domaine d'identité afin d'appeler l'API d'échange de jetons. Vous devez autoriser cette application à être utilisée avec l'échange de jetons en configurant un ID client pour l'application dans IdentityPropagationTrust.

En outre, l'application avec le rôle d'application 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. Reportez-vous à Génération de jetons d'accès. Utilisez le jeton d'accès généré pour effectuer des opérations CRUD (création, remplacement, mise à jour, suppression) sur IdentityPropagationTrusts (Etape 4 : création d'une configuration sécurisée de propagation d'identité) et l'utilisateur de service (Etape 3 : (facultatif) utilisation d'un utilisateur de service).

Remarque

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 domaine 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.

Etape 3 : (facultatif) utilisation d'un utilisateur de service

Un utilisateur de service est un utilisateur de domaine d'identité sans privilèges de connexion interactifs. Ils ont un minimum de privilèges.

Les utilisateurs de service peuvent être accordés à des groupes et des applications. Les applications peuvent utiliser des utilisateurs de service ou l'utilisateur connecté peut les usurper d'identité pour obtenir un jeton UPST temporaire.

Les utilisateurs du service présentent les caractéristiques suivantes :

  • Doit avoir un élément userName. Le prénom et le nom ne sont pas obligatoires.
  • Peut avoir une adresse e-mail (facultatif).
  • Peut être membre de groupes et de rôles d'application.
  • Impossible d'avoir des clés d'API.
  • Impossible d'utiliser des adresses en libre-service.
  • Impossible d'avoir des mots de passe et les stratégies de mot de passe ne s'appliquent pas.
Remarque

L'utilisation d'un utilisateur de service est facultative. Si l'emprunt d'identité utilisateur est utilisé dans le cadre de la configuration sécurisée, les utilisateurs de service sont nécessaires. Sinon, tout autre utilisateur de 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 de service et leurs attributs.

Exemple de demande : création d'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 défini sur 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éation d'un utilisateur de service

L'exemple suivant illustre une 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"
    ]
}

Etape 4 : création d'une configuration sécurisée de propagation d'identité

La configuration de sécurisation de propagation des identités est utilisée pour établir la sécurisation entre OCI Identity et les fournisseurs cloud externes, la validation du jeton de fournisseur cloud et la mise en correspondance de l'identité utilisateur du fournisseur cloud avec l'identité utilisateur service des domaines d'identité.

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

Nom de l'approbation.

type Oui

Type de jeton : jwt

issuer Oui

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

active Oui

Si cette option est activée, true.

Si elle est désactivée, false.

oauthClients Oui

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

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

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 défini sur true.

Indique le principal qui va imiter en fonction du nom de la demande de jeton et des conditions de valeur. Vous pouvez effectuer les opérations suivantes :

  • Autorisez 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é :
    • En fonction du nom de la demande de jeton
    • Condition : contient (co) ou est égal à (eq)
    • Valeur :
      • Peut être une chaîne.
      • Les tableaux de valeurs et les valeurs complexes/composites ne sont pas pris en charge.
      • Avec la condition égal à : carte joker (*) est autorisé.
      • Avec la condition contient : la carte joker (*) n'est pas pris en charge.
    • Identité du principal.

Exemple :

  • Règle : "username" eq kafka*
  • Utilisateur de service mis en correspondance : kafka
  • Résultat : tous les utilisateurs authentifiés commençant par le préfixe kafka empruntent l'identité de l'utilisateur de service IAM kafka. L'UPST obtenu contient kafka en tant que principal d'utilisateur authentifié.

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

  • Si le nom de la réclamation objet est configuré, il est utilisé pour extraire cette valeur de réclamation.
  • Si le nom de la demande d'objet n'est pas configuré, il est défini par défaut sur 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 renvoyé à l'aide de l'attribut de nom d'affichage. Si aucune règle ne correspond, la demande de jeton échoue avec des erreurs.
publicCertificate Si l'adresse de clé publique n'est pas fournie ou n'est pas disponible avec le fournisseur. Assurez-vous que la clé publique est obligatoire si aucune adresse de clé publique n'est fournie.
publicKeyEndpoint Indiquez l'URL de l'API de clé publique ou téléchargez la clé publique comme indiqué dans l'exemple suivant. API de clé publique du fournisseur cloud. Les fournisseurs SAML et OIDC exposent l'API pour extraire la clé publique à des fins de validation de signature.

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

Exemple de demande : création d'une configuration sécurisée de propagation d'identité

Voici un exemple de demande de création d'une configuration de sécurisation 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, définissez la configuration sécurisée de propagation d'identité sur false

{
    "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 sécurisée de propagation d'identité

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

Si allowImpersonation est défini sur "true" et que impersonationServiceUsers est défini dans la sécurisation 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"
  ]
}

Etape 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 l'exécution de ces opérations :

  • 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.

Remarque

Sécurisez la clé privée. Partagez uniquement la clé publique avec OCI.

Etape 6 : génération d'un jeton JWT à échanger contre UPST

Générez un jeton JWT avec le workflow d'informations d'identification de mot de passe de propriétaire de ressource d'OCI, le workflow d'informations d'identification client et le workflow d'assertion utilisateur, ou avec tout IdPs externe tel que Microsoft Entra ID, l'authentification Google Firebase, AWS Cognito, Okta, etc. Jeton JWT généré :

  • Contient des demandes concernant 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 niveau de l'adresse de jeton de sécurité d'OCI contre un UPST.

Etape 7 : Obtention de l'UPST OCI

Le jeton JWT est échangé à l'adresse d'échange de jetons OCI. L'adresse de jeton décode et vérifie la signature JWT à l'aide de la clé publique de la configuration de sécurisation, valide les demandes d'émetteur et de correspondance telles que définies dans la sécurisation de propagation d'identité et génère l'UPST.

L'UPST généré reçu est utilisé pour accéder aux ressources à l'aide du kit SDK/API OCI.

Description détaillée de la charge utile 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 workflow de 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 demande, 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 demande 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>"
}