I would like to implement HSTS to my application.
I have an ELB terminating SSL and forwarding the traffic to my application, which is an apache server used as reverse proxy.
I know that in order to implement HSTS, I would need to add the header Strict-Transport-Security to my request.
Unfortunately, it seems that I cannot implement it on my Apache server as it would have to be added to the HTTPS Virtual Host and my Apache only has the http virtual host configured, since the SSL is terminated on the ELB.
That means that the ELB would have to add the header Strict-Transport-Security to the request when it pass it forward.
How do I do that? Can I add some sort of security policy that would do that for me?
I asked the AWS Support and the answer was that at the moment ELB cannot add HSTS headers on the requests from the clients. So, I decided to find a workaround using my Apache server. Here is the solution I found:
The HSTS RFC states that
An HSTS Host MUST NOT include the STS header field in HTTP responses conveyed over non-secure transport.
What I did then was to set the header AFTER the http=>https redirection in Apache. Since this redirection has the flag [L], that means that the 301 redirection will not include the header, but any https request will. My apache config looks like this:
<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"