본문 바로가기
개발 환경/AWS

[AWS] AWS IAM 보안 최적화: 최소 권한 원칙과 정책 설계 가이드

by 우주다람쥐 2025. 3. 5.
반응형


개요

AWS Identity and Access Management(IAM)는 AWS 리소스에 대한 액세스를 안전하게 제어하는 서비스입니다. IAM을 올바르게 설계하지 않으면 보안 취약점이 발생할 수 있기 때문에, 최소 권한 원칙(Least Privilege)을 적용한 정책 설계가 필수적입니다.

이 글에서는 IAM의 기본 개념을 정리하고, 최소 권한 원칙을 적용하는 방법과 실제 IAM 정책(JSON) 예제를 살펴보겠습니다.


1. IAM 역할(Role) vs 사용자(User) vs 그룹(Group) 차이

AWS IAM에서는 세 가지 주요 엔터티를 사용하여 권한을 관리합니다.

1.1 IAM 사용자(User)

  • 개별 사용자 계정으로, 특정 AWS 리소스에 대한 액세스를 허용할 수 있음
  • 보통 사람(개발자, 운영자 등)에게 직접 접근 권한을 부여할 때 사용
  • 사용 사례: 콘솔 또는 CLI에서 AWS 작업을 수행하는 엔지니어

1.2 IAM 그룹(Group)

  • 여러 사용자에게 동일한 권한을 부여할 수 있는 그룹
  • 개별 사용자에게 직접 권한을 부여하는 대신, 그룹을 통해 관리 가능
  • 사용 사례: "개발팀", "운영팀"과 같은 그룹을 생성하여 공통 권한 부여

1.3 IAM 역할(Role)

  • 특정 작업을 수행하는 엔터티(예: EC2, Lambda 등)에게 임시 권한을 부여
  • 사용자 대신 AWS 서비스가 역할(Role)을 맡아 리소스 접근 가능
  • 사용 사례: Lambda 함수가 S3 버킷에 접근해야 할 때 역할을 부여

IAM 엔터티특징사용 사례

사용자(User) AWS 리소스에 직접 접근 개발자, 관리자
그룹(Group) 여러 사용자에게 동일한 권한 부여 개발팀, 운영팀
역할(Role) AWS 서비스가 임시 권한을 받아 작업 수행 Lambda, EC2, ECS

2. 최소 권한 원칙(Least Privilege) 적용 방법

최소 권한 원칙이란 사용자 또는 서비스가 특정 작업을 수행하는 데 필요한 최소한의 권한만 부여해야 한다는 보안 원칙입니다. IAM 정책을 설계할 때 아래와 같은 전략을 적용할 수 있습니다.

2.1 필요한 작업만 허용하기

  • Action 필드에서 최소한의 API 호출만 허용
  • * 와일드카드를 사용하지 않고, 구체적인 권한 지정
{
  "Effect": "Allow",
  "Action": ["s3:GetObject"],
  "Resource": "arn:aws:s3:::my-bucket/*"
}

2.2 특정 리소스에만 접근 허용

  • Resource 필드에서 특정 S3 버킷이나 특정 DynamoDB 테이블만 지정
  • "*" 사용을 피하고, 정확한 ARN(리소스 이름) 명시
{
  "Effect": "Allow",
  "Action": "dynamodb:PutItem",
  "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/Orders"
}

2.3 조건(Condition) 활용하여 보안 강화

  • IP 주소, MFA 인증 여부, 시간 제한 등 추가 보안 조건 설정 가능
{
  "Effect": "Allow",
  "Action": "ec2:StartInstances",
  "Resource": "*",
  "Condition": {
    "IpAddress": {"aws:SourceIp": "203.0.113.0/24"}
  }
}

2.4 권한 경계(Boundary) 설정

  • IAM 사용자 또는 역할(Role)이 가질 수 있는 최대 권한을 제한
  • 실수로 과도한 권한을 부여하지 않도록 제어 가능
{
  "Effect": "Allow",
  "Action": "s3:*",
  "Resource": "arn:aws:s3:::my-bucket",
  "Condition": {
    "StringEquals": {"aws:PrincipalOrgID": "o-abcdefghij"}
  }
}

3. IAM 정책(JSON) 작성 예제 및 실전 사례

3.1 S3 읽기 전용(Read-Only) 정책 예제

다음 정책은 S3 버킷의 객체를 읽을 수 있지만, 수정/삭제는 불가능합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject"],
      "Resource": "arn:aws:s3:::example-bucket/*"
    }
  ]
}

3.2 특정 DynamoDB 테이블에만 쓰기 허용

이 정책은 Orders 테이블에만 데이터를 추가할 수 있도록 제한합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "dynamodb:PutItem",
      "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Orders"
    }
  ]
}

3.3 특정 IP에서만 EC2 인스턴스 시작 허용

아래 정책은 특정 사무실 IP 범위(203.0.113.0/24)에서만 EC2 인스턴스를 시작할 수 있도록 합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ec2:StartInstances",
      "Resource": "*",
      "Condition": {
        "IpAddress": {"aws:SourceIp": "203.0.113.0/24"}
      }
    }
  ]
}

결론

AWS IAM은 클라우드 보안의 핵심 요소이며, 잘못된 정책 설정은 보안 위협으로 이어질 수 있습니다. 따라서 최소 권한 원칙을 적용하고, 특정 리소스 및 조건을 활용하여 세밀하게 접근 제어하는 것이 중요합니다.

핵심 요약

✅ IAM 사용자(User), 그룹(Group), 역할(Role)의 차이를 이해하고 올바르게 활용하기
✅ 최소 권한 원칙을 적용하여 불필요한 권한을 부여하지 않기
✅ IAM 정책에서 Action, Resource, Condition을 활용하여 보안 강화하기
✅ IAM 정책(JSON) 예제를 참고하여 실무에 적용하기

IAM 정책을 올바르게 설계하여 안전한 AWS 환경을 구축하세요! 🚀

반응형

댓글