AWS 자원에 태깅을 강제하는 IAM Policy 본문

AWS 자원에 태깅을 강제하는 IAM Policy

JinHwan Kim 2023. 3. 13. 19:06

AWS 자원 생성 시에 태깅을 강제하자

AWS의 비용을 계산하고 유휴 자원을 관리하려고 한다.

문제는 어떤 팀의, 어떤 목적 등 자원의 출처와 사용처를 알기 어려웠다.

이런 배경 아래, 자원 생성하는 과정에서 태깅을 강제하는 정책을 고민했다.

이를 IAM Policy로 풀었던 경험과 필요 개념, 간단한 팁을 공유하고자 한다.

 

요구 사항 

0. 기존 Policy 정책/사용자 그룹은 가능한 건드리지 않도록 한다. 

1. 사용자는 정책으로 지정한 자원을 생성하는 경우 태그를 붙여야만 한다.

2. 단순히 태그의 Key 값만 일치하면 생성을 허용할 수 있는 조건이 있을 수 있다.

3. 태그의 Key에 미리 지정된 Values 만이 Value가 되어야 생성을 허용하는 조건이 있을 수 있다.

 

IAM policy 기본 구조 

AWS의 IAM policy 는 다음과 같은 꼴을 갖는다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowIfTeamKeyExist",
            "Effect": "Allow",
            "Action": [
               "ec2:RunInstances",
            ], 
            "Resource": "arn:aws:ec2:*:*:instance/*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "aws:TagKeys": "team"
                }
            }
        }
    ]
}

 

1. Sid : 해당 Statement의 이름을 말한다.

2. Effect : 이 정책이 특정 작업을 허용하는 Statement인지, 작업을 거부하는 Statement인지를 결정한다.

3. Action : 어떤 작업에서 이 정책이 적용될 것이지 결정한다.

4. Resource : 이 정책이 적용될 자원을 말한다. 

5. Condition : 상태에 만족하는 경우에 Statement가 유효하다.

 

예를 들면 위 정책은 EC2의 instance 자원이 'Run Instance' 이벤트에서 Tag key로 'team'을 갖고 있는지를 검사한다.

team이라는 태그를 갖고 있는 경우에만 EC2 인스턴스를 실행할 수 있게 된다.

 

아래 AWS 공식 docs는 tag 정책으로 작업을 허용하는 규칙을 만드는 방법을 설명한다.

아래 문서 정도면 쉽게, 연습하기 수준으로 개념을 익힐 수 있을 것이다. 

 

https://aws.amazon.com/ko/premiumsupport/knowledge-center/iam-policy-tags-restrict/

 

IAM policy로 리소스 제어에 제한이 생길 경우 다음처럼 에러 메시지가 암호화되어 출력된다. 

 

 

아래 AWS CLI 명령어로 decode 할 수 있다. 이 안에는 어떤 정책 때문에, 어떤 리소스를, 어떻게 제어하려고 했는지, 즉 작업 요청한 요청 내용이 모두 표시된다.

aws sts decode-authorization-message --encoded-message ${MESSAGE}

 

허용 정책보다 제한 정책

앞선 IAM을 사용하면 제한을 원하는 자원이 특정 조건을 만족하는 경우에만 지정한 액션을 실행할 수 있도록 강제할 수 있다.

적은 리소스를 관리하거나 아예 새로 IAM policy를 정의하는 상황이라면 여기까지도 충분하다.

다만 그렇지 않은 경우, 예를 들면 리소스가 엄청 많거나 이미 많은 IAM policy가 정의되어 있다면 이 방법으로 관리하기가 쉽지 않다.

 

내 상황을 예시로 들면 기존의 태그 정책을 제외한 IAM Policy가 이미 엄청 많았다.

특정 Group이나 조건에서만 사용할 수 있는 리소스나 액션 Allow 정책이 많았고,

특히 IaC으로 관리되고 있는 자원의 경우 코드에서 정의한 ROLE에 위배되지 않을까 걱정했다.

 

나는 'Deny가 Allow보다 우선 순위가 높다'는 점을 이용하여 문제를 풀이했다.

User나 Group에 Deny 정책으로 태그 조건을 적용하면 기존 Allow 정책을 변경하지 않고 태그 조건을 강제할 수 있게 된다.

내 경우에는 'TagRestrictionPolicy'라는 제한 정책을 만들어 이미 존재하는 사용자 그룹에 추가하거나,

'TagRestrictionGroup'이라는 새로운 UserGroup을 만들고 User를 추가하여 기존의 룰을 더럽히지 않고 작업할 수 있었다.

 

 

추가로 AWS 공식 문서에 좋은 예시들이 많다.

https://repost.aws/ko/knowledge-center/iam-policy-tags-deny

 

Comments