J'utilise un point de terminaison de l'API REST S3 comme origine de ma distribution CloudFront. Pourquoi est-ce que je reçois des erreurs 403 Access Denied (Accès refusé) ?

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

J'utilise un compartiment Amazon Simple Storage Service (Amazon S3) comme origine de ma distribution Amazon CloudFront. J'utilise le point de terminaison d'API REST S3 comme nom de domaine d'origine. Pourquoi CloudFront renvoie-t-il des erreurs 403 Access Denied (Accès refusé) depuis Amazon S3 ?

Brève description

Pour résoudre les erreurs Access Denied (Accès refusé), vous devez savoir si le nom de domaine d'origine de votre distribution est un point de terminaison de site Web S3 ou un point de terminaison d'API REST S3. Procédez comme suit pour déterminer le type de point de terminaison :

  1. Ouvrez la console CloudFront.
  2. Sélectionnez votre distribution CloudFront, puis choisissez Paramètres de distribution.
  3. Choisissez l'onglet Origine et groupes d'origines.
  4. Vérifiez le nom de domaine sous Nom et chemin du domaine d'origine. Ensuite, déterminez le type de point de terminaison en fonction du format du nom de domaine.

Les points de terminaison d'API REST ont le format suivant :

AWSDOC-EXAMPLE-BUCKET.s3.amazonaws.com

Les points de terminaison des sites Web statiques ont le format suivant :

AWSDOC-EXAMPLE-BUCKET.s3-website-us-east-1.amazonaws.com

Si votre distribution utilise un point de terminaison de site Web statique S3, consultez J'utilise un point de terminaison de site Web S3 comme origine de ma distribution CloudFront. Pourquoi est-ce que je reçois des erreurs 403 Access Denied (Accès refusé) ?

Si votre distribution utilise un point de terminaison d'API REST, vérifiez que vos configurations respectent les conditions requises suivantes afin d'éviter les erreurs Access Denied (Accès refusé) :

  • Si vous ne configurez pas d'identité d'accès d'origine (OAI), alors les objets doivent être accessibles publiquement ou demandés à l'aide d'AWS Signature Version 4.
  • Les objets dans le compartiment ne peuvent pas être chiffrés à l'aide d'AWS Key Management Service (AWS KMS).
  • La stratégie de compartiment S3 doit autoriser l'accès à s3:GetObject.
  • Si la stratégie de compartiment accorde l'accès, le compte AWS qui possède le compartiment S3 doit également être le propriétaire de l'objet.
  • Les objets demandés doivent exister dans le compartiment S3.
  • Si les clients demandent la racine de votre distribution, alors vous devez définir un objet racine par défaut.
  • Si vous avez configuré une OAI, les OAI doivent être incluses dans la stratégie de compartiment S3.
  • Si vous n'avez pas configuré d'OAI, les paramètres de Block Public Access d'Amazon S3 doivent être désactivés.

Solution

Si vous ne configurez pas d'OAI, les objets doivent être accessibles publiquement ou demandés à l'aide d'AWS Signature Version 4.

Si vous ne configurez pas d'OAI, alors une distribution à l'aide d'un point de terminaison d'API REST prend uniquement en charge les objets publics ou les objets demandés à l'aide de l'authentification AWS Signature Version 4.

Pour déterminer si les objets de votre compartiment S3 sont publiquement accessibles, ouvrez l'adresse URL de l'objet S3 dans un navigateur Web. Vous pouvez également exécuter une commande curl sur l'URL.

L'exemple suivant montre un exemple d'adresse URL d'un objet S3 :

http://AWSDOC-EXAMPLE-BUCKET.s3-website-us-east-1.amazonaws.com/index.html

Si le navigateur Web ou la commande curl renvoie une erreur de type Access denied (Accès refusé), cela signifie que l'objet n'est pas accessible publiquement. Si l'objet n'est pas accessible publiquement, utilisez alors l'une des configurations suivantes :

Les objets dans le compartiment ne peuvent pas être chiffrés par AWS KMS.

Les distributions CloudFront ne prennent pas en charge les objets chiffrés par AWS KMS. Vous devez supprimer le chiffrement KMS des objets S3 que vous souhaitez diffuser à l'aide de la distribution.

Remarque : Au lieu d'utiliser le chiffrement AWS KMS, vous pouvez utiliser AES-256 pour chiffrer vos objets.

Utilisez l'une des méthodes suivantes pour vérifier si un objet dans votre compartiment est chiffré par KMS :

  • Utilisez la console Amazon S3 pour afficher les propriétés de l'objet. Consultez la boîte de dialogue Chiffrement. Si AWS-KMS est sélectionné, cela implique que l'objet est chiffré par KMS.
  • Exécutez la commande head-object à l'aide de l'interface de ligne de commande AWS (CLI AWS). Si la commande renvoie ServerSideEncryption sous la forme aws:kms, cela signifie que l'objet est chiffré par KMS.

Pour modifier les paramètres de chiffrement de l'objet à l'aide de la console Amazon S3, consultez Comment ajouter un chiffrement à un objet S3 ?.

Pour pouvoir modifier les paramètres de chiffrement de l'objet à l'aide de l'interface de ligne de commande AWS (CLI AWS), vous devez d'abord vérifier que le compartiment de l'objet n'a pas de chiffrement par défaut. Si le compartiment ne comporte pas de chiffrement par défaut, exécutez alors la commande d'interface de ligne de commande AWS suivante pour supprimer le chiffrement de l'objet en copiant l'objet sur lui-même.

Avertissement : La copie de l'objet sur lui-même supprime les paramètres pour storage-class et website-redirect-location. Pour conserver ces paramètres dans le nouvel objet, veillez à spécifier explicitement les valeurs storage-class ou website-redirect-location dans la demande de copie.

aws s3 cp s3://AWSDOC-EXAMPLE-BUCKET/index.html s3://AWSDOC-EXAMPLE-BUCKET/index.html

La stratégie de compartiment S3 doit autoriser l'accès à s3:GetObject.

Pour utiliser une distribution avec un point de terminaison d'API REST S3, votre stratégie de compartiment doit autoriser s3:GetObject pour les utilisateurs publics ou l'OAI de CloudFront.

Même si vous avez une instruction d'autorisation explicite pour s3:GetObject dans votre stratégie de compartiment, confirmez qu'il n'y a pas d'instruction de refus explicite conflictuelle. Une instruction de refus explicite prévaut toujours sur une instruction d'autorisation explicite.

Procédez comme suit pour vérifier votre stratégie de compartiment pour s3:GetObject :

1.    Ouvrez votre compartiment S3 à partir de la console Amazon S3.

2.    Sélectionnez l'onglet Autorisations.

3.    Choisissez Bucket Policy (Stratégie de compartiment).

4.    Examinez la stratégie de compartiment pour les déclarations avec « Action » : « s3:GetObject » ou « Action » : « s3:* ».

Dans l'exemple de stratégie suivant, il existe une instruction d'autorisation explicite qui accorde un accès d'OAI CloudFront à s3:GetObject. Il existe également une instruction d'autorisation qui accorde l'accès public à s3:GetObject. Cependant, il existe une instruction de refus explicite pour s3:GetObject qui bloque l'accès, sauf si la demande provient d'un Amazon Virtual Private Cloud (Amazon VPC) spécifique.

{
  "Version": "2008-10-17",
  "Id": "PolicyForCloudFrontPrivateContent",
  "Statement": [{
      "Sid": "Allow-OAI-Access-To-Bucket",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAF5XXXXXXXXX"
      },
      "Action": "s3:GetObject",
      "Resource": [
        "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET/*"
      ]
    },
    {
      "Sid": "Allow-Public-Access-To-Bucket",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": [
        "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET/*"
      ]
    },
    {
      "Sid": "Access-to-specific-VPCE-only",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": [
        "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET/*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:sourceVpce": "vpce-1a2b3c4d"
        }
      }
    }
  ]
}

5.    Modifiez la stratégie de compartiment pour supprimer ou modifier des instructions qui bloquent l'accès d'OAI CloudFront à s3:GetObject.

Remarque : CloudFront met en cache les résultats d'une erreur Access Denied (Accès refusé) pendant cinq minutes maximum. Après avoir supprimé une instruction de refus de la stratégie de compartiment, vous pouvez exécuter une invalidation sur votre distribution pour supprimer l'objet du cache.

Si la stratégie de compartiment accorde l'accès, le compte AWS qui possède le compartiment S3 doit également être le propriétaire de l'objet.

Pour qu'une stratégie de compartiment s'applique à des comptes ou à des services externes (par exemple, l'accès public ou l'OAI), le compte AWS qui possède le compartiment doit également être propriétaire des objets. Les compartiments ou objets appartiennent au compte de l'identité AWS Identity and Access Management (IAM) ayant créé ces compartiments ou objets.

Remarque : l'exigence de propriété de l'objet s'applique à l'accès accordé par une stratégie de compartiment. Elle ne s'applique pas à l'accès accordé par la liste de contrôle d'accès (ACL) de l'objet.

Procédez comme suit pour vérifier que le compartiment et les objets ont le même propriétaire. :

1.    Exécutez cette commande d'interface de ligne de commande (CLI) AWS pour obtenir l'ID canonique S3 du propriétaire de compartiment :

aws s3api list-buckets --query Owner.ID

2.    Exécutez cette commande pour obtenir l'ID canonique S3 du propriétaire de l'objet.

Remarque : cet exemple affiche un seul objet, mais vous pouvez utiliser la commande pour vérifier plusieurs objets.

aws s3api list-objects --bucket AWSDOC-EXAMPLE-BUCKET --prefix index.html

3.    Si les ID canoniques ne correspondent pas, cela signifie que le compartiment et l'objet n'ont pas le même propriétaire.

Remarque : vous pouvez également utiliser la console Amazon S3 pour savoir qui sont les propriétaires du compartiment et de l'objet. Les propriétaires se trouvent dans l'onglet Autorisations du compartiment ou de l'objet.

Procédez comme suit pour remplacer le propriétaire de l'objet par le propriétaire du compartiment :

1.    Depuis le compte AWS du propriétaire de l'objet, exécutez cette commande pour récupérer les autorisations de la liste de contrôle d'accès (ACL) attribuées à l'objet :

aws s3api get-object-acl --bucket AWSDOC-EXAMPLE-BUCKET --key object-name

2.    Si l'objet dispose d'autorisations ACL bucket-owner-full-control, passez à l'étape 3. Si l'objet ne dispose pas d'autorisations ACL bucket-owner-full-control, exécutez cette commande depuis le compte du propriétaire de l'objet :

aws s3api put-object-acl --bucket AWSDOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control

3.    À partir du compte du propriétaire du compartiment, exécutez cette commande pour modifier le propriétaire de l'objet en copiant l'objet sur lui-même :

aws s3 cp s3://AWSDOC-EXAMPLE-BUCKET/index.html s3://AWSDOC-EXAMPLE-BUCKET/index.html

Les objets demandés doivent exister dans le compartiment

Si un utilisateur n'a pas d'autorisations s3:ListBucket, il obtient alors des erreurs Access Denied (Accès refusé) pour les objets manquants au lieu des erreurs 404 Not Found (Introuvable). Exécutez cette commande de CLI AWS head-object pour vérifier si un objet existe dans le compartiment.

Remarque : vérifiez que la demande d'objet envoyée à CloudFront correspond exactement au nom de l'objet S3. Les noms d'objet S3 sont sensibles à la casse. Si la demande n'a pas le bon nom d'objet, Amazon S3 répond comme si l'objet était manquant. Pour identifier l'objet CloudFront à l'origine de la demande depuis Amazon S3, utilisez la journalisation des accès au serveur.

Si l'objet existe dans le compartiment, alors l'erreur Access Denied (Accès refusé) ne masque pas une erreur 404 Not Found (Introuvable). Vérifiez les autres exigences en matière de configuration pour résoudre l'erreur Access Denied (Accès refusé).

Si l'objet ne se trouve pas dans le compartiment, alors l'erreur Access Denied (Accès refusé) masque une erreur 404 Not Found (Introuvable). Résolvez le problème lié à l'objet manquant.

Remarque : nous déconseillons d'autoriser l'accès public s3:ListBucket, car ce n'est pas une bonne pratique en matière de sécurité.

Si les clients demandent la racine de votre distribution, vous devez définir un objet racine par défaut.

Si votre distribution ne dispose pas d'un objet racine par défaut défini, et si un demandeur ne dispose pas d'un accès s3:ListBucket, le demandeur reçoit une erreur Access Denied (Accès refusé). Le demandeur reçoit cette erreur au lieu d'une erreur 404 Not Found (Introuvable) lorsqu'il demande la racine de votre distribution.

Pour définir un objet racine par défaut, consultez la section Spécification d'un objet racine par défaut.

Remarque : Nous déconseillons d'autoriser l'accès public s3:ListBucket, car ce n'est pas une bonne pratique en matière de sécurité.

Si vous avez configuré une OAI, les OAI doivent être incluses dans la stratégie de compartiment S3

Si vous avez ajouté une OAI à votre distribution CloudFront, vous devez également inclure une instruction d'autorisation pour l'OAI dans la stratégie de compartiment S3.

Pour vérifier si votre stratégie de compartiment autorise l'OAI, ouvrez votre compartiment S3 dans la console Amazon S3. Ensuite, sélectionnez l'onglet Autorisations et examinez la stratégie de compartiment. L'exemple suivant est une déclaration d'autorisation d'une OAI :

{
  "Sid": "1",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAF5XXXXXXXXX"
  },
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET/*"
}

Pour mettre à jour votre stratégie de compartiment à l'aide de la console CloudFront, procédez comme suit :

  1. Ouvrez la console CloudFront, puis sélectionnez votre distribution.
  2. Choisissez l'onglet Origine et groupes d'origines.
  3. Sélectionnez l'origine S3, puis choisissez Modifier.
  4. Pour Retreindre l'accès au compartiment, sélectionnez Oui.
  5. Pour Identité Origin Access Identity, sélectionnez l'identité existante ou créez-en une.
  6. Pour Accorder des autorisations de lecture sur le compartiment, sélectionnez Oui, Mettre à jour la politique de compartiment.
  7. Sélectionnez Oui, Modifier.

Si vous n'avez pas configuré d'OAI, les paramètres de Block Public Access d'Amazon S3 doivent être désactivés.

Si la distribution n'utilise pas d'OAI, et si les objets ne sont pas demandés à l'aide d'AWS Signature Version 4, la distribution avec un point de terminaison d'API REST prend uniquement en charge des objets publics. Cela signifie que vous devez confirmer qu'il n'y a pas de paramètres de Block Public Access Amazon S3 appliqués au compartiment. Ces paramètres peuvent remplacer les autorisations qui autorisent l'accès public. Les paramètres Block Public Access peuvent s'appliquer aux compartiments individuels ou aux comptes AWS.