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é) ?

Date de la dernière mise à jour : 13/05/2022

J'utilise un compartiment Amazon Simple Storage Service (Amazon S3) comme origine de ma distribution Amazon CloudFront. Comment puis-je résoudre les erreurs 403 Access Denied (Accès refusé) ?

Brève description

Pour résoudre les erreurs Accès refusé, vérifiez d'abord 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. Ensuite, si votre distribution utilise un point de terminaison de site Web, consultez les sections de dépannage.

Résolution

Déterminez le type de point de terminaison du nom de domaine d'origine de votre distribution

  1. Ouvrez la console CloudFront.
  2. Choisissez votre distribution CloudFront. Choisissez ensuite Distribution Settings (Paramètres de distribution).
  3. Choisissez l'onglet Origines et groupes d'origines.
  4. Vérifiez le nom de domaine sous Origin Domain Name and Path (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 de l'API REST utilisent le format suivant :

DOC-EXAMPLE-BUCKET.s3.amazonaws.com

Les points de terminaison de site Web utilisent le format suivant :

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

Remarque : selon la Région AWS, le format du point de terminaison peut utiliser le format tiret (s3-website-Region) ou le format point (s3-website.Region). Si votre distribution utilise un point de terminaison de l'API REST, consultez la section 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é) ?

Si votre distribution utilise un point de terminaison de site Web, vérifiez les exigences des sections suivantes pour éviter les erreurs de refus d'accès.

Vérifiez que les objets du compartiment ne sont pas chiffrés par AWS Key Management Service (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. Au lieu d'utiliser le chiffrement AWS KMS, utilisez AES-256 pour chiffrer vos objets.

Déterminez si les objets sont chiffrés par AWS KMS

Pour vérifier si les objets de votre compartiment sont chiffrés par KMS :

Utilisez la console Simple Storage Service (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 signifie que l'objet est chiffré par KMS.

-ou-

Exécutez la commande head-object à l'aide de l'AWS Command Line Interface (AWS CLI). Si la commande renvoie ServerSideEncryption sous la forme aws:kms, cela signifie que l'objet est chiffré par KMS.
Remarque : si vous recevez des erreurs lors de l'exécution de commandes AWS CLI, assurez-vous que vous utilisez la version la plus récente de l'AWS CLI.

Modifier les paramètres de chiffrement d'un objet

Pour modifier les paramètres de chiffrement de l'objet à l'aide de la console Simple Storage Service (Amazon S3), consultez la section Spécification du chiffrement côté serveur avec KMS AWS (SSE-KMS).

Pour modifier les paramètres de chiffrement de l'objet à l'aide de l'AWS CLI, 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 la commande suivante pour supprimer le chiffrement de l'objet en copiant l'objet sur lui-même. Remplacez DOC-EXAMPLE-BUCKET par le nom de votre compartiment :

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

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 ces valeurs dans la demande de copie.

Vérifiez qu'il n'y a pas de « Deny » (« Rejet ») explicite dans la politique de compartiment pour l'action s3:GetObject

Votre politique de compartiment ne doit pas comporter d'instruction de rejet qui bloque l'accès public en lecture à l'action s3:GetObject.

Si vous avez une instruction explicite d'autorisation pour s3:GetObject dans votre politique de compartiment, vérifiez qu'il n'y a pas d'instruction de refus explicite en conflit. Une instruction de refus explicite prévaut toujours sur une instruction d'autorisation explicite.

Pour consulter votre politique de compartiment pour s3:GetObject :

  1. Ouvrez votre compartiment S3 à partir de la console Simple Storage Service (Amazon S3).
  2. Sélectionnez l'onglet Permissions (Autorisations).
  3. Choisissez Bucket Policy (Politique de compartiment).
  4. Examinez la politique de compartiment à la recherche des instructions avec « Action » : « s3:GetObject » ou « Action » : « s3:* ».
  5. Modifiez la politique de compartiment pour supprimer ou modifier les instructions qui bloquent l'accès public en lecture à s3:GetObject.

Par exemple, la politique suivante contient une instruction explicite d'autorisation pour l'accès public à s3:GetObject. Cependant, il contient également une instruction de refus explicite pour l'accès à s3:GetObject, à moins que la demande ne provienne d'un cloud privé virtuel (Amazon VPC) spécifique. Cette politique doit être modifiée pour autoriser l'action s3:GetObject.

{
  "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:::DOC-EXAMPLE-BUCKET/*"
      ]
    },
    {
      "Sid": "Allow-Public-Access-To-Bucket",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
      ]
    },
    {
      "Sid": "Access-to-specific-VPCE-only",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:sourceVpce": "vpce-1a2b3c4d"
        }
      }
    }
  ]
}

Si la politique de compartiment accorde un accès public en lecture, confirmez que le compte AWS qui possède le compartiment possède également l'objet

Pour qu'une politique de compartiment autorise l'accès public en lecture aux objets, le compte AWS possédant le compartiment doit également être le propriétaire des objets. Pour les compartiments Simple Storage Service (Amazon S3) existants avec les paramètres de propriété d'objet par défaut, le propriétaire de l'objet est le compte AWS de l'identité AWS Identity and Access Management (IAM) qui a chargé l'objet dans le compartiment.

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

Vérifiez que le compartiment et les objets ont le même propriétaire

Suivez les étapes suivantes pour vérifier si le compartiment et les objets ont le même propriétaire. Remarque : vous pouvez également utiliser la console Simple Storage Service (Amazon S3) pour identifier les propriétaires du compartiment et de l'objet. Les propriétaires se trouvent dans l'onglet Autorisations du compartiment ou de l'objet concerné.

  1. Exécutez la commande AWS CLI suivante pour obtenir l'ID canonique S3 du propriétaire du compartiment :
aws s3api list-buckets --query Owner.ID
  • Exécutez la commande suivante pour obtenir l'ID canonique S3 du propriétaire de l'objet :
  • aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix index.html
    Cet exemple affiche un seul objet, mais vous pouvez utiliser la commande list pour vérifier plusieurs objets.
  • Si les ID canoniques ne correspondent pas, cela signifie que le compartiment et l'objet n'ont pas le même propriétaire.
  • Mise à jour de la propriété des objets

    Les propriétaires de compartiments peuvent gérer la propriété des objets avec S3 Object Ownership. Tous les nouveaux compartiments S3 ont le paramètre bucket owner enforced (propriétaire du compartiment imposé) activé par défaut. Pour mettre à jour un compartiment existant, consultez la section Définition de la propriété des objets sur un compartiment existant. Lorsque le paramètre bucket owner enforced (propriétaire du compartiment imposé) est activé, les propriétaires du compartiment sont les propriétaires de tous les objets contenus dans le compartiment. En outre, lorsque le paramètre bucket owner enforced (propriétaire du compartiment imposé) est activé, toutes les ACL d'un compartiment et de ses objets sont désactivées.

    Il est de bonnes pratiques que les propriétaires de compartiment utilisent le paramètre bucket owner enforced (propriétaire du compartiment imposé) sur tous les compartiments, et gèrent les autorisations au moyen des politiques IAM et de compartiments.

    Pour supprimer les ACL de votre compartiment et prendre possession de tous les objets qu'il contient, exécutez la commande suivante :

    aws s3api put-bucket-ownership-controls --bucket example-bucket --ownership-controls 'Rules=[{ObjectOwnership=BucketOwnerEnforced}]'
    Si vous ne souhaitez pas désactiver les ACL sur votre compartiment S3, vous pouvez également remplacer le propriétaire de l'objet par le propriétaire du compartiment en procédant comme suit :
    1. Depuis le compte du propriétaire de l'objet, exécutez cette commande pour récupérer les autorisations ACL attribuées à l'objet :
    aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name
  • Si l'objet dispose d'autorisations ACL bucket-owner-full-control (contrôle total du propriétaire du compartiment), passez à l'étape 3. Si l'objet ne possède pas d'autorisations ACL bucket-owner-full-control (contrôle total du propriétaire du compartiment), exécutez la commande suivante à partir du compte du propriétaire de l'objet. Remplacez DOC-EXAMPLE-BUCKET par le nom de votre compartiment.
  • aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control
  • À partir du compte du propriétaire du compartiment, exécutez la commande suivante pour modifier le propriétaire de l'objet en copiant l'objet sur lui-même. Remplacez DOC-EXAMPLE-BUCKET par le nom de votre compartiment.
  • aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html

    Vérifiez que les objets demandés existent 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 d'erreurs 404 Not Found (Introuvable). Exécutez la 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, Simple Storage Service (Amazon S3) répond comme si l'objet était manquant. Pour identifier l'objet que CloudFront demande à Simple Storage Service (Amazon S3), utilisez la journalisation de l'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 (404 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 : l'activation de l'accès public s3:ListBucket n'est pas une bonne pratique de sécurité. L'activation de l'accès public s3:ListBucket permet aux utilisateurs de voir et de répertorier tous les objets d'un compartiment. Cela expose les détails des métadonnées d'objet (par exemple, la clé et la taille) aux utilisateurs, même si ces derniers ne disposent pas des autorisations pour télécharger l'objet.

    Confirmez que l'accès public par bloc Simple Storage Service (Amazon S3) est désactivé pour le compartiment S3

    Vérifiez qu'il n'y a pas de paramètres Amazon S3 Block Public Access (Accès public par bloc Simple Storage Service (Amazon S3)) appliqués au compartiment. Ces paramètres peuvent remplacer les autorisations qui autorisent l'accès public en lecture. Les paramètres d'accès public par bloc Simple Storage Service (Amazon S3) peuvent s'appliquer aux compartiments individuels ou aux comptes AWS.

    Vérifiez que les objets du compartiment sont accessibles au public

    Une distribution qui utilise un point de terminaison de site Web ne prend en charge que le contenu accessible publiquement. Pour déterminer si un objet de votre compartiment S3 est publiquement accessible, ouvrez l'adresse URL de l'objet dans un navigateur Web. Vous pouvez également exécuter une commande curl sur l'URL.

    Par exemple :

    http://DOC-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.

    Pour autoriser l'accès public en lecture :

    Créez une politique de compartiment qui autorise l'accès public en lecture pour tous les objets dans le compartiment.

    -ou-

    Utilisez la console Simple Storage Service (Amazon S3) pour autoriser l'accès public en lecture pour l'objet.

    Si le paiement par le demandeur est activé, confirmez que la demande inclut le paramètre request-payer

    Si le Paiement par le demandeur est activé sur un compartiment, l'accès anonyme au compartiment n'est pas autorisé. Les utilisateurs d'autres comptes doivent spécifier le paramètre request-payer lorsqu'ils envoient des demandes au compartiment. Sinon, ces utilisateurs obtiennent une erreur Access Denied (Accès refusé).

    Si vous utilisez un en-tête Referer pour restreindre l'accès de CloudFront à votre origine S3, consultez l'en-tête personnalisé.

    Si vous utilisez l'en-tête Referer pour restreindre l'accès depuis CloudFront à l'origine du point de terminaison de votre site Web S3, vérifiez la valeur secrète ou le jeton défini sur la stratégie de compartiment S3. Ensuite, confirmez que la valeur secrète ou le jeton correspond à la valeur de l'en-tête personnalisé d'origine CloudFront.

    Si vous utilisez une instruction de refus explicite dans la stratégie de compartiment, vérifiez qu'il existe également une instruction d'autorisation qui accorde l'accès en fonction de l'en-tête Referer. Vous ne pouvez pas accorder l'accès avec seulement une instruction de refus explicite.

    Par exemple, la politique de compartiment suivante accorde l'accès à l'origine S3 lorsque la requête contient la chaîne "aws:Referer":"MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER".
    L'en-tête personnalisé d'origine CloudFront doit être :

    • En-tête : Referer
    • Valeur : MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER
    {
      "Version":"2012-10-17",
      "Id":"http referer policy example",
      "Statement":[
        {
          "Sid":"Allow get requests originating from my CloudFront with referer header",
          "Effect":"Allow",
          "Principal":"*",
          "Action":"s3:GetObject",
          "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
          "Condition":{
            "StringLike":{"aws:Referer":"MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER"}
          }
        }
      ]
    }

    Remarque : l'exemple de politique de compartiment accorde un accès public (anonyme) au compartiment car le principal est une valeur générique ("Principal":"*"). Toutefois, en raison de l'instruction de condition, l'accès à l'origine S3 n'est accordé que si la demande inclut l'en-tête Referer et que la valeur d'en-tête correspond à la valeur de la politique de compartiment.

    Vérifiez qu'aucunes politiques de contrôle des services (SCP) « Deny » (« Rejet ») n'est associée au compte de gestion de votre organisation

    Les politiques de contrôle des services (SCP) sont un type de politique d'organisation que vous pouvez utiliser pour gérer les autorisations au sein de votre organisation. Utilisez le compte de gestion de votre organisation dans AWS Organizations pour vérifier s'il existe une politique de rejet (pour l'action s3:GetObject) attachée à la racine de l'organisation, à l'unité d'organisation (OU) ou directement à votre compte AWS.