Definir signed cookies usando uma política personalizada - Amazon CloudFront

Definir signed cookies usando uma política personalizada

Para definir um signed cookie que usa uma política personalizada, execute as etapas a seguir.

Para definir um signed cookie usando uma política personalizada

  1. Se você estiver usando o .NET ou Java para criar signed URLs e não tiver reformatado a chave privada do seu par de chaves para do formato padrão .pem para um formato compatível com o .NET ou Java, faça isso agora. Para obter mais informações, consulte Reformatar a chave privada (somente .NET e Java).

  2. Programe seu aplicativo para enviar três cabeçalhos Set-Cookie para os visualizadores aprovados. São necessários três cabeçalhos Set-Cookie porque cada cabeçalho Set-Cookie pode conter somente um par de nome/valor, e um signed cookie do CloudFront requer três pares. Os pares de nome-valor são: CloudFront-Policy, CloudFront-Signature e CloudFront-Key-Pair-Id. Os valores devem estar presentes no visualizador antes de um usuário fazer a primeira solicitação de um arquivo ao qual você deseja controlar o acesso.

    nota

    Em geral, recomendamos que você exclua os atributos Expires e Max-Age. Isso faz com que o navegador exclua o cookie quando o usuário fecha o navegador, diminuindo a possibilidade de alguém obter acesso não autorizado ao seu conteúdo. Para obter mais informações, consulte Evitar o uso indevido de signed cookies.

    Os nomes dos atributos de cookie fazem distinção entre letras maiúsculas e minúsculas.

    As quebras de linha são incluídas apenas para tornar os atributos mais legíveis.

    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=public key ID for the CloudFront public key whose corresponding private key you're using to generate the signature; Domain=optional domain name; Path=/optional directory path; Secure; HttpOnly
    (Opcional) Domain

    O nome de domínio do arquivo solicitado. Se você não especificar um atributo Domain, o valor padrão será o nome de domínio do URL, e ele se aplica apenas ao nome de domínio em questão, não aos subdomínios. Se você especificar um atributo Domain, ele também será aplicado aos subdomínios. Um ponto inicial no nome de domínio (por exemplo, Domain=.example.com) é opcional. Além disso, se você especificar um atributo Domain, o nome de domínio do URL e o valor do atributo Domain deverão ser correspondentes.

    É possível especificar o nome de domínio atribuído pelo CloudFront à sua distribuição, por exemplo, d111111abcdef8.cloudfront.net, mas é possível especificar *.cloudfront.net para o nome de domínio.

    Se você quiser usar um nome de domínio alternativo, como example.com nos URLs, deverá adicioná-lo à sua distribuição, independentemente de especificá-lo no atributo Domain ou não. Para obter mais informações, consulte Nomes de domínio alternativos (CNAMEs) no tópico Valores especificados ao criar ou atualizar uma distribuição.

    (Opcional) Path

    O caminho do arquivo solicitado. Se você não especificar um atributo Path, o valor padrão será o caminho do URL.

    Secure

    Exige que o visualizador criptografe os cookies antes de enviar uma solicitação. Recomendamos que você envie o cabeçalho Set-Cookie por uma conexão HTTPS para garantir que os atributos de cookie estejam protegidos de ataques a intermediários.

    HttpOnly

    Exige que o visualizador envie o cookie apenas em solicitações HTTP ou HTTPS.

    CloudFront-Policy

    Sua declaração de política no formato JSON, sem espaços em branco e com codificação base64. Para obter mais informações, consulte Criar uma assinatura para um signed cookie que usa uma política personalizada.

    A declaração de política controla o acesso que um signed cookie concede a um usuário. Ela inclui os arquivos que o usuário pode acessar, uma data e hora de expiração, uma data e hora opcionais em que o URL se torna válido e um endereço IP opcional ou intervalo de endereços IP que tenham permissão para acessar o arquivo.

    CloudFront-Signature

    Uma versão assinada, com hash e codificação base64 da declaração de política do JSON. Para obter mais informações, consulte Criar uma assinatura para um signed cookie que usa uma política personalizada.

    CloudFront-Key-Pair-Id

    O ID de uma chave pública do CloudFront, por exemplo, K2JCJMDEHXQW5F. O ID da chave pública informa ao CloudFront qual chave pública deve ser usada para validar o signed URL. O CloudFront compara as informações da assinatura com as informações da declaração de política para verificar se o URL não foi adulterado.

    Essa chave pública deve pertencer a um grupo de chaves que seja um assinante confiável na distribuição. Para obter mais informações, consulte Especificar os assinantes que podem criar signed URLs e cookies.

Exemplos de cabeçalho Set-Cookie de um signed cookie quando você estiver usando o nome de domínio associado à sua distribuição nos URLs dos seus arquivos:

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=K2JCJMDEHXQW5F; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly

Exemplos de cabeçalho Set-Cookie de um signed cookie quando você estiver usando o nome de domínio alternativo example.org nos URLs dos seus arquivos:

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=K2JCJMDEHXQW5F; Domain=example.org; Path=/; Secure; HttpOnly

Se você quiser usar um nome de domínio alternativo, como example.com nos URLs, deverá adicioná-lo à sua distribuição, independentemente de especificá-lo no atributo Domain ou não. Para obter mais informações, consulte Nomes de domínio alternativos (CNAMEs) no tópico Valores especificados ao criar ou atualizar uma distribuição.

Criar uma declaração de política para um signed cookie que usa uma política personalizada

Para criar uma declaração de política para uma política personalizada, conclua as etapas a seguir. Para obter vários exemplos de declaração de política que controlam o acesso a arquivos de diversas formas, consulte Exemplos de declaração de política para um signed cookie que usa uma política personalizada.

Para criar a declaração de política para um signed cookie que usa uma política personalizada

  1. Crie a declaração de política usando o formato JSON a seguir.

    { "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" } } } ] }

    Observe o seguinte:

    • Você pode incluir apenas uma instrução.

    • Use a codificação de caracteres UTF-8.

    • Inclua todas as pontuações e nomes de parâmetro exatamente como especificado. Abreviações de nomes de parâmetro não são aceitas.

    • A ordem dos parâmetros na seção Condition não é importante.

    • Para obter informações sobre os valores de Resource, DateLessThan, DateGreaterThan e IpAddress, consulte Valores especificados na declaração de uma política personalizada para signed cookies.

  2. Remova todas os espaços em branco (inclusive caracteres de nova linha e de tabulação) da declaração de política. Pode ser necessário incluir caracteres de escape na string do código do aplicativo.

  3. Codifique a declaração de política usando codificação base64 MIME. Para obter mais informações, consulte Section 6.8, Base64 Content-Transfer-Encoding em RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies.

  4. Substitua os caracteres inválidos da query string de um URL por caracteres válidos. A tabela a seguir indica os caracteres válidos e inválidos.

    Substitua esses caracteres inválidos Por esses caracteres válidos

    +

    - (hífen)

    =

    _ (sublinhado)

    /

    ~ (til)

  5. Inclua o valor resultante em seu cabeçalho Set-Cookie depois de CloudFront-Policy=.

  6. Crie uma assinatura para o cabeçalho Set-Cookie em CloudFront-Signature adicionando hash, assinando e codificando em base64 a declaração de política. Para obter mais informações, consulte Criar uma assinatura para um signed cookie que usa uma política personalizada.

Valores especificados na declaração de uma política personalizada para signed cookies

Ao criar uma declaração de política para uma política personalizada, especifique os valores a seguir.

Recurso

O URL base, inclusive suas query strings, se houver:

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

Importante

Se você omitir o parâmetro Resource, os usuários poderão acessar todos os arquivos associados a qualquer distribuição associada ao par de chaves usado para criar o signed URL.

Você pode especificar apenas um valor para Resource.

Observe o seguinte:

  • Protocolo: o valor deve começar com http:// ou https://.

  • Parâmetros de query string :se você não tiver query strings, omita o ponto de interrogação.

  • Curingas: é possível usar o caractere curinga que corresponde a zero ou mais caracteres (*) ou o caractere curinga que corresponde a exatamente um caractere (?) em qualquer lugar na string. Por exemplo, o valor:

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

    incluiria os seguintes arquivos:

    • 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

  • Nomes de domínio alternativos: se especificar um nome de domínio alternativo (CNAME) no URL, você deverá especificá-lo ao fazer referência ao arquivo na sua página da web ou aplicação. Não especifique o URL do Amazon S3 para o arquivo.

DateLessThan

A data e hora de expiração do URL no formato de hora do Unix (em segundos) e no Tempo Universal Coordenado (UTC). Não coloque os valores entre aspas.

Por exemplo, 16 de março de 2015, 10h UTC é convertido para 1426500000 no formato de hora do Unix.

Para obter mais informações, consulte Quando o CloudFront verifica a data e hora de expiração de um signed cookie?.

DateGreaterThan (opcional)

Uma data e hora de início opcional do URL no formato de hora do Unix (em segundos) e no Tempo Universal Coordenado (UTC). Os usuários não podem acessar o arquivo antes da data e hora especificadas. Não coloque os valores entre aspas.

IpAddress (opcional)

O endereço IP do cliente que está fazendo a solicitação GET. Observe o seguinte:

  • Para permitir o acesso de qualquer endereço IP ao arquivo, omita o parâmetro IpAddress.

  • Você pode especificar um ou vários endereços IP. Por exemplo, você não pode definir que a política permita o acesso se o endereço IP do cliente estiver em um de dois intervalos separados.

  • Para permitir o acesso de um único endereço IP, especifique:

    "IPv4 IP address/32"

  • Você deve especificar os intervalos de endereço IP no formato CIDR IPv4 padrão (por exemplo, 192.0.2.0/24). Para obter mais informações, acesse a RFC 4632, Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan, https://tools.ietf.org/html/rfc4632.

    Importante

    Endereços IP no formato IPv6, como 2001:0db8:85a3:0000:0000:8a2e:0370:7334, não são compatíveis.

    Se você estiver usando uma política personalizada que inclui IpAddress, não permita o IPv6 para a distribuição. Se você quiser restringir o acesso a um conteúdo por endereço IP e oferecer suporte a solicitações IPv6 para outro tipo de conteúdo, crie duas distribuições. Para obter mais informações, consulte Enable IPv6 no tópico Valores especificados ao criar ou atualizar uma distribuição.

Exemplos de declaração de política para um signed cookie que usa uma política personalizada

Os exemplos de declaração de política a seguir mostram como controlar o acesso a um arquivo específico, todos os arquivos de um diretório ou todos os arquivos associados a um ID de par de chaves. Os exemplos também mostram como controlar o acesso de um único endereço IP ou um intervalo de endereços IP e como evitar que os usuários usem o signed cookie após a data e hora especificadas.

Se você copiar e colar qualquer um desses exemplos, remova os espaços em branco (inclusive caracteres de nova linha e de tabulação), substitua os valores pelos seus próprios valores e inclua um caractere de nova linha após a chave de fechamento ( } ).

Para obter mais informações, consulte Valores especificados na declaração de uma política personalizada para signed cookies.

Exemplo de declaração de política: acessar um arquivo de um intervalo de endereços IP

O exemplo a seguir de política personalizada em um signed cookie especifica que um usuário pode acessar o arquivo http://d111111abcdef8.cloudfront.net/game_download.zip de endereços IP no intervalo 192.0.2.0/24 até 1º de janeiro de 2013, 10h UTC:

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

Exemplo de declaração de política: acessar todos os arquivos de um diretório de um intervalo de endereços IP

O exemplo a seguir de política personalizada permite criar signed cookies para qualquer arquivo no diretório training, conforme indicado pelo caractere curinga "*" no parâmetro Resource. Os usuários podem acessar o arquivo de um endereço IP no intervalo 192.0.2.0/24 até 1º de janeiro de 2013, 10h UTC:

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

Cada signed cookie em que você usa essa política inclui um URL base que identifica um arquivo específico, por exemplo:

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

Exemplo de declaração de política: acessar todos os arquivos associados a um ID de par de chaves de um endereço IP

O exemplo a seguir de política personalizada permite definir signed cookies para qualquer arquivo associado a qualquer distribuição, conforme indicado pelo caractere curinga "*" no parâmetro Resource. O usuário deve usar o endereço IP 192.0.2.10/32. (O valor 192.0.2.10/32 na notação CIDR se refere a um único endereço IP, 192.0.2.10.) Os arquivos estão disponíveis apenas de 1º de janeiro de 2013, 10h UTC, a 2 de janeiro de 2013, 10h UTC:

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

Cada signed cookie em que você usa essa política inclui um URL base que identifica um arquivo específico em uma distribuição específica do CloudFront, por exemplo:

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

O signed cookie também inclui o ID de um par de chaves, que deve estar associado a um grupo de chaves confiáveis na distribuição (d111111abcdef8.cloudfront.net) especificada no URL base.

Criar uma assinatura para um signed cookie que usa uma política personalizada

A assinatura de um signed cookie que usa uma política personalizada é uma versão da declaração de política com hash, assinada e codificada em base64.

Para obter mais informações e exemplos de como adicionar hash, assinar e codificar a declaração de política, consulte:

Para criar uma assinatura para um signed cookie usando uma política personalizada

  1. Use a função de hash SHA-1 e o RSA para assinar e adicionar um hash à declaração de política do JSON criada no procedimento Para criar a declaração de política para um signed URL que usa uma política personalizada. Use a versão da declaração de política que não inclui mais espaços em branco, mas que ainda não foi codificada em base64.

    Para a chave privada exigida pela função hash, use uma chave privada que tenha a chave pública em um grupo de chaves confiáveis ativo para a distribuição.

    nota

    O método usado para assinar e adicionar um hash à declaração de política depende da sua linguagem de programação e plataforma. Para obter o código de exemplo, consulte Exemplos de código para criar uma assinatura para um signed URL.

  2. Remova os espaços em branco (inclusive caracteres de nova linha e de tabulação) da string assinada e com hash.

  3. Codifique a string usando codificação base64 MIME. Para obter mais informações, consulte Section 6.8, Base64 Content-Transfer-Encoding em RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies.

  4. Substitua os caracteres inválidos da query string de um URL por caracteres válidos. A tabela a seguir indica os caracteres válidos e inválidos.

    Substitua esses caracteres inválidos Por esses caracteres válidos

    +

    - (hífen)

    =

    _ (sublinhado)

    /

    ~ (til)

  5. Inclua o valor resultante no cabeçalho Set-Cookie para o par de nome-valor CloudFront-Signature= e volte para Para definir um signed cookie usando uma política personalizada adicionar o cabeçalho Set-Cookie em CloudFront-Key-Pair-Id.