Skip to main content

セキュリティ関連のヘッダを使用して一般的な攻撃からアプリケーションを保護する



一段落説明

アプリケーションをさらにセキュアにするために使用される、セキュリティ関連のヘッダがあります。以下に、最も重要なヘッダを示します。また、ページの下部のサイトにアクセスして、このトピックに関する詳細な情報を確認することができます。これらのヘッダは、express 用の Helmet モジュール(koa Helmet)を使って簡単に設定することができます。



目次



HTTP Strict Transport Security (HSTS)

HTTP Strict Transport Security (HSTS) は、プロトコルのダウングレード攻撃クッキーハイジャッキングからウェブサイトを保護するための、ウェブセキュリティポリシーの仕組みです。これにより、Web サーバは、Web ブラウザ(または他の準拠するユーザエージェント)が 安全な HTTPS 接続 でのみ通信し、 安全でない HTTP プロトコルを経由して 決して 通信しないことを宣言することができます。HSTS ポリシーは、既存の HTTPS 接続上で Strict-Transport-Security ヘッダを使用して実装されています。

Strict-Transport-Security ヘッダには、どれくらいの期間 HTTPS のみを使用してサイトにアクセスするかをブラウザに通知するための秒単位の max-age 値と、サイトのすべてのサブドメインに Strict Transport Security ルールを適用するための includeSubDomains 値を指定します。

ヘッダ例 - 1 週間有効化された、サブドメインを含む HSTS ポリシー

Strict-Transport-Security: max-age=2592000; includeSubDomains

🔗 OWASP Secure Headers Project で読む

🔗 MDN web docs で読む



Public Key Pinning for HTTP (HPKP)

HTTP Public Key Pinning (HPKP) は、HTTPS のウェブサイトを、誤って発行された、もしくは不正な SSL/TLS 証明書を使用した攻撃者によるなりすましに対抗できるようにするセキュリティメカニズムです。 (訳注:HPKP 自体は非推奨となっており、後述の Expect-CT ヘッダに置き換えられています)

HTTPS ウェブサーバーは公開鍵ハッシュのリストを提供し、後続の接続では、証明書チェインにおいてクライアントはサーバーがこれらの公開鍵のうちの 1 つ以上を使用することを期待します。この機能を注意して使用することで、アプリケーションのユーザが過度のリスクを負うことなく、中間者(MITM)攻撃やその他の誤認証の問題のリスクを大幅に減らすことができます。

実装する前に、設定ミスからのリカバリのための高度な柔軟性やその他の利点のために、まず Expect-CT ヘッダを見ておくべきです。

Public-Key-Pins ヘッダは、4つの値を受け付けることができます。証明書の公開鍵を追加するための pin-sha256 値(SHA256 アルゴリズムを使用してハッシュ化されているため、異なる公開鍵に対して複数回追加することができる)、ルールを適用する期間をブラウザに伝えるための max-age 値、すべてのサブドメインに適用するための includeSubDomains 値、そしてピンの検証に失敗した際に、失敗した旨を報告する URL を指定する report-uri 値があります。

ヘッダ例 - 1 週間有効化され、サブドメインを含み、example URL に失敗を報告し、2 つの公開鍵を許可した HPKP ポリシー

Public-Key-Pins: pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM="; pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g="; report-uri="http://example.com/pkp-report"; max-age=2592000; includeSubDomains

🔗 OWASP Secure Headers Project で読む

🔗 MDN web docs で読む



X-Frame-Options

X-Frame-Options ヘッダは、フレームを使用して他の(外部の)ページをアプリケーションを埋め込むことができるかどうかのポリシーを宣言することで、クリックジャッキング攻撃からアプリケーションを保護します。

X-Frame-Options は 3 つのパラメータを許可します。リソースの埋め込みを一般的に許可しないための deny パラメータ、同じホスト/オリジンのリソースの埋め込みを許可する sameorigin パラメータ、そして特定のホストを許可するための allow-from パラメータです(訳注:allow-from は廃止されました)

ヘッダ例 - アプリケーションの埋め込みを拒否する

X-Frame-Options: deny

🔗 OWASP Secure Headers Project を読む

🔗 MDN web docs を読む



X-XSS-Protection

このヘッダはブラウザのクロスサイトスクリプティングフィルタを有効化します。

これは 4 つのパラメータを受け付けます。フィルタを無効化する 0、フィルタを有効化して、攻撃を検知した際にページの自動サニタイズを行う 1、フィルタを有効化して、攻撃を検知した際にページのレンダリングを停止する mode=block(このパラメータは、1 の後にセミコロンを足して追加する必要があります)、そして攻撃を検知した際に攻撃レポートを作成して送信する report=<domainToReport> です(同様に 1 の後に追加する必要があります)。

ヘッダ例 - XSS プロテクションを有効化し、攻撃を example URL に送信する

X-XSS-Protection: 1; report=http://example.com/xss-report

🔗 OWASP Secure Headers Project で読む

🔗 MDN web docs で読む



X-Content-Type-Options

このヘッダを設定すると、ブラウザがファイルを HTTP ヘッダで宣言されたファイルタイプと別のものとして解釈することを防ぎます。

ヘッダ例 - コンテンツスニッフィングを無効化する

X-Content-Type-Options: nosniff

🔗 OWASP Secure Headers Project で読む

🔗 MDN web docs で読む



Referrer-Policy

Referrer-Policy HTTP ヘッダは、Referer ヘッダで送信される、リファラー情報をリクエストにどれだけ含めるかを制御します。

これは 8 つのパラメータを許可しています。Referer ヘッダを完全に省略する no-referrer パラメータ、(水準が)ダウングレードされた際(HTTPS → HTTP)に Referer ヘッダを省略する no-referrer-when-downgrade パラメータ、ホストオリジン のみ をリファラーとして送信する origin パラメータ、同一オリジンの際はフルオリジン URL を送信し、その他の場合はホストオリジンのみを送信する origin-when-cross-origin パラメータ、同じオリジンにのみリファラー情報を送信しクロスオリジンのリクエストの場合は省略する same-origin パラメータ、同じセキュリティレベル(HTTPS → HTTPS)の場合にのみ Referer ヘッダーを保持しそれに劣る水準の場合は省略する strict-origin パラメータ、同一オリジンの場合はフルリファラー URL を送信し、クロスオリジンで 同じ セキュリティレベルの送信先の場合はオリジン のみ を送信し、安全性の劣るクロスドメインの送信先にはリファラーを送信しない strict-origin-when-cross-origin パラメータ、同一オリジン、クロスオリジンに関わらずフルリファラーを送信する unsafe-url パラメータです。

ヘッダー例 - 完全に Referer ヘッダを取り除く

Referrer-Policy: no-referrer

🔗 OWASP Secure Headers Project で読む

🔗 MDN web docs で読む



Expect-CT

Expect-CT ヘッダは、認証透過性の要件に準拠しているかどうか確認するために、ヘッダを発行するホストへの接続をブラウザが評価すべきということを示すことを目的として、サーバによって使用されます。

このヘッダは 3 つのパラメータを受け付けます。Expect-CT の失敗を報告する URI を指定する report-uri、(報告するだけでなく)認証透過性ポリシーに従い、認証透過性ポリシーに違反するコネクションを拒否するようにブラウザに指示する enforce パラメータ、ブラウザが既知の Expect-CT ホストとみなすべき時間を秒数で指定する max-age パラメータです。

ヘッダ例 - 1 週間、認証透過性ポリシーを強制、example URL に報告する

Expect-CT: max-age=2592000, enforce, report-uri="https://example.com/report-cert-transparency"

🔗 OWASP Secure Headers Project で読む



Content-Security-Policy

HTTP Content-Security-Policy レスポンスヘッダは、特定のページに対して、ユーザーエージェントが読み込みをすることができるリソースを制御することを可能にします。いくつかの例外を除いて、ほとんどの場合ポリシーはサーバオリジンとスクリプトのエンドポイントを指定します。これは、クロスサイトスクリプティング攻撃(XSS)対策に役立ちます。

ヘッダ例 - CSP を有効にして、同一オリジンからのスクリプトのみを実行する

Content-Security-Policy: script-src 'self'

以下のリンクで、Content-Security-Policy で有効になっている多くのポリシーを見ることができます。

🔗 OWASP Secure Headers Project で読む

🔗 MDN web docs で読む



Additional resources

🔗 OWASP Secure Headers Project

🔗 Node.js Security Checklist (RisingStack)