Post

[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. 설정

  1. 프로덕션 인스턴스인지 여부를 나타내는 모든 인스턴스에 태그 지정
    (environment/prod 또는 environment/nonprod)
    1
    2
    3
    4
    5
    
     #!/bin/bash
    	
     aws ec2 create-tags \
         --resources i-123abc \
         --tags Key=Environment,Value=Prod
    
  2. 태그를 활용하는 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. 사용자에게 태그 지정
    1
    2
    3
    4
    5
    
     #!/bin/bash
    	
     aws iam tag-user \
         --user-name Alice \
         --tags Key=Project,Value=ABC
    
  2. 리소스에 태그 지정
    1
    2
    3
    4
    5
    
     #!/bin/bash
    	
     aws ec2 create-tags \
         --resources i-123abc \
         --tags Key=Project,Value=ABC
    
  3. 정책 설정
    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.