为用户创建了一个AWS IAM策略,仅授予停止和启动实例的权限,但如果我提供特定的实例ARN资源,则它不起作用。默认EC2只读权限已授予用户描述EC2实例的权限,并在该添加的自定义样本策略之上,如下所示:
示例政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ec2:Describe*",
"ec2:StopInstances",
"ec2:RunInstances",
"ec2:StartInstances"
],
"Effect": "Allow",
"Resource": "*"
此作品
"Resource": "arn:aws:ec2:<region>:<account id>:instance/<instance id>"
"Resource": "arn:aws:ec2:<region>:<account id>:instance/*"
"Resource": "arn:aws:ec2:<region>::instance/*"
"Resource": "arn:aws:ec2:::instance/*"
"Resource": "arn:aws:ec2:::*"
这些不起作用
}
]
}
1月23日编辑(显示我到底做了什么)
目标:启动和停止对用户的单个EC2实例的实例权限。
测试了不同的组合策略,但除了"Resource": "*"
之外,它们都没有工作:
已登录: admin_user(完全访问权限)
按如下方式创建实例:
地区:俄勒冈州
可用区: us-west-2c
实例ID: i-xxx3dxxx32xxxxxxe
所有者: xxx23xxx11
创建了一个用户: testec2_user
授予用户的权限:
自定义政策,只允许停止和启动i-xxx38xxx32xx45实例,如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ec2:Describe*",
"ec2:RunInstances"
],
"Effect": "Allow",
"Resource": "*"
},
{
"Action": [
"ec2:StopInstances",
"ec2:StartInstances"
],
"Effect": "Allow",
"Resource": "arn:aws:ec2:us-west-2c:xxx23xxx11:instance/i-xxx3dxxx32xxxxxxe"
}
] }
以testec2_user
登录并尝试启动已停止的实例并收到以下错误:
You are not authorized to perform this operation. Encoded authorization failure message
我计划使用sts decode authorization message
AWS解析收到的消息。
答案 0 :(得分:2)
DescribeInstances 不支持资源级权限。 (见Unsupported Resource-Level Permissions)。
如果Amazon EC2 API操作不支持资源级别 权限,您可以授予用户使用该操作的权限,但是您 必须为策略声明的资源元素指定*。
因此,您可以将您的政策重写为:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ec2:Describe*",
"ec2:RunInstances"
],
"Effect": "Allow",
"Resource": "*"
},
{
"Action": [
"ec2:StopInstances",
"ec2:StartInstances"
],
"Effect": "Allow",
"Resource": "arn:aws:ec2:<region>:<account>:instance/<instance-id>"
}
]
}
修改强>
除了 Instance 之外, RunInstances 需要访问多种资源类型(例如图像,密钥对,网络接口,展示位置组,安全组,快照,子网和卷)并为每种资源类型接受特定的ARN格式。因此,arn:aws:ec2:<region>:<account id>:instance/*
是不够的,您将收到UnauthorizedOperation
错误。 “资源”元素应为:
"Resource": "*"
哪种方法最简单,或者:
"Resource": [
"arn:aws:ec2:<region>:<account>:instance/*",
"arn:aws:ec2:<region>::image/*",
"arn:aws:ec2:<region>:<account>:key-pair/*",
"arn:aws:ec2:<region>:<account>:network-interface/*",
"arn:aws:ec2:<region>:<account>:placement-group/*",
"arn:aws:ec2:<region>:<account>:security-group/*",
"arn:aws:ec2:<region>::snapshot/*",
"arn:aws:ec2:<region>:<account>:subnet/*",
"arn:aws:ec2:<region>:<account>:volume/*"
]
哪个更复杂,但对每个资源提供细粒度控制。例如,您可以仅对特定的EC2映像ID或子网ID执行 RunInstances 执行。有关详细信息,请参阅RunInstances
部分here。
关于PassRole权限的补充说明
执行 RunInstances 时,如果EC2实例应包含实例配置文件,则启动EC2实例的用户还必须具有IAM PassRole
权限才能将角色与启动时的实例。例如:
{
"Version": "2012-10-17",
"Statement": [
...
{
"Action": "iam:PassRole",
"Effect": "Allow",
"Resource":"arn:aws:iam::<account>:role/<role-name>"
}
]
}
这样,您可以确保用户未将角色传递给EC2实例,其中角色的权限超出了您希望用户拥有的权限。
有关授予使用IAM角色启动EC2实例的权限的详细信息,请参阅this AWS博客文章。
答案 1 :(得分:0)
这是您指定多个资源的方式:
…
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::BUCKET-NAME/home/${aws:username}",
"arn:aws:s3:::BUCKET-NAME/home/${aws:username}/*"
]
}
]
}
来源: http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_examples.html
修改强>
如果您想过滤掉而不是手动包含所有必需资源,也可以使用条件。