トークン交換権限付与タイプ: UPSTのJSON Webトークンの交換

JWT-to-UPSTトークン交換により、フェデレーテッド・アイデンティティ(IDCSまたは別のアイデンティティ・プロバイダを使用して認証されたユーザーまたはアプリケーション)は、OCIネイティブ・ユーザーまたはAPIキーを管理せずにOCIサービス(OCIコントロール・プレーン)に安全にアクセスできます。

  • JWT (JSON Webトークン): 外部アイデンティティ・プロバイダやOCIネイティブ・アイデンティティ・プロバイダ(IdPs)などの信頼できるIdPによって発行され、ユーザーまたはサービスに関する署名付きクレームが含まれます。
  • UPST (ユーザー・プリンシパル・セキュリティ・トークン): APIアクセスの認証として受け入れられる短命トークンOCI。
  • トークン交換エンドポイントは、JWTを検証し、クレームを抽出し、短期間のUPSTを発行します。

これにより、Okta、Microsoft Entra IDなどの外部IdPs、またはOCI IdP自体を使用して認証されたユーザーは、OCIリソースにアクセスできます。

JWTトークン条件
期間 説明
IAMトークン交換Service API IAMアイデンティティ・ドメインOAuthサービス: /oauth2/v1/token。APIは、標準のOAuthベースの認証ヘッダー/ペイロードとOCI署名の両方を受け入れます。OAuthクライアントをアイデンティティ・ドメインとともに使用してREST APIにアクセスする方法を学習するには、OAuth 2を使用したREST APIにアクセスを参照してください。
アイデンティティ伝播信頼構成 アイデンティティ伝播信頼構成を使用して、外部アイデンティティ・プロバイダ(IdP)からOracle Cloud Infrastructure (OCI)へのセキュアなエンドツーエンドのアイデンティティ伝播を有効にします。このメカニズムにより、OCI Identityは外部IdPのトークンを検証し、外部ユーザーのアイデンティティとOCI内のIAMユーザーまたはサービス・プリンシパルの間の信頼できるマッピングを確立できます。

認証済ユーザーのセキュリティ・コンテキストをフロントエンド(外部IdPなど)からOCI内のバックエンド・サービスに送信することで、アイデンティティ伝播により、汎用アカウントまたは特権アカウントが不要になります。セキュリティを強化し、APIコールの詳細な監査を可能にし、高度な認証シナリオをサポートします。/IdentityPropagationTrust APIエンドポイントはクラウドに依存せず、任意のクラウド・プロバイダとの統合をサポートします。

アイデンティティ伝播信頼構成を作成するには、ステップ4: アイデンティティ伝播信頼構成の作成を参照してください。
サービス・ユーザー 対話型サインイン権限のないユーザー。サービス・ユーザーは、グループおよびサービス・ロールに付与できます。アプリケーションは、サービス・ユーザーまたはログイン・ユーザーを使用して、それらを偽装して一時的なUPSTを取得できます。サービス・ユーザーの使用はオプションです。サービス・ユーザーの使用の詳細は、「ステップ3: (オプション)サービス・ユーザーの使用」を参照してください。
ユーザー・プリンシパル・セッション・トークン(UPST) OCIサービス(OCIコントロール・プレーン)へのアクセスに使用できるOCI IAM生成トークン。UPSTは、SDKまたはTerraformで使用する場合、セキュリティ・トークンとも呼ばれます。これは、認証されたサービス・ユーザー・プリンシパルを表します。

フロー

JWTからUPSTへのフローを示す図。

免責事項:すべての製品名、ロゴ、ブランドおよびロゴは、それぞれの所有者の商標であり、ここでは情報提供のみを目的としています。

JWTからUPSTトークン交換ステップ

次のステップを使用して、JWTトークンをUPSTと交換します。

  1. Step1: (オプション)アイデンティティ・ドメインの作成
  2. ステップ2: アイデンティティ・ドメイン・アプリケーションの作成
  3. ステップ3: (オプション)サービス・ユーザーの使用
  4. ステップ4: アイデンティティ伝播信頼構成の作成
  5. ステップ5: 公開キーの生成
  6. ステップ6: UPSTと交換するJWTトークンの生成
  7. ステップ7: OCIを最大化

Step1: (オプション)アイデンティティ・ドメインの作成

新しいアイデンティティ・ドメインが存在しない場合は作成します。アイデンティティ・ドメインの作成を参照してください。

ステップ2: アイデンティティ・ドメイン・アプリケーションの作成

OAuthクライアントは、OAuth 2.0フローを使用してアクセス・トークンを認証および取得するためにIdentity Cloud Serviceに登録された信頼できるアプリケーションです。このクライアントは次の目的で使用します。

  • IDCS管理APIをコールするためのアクセス・トークンを取得します。

  • アプリケーション・アイデンティティをフェデレートして、JWTをUPSTと交換します。

機密アプリケーションの追加を参照してください。アプリケーションを作成したら、クライアントIDおよびクライアント・シークレットをセキュアな場所に保存します。最小権限の原則(PoLP)に従って、2つのアイデンティティ・ドメイン・アプリケーションが必要です。

  • Identity Domain Administrator (IDA)アプリケーション・ロールを持つアプリケーション。このアプリケーションを使用して生成されたアクセス・トークンを使用して、アイデンティティ伝播信頼(ステップ4: アイデンティティ伝播信頼構成の作成)およびサービス・ユーザー(ステップ3: (オプション)サービス・ユーザーの使用)に対する操作を実行します。
  • Identity Domain Administratorアプリケーション・ロールまたは管理ロールを持たない別のアイデンティティ・ドメイン・アプリケーション。この2番目のアイデンティティ・ドメイン・アプリケーションのクライアント資格証明を使用して、トークン交換APIを起動します。IdentityPropagationTrustでアプリケーションのクライアントIDを構成することで、このアプリケーションをトークン交換で使用することを認可する必要があります。

また、Identity Domain Administratorアプリケーション・ロールが高いアプリケーションでも、JWTからUPSTトークン交換を実行できます。

Identity Domain Administratorロールを使用したアクセス・トークンの生成

アクセス・トークンを生成するために定義されたIdentity Domain Administratorアプリケーション・ロールを持つアプリケーションを使用します。「アクセス・トークンの生成」を参照してください。生成されたアクセス・トークンを使用して、IdentityPropagationTrusts (ステップ4: アイデンティティ伝播信頼構成の作成)およびサービス・ユーザー(ステップ3: (オプション)サービス・ユーザーの使用)に対してCRUD (作成、置換、更新、削除)操作を実行します。

ノート

または、アプリケーションを作成せずに、使用する個人アクセス・トークンを生成することもできます。これにより、アイデンティティ・ドメイン管理ロールを持つ機密アプリケーションを残さないという利点が得られます。信頼を構成しているドメインと同じドメインにサインインする必要があります。個人アクセス・トークンの生成の詳細は、「アクセス・トークンの生成」を参照してください。

ステップ3: (オプション)サービス・ユーザーの使用

サービス・ユーザーは、対話型のサインイン権限のないアイデンティティ・ドメイン・ユーザーです。最小限の特権を持っている。

サービス・ユーザーは、グループおよびアプリケーションに付与できます。アプリケーションはサービス・ユーザーを使用することも、サインイン・ユーザーがそれらを偽装して一時的なUPSTトークンを取得することもできます。

サービス・ユーザーには、次の特徴があります:

  • userNameが必要です。名と姓は必須ではありません。
  • Eメール・アドレスを指定できます(オプション)。
  • グループおよびアプリケーション・ロールのメンバーにできます。
  • APIキーを指定できません。
  • セルフサービス・エンドポイントは使用できません。
  • パスワードを指定できず、パスワード・ポリシーが適用されません。
ノート

サービス・ユーザーの使用はオプションです。信頼構成の一部としてユーザー偽装を使用する場合、サービス・ユーザーが必要です。それ以外の場合は、他のアイデンティティ・ドメイン・ユーザーが使用されます。アイデンティティ・ドメイン管理者のみが、サービス・ユーザーを作成、置換、更新または削除できます。他の管理者は、サービス・ユーザーとその属性を読み取ることができます。

リクエストの例: サービス・ユーザーの作成

次に、属性serviceUsertrue.に設定されているサービス・ユーザーの作成に必要な最小属性を持つリクエストの例を示します

## 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"
}

レスポンスの例: サービス・ユーザーの作成

次に、サービス・ユーザー作成時のレスポンスの例を示します。

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

ステップ4: アイデンティティ伝播信頼構成の作成

アイデンティティ伝播信頼構成は、OCIアイデンティティと外部クラウド・プロバイダ間の信頼、クラウド・プロバイダ・トークンの検証、およびクラウド・プロバイダのユーザー・アイデンティティとアイデンティティ・ドメインのserviceユーザー・アイデンティティのマッピングを確立するために使用されます。

アイデンティティ伝播信頼構成の詳細な説明
属性 必須? 説明および例
name はい

信頼の名前。

type はい

トークン・タイプ: jwt

issuer はい

一意の発行者を使用して、信頼の識別情報を見つけます。

active はい

有効にすると、trueになります。

無効の場合、false

oauthClients はい

特定の信頼できるパートナのトークンを取得できるOAuthクライアントのリスト。

例:
"oauthClients": [
 "oauthclient-id"
 ],
allowImpersonation (serviceUserを使用) いいえ

ブール値。結果のUPSTに、認証済ユーザーをサブジェクトとして含めるか、IAMでサービス・ユーザーを偽装するかを指定します。

impersonatingServiceUsers

はい。allowImpersonationtrueに設定されている場合。

トークン要求名と値の条件に基づいて、どの結果のプリンシパルが偽装されるかを指定します。次のことができます。

  • すべてのアイデンティティ・プロバイダ(IdP)認証済ユーザーに対して、特定の偽装プリンシパルを許可します。
  • 偽装条件を定義するルールを設定します。
    • トークン要求名に基づく
    • 条件: 含む(co)または等しい(eq)
    • 値:
      • 文字列にすることができます。
      • 値の配列および複合/複合値はサポートされていません。
      • equals条件の場合: ワイルドカード(*)を使用できます
      • contains条件の場合: ワイルドカード(*)はサポートされていません
    • 偽装プリンシパル。

例:

  • ルール: "username" eq kafka*
  • マップされたサービス・ユーザー: kafka
  • 結果: kafka接頭辞で始まるすべての認証済ユーザーが、IAMサービス・ユーザーkafkaに偽装されます。結果のUPSTには、認証済ユーザー・プリンシパルとしてkafkaが含まれます。

偽装が許可されている場合、結果のOCIセキュリティ・トークン(UPST)には、元の認証済ユーザー関連の要求(source_authn_prin)があり、代理の偽装が行われたことを示します。

  • サブジェクト要求名が構成されている場合、その要求値の抽出に使用されます。
  • サブジェクト要求名が構成されていない場合、受信トークンではデフォルトでsubに設定されます。sub要求自体が存在しない場合、無視されます。
評価は最初に一致したルールで停止し、対応する結果のプリンシパルは表示名属性を使用して返されます。ルールが一致しない場合、トークン・リクエストはエラーで失敗します。
publicCertificate 公開キー・エンドポイントが指定されていないか、プロバイダで使用できない場合。 公開キー・エンドポイントが指定されていない場合は、公開キーが必須であることを確認してください。
publicKeyEndpoint 公開キーAPI URLを指定するか、次の例のように公開キーをアップロードする必要があります。 クラウド・プロバイダの公開キーAPI。SAMLおよびOIDCプロバイダは、署名検証用の公開キーを取得するためのAPIを公開します。

または、構成自体にパブリック証明書を格納します。

リクエストの例: アイデンティティ伝播信頼構成の作成

次に、アイデンティティ伝播信頼構成を作成するリクエストの例を示します。
## 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"
  ]
}

レスポンスの例

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

リクエストの例: allowImpersonationfalseアイデンティティ伝播信頼構成に設定されている場合

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

リクエストの例: アイデンティティ伝播信頼構成の取得

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

allowImpersonationtrueに設定され、アイデンティティ伝播信頼でimpersonationServiceUsersが定義されている場合は、次のリクエスト例を使用します。

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

レスポンスの例

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

ステップ5: 公開キーの生成

端末(Linux/macOS)またはWindowsのGit Bashで次のコマンドを使用します。

# 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

これらのコマンドを実行した後:

  • private_key.pemは、JWTの署名に使用される秘密キーです。

  • public_key.pemは公開キーで、JWT署名を検証するためにOCIで使用されます。

ノート

秘密キーは保護したままにします。公開キーはOCIでのみ共有します。

ステップ6: UPSTと交換するJWTトークンの生成

OCIのリソース所有者パスワード資格証明ワークフロークライアント資格証明ワークフローおよびユーザー・アサーション・ワークフロー、またはMicrosoft Entra ID、Google Firebase Authentication、AWS Cognito、Oktaなどの外部IdPsを使用して、JWTトークンを生成します。生成されたJWTトークン:

  • ユーザーまたはワークロードに関する要求が含まれています。

  • OCIが公開キーを使用してその信頼性を検証できるように、IdPの秘密キーによって署名されます。

  • OCIのセキュリティ・トークン・エンドポイントでUPSTと交換されます。

ステップ7: OCIを最大化

JWTは、OCIトークン交換エンドポイントで交換されます。トークン・エンドポイントは、信頼構成の公開キーを使用してJWT署名をデコードおよび検証し、アイデンティティ伝播信頼で定義されている発行者および照合要求を検証して、UPSTを生成します。

受信したUPSTは、OCI SDK/APIを使用してリソースにアクセスするために使用されます。

UPSTトークン・リクエスト・ペイロードの詳細説明
要求パラメータ 有効値
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>'

公開キー・ワークフロー:

  1. ワークロードによってキー・ペアが生成されます。
  2. 公開キーは、トークン交換リクエストの一部として送信され、クレームjwkとして結果のUPSTに追加されます。
  3. 非公開キーは、OCIネイティブ・サービスAPI呼出しのOCI署名をUPSTとともに生成するために使用されます。
  4. OCIサービス認証は、UPSTを検証し、UPSTからjwkクレームを抽出し、それを使用してOCI署名を検証します。
subject_token_type

'subject_token_type=jwt

  • jwt
subject_token

'subject_token=<subject-token>'

トークン・タイプが次の場合:

  • 値をそのままjwtまたはassertionします。

UPSTトークン・リクエストの例: アイデンティティ・ドメイン・アプリケーションベース

次に、OCIアイデンティティ・ドメイン・アプリケーションベースのcURLリクエストの例を示します。

## 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>"
}