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 : 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 de site Web statique S3 comme nom de domaine de l'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 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 d'API REST présentent le format suivant :

AWSDOC-EXAMPLE-BUCKET.s3.amazonaws.com

Remarque : Veillez à suivre les règles d'attribution de noms aux compartiments Amazon S3.

Les points de terminaison de site Web présentent le format suivant :

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

Si votre distribution utilise un point de terminaison d'API REST, consultez J'utilise un point de terminaison d'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, 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.
  • Si l'option Paiement par le demandeur est activée, la demande doit inclure le paramètre request-payer.

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 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.

Autorisez l'accès public à 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 :

  • 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 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:::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 public en lecture à 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 public, 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 aux objets, le compte AWS possédant le compartiment doit également posséder les 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 public accordé par une stratégie de compartiment. Elle ne s'applique pas à l'accès public 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 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 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 : L'activation de l'accès public s3:ListBucket n'est pas une bonne pratique de sécurité.

La fonction Block Public Access d'Amazon S3 doit être désactivée

Confirmez 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.

Si l'option Paiement par le demandeur est activée, la demande doit inclure le paramètre request-payer.

Si le compartiment a l'option Paiement par le demandeur activée, 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 de refus d'accès.

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 requêtes REST, l'utilisateur doit inclure le paramètre x-amz-request-payer dans la requête.


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


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