IAM 사용자 또는 역할을 DynamoDB 테이블의 특정 속성으로 제한하려면 어떻게 해야 합니까?
최종 업데이트 날짜: 2022년 5월 23일
AWS Identity and Access Management(IAM) 사용자 또는 역할이 Amazon DynamoDB 테이블의 특정 속성에만 액세스할 수 있도록 하고 싶습니다.
간략한 설명
세분화된 액세스 제어(FGAC)에 IAM 정책 조건을 사용합니다. FGAC를 사용하면 DynamoDB 테이블의 읽기 및 쓰기 작업 모두에 대해 개별 항목 또는 항목 속성에 대한 액세스를 제어할 수 있습니다.
해결방법
미리 정의된 AWS‐wide 키 및 DynamoDB별 키를 사용하여 액세스 정책에 조건을 지정할 수 있습니다. 다음은 DynamoDB 조건 키에 대한 몇 가지 일반적인 사용 사례의 예입니다.
- DynamoDB:LeadingKey: 사용자가 특정 파티션 키 값을 갖는 항목에 액세스할 수 있도록 허용합니다. 사용자가 고유한 사용자 ID(예: ${www.amazon.com:user_id})와 일치하는 파티션 키 값을 갖는 항목에만 액세스할 수 있도록 허용합니다.
- DynamoDB:select: 작업에서 인덱스의 예상 속성을 요청하는 경우에만 인덱스에 대한 쿼리 또는 스캔 작업이 응답을 반환하도록 허용합니다. 실제 항목이 아닌 항목 수를 요청하는 작업만 허용합니다.
- dynamodb:Attributes: 특정 속성을 요청하는 요청만 허용합니다. PutItem의 경우 항목에 기본 키 및 정렬 키 속성 외에 특정 속성이 있는 경우에만 요청을 허용합니다.
- DynamoDB:returnValues: UpdateItem의 경우, ReturnValues가 NONE(기본값) 또는 UPDATED_OLD로 설정된 요청만 허용합니다(UpdateItem 작업 전에 나타난 대로 업데이트된 속성을 반환합니다).
- dynamodb:ReturnConsumedCapacity: ReturnConsumedCapacity가 NONE으로 설정된 요청이나 ReturnConsumedCapacity를 지정하지 않은 요청만 허용합니다.
예: 테이블 항목의 특정 속성에 대한 읽기 전용 액세스 허용
이 예제의 테이블에는 다음과 같은 속성이 있습니다.
- 테이블 이름: GameScores
- 기본 파티션 키: UserId 속성이 있는 문자열
- 기본 정렬 키: GameTitle 속성이 있는 문자열
- 키가 아닌 속성: PersonalDetails, Wins, Losses, TopScore, TopScoreDateTime
타사 애플리케이션이 각 사용자의 TopScore 및 TopScoreDateTime 속성을 읽을 수 있도록 허용해야 한다고 가정합니다. UserID 및 GameTitle은 파티션 및 정렬 키 속성이므로 IAM 정책에서도 이러한 속성을 허용해야 합니다. 예제 정책은 다음 기준을 충족해야 합니다.
- 쿼리 또는 스캔 API 작업: Select 파라미터가 SPECIFIC_ATTRIBUTES로 설정되어 있거나 ProjectionExpression에 UserId, GameTitle, TopScore 또는 TopScoreDateTime이 포함된 경우에만 요청을 허용합니다.
- GetItem, BatchGetItem 및 TransactGetItem API 작업: ProjectionExpression 파라미터에 UserId, GameTitle, TopScore 또는 TopScoreDateTime이 포함된 경우에만 요청을 허용합니다.
참고: 애플리케이션이 이 테이블에 대한 보조 인덱스도 읽는 경우, 정책에서 보조 인덱스에 대한 파티션 및 정렬 키도 허용해야 합니다.
예제 IAM 정책은 dynamodb:Attributes 조건 키를 사용합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "LimitAccessToSpecificAttributes",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:Query",
"dynamodb:BatchGetItem",
"dynamodb:Scan",
"dynamodb:TransactGetItems"
],
"Resource": [
"arn:aws:dynamodb:eu-west-1:123456789012:table/GameScores"
],
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:Attributes": [
"TopScoreDateTime",
"TopScore",
"UserId",
"GameTitle"
]
},
"StringEquals": {
"dynamodb:Select": "SPECIFIC_ATTRIBUTES"
}
}
}
]
}
클라이언트의 요청은 허용된 속성을 지정해야 합니다. 요청이 속성을 지정하지 않으면 DynamoDB는 모든 속성을 반환하려고 시도합니다. IAM 정책은 클라이언트가 모든 속성을 읽을 수 있도록 허용하지 않기 때문에 클라이언트는 AccessDenieException을 가져옵니다.
다음은 Select 또는 ProjectionExpression을 사용하여 허용되는 특성을 지정하지 않음으로 인해 AccessDenieException을 반환하는 쿼리 요청의 예입니다.
$ aws dynamodb query --table-name GameScores --key-condition-expression "UserId = :useridval" --expression-attribute-values '{":useridval":{"S":"stefano_123"}}'
다음은 TopScore, TopScoreDateTime 및 GameTitle 속성을 지정하는 성공적인 쿼리 요청의 예입니다.
$ aws dynamodb query --table-name GameScores --key-condition-expression "UserId = :useridval" --expression-attribute-values '{":useridval":{"S":"stefano_123"}}' --projection-expression "TopScore, TopScoreDateTime, GameTitle"
다음은 성공적인 GetItem 요청의 예입니다.
$ aws dynamodb get-item --table-name GameScores --key '{"UserId":{"S":"stefano_123"},"GameTitle":{"S":"Game Zero"}}' --projection-expression "UserId, GameTitle, TopScore, TopScoreDateTime"
조건 키를 사용하여 액세스를 제한하는 방법에 대한 또 다른 예는 권한 사용 사례를 참조하십시오.