こんにちは!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月入社 最近ジムに通い始めました