AWS

[AWS] EC2 인스턴스 Tag-based 관리 방법 - 2

동스토리 ㅣ 2023. 1. 29. 20:46

반응형

인스턴스를 운영하면서 특정 IAM user에게만 인스턴스를 제어하거나 multi-account 환경일 경우 특정 account에서는 인스턴스 작업을 하지 못하게 하는 방안에 대해 고려하고 있는 사용자들이 많을 것이라고 생각이 됩니다.

 

IAM 사용자에게 EC2 리소스를 사용할 수 있는 권한을 부여하는 IAM 정책을 생성할 때 정책의 Condition 요소에 태그 정보를 포함하여 태그를 기반으로 액세스를 제어할 수 있습니다. 이를 속성 기반 액세스 제어(ABAC)라고 합니다.

 

IAM Condition을 사용한 몇 가지 사례를 소개해 드리도록 하겠습니다.

 

Exam 1. 특정 IAM user가 "Env" Key를 보유하고 있을 경우에만 인스턴스 Start / Stop 가능하게 하기

https://ehdtn1219.tistory.com/192

 

[AWS] EC2 인스턴스 Tag-based 관리 방법 - 1

인스턴스를 운영하면서 특정 IAM user에게만 인스턴스를 제어하거나 multi-account 환경일 경우 특정 account에서는 인스턴스 작업을 하지 못하게 하는 방안에 대해 고려하고 있는 사용자들이 많을 것

ehdtn1219.tistory.com

 

Exam 2. 특정 IAM user가 지정된 Key와 Value를 보유하고 있을 경우에만 인스턴스를 생성 할 수 있도록 하기

 

 

Key Value
Team backend, devops, data
Env dev, test, prod

 

Tag 인스턴스 생성 여부
Tag 없음 X
Team: frontend / Env: test X
Team: data / Env: dev O
Team: devops X
Team: backend / Env: stage X
Team: data / Env: dev / name: abc123 O
Env: prod  X

 

Step 1) Policy 생성 후 IAM user에게 권한 추가

 

우선 인스턴스를 생성 하기 위한 Action을 확인하고 해당 Action이 지원하는 Resource, Condition을 확인하셔야 합니다.

다음 문서 [1] 에서 확인하실 수 있습니다.

[1] Amazon EC2에 사용되는 작업, 리소스 및 조건 키 - https://docs.aws.amazon.com/ko_kr/service-authorization/latest/reference/list_amazonec2.html

 

Amazon EC2에 사용되는 작업, 리소스 및 조건 키 - 서비스 승인 참조

 

docs.aws.amazon.com

IAM Conditions

- 집합 연산자

ForAllValues: 요청의 모든 키 값이 정책에 있는 하나 이상의 값과 일치하면 true
ForAnyValue: 요청의 키 값 중 하나가 정책의 조건 값 중 하나와 일치하면 true

- 문자열 조건 연산자

StringEquals / StringNotEquals: 정확하게 일치, 대소문자 구분
StringLike / String NotLike: 와일드카드(* 또는 ?) 사용 가능

- 태그 조건 키

aws:RequestTag/tag-key: 어떤 Tag가 요청에 전달 될 수 있는지 제어
aws:TagKeys: 특정 Tag가 키를 리소스 또는 요청에서 사용할 수 있는 지 여부 제어

 

다음으로 아래 생성 된 Policy를 IAM user에게 추가 해줍니다.

{
    "Version": "2012-10-17",
    "Statement": [{
            "Action": "ec2:*",
            "Effect": "Allow",
            "Resource": "*"
        },
        {
            "Sid": "RuninstanceKeyRestriction1",
            "Effect": "Deny",
            "Action": [
                "ec2:RunInstances",
                "ec2:CreateVolume"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:instance/*",
                "arn:aws:ec2:*:*:volume/*"
            ],
            "Condition": {
                "ForAllValues:StringNotLike": {
                    "aws:TagKeys": "team"
                }
            }
        },
        {
            "Sid": "RuninstanceValueRestriction1",
            "Effect": "Deny",
            "Action": [
                "ec2:RunInstances",
                "ec2:CreateVolume"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:instance/*",
                "arn:aws:ec2:*:*:volume/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:RequestTag/team": [
                        "backend",
                        "devops",
                        "data"
                    ]
                }
            }
        },
        {
            "Sid": "RuninstanceKeyRestriction2",
            "Effect": "Deny",
            "Action": [
                "ec2:RunInstances",
                "ec2:CreateVolume"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:instance/*",
                "arn:aws:ec2:*:*:volume/*"
            ],
            "Condition": {
                "ForAllValues:StringNotLike": {
                    "aws:TagKeys": "env"
                }
            }
        },
        {
            "Sid": "RuninstanceValueRestriction2",
            "Effect": "Deny",
            "Action": [
                "ec2:RunInstances",
                "ec2:CreateVolume"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:instance/*",
                "arn:aws:ec2:*:*:volume/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:RequestTag/env": [
                        "dev",
                        "test",
                        "prod"
                    ]
                }
            }
        }
    ]
}

Step 2) 인스턴스 생성 테스트

 

1. Tag가 Key/Value (team/frontend), (env/test)로 인스턴스 생성

Instance를 생성 할 경우 아래와 같은 에러메시지를 확인하실 수 있습니다. 이를 복호화 해보겠습니다.

aws sts decode-authorization-message --encoded-message "message"

>> \"actions\":{\"items\":[{\"value\":\"ec2:RunInstances\"},{\"value\":\"ec2:CreateVolume\"}]

 

2. Tag가 Key/Value (team/data), (env/dev)로 인스턴스 생성

인스턴스가 정상적으로 생성되는 것을 확인하실 수 있습니다.

 

질문이 있으시면 댓글 남겨주시면 확인 후에 답변해드리겠습니다.

 

감사합니다.

반응형