[AWS-Security] 2.3. 태그를 사용한 속성 기반 접근 제어
[AWS-Security] 2.3. 태그를 사용한 속성 기반 접근 제어
1. 개요
- 속성 기반 접근 제어(ABAC, Attribute-Based Access Control)는 호출자와 리소스의 속성에 따라 달라지는 동적 권한을 허용하는 모델이다.
- 역할 기반 접근 제어와는 반대 개념이다.
2. 태그가 지정된 리소스
2.1. 시나리오
- 상황 : 하나의 계정(Account)에서 실행 중인 프로덕션 및 비프로덕션 EC2 인스턴스가 있다.
- 목표 : 비프로덕션 EC2 인스턴스를 종료할 수 있는 권한을 사용자에게 부여하려고 한다.
- (문제점) 역할 기반 접근 제어
- 비프로덕션 EC2 인스턴스의 ARN을 사용자 ID 정책의 리소스 블록에 추가 해야 한다.
- 신규 비프로덕션 EC2가 생성되면, 하나하나 추가해야 한다.
- (해결책) 속성 기반 접근 제어(ABAC)
- 인스턴스의 ARN이 아닌, 부착된 태그를 보고 권한을 부여한다.
2.2. 설정
- 프로덕션 인스턴스인지 여부를 나타내는 모든 인스턴스에 태그 지정
(environment/prod 또는 environment/nonprod)1 2 3 4 5
#!/bin/bash aws ec2 create-tags \ --resources i-123abc \ --tags Key=Environment,Value=Prod
- 태그를 활용하는 ID 정책 생성 -> Condition 블록을 통해 수행
(NonProd 태그를 가지고 있는 인스턴스 조건 지정)1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:TerminateInstances", "Resource": "*", "Condition": { "StringEquals": { "ec2:ResourceTag/Environment": "NonProd" } } } ] }
- Condition 블록의 StringEquals 개체는 각 키를 평가하고 값과 일치하는지 확인한다.
- 새 EC2 인스턴스를 생성하는 경우, 프로덕션 인스턴스인지 여부(prod/nonprod)에 따라 태그를 지정하기만 하면, 올바른 접근 제어가 적용된다.
- 인스턴스가 생성되거나 삭제될 때마다 정책을 추가로 변경할 필요가 없다.
2.3. 태그 기반의 접근 제어를 지원하는 서비스
- EC2
- Elastic Beanstalk
- ECR
- ELB
- EBS
- EFS
- FSx
- S3
- RDS
- CodeCommit
- Cognito
- IAM
- Secrets Manager
- SageMaker
- CloudFormation
- CloudWatch
- Config
- Systems Manager
- API Gateway
- Kinesis
- Athena
3. 태그가 지정된 보안 주체
3.1. 시나리오
- 상황 : 하나의 AWS 계정 안에서 여러 팀(프로젝트 A, 프로젝트 B)이 동시에 작업을 하고 있다.
- 목표 : 프로젝트 A 팀원은 프로젝트 A의 서버만 종료시킬 수 있어야 하며, 다른 팀의 서버는 권한이 없어야 한다.
- (해결책) 속성 기반 접근 제어(ABAC)
- 사용자에게 태그 지정 : Alice라는 사용자에게 Project=ABC라는 태그 부착
- 리소스에 태그 지정 : EC2 서버에도 Project=ABC라는 태그 부착
- 정책 설정 : 사용자의 Project 태그 값과 리소스의 Project 태그 값이 일치할 경우에만 작업을 허용하는 규칙 생성
3.2. 설정
- 사용자에게 태그 지정
1 2 3 4 5
#!/bin/bash aws iam tag-user \ --user-name Alice \ --tags Key=Project,Value=ABC
- 리소스에 태그 지정
1 2 3 4 5
#!/bin/bash aws ec2 create-tags \ --resources i-123abc \ --tags Key=Project,Value=ABC
- 정책 설정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:TerminateInstances", "Resource": "*", "Condition": { "StringEquals": { "ec2:ResourceTag/Project": "${aws:PrincipalTag/Project}" } } } ] }
- ${aws:PrincipalTag/Project} 문자열은 정책이 연결된 사용자의 키가 Project인 태그 값으로 평가된다. -> 이 Condition 블록은 리소스가 호출자(사용자)의 Project 태그와 일치하는 Project 태그가 있는 EC2 인스턴스인 경우에만 정책을 적용한다.
- ID 정책에 이 Condition 블록을 추가하고, 모든 사용자에게 연결할 수 있다.
- Project ABC 인스턴스는 Terminate 할 수 있지만, Project XYZ 태그가 지정된 인스턴스는 Terminate 할 수 없다.
3.3. 장점
- (기존) 역할 기반 방식 (ID 기반) : 새로운 팀(XYZ 프로젝트)이 생기면, 관리자가 정책 문서를 열어서 XYZ 팀원 아이디와 서버 아이디를 추가하는 수정 작업이 필요하다.
- (이용 시) 속성 기반 방식
- 새로운 사람이 오면 태그만 달면 된다.
- 정책은 “태그가 같으면 통과”라는 하나의 규칙만 유지하면 되기 때문에, 정책 문서는 수정할 필요가 없다.
- “사용자 태그와 서버 태그가 일치될 때만 권한을 주는 자동화된 보안 규칙”이다.
This post is licensed under CC BY 4.0 by the author.