IAM JSON 정책 요소: 조건 연산자
Condition
요소의 조건 연산자를 사용하여 정책의 조건 키 및 값을 요청 컨텍스트의 값과 일치시킵니다. Condition
요소에 대한 자세한 내용은 IAM JSON 정책 요소: Condition 섹션을 참조하세요.
정책에서 사용할 수 있는 조건 연산자는 선택한 조건 키에 따라 다릅니다. 전역 조건 키 또는 서비스별 조건 키를 선택할 수 있습니다. 전역 조건 키에 사용할 수 있는 조건 연산자를 알아보려면 AWS 글로벌 조건 컨텍스트 키 섹션을 참조하세요. 서비스별 조건 키에 사용할 수 있는 조건 연산자를 알아보려면 AWS 서비스에 대한 작업, 리소스 및 조건 키를 참조하고 보려는 서비스를 선택합니다.
중요
정책 조건에서 지정한 키가 요청 컨텍스트에 없으면 값이 일치하지 않으며 조건은 false입니다. 정책 조건에 따라 키가 일치하지 않아야 하며(예: StringNotLike
또는 ArnNotLike
) 올바른 키가 존재하지 않는 경우 조건은 true입니다. 이 로직은 ...IfExists 및 Null check를 제외한 모든 조건 연산자에 적용됩니다. 이 연산자는 키가 요청 컨텍스트에 존재하는지 여부를 테스트합니다.
조건 연산자는 다음 범주로 그룹화할 수 있습니다.
-
Amazon 리소스 이름(ARN)(일부 서비스에서만 사용 가능.)
-
...IfExists(키 값이 다른 확인을 위해 존재하는지 여부를 확인)
-
Null 확인(키 값이 단독 확인을 위해 존재하는지 여부를 확인)
문자열 조건 연산자
문자열 조건 연산자를 사용하여 키와 문자열 값을 비교한 결과에 따라 액세스를 제한하는 Condition
요소를 생성할 수 있습니다.
조건 연산자 | 설명 |
---|---|
|
정확한 일치, 대소문자 구분 |
|
불일치 |
|
정확한 일치, 대소문자 무시 |
|
불일치, 대소문자 무시 |
|
대소문자 구분 일치. 문자열 어디에서나 다중 문자 일치 와일드카드(*) 및 단일 문자 일치 와일드카드(?)를 값에 포함할 수 있습니다. 부분적으로 문자열이 일치하도록 하려면 와일드카드를 지정해야 합니다. 참고키에 다수의 값이 저장되는 경우에는 설정 연산자( |
|
대소문자 구분 불일치. 문자열 어디에서나 다중 문자 일치 와일드카드(*) 또는 단일 문자 일치 와일드카드(?)를 값에 포함할 수 있습니다. |
예를 들어, 다음 문에는 aws:PrincipalTag
키를 사용하여 요청을 수행하는 보안 주체에게 iamuser-admin
작업 범주에서 태그를 지정하도록 지정하는 Condition
요소가 포함되어 있습니다.
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "iam:*AccessKey*", "Resource": "arn:aws:iam::
account-id
:user/*", "Condition": {"StringEquals": {"aws:PrincipalTag/job-category": "iamuser-admin"}} } }
정책 조건에서 지정한 키가 요청 컨텍스트에 없으면 값이 일치하지 않습니다. 이 예제에서는 보안 주체가 태그가 연결된 IAM 사용자를 사용하는 경우 aws:PrincipalTag/job-category
키가 요청 컨텍스트에 존재합니다. 이는 태그 또는 세션 태그가 연결된 IAM 역할을 사용하는 보안 주체를 위해 포함된 것이기도 합니다. 태그가 없는 사용자가 액세스 키를 보거나 편집하려고 하면 조건이 false
을 반환하고 요청이 이 문에 의해 묵시적으로 거부됩니다.
정책 변수를 String
조건 연산자와 함께 사용할 수 있습니다.
다음 예제에서는 StringLike
조건 연산자를 사용하여 정책 변수와 문자열 일치를 수행해 IAM 사용자가 Amazon S3 콘솔을 사용하여 Amazon S3 버킷에서 자신의 ‘홈 디렉토리’를 관리할 수 있는 정책을 생성할 수 있습니다. 이 정책은 s3:prefix
가 지정된 패턴 중 하나와 일치하는 경우 S3 버킷에서 지정된 작업을 허용합니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::*" }, { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::
amzn-s3-demo-bucket
", "Condition": {"StringLike": {"s3:prefix": [ "", "home/", "home/${aws:username}/" ]}} }, { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket
/home/${aws:username}", "arn:aws:s3:::amzn-s3-demo-bucket
/home/${aws:username}/*" ] } ] }
OIDC 페더레이션 시 Condition
요소를 사용하여 애플리케이션 ID와 사용자 ID에 따라 리소스 액세스를 제한하는 방법을 보여주는 정책의 예는 Amazon S3: Amazon Cognito 사용자가 버킷에 있는 객체에 액세스하도록 허용 섹션을 참조하세요.
와일드카드 매칭
문자열 조건 연산자는 사전 정의된 형식을 적용하지 않는 패턴 없는 매칭을 수행합니다. ARN 및 날짜 조건 연산자는 조건 키 값에 구조를 적용하는 문자열 연산자의 하위 집합입니다. ARN 또는 날짜의 부분 문자열 매칭에 StringLike 또는 StringNotLike 연산자를 사용하면, 매칭 시에 구조의 어느 부분이 와일드카드인지는 무시됩니다.
예를 들어 다음 조건은 여러 조건 연산자를 사용하여 ARN의 부분 매칭을 검색합니다.
ArnLike를 사용하는 경우 ARN의 파티션, 서비스, 계정 ID, 리소스 유형 및 리소스 ID 부분이 요청 컨텍스트의 ARN과 정확히 일치해야 합니다. 리전 및 리소스 경로만 부분 매칭이 허용됩니다.
"Condition": {"ArnLike": {"aws:SourceArn": "arn:aws:cloudtrail:*:111122223333:trail/*"}}
ArnLike 대신 StringLike를 사용하는 경우 매칭에서는 ARN 구조를 무시하고 와일드카드가 적용된 부분에 관계없이 부분 일치를 허용합니다.
"Condition": {"StringLike": {"aws:SourceArn": "arn:aws:cloudtrail:*:111122223333:trail/*"}}
ARN | ArnLike | StringLike |
---|---|---|
arn:aws:cloudtrail:us-west-2:111122223333:trail/finance |
Match |
Match |
arn:aws:cloudtrail:us-east-2:111122223333:trail/finance/archive |
Match |
Match |
arn:aws:cloudtrail:us-east-2:444455556666:user/111122223333:trail/finance |
일치하는 항목 없음 |
Match |
숫자 조건 연산자
숫자 조건 연산자를 사용하여 키와 정수 또는 십진수 값을 비교한 결과에 따라 액세스를 제한하는 Condition
요소를 생성할 수 있습니다.
조건 연산자 | 설명 |
---|---|
|
일치 |
|
불일치 |
|
"미만" 일치 |
|
"이하" 일치 |
|
"초과" 일치 |
|
"이상" 일치 |
예를 들어, 다음 문에는 NumericLessThanEquals
조건 연산자에 s3:max-keys
키를 사용하여 요청자가 amzn-s3-demo-bucket
에서 한 번에 최대 10개까지 객체를 나열할 수 있다고 지정하는 Condition
요소가 포함되어 있습니다.
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket", "Condition": {"NumericLessThanEquals": {"s3:max-keys": "10"}} } }
정책 조건에서 지정한 키가 요청 컨텍스트에 없으면 값이 일치하지 않습니다. 이 예제에서는ListBucket
작업을 수행할 때 요청에 s3:max-keys
키가 항상 존재합니다. 이 정책에서 모든 Amazon S3 작업을 허용한 경우에는 값이 10 이하인 max-keys
컨텍스트 키를 포함하는 작업만 허용됩니다.
정책 변수를 Numeric
조건 연산자와 함께 사용할 수 없습니다.
날짜 조건 연산자
날짜 조건 연산자를 사용하여 키와 날짜/시간 값을 비교한 결과에 따라 액세스를 제한하는 Condition
요소를 생성할 수 있습니다. 이러한 조건 연산자는 aws:CurrentTime
키 또는 aws:EpochTime
키와 함께 사용합니다. 날짜/시간 값은 ISO 8601 날짜 형식의 W3C 구현 값
참고
날짜 조건 연산자에는 와일드카드를 사용할 수 없습니다.
조건 연산자 | 설명 |
---|---|
|
특정 날짜 일치 |
|
불일치 |
|
특정 날짜/시간 이전에 일치 |
|
특정 날짜/시간 또는 이전에 일치 |
|
특정 날짜/시간 이후에 일치 |
|
특정 날짜/시간 또는 이후에 일치 |
예를 들어, 다음 문에는 aws:TokenIssueTime
키와 함께 DateGreaterThan
조건 연산자를 사용하는 Condition
요소가 포함되어 있습니다. 이 조건은 요청을 생성하는 데 사용된 임시 보안 자격 증명이 2020년에 발급되었음을 지정합니다. 계정 멤버가 새로운 자격 증명을 사용하도록 매일 프로그래밍 방식으로 이 정책을 업데이트할 수 있습니다.
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "iam:*AccessKey*", "Resource": "arn:aws:iam::
account-id
:user/*", "Condition": {"DateGreaterThan": {"aws:TokenIssueTime": "2020-01-01T00:00:01Z"}} } }
정책 조건에서 지정한 키가 요청 컨텍스트에 없으면 값이 일치하지 않습니다. aws:TokenIssueTime
키는 사용자가 임시 자격 증명을 사용하여 요청을 생성하는 경우에만 요청 컨텍스트에 존재합니다. 액세스 키를 사용하는 AWS CLI, AWS API 또는 AWS SDK 요청에는 이 키가 존재하지 않습니다. 이 예제에서 IAM 사용자가 액세스 키를 보거나 편집하려고 하면 요청이 거부됩니다.
정책 변수를 Date
조건 연산자와 함께 사용할 수 없습니다.
불린 조건 연산자
부울 조건을 사용하여 키를 "true" 또는 "false"와 비교하고 그에 따라 액세스를 제한하는 Condition
요소를 생성할 수 있습니다.
조건 연산자 | 설명 |
---|---|
|
부울 일치 |
예를 들어 이 아이덴티티 기반 정책은 aws:SecureTransport
키와 함께 Bool
조건 연산자를 사용하여 요청이 SSL을 통해 전달되지 않는 경우 대상 버킷 및 해당 콘텐츠로의 객체 및 객체 태그 복제를 거부합니다.
중요
이 정책은 어떤 작업도 허용하지 않습니다. 이 정책을 특정 작업을 허용하는 다른 정책과 함께 사용합니다.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "BooleanExample", "Action": "s3:ReplicateObject", "Effect": "Deny", "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket", "arn:aws:s3:::amzn-s3-demo-bucket/*" ], "Condition": { "Bool": { "aws:SecureTransport": "false" } } } ] }
정책 조건에서 지정한 키가 요청 컨텍스트에 없으면 값이 일치하지 않습니다. aws:SecureTransport
요청 컨텍스트는 true 또는 false를 반환합니다.
정책 변수를 Boolean
조건 연산자와 함께 사용할 수 있습니다.
이진 조건 연산자
BinaryEquals
조건 연산자를 사용하면 이진 형식의 키 값을 테스트하는 Condition
요소를 생성할 수 있습니다. 지정한 키 값을 정책 내 이진 값의 base-64
"Condition" : { "BinaryEquals": { "
key
" : "QmluYXJ5VmFsdWVJbkJhc2U2NA==" } }
정책 조건에서 지정한 키가 요청 컨텍스트에 없으면 값이 일치하지 않습니다.
정책 변수를 Binary
조건 연산자와 함께 사용할 수 없습니다.
IP 주소 조건 연산자
IP 주소 조건 연산자를 사용하여 IPv4/IPv6 주소 또는 IP 주소 범위와 키를 비교한 결과에 따라 액세스를 제한하는 Condition
요소를 생성할 수 있습니다. 이 조건에는 aws:SourceIp
키가 사용됩니다. 값은 표준 CIDR 형식(예: 203.0.113.0/24 또는 2001:DB8:1234:5678::/64)을 따라야 합니다. 연결된 라우팅 접두사 없이 IP 주소를 지정하면 IAM은 기본 접두사 값 /32
를 사용합니다.
일부 AWS 서비스는 0의 범위를 나타내기 위해 ::을 사용해 IPv6를 지원합니다. 서비스가 IPv6를 지원하는지 여부를 확인하려면 서비스 설명서를 참조하세요.
조건 연산자 | 설명 |
---|---|
|
지정된 IP 주소 또는 범위 |
|
지정된 IP 주소 또는 범위를 제외한 모든 IP 주소 |
예를 들어, 다음 문은 IpAddress
조건 연산자에 aws:SourceIp
키를 사용하여 IP 범위 203.0.113.0 - 203.0.113.255에서 요청이 전송되어야 한다고 지정하고 있습니다.
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "iam:*AccessKey*", "Resource": "arn:aws:iam::
account-id
:user/*", "Condition": {"IpAddress": {"aws:SourceIp": "203.0.113.0/24"}} } }
aws:SourceIp
조건 키는 요청이 전송되는 IP 주소를 확인합니다. 요청이 Amazon EC2 인스턴스에서 전송된 경우에는 aws:SourceIp
가 인스턴스의 퍼블릭 IP 주소로 계산되어야 합니다.
정책 조건에서 지정한 키가 요청 컨텍스트에 없으면 값이 일치하지 않습니다. aws:SourceIp
키는 요청자가 VPC 엔드포인트를 사용하여 요청을 생성한 경우를 제외하고 요청 컨텍스트에 항상 존재합니다. 이 경우 조건이 false
를 반환하고 요청이 이 문에 의해 묵시적으로 거부됩니다.
정책 변수를 IpAddress
조건 연산자와 함께 사용할 수 없습니다.
다음 예제에서는 IPv4와 IPv6 주소를 혼합하여 조직의 유효 IP 주소를 모두 표현하는 방법을 보여줍니다. IPv6으로 전환하는 동안 조직의 정책이 계속 적용되도록 하려면 기존의 IPv4 주소 범위에 IPv6 범위를 더하여 정책을 업그레이드하는 것이 좋습니다.
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "
someservice
:*", "Resource": "*", "Condition": { "IpAddress": { "aws:SourceIp": [ "203.0.113.0/24", "2001:DB8:1234:5678::/64" ] } } } }
사용자 자격으로 직접 테스트한 API를 호출하는 경우 aws:SourceIp
조건 키는 JSON 정책에서만 작동합니다. 서비스를 사용하여 사용자를 대신해 대상 서비스를 호출하는 경우, 대상 서비스는 원래 사용자의 IP 주소 대신 호출 서비스의 IP 주소를 봅니다. 이러한 상황은 예를 들어 AWS CloudFormation을 사용하여 인스턴스를 생성하는 Amazon EC2를 호출하는 경우에 발생할 수 있습니다. 현재로서는 JSON 정책에 따라 평가하기 위해 원본 IP 주소를 호출 서비스를 통해 대상 서비스로 보낼 방법이 없습니다. 이러한 서비스 API 호출 유형의 경우 aws:SourceIp
조건 키를 사용하지 마십시오.
Amazon 리소스 이름(ARN) 조건 연산자
Amazon 리소스 이름(ARN) 조건 연산자를 사용하면 키와 ARN을 비교한 결과에 따라 액세스를 제한하는 Condition
요소를 생성할 수 있습니다. ARN은 문자열로 알려져 있습니다.
조건 연산자 | 설명 |
---|---|
|
ARN 대소문자 구분 일치. ARN에서 콜론으로 구분된 구성요소 6개는 각각 별도로 확인하며, 다중 문자 일치 와일드카드(*) 또는 단일 문자 일치 와일드카드(?)가 추가될 수 있습니다. |
|
ARN 불일치. |
정책 변수를 ARN
조건 연산자와 함께 사용할 수 있습니다.
다음의 리소스 기반 정책 예는 SNS 메시지를 전송하고 싶은 Amazon SQS 대기열에 연결된 정책을 보여줍니다. 이 예제에서는 선택한 대기열로 메시지를 전송할 수 있는 권한을 Amazon SNS에 부여하고 있습니다. 단, 서비스에서 특정 Amazon SNS 주제와 관련하여 메시지를 전송하는 경우로 제한됩니다. 대기열을 Resource
필드에, 그리고 Amazon SNS 주제는 SourceArn
키 값으로 지정합니다.
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": {"AWS": "
123456789012
"}, "Action": "SQS:SendMessage", "Resource": "arn:aws:sqs:REGION
:123456789012
:QUEUE-ID
", "Condition": {"ArnEquals": {"aws:SourceArn": "arn:aws:sns:REGION
:123456789012
:TOPIC-ID
"}} } }
정책 조건에서 지정한 키가 요청 컨텍스트에 없으면 값이 일치하지 않습니다. aws:SourceArn
키는 리소스가 리소스 소유자를 대신하여 다른 서비스를 호출하도록 서비스를 트리거하는 경우에만 요청 컨텍스트에 존재합니다. IAM 사용자가 이 작업을 직접 수행하려고 하면 조건이 false
을 반환하고 요청이 이 문에 의해 묵시적으로 거부됩니다.
…IfExists 조건 연산자
Null
조건을 제외하고 조건 연산자 이름 끝에 IfExists
를 추가할 수 있습니다(예: StringLikeIfExists
). 이렇게 하면 "요청 컨텍스트에 조건 키가 있으면 정책에 지정된 대로 키를 처리합니다. 키가 없으면 조건 요소를 true로 평가합니다." 문의 다른 조건 요소는 여전히 불일치한 결과를 발생시킬 수 있지만 ...IfExists
로 확인하면 누락되는 키는 없습니다. StringNotEqualsIfExists
와 같은 부정 조건 연산자와 함께 "Effect":
"Deny"
요소를 사용하는 경우 조건 키가 제공되지 않아도 요청이 계속 거부됩니다.
IfExists
사용 예제
대부분 조건 키는 특정 형식의 리소스 정보를 의미하기 때문에 해당 형식의 리소스에 액세스할 때만 존재합니다. 이러한 조건 키는 다른 형식의 리소스에는 표시되지 않습니다. 그렇다고 정책 문이 한 가지 형식의 리소스에만 적용된다고 해서 문제가 되지는 않습니다. 하지만 정책 문이 여러 서비스의 작업을 참조하는 경우나, 혹은 한 가지 서비스 내에서 임의의 작업이 동일한 서비스에서 여러 가지 다른 리소스 형식에 액세스하는 경우처럼 단일 문이 여러 유형의 리소스에 적용될 수 있는 경우도 있습니다. 이런 경우 오직 한 가지 리소스에만 적용되는 조건 키를 정책 문에 추가하면 정책 문의 Condition
요소를 충족하지 못하고 결국 "Effect"
가 적용되지 않습니다.
예를 들어 다음과 같은 정책 예제를 살펴보십시오.
{
"Version": "2012-10-17",
"Statement": {
"Sid": "THISPOLICYDOESNOTWORK
",
"Effect": "Allow",
"Action": "ec2:RunInstances",
"Resource": "*",
"Condition": {"StringLike": {"ec2:InstanceType": [
"t1.*",
"t2.*",
"m3.*"
]}}
}
}
위 정책의 의도는 사용자가 t1
, t2
또는 m3
형식의 인스턴스를 모두 실행할 수 있도록 하는 것이 목적입니다. 하지만 인스턴스를 실행하려면 인스턴스 외에도 이미지, 키 페어, 보안 그룹 등 다양한 리소스에 액세스해야 합니다. 전체 문은 인스턴스를 실행하는 데 필요한 모든 리소스와 비교하여 평가됩니다. 하지만 이러한 추가 리소스에는 ec2:InstanceType
조건 키가 없기 때문에 StringLike
검사는 fail로 끝나고 사용자에게 권한이 부여되지 않아 어떤 인스턴스 유형도 실행하지 못합니다.
이 문제를 해결하려면 그 대신 StringLikeIfExists
조건 연산자를 사용해야 합니다. 이렇게 하면 조건 키가 존재하는 경우에만 테스트가 실행됩니다. 그 결과 다음 정책은 이렇게 해석할 수 있습니다. “검사 대상 리소스에 'ec2:InstanceType
' 조건 키가 있으면 키 값이 t1.
, t2.
또는 m3.
로 시작할 때에만 작업을 허용합니다. 검사 대상 리소스에 조건 키가 없으면 그냥 둡니다." 조건 키 값에 별표(*)를 StringLikeIfExists
조건 연산자와 함께 사용하면 와일드카드로 해석되어 문자열이 부분적으로 일치합니다. DescribeActions
문에는 콘솔에서 해당 인스턴스를 보는 데 필요한 작업이 포함되어 있습니다.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "RunInstance", "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "*", "Condition": { "StringLikeIfExists": { "ec2:InstanceType": [ "t1.*", "t2.*", "m3.*" ]}} }, { "Sid": "DescribeActions", "Effect": "Allow", "Action": [ "ec2:DescribeImages", "ec2:DescribeInstances", "ec2:DescribeVpcs", "ec2:DescribeKeyPairs", "ec2:DescribeSubnets", "ec2:DescribeSecurityGroups" ], "Resource": "*" }] }
조건 키의 존재를 확인하는 조건 연산자
Null
조건 연산자를 사용하여 권한을 부여하는 시점에 조건 키가 없는지 확인합니다. 정책 문에서는 true
(키가 부재하며 값이 null임) 또는 false
(키가 존재하며 값이 null이 아님)를 사용합니다.
정책 변수를 Null
조건 연산자와 함께 사용할 수 없습니다.
예를 들어, 이 조건 연산자를 사용하여 작업 시 사용자가 자신의 자격 증명을 사용하는지, 혹은 임시 자격 증명을 사용하는지 알 수 있습니다. 사용자가 임시 자격 증명을 사용하는 경우에는 aws:TokenIssueTime
키가 존재하며, 값을 갖고 있습니다. 다음은 Amazon EC2 API 사용자의 경우 임시 자격 증명의 사용이 제한된다는 것(키가 존재해서는 안 됨)을 명시하는 조건을 나타낸 예제입니다.
{ "Version": "2012-10-17", "Statement":{ "Action":"ec2:*", "Effect":"Allow", "Resource":"*", "Condition":{"Null":{"aws:TokenIssueTime":"true"}} } }