特定タグのみ編集・削除を出来ないようにするIAMポリシーの解説

記事タイトルとURLをコピーする

エンタープライズクラウド部の山下(祐)です。 本ブログでは、特定タグのみ編集・削除を出来ないようにする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リソースへのタグ付けの詳細は、以下の公式ドキュメントをご参照ください。

docs.aws.amazon.com


また、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 の違いについては、以下の公式ドキュメントで説明されています。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_condition-single-vs-multi-valued-context-keys.html#reference_policies_condition-multi-valued-context-keys

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_condition_examples-multi-valued-context-keys.html



以上、特定タグのみ編集・削除を出来ないようにするポリシーについてでした。 タグをご利用するにあたり、本ブログが少しでも参考になれば幸いです。

山下 祐樹(執筆記事の一覧)

2021年11月中途入社。前職では情シスとして社内ネットワークの更改や運用に携わっていました。 2023 Japan AWS All Certifications Engineers。