HSTS sur Amazon CloudFront d'origine S3

11

Est-il possible de définir des en-têtes HSTS sur une distribution Amazon CloudFront à partir d'une origine S3?

chrisvdb
la source

Réponses:

10

Une mise à jour à ce sujet ...

Les en-têtes de réponse HTTP peuvent désormais être personnalisés via les fonctions Lambda @ edge. Veuillez consulter http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html pour la documentation. Pour essayer cela, créez une nouvelle fonction lambda dans la console AWS. Choisissez 'Edge Nodge.js 4.3' pour la langue et recherchez le modèle d'en-tête cloudfront-modify-response-response. Si vous faites cela, Lambda vous demandera à quelle distribution CloudFront et à quel événement appliquer la fonction. Notez que vous pouvez modifier ou modifier cela à tout moment en accédant à l'onglet de comportement Cloudfront.

Voici un exemple de fonction 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
la source
1
Super, va l'essayer!
chrisvdb
Je suis tombé sur le même article ... ça a marché pour vous? @chrisvdb
Steverino
@Steverino n'a pas vraiment essayé, mais comme nous sommes en train de créer un deuxième site Web statique qui pourrait en bénéficier, nous pourrions l'essayer sur cette instance. Je ferai rapport dans ce cas, faites-le aussi. Il serait également intéressant de comprendre l'impact sur les performances.
chrisvdb
1
Mise à jour - il s'avère que la limite de 100 TPS dans la version d'aperçu actuelle de Lambda @ Edge n'est pas suffisante pour servir de manière fiable notre site Web (simple et à faible trafic). Certains actifs fournissent au hasard un code de réponse 50x.
chrisvdb
1
Le format de response.headers a changé. Ce qui précède ne fonctionne plus.
Hamish Moffatt le
4

Pour ajouter à la réponse d'Andrew:

Je viens d'essayer ceci et quelques notes: il n'y a plus d'exécution de nodejs de bord spécifique, mais le lambda doit être créé dans la région de Virginie du Nord et déclenché par la réponse d' origine ou la réponse du visualiseur cloudfront .

Le code sorti de la boîte ne semble plus fonctionner. Il donne ERR_CONTENT_DECODING_FAILED.

La solution consiste à utiliser la syntaxe json comme suit:

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
la source
Plus d'informations sur les en-têtes ici: infosec.mozilla.org/guidelines/web_security
Josh Habdas
1

C'est exact, étant donné que Lambda @ Edge est généralement disponible, ils l'ont limité à N Virginia et il faut choisir le nœud 6.10 plutôt que le nœud 4.3.

La partie pertinente de notre code ci-dessous (pour notre objectif, ce sera toujours une redirection permanente 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);
};

En configurant différents comportements sur CloudFront, vous pouvez limiter les requêtes qui appellent la fonction Lambda.

chrisvdb
la source
Cela était censé être une réponse au post d'Adam Maschek ...
chrisvdb