HSTSをアプリケーションに実装したいと思います。
ELBでSSLを終了し、トラフィックをアプリケーションに転送します。これは、リバースプロキシとして使用されるApacheサーバーです。
HSTSを実装するには、リクエストにヘッダーStrict-Transport-Securityを追加する必要があることを知っています。
ELBでSSLが終了しているため、HTTPS仮想ホストに追加する必要があり、Apacheにはhttp仮想ホストのみが設定されているため、Apacheサーバーに実装できないようです。
これは、ELBがリクエストを転送するときに、リクエストにヘッダーStrict-Transport-Securityを追加する必要があることを意味します。
それ、どうやったら出来るの?それを行うセキュリティポリシーを追加できますか?
AWSサポートに質問したところ、現時点ではELBはクライアントからのリクエストにHSTSヘッダーを追加できません。そこで、Apacheサーバーを使用して回避策を見つけることにしました。これが私が見つけた解決策です:
HSTS RFC は、
HSTSホストは、非セキュアなトランスポートを介して伝達されるHTTP応答にSTSヘッダーフィールドを含めてはなりません(MUST NOT)。
私がしたことは、Apacheでhttp => httpsリダイレクトの後にヘッダー[〜#〜] [〜#〜]を設定することでした。このリダイレクトにはフラグ[L]があるため、301リダイレクトにはヘッダーは含まれませんが、httpsリクエストには含まれます。私のApache設定は次のようになります。
<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"
Apache 2.4+を使用している場合は、 式 とディレクティブ<If>
、<ElseIf>
、および<Else>
に精通している可能性があります。
開発環境、ステージング環境、本番環境の間で構成が複雑なので、RewriteRule
で[L]
フラグを使用しても、うまくいきません。
これにより、。htaccessに配置した次の解決策が得られました。
<IfModule mod_headers.c>
<If "%{REQUEST_SCHEME} == 'https' || %{HTTP:X-Forwarded-Proto} == 'https'">
Header set Strict-Transport-Security "max-age=31536000"
</If>
</IfModule>
それは私の環境でうまく機能し、RFCを満たすための方が信頼性が高いと感じています。
インスタンスに直接アクセスしない場合は、"%{REQUEST_SCHEME} == 'https'
パーツを削除できますが、これは私の開発環境でのデバッグプロセスの一部です。
HSTS RFCの実際の仕様について正しい方向を示してくれた Pedreiro に感謝します。