여러 조건 키가 있는 명시적 거부 정책을 사용하여 IAM 평가 로직은 어떻게 작동합니까?

최종 업데이트 날짜: 2020년 8월 20일

Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스 및 Amazon Elastic Block Store(Amazon EBS) 볼륨 생성을 제한하는 AWS Identity and Access Management(IAM) 명시적 거부 정책을 만들고 싶습니다. 어떻게 해야 합니까?

간략한 설명

IAM 정책 태그를 사용하여 EC2 인스턴스 및 EBS 볼륨의 시작을 제한할 수 있습니다. 예를 들어 StringLikeAllow를 또는 StringNotLike 조건 연산자Deny를 함께 사용합니다. StringLike 조건 연산자와 허용(Allow)을 함께 사용하는 방법에 대한 자세한 내용은 IAM 정책 태그를 사용하여 EC2 인스턴스 또는 EBS 볼륨을 생성하는 방법을 제한하려면 어떻게 해야 합니까?를 참조하십시오.

​해결 방법

StringNotLike와 함께 거부(Deny)를 사용하여 EC2 인스턴스 및 EBS 볼륨 생성을 제한하는 다음 IAM 정책 예제를 사용합니다.

참고: 실수로 액세스 권한이 부여되지 않도록 방지하기 위해 StringNotLike와 함께 Deny를 사용하는 것이 좋습니다.

정책에 여러 개의 조건 연산자가 있거나 단일 조건 연산자에 연결된 키가 여러 개인 경우 AND 논리를 사용하여 조건이 평가됩니다. Deny 다중 태그 값을 사용하는 경우 각 RequestTag 키를 별도의 문에서 사용하여 동일한 AND 논리를 얻어야 합니다.

참고: 거부 정책을 사용하여 하나의 조건으로 모든 RequestTag 키 값을 설정하면 예상대로 작동하지 않을 수 있습니다. 이는 모든 조건이 충족될 때까지 작업이 허용되기 때문입니다. 모든 조건이 충족되면 작업이 거부됩니다.

다음과 같은 필수 태그에 유의하십시오.

  • cost_center 태그는 null이 아닌 값을 가져야 합니다.
  • EC2 인스턴스에는 Production이라는 태그 키가 있습니다.
  • identifier 태그는 5자의 조합이어야 합니다.
  • env 태그 값은 sandbox, dev, 또는 prod여야합니다.
{
    "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 인스턴스가 빈 태그 값으로 시작할 수 없도록 합니다.