こんにちは!2023年8月にサーバワークスに入社し、現在IE課にて修行中の荒井です。
タイトル通りですが、今回は AWS コンソールから見える EC2 を制限したかった話について記事にします。
- 結論
- コンソールから見える EC2 を制限したい!
- IAM による EC2 制御
- StartInstances / StopInstances を試す
- DescribeInstancesを試す
- できない理由
- おまけ:ec2:Regionを試す
- おわりに
結論
EC2 インスタンス一覧を表示するためのアクション(DescribeInstances)には、タグ関連の条件キーが指定できないので制限することは出来ません。
コンソールから見える EC2 を制限したい!
例えば AWS アカウントを共有利用している場合など、自分が作成した EC2 以外が見えてしまいます。 自分が作成した EC2 のみ見える状態の方が、EC2 の誤操作を減らせて嬉しいです。
IAM ポリシーを用いて上記図の状態にできるかどうか調べてみました。
IAM による EC2 制御
やりたいことは「特定のIAMロールが特定のリソースのみを参照できるようにしたい」です。 思いつく方法としてはリソースにタグを付与し、 IAM ポリシーで EC2 を参照するアクションを制御することになります。
今回 IAM ポリシーを作成するにあたり、下記公式ドキュメントを参照しました。
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 が実行可能でした。
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月入社 最近ジムに通い始めました