HSTS na Amazon CloudFront od S3

11

Czy można ustawić nagłówki HSTS w dystrybucji Amazon CloudFront pochodzącej z S3?

chrisvdb
źródło

Odpowiedzi:

10

Aktualizacja tego ...

Nagłówki odpowiedzi HTTP można teraz dostosowywać za pomocą funkcji Lambda @ edge. Dokumentacja znajduje się na stronie http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html . Aby tego spróbować, utwórz nową funkcję lambda w konsoli AWS. Wybierz „Edge Nodge.js 4.3” jako język i poszukaj szablonu nagłówka cloudfront-modyfikuj-odpowiedź-odpowiedź. Jeśli to zrobisz, Lambda zapyta Cię, do której dystrybucji CloudFront i zdarzenia chcesz zastosować tę funkcję. Pamiętaj, że możesz to zmienić lub zmienić w dowolnym momencie, przechodząc do karty Zachowanie w Cloudfront.

Oto przykładowa funkcja 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
źródło
1
Świetnie, wypróbuję to!
chrisvdb
Natknąłem się na ten sam artykuł ... czy to zadziałało dla ciebie? @chrisvdb
Steverino
@Steverino nie przyszło na próbę, ale ponieważ właśnie zakładamy drugą statyczną stronę internetową, która mogłaby z niej skorzystać, możemy wypróbować ją w tym przypadku. Zgłosię się w tej sprawie, proszę również to zrobić. Byłoby również interesujące, aby zrozumieć wpływ na wydajność.
chrisvdb
1
Aktualizacja - okazuje się, że limit 100 TPS w obecnej wersji zapoznawczej Lambda @ Edge nie jest wystarczający, aby niezawodnie obsługiwać naszą (prostą i mało obciążoną) stronę internetową. Niektóre zasoby losowo generują 50-krotny kod odpowiedzi.
chrisvdb,
1
Format odpowiedzi. Nagłówki zmienił się. Powyższe nie działa.
Hamish Moffatt
4

Aby dodać do odpowiedzi Andrew:

Właśnie wypróbowałem to i kilka notatek: Nie ma już specyficznego środowiska uruchomieniowego nodejs, ale lambda musi zostać utworzona w regionie N Wirginii i uruchomiona przez chmurową odpowiedź źródłową lub odpowiedź widza .

Kod po wyjęciu z pudełka już nie działa. Daje ERR_CONTENT_DECODING_FAILED.

Rozwiązaniem jest użycie składni json w następujący sposób:

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
źródło
Więcej informacji na temat nagłówków tutaj: infosec.mozilla.org/guidelines/web_security
Josh Habdas
1

Poprawnie, ponieważ Lambda @ Edge jest ogólnie dostępna, ograniczyli ją do N Wirginii i należy wybrać Węzeł 6.10 zamiast Węzła 4.3.

Odpowiednia część naszego kodu poniżej (dla naszego celu będzie to zawsze stałe przekierowanie 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);
};

Konfigurując różne zachowania na CloudFront, możesz ograniczyć liczbę żądań wywołujących funkcję Lambda.

chrisvdb
źródło
Miało to być odpowiedzią na post Adama Mascheka ...
chrisvdb