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 |
테이블의 첫 번째 키 속성, 즉 파티션 키를 나타냅니다. 키 이름 |
dynamodb:Select |
|
dynamodb:Attributes |
요청 내 속성 이름 목록이나 요청에서 반환된 속성 목록을 나타냅니다.
|
dynamodb:ReturnValues |
요청의
|
dynamodb:ReturnConsumedCapacity |
요청의
|
사용자 액세스 제한
여러 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
)이 있으므로StringEqualsIfExists
를StringEquals
로 변경할 수도 있습니다. -
쓰기 작업만 허용하려면 허용된 작업 목록에서
UpdateItem
을 제외한 모든 작업을 제거하면 됩니다.UpdateItem
에서는Select
파라미터를 사용하지 않으므로 조건에서Select
를 제거할 수 있습니다. 또한ReturnValues
파라미터에는 항상 값(별도로 지정하지 않는 경우NONE
)이 있으므로StringEqualsIfExists
를StringEquals
로 변경해야 합니다. -
이름이 패턴과 일치하는 모든 속성을 허용하려면
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
를 포함하지 않습니다. -
PutItem
및DeleteItem
작업은 전체 항목을 대체하므로 애플리케이션이 어떤 속성도 수정할 수 있습니다. 그러므로 애플리케이션을 특정 속성만 업데이트하도록 허용할 경우 이러한 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
로 설정해야 하며, 허용 목록의 속성만 요청할 수 있습니다. 쓰기 요청의 경우, 애플리케이션은ReturnValues
를ALL_OLD
또는ALL_NEW
로 설정할 수 없으며 다른 속성에 근거하여 조건부 쓰기 작업을 수행할 수 없습니다.