IAM 评估逻辑如何将显式拒绝策略与多个条件密钥结合使用?

上次更新时间:2020 年 8 月 20 日

我想创建一个 AWS Identity and Access Management (IAM) 显式拒绝策略,该策略限制创建 Amazon Elastic Compute Cloud (Amazon EC2) 实例和 Amazon Elastic Block Store (Amazon EBS) 卷。该怎么办?

简短描述

您可以使用 IAM 策略标签来限制 EC2 实例和 EBS 卷的启动,方法是将 AllowStringLike 结合使用,或将 DenyStringNotLike 条件运算符结合使用。有关将 AllowStringLike 条件运算符结合使用的说明,请参阅如何使用 IAM 策略标签来限制 EC2 实例或 EBS 卷的创建方式?

解决方法

使用以下示例 IAM 策略,该策略将 DenyStringNotLike 结合使用以限制 EC2 实例和 EBS 卷的创建。

注意:最佳做法是将 DenyStringNotLike 结合使用以防止意外特权访问。

如果您的策略有多个条件运算符或多个密钥附加到单个条件运算符,则使用 AND 逻辑评估条件。对于 Deny 多个标签值,每个 RequestTag 密钥必须在单独的语句中使用才能获得相同的 AND 逻辑。

注意:使用 Deny 策略在一个条件中设置所有 RequestTag 键值可能无法正常工作。这是因为在满足所有条件之后才允许执行该操作。当满足所有条件时,操作将被拒绝。

请注意以下必需的标签:

  • cost_center 标签必须具有非空值。
  • EC2 实例具有一个名为 Production 的标签键。
  • 标识符标签必须是任意五个字符的组合。
  • env 标签值必须为 sandboxdevprod
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowToDescribeAll",
            "Effect": "Allow",
            "Action": [
                "ec2:Describe*"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowRunInstances",
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": [
                "arn:aws:ec2:*::image/*",
                "arn:aws:ec2:*::snapshot/*",
                "arn:aws:ec2:*:*:subnet/*",
                "arn:aws:ec2:*:*:network-interface/*",
                "arn:aws:ec2:*:*:security-group/*",
                "arn:aws:ec2:*:*:key-pair/*"
            ]
        },
        {
            "Sid": "AllowRunInstancesWithRestrictions1",
            "Effect": "Deny",
            "Action": [
                "ec2:CreateVolume",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:instance/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:RequestTag/cost_center": "?*"
                }
            }
        },
        {
            "Sid": "AllowRunInstancesWithRestrictions2",
            "Effect": "Deny",
            "Action": [
                "ec2:CreateVolume",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:instance/*"
            ],
            "Condition": {
                "ForAllValues:StringNotLike": {
                    "aws:TagKeys": "Production"
                }
            }
        },
        {
            "Sid": "AllowRunInstancesWithRestrictions3",
            "Effect": "Deny",
            "Action": [
                "ec2:CreateVolume",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:instance/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:RequestTag/identifier": "?????"
                }
            }
        },
        {
            "Sid": "AllowRunInstancesWithRestrictions4",
            "Effect": "Deny",
            "Action": [
                "ec2:CreateVolume",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:instance/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:RequestTag/env": [
                        "sandbox",
                        "dev",
                        "prod"
                    ]
                }
            }
        },
        {
            "Sid": "AllowRunInstances1",
            "Effect": "Allow",
            "Action": [
                "ec2:CreateVolume",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:instance/*"
            ]
        },
        {
            "Sid": "AllowCreateTagsOnRunInstance",
            "Effect": "Allow",
            "Action": "ec2:CreateTags",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "ec2:CreateAction": "RunInstances"
                }
            }
        }
    ]
}

请注意以下强制值:

  • aws:TagKeys 值强制检查 Production 的大小写。
  • ????? 值强制使用任意五个字符的组合(忽略前导或尾随空格)。
  • ?* 值强制值字段中至少存在一个字符,以便 EC2 实例无法使用空标签值启动。