SAABlog
보안중급

AWS IAM 정책 평가 로직: 허용과 거부는 어떻게 결정될까?

IAM 정책은 명시적 거부 > 명시적 허용 > 암시적 거부 순서로 평가됩니다. JSON 정책 작성법부터 권한 경계, SCP까지 SAA-C03 필수 개념을 정리합니다.

PHILOLAMB-
IAM정책보안JSON권한 경계

관련 시험 도메인

  • 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:MultiFactorAuthPresentMFA 인증 여부MFA 인증 시에만 허용
aws:PrincipalTag보안 주체 태그특정 태그가 있는 사용자만
s3:prefixS3 객체 접두사특정 폴더만 접근 허용

예제: 특정 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 서비스 허용

시험 팁

주의: NotActionDeny가 아닙니다! "제외한 나머지에 대해 이 Effect를 적용"한다는 의미입니다.

상호 배타적 요소

동일한 Statement에서 함께 사용할 수 없습니다:

  • ActionNotAction
  • ResourceNotResource
  • PrincipalNotPrincipal

정책 평가 흐름도

요청 수신
    │
    ▼
명시적 Deny 있는가? ──Yes──► 거부 (종료)
    │
    No
    ▼
SCP가 허용하는가? ──No──► 거부 (종료)
    │
    Yes (또는 SCP 없음)
    ▼
권한 경계가 허용하는가? ──No──► 거부 (종료)
    │
    Yes (또는 권한 경계 없음)
    ▼
자격 증명 또는 리소스 정책이 허용하는가?
    │
    ├──Yes──► 허용
    │
    └──No───► 거부 (암시적 거부)

SAA-C03 시험 출제 포인트

  1. 평가 우선순위: 명시적 Deny > 명시적 Allow > 암시적 Deny
  2. 정책 조합 규칙: 자격 증명 + 리소스 = 합집합, 자격 증명 + 권한 경계 = 교집합
  3. SCP 제한: Management Account에는 적용 안 됨
  4. Condition 활용: IP, MFA, 시간 기반 조건부 접근
  5. 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 사용자 생성 권한을 주되, 생성된 사용자가 가질 수 있는 최대 권한을 제한할 때 권한 경계를 사용합니다.

관련 글

참고 자료