IAM으로 서비스 접근 권한 부여하기

AWS에서 애플리케이션 배포하기

Dunieski Otano

Amazon Web Services Solutions Architect

커밋 속 키

  • 장기 액세스 키가 저장소에 커밋됨
  • 스캐너 봇이 이를 발견해 요금을 폭증시킴
  • 역할과 최소 권한 원칙으로 이를 방지

코드 커밋 안에 실수로 노출된 AWS 액세스 키, 보안 위험으로 표시됨

AWS에서 애플리케이션 배포하기

IAM 주체: 사용자, 역할, 정책

IAM 3단 구조 다이어그램: 왼쪽에 주체(사용자, 서비스, 역할), 가운데에 허용/거부 작업이 담긴 정책 문서, 오른쪽에 임시 단기 자격 증명을 가진 IAM 역할

  • 주체(Principal): 요청을 보내는 대상
  • 정책(Policy): 권한을 부여하는 JSON 문서
  • 역할(Role): 엔터티가 맡을 수 있는 권한 집합
  • 역할은 맡는 것이고, 사용자는 장기 자격 증명을 보유함
AWS에서 애플리케이션 배포하기

올바른 프로그래밍 방식 자격 증명

  • Lambda: 실행 역할이 권한을 부여함
  • EC2: 인스턴스 프로필이 역할 자격 증명을 전달함
  • ECS: 태스크 역할이 태스크별로 권한 범위를 지정함
  • 코드나 설정에 장기 액세스 키를 두지 않음

장기 키 없이 역할을 사용하는 세 가지 AWS 컴퓨팅 서비스: 실행 역할을 사용하는 Lambda, 인스턴스 프로필을 사용하는 EC2, 태스크 역할을 사용하는 ECS, 각각 자동 자격 증명 교체를 보여줌

AWS에서 애플리케이션 배포하기

AssumeRole과 STS

  • STS AssumeRole: 역할에 대한 임시 자격 증명 획득
  • 계정 간(cross-account) 접근에 사용됨
  • 신뢰 정책이 역할을 맡을 수 있는 대상을 제어함
  • 자격 증명은 단기이며 자동 만료됨

STS AssumeRole 계정 간 흐름: 계정 A의 호출자가 STS에 자격 증명을 요청, 계정 B 역할의 신뢰 정책이 이를 허용, STS가 자동 만료되는 단기 자격 증명을 반환함

AWS에서 애플리케이션 배포하기

최소 권한 원칙과 정책 구조

정책 문(policy statement)은 세 가지 필수 요소(Effect, Action, Resource)와 선택적 요소 Condition으로 구성됩니다:

{
  "Effect": "Allow",
  "Action": "dynamodb:PutItem",
  "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/Orders",
  "Condition": {
    "Bool": { "aws:SecureTransport": "true" }
  }
}
AWS에서 애플리케이션 배포하기

IAM의 한계와 코드의 역할


IAM: 서비스 계층

  • AWS API 호출을 승인: 이 역할이 이 작업을 호출할 수 있는가?
  • 테넌트별 또는 레코드별 규칙은 적용할 수 없음

여러분의 코드: 데이터 계층

  • 인증된 사용자를 요청된 데이터와 대조해 확인
  • 둘 다 사용: IAM은 서비스를, 코드는 데이터를 보호함
AWS에서 애플리케이션 배포하기

실전 최소 권한 실행 역할

최소 권한 Lambda 실행 역할: 하나의 테이블 ARN에만 DynamoDB PutItem 권한을 부여, 작업이나 리소스에 와일드카드 없음

  • Lambda가 DynamoDB 테이블 하나에 써야 함
  • 해당 테이블 ARN에만 dynamodb:PutItem 권한 부여
  • 작업이나 리소스에 와일드카드 사용 금지
  • 실제 호출이 거부될 때만 권한 추가
AWS에서 애플리케이션 배포하기

연습해 봅시다!

AWS에서 애플리케이션 배포하기

Preparing Video For Download...