AWS IAM の aws:RequestTag は実行者のタグではない?aws:PrincipalTag との違いを SSM Parameter Store で検証してみた
はじめに
クラウド事業本部コンサルティング部の山﨑です。
AWS IAM の条件キーには、タグに関係するものがいくつかあります。
代表的なものとして、以下があります。
| 条件キー | 評価対象 |
|---|---|
aws:RequestTag/${TagKey} |
API リクエストで指定されたタグ |
aws:PrincipalTag/${TagKey} |
IAM ロールや IAM ユーザーなど、実行主体に付与されたタグ |
aws:ResourceTag/${TagKey} |
対象リソースに既に付与されているタグ |
今回気になったのは、以下の点です。
aws:RequestTagは「リクエストした人のタグ」を見る条件キーなのか?
それとも「API リクエストで指定したタグ」を見る条件キーなのか?
名前だけ見ると、RequestTag は「リクエストした人に付いているタグ」のようにも見えます。
私自身も、以前は実行主体である IAM ユーザーや IAM ロールに付いているタグを評価する条件キーだと思っていました。
今回は、AWS Systems Manager Parameter Store の aws ssm put-parameter を使って、aws:RequestTag と aws:PrincipalTag がそれぞれ何を評価するのか検証しました。
結論
aws:RequestTag は IAM ロールに付与されたタグではなく、API リクエストで渡されたタグを評価する条件キーでした。
今回の検証結果は以下です。
| 検証 | 使用ロール | 操作 | ロールのタグ | リクエストタグ | Deny 条件 | 結果 |
|---|---|---|---|---|---|---|
| 検証1 | requesttag-test-request-role |
aws ssm put-parameter |
Env=Test |
なし | aws:RequestTag/Env が Test |
成功 |
| 検証2 | requesttag-test-request-role |
aws ssm put-parameter --tags Key=Env,Value=Test |
Env=Test |
Env=Test |
aws:RequestTag/Env が Test |
失敗 |
| 検証3 | requesttag-test-principal-role |
aws ssm put-parameter |
Env=Test |
なし | aws:PrincipalTag/Env が Test |
失敗 |
この結果から、以下が分かりました。
aws:RequestTagは、実行主体である IAM ロールのタグを見ないaws:RequestTagは、API リクエストで渡されたタグを評価する- IAM ロールなど実行主体のタグを条件にしたい場合は、
aws:PrincipalTagを使う
公式ドキュメントの確認
まず、IAM のタグに関する条件キーを確認します。
AWS のドキュメントでは、タグに関する条件キーとして以下が説明されています。
| 条件キー | 用途 |
|---|---|
aws:RequestTag/tag-key |
リクエストで渡されるタグキー・値ペアを制御する |
aws:PrincipalTag/tag-key |
リクエストを行うプリンシパルに付与されたタグを評価する |
aws:ResourceTag/tag-key |
リソースに付与されたタグを評価する |
また、AWS Systems Manager のサービス認可リファレンスを見ると、ssm:PutParameter は条件キーとして aws:RequestTag/${TagKey} と aws:TagKeys をサポートしています。
一方で、aws:PrincipalTag/${TagKey} は ssm:PutParameter のアクション行には表示されていません。
aws:PrincipalTag/${TagKey} は IAM のグローバル条件キーであり、IAM ロールにタグが付いている場合など、リクエストコンテキストに含まれる状況で評価されます。
今回は、ssm:PutParameter のアクション行に表示されている aws:RequestTag と、IAM グローバル条件キーである aws:PrincipalTag の違いを検証します。
検証構成
今回の検証では、2 つの IAM ロールを使用しました。
| IAM ロール | ロールタグ | IAM ポリシーの Deny 条件 |
|---|---|---|
requesttag-test-request-role |
Env=Test |
aws:RequestTag/Env が Test の場合に Deny |
requesttag-test-principal-role |
Env=Test |
aws:PrincipalTag/Env が Test の場合に Deny |
両方のロールに Env=Test タグを付けています。
以降の AWS CLI コマンドは、それぞれ対象の IAM ロールを AssumeRole した状態で実行しています。
検証対象の SSM パラメータは以下です。
| パラメータ名 | 用途 |
|---|---|
/requesttag-test/no-request-tag |
タグなしリクエストで作成する |
/requesttag-test/with-request-tag |
--tags Key=Env,Value=Test 付きリクエストで作成する |
/requesttag-test/principal-tag |
aws:PrincipalTag 検証用 |
事前確認: IAM ロールのタグ
まず、検証用 IAM ロールに Env=Test タグが付いていることを確認します。
aws iam list-role-tags \
--role-name requesttag-test-request-role
実行結果です。
{
"Tags": [
{
"Key": "Env",
"Value": "Test"
}
]
}
aws iam list-role-tags \
--role-name requesttag-test-principal-role
実行結果です。
{
"Tags": [
{
"Key": "Env",
"Value": "Test"
}
]
}
どちらのロールにも Env=Test タグが付いています。
検証1・2: aws:RequestTag は何を評価するのか
まず、aws:RequestTag/Env が Test の場合に ssm:PutParameter を明示的に Deny する IAM ポリシーを使用します。
IAM ポリシー
requesttag-test-request-role には、以下の IAM ポリシーを付与しています。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowPutParameterForRequestTagTest",
"Effect": "Allow",
"Action": [
"ssm:PutParameter",
"ssm:AddTagsToResource"
],
"Resource": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/requesttag-test/*"
},
{
"Sid": "AllowReadForVerification",
"Effect": "Allow",
"Action": [
"ssm:GetParameter",
"ssm:GetParameters",
"ssm:DescribeParameters",
"ssm:ListTagsForResource"
],
"Resource": "*"
},
{
"Sid": "DenyPutParameterIfRequestTagEnvTest",
"Effect": "Deny",
"Action": "ssm:PutParameter",
"Resource": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/requesttag-test/*",
"Condition": {
"StringEquals": {
"aws:RequestTag/Env": "Test"
}
}
}
]
}
このポリシーのポイントは以下です。
ssm:PutParameterを許可する- タグ付け操作も含めて検証できるよう、
ssm:AddTagsToResourceも許可する aws:RequestTag/EnvがTestの場合はssm:PutParameterを明示的に Deny する
検証1: IAM ロールに Env=Test タグがあっても、タグなし作成は成功するか
requesttag-test-request-role には Env=Test タグが付いています。
しかし、Deny 条件は以下です。
"aws:RequestTag/Env": "Test"
タグなしリクエストでは aws:RequestTag/Env がリクエストコンテキストに含まれないため、Test には一致しない想定です。
タグなしで SSM パラメータを作成します。
aws ssm put-parameter \
--profile requesttag-test-request \
--region ap-northeast-1 \
--name /requesttag-test/no-request-tag \
--type String \
--value "v1"
実行結果です。
{
"Version": 1,
"Tier": "Standard"
}
作成に成功しました。
この結果から、IAM ロールに Env=Test タグが付いていても、aws:RequestTag/Env はそのタグを評価していないことが分かります。
ついでに、作成した /requesttag-test/no-request-tag のタグも確認しました。
aws ssm list-tags-for-resource \
--profile requesttag-test-request \
--region ap-northeast-1 \
--resource-type Parameter \
--resource-id /requesttag-test/no-request-tag
実行結果です。
{
"TagList": []
}
IAM ロールには Env=Test タグが付いていますが、作成された SSM パラメータにタグは付いていませんでした。
検証2: リクエストに Env=Test タグを指定すると失敗するか
次に、同じ requesttag-test-request-role で、--tags Key=Env,Value=Test を指定して SSM パラメータを作成します。
aws ssm put-parameter \
--profile requesttag-test-request \
--region ap-northeast-1 \
--name /requesttag-test/with-request-tag \
--type String \
--value "v1" \
--tags Key=Env,Value=Test
結果は失敗しました。
An error occurred (AccessDeniedException) when calling the PutParameter operation:
User: arn:aws:sts::123456789012:assumed-role/requesttag-test-request-role/requesttag-test-request-session
is not authorized to perform: ssm:PutParameter
on resource: arn:aws:ssm:ap-northeast-1:123456789012:parameter/requesttag-test/with-request-tag
with an explicit deny in an identity-based policy
explicit deny と表示されています。
このリクエストでは、以下のタグを指定しています。
--tags Key=Env,Value=Test
そのため、aws:RequestTag/Env が Test として評価され、明示的な Deny に一致しました。
この結果から、aws:RequestTag は IAM ロールのタグではなく、API リクエストで渡されたタグを評価していることが分かります。
検証3: IAM ロールのタグは aws:PrincipalTag で評価されるのか
次に、実行主体のタグを評価する aws:PrincipalTag を検証します。
aws:PrincipalTag/Env が Test の場合に ssm:PutParameter を Deny する IAM ポリシーを使用します。
IAM ポリシー
requesttag-test-principal-role には、以下の IAM ポリシーを付与しています。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowPutParameterForPrincipalTagTest",
"Effect": "Allow",
"Action": "ssm:PutParameter",
"Resource": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/requesttag-test/*"
},
{
"Sid": "AllowReadForVerification",
"Effect": "Allow",
"Action": [
"ssm:GetParameter",
"ssm:GetParameters",
"ssm:DescribeParameters",
"ssm:ListTagsForResource"
],
"Resource": "*"
},
{
"Sid": "DenyPutParameterIfPrincipalTagEnvTest",
"Effect": "Deny",
"Action": "ssm:PutParameter",
"Resource": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/requesttag-test/*",
"Condition": {
"StringEquals": {
"aws:PrincipalTag/Env": "Test"
}
}
}
]
}
このポリシーのポイントは以下です。
ssm:PutParameterを許可するaws:PrincipalTag/EnvがTestの場合はssm:PutParameterを明示的に Deny する
タグなしで SSM パラメータを作成
requesttag-test-principal-role には Env=Test タグが付いています。
Deny 条件は以下です。
"aws:PrincipalTag/Env": "Test"
この状態で、タグなしの SSM パラメータを作成します。
aws ssm put-parameter \
--profile requesttag-test-principal \
--region ap-northeast-1 \
--name /requesttag-test/principal-tag \
--type String \
--value "v1"
結果は失敗しました。
An error occurred (AccessDeniedException) when calling the PutParameter operation:
User: arn:aws:sts::123456789012:assumed-role/requesttag-test-principal-role/requesttag-test-principal-session
is not authorized to perform: ssm:PutParameter
on resource: arn:aws:ssm:ap-northeast-1:123456789012:parameter/requesttag-test/principal-tag
with an explicit deny in an identity-based policy
このリクエストには --tags を指定していません。
それでも失敗したのは、実行主体である IAM ロールに付与された Env=Test タグが aws:PrincipalTag/Env として評価されたためです。
この結果から、IAM ロールなど実行主体のタグを条件にしたい場合は、aws:PrincipalTag を使うことが分かります。
検証結果まとめ
結果を整理します。
| 検証 | 使用ロール | 操作 | ロールのタグ | リクエストタグ | Deny 条件 | 結果 |
|---|---|---|---|---|---|---|
| 検証1 | requesttag-test-request-role |
aws ssm put-parameter |
Env=Test |
なし | aws:RequestTag/Env が Test |
成功 |
| 検証2 | requesttag-test-request-role |
aws ssm put-parameter --tags Key=Env,Value=Test |
Env=Test |
Env=Test |
aws:RequestTag/Env が Test |
失敗 |
| 検証3 | requesttag-test-principal-role |
aws ssm put-parameter |
Env=Test |
なし | aws:PrincipalTag/Env が Test |
失敗 |
図にすると以下のような関係です。
今回の検証から、以下が分かりました。
aws:RequestTagは IAM ロールに付与されたタグを見ないaws:RequestTagは API リクエストで渡されたタグを評価するaws:PrincipalTagは IAM ロールなど実行主体に付与されたタグを見る
おわりに
aws:RequestTag が何を評価する条件キーなのかを検証しました。
今回の検証から、aws:RequestTag は「リクエストした人のタグ」ではなく、API リクエストで指定されたタグを評価する条件キーであることが分かりました。
タグに関する IAM 条件キーは名前が似ていますが、RequestTag、PrincipalTag、ResourceTag で評価対象が異なります。IAM ポリシーを書く際は、どのタグを評価したいのかを意識することが重要です。






