エンタープライズクラウド部の山下(祐)です。 本ブログでは、特定タグのみ編集・削除を出来ないようにする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。