IAM JSON; 정책 요소: 조건 연산자 - AWS Identity and Access Management

IAM JSON; 정책 요소: 조건 연산자

Condition 요소의 조건 연산자를 사용하여 정책의 조건 키 및 값을 요청 컨텍스트의 값과 일치시킵니다. Condition 요소에 대한 자세한 내용은 IAM JSON 정책 요소: Condition을 참조하십시오.

정책에서 사용할 수 있는 조건 연산자는 선택한 조건 키에 따라 다릅니다. 전역 조건 키 또는 서비스별 조건 키를 선택할 수 있습니다. 전역 조건 키에 사용할 수 있는 조건 연산자를 알아보려면 AWS 전역 조건 컨텍스트 키 단원을 참조하십시오. 서비스별 조건 키에 사용할 수 있는 조건 연산자를 알아보려면 AWS 서비스에 사용되는 작업, 리소스 및 조건 키 단원을 참조하고 보려는 서비스를 선택하십시오.

중요

정책 조건에서 지정한 키가 요청 컨텍스트에 없으면 값이 일치하지 않습니다. 이는 ...IfExistsNull check를 제외한 모든 조건 연산자에 적용됩니다. 이 연산자는 키가 요청 컨텍스트에 존재하는지 여부를 테스트합니다.

조건 연산자는 다음 범주로 그룹화할 수 있습니다.

문자열 조건 연산자

문자열 조건 연산자를 사용하여 키와 문자열 값을 비교한 결과에 따라 액세스를 제한하는 Condition 요소를 생성할 수 있습니다.

조건 연산자 설명

StringEquals

정확한 일치, 대소문자 구분

StringNotEquals

불일치

StringEqualsIgnoreCase

정확한 일치, 대소문자 무시

StringNotEqualsIgnoreCase

불일치, 대소문자 무시

StringLike

대소문자 구분 일치. 문자열 어디에서나 다중 문자 매칭 와일드카드(*) 또는 단일 문자 매칭 와일드카드(?)를 값에 포함할 수 있습니다.

참고

키에 다수의 값이 저장되는 경우에는 설정 연산자 - ForAllValues:StringLikeForAnyValue:StringLike를 사용해 StringLike를 한정할 수 있습니다. 자세한 정보는 다수의 키 또는 값을 사용하는 조건 생성 단원을 참조하십시오.

StringNotLike

대소문자 구분 불일치. 문자열 어디에서나 다중 문자 매칭 와일드카드(*) 또는 단일 문자 매칭 와일드카드(?)를 값에 포함할 수 있습니다.

예를 들어, 다음 문에는 StringEquals 조건 연산자를 aws:PrincipalTag 키와 함께 사용하여 요청을 수행하는 보안 주체에게 iamuser-admin 작업 범주에서 태그를 지정하도록 지정하는 Condition 요소가 포함되어 있습니다.

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "iam:*AccessKey*", "Resource": "arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:user/*", "Condition": {"StringEquals": {"aws:PrincipalTag/job-category": "iamuser-admin"}} } }

정책 조건에서 지정한 키가 요청 컨텍스트에 없으면 값이 일치하지 않습니다. 이 예제에서는 보안 주체가 태그가 연결된 IAM 사용자를 사용하는 경우 aws:PrincipalTag/job-category 키가 요청 컨텍스트에 존재합니다. 이는 태그 또는 세션 태그가 연결된 IAM 역할을 사용하는 보안 주체를 위해 포함된 것이기도 합니다. 태그가 없는 사용자가 액세스 키를 보거나 편집하려고 하면 조건이 false을 반환하고 요청이 이 문에 의해 묵시적으로 거부됩니다.

다음은 정책 변수와의 문자열 일치를 수행하는 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:::BUCKET-NAME", "Condition": {"StringLike": {"s3:prefix": [ "", "home/", "home/${aws:username}/" ]}} }, { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::BUCKET-NAME/home/${aws:username}", "arn:aws:s3:::BUCKET-NAME/home/${aws:username}/*" ] } ] }

웹 자격 증명 연동 시 Condition 요소를 사용하여 애플리케이션 ID와 사용자 ID에 따라 리소스 액세스를 제한하는 방법을 나타낸 정책 예는 Amazon S3: Amazon Cognito 사용자가 자신의 버킷에 있는 객체에 액세스할 수 있도록 허용 단원을 참조하십시오.

숫자 조건 연산자

숫자 조건 연산자를 사용하여 키와 정수 또는 십진수 값을 비교한 결과에 따라 액세스를 제한하는 Condition 요소를 생성할 수 있습니다.

조건 연산자 설명

NumericEquals

일치

NumericNotEquals

불일치

NumericLessThan

"미만" 일치

NumericLessThanEquals

"이하" 일치

NumericGreaterThan

"초과" 일치

NumericGreaterThanEquals

"이상" 일치

예를 들어, 다음 문에는 NumericLessThanEquals 조건 연산자에 s3:max-keys 키를 사용하여 요청자가 example_bucket에서 한 번에 최대 10개까지 객체를 나열할 수 있다고 지정하는 Condition 요소가 포함되어 있습니다.

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::example_bucket", "Condition": {"NumericLessThanEquals": {"s3:max-keys": "10"}} } }

정책 조건에서 지정한 키가 요청 컨텍스트에 없으면 값이 일치하지 않습니다. 이 예제에서는ListBucket 작업을 수행할 때 요청에 s3:max-keys 키가 항상 존재합니다. 이 정책에서 모든 Amazon S3 작업을 허용한 경우에는 값이 10 이하인 max-keys 컨텍스트 키를 포함하는 작업만 허용됩니다.

날짜 조건 연산자

날짜 조건 연산자를 사용하여 키와 날짜/시간 값을 비교한 결과에 따라 액세스를 제한하는 Condition 요소를 생성할 수 있습니다. 이러한 조건 연산자는 aws:CurrentTime 키 또는 aws:EpochTime 키와 함께 사용합니다. 날짜/시간 값은 ISO 8601 날짜 형식의 W3C 구현 값 하나로 혹은 epoch(UNIX) 시간 로 지정해야 합니다.

참고

날짜 조건 연산자에는 와일드카드를 사용할 수 없습니다.

조건 연산자 설명

DateEquals

특정 날짜 일치

DateNotEquals

불일치

DateLessThan

특정 날짜/시간 이전에 일치

DateLessThanEquals

특정 날짜/시간 또는 이전에 일치

DateGreaterThan

특정 날짜/시간 이후에 일치

DateGreaterThanEquals

특정 날짜/시간 또는 이후에 일치

예를 들어, 다음 문에는 aws:TokenIssueTime 키와 함께 DateLessThan 조건 연산자를 사용하는 Condition 요소가 포함되어 있습니다. 이 조건은 요청을 생성하는 데 사용된 임시 보안 자격 증명이 2020년에 발급되었음을 지정합니다. 계정 멤버가 새로운 자격 증명을 사용하도록 매일 프로그래밍 방식으로 이 정책을 업데이트할 수 있습니다.

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "iam:*AccessKey*", "Resource": "arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:user/*", "Condition": {"DateGreaterThan": {"aws:TokenIssueTime": "2020-01-01T00:00:01Z"}} } }

정책 조건에서 지정한 키가 요청 컨텍스트에 없으면 값이 일치하지 않습니다. aws:TokenIssueTime 키는 사용자가 임시 자격 증명을 사용하여 요청을 생성하는 경우에만 요청 컨텍스트에 존재합니다. 액세스 키를 사용하는 AWS CLI, AWS API 또는 AWS SDK 요청에는 이 키가 존재하지 않습니다. 이 예제에서 IAM 사용자가 액세스 키를 보거나 편집하려고 하면 요청이 거부됩니다.

부울 조건 연산자

부울 조건을 사용하여 키를 "true" 또는 "false"와 비교하고 그에 따라 액세스를 제한하는 Condition 요소를 생성할 수 있습니다.

조건 연산자 설명

Bool

부울 일치

예를 들어, 다음 문은 Bool 조건 연산자에 aws:SecureTransport 키를 사용하여 요청에 SSL을 사용해야 한다고 지정하고 있습니다.

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "iam:*AccessKey*", "Resource": "arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:user/*", "Condition": {"Bool": {"aws:SecureTransport": "true"}} } }

정책 조건에서 지정한 키가 요청 컨텍스트에 없으면 값이 일치하지 않습니다. aws:SecureTransport 키는 항상 요청 컨텍스트에 존재합니다.

이진 조건 연산자

BinaryEquals 조건 연산자를 사용하면 이진 형식의 키 값을 테스트하는 Condition 요소를 생성할 수 있습니다. 지정한 키 값을 정책 내 이진 값의 base-64 인코딩 표시와 바이트 단위(byte for byte)로 비교합니다.

"Condition" : { "BinaryEquals": { "key" : "QmluYXJ5VmFsdWVJbkJhc2U2NA==" } }

정책 조건에서 지정한 키가 요청 컨텍스트에 없으면 값이 일치하지 않습니다.

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를 지원하는지 여부를 확인하려면 서비스 설명서를 참조하십시오.

조건 연산자 설명

IpAddress

지정된 IP 주소 또는 범위

NotIpAddress

지정된 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-WITHOUT-HYPHENS:user/*", "Condition": {"IpAddress": {"aws:SourceIp": "203.0.113.0/24"}} } }

aws:SourceIp 조건 키는 요청이 전송되는 IP 주소를 확인합니다. 요청이 Amazon EC2 인스턴스에서 전송된 경우에는 aws:SourceIp가 인스턴스의 퍼블릭 IP 주소로 계산되어야 합니다.

정책 조건에서 지정한 키가 요청 컨텍스트에 없으면 값이 일치하지 않습니다. aws:SourceIp 키는 요청자가 VPC 엔드포인트를 사용하여 요청을 생성한 경우를 제외하고 요청 컨텍스트에 항상 존재합니다. 이 경우 조건이 false를 반환하고 요청이 이 문에 의해 묵시적으로 거부됩니다.

다음 예제에서는 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 조건 연산자가 작동하지 않으면 문자열 조건 연산자를 사용해 보십시오.

조건 연산자 설명

ArnEquals, ArnLike

ARN 대소문자 구분 일치. ARN에서 콜론으로 구분된 구성요소 6개는 각각 별도로 확인하며, 다중 문자 매칭 와일드카드(*) 또는 단일 문자 매칭 와일드카드(?)가 추가될 수 있습니다. 이들은 동일하게 동작합니다.

ArnNotEquals, ArnNotLike

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 조건 - 예를 들어 StringLikeIfExists를 제외한 모든 조건 연산자 이름 끝에 IfExists를 추가할 수 있습니다. 이렇게 하면 "요청 콘텍스트에 정책 키가 있으면 정책에 지정된 대로 키를 처리하고, 키가 없으면 조건 요소를 true로 평가합니다." 문의 다른 조건 요소는 여전히 불일치한 결과를 발생시킬 수 있지만 ...IfExists로 확인하면 누락되는 키는 없습니다.

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.*"로 시작할 때에만 작업을 허용한다.' 검사 대상 리소스에 조건 키가 없으면 그냥 둡니다." 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이 아님)를 사용합니다.

예를 들어, 이 조건 연산자를 사용하여 작업 시 사용자가 자신의 자격 증명을 사용하는지, 혹은 임시 자격 증명을 사용하는지 알 수 있습니다. 사용자가 임시 자격 증명을 사용하는 경우에는 aws:TokenIssueTime 키가 존재하며, 값을 갖고 있습니다. 다음은 Amazon EC2 API 사용자의 경우 임시 자격 증명의 사용이 제한된다는 것(키가 존재해서는 안 됨)을 명시하는 조건을 나타낸 예제입니다.

{ "Version": "2012-10-17", "Statement":{ "Action":"ec2:*", "Effect":"Allow", "Resource":"*", "Condition":{"Null":{"aws:TokenIssueTime":"true"}} } }