エンタープライズクラウド部の山下(祐)です。 本ブログでは、特定タグのみ編集・削除を出来ないようにするIAMポリシーについて説明します。
ユースケースの例
ユースケースとしては、「利用者がリソースに独自のタグを付ける事は許可しても良いが、以下のようなタグだけは編集・削除させたくない。」というケースがあり得るかと思います。
- Amazon GuardDuty の Malware Protection のスキャン対象を絞り込むためのタグ
- AWS Backup のバックアップ対象を絞り込むためのタグ
- 組織として管理上必須としているタグ(Environment・Department等々)
そういった場合に、今回ご紹介するポリシーをIAMにアタッチして、指定したキーを持つタグに対してのみ、編集・削除を制限することができます。
また、AWS Organizations を利用している環境であれば、Service Control Policy(SCP)に当該ポリシーを利用し、組織単位で特定タグの編集・削除を制限することが可能です。
それでは早速ポリシーの内容を見ていきましょう。
サンプルポリシー
先ほどのユースケースを実現する具体的なポリシーのサンプルです。 このサンプルでは、IAMユーザーに関するタグ操作のみ制御対象としています。 また、制御対象とするタグキーは「Environment」としています。※今回はタグキーを一つだけ指定していますが、複数指定することも可能です。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Sample",
"Effect": "Deny",
"Action": [
"iam:TagUser",
"iam:UntagUser"
],
"Resource": [
"*"
],
"Condition": {
"ForAnyValue:StringEquals": {
"aws:TagKeys": "Environment"
}
}
}
]
}
Condition句で「ForAnyValue:StringEquals」を利用し、編集・削除を禁止したいタグキーを指定します。 これにより、リクエストに指定したタグキーが含まれている場合のみ Deny されるようになります。
なお、今回はIAMユーザーに関するタグ操作制限のサンプルを記載しましたが、IAMに関するタグ操作全般を制限したい場合、Actionの記載を「iam:Tag*」「iam:UnTag*」に変更します。 参考までに、IAMタグアクションには下図のようなアクションがあります。

IAMリソースへのタグ付けの詳細は、以下の公式ドキュメントをご参照ください。
また、IAM以外のリソースに関して制限を行いたい場合、リソースに応じた対象アクションに変更します。例えばEC2であれば、「ec2:CreateTags」「ec2:DeleteTags」といった具合です。
動作検証
それでは、実際に動作検証してみます。 上記のサンプルポリシーと AdministratorAccess をアタッチした「DenyIAMTest」ユーザーを用意します。

また、タグ編集対象として、「Environment」タグを付与した「TestUser」ユーザーを用意します。

Environmentタグの編集・削除
まずはEnvironmentタグの編集を試みます。


拒否されました。
続いてEnvironmentタグの削除を試みます。


こちらも拒否されました。
その他のタグの作成・編集・削除
続いて、Environmentタグ以外のタグの作成・編集・削除について検証します。
まずはタグの作成を試みます。


許可されました。
続いて、タグの編集を試みます。


こちらも許可されました。
続いて、タグの削除を試みます。


こちらも許可されました。
Environmentタグと他タグの同時編集・同時削除
最後に、Environmentタグと他タグの同時編集・同時削除を検証します。
まずはタグの同時編集を試みます。


拒否されました。
続いて、タグの同時削除を試みます。


こちらも拒否されました。
念のため、Environmentタグ以外のタグを、複数同時に編集してみます。



こちらは許可されました。 あくまでも、Environmentタグを含んでいる場合のみ、拒否されることが確認できました。
(補足)ForAllValuesを使うと抜け穴ができる
今回のポリシーを作成するにあたり、最初は「ForAllValues:StringEquals」で検証していました。以下のようなポリシーです。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Sample",
"Effect": "Deny",
"Action": [
"iam:TagUser",
"iam:UntagUser"
],
"Resource": [
"*"
],
"Condition": {
"ForAllValues:StringEquals": {
"aws:TagKeys": "Environment"
}
}
}
]
}
このポリシーを試した所、「ForAllValuesで指定していないタグと同時に編集・削除すると、制限したいタグも編集・削除できてしまう」という抜け穴ができてしまいました。
具体例
先ほどの「DenyIAMTest」ユーザーに、今度は上述の ForAllValues のポリシーをアタッチします。

この状態で、Environmentタグと他のタグ(Testタグ)を同時に編集してみます。



Environmentタグの編集が出来てしまいました。
原因
「ForAllValues:StringEquals」の場合、「ミスマッチが一つも無い」時に「True」となります。 そのため、リクエストに「Environment」タグ以外のタグも含まれていると、ミスマッチが生まれてしまい、「False」になってしまいます。 「Condition」が「False」になるということは、ポリシーの条件に合致しないということになり、結果的に「Deny」されなくなります。
先ほどの具体例(EnvironmentタグとTestタグの同時編集)のCloudTrailログを一部抜粋します。
"requestParameters": {
"userName": "TestUser",
"tags": [
{
"key": "Test",
"value": "67890"
},
{
"key": "Environment",
"value": "Stg"
}
]
},
「requestParameters」の「tags」に「Test」と「Environment」が両方含まれています。「Test」が「ForAllValues:StringEquals」とミスマッチのため、ConditionがFalseとなり、Denyが効いていません。
対して、「ForAnyValue:StringEquals」の場合、「最低でも一つマッチしている」時に「True」となります。 そのため、「Environment」タグ単体でも「True」となりますし、「Environment」タグと他のタグが同時に存在していても、「Environment」タグがマッチすれば「True」となって、Denyされます。
ForAllValues と ForAnyValue の違いについては、以下の公式ドキュメントで説明されています。
以上、特定タグのみ編集・削除を出来ないようにするポリシーについてでした。 タグをご利用するにあたり、本ブログが少しでも参考になれば幸いです。
山下 祐樹(執筆記事の一覧)
2021年11月中途入社。前職では情シスとして社内ネットワークの更改や運用に携わっていました。 2023 Japan AWS All Certifications Engineers。