다수의 키 또는 값을 사용하는 조건 생성 - AWS Identity and Access Management

다수의 키 또는 값을 사용하는 조건 생성

정책의 Condition 요소를 사용하여 요청에서 다수의 키, 혹은 단일 키에 대한 다수의 값을 테스트할 수 있습니다. 프로그래밍 방식이든, AWS을 사용하든 상관없이 AWS Management Console에게 요청할 경우 요청에 보안 주체, 작업, 태그 등에 대한 정보가 포함됩니다. 요청에 포함되는 정보 및 데이터에 대한 자세한 내용은 Request 단원을 참조하십시오. 조건 키를 사용하여 요청의 일치하는 키의 값을 테스트할 수 있습니다. 예를 들어, 조건 키를 사용하여 DynamoDB 테이블의 특정 속성 또는 태그에 근거한 Amazon EC2 인스턴스에 대한 액세스를 제어할 수 있습니다.

Condition 요소에는 여러 조건을 추가할 수 있으며, 다시 한 번 각 조건마다 다수의 키-값 페어가 포함됩니다. 대부분 조건 키는 다수의 값을 사용할 수 있도록 지원합니다. 다음은 이것을 설명한 그림입니다. 달리 지정하지 않는 경우 모든 키는 다수의 값을 가질 수 있습니다.

다수의 키 또는 값이 포함된 조건의 평가 로직

정책에 다수의 조건 연산자가 있거나, 다수의 키가 단일 조건 연산자에 추가되어 있으면 논리 연산자인 AND를 사용하여 조건을 평가합니다. 단일 조건 연산자에 키 하나마다 여러 값이 포함된 경우에는 논리 연산자 OR를 사용하여 해당 조건 연산자를 평가합니다. 원하는 Allow 또는 Deny 효과를 트리거하려면 모든 조건이 true여야 합니다.


            AND와 OR가 다수의 값에 적용되는 방식을 나타낸 조건 블록
참고

StringNotEqualsDateNotEquals와 같은 부정 일치 조건 연산자에 대한 정책에 여러 값이 나열되면 유효한 권한은 논리적 AND처럼 작동합니다. 예를 들어, StringNotEquals 조건 연산자에 여러 개의 aws:PrincipalAccount 값이 있는 경우, 문자열은 조건을 true로 해결하기 위해 나열된 aws:PrincipalAccount 값과 일치할 수 없습니다.

다수의 키와 값 사용

조건을 여러 키 값이 있는 요청 컨텍스트와 비교하려면 ForAllValues 또는 ForAnyValue 연산자를 설정해야 합니다. 이러한 한정자는 조건 연산자에 설정 작업 기능을 추가하므로 여러 요청 값을 여러 조건 값에 대해 테스트할 수 있습니다. 또한 와일드카드 또는 변수를 사용하여 정책에 다중값 키를 포함하는 경우에도 StringLike 조건 연산자를 사용해야 합니다. 단일 키에 다수의 값이 포함된 요청일 경우에는 예를 들어 ("Key2":["Value2A", "Value2B"]) 같이 조건을 대괄호로 묶어야 합니다.

  • ForAllValues - 요청 세트의 모든 멤버 값이 조건 키 세트의 하위 세트인지 여부를 테스트합니다. 요청의 모든 키 값이 정책에 있는 하나 이상의 값과 일치하면 조건이 true를 반환합니다. 요청에 키가 없거나 키 값이 빈 문자열과 같은 null 데이터 세트로 확인되는 경우에도 true를 반환합니다.

  • ForAnyValue - 요청 값 세트에서 하나 이상의 멤버가 조건 키 값 세트에서 멤버 1개 이상과 일치하는지 테스트합니다. 요청의 키 값 중 하나가 정책의 조건 값 중 하나와 일치하면 조건이 true를 반환합니다. 일치하는 키가 없거나 null 데이터 세트의 경우 조건에서 false를 반환합니다.

숫자 값 foo가 A 또는 B와 일치하고, 다른 숫자 값 bar가 C와 일치하는 경우에 한해 John에게 리소스 사용을 허용한다고 가정하겠습니다. 이 경우 다음 그림과 같이 조건 블록을 생성하게 됩니다.


            조건 NumericEquals 2개가 추가된 조건 블록

이번에는 2019년 1월 1일 이후에 대한 John의 액세스 권한을 제한한다고 가정하겠습니다. 그렇다면 다른 조건으로 2019년 1월 1일에 해당하는 날짜와 함께 DateGreaterThan을 추가해야 합니다. 조건 블록의 모습은 다음 그림과 같습니다.


            DateGreaterThan 조건이 추가된 조건 블록

AWS에는 사전 정의된 조건 연산자 및 키가 있습니다( 등)aws:CurrentTime. 마찬가지로 AWS 서비스 역시 각각 정의되어 있는 키가 따로 있습니다.

예를 들어 다음과 같은 조건에서 사용자 John에게 Amazon SQS 대기열에 대한 액세스를 허용한다고 가정하겠습니다.

  • 시간은 2019년 7월 16일 오후 12:00 이후입니다.

  • 시간은 2019년 7월 16일 오후 3:00 이전입니다.

  • 요청이 전송되는 IP 주소의 범위는 192.0.2.0~192.0.2.255 또는 203.0.113.0~203.0.113.255입니다.

조건 블록에는 서로 다른 세 개의 조건 연산자가 있으며, John이 대기열, 주제 또는 리소스에 액세스하려면 이 세 가지 조건 연산자가 모두 충족되어야 합니다.

다음은 정책의 조건 블록을 나타낸 예제입니다. aws:SourceIp의 값 2개는 OR을 사용하여 평가합니다. 서로 다른 세 개의 조건 연산자는 AND를 사용하여 평가합니다.

"Condition" : { "DateGreaterThan" : { "aws:CurrentTime" : "2019-07-16T12:00:00Z" }, "DateLessThan": { "aws:CurrentTime" : "2019-07-16T15:00:00Z" }, "IpAddress" : { "aws:SourceIp" : ["192.0.2.0/24", "203.0.113.0/24"] } }

다수의 값을 조건 집합 연산자와 함께 사용하는 예제

정책을 만들어 그 정책에 지정된 하나 이상의 값에 대해 요청의 여러 값을 테스트할 수 있습니다. 기술 지원 포럼의 스레드에 대한 정보를 저장하는 데 사용되는 Thread라는 Amazon DynamoDB 테이블이 있다고 가정해 봅시다. 이 테이블에는 ID, UserName, PostDateTime, Message, Tags라는 이름의 속성이 있습니다.

{ ID=101 UserName=Bob PostDateTime=20130930T231548Z Message="A good resource for this question is docs.aws.amazon.com" Tags=["AWS", "Database", "Security"] }

DynamoDB에서 설정된 연산자를 사용하여 개별 데이터 항목 및 속성에 대한 세부적인 액세스를 구현하는 방법은 Amazon DynamoDB 개발자 안내서DynamoDB에 대한 세분화된 액세스 제어를 참조하세요.

PostDateTime, Message, Tags 속성만 볼 수 있도록 허용하는 정책을 만들 수 있습니다. 사용자 요청에 이러한 속성이 하나라도 포함되어 있으면 요청이 허용됩니다. 하지만 요청에 다른 속성(ID 등)이 포함되어 있으면 요청이 거부됩니다. 논리적으로 보았을 때 사용자는 허용되는 속성(PostDateTime, Message, Tags) 목록을 생성하려고 합니다. 또한 사용자가 요청한 모든 속성이 허용되는 속성 목록에 포함되어야 한다고 정책에 명시하려고 합니다.

다음 정책 예제는 ForAllValues 한정자를 StringEquals 조건 연산자와 함께 사용하는 방법을 보여줍니다. 이 조건은 사용자가 Thread라는 이름의 DynamoDB 테이블에서 ID, Message 또는 Tags 속성 요청할 수 있도록 허용합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "dynamodb:GetItem", "Resource": "arn:aws:dynamodb:*:*:table/Thread", "Condition": { "ForAllValues:StringEquals": { "dynamodb:Attributes": [ "ID", "Message", "Tags" ] } } } ] }

사용자가 DynamoDB에게 MessageTags 속성을 Thread 테이블에서 가져오도록 요청한다고 가정하겠습니다. 이러한 경우에는 사용자가 요청하는 속성이 모두 정책에서 지정한 값과 일치하기 때문에 요청이 허용됩니다. GetItem 작업을 하려면 사용자는 ID 속성을 정책에서도 허용되는 데이터베이스 테이블 키로 전달해야 합니다. 하지만 사용자 요청에 UserName 속성이 포함되면 요청이 거부됩니다. UserName은 허용되는 속성 목록에 들어 있지 않고, ForAllValues 한정자는 요청된 모든 값이 정책에 나열되어 있을 것을 요구하기 때문입니다.

중요

dynamodb:Attributes를 사용하는 경우 테이블에 대한 모든 기본 키 및 인덱스 키 속성의 이름을 지정해야 합니다. 또한 정책에 나열되는 보조 인덱스도 지정해야 합니다. 그렇지 않으면, DynamoDB에서 이러한 키 속성을 사용하여 요청된 작업을 수행할 수 없습니다.

또는 사용자가 IDUserName 등 일부 속성을 요청에 포함시키는 것을 명시적으로 금지할 수 있습니다. 예를 들어, 업데이트(PUT 작업)로 인해 특정 속성이 변경되지 않도록 사용자가 DynamoDB 테이블을 업데이트할 때 일부 속성을 제외할 수 있습니다. 이러한 경우에는 금지된 속성(ID, UserName) 목록을 생성합니다. 사용자가 요청한 속성 중 금지된 속성이 있는 경우, 요청이 거부됩니다.

다음 예제에서는 사용자가 ForAnyValue 작업을 수행하려는 경우, ID 한정자를 사용해 PostDateTimePutItem 속성에 대한 액세스를 거부하는 방법을 보여줍니다. 즉 사용자가 Thread 테이블에 있는 이 두 가지 속성 중 어느 하나를 업데이트하려 하는 경우를 말합니다. Effect 요소는 Deny로 설정됩니다.

{ "Version": "2012-10-17", "Statement": { "Effect": "Deny", "Action": "dynamodb:PutItem", "Resource": "arn:aws:dynamodb:*:*:table/Thread", "Condition": { "ForAnyValue:StringEquals": { "dynamodb:Attributes": [ "ID", "PostDateTime" ] } } } }

사용자가 PostDateTime 테이블의 MessageThread 속성의 업데이트를 요청한다고 가정할 경우, ForAnyValue 한정자는 요청된 속성 중 정책 목록에 표시되는 것이 있는지 여부를 결정합니다. 이 경우 하나가 일치하므로(PostDateTime) 조건은 true입니다. 요청의 다른 값(예: 리소스)도 일치한다고 가정하면, 전체 정책 평가는 true를 반환합니다. 정책의 효력이 Deny이므로 요청은 거부됩니다.

한편 사용자가 PutItem 속성만으로 UserName 수행을 요청한다고 가정해 보겠습니다. 요청의 속성(UserName이 유일) 중 어떤 것도 정책에 나열된 속성(ID, PostDateTime)과 일치하지 않습니다. 조건이 false를 반환하므로 정책의 효력(Deny) 또한 false이고, 따라서 이 정책은 요청을 거부하지 않습니다. (요청이 성공하려면 다른 정책에서 이를 명시적으로 허용해야 합니다. 이 요청은 이 정책에 의해 명시적으로 거부되지 않지만, 모든 요청은 묵시적으로 거부됩니다.)

주의

ForAllValues 조건 연산자를 사용하면 요청에 키가 없거나 키 값이 빈 문자열과 같은 null 데이터 세트로 확인되면 true를 반환합니다. 요청에 하나 이상의 값이 포함되도록 하려면 정책에서 다른 조건을 사용해야 합니다. 예제는 AWS 요청 중 액세스 제어 섹션을 참조하세요.

조건 집합 연산자를 사용하는 다수의 값에 대한 평가 로직

이 단원에서는 ForAllValuesForAnyValue 연산자와 함께 사용되는 평가 로직의 세부 사항을 다룹니다. 요청에 포함될 수 있는 키(PostDateTimeUserName)와 PostDateTime, MessageTags 값을 포함하는 정책 조건이 아래 표에 나와 있습니다.

키(요청)

조건 값(정책)

PostDateTime

PostDateTime

UserName

Message

 

Tags

조합에 대한 평가는 다음과 같습니다.

PostDateTime matches PostDateTime?

PostDateTime matches Message?

PostDateTime matches Tags?

UserName matches PostDateTime?

UserName matches Message?

UserName matches Tags?

조건 연산자의 결과는 정책 조건에 사용된 변경자에 따라 달라집니다.

  • ForAllValues. 요청의 모든 키(PostDateTime 또는 UserName)가 최소 한 개의 정책 조건 값(PostDateTime, Message, Tags)과 일치하면, 조건 연산자는 true를 반환합니다. 다시 말해, 조건이 true가 되려면 (PostDateTimePostDateTime, Message 또는 Tags와 일치) 그리고 (UserNamePostDateTime, Message 또는 Tags와 일치) 둘 다 만족해야 합니다.

  • ForAnyValue. 요청 값과 정책 값의 여섯 가지 조합 중 하나에서 true를 반환하면 조건 연산자는 true를 반환합니다.

다음 정책은 ForAllValues 한정자를 포함합니다.

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "dynamodb:GetItem", "Resource": "arn:aws:dynamodb:*:*:table/Thread", "Condition": { "ForAllValues:StringEquals": { "dynamodb:Attributes": [ "PostDateTime", "Message", "Tags" ] } } } }

사용자가 PostDateTimeUserName 속성을 가져오기 위해 DynamoDB에 요청을 한다고 가정하겠습니다. 조합에 대한 평가는 다음과 같습니다.

PostDateTime matches PostDateTime?

True

PostDateTime matches Message?

False

PostDateTime matches Tags?

False

UserName matches PostDateTime?

False

UserName matches Message?

False

UserName matches Tags?

False

이 정책에는 ForAllValues 조건 연산 변경자가 포함되어 있는데, 이는 PostDateTime 일치 항목과 UserName 일치 항목이 최소한 하나는 있어야 한다는 것을 뜻합니다. UserName과 일치하는 항목이 없으므로 조건 연산자는 false를 반환하며, 정책은 요청을 허용하지 않습니다.

다음 정책은 ForAnyValue 한정자를 포함합니다.

{ "Version": "2012-10-17", "Statement": { "Effect": "Deny", "Action": "dynamodb:PutItem", "Resource": "arn:aws:dynamodb:*:*:table/Thread", "Condition": { "ForAnyValue:StringEquals": { "dynamodb:Attributes": [ "ID", "PostDateTime" ] } } } }

이 정책은 "Effect":"Deny"를 포함하며, 작업은 PutItem입니다. 사용자가 PutItem, UserNameMessage 속성을 포함하는 PostDateTime 요청을 한다고 가정하겠습니다. 평가는 다음과 같습니다.

UserName matches ID?

False

UserName matches PostDateTime?

False

Messages matches ID?

False

Message matches PostDateTime?

False

PostDateTime matches ID?

False

PostDateTime matches PostDateTime?

True

ForAnyValue 변경자에 따라, 이러한 테스트 중 하나가 true를 반환하면 조건은 true를 반환합니다. 마지막 테스트가 true를 반환하므로 조건은 true입니다. Effect 요소가 Deny로 설정되어 있으므로 요청은 거부됩니다.

참고

요청의 키 값이 빈 데이터 세트(예: 빈 목록)로 확인되면 ForAllValues에서 수정한 조건 연산자는 true를 반환합니다. ForAnyValue에서 수정한 조건 연산자는 false를 반환합니다.