HSTS en Amazon CloudFront desde el origen S3

11

¿Es posible establecer encabezados HSTS en una distribución de Amazon CloudFront desde un origen S3?

chrisvdb
fuente

Respuestas:

10

Una actualización sobre esto ...

Los encabezados de respuesta HTTP ahora se pueden personalizar mediante las funciones de Lambda @ edge. Consulte http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html para obtener la documentación. Para probar esto, cree una nueva función lambda en la consola de AWS. Elija 'Edge Nodge.js 4.3' para el idioma y busque la plantilla de cabecera de modificación de frente de nube. Si hace esto, Lambda le preguntará a qué distribución y evento de CloudFront aplicar la función. Tenga en cuenta que puede editar o cambiar esto en cualquier momento accediendo a la pestaña de comportamiento de Cloudfront.

Aquí hay un ejemplo de función 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
fuente
1
Genial, lo probaré!
chrisvdb
Me topé con el mismo artículo ... ¿Te funcionó? @chrisvdb
Steverino
@Steverino En realidad no he intentado probarlo, pero como estamos configurando un segundo sitio web estático que podría beneficiarse, podríamos probarlo en esta instancia. Informaré de nuevo en ese caso, por favor hazlo también. Sería interesante comprender el impacto en el rendimiento también.
chrisvdb
1
Actualización: resulta que el límite de 100 TPS en la versión de vista previa actual de Lambda @ Edge no es suficiente para servir de manera confiable a nuestro sitio web (simple y de bajo tráfico). Algunos activos producen aleatoriamente un código de respuesta 50x.
chrisvdb
1
El formato de response.headers ha cambiado. Lo anterior ya no funciona.
Hamish Moffatt
4

Para agregar a la respuesta de Andrew:

Acabo de probar esto y un par de notas: ya no hay un tiempo de ejecución de edgejs de edge específico, pero la lambda necesita ser creada en la región de N Virginia y activada por la respuesta de origen frente a la nube o la respuesta del espectador .

El código fuera de la caja ya no parece funcionar. Da ERR_CONTENT_DECODING_FAILED.

La solución es usar la sintaxis json de la siguiente manera:

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
fuente
Más información sobre encabezados aquí: infosec.mozilla.org/guidelines/web_security
Josh Habdas
1

Correcto, dado que Lambda @ Edge está generalmente disponible, lo restringieron a N Virginia y uno tiene que elegir el Nodo 6.10 en lugar del Nodo 4.3.

La parte relevante de nuestro código a continuación (para nuestro propósito, esta siempre será una redirección 302 permanente):

'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);
};

Al configurar diferentes comportamientos en CloudFront, puede limitar qué solicitudes llamarán a la función Lambda.

chrisvdb
fuente
Esto se entiende como respuesta al mensaje de Adam Maschek ...
chrisvdb