IAM 정책 조건을 사용하여 세분화된 액세스 제어 구현 - Amazon DynamoDB

IAM 정책 조건을 사용하여 세분화된 액세스 제어 구현

DynamoDB에서 권한을 부여할 때 권한 정책이 적용되는 방식을 결정하는 조건을 지정할 수 있습니다.

개요

DynamoDB에서는 IAM 정책을 사용하여 권한을 부여할 때 조건을 지정하는 옵션이 있습니다(Amazon DynamoDB의 Identity and Access Management 참조). 예를 들어, 다음을 수행할 수 있습니다.

  • 사용자에게 테이블 또는 보조 인덱스의 특정 항목 및 속성에 대한 읽기 전용 액세스를 허용하는 권한을 부여할 수 있습니다.

  • 사용자 ID를 기준으로 테이블의 특정 속성에 대한 쓰기 전용 액세스 권한을 해당 사용자에게 부여할 수 있습니다.

다음 단원의 사용 사례에서 설명되어 있듯이 DynamoDB에서는 조건 키를 사용하여 IAM 정책에서 조건을 지정할 수 있습니다.

참고

일부 AWS 서비스는 태그 기반 조건도 지원하지만 DynamoDB는 그렇지 않습니다.

권한 사용 사례

DynamoDB API 작업에 대한 액세스를 제어할 수 있을 뿐만 아니라, 개별 데이터 항목과 속성에 대한 액세스도 제어할 수 있습니다. 예를 들어 다음을 수행할 수 있습니다.

  • 테이블에 대한 권한을 부여하되, 특정 기본 키 값을 기반으로 해당 테이블에서 특정 항목에 대한 액세스를 제한할 수 있습니다. 다음 그림과 같이, 모든 사용자가 저장한 게임 데이터가 단일 테이블에 저장되지만 어떤 사용자도 자신이 소유하지 않은 데이터 항목에 액세스할 수 없는 소셜 네트워크 게임 앱이 그 예입니다.

    사용자에게 테이블 수준 액세스 권한을 부여하지만, 특정 데이터 항목에 대한 액세스는 제한하는 사용 사례입니다.
  • 속성의 하위 집합만 사용자에게 표시되도록 정보를 숨길 수 있습니다. 사용자 위치에 따라 인근 공항의 항공편 데이터를 표시하는 앱이 그 예입니다. 항공사 이름, 도착 및 출발 시간, 항공편 번호가 모두 표시됩니다. 하지만 다음 그림과 같이, 기장 이름과 승객 수와 같은 속성은 숨겨집니다.

    사용자에게 데이터의 하위 집합만 표시하고 데이터의 특정 속성을 숨기는 사용 사례입니다.

이러한 종류의 세분화된 액세스 제어를 구현하려면 보안 자격 증명에 액세스하기 위한 조건과 관련 권한을 지정하는 IAM 권한 정책을 작성합니다. 그런 다음 IAM 콘솔을 사용하여 만드는 사용자, 그룹 또는 역할에 이 정책을 적용할 수 있습니다. IAM 정책은 테이블의 개별 항목에 대한 액세스 또는 이러한 항목의 속성에 대한 액세스를 제한하거나 이러한 두 가지 액세스를 동시에 제한할 수 있습니다.

또는 웹 자격 증명 연동을 사용하여 Login with Amazon, Facebook 또는 Google에서 인증된 사용자의 액세스를 제어할 수도 있습니다. 자세한 내용은 웹 아이덴티티 페더레이션 사용 단원을 참조하십시오.

IAM Condition 요소를 사용하여 세분화된 액세스 제어 정책을 구현합니다. Condition 요소를 권한 정책에 추가하여 특정 비즈니스 요구 사항에 따라 DynamoDB 테이블 및 인덱스의 항목 및 속성에 대한 액세스를 허용하거나 거부할 수 있습니다.

플레이어가 다양한 게임을 선택하고 플레이할 수 있는 모바일 게임 앱을 예로 들어 보겠습니다. 이 앱은 GameScores라는 DynamoDB 테이블을 사용하여 높은 점수와 기타 사용자 데이터를 추적합니다. 테이블의 각 항목은 사용자 ID와 사용자가 플레이한 게임의 이름에 따라 고유하게 식별됩니다. GameScores 테이블은 파티션 키(UserId)와 정렬 키(GameTitle)로 구성된 기본 키를 갖습니다. 사용자는 자신의 사용자 ID와 연결된 게임 데이터에만 액세스할 수 있습니다. 게임을 플레이하려는 사용자는 보안 정책이 연결된 GameRole이라는 IAM 역할에 속해야 합니다.

이 앱에서 사용자 권한을 관리하기 위해 다음과 같은 권한 정책을 작성할 수 있습니다.

{ "Version":"2012-10-17", "Statement":[ { "Sid":"AllowAccessToOnlyItemsMatchingUserID", "Effect":"Allow", "Action":[ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem" ], "Resource":[ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores" ], "Condition":{ "ForAllValues:StringEquals":{ "dynamodb:LeadingKeys":[ "${www.amazon.com:user_id}" ], "dynamodb:Attributes":[ "UserId", "GameTitle", "Wins", "Losses", "TopScore", "TopScoreDateTime" ] }, "StringEqualsIfExists":{ "dynamodb:Select":"SPECIFIC_ATTRIBUTES" } } } ] }

GameScores 테이블(Resource 요소)에서의 특정 DynamoDB 작업(Action 요소)에 대한 권한을 부여하는 이외에, Condition 요소는 다음의 DynamoDB 고유 조건 키를 사용하여 다음과 같이 권한을 제한합니다.

  • dynamodb:LeadingKeys - 이 조건 키는 사용자가 파티션 키 값이 자신의 사용자 ID와 일치하는 항목만 액세스하도록 허용합니다. 이 ID(${www.amazon.com:user_id})는 치환 변수입니다. 치환 변수에 대한 자세한 내용은 웹 아이덴티티 페더레이션 사용 단원을 참조하세요.

  • dynamodb:Attributes - 이 조건 키는 권한 정책에 나열된 작업만 지정된 속성 값을 반환할 수 있도록 이러한 속성에 대한 액세스를 제한합니다. 또한 StringEqualsIfExists 절을 사용하면 앱에서 작업이 적용될 특정 속성 목록만 제공되고 모든 속성을 요청할 수는 없습니다.

IAM 정책을 평가하면 결과가 항상 true(액세스 허용됨)이거나 false(액세스 거부됨)입니다. Condition 요소 중 한 부분이라도 false이면 전체 정책이 false로 평가되어 액세스가 거부됩니다.

중요

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

IAM 정책 설명서에는 수평 탭(U+0009), 라인 피드(U+000A), 캐리지 리턴(U+000D), 그리고 U+0020 ~ U+00FF 범위의 문자 등 유니코드 문자만 넣을 수 있습니다.

조건 지정: 조건 키 사용

AWS는 액세스 제어를 위해 IAM을 지원하는 모든 AWS 서비스에 대해 사전 정의된 조건 키(AWS 차원의 조건 키) 집합을 제공합니다. 예를 들어 aws:SourceIp 조건 키를 사용하여 요청자의 IP 주소를 확인한 후 작업을 수행하도록 허용할 수 있습니다. AWS 차원 키의 전체 목록은 IAM 사용 설명서의 사용 가능한 조건 키를 참조하세요.

다음 표는 DynamoDB에 적용되는 DynamoDB 서비스별 조건 키를 보여 줍니다.

DynamoDB 조건 키 설명
dynamodb:LeadingKeys

테이블의 첫 번째 키 속성, 즉 파티션 키를 나타냅니다. 키 이름 LeadingKeys는 단일 항목 작업에 사용되는 경우에도 복수형입니다. 또한 조건에서 ForAllValues를 사용할 때 LeadingKeys 변경자를 사용해야 합니다.

dynamodb:Select

Query 또는 Scan 요청의 Select 파라미터를 나타냅니다. Select는 다음 값 중 하나일 수 있습니다.

  • ALL_ATTRIBUTES

  • ALL_PROJECTED_ATTRIBUTES

  • SPECIFIC_ATTRIBUTES

  • COUNT

dynamodb:Attributes

요청 내 속성 이름 목록이나 요청에서 반환된 속성 목록을 나타냅니다. Attributes 값은 다음과 같이 특정 DynamoDB API 작업용 파라미터와 동일한 방식으로 이름이 지정되고 동일한 의미를 갖습니다.

  • AttributesToGet

    사용처: BatchGetItem, GetItem, Query, Scan

  • AttributeUpdates

    사용처: UpdateItem

  • Expected

    사용처: DeleteItem, PutItem, UpdateItem

  • Item

    사용처: PutItem

  • ScanFilter

    사용처: Scan

dynamodb:ReturnValues

요청의 ReturnValues 파라미터를 나타냅니다. ReturnValues는 다음 값 중 하나일 수 있습니다.

  • ALL_OLD

  • UPDATED_OLD

  • ALL_NEW

  • UPDATED_NEW

  • NONE

dynamodb:ReturnConsumedCapacity

요청의 ReturnConsumedCapacity 파라미터를 나타냅니다. ReturnConsumedCapacity는 다음 값 중 하나일 수 있습니다.

  • TOTAL

  • NONE

사용자 액세스 제한

여러 IAM 권한 정책을 사용하면 사용자가 테이블에서 해시 키 값이 사용자 식별자와 일치하는 항목만 액세스할 수 있습니다. 예를 들어 앞서 다룬 게임 앱은 이러한 방식으로 액세스를 제한하므로 사용자가 자신의 사용자 ID와 연결된 게임 데이터에만 액세스할 수 있습니다. IAM 치환 변수인 ${www.amazon.com:user_id}, ${graph.facebook.com:id}${accounts.google.com:sub}에는 Login with Amazon, Facebook 및 Google용 사용자 식별자가 포함되어 있습니다. 애플리케이션이 이러한 ID 공급자 중 하나에 로그인하는 방식에 대해 알아보려면 웹 아이덴티티 페더레이션 사용 단원을 참조하세요.

참고

다음 단원의 각 예제에서는 Effect 절을 Allow로 설정하고 허용할 작업, 리소스 및 파라미터만 지정합니다. 액세스는 IAM 정책에 명시적으로 나열된 항목에만 허용됩니다.

경우에 따라, Effect 절을 Deny로 설정하고 정책의 모든 논리를 반전시켜 거부 기반 정책이 되도록 이러한 정책을 다시 작성할 수도 있습니다. 하지만 허용 기반 정책에 비해 올바르게 작성하기가 어려우므로 DynamoDB에서는 거부 기반 정책을 사용하지 않는 것이 좋습니다. 또한, DynamoDB API에 대한 향후 변경(또는 기존 API 입력에 대한 변경)으로 인해 거부 기반 정책이 무효화될 수도 있습니다.

정책 예: 조건을 사용하여 세부적인 액세스 제어 구현

이 단원에서는 DynamoDB 테이블 및 인덱스에 대한 세분화된 액세스 제어를 구현하기 위한 몇 가지 정책을 보여 줍니다.

참고

모든 예는 us-west-2 리전을 사용하며 가상의 계정 ID를 포함합니다.

아래 동영상에서는 IAM 정책 조건을 사용하는 DynamoDB의 세분화된 액세스 제어를 설명합니다.

1: 특정 파티션 키 값이 있는 항목에 대한 액세스를 제한하는 권한을 부여

다음 권한 정책은 GamesScore 테이블에서 DynamoDB 작업의 집합을 허용하는 권한을 부여합니다. 이 정책은 dynamodb:LeadingKeys 조건 키를 사용하여 사용자 작업을 UserID 파티션 키 값이 이 앱의 Login with Amazon 고유 사용자 ID와 일치하는 항목으로만 제한합니다.

중요

작업 목록에는 Scan 권한이 포함되지 않는데, Scan이 주요 키와 상관없이 모든 항목을 반환하기 때문입니다.

{ "Version":"2012-10-17", "Statement":[ { "Sid":"FullAccessToUserItems", "Effect":"Allow", "Action":[ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem" ], "Resource":[ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores" ], "Condition":{ "ForAllValues:StringEquals":{ "dynamodb:LeadingKeys":[ "${www.amazon.com:user_id}" ] } } } ] }
참고

정책 변수를 사용하는 경우 정책에 명시적으로 버전 2012-10-17을 지정해야 합니다. 액세스 정책 언어의 기본 버전 2008-10-17은 정책 변수를 지원하지 않습니다.

읽기 전용 액세스를 구현하려면 데이터를 수정할 수 있는 작업을 제거할 수 있습니다. 다음 정책에서는 읽기 전용 액세스를 제공하는 작업만 조건에 포함됩니다.

{ "Version":"2012-10-17", "Statement":[ { "Sid":"ReadOnlyAccessToUserItems", "Effect":"Allow", "Action":[ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query" ], "Resource":[ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores" ], "Condition":{ "ForAllValues:StringEquals":{ "dynamodb:LeadingKeys":[ "${www.amazon.com:user_id}" ] } } } ] }
중요

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

2: 테이블의 특정 속성에 대한 액세스를 제한하는 권한을 부여

다음 권한 정책은 dynamodb:Attributes 조건 키를 추가하여 테이블에서 2개의 속성에만 액세스를 허용합니다. 이러한 속성은 조건부 쓰기 또는 스캔 필터에서 읽거나 쓰거나 평가할 수 있습니다.

{ "Version":"2012-10-17", "Statement":[ { "Sid":"LimitAccessToSpecificAttributes", "Effect":"Allow", "Action":[ "dynamodb:UpdateItem", "dynamodb:GetItem", "dynamodb:Query", "dynamodb:BatchGetItem", "dynamodb:Scan" ], "Resource":[ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores" ], "Condition":{ "ForAllValues:StringEquals":{ "dynamodb:Attributes":[ "UserId", "TopScore" ] }, "StringEqualsIfExists":{ "dynamodb:Select":"SPECIFIC_ATTRIBUTES", "dynamodb:ReturnValues":[ "NONE", "UPDATED_OLD", "UPDATED_NEW" ] } } } ] }
참고

이 정책은 이름이 지정된 속성 집합에 대한 액세스를 허용하는 허용 목록 방식을 사용합니다. 또는 이에 상응하는 정책으로 다른 속성에 대한 액세스를 거부하는 정책을 작성할 수 있습니다. 이러한 거부 목록 방식은 사용하지 않는 것이 좋습니다. Wikipedia(http://en.wikipedia.org/wiki/Principle_of_least_privilege)에 설명된 대로 사용자가 최소 권한 원칙에 따라 이러한 거부되는 속성의 이름을 결정하고 허용 목록 방식을 사용하여 거부되는 속성을 지정하는 대신 허용되는 값을 모두 열거할 수 있습니다.

이 정책에서는 PutItem, DeleteItem 또는 BatchWriteItem을 허용하지 않습니다. 이들 작업은 항상 이전 항목 전체를 대체함으로써 사용자가 액세스할 수 없는 속성의 이전 값을 삭제할 수 있게 허용합니다.

이 권한 정책의 StringEqualsIfExists 절은 다음을 보장합니다.

  • 사용자가 Select 파라미터를 지정하는 경우 해당 값은 SPECIFIC_ATTRIBUTES이어야 합니다. 이렇게 하면 API 작업이 인덱스 프로젝션 등의 방법으로 허용되지 않는 속성을 반환할 수 없게 됩니다.

  • 사용자가 ReturnValues 파라미터를 지정하는 경우 해당 값은 NONE, UPDATED_OLD 또는 UPDATED_NEW이어야 합니다. 이는 UpdateItem 작업이 항목을 바꾸기 전에 항목이 존재하는지 여부를 확인하기 위해, 또한 요청한 경우 이전 속성 값을 반환할 수 있도록 암시적인 읽기 작업도 수행하기 때문에 필요합니다. 이 방식으로 ReturnValues를 제한하면 사용자가 허용된 속성만 읽거나 쓸 수 있습니다.

  • StringEqualsIfExists 절은 허용되는 작업의 컨텍스트에서 요청당 이러한 파라미터 중 하나만(Select 또는 ReturnValues) 사용할 수 있도록 합니다.

다음은 이 정책에 대한 몇 가지 변형 형태입니다.

  • 읽기 작업만 허용하려면 허용된 작업 목록에서 UpdateItem을 제거하면 됩니다. 나머지 작업 중 어떤 것도 ReturnValues를 허용하지 않으므로 조건에서 ReturnValues를 제거할 수 있습니다. 또한 Select 파라미터에는 항상 값(별도로 지정하지 않는 경우 ALL_ATTRIBUTES)이 있으므로 StringEqualsIfExistsStringEquals로 변경할 수도 있습니다.

  • 쓰기 작업만 허용하려면 허용된 작업 목록에서 UpdateItem을 제외한 모든 작업을 제거하면 됩니다. UpdateItem에서는 Select 파라미터를 사용하지 않으므로 조건에서 Select를 제거할 수 있습니다. 또한 ReturnValues 파라미터에는 항상 값(별도로 지정하지 않는 경우 NONE)이 있으므로 StringEqualsIfExistsStringEquals로 변경해야 합니다.

  • 이름이 패턴과 일치하는 모든 속성을 허용하려면 StringLike 대신에 StringEquals를 사용하고 다중 문자 패턴 와일드카드(*)를 사용합니다.

3: 특정 속성의 업데이트를 금지하는 권한을 부여

다음 권한 정책은 사용자 액세스를 dynamodb:Attributes 조건 키로 식별되는 특정 속성만 업데이트하도록 제한합니다. StringNotLike 조건은 애플리케이션이 dynamodb:Attributes 조건 키를 사용하여 지정된 속성을 업데이트하는 것을 금지합니다.

{ "Version":"2012-10-17", "Statement":[ { "Sid":"PreventUpdatesOnCertainAttributes", "Effect":"Allow", "Action":[ "dynamodb:UpdateItem" ], "Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/GameScores", "Condition":{ "ForAllValues:StringNotLike":{ "dynamodb:Attributes":[ "FreeGamesAvailable", "BossLevelUnlocked" ] }, "StringEquals":{ "dynamodb:ReturnValues":[ "NONE", "UPDATED_OLD", "UPDATED_NEW" ] } } } ] }

다음을 참조하세요.

  • UpdateItem 작업은 다른 쓰기 작업과 마찬가지로 업데이트 전후의 값을 반환할 수 있도록 항목에 대한 읽기 액세스가 필요합니다. 이 정책에서는 dynamodb:ReturnValues 조건 키를 지정하여 작업이 업데이트를 허용할 속성에만 액세스하도록 제한합니다. 조건 키는 요청에서 ReturnValues를 제한하여 NONE, UPDATED_OLD 또는 UPDATED_NEW만 지정하며 ALL_OLD 또는 ALL_NEW를 포함하지 않습니다.

  • PutItemDeleteItem 작업은 전체 항목을 대체하므로 애플리케이션이 어떤 속성도 수정할 수 있습니다. 그러므로 애플리케이션을 특정 속성만 업데이트하도록 허용할 경우 이러한 API에 대한 권한을 부여하면 안 됩니다.

4: 인덱스에서 프로젝션 속성만 쿼리하는 권한을 부여

다음 권한 정책은 dynamodb:Attributes 조건 키를 사용하여 보조 인덱스(TopScoreDateTimeIndex)에 대한 쿼리를 허용합니다. 또한 이 정책은 인덱스로 프로젝션된 특정 속성만 요청하도록 쿼리를 제한합니다.

또한 이 정책은 애플리케이션이 쿼리에서 속성 목록을 지정하도록 하기 위해 dynamodb:Select 조건 키를 지정하여 DynamoDB Query 작업의 Select 파라미터가 SPECIFIC_ATTRIBUTES가 되도록 요구합니다. 속성의 목록은 dynamodb:Attributes 조건 키를 사용하여 제공되는 특정 목록으로 제한됩니다.

{ "Version":"2012-10-17", "Statement":[ { "Sid":"QueryOnlyProjectedIndexAttributes", "Effect":"Allow", "Action":[ "dynamodb:Query" ], "Resource":[ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex" ], "Condition":{ "ForAllValues:StringEquals":{ "dynamodb:Attributes":[ "TopScoreDateTime", "GameTitle", "Wins", "Losses", "Attempts" ] }, "StringEquals":{ "dynamodb:Select":"SPECIFIC_ATTRIBUTES" } } } ] }

다음 권한 정책은 비슷하지만 쿼리가 인덱스로 프로젝션된 모든 속성을 요청해야 합니다.

{ "Version":"2012-10-17", "Statement":[ { "Sid":"QueryAllIndexAttributes", "Effect":"Allow", "Action":[ "dynamodb:Query" ], "Resource":[ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex" ], "Condition":{ "StringEquals":{ "dynamodb:Select":"ALL_PROJECTED_ATTRIBUTES" } } } ] }

5: 액세스를 특정 속성 및 파티션 키 값으로 제한하는 권한을 부여

다음 권한 정책은 테이블 및 테이블 인덱스(Resource 요소로 지정)에서 특정 DynamoDB 작업(Action 요소로 지정)을 허용합니다. 이 정책은 dynamodb:LeadingKeys 조건 키를 사용하여 파티션 키 값이 사용자의 Facebook ID와 일치하는 항목으로만 권한을 제한합니다.

{ "Version":"2012-10-17", "Statement":[ { "Sid":"LimitAccessToCertainAttributesAndKeyValues", "Effect":"Allow", "Action":[ "dynamodb:UpdateItem", "dynamodb:GetItem", "dynamodb:Query", "dynamodb:BatchGetItem" ], "Resource":[ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores", "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex" ], "Condition":{ "ForAllValues:StringEquals":{ "dynamodb:LeadingKeys":[ "${graph.facebook.com:id}" ], "dynamodb:Attributes":[ "attribute-A", "attribute-B" ] }, "StringEqualsIfExists":{ "dynamodb:Select":"SPECIFIC_ATTRIBUTES", "dynamodb:ReturnValues":[ "NONE", "UPDATED_OLD", "UPDATED_NEW" ] } } } ] }

다음을 참조하세요.

  • 정책(UpdateItem)에서 허용하는 쓰기 작업은 attribute-A 또는 attribute-B만 수정할 수 있습니다.

  • 이 정책은 UpdateItem을 허용하므로 애플리케이션이 새 항목을 삽입할 수 있으며 숨겨진 속성은 새 항목에서 null이 됩니다. 이러한 속성이 TopScoreDateTimeIndex로 프로젝션되면 이 정책은 쿼리로 인한 테이블에서의 가져오기를 방지하는 부가적인 이점도 얻게 됩니다.

  • 애플리케이션은 dynamodb:Attributes에 나열되지 않은 속성은 읽을 수 없습니다. 이 정책을 사용하면 애플리케이션은 읽기 요청에서 Select 파라미터를 SPECIFIC_ATTRIBUTES로 설정해야 하며, 허용 목록의 속성만 요청할 수 있습니다. 쓰기 요청의 경우, 애플리케이션은 ReturnValuesALL_OLD 또는 ALL_NEW로 설정할 수 없으며 다른 속성에 근거하여 조건부 쓰기 작업을 수행할 수 없습니다.

관련 주제