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?
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"
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.