태그를 사용하여 지정된 VPC에서 EC2 인스턴스를 생성 및 관리하기 위해 IAM 사용자, 그룹 또는 역할에 대한 권한을 명시적으로 부여하도록 IAM 정책을 생성하려면 어떻게 해야 합니까?

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

지정된 VPC에서 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스를 생성 및 관리하도록 명시적으로 IAM 사용자, 그룹 또는 역할 권한을 부여하는 AWS Identity and Access Management(IAM) 정책을 생성하려면 어떻게 해야 합니까? IAM 엔터티가 특정 태그로 EC2 인스턴스를 생성하고 해당 태그를 사용해 VPC에서 해당 EC2 인스턴스를 관리할 수 있도록 정책에서 권한을 제한해야 합니다.

간략한 설명

Amazon EC2는 제한된 지원되는 리소스 수준 권한을 제공하지만, 고려할 몇 가지 작업, 리소스 및 조건이 있습니다. 특정 Amazon EC2 API 작업(예: EC2 인스턴스 시작)은 인스턴스를 제어하기 위해 태그를 사용하여 VPC ARN을 통해 제어할 수 있습니다.

​해결 방법

태그로 지정된 VPC에서 EC2 인스턴스를 생성하기 위해 IAM 사용자, 그룹 또는 역할의 권한을 제한하도록 사용자 지정 IAM 정책을 적용합니다. 정책 조건 "ec2:ResourceTags"를 사용하여 인스턴스에 대한 제어를 제한합니다. 이 정책은 고유한 태그로 지정된 VPC에서 EC2 인스턴스를 시작할 권한을 부여합니다. 그런 다음, 제한적 태그를 사용하여 EC2 인스턴스를 관리할 수 있습니다.

인스턴스를 시작하는 IAM 엔터티에 적용할 관리형 정책 생성

1.    IAM 콘솔을 열고 [정책(Policies)]을 선택하고 [정책 생성(Create Policy)]을 선택합니다.

2.    [JSON] 탭을 선택하고 다음 사용자 지정 정책을 입력합니다.  

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GrantIAMPassRoleOnlyForEC2",
            "Action": [
                "iam:PassRole"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:iam::ACCOUNTNUMBER:role/ROLENAME",
                "arn:aws:iam::ACCOUNTNUMBER:role/ROLENAME"
            ],
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": "ec2.amazonaws.com"
                }
            }
        },
        {
            "Sid": "ReadOnlyEC2WithNonResource",
            "Action": [
                "ec2:Describe*",
                "iam:ListInstanceProfiles"
            ],
            "Effect": "Allow",
            "Resource": "*"
        },
        {
            "Sid": "ModifyingEC2WithNonResource",
            "Action": [
                "ec2:CreateKeyPair",
                "ec2:CreateSecurityGroup"
            ],
            "Effect": "Allow",
            "Resource": "*"
        },
        {
            "Sid": "RunInstancesWithTagRestrictions",
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": [
                "arn:aws:ec2:REGION:ACCOUNTNUMBER:instance/*",
                "arn:aws:ec2:REGION:ACCOUNTNUMBER:volume/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/TAG-KEY": "TAG-VALUE"
                }
            }
        },
        {
            "Sid": "RemainingRunInstancePermissionsNonResource",
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": [
                "arn:aws:ec2:REGION::image/*",
                "arn:aws:ec2:REGION::snapshot/*",
                "arn:aws:ec2:REGION:ACCOUNTNUMBER*:network-interface/*",
                "arn:aws:ec2:REGION:ACCOUNTNUMBER*:key-pair/*",
                "arn:aws:ec2:REGION:ACCOUNTNUMBER*:security-group/*"
            ]
        },
        {
            "Sid": "EC2RunInstancesVpcSubnet",
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": "arn:aws:ec2:REGION:ACCOUNTNUMBER:subnet/*",
            "Condition": {
                "StringEquals": {
                    "ec2:Vpc": "arn:aws:ec2:REGION:ACCOUNTNUMBER:vpc/VPC-ID"
                }
            }
        },
        {
            "Sid": "EC2VpcNonResourceSpecificActions",
            "Effect": "Allow",
            "Action": [
                "ec2:DeleteNetworkAcl",
                "ec2:DeleteNetworkAclEntry",
                "ec2:DeleteRoute",
                "ec2:DeleteRouteTable",
                "ec2:AuthorizeSecurityGroupEgress",
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:RevokeSecurityGroupEgress",
                "ec2:RevokeSecurityGroupIngress",
                "ec2:DeleteSecurityGroup",
                "ec2:CreateNetworkInterfacePermission",
                "ec2:CreateRoute",
                "ec2:UpdateSecurityGroupRuleDescriptionsEgress",
                "ec2:UpdateSecurityGroupRuleDescriptionsIngress"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "ec2:Vpc": "arn:aws:ec2:REGION:ACCOUNTNUMBER:vpc/VPC-ID"
                }
            }
        },
        {
            "Sid": "AllowInstanceActionsTagBased",
            "Effect": "Allow",
            "Action": [
                "ec2:RebootInstances",
                "ec2:StopInstances",
                "ec2:TerminateInstances",
                "ec2:StartInstances",
                "ec2:AttachVolume",
                "ec2:DetachVolume",
                "ec2:AssociateIamInstanceProfile",
                "ec2:DisassociateIamInstanceProfile",
                "ec2:GetConsoleScreenshot",
                "ec2:ReplaceIamInstanceProfileAssociation"
            ],
            "Resource": [
                "arn:aws:ec2:REGION:ACCOUNTNUMBER:instance/*",
                "arn:aws:ec2:REGION:ACCOUNTNUMBER:volume/*"
            ],
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/TAG-KEY": "TAG-VALUE"
                }
            }
        },
        {
            "Sid": "AllowCreateTagsOnlyLaunching",
            "Effect": "Allow",
            "Action": [
                "ec2:CreateTags"
            ],
            "Resource": [
                "arn:aws:ec2:REGION:ACCOUNTNUMBER:instance/*",
                "arn:aws:ec2:REGION:ACCOUNTNUMBER:volume/*"
            ],
            "Condition": {
                "StringEquals": {
                    "ec2:CreateAction": "RunInstances"
                }
            }
        }
    ]
}

3.    ACCOUNTNUMBER, REGION, TAG-KEY, TAG-VALUE, VPC-ID, ROLENAME 파라미터를 환경의 값으로 대체합니다.

4.    (선택 사항) IAM 사용자 또는 그룹에만 이 정책을 지정하는 경우 TAG-KEY 또는 TAG-VALUE 파라미터를 IAM 정책 변수 ${aws:username}으로 대체할 수 있습니다. 이 정책 변수를 사용하면 IAM 서비스에서 이러한 파라미터를 호출 IAM 사용자의 친숙한 이름으로 미리 채울 수 있습니다. 이 단계에서는 IAM 사용자가 지정된 VPC에 있는 인스턴스만 시작할 수 있으며, IAM 사용자는 소유한 인스턴스를 제어할 수 있습니다.

5.    [정책 검토]를 선택하고 [이름]에 이름을 입력합니다. 예를 들어, "VPC_Lockdown_VPC-ID"를 입력합니다. 여기서, "VPC-ID"는 이 정책을 적용하는 VPC의 ID입니다.

6.    [정책 생성]을 선택합니다.

참고: 일부 항목은 환경의 특정 리소스로 대체해야 합니다. 자세한 내용은 Amazon 리소스 이름(ARN)을 참조하십시오.

사용자, 그룹 또는 역할에 정책 연결

1.    IAM 콘솔 탐색 창에서 [사용자], [그룹] 또는 [역할]을 선택합니다.

2.    정책을 연결하는 사용자, 그룹 또는 역할을 선택합니다.

3.    [정책 연결]을 선택합니다.

4.    [검색 상자]에 생성한 정책 이름을 입력하고 정책을 선택합니다. 예를 들어, "VPC_Lockdown_VPC-ID"를 입력합니다.

5.    [정책 연결]을 선택합니다.

이 사용자 지정 정책이 연결된 IAM 엔터티는 AWS 콘솔에 로그인하고 Amazon EC2 대시보드를 열고 서브넷, VPC 및 태그를 지정한 후 EC2 인스턴스를 시작할 수 있습니다.

이 정책은 정책 조건 "ec2:ResourceTags"를 사용하여 다음 작업을 제한합니다.

  • 인스턴스 시작
  • 인스턴스 중지
  • 인스턴스 재부팅
  • 인스턴스 종료
  • 인스턴스에 볼륨 연결
  • 인스턴스에서 볼륨 분리
  • 인스턴스에서 IAM 인스턴스 프로파일 연결 해제
  • 인스턴스에 대한 IAM 인스턴스 프로파일 연결 대체
  • 인스턴스의 콘솔 스크린샷 가져오기

이 정책은 지정된 VPC에서 다음 작업을 제한합니다.

  • 보안 그룹 삭제
  • 경로 생성 및 삭제
  • 라우팅 테이블 삭제
  • 네트워크 ACL 삭제
  • ACL 항목 삭제
  • 보안 그룹에 수신 및 송신 규칙 권한 부여 또는 취소
  • 네트워크 인터페이스 권한 생성
  • 수신 및 송신 규칙에 대한 보안 그룹 설명 업데이트

이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요합니까?