J'utilise la fonction de site web statique hébergé à l'aide d'Amazon S3 mais obtiens un message d'erreur Accès refusé. Pourquoi cela se produit-il ?

Date de la dernière mise à jour : 22/12/2021

J'utilise un compartiment Amazon Simple Storage Service (Amazon S3) pour héberger un site web statique avec le point de terminaison du site web statique hébergé à l'aide de S3. Pourquoi est-ce que je reçois un message d'erreur Accès refusé ?

Brève description

Si vous essayez d'héberger un site web statique à l'aide d'Amazon S3, mais que vous recevez une erreur Accès refusé, vérifiez les exigences suivantes :

  • Les objets dans les compartiments doivent être accessibles au public.
  • La politique de compartiment S3 doit autoriser l'accès à l'action s3:GetObject.
  • Le compte AWS qui possède le compartiment doit également posséder l'objet.
  • Les objets ne peuvent pas être chiffrés par AWS Key Management Service (AWS KMS).
  • Les objets demandés doivent exister dans le compartiment S3.
  • Amazon S3 Block Public Access doit être désactivé au niveau du compartiment et du compte.

Résolution

Les objets dans le compartiment doivent être accessibles au public.

Le point de terminaison de site web statique hébergé à l'aide de S3 prend uniquement en charge le contenu accessible Pour vérifier si un objet de votre compartiment S3 est accessible publiquement, ouvrez l'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://doc-example-bucket.s3-website-us-east-1.amazonaws.com/index.html
Si une erreur Accès refusé est renvoyée par le navigateur web ou la commande cURL, c'est que l'objet n'est pas accessible au public. Pour autoriser l'accès public en lecture à votre objet S3, créez une politique de compartiment qui autorise l'accès public en lecture à tous les objets du compartiment.

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

Vérifiez votre politique de compartiment et assurez-vous qu'aucune instruction de refus ne 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 politique de compartiment, confirmez qu'il n'y a pas d'instruction de refus explicite conflictuelle. Une déclaration de refus explicite remplacera toujours une instruction d'autorisation explicite.

Pour vérifier votre politique de compartiment pour s3:GetObject, effectuez les opérations suivantes :

1.    Ouvrez la console Amazon S3.

2.    Sélectionnez l'onglet Autorisations.

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

4.    Examinez la politique de compartiment à la recherche des instructions avec « Action » : « s3:GetObject » ou « Action » : « s3:* ».

5.    (Facultatif) Modifiez la politique de compartiment. Par exemple, vous pouvez supprimer ou modifier des instructions qui bloquent l'accès public en lecture à s3:GetObject.

Le compte AWS qui possède le compartiment doit être également propriétaire de l'objet.

Pour autoriser l'accès public en lecture aux objets, le compte AWS propriétaire du 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 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.

Pour vérifier si votre compartiment Amazon S3 et vos objets appartiennent au même compte AWS, effectuez les opérations suivantes :

1.    Pour récupérer l'ID canonique S3 du propriétaire du compartiment, utilisez la commande suivante :

aws s3api list-buckets --query Owner.ID

2.    Pour récupérer l'ID canonique S3 du propriétaire de l'objet, utilisez la commande suivante :

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

Remarque : cet exemple montre un seul objet. Pour vérifier plusieurs objets, utilisez la commande list.

3.    Vérifiez si les ID canoniques du propriétaire du compartiment et du propriétaire de l'objet correspondent. S'ils ne correspondent pas, c'est que le compartiment et l'objet ont des propriétaires différents.

Remarque : vous pouvez également utiliser la console 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.

4.    Si les ID canoniques du compartiment et du propriétaire de l'objet ne correspondent pas, remplacez le propriétaire de l'objet par le propriétaire du compartiment.

À partir du compte du propriétaire de l'objet, exécutez la commande suivante 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 ne possède pas d'autorisations ACL de contrôle total du propriétaire du compartiment, exécutez la commande suivante à partir du compte du propriétaire de l'objet :

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

Si l'objet possède des autorisations ACL de contrôle total du propriétaire du compartiment, exécutez la commande suivante à partir du compte du propriétaire du compartiment. Cette commande modifie 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 --storage-class STANDARD

Vous pouvez également utiliser la propriété d'objet S3 pour accorder au propriétaire du compartiment la propriété automatique de tous les objets chargés par des utilisateurs anonymes ou d'autres comptes AWS.

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

AWS KMS ne prend pas en charge les demandes anonymes. Par conséquent, tout compartiment Amazon S3 qui autorise un accès anonyme ou public ne s'appliquera pas aux objets chiffrés avec AWS KMS. Vous devez supprimer le chiffrement KMS des objets que vous souhaitez diffuser à l'aide du point de terminaison de site web statique hébergé à l'aide d'Amazon S3.

Remarque : au lieu d'utiliser le chiffrement AWS KMS, utilisez AES-256 pour chiffrer vos objets.

Vous pouvez vérifier si un objet de votre compartiment est chiffré par KMS à l'aide des méthodes suivantes :

  • 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é, l'objet est chiffré par KMS.
  • Exécutez la commande head-object à l'aide d'AWS Command Line Interface (AWS CLI). Si la commande renvoie ServerSideEncryption sous la forme aws:kms, c'est que l'objet est chiffré par KMS.

Remarque : si vous recevez des erreurs lors de l'exécution de commandes depuis AWS CLI, assurez-vous d'utiliser la version la plus récente d'AWS CLI.

Pour modifier les paramètres de chiffrement de l'objet à l'aide de la console Amazon S3, consultez Spécification du chiffrement Amazon S3.

Pour pouvoir modifier les paramètres de chiffrement de l'objet à l'aide d'AWS CLI, vérifiez que le compartiment de l'objet n'a pas de chiffrement par défaut. Si le compartiment n'a pas de chiffrement par défaut, supprimez 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 --storage-class STANDARD
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, tâchez de spécifier explicitement les valeurs storage-class ou website-redirect-location dans la demande de copie.

Les objets demandés doivent exister dans le compartiment S3

Si un utilisateur exécutant la demande ne dispose pas des autorisations s3:ListBucket, il reçoit une erreur Accès refusé pour les objets manquants.

Vous pouvez exécuter la commande AWS CLI head-object pour vérifier si un objet existe dans le compartiment.

Remarque : les noms d'objets S3 sont sensibles à la casse. Si la demande n'a pas de nom d'objet valide, Amazon S3 signale que l'objet est manquant.

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

Si l'objet n'existe pas dans le compartiment, c'est que l'erreur Accès refusé masque une erreur 404 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 tous les objets d'un compartiment et de les répertorier. Cet accès 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 Amazon S3 Block Public Access doit être désactivée sur le compartiment

Les paramètres Amazon S3 Block Public Access peuvent s'appliquer aux compartiments individuels ou aux comptes AWS. Confirmez qu'aucun paramètre Amazon S3 Block Public Access n'est appliqué à votre compartiment S3 ou à votre compte AWS. Ces paramètres peuvent remplacer les autorisations d'accès public en lecture.


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


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