Tipo de Concessão de Intercâmbio de Token: Trocando um Token Web JSON para um UPST

A troca de tokens JWT-to-UPST permite que identidades federadas (usuários ou aplicativos autenticados usando o IDCS ou outro provedor de identidades) acessem com segurança os serviços do OCI (OCI Control Plane) sem gerenciar usuários nativos do OCI ou chaves de API.

  • JWT (JSON Web Token): Emitido por um IdP confiável, como provedores de identidade externos ou nativos do OCI (IdPs), ele contém reivindicações assinadas sobre o usuário ou o serviço.
  • UPST (User Principal Security Token): Um token de curta duração da OCI aceito como autenticação para acesso à API.
  • O Ponto Final de Troca de Token valida o JWT, extrai reivindicações e emite um UPST de curta duração.

Isso permite que os usuários autenticados usando IdPs externo, como Okta, Microsoft Entra ID e outros, ou o próprio OCI IdP, obtenham acesso aos recursos do OCI.

Termos do Token JWT
Termo Descrição
API do Serviço IAM Token Exchange Serviço OAuth do domínio de identidades do IAM: /oauth2/v1/token. A API aceita cabeçalhos/payload de autenticação baseados no padrão OAuth e assinaturas do OCI. Para saber como usar um cliente OAuth com um domínio de identidades para acessar as APIs REST, consulte Usando o OAuth 2 para Acessar a API REST.
Configuração de Confiança da Propagação de Identidades Use as configurações de Confiança de Propagação de Identidade para permitir a propagação segura de identidade de ponta a ponta de um provedor de identidades externo (IdP) para o OCI (Oracle Cloud Infrastructure). Esse mecanismo permite que o OCI Identity valide o token do IdP externo e estabeleça um mapeamento confiável entre a identidade do usuário externo e um usuário ou principal de serviço do IAM no OCI.

Ao enviar o contexto de segurança do usuário autenticado do frontend (por exemplo, um IdP externo) para os serviços de backend no OCI, a propagação de identidade elimina a necessidade de contas genéricas ou privilegiadas. Ele aprimora a segurança, permite a auditoria detalhada de chamadas de API e suporta cenários de autenticação avançada. O ponto final da API /IdentityPropagationTrust é independente da nuvem e suporta integrações com qualquer provedor de nuvem.

Para criar uma configuração de Confiança de Propagação de Identidade, consulte a Etapa 4: Criar uma Configuração de Confiança de Propagação de Identidade.
Usuário do Serviço Um usuário sem privilégios de conexão interativa. Os usuários de serviço podem ser concedidos a grupos e atribuições de serviço. Os aplicativos podem usar usuários de serviço ou usuários conectados podem se passar por eles para obter um UPST temporário. O uso de um usuário de serviço é opcional. Para obter mais informações sobre como usar usuários de serviço, consulte a Etapa 3: (Opcional) Usar um Usuário de Serviço.
Token da Sessão Principal do Usuário (UPST) Um token gerado pelo OCI IAM que pode ser usado para acessar serviços do OCI (OCI Control Plane). Um UPST também é conhecido como token de segurança quando você o usa com SDK ou Terraform. Representa o principal do usuário do serviço autenticado.

Fluxo

Um diagrama que ilustra o fluxo JWT para UPST.

Isenção de responsabilidade: todos os nomes de produtos, logotipos e marcas e logotipos são marcas comerciais de seus respectivos proprietários e utilizados aqui apenas para fins informativos.

Etapas de Troca de Token JWT para UPST

Use as seguintes etapas para trocar um token JWT por um UPST:

  1. Step1: (Opcional) Criando um Domínio de Identidades
  2. Etapa 2: Criar Aplicativos do Domínio de Identidades
  3. Etapa 3: (Opcional) Usar um Usuário de Serviço
  4. Etapa 4: Criar uma Configuração de Confiança de Propagação de Identidade
  5. Etapa 5: Gerando uma Chave Pública
  6. Etapa 6: Gerar um Token JWT para trocar pelo UPST
  7. Etapa 7: Obtenha o OCI UPST

Step1: (Opcional) Criando um Domínio de Identidades

Crie um novo domínio de identidades se ele não existir. Consulte Criando um Domínio de Identidades.

Etapa 2: Criar Aplicativos do Domínio de Identidades

Um Cliente OAuth é um aplicativo confiável registrado no Identity Cloud Service para autenticar e obter tokens de acesso usando fluxos do OAuth 2.0. Você usa este cliente para:

  • Obtenha um token de acesso para chamar APIs de Administrador do IDCS.

  • Federar a identidade do aplicativo para trocar JWT pelo UPST.

Consulte Adicionando um Aplicativo Confidencial. Depois de criar o aplicativo, salve o id do cliente e o segredo do cliente em um local seguro. Você precisa de dois aplicativos de domínio de identidades seguindo o Princípio do Privilégio Mínimo (PoLP):

  • Um aplicativo com a atribuição de Aplicativo IDA (Identity Domain Administrator). Você usa um token de acesso gerado usando este aplicativo para executar operações na Confiança de Propagação de Identidade (Etapa 4: Criar uma Configuração de Confiança de Propagação de Identidade) e no usuário de serviço (Etapa 3: (Opcional) Usar um Usuário de Serviço).
  • Outro aplicativo de domínio de identidades sem a atribuição de Aplicativo Administrador de Domínio de Identidades ou qualquer atribuição de administrador. Você usa credenciais de cliente para este segundo aplicativo de domínio de identidades para chamar a API de troca de token. Autorize esse aplicativo a ser usado com a troca de tokens configurando um ID de cliente para o aplicativo em IdentityPropagationTrust.

Além disso, o aplicativo com atribuição de Aplicativo de Administrador de Domínio de Identidades elevada também pode executar o JWT para o UPST Token Exchange.

Gerando um Token de Acesso com a atribuição de Administrador do Domínio de Identidades

Use o aplicativo com a atribuição de Aplicativo Administrador do Domínio de Identidades definida para gerar um token de acesso. Consulte Gerando Tokens de Acesso. Use o token de acesso gerado para executar operações CRUD (Criar, Substituir, Atualizar, Excluir) na IdentityPropagationTrusts (Etapa 4: Criar uma Configuração de Confiança de Propagação de Identidade) e no usuário de serviço (Etapa 3: (Opcional) Usar um Usuário de Serviço).

Observação

Como alternativa, você pode gerar um token de acesso pessoal a ser usado sem criar aplicativos. Isso oferece a vantagem de não deixar um aplicativo confidencial com a atribuição de Administrador do Domínio de Identidades. Você deve se conectar ao mesmo domínio em que está configurando a confiança. Para obter informações sobre como gerar um token de acesso pessoal, consulte Gerando um Token de Acesso.

Etapa 3: (Opcional) Usar um Usuário de Serviço

Um usuário do serviço é um usuário do domínio de identidades sem privilégios de acesso interativo. Eles têm privilégios mínimos.

Os usuários do serviço podem ser concedidos a grupos e aplicativos. Os aplicativos podem usar usuários de serviço ou o usuário conectado pode personificá-los para obter um token UPST temporário.

Os usuários do serviço têm as seguintes características:

  • Deve ter um userName. O nome e o sobrenome não são obrigatórios.
  • Pode ter um endereço de e-mail (Opcional).
  • Pode ser membro de grupos e atribuições de aplicativo.
  • Não é possível ter chaves de API.
  • Não é possível usar pontos finais de autoatendimento.
  • Não é possível ter senhas, e as políticas de senha não se aplicam.
Observação

O uso de um usuário de serviço é opcional. Se a personificação do usuário for usada como parte da configuração de Confiança, os usuários do serviço serão necessários. Caso contrário, qualquer outro usuário do domínio de identidades será usado. Somente administradores de domínio de identidades podem criar, substituir, atualizar ou excluir um usuário de serviço. Outros administradores podem ler usuários de serviço e seus atributos.

Exemplo de Solicitação: Criar um Usuário de Serviço

Veja a seguir um exemplo de solicitação com os atributos mínimos necessários para criar um usuário de serviço com o atributo serviceUser definido como 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"
}

Exemplo de Resposta: Criar um Usuário de Serviço

O exemplo a seguir mostra um exemplo de resposta ao criar um usuário de serviço.

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

Etapa 4: Criar uma Configuração de Confiança de Propagação de Identidade

A configuração de Confiança de Propagação de Identidade é usada para estabelecer a confiança entre a Identidade do OCI e os provedores de Nuvem externos, a validação do token do provedor de Nuvem e o mapeamento da identidade do usuário do provedor de Nuvem com a identidade do usuário service dos domínios de identidade.

Descrição Detalhada de uma Configuração de Confiança de Propagação de Identidade
Atributo Obrigatório? Descrições e Exemplos
name Sim

O nome da confiança.

type Sim

O tipo de token: jwt

issuer Sim

Use um emissor exclusivo para ajudar a encontrar a identificação de confiança.

active Sim

Se ativado, true.

Se estiver desativado, false.

oauthClients Sim

Uma lista de clientes OAuth que têm permissão para obter tokens para um parceiro confiável específico.

Exemplo:
"oauthClients": [
 "oauthclient-id"
 ],
allowImpersonation (fazer uso de serviceUser) Não

Valor booleano. Especifica se o UPST resultante deve conter o usuário autenticado como assunto ou se deve representar um usuário de serviço no IAM.

impersonatingServiceUsers

Sim, se allowImpersonation estiver definido como true.

Especifica qual principal resultante será representado com base no nome da reivindicação de token e nas condições de valor. Você pode:

  • Permita um principal de personificação específico para todos os usuários autenticados do provedor de identidades (IdP).
  • Defina regras para definir condições de personificação:
    • Com base no nome da reivindicação de Token
    • Condição: contém (co) ou é igual a (eq)
    • Valor:
      • Pode ser uma string.
      • Não há suporte para uma matriz de valores e valores complexos/compostos.
      • Com condição igual: cartão curinga (*) é permitido.
      • Com a condição contains: o curinga (*) não é suportado.
    • Representação principal.

Exemplo:

  • Regra: "username" eq kafka*
  • Usuário do serviço mapeado: kafka
  • Resultado: Todos os usuários autenticados que começam com o prefixo kafka são personificados com o usuário do serviço IAM kafka. O UPST resultante contém kafka como o principal do usuário autenticado.

Se a personificação for permitida, o token de segurança do OCI (UPST) resultante terá a reivindicação original relacionada ao usuário autenticado (source_authn_prin), bem como para indicar em cujo nome a personificação é feita.

  • Se o nome da reivindicação do assunto estiver configurado, ele será usado para extrair esse valor da reivindicação.
  • Se o nome da reivindicação do assunto não estiver configurado, ele assumirá como padrão sub no token de entrada. Se a própria reivindicação sub não estiver presente, ela será ignorada.
A avaliação é interrompida com a primeira regra correspondente e o principal resultante correspondente é retornado usando o atributo de nome para exibição. Se nenhuma regra for correspondida, a solicitação de token falhará com erros.
publicCertificate Se o ponto final da chave pública não for fornecido ou não estiver disponível com o provedor. Certifique-se de que a chave pública seja obrigatória se um ponto final de chave pública não for fornecido.
publicKeyEndpoint Forneça o URL da API de chave pública ou a chave pública deve ser carregada como no exemplo a seguir. A API de chave pública do provedor de nuvem. Os provedores SAML e OIDC expõem a API para recuperar a chave pública para validação de assinatura.

Como alternativa, armazene o certificado público na própria configuração.

Exemplo de Solicitação: Criar uma Configuração de Confiança de Propagação de Identidade

O exemplo a seguir mostra um exemplo de solicitação para criar uma configuração de Confiança de Propagação de Identidade.
## 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"
  ]
}

Exemplo de Resposta

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

Exemplo de Solicitação: Para allowImpersonation definido como false Configuração de Confiança de Propagação de Identidade

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

Exemplo de Solicitação: Recuperando uma Configuração de Confiança de Propagação de Identidade

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

Se allowImpersonation estiver definido como "true" e impersonationServiceUsers estiver definido na Confiança de Propagação de Identidade, use o exemplo de solicitação a seguir.

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

Exemplo de Resposta

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

Etapa 5: Gerando uma Chave Pública

Use os seguintes comandos em um terminal (Linux/macOS) ou Git Bash no 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

Depois de executar estas ações:

  • private_key.pem é a chave privada, usada para assinar o JWT.

  • public_key.pem é a chave pública, usada pelo OCI para verificar a assinatura JWT.

Observação

Mantenha a chave privada segura. Só compartilhe a chave pública com a OCI.

Etapa 6: Gerar um Token JWT para trocar pelo UPST

Gere um token JWT com o Workflow de Credenciais de Senha do Proprietário do Recurso, o Workflow de Credenciais do Cliente e o Workflow de Asserção do Usuário da OCI ou com qualquer IdPs externo, como ID do Microsoft Entra, Autenticação do Google Firebase, AWS Cognito, Okta e outros. O token JWT gerado:

  • Contém reivindicações sobre o usuário ou carga de trabalho.

  • É assinado pela chave privada do IdP para que o OCI possa verificar sua autenticidade usando a chave pública.

  • É trocado no ponto final do token de segurança da OCI por um UPST.

Etapa 7: Obtenha o OCI UPST

O JWT é trocado no ponto final de troca de token do OCI. O ponto final do token decodifica e verifica a assinatura JWT usando a chave pública da configuração de confiança, valida o emissor e as reivindicações correspondentes conforme definido na Confiança de Propagação de Identidade e gera UPST.

O UPST gerado recebido é usado para acessar recursos usando o OCI SDK/API.

Descrição Detalhada do Payload de Solicitação de Token UPST
Parâmetro da Solicitação Valor Válido
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>'

O workflow de chave pública:

  1. A carga de trabalho gera um par de chaves.
  2. A chave pública é enviada como parte da solicitação de troca de token, que é adicionada como uma reivindicação, jwk, no UPST resultante.
  3. A chave privada é usada para gerar as assinaturas do OCI para a chamada de API de serviços nativos do OCI juntamente com o UPST.
  4. A autenticação de serviços do OCI valida o UPST, extrai a reivindicação jwk do UPST e a usa para validar a assinatura do OCI.
subject_token_type

'subject_token_type=jwt

  • jwt
subject_token

'subject_token=<subject-token>'

Se o tipo de token for:

  • jwt ou assertion o valor como está.

Exemplo de Solicitação de Token UPST: Baseado no Aplicativo do Domínio de Identidades

Veja a seguir um exemplo de solicitação cURL baseada em aplicativo do domínio de identidades da 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>"
}