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 messages d’erreur 403 Accès refusé ?

Lecture de 12 minute(s)
0

J’utilise un compartiment Amazon Simple Storage Service (Amazon S3) comme origine de ma distribution Amazon CloudFront. J’utilise le point de terminaison de l’API REST S3 comme nom de domaine d’origine. CloudFront renvoie 403 Erreur d’accès refusé provenant d’Amazon S3.

Brève description

Pour résoudre des erreurs d’accès refusé, déterminez 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. Voici comment trouver le type de point de terminaison :

1.    Ouvrez la console CloudFront.

2.    Sélectionnez votre distribution CloudFront. Choisissez ensuite Paramètres de distribution.

3.    Choisissez l’onglet Origines et groupes d’origine.

4.    Sous Nom et chemin du domaine de l’origine, vérifiez le nom de domaine. Déterminez ensuite le type de point de terminaison en fonction du format du nom de domaine. Les points de terminaison de l’API REST utilisent les formats suivants :

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 ultérieurement. Les points de terminaison de sites Web 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, vous pouvez recevoir 403 Erreur d’accès refusé. Pour en savoir plus, consultez J'utilise un point de terminaison de site Web S3 comme origine de ma distribution CloudFront. Pourquoi est-ce que je reçois des messages d’erreur 403 Accès refusé ?

Si votre distribution utilise un point de terminaison d’API REST, vérifiez que vos configurations répondent aux exigences suivantes pour éviter les erreurs d’accès refusé :

  • Si vous ne configurez ni le contrôle d’accès à l’origine (OAC) ni l’identité d’accès d’origine (OAI), les objets doivent être accessibles au public. Autrement, vous devez demander les objets avec AWS Signature Version 4.
  • Si le compartiment S3 contient des objets chiffrés par AWS Key Management Service (AWS KMS), il convient d’utiliser l’OAC au lieu de l’OAI.
  • La politique de compartiment S3 doit autoriser l’accès à s3:GetObject.
  • Si la politique de compartiment autorise l’accès, le compte AWS propriétaire du compartiment S3 doit également être propriétaire de l’objet.
  • Les objets demandés doivent exister dans le compartiment S3.
  • Si les clients demandent la racine de votre distribution, vous devez définir un objet racine par défaut.
  • Si vous avez configuré un OAI, celui-ci doit être inclus dans la politique de compartiment S3.
  • Si vous avez configuré un OAC, le principal du service CloudFront doit être inclus dans la politique de compartiment S3. Si vous avez configuré un OAI, celui-ci doit être inclus dans votre politique de compartiment S3.
  • Si vous ne configurez ni OAC ni OAI, Amazon S3 Block Public Access doit être désactivé sur le compartiment.

Résolution

Si vous ne configurez ni OAC ni OAI, vos objets doivent être accessibles au public ou demandés avec AWS Signature Version 4.

Pour déterminer si les objets de votre compartiment S3 sont accessibles au public, ouvrez l’URL de l’objet S3 dans un navigateur Web. Vous pouvez également exécuter une commande curl sur l’URL.

Voici un exemple d’URL d’un objet S3 :

https://DOC-EXAMPLE-BUCKET.s3.amazonaws.com/index.html

Si le navigateur Web ou la commande curl renvoient une erreur Accès refusé, cela signifie que l’objet n’est pas accessible au public. Si l’objet n’est pas accessible au public, utilisez 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), il convient d’utiliser l’OAC et non l’OAI.

Il est possible de diffuser les objets chiffrés par AWS KMS avec CloudFront en configurant l’OAC. Pour cela, ajoutez une instruction à la politique de clé AWS KMS qui accorde l’autorisation d’utiliser la clé au principal du service CloudFront. Pour diffuser des objets chiffrés par AWS KMS sans configurer l’OAC, diffusez la clé AWS KMS chiffrée à partir d’un compartiment S3 à l’aide de Lambda@Edge.

À l’aide de l’une des méthodes suivantes, vérifiez si un objet de votre compartiment est chiffré par AWS 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é, 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, l’objet est chiffré par AWS KMS. Si des erreurs se produisent lors de l’exécution de commandes AWS CLI, vérifiez que vous utilisez la version la plus récente d’AWS CLI.
    Remarque : l’OAI ne prend pas en charge la diffusion d’objets chiffrés AWS KMS.

La politique de compartiment S3 doit autoriser l’accès à s3:GetObject

Pour utiliser une distribution avec un point de terminaison d’API REST S3, votre politique de compartiment doit autoriser s3:GetObject aux utilisateurs publics ou à l’OAI de CloudFront. Même si vous disposez d’une instruction d’autorisation explicite pour **s3:GetObject ** dans votre politique de compartiment, vérifiez qu’il n’existe pas d’instruction de refus explicite contraire. Une instruction de refus explicite remplace toujours une instruction d’autorisation explicite.

Suivez ces étapes pour consulter la politique de votre compartiment pour s3:GetObject :

1.    Ouvrez votre compartiment S3 depuis la console Amazon S3.

2.    Choisissez l’onglet Autorisations.

3.    Choisissez Stratégie de compartiment.

4.    Consultez la politique de compartiment pour les instructions contenant « Action » : « s3:GetObject » ** ou ** « Action » : « s3:* ». L’exemple de politique ci-dessous inclut une instruction d’autorisation qui accorde à un CloudFront OAC l’accès à s3:GetObject. Elle comporte également une instruction qui accorde à CloudFront OAI l’accès à **s3:GetObject ** et une instruction d’autorisation qui accorde 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 Virtual Private Cloud (VPC) Amazon spécifique :

{
  "Version": "2012-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 politique de compartiment pour supprimer ou modifier les instructions qui bloquent l’accès OAI de CloudFront ou l’accès public à s3:GetObject

Remarque : CloudFront met en cache les résultats d’une erreur d’accès refusé pendant cinq minutes maximum. Après avoir supprimé une instruction de refus de la politique 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 politique de compartiment s’applique aux comptes ou aux services externes, le compte AWS propriétaire du compartiment doit également être propriétaire des objets. Un compartiment ou un objet appartient au compte de l’identité AWS Identity and Access Management (IAM) qui a créé ce compartiment ou cet objet.

Remarque : l’exigence de propriété de l’objet s’applique à l’accès accordé par une politique de compartiment. Elle ne s’applique pas à l’accès accordé par la liste de contrôle d’accès (ACL) de l’objet.

Suivez ces étapes pour vérifier si le compartiment et les objets ont le même propriétaire :

1.    Exécutez cette commande de l’AWS CLI pour obtenir l’ID canonique S3 du propriétaire du 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 : dans cet exemple, il n’y a qu’un seul objet, mais vous pouvez utiliser la commande liste pour vérifier plusieurs objets.

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

3.    Si les identifiants 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 vérifier les propriétaires du compartiment et des objets. Les propriétaires se trouvent dans l’onglet Autorisations du compartiment ou de l’objet concerné.

Suivez ces étapes pour que le propriétaire de l’objet devienne 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 n°3. Si l’objet ne dispose pas des 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.    Depuis le compte du propriétaire du compartiment, exécutez cette commande pour changer le propriétaire 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 à remplacer la valeur --storage-class dans l’exemple de commande par la classe de stockage qui correspond à votre cas d’utilisation.

Les objets demandés doivent exister dans le compartiment

Si un utilisateur ne dispose pas des autorisations s3:ListBucket, il reçoit des erreurs Accès refusé pour des objets manquants au lieu des erreurs 404 Introuvable. Exécutez la commande head-object de l’AWS CLI 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’objets s3 distinguent les majuscules et les minuscules. Si le nom d’objet de la demande n’est pas correct, Amazon S3 répond comme si l’objet était manquant. Pour identifier l’objet que CloudFront demande à Amazon S3, utilisez la journalisation des accès au serveur.

Si l’objet existe dans le compartiment, l’erreur d’accès refusé ne masque pas une Erreur 404 Introuvable. Vérifiez les autres exigences de configuration pour résoudre l’erreur d’accès refusé.

Si l’objet n’est pas dans le compartiment, l’erreur d’accès refusé masque une Erreur 404 Introuvable. Résolution du problème lié à l’objet manquant.

Remarque : pour des raisons de sécurité, il n’est pas recommandé d’autoriser l’accès public à s3:ListBucket. L’autorisation de l’accès public à s3:ListBucket permet aux utilisateurs de voir et de répertorier tous les objets d’un compartiment. Les détails des métadonnées de l’objet, tels que la clé et la taille, sont alors accessibles aux utilisateurs, même si ces derniers ne sont pas autorisés à télécharger l’objet.

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

Si aucun objet racine par défaut n’est défini pour votre distribution et qu’un demandeur n’a pas accès à s3:ListBucket, le demandeur reçoit un message d’erreur Accès refusé. Le demandeur reçoit cette erreur au lieu d’une erreur 404 Introuvable lorsqu’il demande la racine de votre distribution.

Pour définir un objet racine par défaut, consultez Spécification d’un objet racine par défaut.

Remarque : pour des raisons de sécurité, il n’est pas recommandé d’autoriser l’accès public à s3:ListBucket. L’autorisation de l’accès public à s3:ListBucket permet aux utilisateurs de voir et de répertorier tous les objets d’un compartiment. Les détails des métadonnées de l’objet, tels que la clé et la taille, sont alors accessibles aux utilisateurs, même si ces derniers ne sont pas autorisés à télécharger l’objet.

Autorisations pour l’OAC ou l’OAI

Si vous avez configuré un OAC, il est nécessaire d’inclure un principal de service CloudFront dans la politique de compartiment S3. Si vous avez configuré un OAI, il est nécessaire de l’inclure dans votre politique de compartiment s3

Pour vérifier si votre politique de compartiment autorise l’OAI, ouvrez votre compartiment S3 dans la console Amazon S3. Choisissez ensuite l’onglet Autorisations et examinez la politique de compartiment. Dans l’exemple de politique ci-dessous, la première instruction est une instruction d’autorisation pour le principal du service CloudFront lorsque l’OAC est configuré. La deuxième instruction est une instruction 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/*"
}

Voici les étapes à suivre pour mettre à jour votre politique de compartiment à l’aide de la console CloudFront :

1.    Ouvrez la console CloudFront et choisissez votre distribution.

2.    Choisissez l’onglet Origines et groupes d’origine.

3.    Sélectionnez l’origine S3, puis choisissez Modifier.

4.    Pour Restreindre l’accès au compartiment, choisissez Oui.

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

6.    Pour Accorder des autorisations de lecture sur le compartiment, choisissez Oui, Mettre à jour la politique de compartiment.

7.    Choisissez Oui, Modifier.

Autorisation d’accès public à des fins de distribution sans OAC ni OAI

Si votre distribution n’utilise ni l’OAC ni l’OAI et que les objets ne sont pas demandés avec AWS Signature Version 4, vous devez autoriser l’accès public aux objets. En effet, une distribution avec un point de terminaison d’API REST prend uniquement en charge les objets lisibles publiquement. Dans ce cas, vous devez vérifier qu’aucun paramètre de blocage de l’accès public Amazon S3 n’est appliqué au compartiment. Ces paramètres remplacent 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.


Informations complémentaires

Résolution des réponses d’erreur de votre origine

Comment puis-je résoudre les erreurs 403 Accès refusé que renvoie Amazon S3 ?

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an