如何用IAM策略中的Deny和NotResource限制AMI的使用

0

【以下的问题经过翻译处理】 我有一个IAM策略,只允许特定的AMI和安全组组合起来运行。这虽然有效,但是如果有另一个允许RunInstance的IAM策略,它就可以被绕过。

如果我能够除了AMI和安全组的组合之外拒绝所有东西,那就更安全了,但是当我尝试这样做时,启动总是失败。唯一的区别是使用Deny/NotResource而不是Allow/Resource。这是IAM User附加的唯一策略,没有使用SCP。

这是使用Allow的代码:

{
"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/*"
            ]
      },
      {
        "Sid": "Variable",
        "Effect": "Allow",
        "Action": "ec2:RunInstances",
        "Resource": [
            "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"
            ]
    }
    ]
}

这是使用Deny的代码,会启动失败。

{
"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/*"
        ]
    },
    {
        "Sid": "Variable",
        "Effect": "Deny",
        "Action": "ec2:RunInstances",
        "NotResource": [
            "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"
        ]
    }
    ]
}
 
profile picture
专家
已提问 5 个月前9 查看次数
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 时才有效。

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则