背景


特定のVPCに紐づいたリソース(EC2)のみアクセス権限を付与したいケースがあり、タグとポリシーを利用すれば想定通りの挙動を実現することができました。
備忘録的な形で掲載させていただきます。

 

実現したいこと


アカウント内のリソースは閲覧できてOK
編集、削除といった変更のかかる権限は、タグに紐づいたリソースのみに制限したい

どのように実現できたか


タグを使用することでリソースへのアクセス制限することができました。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_tags.html

手順


1.IAMユーザを作成しロールを割り当てる。(作成方法は割愛させていただきます。)
2.AWSがデフォルトで用意されているポリシーReadOnlyAccessを付与する
3.タグが付与されたリソースのみ操作できる下記ポリシーを付与する
4.対象のリソースにタグを付与する

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/Resource": "iret-resource-tag"
                }
            }
        }
    ]
}
対象EC2には、上記ポリシーの”StringEquals”の部分に記載したキーと値を設定します。

このポリシーが割り当てられたユーザは、タグ『iret-resource-tag』が設定されたリソースのみ変更操作ができるようになりました。

できなかったこと


アクセス権限を絞ることができたので、『DescribeInstances』のアクションで、そもそもアクセス権限付与したいリソースのみ閲覧できるかなと思い、試してみましたができませんでした。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances",
                "ec2:DescribeInstances"
            ],
            "Resource": "arn:aws:ec2:*:*:instance/*",
            "Condition": {
                "aws:ResourceTag/Resource": "iret-resource-tag"
            }
        }
    ]
}

アクションによってリソースレベルの許可をサポートしているかによって変わるみたいです。『DescribeInstances』は『*』が必須でした。
公式ドキュメントにも記載がありました。

[アクション] テーブルの [リソースタイプ] 列は、各アクションがリソースレベルの許可をサポートしているかどうかを示します。この列に値がない場合は、ポリシーステートメントの Resource 要素で、ポリシーが適用されるすべてのリソース (「*」) を指定する必要があります。列にリソースタイプが含まれる場合、そのアクションを含むステートメントでそのタイプの ARN を指定できます。

なので、閲覧を絞るのは諦め、別のステートメントにDescribeInstancesを設定しました。(またはReadOnlyAccessを付与)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "arn:aws:ec2:*:*:instance/*",
            "Condition": {
                    "aws:ResourceTag/Resource": "iret-resource-tag"
            }
        },
        {
            "Effect": "Allow",
            "Action": "ec2:DescribeInstances",
            "Resource": "*"  
        }
    ]
}

タグとポリシーを使えば想定通りアクセス権限を制限することができたのでよかったです。
また気になること、検証できたことがありましたら記事にしたいと思います。

 

参考記事