web-dev-qa-db-ja.com

AWS Elastic Load BalancerにHTTP Strict Transport Security(HSTS)を実装するにはどうすればよいですか?

HSTSをアプリケーションに実装したいと思います。

ELBでSSLを終了し、トラフィックをアプリケーションに転送します。これは、リバースプロキシとして使用されるApacheサーバーです。

HSTSを実装するには、リクエストにヘッダーStrict-Transport-Securityを追加する必要があることを知っています。

ELBでSSLが終了しているため、HTTPS仮想ホストに追加する必要があり、Apacheにはhttp仮想ホストのみが設定されているため、Apacheサーバーに実装できないようです。

これは、ELBがリクエストを転送するときに、リクエストにヘッダーStrict-Transport-Securityを追加する必要があることを意味します。

それ、どうやったら出来るの?それを行うセキュリティポリシーを追加できますか?

8
Pedreiro

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"
11
Pedreiro

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 に感謝します。

4
eklingen