Comment puis-je restreindre un utilisateur ou un rôle IAM à des attributs spécifiques dans une table DynamoDB ?

Date de la dernière mise à jour : 03/09/2020

Comment m'assurer qu'un utilisateur ou un rôle AWS Identity and Access Management (IAM) ne peut accéder qu'à des attributs spécifiques dans une table Amazon DynamoDB ?

Brève description

Utilisez les conditions de stratégie IAM pour le contrôle d'accès précis (FGAC). Le FGAC vous permet de contrôler l'accès à des éléments individuels ou à des attributs d'élément pour les opérations de lecture et d'écriture dans une table DynamoDB.

Solution

Vous pouvez utiliser des clés AWS prédéfinies et des clés spécifiques à DynamoDB pour spécifier des conditions dans une stratégie d'accès. Voici quelques exemples de cas d'utilisation courants pour les clés de condition DynamoDB :

  • dynamodb:LeadingKeys : permettre à un utilisateur d'accéder aux éléments qui ont une valeur de clé de partition spécifique. Autoriser un utilisateur à accéder uniquement aux éléments dont la valeur de clé de partition correspond à un ID utilisateur unique (par exemple, ${www.amazon.com:user_id}).
  • dynamodb:Select: permettre à une opération de requête ou d'analyse sur un index de renvoyer une réponse uniquement si l'opération demande les attributs projetés de l'index. Autoriser uniquement les opérations qui demandent le nombre d'articles plutôt que les articles réels.
  • dynamodb:Attributes : autoriser uniquement les requêtes qui demandent des attributs spécifiques. Pour PutItem, autoriser les requêtes uniquement lorsque l'élément possède des attributs spécifiques en plus des attributs principaux de clé et de clé de tri.
  • dynamodb:ReturnValues : pour UpdateItem, n'autoriser que les requêtes pour lesquelles ReturnValues est défini sur NONE (par défaut) ou UPDATED_OLD (renvoie les attributs mis à jour, tels qu'ils apparaissaient avant l'opération UpdateItem).
  • dynamodb:ReturnConsumedCapacity : autoriser uniquement les requêtes dont la valeur ReturnConsumedCapacity est définie sur NONE ou les requêtes qui ne spécifient pas ReturnConsumedCapacity.

Exemple : autoriser l'accès en lecture seule à certains attributs des éléments d'une table

La table de cet exemple possède les propriétés suivantes :

  • Nom de la table : GameScores
  • Clé de partition principale : chaîne avec un attribut UserId
  • Clé de tri principale : chaîne avec un attribut GameTitle
  • Attributs autres que clé : PersonalDetails, Wins, Losses, TopScore, TopScoreDateTime

Supposons que vous devez autoriser une application tierce à lire les attributs TopScore et TopScoredateTime pour chaque utilisateur. Étant donné que UserID et GameTitle sont les attributs de clé de tri et de partition, vous devez également autoriser ces attributs dans la stratégie IAM. L'exemple de stratégie doit répondre aux critères suivants :

  • Pour les opérations d'API de requête ou d'analyse : n'autoriser les requêtes que lorsque le paramètre Select est défini sur SPECTIN_ATTRIBUTES ou lorsque ProjectionExpression contient UserID, GameTitle, TopScore ou TopScoredateTime.
  • Pour les opérations API GetItem, BatchGetItem et TransactGetItem : n'autorisez les requêtes que lorsque le paramètre ProjectionExpression contient UserID, GameTitle, TopScore ou TopScoredateTime.

Remarque : si l'application lit aussi un index secondaire pour cette table, la stratégie doit également autoriser les clés de partition et de tri pour l'index secondaire.

L'exemple de stratégie IAM utilise la clé de condition 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"
                }
            }
        }
    ]
}

Les demandes du client doivent spécifier les attributs autorisés. Si les requêtes ne spécifient pas d'attributs, DynamoDB essaie de renvoyer tous les attributs. Étant donné que la stratégie IAM ne permet pas au client de lire tous les attributs, le client reçoit une exception AccessDeniedException.

Voici un exemple de requête qui renvoie une exception AccessDeniedException, car celle-ci n'utilise pas Select ou ProjectionExpression pour spécifier des attributs autorisés :

$ aws dynamodb query --table-name GameScores --key-condition-expression "UserId = :useridval" --expression-attribute-values '{":useridval":{"S":"stefano_123"}}'

Voici un exemple de requête réussie qui spécifie les attributs TopScore, TopScoredateTime et GameTitle :

$ aws dynamodb query --table-name GameScores --key-condition-expression "UserId = :useridval" --expression-attribute-values '{":useridval":{"S":"stefano_123"}}' --projection-expression "TopScore, TopScoreDateTime, GameTitle"

Voici un exemple de requête GetItem réussie :

$ aws dynamodb get-item --table-name GameScores --key '{"UserId":{"S":"stefano_123"},"GameTitle":{"S":"Game Zero"}}' --projection-expression "UserId, GameTitle, TopScore, TopScoreDateTime"

Pour un autre exemple d'utilisation des clés de condition pour limiter l'accès, consultez la section Cas d'utilisation des autorisations.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?