HSTS auf Amazon CloudFront von S3 Ursprung

11

Ist es möglich, HSTS-Header in einer Amazon CloudFront-Distribution von einem S3-Ursprung aus festzulegen?

chrisvdb
quelle

Antworten:

10

Ein Update dazu ...

HTTP-Antwortheader können jetzt über Lambda @ edge-Funktionen angepasst werden. Die Dokumentation finden Sie unter http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html . Erstellen Sie dazu eine neue Lambda-Funktion in der AWS-Konsole. Wählen Sie 'Edge Nodge.js 4.3' als Sprache und suchen Sie nach der Vorlage für den Cloudfront-Modify-Response-Header. In diesem Fall werden Sie von Lambda gefragt, auf welche CloudFront-Distribution und welches Ereignis die Funktion angewendet werden soll. Beachten Sie, dass Sie dies jederzeit bearbeiten oder ändern können, indem Sie zur Registerkarte Cloudfront-Verhalten wechseln.

Hier ist ein Beispiel für eine Lambda-Funktion ...

'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
quelle
1
Großartig, werde es ausprobieren!
Chrisvdb
Ich bin über denselben Artikel gestolpert ... hat es bei Ihnen funktioniert? @chrisvdb
Steverino
@Steverino Ich bin noch nicht dazu gekommen, es zu versuchen, aber da wir gerade eine zweite statische Website einrichten, die davon profitieren könnte, könnten wir es in dieser Instanz ausprobieren. Ich melde mich in diesem Fall zurück, bitte auch. Es wäre interessant, auch die Auswirkungen auf die Leistung zu verstehen.
Chrisvdb
1
Update - Es stellt sich heraus, dass das 100-TPS-Limit in der aktuellen Vorschau-Version von Lambda @ Edge nicht ausreicht, um unsere (einfache und verkehrsarme) Website zuverlässig zu bedienen. Einige Assets ergeben zufällig einen 50-fachen Antwortcode.
Chrisvdb
1
Das Format von response.headers hat sich geändert. Das obige funktioniert nicht mehr.
Hamish Moffatt
4

Um Andrews Antwort zu ergänzen:

Ich habe dies und ein paar Anmerkungen gerade ausprobiert: Es gibt keine spezifische Laufzeit für Edge Nodejs mehr, aber das Lambda muss in der Region N Virginia erstellt und durch Cloudfront- Ursprungsantwort oder Viewer-Antwort ausgelöst werden .

Der sofort einsatzbereite Code scheint nicht mehr zu funktionieren. Es gibt ERR_CONTENT_DECODING_FAILED.

Die Lösung besteht darin, die JSON-Syntax wie folgt zu verwenden:

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
quelle
Weitere Informationen zu Headern finden Sie hier: infosec.mozilla.org/guidelines/web_security
Josh Habdas
1

Richtig, da Lambda @ Edge allgemein verfügbar ist, haben sie es auf N Virginia beschränkt und man muss Knoten 6.10 anstelle von Knoten 4.3 wählen.

Der relevante Teil unseres Codes unten (für unseren Zweck ist dies immer eine permanente 302-Weiterleitung):

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

Durch Konfigurieren verschiedener Verhaltensweisen in CloudFront können Sie einschränken, welche Anforderungen die Lambda-Funktion aufrufen.

chrisvdb
quelle
Dies war als Antwort auf Adam
Mascheks