HSTS trên Amazon CloudFront từ S3 gốc


11

Có thể đặt các tiêu đề HSTS trên bản phân phối Amazon CloudFront từ nguồn gốc S3 không?

Câu trả lời:



10

Một bản cập nhật về điều này ...

Bây giờ các tiêu đề phản hồi HTTP có thể được tùy chỉnh thông qua các chức năng Lambda @ edge. Vui lòng xem http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html để biết tài liệu. Để thử điều này, hãy tạo một hàm lambda mới trong bảng điều khiển AWS. Chọn 'Edge Nodge.js 4.3' cho ngôn ngữ và tìm mẫu tiêu đề đám mây-sửa đổi-phản hồi-tiêu đề. Nếu bạn làm điều này, Lambda sẽ hỏi bạn phân phối và sự kiện CloudFront nào để áp dụng chức năng này. Lưu ý rằng bạn có thể chỉnh sửa hoặc thay đổi điều này bất cứ lúc nào bằng cách chuyển đến tab hành vi Cloudfront.

Đây là một ví dụ chức năng 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);
};

1
Tuyệt vời, sẽ thử nó!
chrisvdb

Tôi tình cờ đọc được cùng một bài báo ... nó có hiệu quả với bạn không? @chrisvdb
Steverino

@Steverino Haven thực sự không đến để dùng thử, nhưng vì chúng tôi chỉ thiết lập một trang web tĩnh thứ hai có thể hưởng lợi từ nó, chúng tôi có thể dùng thử trong trường hợp này. Tôi sẽ báo cáo lại trong trường hợp đó, xin vui lòng làm như vậy. Sẽ rất thú vị để hiểu tác động hiệu suất là tốt.
chrisvdb

1
Cập nhật - hóa ra giới hạn 100 TPS trong phiên bản xem trước hiện tại của Lambda @ Edge là không đủ để phục vụ đáng tin cậy trang web (đơn giản và lưu lượng truy cập thấp) của chúng tôi. Một số tài sản ngẫu nhiên mang lại mã phản hồi 50x.
chrisvdb

1
Định dạng của answer.headers đã thay đổi. Ở trên không còn hoạt động.
Hamish Moffatt

4

Để thêm vào câu trả lời của Andrew:

Tôi vừa thử điều này và một vài lưu ý: Không còn thời gian chạy nodejs cạnh cụ thể nữa, nhưng lambda cần được tạo ở vùng N Virginia và được kích hoạt bởi phản hồi nguồn gốc của đám mây hoặc phản hồi của người xem .

Mã ra khỏi hộp dường như không còn hoạt động nữa. Nó mang lại cho ERR_CONTENT_DECODING_FAILED.

Giải pháp là sử dụng cú pháp json như sau:

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" } ];

Thông tin thêm về các tiêu đề ở đây: infosec.mozilla.org/guferences/web_security
Josh Habdas

1

Đúng, vì Lambda @ Edge thường có sẵn nên họ đã giới hạn nó ở N Virginia và người ta phải chọn Node 6.10 thay vì Node 4.3.

Phần có liên quan của mã của chúng tôi dưới đây (với mục đích của chúng tôi, đây sẽ luôn là một chuyển hướng vĩnh viễn 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);
};

Bằng cách định cấu hình các hành vi khác nhau trên CloudFront, bạn có thể giới hạn các yêu cầu nào sẽ gọi hàm Lambda.


Điều này có nghĩa là phản hồi cho bài viết của Adam Maschek ...
chrisvdb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.