1 回答
- 最新
- 投票最多
- 评论最多
0
【以下的回答经过翻译处理】 EC2 将为 runInstances API 授权多个资源,包括实例本身。当它授权您可以访问实例“arn:aws:ec2:us-east-1:<acct>:instance/instanceID”上的“ec2:RunInstances”时,您的拒绝语句将导致该授权失败。
启动时的AMI不在指定的AMIs中,如果您只想拒绝这种场景,则策略里必须包含仅适用于 AMI 的条件。您可以在 [Supported Resource-Level Permissions for Amazon EC2 API Actions](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policy-structure.html#ec2-supported-iam-actions-resources)。AMI具有 ec2:ImageType 上下文键,因此您可以使用以下内容限制 AMI:
{
"Sid": "Variable",
"Effect": "Deny",
"Action": "ec2:RunInstances",
"NotResource": [
"arn:aws:ec2:us-east-1::image/ami-04681a1dbd79675a5",
"arn:aws:ec2:us-east-1::image/ami-0ff8a91507f77f867"
],
"Condition" : {
"Null": { "ec2:ImageType":"false"}
}
}
注意:手工编码、未经测试的 JSON 策略文档——您的情况会有所不同,但您应该有所启发。
这实质上是说“如果条件键 ec2:ImageType 不为空,则拒绝用不属于两个列出的 AMI资源执行 ec2:RunInstances。”其中,当实例被授权时,条件不匹配,则拒绝不会生效。
也就是说,实现您的意图的最佳方法(仅允许使用特定的 AMI 和特定的子网)是按如下方式编写策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ReadOnlyAccess",
"Effect": "Allow",
"Action": [
"ec2:Describe*",
"ec2:GetConsole*"
],
"Resource": "*"
},
{
"Sid": "Fixed",
"Effect": "Allow",
"Action": "ec2:RunInstances",
"Resource": [
"arn:aws:ec2:*:*:subnet/*",
"arn:aws:ec2:*:*:key-pair/*",
"arn:aws:ec2:*:*:instance/*",
"arn:aws:ec2:*:*:volume/*",
"arn:aws:ec2:*:*:network-interface/*",
"arn:aws:ec2:*:*:security-group/sg-03cf946fca20ef2e2",
"arn:aws:ec2:us-east-1::image/ami-04681a1dbd79675a5",
"arn:aws:ec2:us-east-1::image/ami-0ff8a91507f77f867"
]
}
]
}
这允许创建 EC2 实例仅当安全组是指定的安全组并且 AMI 是指定的 AMI 之一时。
这种方法利用了 IAM 的权限模型是“默认拒绝”这一事实 - 策略集中未明确允许的任何权限都将被拒绝。使用此修改后的策略允许仅在他们选择正确的安全组和 AMI 时才有效。