aws:PrincipalArn条件キーでは、assumed-roleセッションのARNではなくロールARNを指定する必要があります
発生した問題
AWS Organizations環境で、AWS Systems Manager Quick Setupを実行した際、次のエラーが発生しました。
None of configurations has succeeded in deployment step 1: CFN stack StackSet-AWS-QuickSetup-PatchPolicy-TA-277de-92934b38-df6f-422f-990d-ca69319db3c1 failed to deploy: ResourceLogicalId:EnableExplorerRoleForPatchPolicy, ResourceType:AWS::IAM::Role, ResourceStatusReason:Resource handler returned message: "Encountered a permissions error performing a tagging operation, please add required tag permissions. See https://repost.aws/knowledge-center/cloudformation-tagging-permission-error for how to resolve. Resource handler returned message: "User: arn:aws:sts::111111111111:assumed-role/stacksets-exec-115e79ce7397657addd4a21121099702/bad88f1b-72e9-4c3c-8c8d-df234fd75799 is not authorized to perform: iam:TagRole on resource: arn:aws:iam::111111111111:role/AWS-QuickSetup-EnableExplorer-ap-northeast-1-277de with an explicit deny in a service control policy
エラーメッセージから、arn:aws:sts::111111111111:assumed-role/stacksets-exec-~
がStackSetsを実行するロールで、iam:TagRole
アクションがSCP(サービスコントロールポリシー)によって拒否されていることがわかります。
試した対処法
SCPですべてのプリンシパルに対してiam:TagRole
とiam:UntagRole
が拒否されていました。
元のSCP設定
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"iam:TagRole",
"iam:UntagRole"
],
"Resource": "*"
}
]
}
エラーメッセージに表示されたarn:aws:sts::*:assumed-role/stacksets-exec-*
を除外対象として追加しました。
修正後のSCP設定
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"iam:TagRole",
"iam:UntagRole"
],
"Resource": "*",
"Condition": {
"ArnNotLike": {
"aws:PrincipalArn": [
"arn:aws:sts::*:assumed-role/stacksets-exec-*"
]
}
}
}
]
}
しかし、この設定でもエラーは解決されませんでした。
原因
aws:PrincipalArn
条件キーでは、assumed-roleセッションのARNを指定できません。
AWS IAMの公式ドキュメントには、aws:PrincipalArn
条件キーに関して以下のように記載されています。
aws:PrincipalArn
このキーを使用して、リクエストを行ったプリンシパルの Amazon リソースネーム (ARN) をポリシーで指定した ARN と比較します。IAM ロールの場合、リクエストコンテキストは、ロールを引き受けたユーザーの ARN ではなく、ロールの ARN を返します。
IAM ロール — リクエストコンテキストには、条件キー aws:PrincipalArn に次の値が含まれています。引き受けたロールのセッション ARN をこの条件キーの値として指定しないでください。
つまり、IAMロールを使用したリクエストでは、aws:PrincipalArn
には常にロール自体のARNが設定されます。そのため、SCPの条件で除外指定をする際は、以下のようにロールARNを使用する必要があります。
- 指定可能:
arn:aws:iam::*:role/stacksets-exec-*
(ロール自体のARN) - 指定不可:
arn:aws:sts::*:assumed-role/stacksets-exec-*
(assumed-roleセッションのARN)
エラー発生の流れ
Quick Setup実行時に、各メンバーアカウントのstacksets-exec-*
ロールが、アカウントごとに存在するIAMロール(AWS-QuickSetup-EnableExplorer-ap-northeast-1-xxx
等)に対してタグ付与を行います。
このプロセスでSCPによる制限に阻まれました。
QuickSetup
↓
CloudFormation StackSet 作成
↓
stacksets-exec-* ロールが assume される
↓
IAM ロールへのタグ付与試行 ← ここでSCPに阻まれた
解決方法
IAMロールを除外するには、以下のようにロール自体のARNを指定する必要があります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"iam:TagRole",
"iam:UntagRole"
],
"Resource": "*",
"Condition": {
"ArnNotLike": {
"aws:PrincipalArn": [
"arn:aws:iam::*:role/stacksets-exec-*"
]
}
}
}
]
}
補足:stacksets-exec-*ロールについて
Organizationsで「信頼されたアクセス」を有効にすると、CloudFormation StackSetsのマネージドロールが自動生成されます。以下のBlackBelt資料に詳細が記載されています。
- Organizationsで「信頼されたアクセス」を有効にするとStackSetsのマネージドロールが自動生成される
- StackSets管理アカウント側: AWSServiceRoleForCloudFormationStackSetsOrgAdmin
- ポリシー: stacksets-exec-* ロールを引き受ける
- 信頼関係: stacksets.cloudformation.amazonaws.com を信頼
- ターゲットアカウント側: stacksets-exec-*
- ポリシー: AdministratorAccess
- 信頼関係: AWSServiceRoleForCloudFormationStackSetsOrgAdmin ロールを信頼
- AWSServiceRoleForCloudFormationStackSetsOrgMember ロールがこれを作成する
このロールは、Quick Setup実行時に各メンバーアカウントでIAMロールへのタグ付与を行うため、SCPで例外対象とする必要があります。