IAM JSON 정책 언어의 문법
IAM JSON 정책 언어의 문법 (Grammar)
IAM에서 JSON 정책을 만들 때 쓰는 언어의 형식 문법(formal grammar)을 제시한 페이지예요. 정책을 어떻게 구성하고 검증하는지 이해할 수 있게 규칙 단위로 보여 줘요.
출처: 문서
본문
이 페이지는 IAM에서 JSON 정책을 만드는 데 사용되는 언어의 형식 문법을 제시해요. 정책을 어떻게 구성하고 검증하는지 이해할 수 있도록 문법을 보여 줘요. 정책 예시는 다음 주제들을 참고하세요.
- AWS Identity and Access Management의 정책과 권한
- IAM ID 기반 정책 예시
- Amazon EC2 사용자 가이드의 Amazon EC2 콘솔 작업 예시 정책 및 AWS CLI·Amazon EC2 CLI·AWS SDK 작업 예시 정책
- Amazon Simple Storage Service 사용자 가이드의 버킷 정책 예시 및 사용자 정책 예시
다른 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에는CanonicalUserID를 포함할 수 있어요. 대부분의 리소스 기반 정책은 이 매핑을 지원하지 않아요. 버킷 정책에서 표준 사용자 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 STSAssumeRole,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"
]
}
}