AWS コンソールから見える EC2 を制限したかった話

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

こんにちは!2023年8月にサーバワークスに入社し、現在IE課にて修行中の荒井です。
タイトル通りですが、今回は AWS コンソールから見える EC2 を制限したかった話について記事にします。

結論

EC2 インスタンス一覧を表示するためのアクション(DescribeInstances)には、タグ関連の条件キーが指定できないので制限することは出来ません。

コンソールから見える EC2 を制限したい!

例えば AWS アカウントを共有利用している場合など、自分が作成した EC2 以外が見えてしまいます。 自分が作成した EC2 のみ見える状態の方が、EC2 の誤操作を減らせて嬉しいです。

ざっくりイメージ

IAM ポリシーを用いて上記図の状態にできるかどうか調べてみました。

IAM による EC2 制御

やりたいことは「特定のIAMロールが特定のリソースのみを参照できるようにしたい」です。 思いつく方法としてはリソースにタグを付与し、 IAM ポリシーで EC2 を参照するアクションを制御することになります。

今回 IAM ポリシーを作成するにあたり、下記公式ドキュメントを参照しました。

docs.aws.amazon.com

StartInstances / StopInstances を試す

いきなり参照するアクションについて試す前に、まず EC2 の start/stop をタグで制御できるか試してみます。 EC2 を2台起動し、それぞれ「env=AAA」「env=BBB」のタグを付与します。

次に、「env=AAA」のタグが付与されているEC2について start/stop ができるような IAM ポリシーを作成します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowEC2Operations",
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/env": [
                        "AAA"
                    ]
                }
            }
        }
    ]
}

IAM ロールを作成し、AmazonEC2ReadOnlyAccess と先ほど作成したポリシーをアタッチします。 これで準備は完了です。

先程の IAM ロールにスイッチし、「env=AAA」「env=BBB」のタグが付与されている EC2 に対してそれぞれ stop を行いました。 結果としては想定通り、ポリシーで起動停止の許可をしている「env=AAA」の EC2 は stop が実行可能でした。

「env=AAA」は停止可能

「env=BBB」は権限不足でエラー

DescribeInstancesを試す

それでは本題に入りましょう。
先程作成した IAM ロールから AmazonEC2ReadOnlyAccess をデタッチし、代わりに以下のポリシーを作成してアタッチします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DescribeInstances",
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances"
            ],
            "Resource": "*"
        }
    ]
}

現在の段階だとタグ制御に関する内容は記載していないので、「env=AAA」「env=BBB」のタグが付与されている EC2 を参照することが可能です。 ステータスチェックのところでエラーが出ていますが、ステータスを参照できる権限は付与していないので想定通りです。

それでは先程作成した IAM ポリシーにタグ制御に関する内容を追記していきましょう。 今回以下のように修正してみました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DescribeInstances",
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/env": [
                        "AAA"
                    ]
                }
            }
        }
    ]
}

上手くできているなら、「env=AAA」の EC2 のみが参照できる状態になっているはずです。





残念ながら・・・


権限不足で参照することができませんでした。 タグ制御する前は参照できていたので、ポリシーによるタグ制御ができないと予想できます。 タグ制御ができなかった理由について考えていきます。

できない理由

公式ドキュメントで、DescribeInstances を確認すると条件キー列に記載されているのは ec2:Region であることが分かります。 以下の記載がある通り DescribeInstances にはタグ制御に関する条件キーが存在しないため、参照の制限ができなかったものと考えられます。

[条件キー] 列には、ポリシーステートメントの Condition 要素で指定できるキーが含まれます。

おまけ:ec2:Regionを試す

DescribeInstances に唯一存在する条件キー ec2:Region について試してみます。 以下のように、ap-northeast-1 以外のリージョンは Deny するようなポリシーを作成します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "ec2:*",
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "ec2:Region": "ap-northeast-1"
                }
            }
        }
    ]
}

IAM ロールに AmazonEC2ReadOnlyAccess と、先程作成したポリシーをアタッチします。

先程の IAM ロールにスイッチし EC2 が参照できるか確認してみると、想定通り ap-northeast-1 では参照可能でそれ以外では権限不足でエラーとなっていました。

大阪リージョンでの確認

おわりに

検証した結果 IAM ポリシーでは EC2 の参照について残念ながら制限できませんでした。 どうしても制限をしたい場合は、そもそものアカウントを分ける等が必要になりそうです。

本記事を最後までお読みくださりありがとうございました。 どなかたのお役に立てれば幸いです。

荒井 泰二郎 (記事一覧)

2023年8月入社 IE課にて研修中