Ma stratégie de compartiment accorde un accès total à un autre compte AWS. Pourquoi les utilisateurs IAM de ce compte continuent-ils à recevoir des erreurs de refus d'accès ?

Dernière mise à jour : 05/11/2020

La stratégie de mon compartiment Amazon Simple Storage Service (Amazon S3) accorde un accès complet à un autre compte AWS. Mais lorsque les utilisateurs AWS Identity and Access Management (IAM) de ce compte tentent d'accéder à mon compartiment, ils obtiennent une erreur Accès refusé. Comment puis-je corriger ce problème ?

Brève description

Si votre stratégie de compartiment accorde déjà l'accès à l'autre compte, les utilisateurs entre-comptes peuvent obtenir des erreurs d'accès refusé pour les raisons suivantes :

  • La stratégie IAM de l'utilisateur n'accorde pas l'accès au compartiment.
  • L'objet est chiffré par AWS Key Management Service (AWS KMS), et l'utilisateur n'a pas accès à la clé KMS.
  • Une instruction de refus dans la stratégie de compartiment ou une stratégie IAM bloque l'accès de l'utilisateur.
  • La stratégie de point de terminaison Amazon Virtual Private Cloud (Amazon VPC) bloque l'accès au compartiment.
  • La stratégie de contrôle de service AWS Organizations bloque l'accès au compartiment.
  • L'objet n'appartient pas au compte AWS qui possède le compartiment.
  • Le paiement par le demandeur est activé sur le compartiment.

Résolution

La stratégie IAM de l'utilisateur n'accorde pas l'accès au compartiment.

Pour l'accès entre comptes, l'accès au compartiment doit être accordé à l’utilisateur dans la stratégie IAM dans le compte A et la stratégie de compartiment dans le compte B.

Suivez les étapes ci-dessous pour vérifier la stratégie IAM de l'utilisateur dans le compte A :

1.    Ouvrez la console IAM.

2.    Dans la console, ouvrez l'utilisateur ou le rôle IAM qui doit accéder au compartiment.

3.    Dans l'onglet Autorisations de l’utilisateur ou du rôle IAM, développez chaque stratégie pour afficher son document de stratégie JSON.

4.    Dans les documents de stratégie JSON, rechercher les stratégies portant le nom du compartiment. Ensuite, vérifiez que ces stratégies autorisent les actions S3 correctes sur le compartiment.

5.    Si l'utilisateur ou le rôle IAM n'accorde pas l'accès au compartiment, ajouter une stratégie qui accorde les autorisations appropriées. Par exemple, la stratégie IAM suivante accorde à un utilisateur l'accès pour télécharger des objets (s3: GetObject) à partir de DOC-EXAMPLE-BUCKET:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ExampleStmt",
      "Action": "s3:GetObject",
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
      ]
    }
  ]
}

L'objet est chiffré par AWS KMS et l'utilisateur n'a pas accès à la clé KMS

Si la stratégie IAM dans le compte A et la stratégie de compartiment dans le compte B accordent un accès entre comptes, vérifiez le compartiment pour le chiffrement par défaut avec AWS KMS. Ou vérifiez les propriétés de l'objet pour le chiffrement AWS KMS. Si un objet est chiffré par une clé AWS KMS, l'utilisateur a également besoin d'autorisations pour utiliser la clé.

Pour accorder à un utilisateur IAM les autorisations de télécharger et de charger dans un compartiment tout en utilisant une clé KMS pour le chiffrement, procédez comme suit :

1.    Modifier la stratégie de clé KMS pour ajouter une instruction similaire à celle-ci :

Remarque : saisissez le nom Amazon Resource Name (ARN) de l'utilisateur en tant que Mandataire.

{
   "Sid": "Allow use of the key",
   "Effect": "Allow",
   "Principal": {
     "AWS": [
       "arn:aws:iam::111122223333:user/Jane",
     ]
   },
   "Action": [
     "kms:Encrypt",
     "kms:Decrypt",
     "kms:ReEncrypt*",
     "kms:GenerateDataKey*",
     "kms:DescribeKey"
   ],
   "Resource": "*"
 }

2.    Si la clé KMS appartient au même compte que l'utilisateur IAM, l'instruction dans la stratégie de clé est suffisante pour permettre à l'utilisateur d'accéder à la clé. Si la clé KMS appartient à un compte différent de celui de l'utilisateur IAM, vous devez également mettre à jour les autorisations de l'utilisateur IAM. Ajoutez une stratégie IAM similaire à celle-ci :

Remarque : saisissez le nom ARN de la clé KMS en tant que ressource.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ExampleStmt3",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:DescribeKey",
                "kms:Encrypt",
                "kms:GenerateDataKey",
                "kms:ReEncrypt*"
            ],
            "Resource": "arn:aws:kms:example-region-1:123456789098:key/a1b2c3d4-e5f6-7890-g1h2-123456789abc"
        }
    ]
}

Une instruction de refus dans la stratégie de compartiment ou une stratégie IAM bloque l'accès utilisateur.

Vérifiez à la fois la stratégie de compartiment et les stratégies IAM de l'utilisateur pour toute instruction refusant explicitement l'accès de l'utilisateur au compartiment.

Procédez comme suit pour vérifier la stratégie de compartiment :

1.    Ouvrez la console Amazon S3.

2.    Dans la liste des compartiments, ouvrez le compartiment avec la stratégie de compartiment à vérifier.

3.    Sélectionnez l'onglet Permissions (Autorisations).

4.    Sélectionnez Bucket policy (Stratégie de compartiment).

5.    Recherchez les instructions avec « Effet » : « Rejeter ».

6.    Modifier la stratégie de compartiment pour modifier ou supprimer les instructions « Effect »: « Deny » qui refusent l'accès de l'utilisateur au compartiment.

Exécutez les étapes suivantes pour vérifier les stratégies IAM de l'utilisateur :

1.    Ouvrez la console IAM.

2.    Dans la console, ouvrez l'utilisateur ou le rôle IAM qui ne peut pas accéder au compartiment.

3.    Dans l'onglet Autorisations de l'utilisateur ou du rôle IAM, développez chaque stratégie pour afficher le document de stratégie JSON.

4.    Dans le document de stratégie JSON, recherchez les stratégies associées au compartiment S3 ayant des instructions qui contiennent « Effet » : « Deny ».

5.    Modifier les stratégies d'autorisations IAM pour modifier ou supprimer les instructions « Effect »: « Deny » qui refusent l'accès de l'utilisateur au compartiment.

La stratégie de point de terminaison de VPC bloque l'accès au compartiment.

Si les utilisateurs accèdent au compartiment avec une instance Amazon Elastic Compute Cloud (Amazon EC2) routée via un point de terminaison d’un VPC, vérifiez la stratégie du point de terminaison. Confirmez que la stratégie de point de terminaison du VPC inclut les autorisations appropriées pour accéder au compartiment S3.

Par exemple, la stratégie de point de terminaison d’un VPC suivante autorise l'accès à DOC-EXAMPLE-BUCKET :

{
  "Id": "Policy1234567890123",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1234567890123",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
      ],
      "Principal": "*"
    }
  ]
}

Avertissement : L'élément « Mandataire » : « * » accorde à tous ceux qui utilisent le point de terminaison d’un VPC l'accès au compartiment. Assurez-vous d'étendre la valeur Mandataire en fonction de votre cas d'utilisation. 

La stratégie de contrôle de service AWS Organizations bloque l'accès au compartiment

Si AWS Organizations est activé sur le compte de l'utilisateur, vérifiez les politiques de contrôle des services pour déterminer si l'accès à Amazon S3 est autorisé. Par exemple, la stratégie suivante refuse explicitement l'accès à Amazon S3 et entraîne une erreur Accès refusé.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "s3:*",
            "Resource": "*"
        }
    ]
}

Pour plus d'informations sur les fonctionnalités d'AWS Organizations, consultez la section Activation de toutes les fonctions dans votre organisation.

L'objet n'appartient pas au compte AWS qui possède le compartiment

Par défaut, un objet S3 appartient au compte AWS qui l'a chargé. C’est le cas même si le compartiment est détenu par un autre compte. Les autorisations du compartiment ne s'appliquent pas automatiquement à un objet lorsque l'objet est détenu par un autre compte. C'est le cas avec les journaux de service envoyés à un compartiment dans un autre compte. Les journaux AWS CloudTrail ou les journaux de flux Amazon Virtual Private Cloud (Amazon VPC) sont des exemples de journaux de service.

Pour résoudre les erreurs d'accès refusé à partir de la propriété d'objet :

1.    Le propriétaire de l'objet doit explicitement accorder au propriétaire du compartiment le contrôle total de l'objet.

2.    Ensuite, pour appliquer le changement de propriété, le propriétaire du compartiment doit copier l'objet sur lui-même. Pour ce faire, le propriétaire du compartiment peut exécuter la commande cp à l'aide de l'interface de ligne de commande AWS (CLI AWS), semblable à ce qui suit :

aws s3 cp s3://DOC-EXAMPLE-BUCKET/awsexampleobject  s3://DOC-EXAMPLE-BUCKET/awsexampleobject  --metadata-directive REPLACE

Remarque : si vous recevez des erreurs lors de l'exécution des commandes depuis l'interface de ligne de commande AWS (CLI AWS), assurez-vous que vous utilisez la version de cette dernière.

Une fois que le propriétaire du compartiment a copié l'objet sur lui-même, l'objet appartient au compte du propriétaire du compartiment. 

Paiement par le demandeur activé sur le compartiment

Si Paiement par le demandeur est activé sur le compartiment, les utilisateurs d'autres comptes doivent spécifier le paramètre request-payer lorsqu'ils envoient des requêtes au compartiment. Sinon, ces utilisateurs obtiennent une erreur Access Denied (Accès refusé).

Pour les demandes GET, HEAD ou POST, l'utilisateur doit inclure le paramètre x-amz-request-payer dans l'en-tête. Pour les demandes REST, l'utilisateur doit inclure le paramètre x-amz-request-payer dans la demande.

Pour les commandes AWS CLI, l'utilisateur doit inclure le paramètre --request-payer semblable à ce qui suit :

aws s3 cp exampleobject.jpg s3://DOC-EXAMPLE-BUCKET/exampleobject.jpg --request-payer requester