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

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

  • JWT (JSON Webトークン): 外部アイデンティティ・プロバイダやOCIネイティブ・アイデンティティ・プロバイダ(IdPs)などの信頼できるIdPによって発行され、ユーザーまたはサービスに関する署名付きクレームが含まれます。
  • UPST (ユーザー・プリンシパル・セキュリティ・トークン): 存続期間の短いトークンOCIがAPIアクセスの認証として受け入れられました。
  • トークン交換エンドポイントは、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にアクセスする方法を学習するには、REST APIにアクセスするためのOAuth 2の使用を参照してください。
アイデンティティ伝播信頼構成 アイデンティティ伝播信頼構成を使用して、外部アイデンティティ・プロバイダ(IdP)からOracle Cloud Infrastructure (OCI)へのセキュアなエンドツーエンドのアイデンティティ伝播を有効にします。このメカニズムにより、OCI Identityは外部IdPのトークンを検証し、外部ユーザーのアイデンティティとOCIのIAMユーザーまたはサービス・プリンシパルの間の信頼できるマッピングを確立できます。

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

アイデンティティ伝播信頼構成を作成するには、「ステップ4: アイデンティティ伝播信頼構成の作成」を参照してください。
サービス・ユーザー インタラクティブサインイン権限のないユーザー。サービス・ユーザーは、グループおよびサービス・ロールに付与できます。アプリケーションでは、サービス・ユーザーまたはログイン・ユーザーが偽装して一時的なUPSTを取得できます。サービス・ユーザーの使用はオプションです。サービスユーザーの使用の詳細は、Step 3: (Optional) Use a Service Userを参照してください。
ユーザー・プリンシパル・セッション・トークン(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 UPSTの取得

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 to UPST Token Exchangeも実行できます。

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

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

ノート

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

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

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

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

サービス・ユーザーには次の特性があります。

  • userNameが必要です。名および姓は必須ではありません。
  • 電子メール・アドレス(オプション)を指定できます。
  • グループおよびアプリケーション・ロールのメンバーにできます。
  • 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は、OCIがJWT署名を検証するために使用する公開キーです。

ノート

秘密キーはセキュアな状態に保ちます。公開キーをOCIとのみ共有します。

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

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

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

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

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

ステップ7: OCI UPSTの取得

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