HSTS no Amazon CloudFront da origem S3

11

É possível definir cabeçalhos HSTS em uma distribuição Amazon CloudFront de uma origem S3?

chrisvdb
fonte

Respostas:

10

Uma atualização sobre isso ...

Os cabeçalhos de resposta HTTP agora podem ser personalizados através das funções Lambda @ edge. Consulte http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html para obter a documentação. Para tentar isso, crie uma nova função lambda no console da AWS. Escolha 'Edge Nodge.js 4.3' para o idioma e procure o modelo cloudfront-modify-response-header. Se você fizer isso, o Lambda perguntará a que distribuição e evento do CloudFront aplicar a função. Observe que você pode editar ou alterar isso a qualquer momento, acessando a guia de comportamento do Cloudfront.

Aqui está um exemplo da função lambda ...

'use strict';
exports.handler = (event, context, callback) => {

    const response = event.Records[0].cf.response;
    response.headers['Strict-Transport-Security'] = 'max-age=2592000; includeSubDomains';

    callback(null, response);
};
Andrew Elmhorst
fonte
1
Ótimo, vai experimentar!
chrisvdb
Eu tropecei no mesmo artigo ... funcionou para você? @chrisvdb
Steverino
@Steverino Na verdade, não tentamos, mas como estamos apenas configurando um segundo site estático que poderia se beneficiar dele, podemos testá-lo nesta instância. Nesse caso, informarei também. Seria interessante entender também o impacto no desempenho.
Chrisvdb
1
Atualização - verifica-se que o limite de 100 TPS na versão de visualização atual do Lambda @ Edge não é suficiente para servir de forma confiável nosso site (simples e de baixo tráfego). Alguns ativos geram aleatoriamente um código de resposta 50x.
chrisvdb
1
O formato do response.headers foi alterado. O exposto acima não funciona mais.
Hamish Moffatt
4

Para adicionar à resposta de Andrew:

Eu apenas tentei isso e algumas notas: Não há mais tempo de execução específico do nodejs de borda, mas o lambda precisa ser criado na região da Virgínia do Norte e acionado pela resposta de origem ou resposta do visualizador da nuvem .

O código pronto para uso não parece mais funcionar. Dá ERR_CONTENT_DECODING_FAILED.

A solução é usar a sintaxe json da seguinte maneira:

response.headers['Strict-Transport-Security'] = [ { key: 'Strict-Transport-Security', value: "max-age=31536000; includeSubdomains; preload" } ];
response.headers['X-Content-Type-Options']    = [ { key: 'X-Content-Type-Options', value: "nosniff" } ];
Adam Maschek
fonte
Mais informações sobre os cabeçalhos aqui: infosec.mozilla.org/guidelines/web_security
Josh Habdas
1

Correto, como o Lambda @ Edge está geralmente disponível, eles o restringem ao N Virginia e é preciso escolher o Nó 6.10 em vez do Nó 4.3.

A parte relevante do nosso código abaixo (para nosso objetivo, sempre será um redirecionamento permanente 302):

'use strict';
exports.handler = (event, context, callback) => {

  var request = event.Records[0].cf.request;
  const response = {
    status: '302',
    statusDescription: '302 Found',
    httpVersion: request.httpVersion,
    headers: {
      Location: [
        {
            "key":"Location",
            "value":"someURL"
        }
      ],
      'Strict-Transport-Security': [
        {
          "key":"Strict-Transport-Security",
          "value":'max-age=63072000; includeSubDomains; preload'
        }
      ],
    },
  };
  callback(null, response);
};

Ao configurar comportamentos diferentes no CloudFront, você pode limitar quais solicitações chamarão a função Lambda.

chrisvdb
fonte
Este foi concebido como resposta ao post de Adam Maschek ...
chrisvdb