Comment résoudre l'erreur AccessDeniedException lorsque j'essaie d'accéder à une table Amazon DynamoDB ?

Lecture de 7 minute(s)
0

J'essaie d'accéder à une table Amazon DynamoDB et j'obtiens l'erreur AccessDeniedException.

Brève description

Cette erreur peut survenir pour les raisons suivantes :

  • Le rôle AWS Identity et Access Management (IAM) que vous avez utilisé pour accéder à la table DynamoDB ne dispose pas des autorisations requises.
  • L'accès à la table DynamoDB est restreint au niveau de l'organisation.
  • La stratégie associée au point de terminaison Amazon Virtual Private Cloud (Amazon VPC) pour DynamoDB restreint l'opération.
  • Vous avez activé l'authentification multifactorielle (MFA) et avez essayé d'accéder à la table sans vous connecter à l'aide de MFA.
  • Vous utilisez une clé gérée par le client ou une clé gérée par AWS pour protéger vos tables DynamoDB.

Solution

Le rôle IAM ne dispose pas des autorisations requises

DynamoDB ne prend pas en charge les stratégies basées sur les ressources. Lorsque vous créez une table DynamoDB, veillez à accorder les autorisations requises au rôle IAM que vous utilisez pour accéder à la table. Vous pouvez associer les stratégies aux utilisateurs IAM, groupes ou rôles pour accorder les autorisations requises. Pour plus d'informations, consultez la section Utilisation de stratégies basées sur l'identité (stratégies IAM) avec Amazon DynamoDB.

Vous pouvez utiliser un script Interface de la ligne de commande AWS (AWS CLI) pour résoudre les échecs d'appel d'API d'autorisation IAM.

Remarque : ce script d’interface de ligne de commande AWS nécessite le processeur JSON de ligne de commande jq. Pour obtenir le didacticiel et télécharger les instructions de, consultez Format de sortie JSON. Pour les distributions qui utilisent le package yum, exécutez la commande suivante :

$ sudo yum install jq

Exécutez la commande de CLI AWS suivante :

( echo "Time,Identity ARN,Event ID,Service,Action,Error,Message";
>   aws cloudtrail lookup-events --start-time "2022-08-04T13:23:00Z" --end-time "2022-08-04T13:27:00Z" --query "Events[*].CloudTrailEvent" --output text \
>     | jq -r ". | select(.userIdentity.arn == \"your-ARN\" and .eventType == \"AwsApiCall\" and .errorCode != null
>     and (.errorCode | ascii_downcase | (contains(\"accessdenied\") or contains(\"unauthorized\"))))
>     | [.eventTime, .userIdentity.arn, .eventID, .eventSource, .eventName, .errorCode, .errorMessage] | @csv"
> ) | column -t -s'",'

Remarque : veillez à remplacer votre ARN par l'ARN IAM pour vos ressources.

Le résultat de cette commande est similaire à ce qui suit :

Time                 Identity ARN                           Event ID                             Service                Action     Error Message 
2022-08-04T13:24:14Z arn:aws:iam::111122223333:user/article 42f420fe-ef06-43be-98a6-d5a0a90d7b4c dynamodb.amazonaws.com ListTables AccessDenied User: arn:aws:iam::111122223333:user/article is not authorized to perform: dynamodb:ListTables on resource: arn:aws:dynamodb:us-east-1:111122223333:table/* with an explicit deny in an identity-based policy
2022-08-04T13:51:22Z arn:aws:iam::111122223333:user/article b174e4e1-94a7-403e-a15f-1234aec796a6 dynamodb.amazonaws.com ListTables AccessDenied User: arn:aws:iam::111122223333:user/article is not authorized to perform: dynamodb:ListTables on resource: arn:aws:dynamodb:us-east-1:111122223333:table/* because no identity-based policy allows the dynamodb:ListTables action

Le premier message de cet exemple signifie que vous ne pouvez pas effectuer l'action ListTables car vous avez attaché une autorisation à l'utilisateur 111122223333 qui refuse cette opération. Le deuxième message signifie qu'aucune stratégie basée sur l'identité n'autorise l'action dynamodb:ListTables.

Remarque : si vous recevez des erreurs lors de l'exécution de commandes AWS CLI, vérifiez que vous utilisez la version la plus récente d'AWS CLI.

Suivez les bonnes pratiques suivantes pour vous assurer que votre rôle IAM dispose des autorisations requises pour accéder à la table DynamoDB :

  • Assurez-vous que le rôle IAM n'est inclus dans aucune instruction DENY de la stratégie d'approbation.
  • Assurez-vous que le rôle IAM est inclus dans l'instruction ALLOW de la stratégie d'approbation.
  • Assurez-vous que toutes les conditions IAM spécifiées dans l'instruction ALLOW sont prises en charge par l'action d'API sts:AssumeRole.
  • Si vous essayez d'accéder à la table DynamoDB via l'AWS CLI, assurez-vous d'avoir utilisé l'ID de clé d'accès et la clé d'accès secrète corrects.

Pour plus d'informations, voir Comment puis-je obtenir des données pour aider à résoudre les erreurs d'accès aux autorisations IAM refusées ou non autorisées ?

L'accès à la table DynamoDB est restreint au niveau de l'organisation

Si l'erreur suivante s'affiche lorsque vous essayez d'accéder à la table DynamoDB, l'accès a été refusé en raison d'une stratégie de contrôle des services.

User: arn:aws:iam::11111222333:user/Admin is not authorized to perform: 
dynamodb:ListTables on resource: arn:aws:dynamodb:us-east-1:11111222333:table with an explicit deny in a service control policy

Pour résoudre ce problème, vérifiez la stratégie définie au niveau de l'organisation.

Remarque : si vous refusez les opérations DynamoDB au niveau de l'organisation, aucun des rôles IAM présents dans cette organisation ou ce compte AWS ne peut accéder à DynamoDB malgré les autorisations requises.

La stratégie de point de terminaison d’un VPC Amazon restreint le fonctionnement

Vous pouvez utiliser un Amazon VPC pour améliorer la confidentialité et la sécurité du transfert de données entre la table DynamoDB et votre application. Lorsque vous créez le point de terminaison, vous pouvez choisir de restreindre l'accès à la table pour certains utilisateurs en attachant une stratégie de ressources IAM avec un refus explicite ou implicite au point de terminaison d’un VPC. Si vous avez restreint l'accès à l'utilisateur IAM qui essaie d'accéder à la table, vous obtenez une erreur similaire à la suivante :

An error occurred (AccessDeniedException) when calling the ListTables operation: User: arn:aws:iam::111222333444:user/Admin is not authorized to perform: dynamodb:ListTables on resource: arn:aws:dynamodb:us-east-1:11111222333:table/* with an explicit deny in a VPC endpoint policy

Cette erreur indique qu'il existe une instruction DENY explicite dans la stratégie de point de terminaison d’un VPC qui refuse l'opération ListTables pour l'utilisateur Admin.

Pour afficher la stratégie de point de terminaison d'un VPC, exécutez la commande describe-vpc-endpoints de l'AWS CLI.

-ou-

Procédez comme suit :

  1. Ouvrez la console Amazon VPC.
  2. Dans le panneau de navigation, choisissez Points de terminaison.
  3. Sélectionnez le point de terminaison d’un VPC.
  4. Cliquez sur l'onglet Stratégie pour afficher la stratégie du point de terminaison.

Vous avez essayé d'accéder à la table sans vous connecter à l'aide de MFA

Supposons que vous ayez configuré MFA dans votre compte avec la stratégie basée sur l'identité suivante :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyAllExceptListedIfNoMFA",
      "Effect": "Deny",
      "NotAction": [
        "iam:CreateVirtualMFADevice",
        "iam:EnableMFADevice",
        "iam:GetUser",
        "iam:ListMFADevices",
        "iam:ListVirtualMFADevices",
        "iam:ResyncMFADevice",
        "sts:GetSessionToken"
      ],
      "Resource": "",
      "Condition": {
        "BoolIfExists": {
          "aws:MultiFactorAuthPresent": "false"
        }
      }
    }
  ]
}

Dans ce cas, toutes les actions à l'exception de celles qui sont requises pour s'authentifier à l'aide de MFA sont refusées. Si l'utilisateur IAM n'est pas connecté avec MFA, toutes les actions qui ne figurent pas dans la stratégie ci-dessus sont refusées, y compris les actions DynamoDB.

Votre table DynamoDB utilise la clé gérée par le client ou la clé gérée par AWS

Lorsque vous créez une table DynamoDB avec une clé gérée par le client ou une clé AWS Key Management Service (AWS KMS), les stratégies de cette clé KMS doivent autoriser DynamoDB à utiliser la clé en votre nom.

Assurez-vous que l'utilisateur IAM qui accède à la table dispose des autorisations minimales suivantes sur la clé AWS KMS :

  • DynamoDB utilise la clé AWS KMS pour générer et chiffrer une clé de données unique pour la table, appelée clé de table. Pour générer et chiffrer cette clé, vous devez disposer de l'autorisation kms:GenerateDataKey.
  • La clé de table est utilisée pour sécuriser les clés de chiffrement des données utilisées pour chiffrer les données de la table. Si la clé gérée par le client est modifiée pour une table, DynamoDB produit une nouvelle clé de table. Ensuite, DynamoDB utilise la nouvelle clé de table pour chiffrer à nouveau les clés de chiffrement des données. Pour effectuer cette opération, vous devez disposer de l'autorisation kms:ReEncrypt.
  • DynamoDB utilise l'opération kms:DescribeKey pour déterminer si la clé gérée par le client que vous avez sélectionnée existe dans le compte et la région. Si la clé est supprimée de manière aléatoire, l'appel DescribeKey renvoie une erreur.
  • DynamoDB utilise des autorisations pour définir des autorisations sur une clé gérée par le client. Ces autorisations d'autorisation sont utilisées lorsque DynamoDB effectue des tâches de maintenance du système en arrière-plan et de protection continue des données. Les autorisations d'octroi sont également utilisées pour générer des clés de table. Par conséquent, assurez-vous de disposer de l'autorisation kms:CreateGrant.

Pour plus d'informations, consultez Comment Amazon DynamoDB utilise AWS KMS.


AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 2 ans