特定のタグが付与された EC2 のみ操作を許可する IAM ポリシーを教えてください

EC2 インスタンスへのアクセスをリソースタグで制御する IAM ポリシーをご紹介します
2022.02.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

特定のリソースタグ(例 Owner:HOGE )が付与された EC2 インスタンスのみ起動/停止/再起動を許可する IAM ポリシーの設定方法を教えてください。

どう対応すればいいの?

以下の IAM ポリシーで設定できます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Action": [
                "ec2:Describe*"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Statement2",
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances",
                "ec2:RebootInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:instance/*"
            ],
            "Condition": {
                "Null": {
                    "ec2:ResourceTag/Owner": false
                },
                "StringEqualsIfExists": {
                    "ec2:ResourceTag/Owner": "HOGE"
                }
            }
        }
    ]
}

設定にあたっての注意点

  • なぜ ec2:Describe* だけステートメントを分けているか疑問に思うかもしれませんが、これは Describe や List 等の表示系コマンドがリソース制限に対応していないためです(参考資料*1)
    ステートメント2の方に記述すると、インスタンス一覧が一切表示されなくなります。

  • 特定のリージョンやAWSアカウントに制限したい場合は Resource の指定を arn:aws:ec2:ap-northeast-1:111111222222:instance/* のように変更してもOKです。

  • Condition 句の Null 条件は「タグが何も付与されていないインスタンス」の操作を禁止するためのものです。AWS のドキュメント(参考資料 *2 *3)ではこの条件が記載されていませんが、実運用では必要になることが多いと思います。

動作確認の結果

上記の IAM ポリシーを設定した IAM ユーザーを使用して EC2 のマネジメントコンソールから動作確認をしたところ、以下の結果となりました。
※ NG になっている操作は画面上で実行はできますが、エラーが出て失敗します。

「Owner:HOGE」タグが
設定されたインスタンス
「Owner:FUGA」タグが
設定されたインスタンス
タグが何も設定されていない
インスタンス
一覧表示 OK OK OK
起動・停止 OK NG NG
新規作成 NG NG NG

下記のドキュメントも参考にして、利用する環境に合わせてカスタマイズしましょう。

参考資料

*1 ユーザーのアクセスを特定の EC2 リソースに制限する
*2 タグを使って EC2 リソースへのアクセスを管理する IAM ポリシーを作成する
*3 タグを使用した AWS リソースへのアクセスの制御