J'utilise un point de terminaison d`API REST S3 en tant qu`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 : 06/12/2022

J'utilise un compartiment Amazon Simple Storage Service (Amazon S3) comme origine de ma distribution Amazon CloudFront. J'utilise le point de terminaison d'API REST 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 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 rechercher le type de point de terminaison :

1.    Ouvrez la console CloudFront.

2.    Sélectionnez 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 ces formats :

DOC-EXAMPLE-BUCKET.s3.region.amazonaws.com 
DOC-EXAMPLE-BUCKET.s3.amazonaws.com

Important : le format bucket-name.s3.amazonaws.com ne fonctionne pas pour les régions lancées en 2019 ou plus tard. Les points de terminaison des sites web statiques utilisent ce format :

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

Si votre distribution utilise un point de terminaison de site Web statique S3, il est possible que vous receviez le message d'erreur 403 Access Denied (Accès refusé). Pour plus d'informations, consultez J'utilise un point de terminaison d'API REST S3 en tant qu'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 d'API REST, vérifiez que vos configurations respectent les conditions requises suivantes afin d'éviter les erreurs Access Denied (Accès refusé) :

  • Si vous ne configurez ni le contrôle d'accès d'origine (OAC) ni l'identité d'accès d'origine (OAI), les objets doivent être accessibles au public. Sinon, vous devez demander les objets avec la version 4 d'AWS Signature.
  • Si le compartiment S3 contient des objets chiffrés par AWS Key Management Service (AWS KMS), l'OAC doit être utilisé à la place de l'OAI.
  • La stratégie de compartiment S3 doit autoriser l'accès à s3:GetObject.
  • Si la stratégie de compartiment accorde l'accès, le compte AWS qui possède le compartiment S3 doit également être le propriétaire de l'objet.
  • Les objets demandés doivent exister dans le compartiment S3.
  • Si les clients demandent la racine de votre distribution, alors vous devez définir un objet racine par défaut.
  • Si vous avez configuré une OAI, elle doit être incluse dans la stratégie de compartiment S3.
  • Si vous avez configuré un OAC, le principal de service CloudFront doit être inclus dans la stratégie de compartiment S3. Si vous avez configuré une OAI, elle doit être incluse dans votre stratégie de compartiment S3.
  • Si vous n'avez configuré ni d'OAI ni d'OAC, les paramètres d'Accès public au Blocage de l'accès public Amazon S3 doivent être désactivés sur le compartiment.

Solution

Si vous ne configurez ni d'OAI ni d'OAC, vos objets doivent être accessibles publiquement ou demandés à l'aide d'AWS Signature Version 4.

Pour déterminer si les objets de votre compartiment S3 sont publiquement accessibles, ouvrez l'adresse URL de l'objet S3 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 :

https://DOC-EXAMPLE-BUCKET.s3.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. Si l'objet n'est pas accessible publiquement, utilisez alors l'une des configurations suivantes :

Objets chiffrés par AWS Key Management Service (AWS SSE-KMS)

Si le compartiment s3 contient des objets chiffrés par AWS Key Management Service (AWS SSE-KMS), l'OAC doit être utilisé à la place de l'OAI.

Les objets chiffrés par AWS KMS peuvent être servis avec CloudFront en configurant l'OAC. Pour ce faire, ajoutez une instruction à la politique de clé AWS KMS qui accorde au principal du service CloudFront l'autorisation d'utiliser la clé. Pour fournir des objets chiffrés par AWS KMS sans configurer l'OAC, servez la clé AWS KMS chiffrée depuis un compartiment S3 à l'aide de Lambda@Edge.

Utilisez l'une des méthodes suivantes pour vérifier si un objet dans votre compartiment est chiffré par AWS 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 AWS KMS.
  • Exécutez la commande head-object à l'aide de l'interface de la ligne de commande AWS (AWS CLI). Si la commande renvoie ServerSideEncryption sous la forme aws:kms, cela signifie que l'objet est chiffré par AWS KMS. Si vous recevez des erreurs lors de l'exécution des commandes AWS CLI, vérifiez que vous utilisez la version la plus récente de l'AWS CLI. Remarque : l'OAI ne prend pas en charge la distribution d'objets chiffrés par AWS KMS.

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

Pour utiliser une distribution avec un point de terminaison d'API REST S3, votre stratégie de compartiment doit autoriser s3:GetObject pour les utilisateurs publics ou l'OAI de CloudFront. 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 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 ci-dessous inclut une instruction d'autorisation qui accorde un accès d'OAC CloudFront à s3:GetObject. Il inclut également une instruction qui accorde un accès d'OAI CloudFront à s3:getObject et une instruction d'autorisation qui accorde un 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 :

{
  "Version": "2008-10-17",
  "Id":
    "PolicyForCloudFrontPrivateContent",
  "Statement": [{
      "Sid": "Allow-OAC-Access-To-Bucket",
        "Effect": "Allow",
        "Principal":
    {
            "Service": "cloudfront.amazonaws.com"
        },
        "Action": "s3:GetObject",
       
    "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
        "Condition": {
            "StringEquals": {
               
    "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/EDFDVBD6EXAMPLE"
            }
        }
      },
     
    {
      "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 d'OAI CloudFront à 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.

Propriété des compartiments et des objets S3

Pour qu'une stratégie de compartiment s'applique aux comptes ou services externes, 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 accordé par une stratégie de compartiment. Elle ne s'applique pas à l'accès 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 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é.

Procédez comme suit pour remplacer le propriétaire de l'objet par le propriétaire du compartiment :

1.    Depuis le compte AWS du propriétaire de l'objet, exécutez cette commande pour récupérer les autorisations de la liste de contrôle d'accès (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 --storage-class STANDARD

Remarque : veillez à modifier la valeur --storage-class dans l'exemple de commande par la classe de stockage applicable à votre cas d'utilisation.

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 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, 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'autorisation de l'accès public s3:ListBucket n'est pas une bonne pratique de sécurité. L'autorisation 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, tels la clé et la taille, aux utilisateurs, même si ces derniers ne disposent pas des autorisations pour télécharger l'objet.

Si les clients demandent la racine de votre distribution, alors vous devez définir un objet racine par défaut

Si votre distribution ne dispose pas d'un objet racine par défaut défini, et si un demandeur ne dispose pas d'un accès s3:ListBucket, le demandeur reçoit une erreur Access Denied (Accès refusé). Le demandeur reçoit cette erreur au lieu d'une erreur 404 Not Found (Introuvable) lorsqu'il demande la racine de votre distribution.

Pour définir un objet racine par défaut, consultez la section Spécification d'un objet racine par défaut.

Remarque : l'autorisation de l'accès public s3:ListBucket n'est pas une bonne pratique de sécurité. L'autorisation 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, tels la clé et la taille, aux utilisateurs, même si ces derniers ne disposent pas des autorisations pour télécharger l'objet.

Autorisations pour l'OAC ou l'OAI

Si vous avez configuré un OAC, un principal de service CloudFront doit être inclus dans la stratégie de compartiment S3. Si vous avez configuré une OAI, elle doit être incluse dans la stratégie de compartiment s3

Pour vérifier si votre stratégie de compartiment autorise l'OAI, ouvrez votre compartiment S3 dans la console Amazon S3. Ensuite, sélectionnez l'onglet Autorisations et examinez la stratégie de compartiment. Dans l'exemple de stratégie ci-dessous, la première instruction est une instruction d'autorisation pour le principal de service CloudFront lorsque l'OAC est configuré. La deuxième déclaration est une déclaration d'autorisation pour un OAI :

{
      "Sid": "Allow-OAC-Access-To-Bucket",
        "Effect": "Allow",
        "Principal": {
           
    "Service": "cloudfront.amazonaws.com"
        },
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
       
    "Condition": {
            "StringEquals": {
                "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/EDFDVBD6EXAMPLE"
           
    }
     }
      },

{
  "Sid": "1",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin
    Access Identity EAF5XXXXXXXXX"
  },
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
}

Pour mettre à jour votre stratégie de compartiment à l'aide de la console CloudFront, procédez comme suit :

1.    Ouvrez la console CloudFront, puis sélectionnez votre distribution.

2.    Choisissez l'onglet Origines et groupes d'origines.

3.    Sélectionnez l'origine S3, puis Modifier.

4.    Pour restreindre l'accès au compartiment, sélectionnez Oui.

5.    Pour l'identité d'accès à l'origine, sélectionnez l'identité existante ou créez-en une.

6.    Pour Donner des autorisations de lecture sur le compartiment, sélectionnez Oui, mettre à jour la stratégie de compartiment.

7.    Choisissez Oui, modifier.

Autoriser l'accès public pour la distribution sans OAC ou OAI

Si votre distribution n'utilise pas d'OAC ou d'OAI et que les objets ne sont pas demandés avec la Version 4 d'AWS Signature, vous devez autoriser l'accès public aux objets. En effet, une distribution dotée d'un point de terminaison API REST ne prend en charge que les objets lisibles publiquement. Dans ce cas, vous devez vérifier qu'il n'y a pas de paramètres du Blocage de l'accès public Amazon S3 appliqués au compartiment. Ces paramètres remplacent les autorisations qui autorisent l'accès public en lecture. Les paramètres du Blocage de l'accès public Amazon S3 peuvent s'appliquer aux compartiments individuels ou aux comptes AWS.


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


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