HSTS на Amazon CloudFront от источника S3

Ответы:

10

Обновление об этом ...

Заголовки HTTP-ответа теперь можно настраивать с помощью функций Lambda @ edge. Пожалуйста, смотрите http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html для документации. Чтобы попробовать это, создайте новую лямбда-функцию в консоли AWS. Выберите «Edge Nodge.js 4.3» для языка и найдите шаблон cloudfront-modify-response-header. Если вы сделаете это, Lambda спросит вас, к какому распределению и событию CloudFront применить функцию. Обратите внимание, что вы можете изменить или изменить это в любое время, перейдя на вкладку поведения Cloudfront.

Вот пример лямбда-функции ...

'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);
};
Эндрю Элмхорст
источник
1
Отлично, попробую!
chrisvdb
Я наткнулся на ту же статью ... это сработало для вас? @chrisvdb
Steverino
@Steverino На самом деле не пытались, но, поскольку мы только настраиваем второй статический веб-сайт, который мог бы извлечь из этого пользу, мы могли бы попробовать его в этом случае. Я сообщу в этом случае, пожалуйста, сделайте это тоже. Было бы интересно понять влияние производительности также.
chrisvdb
1
Обновление - оказывается, что ограничение 100 TPS в текущей превью-версии Lambda @ Edge недостаточно для надежного обслуживания нашего (простого и с низким трафиком) веб-сайта. Некоторые активы случайным образом дают 50-кратный код ответа.
chrisvdb
1
Формат response.headers изменился. Вышеуказанное больше не работает.
Хэмиш Моффатт
4

Чтобы добавить к ответу Андрея:

Я только что попробовал это и пару замечаний: больше нет определенной среды выполнения ребра nodejs, но лямбда должна быть создана в регионе Северная Вирджиния и инициирована ответом источника или ответом зрителя .

Код из коробки, кажется, больше не работает. Это дает ERR_CONTENT_DECODING_FAILED.

Решение состоит в том, чтобы использовать синтаксис JSON следующим образом:

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" } ];
Адам Мащек
источник
Больше информации о заголовках здесь: infosec.mozilla.org/guidelines/web_security
Джош Хабдас
1

Правильно, поскольку Lambda @ Edge обычно доступен, они ограничивают его N Вирджинией, и нужно выбрать Узел 6.10, а не Узел 4.3.

Соответствующая часть нашего кода ниже (для нашей цели это всегда будет постоянный редирект 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);
};

Настраивая различные варианты поведения в CloudFront, вы можете ограничить, какие запросы будут вызывать функцию Lambda.

chrisvdb
источник
Это означало ответ на пост Адама Мащека ...
chrisvdb