개요
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 환경을 구축하세요! 🚀
'개발 환경 > AWS' 카테고리의 다른 글
[AWS] AWS OpenSearch로 로그 및 데이터 검색 시스템 구축하기 (0) | 2025.03.05 |
---|---|
[AWS] AWS Step Functions을 이용한 서버리스 워크플로우 구축 (Lambda + S3 + DynamoDB) (0) | 2025.02.28 |
[AWS] EventBridge로 마이크로서비스 간 이벤트 기반 통신 구축하기 (0) | 2025.02.28 |
[AWS] AWS Lambda & API Gateway 성능 최적화: Cold Start와 Latency 줄이기 (0) | 2025.02.28 |
[AWS] Amazon SQS와 Lambda를 활용한 서버리스 데이터 처리 (Node.js) (0) | 2025.02.25 |
댓글