AWS IAM 정책 평가 로직: 허용과 거부는 어떻게 결정될까?
IAM 정책은 명시적 거부 > 명시적 허용 > 암시적 거부 순서로 평가됩니다. JSON 정책 작성법부터 권한 경계, SCP까지 SAA-C03 필수 개념을 정리합니다.
관련 시험 도메인
- Domain 1: Design Secure Architectures
핵심 요약 (BLUF)
IAM 정책 평가는 "명시적 거부 > 명시적 허용 > 암시적 거부" 순서로 진행됩니다. 어떤 정책에서든 명시적 거부(Deny)가 있으면 다른 모든 허용을 무효화합니다. 정책에 명시되지 않은 모든 작업은 기본적으로 거부됩니다.
시험 팁
시험 핵심: 명시적 Deny는 항상 승리! 자격 증명 정책 + 리소스 정책 = 합집합, 자격 증명 정책 + 권한 경계 = 교집합
IAM 정책 평가 로직이란?
AWS에 요청이 들어오면 IAM은 모든 관련 정책을 평가하여 요청을 허용할지 거부할지 결정합니다. 이 과정을 이해하면 복잡한 권한 문제를 쉽게 해결할 수 있습니다.
평가 프로세스 3단계
1. 인증 (Authentication)
└─ 요청을 보낸 보안 주체(사용자/역할) 확인
2. 요청 컨텍스트 처리
└─ 어떤 정책을 적용할지 결정
3. 정책 평가
└─ 모든 정책 유형을 평가하여 최종 결정
명시적 거부 vs 명시적 허용 vs 암시적 거부
IAM 정책 평가의 가장 중요한 개념입니다.
| 유형 | 설명 | 우선순위 |
|---|---|---|
| 명시적 거부 | 정책에서 "Effect": "Deny" | 🥇 최우선 |
| 명시적 허용 | 정책에서 "Effect": "Allow" | 🥈 두 번째 |
| 암시적 거부 | 정책에 언급되지 않음 | 🥉 기본값 |
평가 우선순위
1. 명시적 거부가 있는가? → 있으면 즉시 거부 (평가 종료)
2. 명시적 허용이 있는가? → 있으면 허용
3. 둘 다 없으면 → 암시적 거부 (기본 동작)
시험 팁
황금 규칙: 단 하나의 명시적 Deny가 있으면, 아무리 많은 Allow가 있어도 거부됩니다.
예시: 명시적 거부의 힘
// 정책 A: S3 모든 작업 허용
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
// 정책 B: S3 삭제 거부
{
"Effect": "Deny",
"Action": "s3:DeleteObject",
"Resource": "*"
}
결과: S3 삭제는 거부 (정책 B의 명시적 Deny가 정책 A의 Allow를 무효화)
IAM 정책 JSON 작성법
정책의 기본 구조
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "StatementId",
"Effect": "Allow | Deny",
"Action": "service:Action",
"Resource": "arn:aws:...",
"Condition": { ... }
}
]
}
각 요소 설명
| 요소 | 필수 여부 | 설명 |
|---|---|---|
| Version | 권장 | 정책 언어 버전 ("2012-10-17" 사용) |
| Statement | 필수 | 권한 규칙 배열 |
| Sid | 선택 | 문(Statement) 식별자 |
| Effect | 필수 | Allow 또는 Deny |
| Action | 필수 | 허용/거부할 AWS API 작업 |
| Resource | 필수* | 정책이 적용되는 리소스 ARN |
| Condition | 선택 | 정책 적용 조건 |
| Principal | 리소스 정책만 | 정책 대상 (계정, 사용자, 역할) |
실전 예제: S3 버킷 읽기 전용 정책
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowS3ReadOnly",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
}
]
}
와일드카드 사용법
| 패턴 | 의미 |
|---|---|
s3:* | S3의 모든 작업 |
s3:Get* | Get으로 시작하는 모든 S3 작업 |
arn:aws:s3:::* | 모든 S3 버킷 |
arn:aws:s3:::my-bucket/* | my-bucket의 모든 객체 |
정책 유형별 평가 방식
자격 증명 정책 + 리소스 정책 (동일 계정)
합집합으로 평가: 둘 중 하나에서 허용되면 OK
효과적인 권한 = 자격 증명 정책 ∪ 리소스 정책
예시:
- 자격 증명 정책: S3 읽기 허용
- 리소스 정책: S3 쓰기 허용
- 결과: 읽기 + 쓰기 모두 가능
자격 증명 정책 + 권한 경계
교집합으로 평가: 둘 다 허용해야 실제로 허용
효과적인 권한 = 자격 증명 정책 ∩ 권한 경계
예시:
- 자격 증명 정책: S3, EC2, RDS 허용
- 권한 경계: S3, EC2만 허용
- 결과: S3, EC2만 가능 (RDS 불가)
자격 증명 정책 + SCP + RCP (Organizations)
삼중 교집합으로 평가: 세 정책 모두 허용해야 OK
효과적인 권한 = 자격 증명 정책 ∩ SCP ∩ RCP
시험 팁
시험 포인트: SCP는 Management Account(관리 계정)에는 적용되지 않습니다!
Condition(조건) 활용하기
Condition을 사용하면 특정 상황에서만 정책이 적용되도록 할 수 있습니다.
자주 사용하는 조건 키
| 조건 키 | 설명 | 예시 |
|---|---|---|
aws:SourceIp | 요청 IP 주소 | 특정 IP에서만 허용 |
aws:CurrentTime | 현재 시간 | 업무 시간에만 허용 |
aws:MultiFactorAuthPresent | MFA 인증 여부 | MFA 인증 시에만 허용 |
aws:PrincipalTag | 보안 주체 태그 | 특정 태그가 있는 사용자만 |
s3:prefix | S3 객체 접두사 | 특정 폴더만 접근 허용 |
예제: 특정 IP에서만 허용
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:*",
"Resource": "*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "203.0.113.0/24"
}
}
}
]
}
예제: MFA 인증 시에만 삭제 허용
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:DeleteObject",
"Resource": "arn:aws:s3:::my-bucket/*",
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
}
]
}
NotAction, NotResource, NotPrincipal
Not* 요소는 "이것을 제외한 모든 것"을 의미합니다.
NotAction 예제: IAM 제외 전체 허용
{
"Effect": "Allow",
"NotAction": "iam:*",
"Resource": "*"
}
의미: IAM을 제외한 모든 AWS 서비스 허용
시험 팁
주의: NotAction은 Deny가 아닙니다! "제외한 나머지에 대해 이 Effect를 적용"한다는 의미입니다.
상호 배타적 요소
동일한 Statement에서 함께 사용할 수 없습니다:
Action↔NotActionResource↔NotResourcePrincipal↔NotPrincipal
정책 평가 흐름도
요청 수신
│
▼
명시적 Deny 있는가? ──Yes──► 거부 (종료)
│
No
▼
SCP가 허용하는가? ──No──► 거부 (종료)
│
Yes (또는 SCP 없음)
▼
권한 경계가 허용하는가? ──No──► 거부 (종료)
│
Yes (또는 권한 경계 없음)
▼
자격 증명 또는 리소스 정책이 허용하는가?
│
├──Yes──► 허용
│
└──No───► 거부 (암시적 거부)
SAA-C03 시험 출제 포인트
- ✅ 평가 우선순위: 명시적 Deny > 명시적 Allow > 암시적 Deny
- ✅ 정책 조합 규칙: 자격 증명 + 리소스 = 합집합, 자격 증명 + 권한 경계 = 교집합
- ✅ SCP 제한: Management Account에는 적용 안 됨
- ✅ Condition 활용: IP, MFA, 시간 기반 조건부 접근
- ✅ NotAction vs Deny: NotAction은 거부가 아닌 "제외"
시험 팁
시험 문제 예시: "IAM 사용자에게 S3 전체 접근 권한이 있지만, 권한 경계에서 S3 읽기만 허용합니다. 사용자가 S3 객체를 삭제할 수 있을까요?" → 정답: 아니오 (권한 경계와의 교집합 = 읽기만 가능)
자주 묻는 질문 (FAQ)
Q: 정책이 여러 개 있으면 어떻게 평가되나요?
모든 정책이 합쳐져서 평가됩니다. 사용자에게 연결된 정책, 그룹 정책, 리소스 정책 등 모든 관련 정책을 수집한 후 평가합니다. 단, 어디서든 명시적 Deny가 있으면 최종 거부입니다.
Q: NotAction과 Deny의 차이는 무엇인가요?
NotAction은 "이 작업을 제외한 나머지"를 대상으로 Effect를 적용합니다. 예를 들어 "Effect": "Allow", "NotAction": "iam:*"은 "IAM을 제외한 모든 것을 허용"합니다. IAM 자체를 거부하는 것이 아닙니다.
Q: 정책 시뮬레이터는 어디서 사용하나요?
AWS 콘솔에서 IAM Policy Simulator를 사용할 수 있습니다. 실제 요청을 보내지 않고도 정책 평가 결과를 미리 테스트할 수 있어 디버깅에 유용합니다.
Q: Version "2012-10-17"은 왜 사용해야 하나요?
이전 버전인 "2008-10-17"에는 ${aws:username} 같은 정책 변수가 지원되지 않습니다. 항상 최신 버전인 "2012-10-17"을 사용하세요.
Q: 리소스 정책에서 Principal: "*"는 안전한가요?
매우 위험합니다. 모든 AWS 계정, 심지어 익명 사용자에게도 접근을 허용할 수 있습니다. 반드시 특정 계정이나 사용자로 제한하거나, Condition으로 추가 제약을 걸어야 합니다.
Q: 권한 경계는 언제 사용하나요?
권한 위임 시 주로 사용합니다. 예를 들어 개발자에게 IAM 사용자 생성 권한을 주되, 생성된 사용자가 가질 수 있는 최대 권한을 제한할 때 권한 경계를 사용합니다.