IAM JSON 정책 언어의 문법

IAM JSON 정책 언어의 문법 (Grammar)

IAM에서 JSON 정책을 만들 때 쓰는 언어의 형식 문법(formal grammar)을 제시한 페이지예요. 정책을 어떻게 구성하고 검증하는지 이해할 수 있게 규칙 단위로 보여 줘요.

출처: 문서

본문

이 페이지는 IAM에서 JSON 정책을 만드는 데 사용되는 언어의 형식 문법을 제시해요. 정책을 어떻게 구성하고 검증하는지 이해할 수 있도록 문법을 보여 줘요. 정책 예시는 다음 주제들을 참고하세요.

다른 AWS 서비스에서 사용되는 정책 예시는 해당 서비스의 문서를 참고하세요.

정책 언어와 JSON

정책은 JSON으로 표현돼요. JSON 정책을 만들거나 편집할 때 IAM은 정책 검증(policy validation)을 수행해 효과적인 정책을 만들 수 있게 해 줘요. IAM은 JSON 구문 오류를 식별하고, IAM Access Analyzer는 정책을 더 다듬는 데 도움이 되는 권장 사항과 함께 추가 정책 검사를 제공해요. 정책 검증에 대해 더 알아보려면 IAM 정책 검증을, IAM Access Analyzer 정책 검사와 실행 가능한 권장 사항은 IAM Access Analyzer 정책 검증을 참고하세요.

이 문서에서는 유효한 JSON을 구성하는 것에 대한 완전한 설명을 제공하지 않아요. 다만 기본 JSON 규칙 몇 가지는 다음과 같아요.

  • 개별 엔터티 사이의 공백은 허용돼요.
  • 값은 따옴표로 감싸요. 숫자와 부울 값에는 따옴표가 선택 사항이에요.
  • 많은 요소(예: action_string_list와 resource_string_list)는 값으로 JSON 배열을 받을 수 있어요. 배열은 하나 이상의 값을 받을 수 있어요. 값이 둘 이상이면 배열을 대괄호([와 ])로 감싸고 쉼표로 구분해요. 예: "Action" : ["ec2:Describe*","ec2:List*"].
  • 기본 JSON 데이터 타입(부울, 숫자, 문자열)은 RFC 7159에 정의돼요.

이 문법에서 사용하는 규칙

이 문법에서 사용되는 규칙은 다음과 같아요.

  • 다음 문자는 JSON 토큰이고 정책에 포함돼요: { } [ ] " , :
  • 다음 문자는 문법의 특수 문자이고 정책에는 포함되지 않아요: = < > ( ) |
  • 요소가 여러 값을 허용하면 반복 값, 쉼표 구분자, 줄임표(...)로 표시돼요. 예:
    • [<action_string>, <action_string>, ...]
    • <principal_map> = { <principal_map_entry>, <principal_map_entry>, ... }
  • 여러 값이 허용될 때 하나의 값만 포함해도 유효해요. 값이 하나만 있으면 뒤따르는 쉼표를 생략해야 해요. 요소가 배열(대괄호 [ ]로 표시)을 받는데 값이 하나만 있으면 대괄호는 선택 사항이에요. 예:
    • "Action": [<action_string>]
    • "Action": <action_string>
  • 요소 뒤의 물음표(?)는 그 요소가 선택 사항임을 나타내요. 예: <version_block?> — 다만 선택 요소에 대한 세부 사항은 문법 목록 뒤의 주석을 참고하세요.
  • 요소 사이의 세로선(|)은 대안(alternatives)을 나타내요. 문법에서 괄호는 대안의 범위를 정의해요. 예: ("Principal" | "NotPrincipal")
  • 리터럴 문자열이어야 하는 요소는 큰따옴표(")로 감싸요. 예: <version_block> = "Version" : ("2008-10-17" | "2012-10-17")

추가 주석은 문법 목록 뒤의 주석을 참고하세요.

문법

다음 목록은 정책 언어의 문법을 설명해요. 이 문법은 2008-10-17과 2012-10-17 버전으로 표시된 정책을 설명해요. Version 정책 요소는 정책 내부에서 사용되며 정책 언어의 버전을 정의해요. 이는 관리형 정책을 변경할 때 만들어지는 정책 버전(policy version)과 다르다는 점을 구분하세요. 자세한 내용은 IAM JSON 정책 요소: Version과 IAM 정책 버전 관리를 참고하세요.

policy  = {
     <version_block?>,
     <id_block?>,
     <statement_block>
}

<version_block> = "Version" : ("2008-10-17" | "2012-10-17")

<id_block> = "Id" : <policy_id_string>

<statement_block> = "Statement" : [ <statement>, <statement>, ... ]

<statement> = { 
    <sid_block?>,
    <principal_block?>,
    <effect_block>,
    <action_block>,
    <resource_block>,
    <condition_block?>
}

<sid_block> = "Sid" : <sid_string>

<effect_block> = "Effect" : ("Allow" | "Deny")  

<principal_block> = ("Principal" | "NotPrincipal") : ("*" | <principal_map>)

<principal_map> = { <principal_map_entry>, <principal_map_entry>, ... }

<principal_map_entry> = ("AWS" | "Federated" | "Service" | "CanonicalUser") :   
    [<principal_id_string>, <principal_id_string>, ...]

<action_block> = ("Action" | "NotAction") : 
    ("*" | <action_string> | [<action_string>, <action_string>, ...])

<resource_block> = ("Resource" | "NotResource") : 
    : ("*" | <resource_string> | [<resource_string>, <resource_string>, ...])

<condition_block> = "Condition" : { <condition_map> }
<condition_map> = { 
  <condition_type_string> : { <condition_key_string> : <condition_value_list> },
  <condition_type_string> : { <condition_key_string> : <condition_value_list> }, ...
}  
<condition_value_list> = [<condition_value>, <condition_value>, ...]
<condition_value> = (<condition_value_string> | <condition_value_string> | <condition_value_string>)

정책 문법 주석

  • 단일 정책은 문(statement)의 배열을 포함할 수 있어요.
  • 정책은 연결되는 엔터티에 따라 최대 크기가 2,048자에서 10,240자 사이예요. 자세한 내용은 IAM 및 AWS STS 할당량을 참고하세요. 정책 크기 계산에는 공백 문자를 포함하지 않아요.
  • 개별 요소에는 같은 키의 인스턴스를 여러 개 포함할 수 없어요. 예를 들어 같은 문에 Effect 블록을 두 번 포함할 수 없어요.
  • 블록은 어떤 순서로든 나타날 수 있어요. 예를 들어 version_block이 id_block 뒤에 올 수 있어요. 마찬가지로 문 안에서 effect_block, principal_block, action_block은 어떤 순서로든 나타날 수 있어요.
  • id_block은 리소스 기반 정책에서 선택 사항이에요. ID 기반 정책에는 포함하면 안 돼요.
  • principal_block은 리소스 기반 정책(예: Amazon S3 버킷 정책)과 IAM 역할의 신뢰 정책에서 필수예요. ID 기반 정책에는 포함하면 안 돼요.
  • Amazon S3 버킷 정책의 principal_map에는 CanonicalUser ID를 포함할 수 있어요. 대부분의 리소스 기반 정책은 이 매핑을 지원하지 않아요. 버킷 정책에서 표준 사용자 ID를 사용하는 방법은 Amazon Simple Storage Service 사용자 가이드의 정책에서 프린시펄 지정을 참고하세요.
  • 각 문자열 값(policy_id_string, sid_string, principal_id_string, action_string, resource_string, condition_type_string, condition_key_string, condition_value의 문자열 버전)은 각자의 최소·최대 길이 제한, 특정 허용 값, 또는 요구되는 내부 형식을 가질 수 있어요.

문자열 값 주석

정책의 여러 요소에 사용되는 문자열 값에 대한 추가 정보예요.

action_string — 서비스 네임스페이스, 콜론, 동작 이름으로 구성돼요. 동작 이름에는 와일드카드를 포함할 수 있어요. 예:

"Action":"ec2:StartInstances"

"Action":[
  "ec2:StartInstances",
  "ec2:StopInstances"
]

"Action":"cloudformation:*"

"Action":"*"

"Action":[
  "s3:Get*",
  "s3:List*"
]

policy_id_string — 정책 전체에 대한 정보를 담는 방법을 제공해요. Amazon SQS와 Amazon SNS 같은 일부 서비스는 Id 요소를 정해진 방식으로 사용해요. 개별 서비스가 제한하지 않는 한 policy_id_string은 공백을 포함할 수 있어요. 일부 서비스는 이 값을 AWS 계정 안에서 고유하게 요구해요.

Note — id_block은 리소스 기반 정책에서 허용되지만 ID 기반 정책에서는 허용되지 않아요.

길이에 제한은 없지만, 이 문자열은 제한이 있는 정책 전체 길이에 기여해요.

"Id":"Admin_Policy"

"Id":"cd3ad3d9-2776-4ef1-a904-4c229d1642ee"

sid_string — 개별 문에 대한 정보를 담는 방법을 제공해요. IAM 정책에서는 기본 영숫자 문자(A-Z, a-z, 0-9)만 Sid 값에 허용돼요. 리소스 정책을 지원하는 다른 AWS 서비스는 Sid 값에 다른 요구 사항이 있을 수 있어요. 예를 들어 일부 서비스는 이 값을 AWS 계정 안에서 고유하게 요구하고, 일부 서비스는 공백 같은 추가 문자를 허용해요.

"Sid":"1" 

"Sid": "ThisStatementProvidesPermissionsForConsoleAccess"

principal_id_string — AWS 계정, IAM 사용자, IAM 역할, 페더레이션 사용자, 수임된 역할 사용자의 Amazon 리소스 이름(ARN)으로 프린시펄을 지정하는 방법을 제공해요. AWS 계정의 경우 전체 ARN 대신 축약 형식 AWS:accountnumber을 사용할 수도 있어요. AWS 서비스, 수임 역할 등을 포함한 모든 옵션은 프린시펄 지정 방법을 참고하세요. *는 "모두/익명"을 지정하는 데만 사용할 수 있고, 이름이나 ARN의 일부를 지정하는 데는 쓸 수 없어요.

resource_string — 대부분의 경우 Amazon 리소스 이름(ARN)으로 구성돼요. ARN의 리소스 부분에 와일드카드(*와 ?)를 사용할 수 있어요. ARN에서 와일드카드를 사용하는 방법은 경로에서 와일드카드 사용을 참고하세요.

Note — ID 기반 정책에서 표준 6개 필드보다 적은 불완전한 ARN을 지정하면 AWS가 누락된 모든 필드에 와일드카드 문자(*)를 추가해 ARN을 자동으로 완성해요. 예를 들어 arn:aws:sqs를 지정하면 arn:aws:sqs:*:*:*와 같아져 모든 리전·계정의 모든 Amazon SQS 리소스에 접근 권한을 부여해요. 다만 AWS STS AssumeRole, AssumeRoleWithWebIdentity, AssumeRoleWithSAML 요청에 전달하는 세션 정책은 불완전한 ARN을 지원하지 않아요. 세션 정책에서 불완전한 ARN을 쓰면 MalformedPolicyDocumentException 오류가 발생해요.

"Resource":"arn:aws:iam::123456789012:user/Bob"

"Resource":"arn:aws:s3:::amzn-s3-demo-bucket/*"

condition_type_string — 테스트되는 조건의 타입을 식별해요. 예: StringEquals, StringLike, NumericLessThan, DateGreaterThanEquals, Bool, BinaryEquals, IpAddress, ArnEquals 등. 조건 타입 전체 목록은 IAM JSON 정책 요소: Condition 연산자를 참고하세요.

"Condition": {
  "NumericLessThanEquals": {
    "s3:max-keys": "10"
  }
}

"Condition": {
  "Bool": {
    "aws:SecureTransport": "true"
  }
}

"Condition": {
  "StringEquals": {
      "s3:x-amz-server-side-encryption": "AES256"
   }
}

condition_key_string — 조건이 충족되는지 결정하기 위해 값이 테스트될 조건 키를 식별해요. AWS는 aws:PrincipalType, aws:SecureTransport, aws:userid를 포함해 모든 AWS 서비스에서 사용할 수 있는 조건 키 집합을 정의해요. AWS 조건 키 목록은 AWS 전역 조건 컨텍스트 키를, 서비스별 키는 해당 서비스의 문서(예: Amazon Simple Storage Service 사용자 가이드의 정책 조건 지정, Amazon EC2 사용자 가이드의 Amazon EC2 IAM 정책)를 참고하세요.

"Condition":{
  "Bool": {
      "aws:SecureTransport": "true"
   }
}

"Condition": {
  "StringNotEquals": {
      "s3:x-amz-server-side-encryption": "AES256"
   }
}

"Condition": {
  "StringEquals": {
    "aws:ResourceTag/purpose": "test"
  }
}

condition_value_string — 조건이 충족되는지 결정하는 condition_key_string의 값을 식별해요. 조건 타입의 유효한 값 전체 목록은 IAM JSON 정책 요소: Condition 연산자를 참고하세요.

"Condition":{
  "ForAnyValue:StringEquals": {
	"dynamodb:Attributes": [
		"ID",
		"PostDateTime"
      ]
  }
}

더 알아보기 (Learn more)