HSTS di Amazon CloudFront dari asal S3

11

Apakah mungkin untuk menetapkan header HSTS pada distribusi Amazon CloudFront dari sumber S3?

chrisvdb
sumber

Jawaban:

10

Pembaruan tentang ini ...

Header respons HTTP sekarang dapat dikustomisasi melalui fungsi Lambda @ edge. Silakan lihat http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html untuk dokumentasi. Untuk mencoba ini, buat fungsi lambda baru di konsol AWS. Pilih 'Edge Nodge.js 4.3' untuk bahasa ini dan cari templat header-ubah-respons-muka cloudfront. Jika Anda melakukan ini, Lambda akan menanyakan kepada Anda distribusi dan acara CloudFront mana untuk menerapkan fungsinya. Perhatikan bahwa Anda dapat mengedit atau mengubah ini kapan saja dengan masuk ke tab perilaku Cloudfront.

Berikut ini contoh fungsi 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
sumber
1
Bagus, akan mencobanya!
chrisvdb
Saya menemukan artikel yang sama ... apakah itu berhasil untuk Anda? @chrisvdb
Steverino
@Steverino Belum benar-benar datang untuk mencobanya, tetapi karena kami baru saja membuat situs web statis kedua yang dapat mengambil manfaat darinya, kami mungkin mencobanya dalam contoh ini. Saya akan melaporkan kembali dalam kasus itu, tolong lakukan juga. Akan menarik untuk memahami dampak kinerja juga.
chrisvdb
1
Pembaruan - ternyata batas 100 TPS dalam versi pratinjau terkini dari Lambda @ Edge tidak cukup untuk melayani situs web kami (sederhana dan lalu lintas rendah) dengan andal. Beberapa aset secara acak menghasilkan kode respons 50x.
chrisvdb
1
Format response.headers telah berubah. Di atas tidak lagi berfungsi.
Hamish Moffatt
4

Untuk menambah jawaban Andrew:

Saya baru saja mencoba ini dan beberapa catatan: Tidak ada lagi edge nodejs runtime yang spesifik, tetapi lambda perlu dibuat di wilayah N Virginia dan dipicu oleh respons asal-usul cloudfront atau respons penampil .

Kode di luar kotak sepertinya tidak berfungsi lagi. Itu memberi ERR_CONTENT_DECODING_FAILED.

Solusinya adalah menggunakan sintaks json sebagai berikut:

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
sumber
Info lebih lanjut tentang header di sini: infosec.mozilla.org/guidelines/web_security
Josh Habdas
1

Benar, karena Lambda @ Edge tersedia secara umum, mereka membatasi untuk N Virginia dan kita harus memilih Node 6.10 daripada Node 4.3.

Bagian yang relevan dari kode kami di bawah ini (untuk tujuan kami ini akan selalu menjadi 302 redirect permanen):

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

Dengan mengkonfigurasi berbagai perilaku di CloudFront, Anda dapat membatasi permintaan mana yang akan memanggil fungsi Lambda.

chrisvdb
sumber
Ini dimaksudkan sebagai tanggapan terhadap pos Adam Maschek ...
chrisvdb