特定の EC2 インスタンスのみを表示させる IAM ポリシーの権限設定は可能ですか?

IAM ポリシーで、特定の EC2 インスタンスのみを表示させるような権限設定はできません。
2022.02.24

困っていた内容

ある IAM ユーザーに対して特定の EC2 インスタンスのみを一覧に表示させ、その他は表示させないように設定したいのですが、IAM ポリシーでそのような権限設定は可能でしょうか?

どう対応すればいいの?

残念ながら、特定の EC2 インスタンスのみ表示を許可する IAM ポリシーは設定できません。

理由として ec2:DescribeInstances 等の表示系アクションの多くは「リソースレベルのアクセス許可」に対応していないためです。 つまり「EC2 インスタンスをすべて表示させる」もしくは「すべて表示させない」のいずれかしか設定できないことになります。

試してみた

文章だけではイメージしにくいと思いますので、実際に試してみました。

タグ「Owner:HOGE」と「Owner:FUGA」が付与されたEC2インスタンスを用意し、下記の IAM ポリシーを設定した IAM ユーザーでアクセスしてみます。

期待する動作は「Owner:HOGE のタグが付与された EC2 インスタンスのみが一覧に表示され、起動と停止ができること」です。

用意した環境

IAM ユーザーに設定する IAM ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement",
            "Effect": "Allow",
            "Action": [
                "ec2:Describe*",
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": [
                "arn:aws:ec2:ap-northeast-1:111111222222:instance/*"
            ],
            "Condition": {
                "StringEqualsIfExists": {
                    "ec2:ResourceTag/Owner": "HOGE"
                }
            }
        }
    ]
}

上記のポリシーを設定した IAM ユーザーで EC2 のコンソールにアクセスしてみると・・
おや?インスタンスが1つも表示されません。

どうやら IAM ポリシーの設定に問題があるようです。そこで以下のように変更しました。

ec2:Describe* のみステートメントを分けて Resource"*" に設定し、その他のアクションについてはタグの制限がかかるようにしています。

変更後の IAM ポリシー

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

上記の IAM ポリシーで再度アクセスすると、今後はインスタンス一覧が表示されました。

ただし指定したタグ(Owner:HOGE)に関係なく、すべてのインスタンスが表示されてしまいます。
IAM ポリシーの制限がきちんと機能しているか心配なので、動作確認してみました。

操作を許可している「Owner:HOGE」タグが付与されたインスタンスに対して停止操作をしてみると・・
意図した通り、問題なく停止できます。

今度は操作を許可していない「Owner:FUGA」のインスタンスに対して停止操作をしてみると・・
こちらも意図した通り、エラーが出て操作ができません。

この結果より「インスタンスの停止・起動」については意図した通り IAM ポリシーで制限できていますが、「インスタンスの表示」については特定のインスタンスに制限できないことが分かりました。

今回は EC2 を例に挙げましたが、この仕様は他の AWS サービス(RDS など)でも同様であることが多いので、対象サービスのドキュメントで「リソースベースのアクセス許可が可能であるか」をその都度確認しましょう。
下記参考資料内のアクション一覧表の「リソースタイプ (* 必須)」の列に値がない場合、リソースレベルのアクセス許可が不可であることを示します。

参考資料

*1 Amazon EC2 のアクション、リソース、および条件キー
*2 Amazon RDS のアクション、リソース、および条件キー