이 중에 ACL을 제외한 모든 IAM의 정책에서 JSON 정책 구조를 사용합니다.
최상위 element 안에 다수개의 statement로 이루어져있는 구조입니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "FirstStatement",
"Effect": "Allow",
"Action": ["iam:ChangePassword"],
"Resource": "*"
},
{
"Sid": "SecondStatement",
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
},
{
"Sid": "ThirdStatement",
"Effect": "Allow",
"Action": [
"s3:List*",
"s3:Get*"
],
"Resource": [
"arn:aws:s3:::confidential-data",
"arn:aws:s3:::confidential-data/*"
],
"Condition": {"Bool": {"aws:MultiFactorAuthPresent": "true"}}
}
]
}
밑에서 각 정책 요소들이 어떤 의미를 갖는지 알아본 후 돌아와서 이 규칙이 어떤 의미였는지 평가해봅시다.
Version
사용하고자 하는 정책언어의 버전을 지정합니다. 최신버전(2012-10-17
)을 사용하는 것이 권장됩니다.
최신버전 : 2012-10-17
구버전 : 2008-10-17
ex) "Version": "2012-10-17"
Id
정책 식별자를 지정합니다. ID가 필요한 경우 UUID(GUID)
값이나 그 일부를 ID로 사용하여 고유성을 확보하는 것이 좋습니다.
AWS 서비스중에는 이 요소를 필요로 하거나 고유성 요건을 요구하는 경우가 있습니다.(Amazon SQS또는 Amazon SNS 등)
ex) "Id": "cd3ad3d9-2776-4ef1-a904-4c229d1642ee"
Statement 필수
정책 요소의 컨테이너 역할을 합니다. 단일 문 또는 개별 문의 배열을 포함 할 수 있습니다.
ex) "Statement": [{...},{...},{...}]
Sid
설명문(statement)의 Id입니다.
IAM에서 Sid는 IAM API에 노출되지 않습니다. 따라서 이 ID를 근거로 특정 문을 가져올 수는 없습니다.
AWS 서비스중에는 이 요소를 필요로 하거나 고유성 요건을 요구하는 경우가 있습니다.(Amazon SQS또는 Amazon SNS 등)
ex) "Sid:"1"
Effect 필수
문의 허용(allow) 또는 명시적 거부(explicit deny) 중 하나를 지정합니다.
허용 : Allow
거부 : Deny
기본적으로 리소스 액세스는 거부된 상태이며 허용하려면 Effect
요소를 Allow
로 설정해야합니다.
ex) "Effect": "Allow"
Principal
리소스 기반 정책을 생성하는 경우 리소스에 대한 액세스가 허용되거나 거부되는 보안 주체
(계정, 사용자, 역할, 페더레이션 사용자) 를 지정합니다.
보안 주체 이름이나 ARN의 일부를 나타내기 위해 와일드카드(*
)를 사용할 수 없습니다. 보안 주체는 항상 특정 사용자가 되어야하기 때문입니다.
다음과 같이 보안 주체를 지정할 수 있습니다.
1️⃣ AWS 계정 및 루트 사용자
AWS 계정 ID 지정
"Principal": { "AWS": "arn:aws:iam::AWS-account-ID:root" }
"Principal": { "AWS": "AWS-account-ID" }
Canonical ID 지정
"Principal": { "CanonicalUser": "canonical-ID" }
2️⃣ IAM 역할
"Principal": { "AWS": "arn:aws:iam::AWS-account-ID:role/role-name" }
3️⃣ 역할 세션
수임된 역할 세션 보안 주체
"Principal": { "AWS": "arn:aws:sts::AWS-account-ID:assumed-role/role-name/role-session-name" }
웹 자격 증면 세션 보안 주체
"Principal": { "Federated": "cognito-identity.amazonaws.com" }
SAML 세션 보안 주체
"Principal": { "Federated": "arn:aws:iam::AWS-account-ID:saml-provider/provider-name" }
4️⃣ IAM 사용자
"Principal": { "AWS": "arn:aws:iam::AWS-account-ID:user/user-name" }
5️⃣ 페더레이션 사용자 세션
"Principal": { "AWS": "arn:aws:sts::AWS-account-ID:federated-user/user-name" }
6️⃣ AWS 서비스
"Principal": { "Service": [ "service-name1.amazonaws.com", "service-name2.amazonaws.com" ] }
7️⃣ 모든 보안 주체
"Principal": "*"
"Principal" : { "AWS" : "*" }
8️⃣ 배열을 이용하여 여러개의 계정을 지정하기
"Principal": {
"AWS": [
"arn:aws:iam::123456789012:root",
"999999999999",
"CanonicalUser": "79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be"
]
}
NotPrincipal
보안 주체 목록에서 예외를 지정할 수 있습니다.
NotPrincipal
을 써야하는 시나리오는 극히 드뭅니다. 따라서 사용을 결정하기 전에 다른 권한 부여 옵션을 살펴보는 것이 바람직합니다.
ex) NotPrincipal 에 명시된 계정들만 제외한 모든 보안주체의 리소스 액세스를 명시적으로 거부하는 예시
"Effect": "Deny",
"NotPrincipal": {"AWS": ["arn:aws:iam::444455556666:user/Bob", "arn:aws:iam::444455556666:root"]},
Action Action 혹은 NotAction 중 하나는 필수
정책이 허용하거나 거부하는 작업 목록을 포함합니다.
"Action": "작업 접두사:작업 이름"
ex) 단일 액션 / 다수의 액션 / 와일드 카드를 사용한 액션을 명시하는 예시
"Action": "sqs:SendMessage"
"Action": [ "sqs:SendMessage", "sqs:ReceiveMessage", "ec2:StartInstances", "iam:ChangePassword", "s3:GetObject" ]
"Action": "s3:*"
NotAction Action 혹은 NotAction 중 하나는 필수
지정된 작업 목록을 제외한 모든 액션을 지정할 수 있습니다.
ex) 사용자가 IAM을 제외한 모든 AWS 서비스에서 작업에 액세스하도록 허용하는 예시
"Effect": "Allow",
"NotAction": "iam:*",
"Resource": "*"
Resource Resource 혹은 NotResource 중 하나는 필수
IAM 권한 정책을 생성하는 경우 작업이 적용되는 리소스 목록을 지정합니다.
ex) s3의 특정 버킷 내 포함된 모든 항목을 나타내는 예시
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
NotResource
지정된 리소스 목록을 제외한 모든 리소스를 지정할 수 있습니다.
ex) HRBucket 버킷의 Payroll 폴더를 제외하고 모든 s3 리소스에 대한 액세스를 거부하는 예시
"Effect": "Deny",
"Action": "s3:*",
"NotResource": [
"arn:aws:s3:::HRBucket/Payroll",
"arn:aws:s3:::HRBucket/Payroll/*"
]
Condition
정책에서 권한을 부여하는 상황을 지정합니다.
"Condition" : { "{condition-operator}" : { "{condition-key}" : "{condition-value}" }}
condition-operator: 조건 연산자
condition-key: 조건 키
condition-value: 조건 값
조건 연산자(condition-operaotr)
문자열 조건 연산자 | 설명 |
---|---|
StringEquals | 정확한 일치, 대소문자 구분 |
StringNotEquals | 불일치 |
StringEqualsIgnoreCase | 정확한 일치, 대소문자 무시 |
StringNotEqualsIgnoreCase | 불일치, 대소문자 무시 |
StringLike | 대소문자 구분 일치, 와일드카드(* , ? ) 포함 가능 |
StringNotLike | 대소문자 구분 불일치, 와일드카드(* , ? ) 포함 가능 |
ex) 이름이 johndoe인 사용자를 지정
"Condition" : {"StringEquals" : { "aws:username" : "johndoe" }}
숫자 조건 연산자 | 설명 |
---|---|
NumericEquals | 일치 |
NumericNotEquals | 불일치 |
NumericLessThan | 미만 |
NumericLessThanEquals | 이하 |
NumericGreaterThan | 초과 |
NumericGreaterThanEquals | 이상 |
ex) 한번에 최대 10개까지 객체를 나열할 수 있다고 지정
"Condition": {"NumericLessThanEquals": {"s3:max-keys": "10"}}
날짜 조건 연산자 | 설명 |
---|---|
DateEquals | 특정 날짜 일치 |
DateNotEquals | 특정 날짜 불일치 |
DateLessThan | 특정 날짜/시간 이전 |
DateLessThanEquals | 특정 날짜/시간 또는 이전 |
DateGreaterThan | 특정 날짜/시간 이후 |
DateGreaterThanEquals | 특정 날짜/시간 또는 이후 |
ex) 요청을 생성하는 데 사용된 임시 보안 자격 증명이 2020년 이후에 발급되었음을 지정
"Condition": {"DateGreaterThan": {"aws:TokenIssueTime": "2020-01-01T00:00:01Z"}}
불린 조건 연산자 | 설명 |
---|---|
Bool | 부울 일치 |
ex) 요청에 SSL을 사용해야 한다고 지정
"Condition": {"Bool": {"aws:SecureTransport": "true"}}
이진 조건 연산자 | 설명 |
---|---|
BinaryEquals | 이진 형식의 키 값 일치 |
ex) 지정한 키 값을 정책 내 이진 값의 base-64 인코딩 표시와 바이트 단위로 비교
"Condition" : {
"BinaryEquals": {
"key" : "QmluYXJ5VmFsdWVJbkJhc2U2NA=="
}
}
IP 주소 조건 연산자 | 설명 |
---|---|
IpAddress | 지정된 IP주소 또는 범위 |
NotIpAddress | 지정된 IP주소 또는 범위를 제외한 모든 IP 주소 |
ex) IP주소 범위를 지정(CIDR 형식을 따라야 함)
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"203.0.113.0/24",
"2001:DB8:1234:5678::/64"
]
}
}
ARN 조건 연산자 | 설명 |
---|---|
ArnEquals, ArnLike | ARN 대소문자 구분 일치. 와일드카드(* , ? ) 포함 가능 |
ArnNotEquals, ArnNotLike | ARN 불일치 |
모든 서비스가 이 연산자를 사용하여 ARN 비교를 지원하는 것은 아닙니다. ARN 조건 연산자가 작동하지 않으면 문자열 조건 연산자를 사용합니다.
ex) aws:SourceArn 값이 arn:aws:sns:REGION:123456789012:TOPIC-ID 와 일치함을 지정
"Condition": {"ArnEquals": {"aws:SourceArn": "arn:aws:sns:REGION:123456789012:TOPIC-ID"}}
ifExists 조건 연산자
Null
조건을 제외한 모든 조건 연산자의 이름 끝에 ifExists
를 추가할 수 있습니다.(예: StringLikeIfExists
)
요청 콘텍스트에 정책 키가 있으면 정책에 지정된 대로 키를 처리하고 키가 없으면 true
로 평가합니다.
ex) ec2:InstanceType 조건 키가 있는 경우 해당 조건을 검사하고 없는 경우는 true로 평가하는 조건
"Condition": {
"StringLikeIfExists": {
"ec2:InstanceType": [
"t1.*",
"t2.*",
"m3.*"
]}}
Null 연산자
Null
조건 연산자를 사용하면 조건 키의 유무를 검사할 수 있습니다.
정책문에서는 true
(키가 부재하며 값이 null임) 또는 false
(키가 존재하며 값이 null이 아님)을 사용합니다.
ex) aws:TokenIssueTime 키가 존재하면 안됨을 나타내는 조건
"Condition":{"Null":{"aws:TokenIssueTime":"true"}}
참고링크
https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html
https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html