このトピックでは、SourceIdentity の基本概念、設定方法、アクセスポリシー、および一般的なシナリオについて説明します。また、トラブルシューティングのガイダンスも提供します。
SourceIdentity とは
SourceIdentity は、OpenAPI 操作を呼び出して RAM ロールを引き受け、一時的なセキュリティトークンサービス (STS) トークンを取得する際に、現在のセッションに設定するソース ID です。
SourceIdentity を使用する主な目的は次のとおりです:
ロールチェーンなどの複雑なシナリオでの ID の追跡
ロールチェーンとは、RAM ID またはロールベース SSO を介してログインしたユーザーが、あるロールを引き受けてロールセッションを取得し、その後別の API 操作を呼び出してさらに別のロールを引き受けるシナリオです。例えば、ユーザー A → ロール B → ロール C のような場合です。ロールチェーン内の RAM ロールは、同じ Alibaba Cloud アカウントに属することも、異なるアカウントに属することもあります。
ロールの引き受けシナリオでは、
RoleSessionNameを設定してソース ID を監査できます。しかし、ロールチェーンのシナリオでは、複数回のロールの引き受けの過程でRoleSessionNameが変更される可能性があります。これにより、元のオペレーターの ID を正確に特定することが困難になります。ロールチェーンの開始時に
SourceIdentityを設定すると、その値はロールセッション内で永続的に保持され、変更することはできません。これにより、複数回のロールの引き受けを経ても、ログ内で元のオペレーターの ID を追跡できるようになります。ロールチェーンにおける
SourceIdentityの適用に関する詳細については、「ロールチェーンの例」をご参照ください。高権限ロールに対する詳細なアクセスの制御の実装
管理者は、
SourceIdentityの値またはその存在に基づいて、詳細な権限付与を設定できます。これは、複数の ID によって使用されるロールである共有ロールを使用して操作を実行する場合に役立ちます。例えば、管理者はアクセスポリシーで条件キーを使用して、ロールを引き受ける際に特定の
SourceIdentity値を設定することを要求できます。これにより、高権限ロールの引き受けやコアリソースへのアクセスを、特定のソース ID に制限することができます。
SourceIdentity の設定方法
以下の 3 つの API 操作のいずれかを使用して STS を呼び出し、ロールを引き受ける際に SourceIdentity を設定できます。
AssumeRole 操作の使用
AssumeRole API 操作を呼び出す際に、SourceIdentity パラメーターを使用してソース ID を指定できます。例えば、値を Alice に設定できます。これは、RAM ユーザーまたは RAM ロールが別のロールを引き受ける標準的なロールの引き受けシナリオに適用されます。
呼び出しが成功すると、SourceIdentity は応答のトップレベルフィールドとして返されます。以下に応答の例を示します。
{
"RequestId": "6894B13B-6D71-4EF5-88FA-F3278173****",
"AssumedRoleUser": {
"AssumedRoleId": "34458433936495****:alice",
"Arn": "acs:ram::123456789012****:role/alice"
},
"Credentials": {
"SecurityToken": "********",
"Expiration": "2015-04-09T11:52:19Z",
"AccessKeySecret": "wyLTSmsyPGP1ohvvw8xYgB29dlGI8KMiH2pK****",
"AccessKeyId": "STS.L4aBSCSJVMuKg5U1****"
},
"SourceIdentity": "Alice"
}この操作の呼び出し方法の詳細については、「AssumeRole - RAM ロールの一時的な認証情報を取得」をご参照ください。
AssumeRoleWithSAML 操作の使用
SAML ロールベース SSO のシナリオでは、SourceIdentity の値は、ID プロバイダー (IdP) によって SAML アサーションで提供されます。
IdP で SAML 属性を設定し、それをユーザー名などのユーザー ID にマップできます。属性名は https://www.aliyun.com/SAML-Role/Attributes/SourceIdentity である必要があります。
設定が完了すると、IdP によって発行される SAML 応答には、次の SAML アサーションが含まれます。この例では、ユーザーのユーザープリンシパル名 (UPN) プレフィックスが SourceIdentity の値にマップされていると仮定します。
<Attribute Name="https://www.aliyun.com/SAML-Role/Attributes/SourceIdentity">
<AttributeValue>upn_prefix</AttributeValue>
</Attribute>呼び出しが成功した場合の応答は、AssumeRole 操作の応答と同じです。この操作の呼び出し方法の詳細については、「AssumeRoleWithSAML - SAML ロールベース SSO 中に RAM ロールの一時的な認証情報を取得する」をご参照ください。
AssumeRoleWithOIDC 操作の使用
OpenID Connect (OIDC) ロールベース SSO のシナリオでは、SourceIdentity の値は、IdP によって ID トークン (OIDC トークンとも呼ばれる) 内のクレームとして提供されます。
IdP でカスタム ID トークンクレームを設定し、それをユーザー名などのユーザー ID にマップできます。クレーム名は https://www.aliyun.com/source_identity である必要があります。例:
設定が完了すると、IdP によって発行される ID トークンには、次のクレームが含まれます。この例では、ユーザーの UPN プレフィックスが SourceIdentity の値にマップされていると仮定します。
{
"https://www.aliyun.com/source_identity": "upn_prefix"
}呼び出しが成功した場合の応答は、AssumeRole 操作の応答と同じです。この操作の呼び出し方法の詳細については、「AssumeRoleWithOIDC - OIDC ロールベース SSO 中に RAM ロールの一時的な認証情報を取得する」をご参照ください。
フォーマット要件
値の長さは 2~64 文字である必要があります。
値には、文字、数字、および次の特殊文字を含めることができます:
=、,、.、@、-、_。値には、
acs:、aliyun:、alibabacloud:など、Alibaba Cloud が予約したプレフィックスは使用できません。
権限設定と条件制御
ID ベースのアクセスポリシーとロール信頼ポリシーを組み合わせることで、SourceIdentity の使用を正確に制御できます。
権限操作
名前 | タイプ | 範囲 | 機能 |
| 権限操作 |
| ロールを引き受ける際に |
権限操作の設定例
RAM ユーザーや RAM ロールなどの ID が AssumeRole を呼び出す際に SourceIdentity を設定できるようにするには、プリンシパルのID ベースのアクセスポリシーと、ターゲットロールのロール信頼ポリシーの両方で sts:SetSourceIdentity 権限を付与する必要があります。Action ブロックに sts:SetSourceIdentity を追加します。
ID ベースのアクセスポリシーの例 (プリンシパルに付与):
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Resource": "acs:ram::ACCOUNT_ID:role/TARGET_ROLE" } ] }ロール信頼ポリシーの例 (引き受けられるロールに設定):
{ "Statement": [ { "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::ACCOUNT_ID:root" ] } } ], "Version": "1" }
ロールベース SSO シナリオにおける権限操作の設定例
AssumeRoleWithSAML または AssumeRoleWithOIDC 操作を呼び出してロールを引き受ける場合、ターゲットロールのロール信頼ポリシーで sts:SetSourceIdentity 権限を付与するだけで済みます。次の例は、SAML ロールベース SSO のポリシーを示しています。
{
"Statement": [
{
"Action": [
"sts:AssumeRole",
"sts:SetSourceIdentity"
],
"Condition": {
"StringEquals": {
"saml:recipient": [
"https://signin.aliyun.com/saml-role/sso"
]
}
},
"Effect": "Allow",
"Principal": {
"Federated": [
"acs:ram::ACCOUNT_ID:saml-provider/PROVIDER_NAME"
]
}
}
],
"Version": "1"
}IdP で SourceIdentity 属性を設定した場合、その IdP に関連付けられているすべてのロールの信頼ポリシーに sts:SetSourceIdentity 操作を含める必要があります。そうしないと、権限が不十分なため、ユーザーは SSO でログインできなくなります。
条件キー
名前 | タイプ | 範囲 | 機能 |
| 条件キー |
| 1 つ以上の |
| 条件キー (グローバル) |
| 1 つ以上の |
現在、acs:SourceIdentity 条件キーは、STS のポリシー評価中にのみ有効です。
sts:SourceIdentity と acs:SourceIdentity の条件キーの違いは次のとおりです。
sts:SourceIdentityは、ロールの引き受けリクエスト内のSourceIdentity属性と照合されます。acs:SourceIdentityは、ロールが正常に引き受けられた後、STS トークンを含むロールセッションに存在するSourceIdentity属性と照合されます。
初めてロールを引き受ける場合は、ポリシー (ID ベースのアクセスポリシーとロール信頼ポリシーを含む) に sts:SourceIdentity 条件キーを設定する必要があります。この時点ではまだ有効なロールセッションが生成されていないため、acs:SourceIdentity 条件キーを使用するとロールの引き受けは失敗します。
条件制御の例
ポリシーの Condition ブロックで sts:SourceIdentity 条件キーを使用すると、ロールが引き受けられる際に特定の SourceIdentity 値を渡すことを要求できます。次のいずれかまたは両方のタイプのポリシーで条件を設定できます。
ID ベースのアクセスポリシーで条件を設定する:ID が特定のロールを引き受ける際に、特定の
SourceIdentity値を設定するように制限します。ロール信頼ポリシーで条件を設定する:任意の ID がそのロールを引き受ける際に、特定の
SourceIdentity値を設定するように制限します。
ポリシーの Action ブロックに sts:SetSourceIdentity 権限も追加する必要があることに注意してください。そうしないと、条件制御機能は機能しません。
RAM ユーザーがコンソールにログインした後、SourceIdentity の設定が必要なロールを [ID の切り替え] 機能を使用して引き受けることはできません。これは、コンソールがこのパラメーターの入力をサポートしていないためです。
本番環境用の高権限 RAM ロール prod-role があるとします。管理者は、次の制御を実装する必要があります。
RAM ユーザーの Alice と Bob のみが
prod-roleを引き受けることができます。prod-roleを引き受ける際、SourceIdentityを設定する必要があり、その値はプリンシパルのユーザー名と一致する必要があります。例えば、Alice がロールを引き受ける場合、値はaliceまたはalice@exampledomain.comに設定できます。
ステップ 1:prod-role のロール信頼ポリシーの設定
このポリシーにより、Alice と Bob のみがこのロールを引き受けることができ、リクエストには alice または bob で始まる SourceIdentity 値が含まれている必要があります。
{
"Statement": [
{
"Action": [
"sts:AssumeRole",
"sts:SetSourceIdentity"
],
"Condition": {
"StringLike": {
"sts:SourceIdentity": [
"alice*",
"bob*"
]
}
},
"Effect": "Allow",
"Principal": {
"RAM": [
"acs:ram::ACCOUNT_ID:user/alice",
"acs:ram::ACCOUNT_ID:user/bob"
]
}
}
],
"Version": "1"
}ステップ 2:Alice と Bob の ID ベースのアクセスポリシーの設定
以下のポリシーは、Alice と Bob に prod-role を引き受ける権限を付与し、リクエストでそれぞれのユーザー名に一致する SourceIdentity 値を設定することを要求します。
Alice の ID ベースのアクセスポリシー
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Resource": "acs:ram::ACCOUNT_ID:role/prod-role", "Condition": { "StringLike": { "sts:SourceIdentity": [ "alice*" ] } } } ] }Bob の ID ベースのアクセス ポリシー
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Resource": "acs:ram::ACCOUNT_ID:role/prod-role", "Condition": { "StringLike": { "sts:SourceIdentity": [ "bob*" ] } } } ] }
ロールベース SSO シナリオにおける条件制御の例
dev-role ロールは SAML ロールベース SSO を介してのみ引き受けることができ、従業員 ID が employeeid-alice と employeeid-bob のユーザーに限定されているとします。IdP は、ユーザーの従業員 ID を SourceIdentity 値として SAML アサーションに追加します。
dev-role の信頼ポリシーは次のように設定されます:
{
"Statement": [
{
"Action": [
"sts:AssumeRole",
"sts:SetSourceIdentity"
],
"Condition": {
"StringEquals": {
"saml:recipient": [
"https://signin.aliyun.com/saml-role/sso"
],
"sts:SourceIdentity": [
"employeeid-alice",
"employeeid-bob"
]
}
},
"Effect": "Allow",
"Principal": {
"Federated": [
"acs:ram::ACCOUNT_ID:saml-provider/PROVIDER_NAME"
]
}
}
],
"Version": "1"
}条件制御を使用する際の推奨事項
本番適用前のテスト:本番環境で
SourceIdentityの強制ポリシーを直接有効にしないでください。これには、sts:SourceIdentity条件キーが設定されたID ベースのアクセスポリシーとロール信頼ポリシーが含まれます。まず、テスト用のロールとポリシーを使用して完全な検証を行ってください。設定が正しいことを確認した後、段階的にポリシーを本番環境に適用できます。事前のコミュニケーション:強制ポリシーを有効にする前に、関連するユーザーに
SourceIdentityの使用方法と許可される値について通知してください。これにより、通常のビジネス運用の混乱を防ぐことができます。
ロールチェーンの例
シナリオの説明
Jenkins などの継続的インテグレーション/継続的デプロイメント (CI/CD) 自動化ツールは、RAM ロール automation-role を使用して実行されます。このロールは、Alice や Bob などの開発者が引き受けることができます。
Alice などの開発者は、このツールを使用して、本番環境の OSS バケットにアプリケーションをデプロイします。このデプロイ操作では、OSS バケットへの書き込み権限を持つ、より高い権限のロール deploy-role を引き受ける必要があります。
Alice、Bob、および automation-role は Alibaba Cloud アカウント A に属しています。deploy-role は Alibaba Cloud アカウント B に属しています。
ビジネス要件とワークフロー
automation-role は、元の呼び出し元が Alice の場合にのみ deploy-role を正常に引き受けることができます。Bob などの他のユーザーからの呼び出しリクエストは拒否される必要があります。
ワークフローは次のとおりです:
Alice は
AssumeRole操作を呼び出してautomation-roleを引き受け、リクエストでSourceIdentityをaliceに設定します。automation-roleが STS トークンを取得した後、再度AssumeRole操作を呼び出してdeploy-roleを引き受けます。SourceIdentityの値は自動的に渡されます。deploy-roleの信頼ポリシーは、受信したSourceIdentityがaliceであるかどうかをチェックします。検証が成功した場合、ロールの引き受けが許可されます。
ポリシー設定手順
ステップ 1:deploy-role の信頼ポリシーを修正する
このポリシーは、アカウント A の automation-role ロールからのロール引き受けリクエストのみを信頼し、SourceIdentity の値が alice であることを要求します。
{
"Statement": [
{
"Action": [
"sts:AssumeRole",
"sts:SetSourceIdentity"
],
"Condition": {
"StringEquals": {
"acs:SourceIdentity": [
"alice"
]
}
},
"Effect": "Allow",
"Principal": {
"RAM": [
"acs:ram::ACCOUNT_A_ID:role/automation-role"
]
}
}
],
"Version": "1"
}上記のロール信頼ポリシーでは、条件キーとして sts:SourceIdentity の代わりに acs:SourceIdentity が使用されています。これにより、deploy-role ロールは automation-role ロールからのアクセスリクエストのみを受け入れ、かつロールセッション内の SourceIdentity が alice に設定されている場合にのみ許可されるようになります。
ステップ 2:automation-role のアクセスポリシーと信頼ポリシーの変更
アクセスポリシー:
automation-roleロールがアカウント B のdeploy-roleロールを引き受けることを許可します。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Resource": "acs:ram::ACCOUNT_B_ID:role/deploy-role" } ] }信頼ポリシー:Alice と Bob が
automation-roleを引き受けることを許可します。{ "Statement": [ { "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::ACCOUNT_A_ID:user/alice", "acs:ram::ACCOUNT_A_ID:user/bob" ] } } ], "Version": "1" }
ステップ 3:Alice と Bob の ID ベースのアクセスポリシーの変更
automation-role ロールを引き受けることを許可し、ユーザー名と完全に一致する SourceIdentity 値を設定することを要求します。
Alice の ID ベースのアクセスポリシー
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Resource": "acs:ram::ACCOUNT_A_ID:role/automation-role", "Condition": { "StringEquals": { "sts:SourceIdentity": [ "alice" ] } } } ] }Bob の ID ベースのアクセスポリシー
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Resource": "acs:ram::ACCOUNT_A_ID:role/automation-role", "Condition": { "StringEquals": { "sts:SourceIdentity": [ "bob" ] } } } ] }
ActionTrail で SourceIdentity を表示
ActionTrail の監査ログで SourceIdentity フィールドを見つけることで、ID のトレーサビリティを実現できます。
AssumeRole*イベントログ内:SourceIdentityはresponseElementsおよびrequestParametersフィールドに表示されます。{ "eventId": "9BCD28D0-7FDB-5BF2-9302-CDA6CCC5****", "eventVersion": 1, "responseElements": { "SourceIdentity": "alice", "RequestId": "9BCD28D0-7FDB-5BF2-9302-CDA6CCC5****", ... }, ... "requestParameters": { "SourceIdentity": "alice", "X-Acs-Request-Id": "9BCD28D0-7FDB-5BF2-9302-CDA6CCC5****", ... }, "serviceName": "Sts", "eventName": "AssumeRole", ... }
クラウドリソースへのアクセスに関するイベントログ内:
SourceIdentityはuserIdentity.sessionContextフィールドに表示されます。{ "eventId": "46B5B0A1-19F7-5A56-BE2C-0BCFE5F8****", "userIdentity": { "sessionContext": { "sourceIdentity": "alice", ... }, "type": "assumed-role", ... }, "serviceName": "Ecs", "eventName": "DescribeInstances", ... }
一般的なトラブルシューティング
SourceIdentity を設定する際の最も一般的な問題は、権限の不足です。以下のセクションでは、2 つの典型的なエラーシナリオとそのトラブルシューティング方法について説明します。
シナリオ 1:ID ベースのアクセスポリシーに起因する問題
エラーメッセージ:
{
"RequestId": "AC9DDEC1-3E1F-50B8-A2D1-BAA155FD****",
"Code": "NoPermission",
"Message": "You are not authorized to do this action. You should be authorized by RAM.",
"AccessDeniedDetail": {
"PolicyType": "AccountLevelIdentityBasedPolicy",
"AuthAction": "sts:SetSourceIdentity",
...
}
}原因分析:
"PolicyType": "AccountLevelIdentityBasedPolicy"は、エラーが呼び出し元のID ベースのアクセスポリシーに起因することを示します。"AuthAction": "sts:SetSourceIdentity"は、sts:SetSourceIdentity操作の権限が不足していることを示します。
解決策:管理者に連絡して、呼び出し元の ID ベースのアクセスポリシーを確認し、以下を確認してもらってください。
ポリシーに
"Action": "sts:SetSourceIdentity"が含まれていること。ポリシーの
Resource範囲に、引き受けようとしているターゲットロールが含まれていること。ポリシーに
Conditionブロックが含まれている場合、リクエスト内のSourceIdentityの値が条件を満たしていることを確認してください。
シナリオ 2:ロール信頼ポリシーに起因する問題
エラーメッセージ:
{
"RequestId": "ECC91EE1-0EB0-5E79-B3F5-E54FD8B9****",
"Code": "NoPermission",
"Message": "You are not authorized to do this action. You should be authorized by RAM.",
"AccessDeniedDetail": {
"PolicyType": "AssumeRolePolicy",
"AuthAction": "sts:SetSourceIdentity",
...
}
}原因分析:
"PolicyType": "AssumeRolePolicy"は、エラーがターゲットロールのロール信頼ポリシーに起因することを示します。"AuthAction": "sts:SetSourceIdentity"は、ターゲットロールがsts:SetSourceIdentity操作を信頼していないことを示します。
解決策:管理者に連絡して、ターゲットロールのロール信頼ポリシーを確認し、以下を確認してもらってください。
ポリシーに
"Action": "sts:SetSourceIdentity"が含まれていること。ポリシーに
Conditionブロックが含まれている場合、リクエスト内のSourceIdentityの値が条件を満たしていることを確認してください。
一般的なトラブルシューティングの推奨事項
範囲を絞り込む:
SourceIdentityの設定時に権限の問題が発生した場合は、まずSourceIdentityパラメーターを削除して再度ロールを引き受けてみてください。操作が成功した場合、問題はSourceIdentityの権限設定に関連している可能性が高いです。エラーの分析:エラーメッセージの
AccessDeniedDetailセクション、特にPolicyTypeフィールドを注意深く読んでください。これにより、問題が ID ベースのアクセスポリシーとロール信頼ポリシーのどちらに起因するのかを迅速に判断できます。診断ツールの使用:
RequestIdしかない場合は、 OpenAPI Troubleshoot ツールを使用します。RequestIdを入力すると、システムが詳細な診断情報を返し、権限の問題を特定するのに役立ちます。例:
ポリシーとリクエストの比較:特定のポリシーを特定した後、
ResourceとConditionの設定を注意深く確認してください。それらが、ターゲットロールのARNやSourceIdentity値など、API リクエストのパラメーターと一致していることを確認してください。
権限の問題のトラブルシューティング方法の詳細については、「権限不足によるアクセスエラーのトラブルシューティング方法」をご参照ください。