创建将运行实例限制为某些安全组的AWS IAM策略

时间:2018-05-21 22:45:54

标签: amazon-web-services amazon-ec2 amazon-iam aws-iam

我正在尝试编写一个IAM策略,该策略仅允许AWS用户在安全组是两种类型之一时启动实例。由于没有安全组条件密钥,因此我选择使用条件语句,这样EC2实例无法启动/运行,除非安全组属于两个类别之一。我在下面的政策中引用这些已批准的安全组的方式是通过他们的标签。

我遇到的问题是,当我有一个 等于第一个条件的安全组时,可以启动一个实例。但是,当我使用等于“UCSFInbound”(第二个条件)的安全组时,实例将不会启动(即使它应该)。

我确实有一个单独的策略允许更广泛地访问EC2资源,但是,根据我的理解,AWS首先在“允许”操作之前注册“拒绝”操作。如果这就是我遇到问题的原因,那么2个案例(安全组)都不应该有效。

IAM政策

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Deny",
            "Action": [
                "ec2:StartInstances",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:subnet/*",
                "arn:aws:ec2:*:*:key-pair/*",
                "arn:aws:ec2:*:*:instance/*",
                "arn:aws:ec2:*::snapshot/*",
                "arn:aws:ec2:*:*:launch-template/*",
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:security-group/*",
                "arn:aws:ec2:*:*:placement-group/*",
                "arn:aws:ec2:*:*:network-interface/*",
                "arn:aws:ec2:*::image/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "ec2:ResourceTag/aws:cloudformation:stack-id": "NetworkResourcesStack"
                },
                "StringNotEquals": {
                    "ec2:ResourceTag/Name": "UCSFInbound"
                }
            }
        }
    ]
} 

1 个答案:

答案 0 :(得分:0)

通常,您应该避免使用Deny政策,除非它取代其他政策。

例如,您可以像这样控制对Amazon S3的访问:

  1. Allow所有员工都可以访问所有S3存储桶
  2. Deny如果您不是人力资源工作人员,则可以访问人力资源部门
  3. 这使用通用策略来允许大多数访问,但之后使用拒绝来涵盖特殊情况。

    因此,您应该将arn:aws:ec2:region:account:security-group/security-group-id放入允许他们使用EC2的初始Allow政策中。