Définition de cookies signés utilisant une stratégie personnalisée - Amazon CloudFront

Définition de cookies signés utilisant une stratégie personnalisée

Pour définir un cookie signé qui utilise une stratégie personnalisée, effectuez la procédure suivante.

Pour définir un cookie signé utilisant une stratégie personnalisée

  1. Si vous utilisez .NET ou Java pour créer des URL signées et si vous n'avez pas reformaté la clé privée de votre paire de clés du format par défaut .pem en un format compatible avec .NET ou Java, procédez comme suit : Pour plus d'informations, consultez Reformatage de la clé privée CloudFront (.NET et Java uniquement).

  2. Programmez votre application pour qu'elle envoie trois en-têtes Set-Cookie aux utilisateurs approuvées. Vous avez besoin de trois en-têtes Set-Cookie parce que chaque en-tête Set-Cookie ne peut contenir qu'une seule paire nom-valeur, et qu'un cookie signé CloudFront nécessite trois paires nom-valeur. Les paires nom-valeur sont : CloudFront-Policy, CloudFront-Signature et CloudFront-Key-Pair-Id. Les valeurs doivent être présentes sur la visionneuse avant qu'un utilisateur ne puisse faire la requête d'un fichier dont vous voulez contrôler l'accès.

    Note

    En règle générale, nous recommandons d'exclure les attributs Expires et Max-Age. Cette exclusion conduit le navigateur à supprimer le cookie quand l'utilisateur ferme le navigateur, ce qui réduit la possibilité qu'une personne obtienne un accès non autorisé à votre contenu. Pour plus d'informations, consultez Prévention du mauvais usage des cookies signés.

    Les noms des attributs de cookie sont sensibles à la casse.

    Les sauts de ligne ne sont inclus que pour rendre les attributs plus lisibles.

    Set-Cookie: CloudFront-Policy=base64 encoded version of the policy statement; Domain=optional domain name; Path=/optional directory path; Secure; HttpOnly Set-Cookie: CloudFront-Signature=hashed and signed version of the policy statement; Domain=optional domain name; Path=/optional directory path; Secure; HttpOnly Set-Cookie: CloudFront-Key-Pair-Id=active CloudFront key pair Id for the key pair that you are using to generate the signature; Domain=optional domain name; Path=/optional directory path; Secure; HttpOnly
    (Facultatif) Domain

    Nom de domaine du fichier demandé. Si vous ne spécifiez pas un attribut Domain, la valeur par défaut est le nom de domaine de l'URL et ne s'applique qu'au nom de domaine spécifié, non aux sous-domaines. Si vous spécifiez un attribut Domain, il s'applique aussi aux sous-domaines. Un point devant le nom de domaine (par exemple, Domain=.example.com) est facultatif. De plus, si vous spécifiez un attribut Domain, le nom de domaine de l'URL et la valeur de l'attribut Domain doivent correspondre.

    Vous pouvez spécifier le nom de domaine que CloudFront a affecté à votre distribution (par exemple, d111111abcdef8.cloudfront.net), mais vous ne pouvez pas spécifier *.cloudfront.net pour le nom de domaine.

    Si vous souhaitez utiliser un nom de domaine alternatif tel qu'example.com dans les URL, vous devez ajouter le nom de domaine alternatif à votre distribution, que vous spécifiiez l'attribut Domain ou non. Pour plus d'informations, consultez Noms de domaine alternatifs (CNAME) dans la rubrique Valeurs que vous spécifiez lorsque vous créez ou mettez à jour une distribution.

    (Facultatif) Path

    Chemin d'accès du fichier demandé. Si vous ne spécifiez pas d'attribut Path, la valeur par défaut est le chemin d'accès de l'URL.

    Secure

    Nécessite que l'utilisateur chiffre les cookies avant d'envoyer une demande. Il est recommandé d'envoyer l'en-tête Set-Cookie sur une connexion HTTPS pour garantir que les attributs du cookie sont protégés contre les attaques MITM.

    HttpOnly

    Requiert que l'utilisateur n'envoie le cookie que dans les requêtes HTTP ou HTTPS.

    CloudFront-Policy

    Votre déclaration de stratégie au format JSON, avec suppression des espaces, puis encodage en base64. Pour plus d'informations, consultez Création d'une signature pour un cookie signé qui utilise une stratégie personnalisée.

    La déclaration de stratégie contrôle l'accès qu'un cookie signé accorde à un utilisateur : les fichiers auxquels l'utilisateur peut accéder, une date et une heure d'expiration, une heure et une date (facultatif) auxquelles l'URL devient valide, et (facultatif) une adresse IP ou une plage d'adresses IP autorisée à accéder au fichier.

    CloudFront-Signature

    Version hachée, signée et encodée en base 64 de la déclaration de stratégie JSON. Pour plus d'informations, consultez Création d'une signature pour un cookie signé qui utilise une stratégie personnalisée.

    CloudFront-Key-Pair-Id

    ID d'une paire de clés CloudFront active : par exemple, APKA9ONS7QCOWEXAMPLE. L'ID de la paire de clés CloudFront indique à CloudFront la clé publique à utiliser pour valider le cookie signé. CloudFront compare les informations de la signature avec celles de la déclaration de stratégie pour vérifier que l'URL n'a pas été falsifiée.

    L'ID de paire de clés que vous incluez dans les cookies signés CloudFront doit être associé à un compte AWS appartenant à l'un des utilisateurs de confiance du comportement de cache.

    Pour plus d'informations, consultez Spécification des comptes AWS qui peuvent créer des URL signées et des cookies signés (utilisateurs de confiance).

    Si vous rendez une paire de clés inactive lors de la rotation des paires de clés CloudFront, vous devez mettre à jour votre application pour utiliser une nouvelle paire de clés active pour l'un de vos utilisateurs de confiance. Pour plus d'informations sur la rotation des paires de clés, consultez Rotation de paires de clés CloudFront.

Exemples d'en-tête Set-Cookie d'un cookie signé quand vous utilisez le nom de domaine associé à votre distribution dans les URL de vos fichiers :

Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly Set-Cookie: CloudFront-Key-Pair-Id=APKA9ONS7QCOWEXAMPLE; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly

Exemples d'en-tête Set-Cookie d'un cookie signé quand vous utilisez le nom de domaine alternatif example.org dans les URL de vos fichiers :

Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=example.org; Path=/; Secure; HttpOnly Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=example.org; Path=/; Secure; HttpOnly Set-Cookie: CloudFront-Key-Pair-Id=APKA9ONS7QCOWEXAMPLE; Domain=example.org; Path=/; Secure; HttpOnly

Si vous souhaitez utiliser un nom de domaine alternatif tel qu'example.com dans les URL, vous devez ajouter le nom de domaine alternatif à votre distribution, que vous spécifiiez l'attribut Domain ou non. Pour plus d'informations, consultez Noms de domaine alternatifs (CNAME) dans la rubrique Valeurs que vous spécifiez lorsque vous créez ou mettez à jour une distribution.

Création d'une déclaration de stratégie pour un cookie signé qui utilise une stratégie personnalisée

Pour créer une déclaration de stratégie pour une stratégie personnalisée, effectuez la procédure suivante. Pour obtenir des exemples de déclaration de stratégie qui contrôlent l'accès aux fichiers de différentes façons, consultez Exemple d'une déclaration de stratégie pour un cookie signé qui utilise une stratégie personnalisée.

Pour créer la déclaration de stratégie d'un cookie signé qui utilise une stratégie personnalisée

  1. Construisez la déclaration de stratégie à l'aide du format JSON suivant.

    { "Statement": [ { "Resource":"URL of the file", "Condition":{ "DateLessThan":{"AWS:EpochTime":required ending date and time in Unix time format and UTC}, "DateGreaterThan":{"AWS:EpochTime":optional beginning date and time in Unix time format and UTC}, "IpAddress":{"AWS:SourceIp":"optional IP address"} } } ] }

    Remarques :

  2. Supprimez tous les espaces (tabulations et sauts de ligne inclus) de la déclaration de stratégie. Il se peut que vous ayez à inclure des caractères d'échappement dans la chaîne du code applicatif.

  3. Encodez en base64 la déclaration de stratégie à l'aide de l'encodage MIME base64. Pour plus d'informations, consultez la Section 6.8, Base64 Content-Transfer-Encoding dans RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies.

  4. Remplacez les caractères non valides d'une chaîne de requête d'URL par les caractères valides. Le tableau suivant répertorie les caractères valides et non valides.

    Remplacer ces caractères non valides Par ces caractères valides

    +

    - (trait d'union)

    =

    _ (soulignement)

    /

    ~ (tilde)

  5. Incluez la valeur obtenue dans votre en-tête Set-Cookie après CloudFront-Policy=.

  6. Créez une signature pour l'en-tête Set-Cookie de CloudFront-Signature en hachant, signant et encodant en base64 la déclaration de stratégie. Pour plus d'informations, consultez Création d'une signature pour un cookie signé qui utilise une stratégie personnalisée.

Valeurs que vous spécifiez dans la déclaration de stratégie d'une stratégie personnalisée pour les cookies signés

Lorsque vous créez une déclaration de stratégie pour une stratégie personnalisée, vous spécifiez les valeurs suivantes.

Ressource

L'URL de base incluant vos chaînes de requête, le cas échéant :

http://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes

Important

Si vous omettez le paramètre Resource, les utilisateurs peuvent accéder à tous les fichiers associés à une distribution elle-même associée à la paire de clés que vous utilisez pour créer l'URL signée.

Vous ne pouvez spécifier qu'une seule valeur pour Resource.

Notez bien ce qui suit :

  • Protocole – La valeur doit commencer par http:// ou https://.

  • Paramètres de chaîne de requête – Si vous n'avez aucun paramètre de chaîne de requête, omettez le point d'interrogation.

  • Caractères génériques – Vous pouvez utiliser à tout moment dans la chaîne, le caractère générique qui correspond à zéro caractère ou plus (*) ou celui qui correspond exactement à un seul caractère (?). Par exemple, la valeur :

    http://d111111abcdef8.cloudfront.net/*game_download.zip*

    inclut (par exemple) les fichiers suivants :

    • http://d111111abcdef8.cloudfront.net/game_download.zip

    • http://d111111abcdef8.cloudfront.net/example_game_download.zip?license=yes

    • http://d111111abcdef8.cloudfront.net/test_game_download.zip?license=temp

  • Noms de domaine alternatifs – Si vous spécifiez un nom de domaine alternatif (CNAME) dans l'URL, vous devez le spécifier lorsque vous référencez le fichier dans votre page ou application web. Ne spécifiez pas l'URL Amazon S3 pour le fichier.

DateLessThan

Date et heure d'expiration de l'URL au format horaire Unix (en secondes) et en heure UTC. N'entourez pas la valeur de points d'interrogation.

Par exemple, la date 16 mars 2015 10 h 00 UTC est convertie en 1426500000 au format horaire Unix.

Pour plus d'informations, consultez Quand CloudFront vérifie-t-il la date et l'heure d'expiration d'un cookie signé ?.

DateGreaterThan (facultatif)

(Facultatif) Date et heure de début de l'URL au format horaire Unix (en secondes) et en heure UTC. Les utilisateurs ne sont pas autorisés à accéder au fichier avant la date et l'heure spécifiées. N'entourez pas la valeur de points d'interrogation.

IpAddress (facultatif)

Adresse IP du client formulant la demande GET. Notez bien ce qui suit :

  • Pour autoriser une adresse IP à accéder au fichier, omettez le paramètre IpAddress.

  • Vous pouvez spécifier une adresse IP ou une plage d'adresses IP. Par exemple, vous pouvez définir la stratégie pour autoriser l'accès si l'adresse IP du client figure dans l'une des deux plages distinctes.

  • Pour autoriser l'accès depuis une seule adresse IP, vous spécifiez :

    "Adresse IP IPv4/32"

  • Vous devez spécifier les plages d'adresses IP selon le format IPv4 CIDR standard (par exemple, 192.0.2.0/24). Pour plus d'informations, consultez l'article RFC 4632, Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan, http://tools.ietf.org/html/rfc4632.

    Important

    Les adresses IP au format IPv6, telles que 2001:0db8:85a3:0000:0000:8a2e:0370:7334, ne sont pas prises en charge.

    Si vous utilisez une stratégie personnalisée qui inclut IpAddress, n'activez pas IPv6 pour la distribution. Si vous souhaitez limiter l'accès à un contenu spécifique par adresse IP et prendre en charge les requêtes IPv6 pour les autres contenus, vous pouvez créer deux distributions. Pour plus d'informations, consultez Activation d'IPv6 dans la rubrique Valeurs que vous spécifiez lorsque vous créez ou mettez à jour une distribution.

Exemple d'une déclaration de stratégie pour un cookie signé qui utilise une stratégie personnalisée

Les exemples suivants de déclaration de stratégie montrent comment accéder à un fichier spécifique, à tous les objets d'un répertoire ou à tous les fichiers associés à un ID de paire de clés. Les exemples montrent aussi comment contrôler l'accès depuis une adresse IP individuelle ou une plage d'adresses IP, et comment empêcher les utilisateurs d'employer le cookie signé au-delà d'une date et heure spécifiées.

Si vous copiez et collez l'un de ces exemples, supprimez les espaces (y compris les tabulations et les sauts de ligne), remplacez les valeurs par vos propres valeurs et incluez un caractère de saut de ligne après l'accolade fermante ( } ).

Pour plus d'informations, consultez Valeurs que vous spécifiez dans la déclaration de stratégie d'une stratégie personnalisée pour les cookies signés.

Exemple de déclaration de stratégie : accès à un fichier à partir d'une plage d'adresses IP

L'exemple suivant de stratégie personnalisée dans un cookie signé spécifie qu'un utilisateur peut accéder au fichier http://d111111abcdef8.cloudfront.net/game_download.zip à partir des adresses IP de la plage 192.0.2.0/24 jusqu'au 1er janvier 2013 10 h 00 UTC :

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

Exemple de déclaration de stratégie : accès à tous les fichiers d'un répertoire à partir d'une plage d'adresses IP

L'exemple suivant de stratégie personnalisée vous permet de créer des cookies signés pour n'importe quel fichier du répertoire training, comme indiqué par le caractère générique * du paramètre Resource. Les utilisateurs peuvent accéder au fichier depuis une adresse IP de la plage 192.0.2.0/24 jusqu'au 1er janvier 2013 10 h 00 UTC :

{ "Statement": [ { "Resource":"http://d111111abcdef8.cloudfront.net/training/*", "Condition":{ "IpAddress":{"AWS:SourceIp":"192.0.2.0/24"}, "DateLessThan":{"AWS:EpochTime":1357034400} } } ] }

Chaque cookie signé dans lequel vous utilisez cette stratégie inclut une URL de base qui identifie un fichier spécifique ; par exemple :

http://d111111abcdef8.cloudfront.net/training/orientation.pdf

Exemple de déclaration de stratégie : accès à tous les fichiers associés à un ID de paire de clés à partir d'une adresse IP

L'exemple suivant de stratégie personnalisée vous permet de définir des cookies signés pour tout fichier associé à une distribution, comme indiqué par le caractère générique * du paramètre Resource. L'utilisateur doit employer l'adresse IP 192.0.2.10/32. (La valeur 192.0.2.10/32 en notation CIDR fait référence à une seule adresse IP, 192.0.2.10.) Les fichiers ne sont disponibles qu'entre le 1er janvier 2013 10 h 00 UTC et le 2 janvier 2013 10 h 00 UTC :

{ "Statement": [ { "Resource":"http://*", "Condition":{ "IpAddress":{"AWS:SourceIp":"192.0.2.10/32"}, "DateGreaterThan":{"AWS:EpochTime":1357034400}, "DateLessThan":{"AWS:EpochTime":1357120800} } } ] }

Chaque cookie signé dans lequel vous utilisez cette stratégie inclut une URL de base qui identifie un fichier spécifique d'une distribution CloudFront donnée ; par exemple :

http://d111111abcdef8.cloudfront.net/training/orientation.pdf

Le cookie signé inclut aussi un ID de paire de clés, qui doit être associé à un utilisateur de confiance de la distribution (d111111abcdef8.cloudfront.net) que vous spécifiez dans l'URL de base.

Création d'une signature pour un cookie signé qui utilise une stratégie personnalisée

La signature d'un cookie signé utilisant une stratégie personnalisée est une version hachée, signée et encodée en base64 de la déclaration de stratégie.

Pour plus d'informations et d'exemples sur la façon de hacher, signer et encoder la déclaration de stratégie, consultez :

Pour créer une signature pour un cookie signé en utilisant une stratégie personnalisée

  1. Utilisez la fonction de hachage SHA-1 et RSA pour hacher et signer la déclaration de stratégie JSON que vous avez créée dans la procédure Pour créer la déclaration de stratégie d'une URL signée qui utilise une stratégie personnalisée. Utilisez la version de la déclaration de stratégie qui n'inclut plus d'espaces, mais qui n'a pas encore été encodée en base64.

    Pour la clé privée requise par la fonction de hachage, utilisez la clé privée associée à l'utilisateur de confiance actif.

    Note

    La méthode que vous utilisez pour hacher et signer la déclaration de stratégie dépend du langage de programmation et de la plateforme. Pour un exemple de code, consultez Exemples de code pour la création de la signature d'une URL signée.

  2. Supprimez les espaces (tabulations et sauts de ligne inclus) de la chaîne hachée et signée.

  3. Encodez en base64 la chaîne à l'aide de l'encodage MIME base64. Pour plus d'informations, consultez la Section 6.8, Base64 Content-Transfer-Encoding dans RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies.

  4. Remplacez les caractères non valides d'une chaîne de requête d'URL par les caractères valides. Le tableau suivant répertorie les caractères valides et non valides.

    Remplacer ces caractères non valides Par ces caractères valides

    +

    - (trait d'union)

    =

    _ (soulignement)

    /

    ~ (tilde)

  5. Incluez la valeur obtenue dans l'en-tête Set-Cookie de la paire nom-valeur CloudFront-Signature=, et retournez à Pour définir un cookie signé utilisant une stratégie personnalisée pour ajouter l'en-tête Set-Cookie de CloudFront-Key-Pair-Id.