IAM 사용자 또는 역할을 DynamoDB 테이블의 특정 속성으로 제한하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 9월 3일

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의 경우, ReturnValuesNONE(기본값) 또는 UPDATED_OLD로 설정된 요청만 허용합니다(UpdateItem 작업 전에 나타난 대로 업데이트된 속성을 반환합니다).
  • dynamodb:ReturnConsumedCapacity: ReturnConsumedCapacityNONE으로 설정된 요청이나 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"

조건 키를 사용하여 액세스를 제한하는 방법에 대한 또 다른 예는 권한 사용 사례를 참조하십시오.


이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요합니까?