特定のタグを持つEC2操作を制限する
はい皆さんこんにちは
この記事はIAMポリシーによってEC2のタグを参照して権限を付けた事例の紹介です。
詳細
要件としては以下の内容でした。
・EC2にEnvタグ(値:dev)が付いたものだけ操作したい。
・Envタグ(値:prod)は操作出来ないようにする。
・タグが一致しているならAMIやスナップショットも取りたい
環境:
AWS EC2(AmazonLinux2)
コンソールにログインするユーザーのIAMポリシーを編集しながら検証
最終的な設定
必要な権限を付与しつつ、EC2:*を許可しておく。
そのうえで、prodタグを持っているEC2の操作を拒否する。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Action": [
                "trustedadvisor:*",
                "iam:*",
                "cloudwatch:*",
                "s3:*",
                "logs:*",
                "cloudtrail:*",
                "ec2:*",
                "support:*",
                "inspector:*",
                "directconnect:*"
            ],
            "Resource": "*"
        },
        {
            "Sid": "2",
            "Effect": "Deny",
            "Action": [
                "ec2:*"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/Env": "prod"
                }
            }
        }
    ]
}
色々やってみる
EC2のインスタンス一覧にはprodのサーバも表示される(これは仕方ない)

prodが入っているEC2のタグを操作しようとするとエラーになる

devが入っているEC2の再起動はOK

devが入っているEC2のAMIが取得できる

devが入っているEC2でスナップショットも可能です。
注意事項
タグが付いていないサーバも同様に操作が可能です。
何故こうしているかと言うと、
AMIやスナップショットが作成される時にタグが付いていないのでエラーになってしまいます。
なのでタグが無くてもAMIやスナップショットを許可する必要があります。
なお、スナップショットにEnv:prodのタグを付けた後に削除しようとした場合、想定通りエラーになります。

運用で必ずタグをつけるようにしましょう。
感想
本当はもっと権限を絞れると思いますが、今回は細かい制限は入れませんでした。
(あまり時間が無かったのもあり。)
これ以外にもっと効率の良いものがあれば更新します。
ありがとうございました。
