Nginx セキュリティヘッダー(CSP、HSTS、X-Frame)
NginxでContent-Security-Policy、Strict-Transport-Security(HSTS)、X-Frame-Optionsなど、ブラウザのセキュリティヘッダーを設定する方法を解説します。
詳細な説明
セキュリティヘッダーは、クロスサイトスクリプティング、クリックジャッキング、MIMEタイプスニッフィングなどの一般的なWeb攻撃に対するブラウザ組み込みの保護を有効にします。Nginx層で追加することで、すべてのレスポンスにこれらの保護が一貫して含まれます。
主要なセキュリティヘッダー
server {
# iframe埋め込みを制限しクリックジャッキングを防止
add_header X-Frame-Options "SAMEORIGIN" always;
# MIMEタイプスニッフィング攻撃を防止
add_header X-Content-Type-Options "nosniff" always;
# ブラウザのXSSフィルターを有効化(レガシーブラウザ向け)
add_header X-XSS-Protection "1; mode=block" always;
# リファラー情報の共有範囲を制御
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# ブラウザ機能とAPIへのアクセスを制限
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
}
Strict-Transport-Security(HSTS)
HSTSはブラウザにドメインに対して常にHTTPSを使用するよう指示し、SSLストリッピングやプロトコルダウングレード攻撃を効果的に防止します:
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
max-age 値は秒数で指定されます(63072000は約2年)。includeSubDomains フラグはHSTS保護をすべてのサブドメインに拡張します。preload フラグはブラウザのプリロードリストへの登録資格を付与しますが、プリロードリストからの削除は時間がかかるため、十分なテスト後にのみ追加してください。
Content-Security-Policy(CSP)
CSPは最も強力で柔軟なセキュリティヘッダーです。許可されるコンテンツのソースを正確に定義し、クロスサイトスクリプティングやデータインジェクション攻撃を効果的に緩和します:
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' https://fonts.gstatic.com; frame-ancestors 'self';" always;
開発中は Content-Security-Policy-Report-Only から始めて、既存の機能を壊さずにポリシー違反を特定してください。
always パラメータ
always パラメータなしでは、add_header ディレクティブは2xxと3xxのステータスコードのレスポンスにのみ適用されます。always を追加することで、エラーページにもセキュリティヘッダーが含まれ、保護されていないエラーレスポンスからの情報漏洩を防ぎます。
ヘッダー継承の注意点
重要なNginxの動作:location ブロック内で add_header を使用すると、親の server ブロックで定義されたすべてのヘッダーが完全に上書きされます。location固有のヘッダーを追加する場合、そのlocationブロック内にすべてのサーバーレベルのセキュリティヘッダーを再宣言する必要があります。または、サードパーティの ngx_headers_more モジュールを使用してください。
検証
ブラウザの開発者ツールやsecurityheaders.comなどのオンラインスキャンサービスを使用して、エラーレスポンスを含むすべてのページでセキュリティヘッダーが正しく適用されていることを確認してください。
ユースケース
クリックジャッキング、XSS、不正なコンテンツ読み込みを防止するブラウザ強制のセキュリティポリシーを追加し、Webアプリケーションを一般的な攻撃から堅牢化します。