web-dev-qa-db-fra.com

Comment implémenter HTTP Strict Transport Security (HSTS) sur AWS Elastic Load Balancer?

Je souhaite implémenter HSTS dans mon application.

J'ai un ELB terminant SSL et transmettant le trafic à mon application, qui est un serveur Apache utilisé comme proxy inverse.

Je sais que pour implémenter HSTS, je devrais ajouter l'en-tête Strict-Transport-Security à ma demande.

Malheureusement, il semble que je ne puisse pas l'implémenter sur mon serveur Apache car il faudrait l'ajouter à l'hôte virtuel HTTPS et mon Apache n'a que l'hôte virtuel http configuré, car le SSL est terminé sur l'ELB.

Cela signifie que l'ELB devrait ajouter l'en-tête Strict-Transport-Security à la demande lors de sa transmission.

Comment je fais ça? Puis-je ajouter une sorte de politique de sécurité qui ferait cela pour moi?

8
Pedreiro

J'ai demandé au support AWS et la réponse a été que pour le moment ELB ne peut pas ajouter d'en-têtes HSTS aux demandes des clients. J'ai donc décidé de trouver une solution de contournement en utilisant mon serveur Apache. Voici la solution que j'ai trouvée:

HSTS RFC indique que

Un hôte HSTS NE DOIT PAS inclure le champ d'en-tête STS dans les réponses HTTP transmises via un transport non sécurisé.

Ce que j'ai fait ensuite était de définir l'en-tête [~ # ~] après [~ # ~] la redirection http => https dans Apache. Puisque cette redirection a le drapeau [L], cela signifie que la redirection 301 n'inclura pas l'en-tête, mais toute demande https le sera. Ma configuration Apache ressemble à ceci:

<VirtualHost *:80>
...
    #http=>https
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

    #hsts
    Header set Strict-Transport-Security "max-age=31536000"
11
Pedreiro

Si vous travaillez avec Apache 2.4+, vous connaissez peut-être expressions et les directives <If>, <ElseIf>, et <Else>.

J'ai une configuration complexe entre les environnements de développement, de transfert et de production, donc en s'appuyant sur le [L] flag avec le RewriteRule ne le couperait tout simplement pas pour moi.

Cela m'a amené à la solution suivante, que j'ai placée dans mon . Htaccess :

<IfModule mod_headers.c>
    <If "%{REQUEST_SCHEME} == 'https' || %{HTTP:X-Forwarded-Proto} == 'https'">
        Header set Strict-Transport-Security "max-age=31536000"
    </If>
</IfModule>

Cela fonctionne mieux dans mon environnement et je pense qu'il est plus fiable pour répondre à la RFC.

Vous pouvez supprimer le "%{REQUEST_SCHEME} == 'https' partie si vous n'atteignez jamais directement vos instances, mais cela fait partie de mon processus de débogage dans mes environnements de développement.

Un grand merci à Pedreiro pour m'avoir pointé dans la bonne direction pour les spécifications réelles du HSTS RFC.

4
eklingen