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

Dernière mise à jour : 17/02/2021

J'utilise un compartiment Amazon Simple Storage Service (Amazon S3) comme origine de ma distribution Amazon CloudFront. J'utilise le point de terminaison de site Web statique 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é), vérifiez 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 Paramètres de distribution.
  3. Choisissez l'onglet Origines et groupes d'origines.
  4. Vérifiez le nom de domaine sous Nom et chemin du domaine d'origine, puis identifiez le type de point de terminaison en fonction du format du nom de domaine.

Les points de terminaison de l’API REST utilisent ce format :

DOC-EXAMPLE-BUCKET.s3.amazonaws.com

Remarque : Veillez à suivre les règles de dénomination des compartiments Amazon S3.

Les points de terminaison de site Web utilisent ce format :

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 de tiret (s3-website-Region) ou le format point (s3-website.Region).

Si votre distribution utilise un point de terminaison de l'API REST, consultez 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 conditions requises suivantes afin d'éviter les erreurs Access Denied (Accès refusé) :

  • Les objets dans le compartiment doivent être accessibles publiquement.
  • 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 doit autoriser l'accès à s3:GetObject.
  • Si la stratégie de compartiment accorde l'accès public en lecture, le compte AWS qui possède le compartiment doit également être le propriétaire de l'objet.
  • Les objets demandés doivent exister dans le compartiment.
  • La fonction Block Public Access d'Amazon S3 doit être désactivée dans le compartiment.
  • Si l'option Paiement par le demandeur est activée, la demande doit inclure le paramètre request-payer.
  • Si vous utilisez un en-tête Referer pour restreindre l'accès de CloudFront à votre origine S3, vérifiez l'en-tête personnalisé.

Remarque : si vous ne souhaitez pas autoriser l'accès public (anonyme) à vos objets S3, modifiez votre configuration pour utiliser le point de terminaison de l'API REST S3 comme origine de votre distribution. Ensuite, configurez votre distribution et votre compartiment S3 pour limiter l'accès à l'aide d'une identité d'accès d'origine (OAI). Pour obtenir des instructions, consultez Utilisation d'un point de terminaison de l'API REST comme origine avec un accès limité par une OAI dans Comment utiliser CloudFront pour diffuser un site Web statique hébergé sur Amazon S3 ?

Solution

Les objets dans le compartiment doivent être accessibles publiquement.

Une distribution qui utilise un point de terminaison de site Web prend uniquement en charge 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.

L'exemple suivant illustre l'adresse URL d'un objet S3 :

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.

Autorisez l'accès public en lecture à l'objet de l'une des manières 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, utilisez 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 :

Pour modifier les paramètres de chiffrement de l'objet à l'aide de la console Amazon S3, consultez la section 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 (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 la commande suivante pour supprimer le chiffrement de l'objet en copiant l'objet sur lui-même :

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 les valeurs storage-class ou website-redirect-location dans la demande de copie.

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

Pour utiliser une distribution avec un point de terminaison de site Web S3, votre stratégie de compartiment ne doit pas disposer d'une instruction de refus qui bloque l'accès public en lecture à l'action s3:GetObject.

Même si vous avez une instruction d'autorisation explicite pour s3:GetObject dans votre stratégie de compartiment, vérifiez 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 instructions avec « Action » : « s3:GetObject » ou « Action » : « s3:* ».

L'exemple de stratégie suivant contient une instruction d'autorisation explicite pour l'accès public à s3:GetObject. Cependant, il existe également 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:::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"
                }
            }
        }
    ]
  }

5.    Modifiez la stratégie de compartiment pour supprimer ou modifier les instructions qui bloquent l'accès public en lecture à s3:GetObject.

Remarque : CloudFront met en cache les résultats d'une erreur Accès refusé pendant la durée spécifiée dans l’erreur de mise en cache de la durée de vie minimale. La valeur par défaut est une minute. 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 public en lecture, le compte AWS qui possède le compartiment doit également être le propriétaire de l'objet.

Pour qu'une stratégie 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. Le compartiment ou les objets appartiennent au compte de l'identité AWS Identity and Access Management (IAM) ayant créé ce compartiment ou ces objets.

Remarque : l'exigence de propriété de l'objet s'applique à l'accès public en lecture accordé par une stratégie 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.

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 « list » pour vérifier plusieurs objets.

aws s3api list-objects --bucket DOC-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 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

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 DOC-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://DOC-EXAMPLE-BUCKET/index.html s3://DOC-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 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 : 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.

Le paramètre de blocage d'accès public Amazon S3 doit être désactivée sur le compartiment.

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

Si l'option Paiement par le demandeur est activée, la demande doit inclure 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 stratégie 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" :

{
  "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"}
      }
    }
  ]
}

Avec cet exemple de stratégie de compartiment, l'en-tête personnalisé d'origine CloudFront doit être :

  • En-tête : Referer
  • Valeur : MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER

Remarque : l'exemple de stratégie de compartiment accorde un accès public (anonyme) au compartiment car le mandataire est une valeur générique (« Mandataire» : «*»). 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 stratégie de compartiment.


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


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