Application Load Balancer でリクエストを処理するウェブアプリケーションの脆弱性診断を受けたので、セキュリティヘッダー追加対応をしてみた
いわさです。
先日、Application Load Balancer + EC2 なWebアプリケーションに対して脆弱性診断を実施しました。
実施した結果いくつかのセキュリティヘッダーを追加する必要が出ました。例えば以下のようなヘッダーです。
- Strict-Transport-Security ヘッダー
- X-Frame-Options ヘッダー
- X-Content-Type-Options ヘッダー
- Referrer-Policy ヘッダー
- Content-Security-Policy ヘッダー
Application Load Balancer にはセキュリティヘッダーを追加する機能がありますが、この機能で上記すべてをカバーできるでしょうか。
結論としては上記の一部は Application Load Balancer の設定のみで対処することも可能ですが、一部については CloudFront でさらにラップする、あるいは EC2 上のウェブサーバー側でレスポンスヘッダーの追加も行ってやる必要がありました。
いくつか確認してみたので紹介します。
デフォルトの挙動を確認
まずはデフォルトのレスポンスを確認してみます。
Application Load Balancer のリスナー設定で固定レスポンスを返させる場合です。カスタムドメインを設定した HTTPS リスナーです。
% curl -I https://hoge0114.tak1wa.com/
HTTP/2 200
server: awselb/2.0
date: Tue, 13 Jan 2026 20:44:22 GMT
content-type: text/plain; charset=utf-8
content-length: 4
最低限のヘッダーですね。
対応する
ということでこちらに Application Load Balancer の機能で対応してみましょう。
以下のアップデートで Application Load Balancer はレスポンスヘッダーの一部カスタマイズが出来ます。
Strict-Transport-Security, X-Frame-Options, X-Content-Type-Options, Content-Security-Policy を追加する
Strict-Transport-Security, X-Frame-Options, X-Content-Type-Options, Content-Security-Policy の 4 つについては上記の設定機能から設定が可能です。
リスナーの属性タブから有効化が可能です。任意の固定値を設定できるところもあれば、X-Frame-Optionsなどは選択式になっていますね。

AWS 公式ドキュメント上は以下になりますが、どこにどの値を設定すれば良いかはこれだけだとわかりません。
以下などを参考に設計する必要があります。
- Strict-Transport-Security ヘッダー - HTTP | MDN
- X-Frame-Options ヘッダー - HTTP | MDN
- X-Content-Type-Options ヘッダー - HTTP | MDN
- Content-Security-Policy (CSP) ヘッダー - HTTP | MDN
設定してみると次のようにレスポンスヘッダーが追加されました。良いですね。
% curl -I https://hoge0114.tak1wa.com/
HTTP/2 200
server: awselb/2.0
date: Tue, 13 Jan 2026 20:58:38 GMT
content-type: text/plain; charset=utf-8
content-length: 4
strict-transport-security: max-age=31536000
content-security-policy: default-src 'self'; img-src 'self' tak1wa.com
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
ただし、上記機能ではReferrer-Policyを設定することが出来ませんでした。
この構成でどうにかする場合は、ALB のターゲットとなるウェブサーバーでReferrer-Policyヘッダーを追加してやる必要がありそうです。
CloudFront で Referrer-Policy を設定する
ただし、このセキュリティヘッダーの追加機能は Application Load Balancer でサポートされる前から CloudFront でも使うことが出来まして、ALB よりも CloudFront のほうがより設定できるヘッダーが多かったり柔軟性が高いです。
CloudFront + ALB の構成を採用している場合は CloudFront 側のレスポンスヘッダーポリシーで対処することが出来ます。見てみましょう。
まず、次のように CloudFront ディストリビューションのオリジンに ALB を指定しています。
CloudFront にはプランがあって、今回は定額の Free プランを採用しています。このあたり、ポリシーに少し影響するので覚えておいてください。後ほどすこし触れます。

ディストリビューションではビヘイビアを構成することで、どのパスのリクエストをどう処理する(キャッシュやオリジンへの転送情報、レスポンス情報などを含む)か挙動を設定することが出来ます。
こちらのビヘイビアを編集しましょう。

ビヘイビアの設定の中でレスポンスヘッダーポリシーというものをオプションで指定することが出来ます。
ここでセキュリティヘッダーを追加するレスポンスポリシーを選択することで、レスポンスヘッダーを CloudFront が追加してくれます。

ここで一点注意点があります。
CloudFront プランが定額 Free や Pro の場合、カスタムレスポンスヘッダーを選択することが出来ません。
AWS が事前に用意したマネージドポリシーのみとなります。そうだったんだ。

そして、マネージドポリシーは次の3つがセキュリティヘッダーを追加してくれるものです。

これらのマネージドポリシーですが、冒頭挙がった5つのヘッダーに加えてX-XSS-Protectionも対応してくれますが次のような設定値となっており変更が出来ません。
Content-Security-Policyに関しては有効化がされていません。課題だったReferrer-Policyについてはstrict-origin-when-cross-origin固定ですが、サポートされています。

なお、カスタムレスポンスポリシーの場合は次のように設定が可能になっています。これだけでなく任意のカスタムヘッダーも追加することが出来ます。

レスポンスを確認してみると次のようにreferrer-policyが設定されていました。
ALB側でcontent-security-policyヘッダーを設定しているので、出力されていますね。
% curl -I https://hoge0114.tak1wa.com/
HTTP/2 200
content-type: text/plain; charset=utf-8
content-length: 135
server: awselb/2.0
date: Tue, 13 Jan 2026 21:23:08 GMT
x-frame-options: SAMEORIGIN
strict-transport-security: max-age=31536000
content-security-policy: default-src 'self'; img-src 'self' tak1wa.com
x-content-type-options: nosniff
x-cache: Miss from cloudfront
via: 1.1 05c379f9f2e24444b729aa2b8e4ab6d2.cloudfront.net (CloudFront)
x-amz-cf-pop: KIX50-P2
x-amz-cf-id: HI_QI3Y_Zidq5QWvzSSvkKlCrrsV7cDxG19hF1kj0PLisJJlq-NeaA==
x-xss-protection: 1; mode=block
referrer-policy: strict-origin-when-cross-origin
ALB 側でセキュリティヘッダーの追加機能を無効化した場合は次のようなレスポンスになりました。
content-security-policyが付与されていませんね。
% curl -I https://hoge0114.tak1wa.com/
HTTP/2 200
content-type: text/plain; charset=utf-8
content-length: 135
server: awselb/2.0
date: Tue, 13 Jan 2026 21:27:38 GMT
x-cache: Miss from cloudfront
via: 1.1 6261567c92bf8717fd0489ef81ebc5c2.cloudfront.net (CloudFront)
x-amz-cf-pop: KIX50-P2
x-amz-cf-id: ZZNDfr3pAbwmS-JuWbUovOSuRJQsEhXp568QBzO77SqBGRbes-juYA==
x-xss-protection: 1; mode=block
x-frame-options: SAMEORIGIN
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
strict-transport-security: max-age=31536000
さいごに
本日は Application Load Balancer でリクエストを処理するウェブアプリケーションの脆弱性診断を受けたので、セキュリティヘッダー追加対応をしてみました。
Application Load Balancer のみで対応できるセキュリティヘッダーについてはすべてがサポートされているわけではなく限定的です。
セキュリティヘッダーの追加を行う場合、ALB のみで対応が可能か、あるいは CloudFront でラップする必要があるのか、ウェブサーバー側で頑張る必要があるのかなどを確認しましょう。
また、CloudFront で対応できる場合もディストリビューションのプランに注意する必要があります。
Free プラン、Pro プランの場合はカスタムレスポンスヘッダーポリシーが使えないようなので、マネージドポリシーの設定で許容されるのか確認しておく必要があります。







