Pourquoi est-ce que je reçois un message d’erreur « 403 access denied » lorsque j’utilise un point de terminaison du site Web d’Amazon S3 comme origine de ma distribution CloudFront ?

Lecture de 10 minute(s)
0

J’utilise un compartiment Amazon Simple Storage Service (Amazon S3) comme origine de ma distribution Amazon CloudFront. Je souhaite résoudre l’erreur « 403 access denied ».

Résolution

Pour résoudre les problèmes liés aux distributions CloudFront dont les points de terminaison du site Web Amazon S3 sont à l’origine, effectuez les tâches suivantes.

Remarque : si des erreurs surviennent lorsque vous exécutez des commandes de l’interface de la ligne de commande AWS (AWS CLI), consultez la page Résoudre les erreurs liées à AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l’AWS CLI.

Vérifier le chiffrement des objets de votre compartiment

AWS Key Management Service (AWS KMS) ne prend pas en charge les demandes anonymes. Les compartiments Amazon S3 qui autorisent l’accès anonyme ou public n’appliquent pas cet accès aux objets chiffrés avec AWS KMS. Supprimez le chiffrement AWS KMS des objets S3 que vous souhaitez diffuser. Au lieu du chiffrement AWS KMS, utilisez AES-256 pour chiffrer vos objets.

Déterminer si les objets sont chiffrés avec AWS KMS

Pour vérifier si les objets de votre compartiment sont chiffrés avec AWS KMS, effectuez les tâches suivantes :

Afficher les propriétés de l’objet sur la console Amazon S3. Si AWS-KMS est sélectionné dans la boîte de dialogue Chiffrement, c’est que l’objet est chiffré avec AWS KMS.

Vous pouvez également exécuter l’AWS CLI pour exécuter la commande head-object. Si la commande renvoie ServerSideEncryption sous la forme aws:kms, l’objet est chiffré par AWS KMS.

Modifier les paramètres de chiffrement d’un objet

Pour utiliser la console Amazon S3 afin de modifier les paramètres de chiffrement de l’objet, consultez Spécification du chiffrement côté serveur avec AWS KMS (SSE-KMS).

Pour utiliser l’AWS CLI afin de modifier les paramètres de chiffrement de l’objet, vérifiez que le compartiment de l’objet ne dispose pas d’AWS KMS comme chiffrement par défaut. Si le compartiment utilise AWS KMS comme chiffrement par défaut, modifiez le chiffrement en SSE-S3.

Si le compartiment n’est pas doté du chiffrement par défaut, exécutez la commande suivante pour copier l’objet sur lui-même et supprimer le chiffrement de l’objet :

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

Remarque : remplacez DOC-EXAMPLE-BUCKET par le nom de votre compartiment. Lorsque vous copiez l’objet sur lui-même, l’action supprime les paramètres relatifs à storage-class et à website-redirect-location. Pour conserver ces paramètres dans le nouvel objet, spécifiez explicitement ces valeurs dans la demande de copie.

Passer en revue votre politique en matière de compartiment

Votre politique de compartiment ne peut pas comporter une instruction de refus qui bloque l’accès du public à l’action s3:GetObject.

Si vous avez une instruction d’autorisation explicite pour s3:GetObject, assurez-vous qu’aucune instruction de refus explicite n’entre en conflit avec l’instruction. Une instruction de refus explicite a toujours préséance sur une instruction de permission explicite.

Pour revoir votre politique en matière de compartiment pour s3:GetObject, procédez comme suit :

  1. Ouvrez la console Amazon S3, puis accédez à votre compartiment S3.
  2. Choisissez l’onglet Autorisations.
  3. Choisissez Politique de compartiment.
  4. Consultez la politique de compartiment pour les instructions contenant "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 d’autorisation explicite pour 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 : Modifiez cette politique pour autoriser l’action s3:GetObject :

{
  "Version": "2012-10-17",
  "Id": "PolicyForCloudFrontPrivateContent",
  "Statement": [
    {
      "Sid": "Allow-OAI-Access-To-Bucket",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAF5#########"
      },
      "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"
        }
      }
    }
  ]
}

La politique suivante est un exemple de politique de compartiment Amazon S3 qui autorise l’accès public en lecture seule au point de terminaison du site Web de S3 :

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

Vérifier la propriété du compartiment et de l’objet

Pour qu’une politique de compartiment autorise l’accès public en lecture aux objets, le compte AWS propriétaire du compartiment doit également être propriétaire des objets.

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

Remarque : Vous pouvez également utiliser la console Amazon S3 pour vérifier les propriétaires du compartiment et des objets. Vous pouvez trouver les propriétaires dans l’onglet Autorisations du compartiment ou de l’objet.

Pour utiliser l’AWS CLI pour vérifier les propriétaires de compartiment et d’objet, exécutez les commandes suivantes :

Exécutez la commande list-buckets pour obtenir l’ID canonique S3 du propriétaire du compartiment :

aws s3api list-buckets --query Owner.ID

Exécutez la commande list-objects pour obtenir l’ID canonique S3 du propriétaire de l’objet :

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

Remarque : le résultat de la commande de l’exemple précédent montre un seul objet, mais vous pouvez utiliser la commande list-objects pour vérifier plusieurs objets. Si les identifiants canoniques ne correspondent pas, alors le compartiment et l’objet n’ont pas le même propriétaire.

Mettre à jour la propriété de l’objet

Les propriétaires de compartiments peuvent gérer la propriété des objets avec Propriété d’objets S3. Le paramètre Propriété d’objets S3 est activé par défaut pour tous les nouveaux compartiments S3. Pour mettre à jour une catégorie existante, consultez la section Configuration de la propriété d’un objet dans un compartiment existant.

Il est recommandé aux propriétaires de compartiments d’utiliser le paramètre S3 Object Ownership sur tous les compartiments. Il est également recommandé de gérer les autorisations à travers les rôles AWS Identity and Access Management (IAM) et les politiques de compartiments.

Pour supprimer les ACL de votre compartiment et vous approprier tous les objets qu’il contient, exécutez la commande put-bucket-ownership-controls :

aws s3api put-bucket-ownership-controls --bucket example-bucket --ownership-controls 'Rules=[{ObjectOwnership=BucketOwnerEnforced}]'

Si vous ne souhaitez pas désactiver les ACL de votre compartiment S3, remplacez le propriétaire de l’objet par le propriétaire du compartiment.

Procédez comme suit :

  1. Depuis le compte du propriétaire de l’objet, exécutez la commande get-object-acl pour récupérer les autorisations ACL attribuées à l’objet :

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

    Remarque : si l’objet dispose d’autorisations ACL bucket-owner-full-control, passez à l’étape n° 3.

  2. Si l’objet ne dispose pas d’autorisations ACL bucket-owner-full-control, exécutez la commande put-object-acl 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. Depuis le compte du propriétaire du compartiment, exécutez la commande suivante pour copier l’objet sur lui-même et changer le propriétaire de l’objet :

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

    Remarque : remplacez DOC-EXAMPLE-BUCKET par le nom de votre compartiment. Remplacez DOC-EXAMPLE-BUCKET par le nom de votre compartiment.

Vérifier les paramètres de blocage de l’accès public pour le compartiment

Assurez-vous qu’aucun paramètre Blocage de l’accès public Amazon S3 n’est appliqué au compartiment ou au compte. Ces paramètres peuvent remplacer les autorisations qui permettent un accès public en lecture. Les paramètres Blocage de l’accès public Amazon S3 peuvent s’appliquer à des compartiments individuels ou à des comptes AWS.

Vérifier 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 au public. Pour déterminer si un objet de votre compartiment S3 est accessible au public, ouvrez l’URL de l’objet du point de terminaison du site Web de S3 dans un navigateur Web. Vous pouvez également exécuter une commande curl sur l’URL.

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 Access Denied, alors l’objet n’est pas accessible au public.

Pour autoriser l’accès public en lecture, effectuez l'une des tâches suivantes :

Examiner l’option Paiement par le demandeur

Si Paiement par le demandeur est activé, alors désactivez l’option. Les compartiments Paiement par le demandeur n’autorisent pas l’accès via le point de terminaison d’un site Web.

Vérifier votre en-tête personnalisé

Si vous utilisez l’en-tête de référent pour restreindre l’accès de CloudFront à l’origine de votre point de terminaison du site Web de S3, vérifiez votre politique de compartiment. Vérifiez que la valeur secrète ou le jeton établi dans la politique de compartiment S3 correspond bien à la valeur de l’en-tête personnalisé de CloudFront.

Pour utiliser une instruction de refus explicite dans la politique de la compartiment, il doit y avoir une instruction d’autorisation qui accorde l’accès en fonction de l’en-tête du référent. Vous ne pouvez pas accorder l’accès en utilisant uniquement une instruction de refus explicite.

Par exemple, la politique de compartiment suivante donne accès à l’origine S3 lorsque la demande contient la chaîne « aws:Referer":"MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER. »

L’en-tête personnalisé d’origine CloudFront doit avoir les configurations suivantes :

  • En-tête : référent
  • Valeur : MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER

Exemple de politique relative au compartiment :

{
  "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 : comme Principal est une valeur générique ("Principal":"*"), l’exemple de politique de compartiment accorde un accès public (anonyme) au compartiment. En raison de l’instruction de condition, la requête doit inclure l’en-tête du référent et la valeur de l’en-tête doit correspondre à la valeur dans la politique de compartiment. Si le compartiment de condition n’est pas rempli, vous ne pouvez pas accéder à l’origine S3.

Passer en revue le compte de gestion de votre organisation

Utilisez le compte de gestion de votre organisation dans AWS Organizations pour vérifier les stratégies de contrôle des refus de service (SCP). Examinez les politiques de refus pour l’action s3:GetObject liée à la racine de l’organisation, à l’unité d’organisation (UO) ou directement à votre compte.

Informations connexes

Pourquoi est-ce que j'obtiens des erreurs 403 Access Denied lorsque j'utilise un point de terminaison de l’API REST S3 comme origine de ma distribution CloudFront ?

Résolution des problèmes liés aux codes d’état des réponses aux erreurs dans CloudFront

Comment faire pour résoudre les erreurs 403 Access Denied que renvoie Amazon S3 ?

Comment faire pour utiliser CloudFront pour servir un site Web statique hébergé sur Amazon S3 ?

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 4 mois