[AWS]EC2でIAMポリシーを使ってリソースレベルの制御をしてみた

AWSアカウントで、作成したユーザがお互いのリソースを削除するがないような、IAMポリシーを作りました。利用例としては、1つのAWSアカウントで複数ベンダーに仕事をお願いする際などに、誤って他のベンダーのリソースを削除できなくなります。

ただAWSのIAMはちょっと癖があって、全てのポリシーの操作権限リソースレベルでの制御することができません。

リソースレベルでの制御とは、Tagやサブネットなどで条件指定し、許可・拒否をすることを指します。

具体的にどのポリシーがリソースごとに制御できるのかについては、以下の公式ページにかかれています。

(公式)Amazon EC2 API アクションでサポートされるリソースレベルのアクセス許可

前提

  • EC2のみの操作権限

ポリシーの説明

  • リソースレベルでの制御はOwnerタグの条件式で制御
    • StringNotEqualsでOwnerタグが許可されたキーでないものは拒否(Deny)
      例)Owner User1

      • OwnerタグのキーがUser1でないキーの場合は拒否(Deny)
  • リージョンはap-northeast-1のみに制限

サンプル

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:*"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "ec2:Region": "ap-northeast-1"
                }
            }
        },
        {
            "Effect": "Deny",
            "Action": [
                "ec2:RebootInstances",
                "ec2:StartInstances",
                "ec2:StopInstances",
                "ec2:TerminateInstances",
                "ec2:DeleteSecurityGroup",
                "ec2:DetachVolume",
                "ec2:DeleteVolume",
                "ec2:RevokeSecurityGroupIngress",
                "ec2:RevokeSecurityGroupEgress",
                "ec2:AuthorizeSecurityGroupEgress",
                "ec2:AuthorizeSecurityGroupIngress"
            ],
            "Condition": {
                "StringNotEquals": {
                    "ec2:ResourceTag/Owner": "ユーザ名"
                }
            },
            "Resource": [
                "*"
            ]
        }
    ]
}

さいごに

リソースレベルでの制御ができるポリシーが増えるといいと思います。