Comment résoudre les problèmes liés à une URL signée ou à des cookies signés dans CloudFront ?

Lecture de 9 minute(s)
0

J'utilise Amazon CloudFront et une URL signée ou des cookies signés pour sécuriser le contenu privé. Cependant, je reçois le message d'erreur 403 Accès refusé.

Solution

Si Amazon CloudFront rencontre un problème avec une URL signée ou des témoins de connexion (cookies) signés, il est possible que vous receviez le message d'erreur 403 Accès refusé.

Une URL signée ou un cookie signé n'inclut pas le bon signataire

Lorsque vous activez Restreindre l'accès au lecteur dans un comportement, vous devez identifier un signataire. Un signataire est soit un groupe de clés autorisé que vous créez dans CloudFront, soit un compte AWS qui contient une paire de clés CloudFront. Les messages d'erreur 403 suivants indiquent que les informations du signataire sont manquantes ou incorrectes :

L'erreur inclut le message « Missing Key-Pair-Id query parameter or cookie value » (Paramètre de requête Key-Pair-Id manquant ou valeur de cookie manquante).

Ce message indique un paramètre de requête Key-Pair-Id manquant ou vide lors de l'utilisation d'une URL signée. Cela peut également indiquer qu'un paramètre de chaîne de requête CloudFront-Key-Pair-ID est manquant dans un cookie signé.

L'erreur inclut le message « Unknown Key » (Clé inconnue).

Ce message indique que CloudFront ne peut pas vérifier les informations du signataire via Key-Pair-ID (pour les URL signées) ou CloudFront-Key-Pair-ID (pour les cookies signés). Pour résoudre ce problème, vérifiez que la valeur Key-Pair-ID correcte est utilisée pour une URL signée ou CloudFront-Key-Pair-ID pour les témoins de connexion (cookies) signés :

Si vous utilisez une URL signée, recherchez et notez la valeur de Key-Pair-ID.

-ou-

Si vous utilisez des témoins de connexion (cookies) signés, recherchez et notez la valeur de Cloudfront-Key-Pair-ID.

Recherchez ensuite le Key ID (ID de clé) et confirmez qu'il correspond au Key-Pair-ID ou au CloudFront-Key-Pair-ID :

1.    Ouvrez la console CloudFront. Dans le menu de navigation, choisissez Distributions.

2.    Sélectionnez votre distribution. Choisissez ensuite l'onglet Comportements.

3.    Sélectionnez le nom du comportement, puis choisissez Modifier.

4.    Trouvez le paramètre Restreindre l'accès au lecteurRemarque : S'il est défini sur Oui, les demandes de fichiers qui correspondent au modèle de chemin de ce comportement de cache doivent utiliser l'URL signée ou le cookie signé.

5.    Après avoir vérifié que le champ Restreindre l'accès au lecteur est défini sur Oui, vérifiez le champ Type d'autorisation approuvé.

6.    Si la valeur du champ Type d'autorisation approuvé indique Groupes de clés autorisés, notez le nom du groupe de clés autorisé.
Trouvez les identifiants de clé publique pour un groupe de clés autorisé :
Ouvrez la console CloudFront. Choisissez Groupes de clés.
Dans la liste des groupes de clés, choisissez le nom du groupe de clés autorisé que vous avez noté.
Vérifiez que la valeur Key-Pair-Id ou CloudFront-Key-Pair-ID que vous avez notée à l'étape 1 corresponde à l'un des ID de clé publique du groupe de clés autorisé.

7.    Si la valeur du chap type d'autorisation approuvé indique Signataire autorisé, CloudFront utilise les informations d'identification générées par AWS. Dans ce cas, la valeur de Key-Pair-Id ou de CloudFront-Key-Pair-ID que vous avez notée à l'étape 1 doit correspondre à l'ID de clé d'accès des informations d'identification CloudFront.  Pour trouver l'ID de clé d'accès des informations d'identification CloudFront, consultez la section Créer des paires de clés pour vos signataires.

Une URL signée ou un témoin de connexion (cookie) signé n'est pas envoyé à une heure valide

Lorsque vous créez une URL signée ou un cookie signé, une déclaration de politique au format JSON précise les restrictions relatives à l'URL signée. Cette politique détermine la durée de validité de l'URL. CloudFront renvoie une erreur 403 Access Denied dans l'un des scénarios suivants :

  • Une URL signée est envoyée à une heure supérieure à la valeur Expires d'une URL signée utilisant une politique prédéfinie.
  • Un cookie signé est envoyé à une heure supérieure à la valeur CloudFront-Expires d’un cookie signé utilisant une politique prédéfinie.
  • Une URL signée ou un cookie signé est envoyé à une heure supérieure à la valeur DateLessThan spécifiée dans une politique personnalisée. Ou bien, il est envoyé à une heure inférieure à la valeur DateGreaterThan.

Remarque : Les valeurs Expires, CloudFront-Expires, DateLessThan et DateGreaterThan sont au format horaire Unix (en secondes) et en temps universel coordonné (UTC). Par exemple, le 1er janvier 2013 à 10 h UTC est converti en 1357034400 au format horaire Unix. Si vous utilisez l'heure d'époque, utilisez un entier de 32 bits pour une date ne dépassant pas 2147483647 (19 janvier 2038 à 03:14:07 UTC).

Le paramètre Policy dans une URL signée ou l'attribut CloudFront-Policy dans un cookie signé indique que vous utilisez une politique personnalisée. La déclaration de politique est au format JSON et encodée en base64. Pour connaître la valeur DateLessThan ou DateGreaterThan, utilisez une commande de décodage 64base.

Exemple de politique personnalisée codée en base64 :

eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__

Pour décoder une politique personnalisée au format encodé base64 au format JSON, exécutez la commande Linux suivante. Cet exemple utilise la valeur de l'exemple précédent. Remplacez la valeur de la politique par votre propre valeur de politique personnalisée.

$ echo -n eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__ | base64 -di

Vous recevez un résultat qui ressemble au message suivant :

{ "Statement": [{ "Resource": "http://d111111abcdef8.cloudfront.net/game_download.zip", "Condition": { "IpAddress": { "AWS:SourceIp": "192.0.2.0/24" }, "DateLessThan": { "AWS:EpochTime": 1426500000 } } }] }

Une URL signée ou un cookie signé comporte plusieurs instructions dans la politique

Si plusieurs instructions sont incluses dans une politique prédéfinie ou personnalisée, CloudFront renvoie une erreur 403 Access Denied.

Pour résoudre ce problème, exécutez la commande Linux de la section précédente pour vérifier la déclaration de politique personnalisée. Vérifiez les détails de votre code, puis confirmez qu'une seule instruction est incluse dans la politique prédéfinie ou la politique personnalisée.

Une URL signée ou un cookie signé contient une URL de base incorrecte dans la politique

CloudFront renvoie une erreur 403 Access Denied dans l'un des scénarios suivants :

  • L'URL de base est abrégée (www.example.com) dans la clé Ressource de la déclaration de politique. Utilisez une URL complète (http://www.example.com).
  • L'URL de base ne possède pas de codage de caractères UTF-8.
  • L'URL de base n'inclut pas tous les noms de ponctuation et de paramètres.
  • Le protocole HTTP ou HTTPS de l'URL de base ne correspond pas au protocole utilisé dans une demande qui envoie une URL signée ou des cookies signés.
  • Le nom de domaine de l'URL de base ne correspond pas à l'en-tête de l'hôte que l'agent utilisateur utilise pour envoyer une URL signée ou des cookies signés.
  • La chaîne de requête URL de base contient des caractères qui ne sont pas valides.

La signature d'une URL ou d'un cookie signé est incorrecte dans la politique

CloudFront renvoie une erreur 403 Access Denied dans l'un des scénarios suivants :

  • La déclaration de politique inclut des espaces blancs (y compris des tabulations et des caractères de saut de ligne).
  • La politique prédéfinie ou personnalisée n'est pas mise en forme sous forme de chaîne avant d'être hachée. Cela se produit si vous créez une URL signée ou des cookies signés sans utiliser de kit SDK AWS.
  • La politique n'est pas hachée avant de générer la signature. Cela se produit si vous créez l'URL signée ou des cookies signés sans utiliser de kit SDK AWS.

Pour connaître les meilleures pratiques en matière de signature lors de l'utilisation d'une URL signée ou de cookies signés, consultez la section Exemples de codes pour créer une signature pour une URL signée.

Une URL signée ou des cookies signés ont été envoyé à partir d'une adresse IP ou d'une plage d'adresses IP non autorisée dans la politique personnalisée

CloudFront renvoie une erreur 403 Access Denied dans l'un des scénarios suivants :

  • Une URL signée ou des cookies signés sont envoyés depuis une adresse IP IPv6.
  • L’URL signée ou les cookies signés ne sont pas envoyés à partir d'une adresse IP IPv4 ou d'une plage d'adresses IP IPv4 spécifiée dans la politique personnalisée.

La clé IpAddress est disponible uniquement dans la politique personnalisée qui se trouve dans une URL signée ou un cookie signé. Les adresses IP au format IPv6 ne sont pas prises en charge. Si vous utilisez une politique personnalisée qui inclut IpAddress, n'activez pas le protocole IPv6 pour la distribution.

Un cookie signé n'inclut pas les attributs Domain et Path dans les en-têtes de réponse Set-Cookie

CloudFront renvoie une erreur 403 Access Denied si des cookies sont renvoyés depuis CloudFront mais ne sont pas inclus dans les demandes ultérieures adressées au même domaine. Dans ce cas, vérifiez les attributs Domain et Path des cookies dans l'en-tête de réponse Set-Cookie.

La valeur Domain est le nom de domaine du fichier demandé. Si vous ne spécifiez pas d'attribut Domain, la valeur par défaut est le nom de domaine dans l'URL. Cela s'applique uniquement au nom de domaine spécifié, pas aux sous-domaines. Si vous spécifiez un attribut Domain, il s'applique également aux sous-domaines.

Si vous spécifiez un attribut Domain, le nom de domaine dans l'URL et la valeur de l'attribut Domain doivent correspondre. Vous pouvez spécifier le nom de domaine que CloudFront attribue à votre distribution (par exemple, d111111abcdef8.cloudfront.net), mais vous ne pouvez pas spécifier *.cloudfront.net pour le nom de domaine. Pour utiliser un autre nom de domaine, tel que exemple.com, dans les URL, ajoutez un nom de domaine alternatif à votre distribution.

L'attribut Path est le chemin du fichier demandé. Si vous ne spécifiez pas d'attribut Path, la valeur par défaut est le chemin dans l'URL.

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