トークン交換権限付与タイプ: 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リソースにアクセスできます。
期間 | 説明 |
---|---|
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コールの詳細な監査を可能にし、高度な認証シナリオをサポートします。 |
サービス・ユーザー | 対話型サインイン権限のないユーザー。サービス・ユーザーは、グループおよびサービス・ロールに付与できます。アプリケーションは、サービス・ユーザーまたはログイン・ユーザーを使用して、それらを偽装して一時的なUPSTを取得できます。サービス・ユーザーの使用はオプションです。サービス・ユーザーの使用の詳細は、「ステップ3: (オプション)サービス・ユーザーの使用」を参照してください。 |
ユーザー・プリンシパル・セッション・トークン(UPST) | OCIサービス(OCIコントロール・プレーン)へのアクセスに使用できるOCI IAM生成トークン。UPSTは、SDKまたはTerraformで使用する場合、セキュリティ・トークンとも呼ばれます。これは、認証されたサービス・ユーザー・プリンシパルを表します。 |
フロー

免責事項:すべての製品名、ロゴ、ブランドおよびロゴは、それぞれの所有者の商標であり、ここでは情報提供のみを目的としています。
JWTからUPSTトークン交換ステップ
次のステップを使用して、JWTトークンを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からUPSTトークン交換を実行できます。
Identity Domain Administratorロールを使用したアクセス・トークンの生成
アクセス・トークンを生成するために定義されたIdentity Domain Administratorアプリケーション・ロールを持つアプリケーションを使用します。「アクセス・トークンの生成」を参照してください。生成されたアクセス・トークンを使用して、IdentityPropagationTrusts
(ステップ4: アイデンティティ伝播信頼構成の作成)およびサービス・ユーザー(ステップ3: (オプション)サービス・ユーザーの使用)に対してCRUD (作成、置換、更新、削除)操作を実行します。
または、アプリケーションを作成せずに、使用する個人アクセス・トークンを生成することもできます。これにより、アイデンティティ・ドメイン管理ロールを持つ機密アプリケーションを残さないという利点が得られます。信頼を構成しているドメインと同じドメインにサインインする必要があります。個人アクセス・トークンの生成の詳細は、「アクセス・トークンの生成」を参照してください。
ステップ3: (オプション)サービス・ユーザーの使用
サービス・ユーザーは、対話型のサインイン権限のないアイデンティティ・ドメイン・ユーザーです。最小限の特権を持っている。
サービス・ユーザーは、グループおよびアプリケーションに付与できます。アプリケーションはサービス・ユーザーを使用することも、サインイン・ユーザーがそれらを偽装して一時的なUPSTトークンを取得することもできます。
サービス・ユーザーには、次の特徴があります:
- userNameが必要です。名と姓は必須ではありません。
- Eメール・アドレスを指定できます(オプション)。
- グループおよびアプリケーション・ロールのメンバーにできます。
- APIキーを指定できません。
- セルフサービス・エンドポイントは使用できません。
- パスワードを指定できず、パスワード・ポリシーが適用されません。
サービス・ユーザーの使用はオプションです。信頼構成の一部としてユーザー偽装を使用する場合、サービス・ユーザーが必要です。それ以外の場合は、他のアイデンティティ・ドメイン・ユーザーが使用されます。アイデンティティ・ドメイン管理者のみが、サービス・ユーザーを作成、置換、更新または削除できます。他の管理者は、サービス・ユーザーとその属性を読み取ることができます。
リクエストの例: サービス・ユーザーの作成
次に、属性serviceUser
が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"
}
レスポンスの例: サービス・ユーザーの作成
次に、サービス・ユーザー作成時のレスポンスの例を示します。
{
"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 |
はい |
有効にすると、 無効の場合、 |
oauthClients |
はい |
特定の信頼できるパートナのトークンを取得できるOAuthクライアントのリスト。 例:
|
allowImpersonation (serviceUser を使用) |
いいえ |
ブール値。結果のUPSTに、認証済ユーザーをサブジェクトとして含めるか、IAMでサービス・ユーザーを偽装するかを指定します。 |
impersonatingServiceUsers |
はい。 |
トークン要求名と値の条件に基づいて、どの結果のプリンシパルが偽装されるかを指定します。次のことができます。
例:
偽装が許可されている場合、結果のOCIセキュリティ・トークン(UPST)には、元の認証済ユーザー関連の要求(
|
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"
]
}
リクエストの例: allowImpersonation
が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"
]
}
リクエストの例: アイデンティティ伝播信頼構成の取得
## GET on https://<secureDomainURL>/admin/v1/IdentityPropagationTrusts/{{id}}
## Header:
"Authorization: Bearer <IDA_Access_Token>"
allowImpersonation
がtrue
に設定され、アイデンティティ伝播信頼で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を使用してリソースにアクセスするために使用されます。
要求パラメータ | 有効値 |
---|---|
grant_type |
|
requested_token_type |
|
public_key |
公開キー・ワークフロー:
|
subject_token_type |
|
subject_token |
トークン・タイプが次の場合:
|
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>"
}