Tipo di concessione scambio token: scambio di un token Web JSON per un UPST

Lo scambio di token da JWT a UPST consente alle identità federate (utenti o applicazioni autenticate utilizzando IDCS o un altro provider di identità) di accedere in modo sicuro ai servizi OCI (OCI Control Plane) senza gestire gli utenti nativi OCI o le chiavi API.

  • JWT (JSON Web Token): emesso da un IdP affidabile, ad esempio provider di identità esterni o nativi OCI (IdPs), contiene richieste firmate relative all'utente o al servizio.
  • UPST (User Principal Security Token): token OCI di breve durata accettato come autenticazione per l'accesso alle API.
  • L'endpoint di scambio token convalida il JWT, estrae le richieste ed emette un UPST di breve durata.

Ciò consente agli utenti autenticati utilizzando IdPs esterno, ad esempio Okta, Microsoft Entra ID e altri, o OCI IdP stesso, di ottenere l'accesso alle risorse OCI.

Condizioni token JWT
Durata Descrizione
API servizio scambio token IAM Servizio OAuth del dominio di Identity IAM: /oauth2/v1/token. L'API accetta sia intestazioni/payload di autenticazione basati su OAuth standard che firme OCI. Per informazioni su come utilizzare un client OAuth con un dominio di Identity per accedere alle API REST, vedere Uso di OAuth 2 per accedere all'API REST.
Configurazione sicura propagazione identità Utilizza le configurazioni Trust di propagazione delle identità per abilitare la propagazione sicura delle identità end-to-end da un provider di identità esterno (IdP) a Oracle Cloud Infrastructure (OCI). Questo meccanismo consente a OCI Identity di convalidare il token dell'IdP esterno e di stabilire un mapping sicuro tra l'identità dell'utente esterno e un utente o un principal servizio IAM in OCI.

Con l'invio del contesto di sicurezza dell'utente autenticato dal frontend (ad esempio, un IdP esterno) ai servizi backend in OCI, la propagazione delle identità elimina la necessità di account generici o con privilegi. Migliora la sicurezza, abilita l'audit dettagliato delle chiamate API e supporta scenari di autenticazione avanzati. L'endpoint API /IdentityPropagationTrust è indipendente dal cloud e supporta le integrazioni con qualsiasi provider cloud.

Per creare una configurazione attendibile di propagazione delle identità, vedere Passo 4: creazione di una configurazione attendibile di propagazione delle identità.
Utente servizio Un utente senza privilegi di accesso interattivo. Gli utenti del servizio possono essere concessi a gruppi e ruoli di servizio. Le applicazioni possono utilizzare gli utenti del servizio o gli utenti che hanno eseguito il login possono rappresentarli per ottenere un UPST temporaneo. L'uso di un utente del servizio è facoltativo. Per ulteriori informazioni sull'uso degli utenti del servizio, vedere Passo 3: (facoltativo) uso di un utente del servizio.
Token sessione principal utente (UPST) Token generato da IAM OCI che può essere utilizzato per accedere ai servizi OCI (OCI Control Plane). Un UPST è noto anche come token di sicurezza quando lo si utilizza con SDK o Terraform. Rappresenta il principal utente del servizio autenticato.

Flusso

Diagramma che illustra il flusso da JWT a UPST.

Dichiarazione di non responsabilità: tutti i nomi dei prodotti, i logo, i marchi e i loghi sono marchi dei rispettivi proprietari e vengono utilizzati qui solo a scopo informativo.

Passi di scambio token JWT-UPST

Per scambiare un token JWT con un UPST, attenersi alla procedura riportata di seguito.

  1. Step1: (facoltativo) creazione di un dominio di Identity
  2. Passo 2: creare le applicazioni del dominio di Identity
  3. Passo 3: (facoltativo) utilizzare un utente del servizio
  4. Passo 4: creare una configurazione sicura per la propagazione delle identità
  5. Passaggio 5: generazione di una chiave pubblica
  6. Passo 6: Genera un token JWT per lo scambio con UPST
  7. Passo 7: ottieni OCI UPST

Step1: (facoltativo) creazione di un dominio di Identity

Creare un nuovo dominio di Identity se non esiste. Vedere Creazione di un dominio di Identity.

Passo 2: creare le applicazioni del dominio di Identity

Un client OAuth è un'applicazione sicura registrata con Identity Cloud Service per autenticare e ottenere i token di accesso utilizzando i flussi OAuth 2.0. Il client è utilizzato per:

  • Ottenere un token di accesso per chiamare le API di amministrazione IDCS.

  • Federare l'identità dell'applicazione per scambiare JWT con UPST.

Vedere Aggiunta di un'applicazione riservata. Dopo aver creato l'applicazione, salvare i valori di ID client e segreto client in una posizione sicura. Il principio di privilegio minimo è richiesto da due applicazioni del dominio di Identity (PoLP):

  • Applicazione con ruolo di amministratore del dominio di Identity (IDA). Si utilizza un token di accesso generato utilizzando questa applicazione per eseguire operazioni sull'attendibilità della propagazione delle identità (Passo 4: creazione di una configurazione attendibile della propagazione delle identità) e sull'utente del servizio (Passo 3: (facoltativo) uso di un utente del servizio).
  • Un'altra applicazione del dominio di Identity senza il ruolo applicazione Amministratore dominio di Identity o qualsiasi ruolo di amministratore. Si utilizzano le credenziali client per questa seconda applicazione del dominio di Identity per richiamare l'API di scambio token. È necessario autorizzare questa applicazione a essere utilizzata con lo scambio di token configurando un ID client per l'applicazione in IdentityPropagationTrust.

Inoltre, l'applicazione con ruolo di amministratore del dominio di Identity elevato può eseguire anche JWT to UPST Token Exchange.

Generazione di un token di accesso con ruolo di amministratore del dominio di Identity

Utilizzare l'applicazione con il ruolo applicazione Amministratore dominio di Identity definito per generare un token di accesso. Vedere Generazione di token di accesso. Utilizzare il token di accesso generato per eseguire operazioni CRUD (Create, Replace, Update, Delete) su IdentityPropagationTrusts (Step 4: Create an Identity Propagation Trust Configuration) e sull'utente del servizio (Step 3: (Facoltativo) Use a Service User).

Nota

In alternativa, è possibile generare un token di accesso personale da utilizzare senza creare applicazioni. Ciò offre il vantaggio di non lasciare un'applicazione riservata con il ruolo Amministratore dominio di Identity. È necessario accedere allo stesso dominio in cui si sta configurando l'attendibilità. Per informazioni sulla generazione di un token di accesso personale, vedere Generazione di un token di accesso.

Passo 3: (facoltativo) utilizzare un utente del servizio

Un utente del servizio è un utente del dominio di Identity senza privilegi di accesso interattivo. Hanno privilegi minimi.

Gli utenti del servizio possono essere concessi a gruppi e applicazioni. Le applicazioni possono utilizzare gli utenti del servizio o l'utente connesso può rappresentarli per ottenere un token UPST temporaneo.

Gli utenti del servizio presentano le caratteristiche riportate di seguito.

  • Deve avere un indirizzo userName. Nome e cognome non sono obbligatori.
  • Può avere un indirizzo di posta elettronica (facoltativo).
  • Può essere un membro di gruppi e ruoli applicazione.
  • Non può avere API key.
  • Impossibile utilizzare gli endpoint self-service.
  • Non può avere password e i criteri password non sono validi.
Nota

L'uso di un utente del servizio è facoltativo. Se la rappresentazione utente viene utilizzata come parte della configurazione Trust, sono necessari gli utenti del servizio. In caso contrario, viene utilizzato qualsiasi altro utente del dominio di Identity. Solo gli amministratori del dominio di Identity possono creare, sostituire, aggiornare o eliminare un utente del servizio. Altri amministratori possono leggere gli utenti del servizio e i relativi attributi.

Esempio di richiesta: creazione di un utente servizio

Di seguito è riportato un esempio di richiesta con gli attributi minimi necessari per creare un utente del servizio con l'attributo serviceUser impostato su 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"
}

Esempio di risposta: creazione di un utente servizio

Di seguito è riportato un esempio di risposta durante la creazione di un utente del servizio.

{
    "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"
    ]
}

Passo 4: creare una configurazione sicura per la propagazione delle identità

La configurazione Trust di propagazione delle identità viene utilizzata per stabilire l'affidabilità tra OCI Identity e i provider cloud esterni, la convalida del token del provider cloud e il mapping dell'identità utente del provider cloud con l'identità utente dei domini di identità service.

Descrizione dettagliata di una configurazione sicura di propagazione delle identità
Attribute Obbligatorio? Descrizioni ed esempi
name

Il nome del trust.

type

Tipo di token: jwt

issuer

Utilizzare un emittente univoco per trovare l'identificazione del trust.

active

Se abilitato, true.

Se disabilitata, false.

oauthClients

Lista di client OAuth autorizzati a ottenere token per un partner sicuro specifico.

Esempio:
"oauthClients": [
 "oauthclient-id"
 ],
allowImpersonation (utilizzare serviceUser) N

Valore booleano. Specifica se l'UPST risultante deve contenere l'utente autenticato come oggetto o se deve rappresentare un utente del servizio in IAM.

impersonatingServiceUsers

Sì, se allowImpersonation è impostato su true.

Specifica quale principal risultante rappresenterà in base al nome della richiesta di token e alle condizioni del valore. È possibile effettuare le operazioni riportate di seguito.

  • Consentire un principal rappresentante specifico per tutti gli utenti autenticati del provider di identità (IdP).
  • Impostare le regole per definire le condizioni di rappresentazione:
    • In base al nome richiesta token
    • Condizione: contiene (co) o è uguale a (eq)
    • Valore:
      • Può essere una stringa.
      • Array di valori e valori complessi/compositi non supportato.
      • Con la condizione uguale a: è consentito il carattere jolly (*).
      • Con la condizione contiene: il carattere jolly (*) non è supportato.
    • Rappresentazione principale.

Esempio:

  • Regola: "username" eq kafka*
  • Utente del servizio mappato: kafka
  • Risultato: tutti gli utenti autenticati che iniziano con il prefisso kafka vengono rappresentati con l'utente del servizio IAM kafka. L'UPST risultante contiene kafka come principal utente autenticato.

Se è consentita la rappresentazione, il token di sicurezza OCI (UPST) risultante avrà anche la richiesta correlata all'utente autenticato originale (source_authn_prin) per indicare per conto di chi è stata eseguita la rappresentazione.

  • Se il nome della richiesta di rimborso oggetto è configurato, viene utilizzato per estrarre il valore della richiesta.
  • Se il nome della richiesta di rimborso oggetto non è configurato, per impostazione predefinita viene utilizzato sub nel token in entrata. Se la richiesta sub non è presente, viene ignorata.
La valutazione si interrompe con la prima regola corrispondente e il principal risultante corrispondente viene restituito utilizzando l'attributo nome visualizzato. Se non viene trovata una corrispondenza con alcuna regola, la richiesta del token non riesce con errori.
publicCertificate Se l'endpoint della chiave pubblica non viene fornito o non è disponibile con il provider. Assicurarsi che la chiave pubblica sia obbligatoria se non viene fornito un endpoint della chiave pubblica.
publicKeyEndpoint Fornire l'URL API della chiave pubblica oppure la chiave pubblica deve essere caricata come nell'esempio riportato di seguito. API della chiave pubblica del provider cloud. I provider SAML e OIDC espongono l'API per recuperare la chiave pubblica per la convalida della firma.

In alternativa, memorizzare il certificato pubblico nella configurazione stessa.

Esempio di richiesta: creazione di una configurazione sicura di propagazione delle identità

Di seguito è riportato un esempio di richiesta di creazione di una configurazione Trust di propagazione delle 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"
  ]
}

Esempio di risposta

{
  "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"
  ]
}

Esempio di richiesta: per allowImpersonation impostato su 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"
    ]
}

Esempio di richiesta: recupero di una configurazione sicura di propagazione delle identità

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

Se allowImpersonation è impostato su "true" e impersonationServiceUsers è definito nel Trust di propagazione delle identità, utilizzare l'esempio di richiesta riportato di seguito.

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

Esempio di risposta

{
  "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"
  ]
}

Passaggio 5: generazione di una chiave pubblica

Utilizzare i comandi seguenti in un terminale (Linux/macOS) o Git Bash su 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

Dopo aver eseguito le operazioni riportate di seguito.

  • private_key.pem è la chiave privata, utilizzata per firmare il JWT.

  • public_key.pem è la chiave pubblica, utilizzata da OCI per verificare la firma JWT.

Nota

Mantenere la chiave privata sicura. Condividi solo la chiave pubblica con OCI.

Passo 6: Genera un token JWT per lo scambio con UPST

Generare un token JWT con il flusso di lavoro delle credenziali password del proprietario della risorsa di OCI, il flusso di lavoro delle credenziali client e il flusso di lavoro di asserzione degli utenti di OCI o con qualsiasi IdPs esterno, ad esempio Microsoft Entra ID, Google Firebase Authentication, AWS Cognito, Okta e altri. Il token JWT generato:

  • Contiene le richieste relative all'utente o al carico di lavoro.

  • È firmato dalla chiave privata dell'IdP in modo che OCI possa verificarne l'autenticità utilizzando la chiave pubblica.

  • Viene scambiato all'endpoint del token di sicurezza di OCI per un UPST.

Passo 7: ottieni OCI UPST

JWT viene scambiato all'endpoint di scambio di token OCI. L'endpoint del token decodifica e verifica la firma JWT utilizzando la chiave pubblica dalla configurazione trust, convalida l'emittente e le richieste corrispondenti come definito nel Trust di propagazione delle identità e genera UPST.

La ricezione generata da UPST viene utilizzata per accedere alle risorse utilizzando l'SDK/API OCI.

Descrizione dettagliata del payload della richiesta token UPST
Parametro richiesta Valore valido
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>'

Workflow della chiave pubblica:

  1. Il carico di lavoro genera un paio di chiavi.
  2. La chiave pubblica viene inviata come parte della richiesta di scambio di token, che viene aggiunta come richiesta, jwk, nell'UPST risultante.
  3. La chiave privata viene utilizzata per generare le firme OCI per il richiamo dell'API dei servizi nativi OCI insieme all'UPST.
  4. L'autenticazione dei servizi OCI convalida l'UPST, estrae la richiesta di rimborso jwk dall'UPST e la utilizza per convalidare la firma OCI.
subject_token_type

'subject_token_type=jwt

  • jwt
subject_token

'subject_token=<subject-token>'

Se il tipo di token è:

  • jwt o assertion il valore così com'è.

Esempio di richiesta token UPST: basato sull'applicazione del dominio di Identity

Di seguito è riportato un esempio di richiesta cURL basata su applicazione del dominio di Identity 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>"
}