AWS EC2 start/stop 实例的 IAM 策略

IAM Policy for AWS EC2 start/stop instance

我希望用户能够登录 aws 帐户并启动和停止一个特定的 ec2 实例。 到目前为止,我发现 ec2 describe 仅适用于资源中的全明星“*”。 用户可以登录,查看所有实例,但他无法启动或停止实例,因为出现了权限被拒绝的错误:(

这是我的政策

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "TheseActionsDontSupportResourceLevelPermissions",
"Effect": "Allow",
"Action": [
"ec2:Describe*"
],
"Resource": "*"
},
{
"Sid": "TheseActionsSupportResourceLevelPermissions",
"Effect": "Allow",
"Action": [
"ec2:TerminateInstances",
"ec2:StopInstances",
"ec2:StartInstances"
],
"Resource": "arn:aws:ec2:eu-central-1a:MY_ACCOUNT_ID:instance/MY_INSTANCE_ID"
}
]
}

答案是,你不能。

ec2:Stopinstancesec2:StartInstancesec2:TerminateInstances确实支持资源级权限,但不支持实例id的条件键。他们支持条件键:

  • ec2:可用区
  • ec2:Ebs 优化
  • ec2:实例配置文件
  • ec2:实例类型
  • ec2:放置组
  • ec2:地区
  • ec2:ResourceTag/tag-key
  • ec2:RootDeviceType
  • ec2:租赁

文档中突出显示了这一点 here。 (在页面上搜索 API 个调用)

唯一可能有用的条件键是 ec2:ResourceTag/tag-key。您可以在特定实例上添加资源标签,并允许用户在具有该标签的实例上调用这 3 API 次调用。

但是,除非您拒绝了与标签相关的 API 调用,否则没有什么可以阻止用户将标签添加到另一个实例,并在该实例上执行 API 调用.您需要确定拒绝标记是否适合您的情况。

希望这对您有所帮助。

让我提供一个工作示例:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ec2:RevokeSecurityGroupIngress",
                "ec2:AuthorizeSecurityGroupEgress",
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:RevokeSecurityGroupEgress",
                "ec2:StartInstances",
                "ec2:StopInstances",
                "ec2:RebootInstances"
            ],
            "Resource": [
                "arn:aws:ec2:ap-south-1:222222222222:instance/i-02222222222222ddb",
                "arn:aws:ec2:ap-south-1:222222222222:security-group/sg-022222222abc"
            ],
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/Name": "my.dev-server.com"
                }
            }
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeSecurityGroupRules",
                "ec2:DescribeInstanceAttribute",
                "ec2:DescribeNetworkAcls",
                "ec2:DescribeSecurityGroups",
                "ec2:ModifySecurityGroupRules",
                "ec2:DescribeInstanceStatus"
            ],
            "Resource": "*"
        }
    ]
}

我发现 this link 对理解这个答案也很有用。