セキュリティヘッダー診断の使い方|HSTS・CSP・X-Frame-Options の読み方

レスポンスヘッダーは「ブラウザへの指示書」です。本ツールが見る7項目が何を防ぐのか、A〜Fの判定はどう計算されているのか、そして設定を入れる前に何を確かめるべきかを、ツールの実装と各仕様で確認できる範囲だけで整理しました。

🛡️ セキュリティヘッダー簡易チェックを開く公開WebサイトのURLを指定し、代表的なセキュリティヘッダーの設定有無を確認します。

HSTS・CSP・X-Frame-Options とは何か

Webサイトにアクセスすると、サーバーはHTMLを返す前に「レスポンスヘッダー」という短い指示の並びを返します。セキュリティヘッダーと呼ばれるものは、その中でもブラウザの振る舞いを制限する指示です。アプリのコードを一行も変えずに、ブラウザ側で危険な動きを止められるのが特徴で、サーバーやCDNの設定だけで入れられるものが多くあります。逆に言えば、入れ忘れていても画面は普通に表示されるため、気付かないまま何年も放置されがちな領域でもあります。

Strict-Transport-Security(HSTS)は、「このドメインには今後かならずHTTPSで接続しなさい」とブラウザへ覚えさせるヘッダーです。max-ageで覚えている秒数を指定します。これが無いと、利用者がアドレスバーへhttp://と打った場合や、古いブックマークを開いた場合に、最初の1往復が暗号化されないまま飛びます。その1往復を横取りして以降の通信をHTTPのまま維持させる攻撃が知られており、HSTSはそれを塞ぎます。ただし、ブラウザがこのヘッダーを受け取るには一度HTTPSで接続する必要があるため、そのドメインへの本当に最初のアクセスだけは保護されません。ここまで塞ぎたい場合にpreloadという仕組みがありますが、後述のとおり取り消しに時間がかかります。

X-Frame-Options は、自分のページを他人のサイトのiframeへ埋め込ませないためのヘッダーです。DENYなら誰にも埋め込ませない、SAMEORIGINなら同じサイト内だけ許す、という意味になります。埋め込みを放置すると、透明にした自分のページを攻撃者のページに重ね、利用者が「無料で試す」を押したつもりで実際には別のボタンを押している、というクリックジャッキングが成立します。なお、より新しい書き方はContent-Security-Policyのframe-ancestorsで、両方が付いている場合、現在のブラウザはframe-ancestorsのほうを優先します。ALLOW-FROMという指定は仕様から外れて久しく、現在のブラウザでは効きません。

Content-Security-Policy(CSP)は、そのページが読み込んでよいスクリプト・画像・スタイルなどの出どころを、ブラウザに対して宣言するヘッダーです。たとえばdefault-src 'self' と書けば、自分のドメイン以外から来たスクリプトは実行されません。クロスサイトスクリプティング(XSS)が仮に成立しても、攻撃者が仕込んだ外部スクリプトの読み込みをブラウザ側で止められる、という後段の防御になります。効果は大きい一方で、広告・アクセス解析・埋め込み動画など外部サービスを使っているサイトでは許可先を列挙する必要があり、7項目の中では導入の手間が最も大きい項目です。本ツールがCSPの未設定を「要改善」ではなく情報扱いにしているのは、この難易度を踏まえてのことです。

本ツールはこの3つを含む次の7項目を見ます。どれも公開情報であるレスポンスヘッダーだけで判定できるものです。

  • Strict-Transport-Security(HSTS)… HTTPS接続を強制する。未設定は要改善。
  • X-Frame-Options / CSPのframe-ancestors … クリックジャッキングを防ぐ。どちらかがあれば良好と判定する。
  • Content-Security-Policy(CSP)… 読み込み元を制限してXSSの被害を抑える。未設定は情報扱い。
  • X-Content-Type-Options … 値がnosniffのとき良好。ブラウザがファイルの中身を見て種類を推測する挙動を止め、画像のふりをしたスクリプトの実行を防ぐ。
  • Referrer-Policy … 他サイトへ遷移するときに、どこまでURLを渡すかを決める。社内向け画面のURLやクエリの漏えいを減らす。
  • Permissions-Policy … カメラ・マイク・位置情報など、そのページで使わないブラウザ機能を明示的に無効化する。
  • Server / X-Powered-By … サーバー製品名やバージョンの露出。出ていると、既知の脆弱性を持つバージョンかどうかを外部から絞り込まれるため要改善とする。

7項目のうち前半3つが有名ですが、実務でまず効くのはX-Content-Type-Optionsのnosniffです。値を1語書くだけで、副作用がほとんどなく、利用者がアップロードしたファイルを配信している画面では実害を直接減らします。難しいCSPから手を付けて止まってしまうより、こうした一語で終わる項目を先に埋めるほうが、診断の点数も実際の安全性も早く上がります。

診断結果の読み方

使い方は単純です。診断対象URLの欄にhttp://またはhttps://から始まるURLを入れて「診断する」を押すと、当サイトのサーバーがそのURLへ1回だけGETリクエストを送り、返ってきたレスポンスヘッダーを評価して結果を返します。ブラウザからではなくサーバーから接続するため、社内ネットワークからしか見えないサイトは診断できません。接続の待ち時間は5秒で打ち切り、リダイレクトは5回まで追います。追った結果たどり着いた最終URLが結果の上部に出るので、httpで入力してhttpsへ転送された場合は、そこで実際に評価された先を確認してください。

結果は7項目それぞれについて、良好・要改善・情報の3段階で表示されます。ヘッダーが実際に付いていた項目は、その値もそのまま表示します。HSTSならmax-ageの秒数、CSPなら宣言そのものが読めるので、「設定したつもりだったが意図した値になっていない」という食い違いはここで見つかります。

上部に出るA〜Fの総合判定は、7項目の配点から機械的に決まります。良好な項目は2点、情報扱いの項目が未設定なら1点、要改善の項目が未設定なら0点として合計し、満点(7項目×2点=14点)に対する割合で判定します。割合が95%以上ならA、85%以上でB、70%以上でC、55%以上でD、40%以上でE、それ未満がFです。CSPのように推奨止まりの項目は未設定でも1点残るため、CSPが無いというだけでFになることはありません。逆に、HSTSやnosniffのような実害に直結する項目が抜けていると、点は素直に落ちます。

判定と一緒に出る「未設定・要改善の項目数」は、良好でなかった項目をそのまま数えた値です。判定の文字だけを見て安心せず、この件数と各項目の表示を突き合わせてください。Bでも中身が「CSPとPermissions-Policyだけが未設定」なのか「HSTSが未設定」なのかで、次にやるべきことはまったく違います。

この診断が何をしていないかも、はっきりさせておきます。本ツールが見るのはレスポンスヘッダーの有無と値だけで、脆弱性診断ではありません。CSPが付いていれば良好と表示しますが、その中身が 'unsafe-inline' だらけで実質的に何も防いでいない、という状態は検出しません。同様に、HSTSのmax-ageが極端に短くても、付いてさえいれば良好になります。アプリケーションの入力検証・認証・権限まわりの問題は、当然ながらこの診断の範囲外です。判定Aは「ヘッダーが一通り入っている」という意味であって、「安全である」という意味ではありません。

  • 診断できないURL … localhostや社内アドレスなど、外部から到達できない宛先は入力の時点で弾きます。第三者のサーバーを踏み台にして内部ネットワークを探られることを防ぐためです。
  • 5秒を超えると失敗 … 応答が遅いサイトは「診断できませんでした」になります。サイト側が落ちているとは限りません。
  • 連続実行の上限 … 実際に外部へ接続する診断は1分あたり10回までです。URLの打ち間違いで弾かれた分はこの回数を消費しません。
  • 最終URLを見る … リダイレクトを追った先のヘッダーを評価します。wwwあり・なしで設定が違うサイトでは、入力したURLと評価されたURLがずれていないか確認してください。

設定を変える前に確認すること

診断結果を見ると、未設定の項目をまとめて入れたくなります。しかしセキュリティヘッダーは「ブラウザに何かを禁止させる」仕組みなので、入れ方を誤ると自分のサイトが壊れます。しかも壊れ方が、特定のブラウザ・特定の画面だけで起きる形になりやすく、気付くのが遅れます。順番を守って一つずつ入れてください。

まず、ヘッダーをどこで付けるかを先に決めます。アプリケーション側(Next.jsの設定やNginxの設定ファイルなど)と、前段のCDN・WAF・ロードバランサの両方で同じヘッダーを付けられる構成では、二重に付いて値が競合することがあります。診断で表示された値が自分の書いた値と違うときは、たいてい前段が上書きしているか、両方が付いています。設定箇所を1か所に寄せてから作業するほうが、結果として早く終わります。

HSTSは、いきなり長いmax-ageを入れないでください。ブラウザは指定された秒数のあいだ「このドメインはHTTPSのみ」と覚え込み、こちらから取り消す手段は実質的にありません。HTTPS化が完全でないサブドメインが1つでも残っていると、そこが期間中ずっと開けなくなります。まずmax-ageを数分程度の短い値で入れ、全ページと全サブドメインがHTTPSで問題なく開くことを確認してから、1年程度へ伸ばすのが安全です。includeSubDomainsは配下すべてに効くので、社内用サブドメインまで含めて確認が済んでから付けます。preloadはブラウザ本体に同梱されるリストへの登録であり、外すには申請と各ブラウザの更新を待つ必要があるため、運用が固まるまで付けないでください。

クリックジャッキング対策も、埋め込みの実態を確認してからにします。自社サイトが決済代行の画面や提携先のページへiframeで埋め込まれている、ヘルプ記事を製品画面の中に埋め込んでいる、といった正当な埋め込みがあると、DENYを入れた瞬間にそこが真っ白になります。埋め込みが必要な画面があるなら、CSPのframe-ancestorsで許可するオリジンを列挙する書き方を選んでください。

CSPは、いきなり本番へ適用せず、まずContent-Security-Policy-Report-Onlyという別のヘッダー名で入れます。名前が示すとおり、違反しても実際にはブロックせず、ブラウザの開発者コンソールへ報告だけが出ます。広告・アクセス解析・フォント・埋め込み動画など、自分では意識していなかった外部からの読み込みがここで一通り洗い出せます。報告が出なくなってから、ヘッダー名をContent-Security-Policyへ変えて有効化してください。この手順を飛ばすと、決済ボタンだけが動かない、といった最悪の壊し方をします。

設定を入れたあとの確認も忘れないでください。CDNを挟んでいる場合、ヘッダーの変更が反映されるまで古いレスポンスが配信され続けることがあります。デプロイが成功したことと、利用者のブラウザに新しいヘッダーが届いていることは別の話です。本ツールでもう一度診断して、意図した値が実際に返ってきていることを確かめてから、その日の作業を終えてください。

7項目のうち、nosniff・Referrer-Policy・Permissions-Policyの3つは副作用が小さく、当日中に入れて効果を確認できます。HSTSとCSPは影響範囲の確認が要るため、別の日に分けて進めるのが現実的です。診断結果を印刷やスクリーンショットで残しておくと、設定前後の差分がそのまま作業記録になります。

社内に確認できる人がいない、CSPの許可先の洗い出しで止まっている、複数サイトを一度に見直したいといった場合は、株式会社ARISTAのセキュリティ相談窓口をご利用ください。診断結果の判定と未設定の件数だけを引き継いだ状態でフォームが開くので、対象サイトのURLや診断内容を外部へ送ることなく、そのまま相談を始められます。

よくある質問

診断したURLや結果は保存されますか?

保存しません。入力されたURLはその場の診断に使うだけで、結果は画面に返すのみです。相談窓口へ進む場合も、引き継がれるのはA〜Fの判定と未設定の件数だけで、診断対象のURLは含まれません。

自分が管理していないサイトを診断してもよいですか?

レスポンスヘッダーは、そのサイトへアクセスすれば誰でも受け取れる公開情報です。本ツールは通常の閲覧と同じGETリクエストを1回送るだけで、攻撃的な操作は一切行いません。ただし短時間に大量のURLを投げる使い方は想定しておらず、1分あたり10回の上限を設けています。

判定がAなら安全ということですか?

違います。Aは「見ている7項目のヘッダーが一通り設定されている」という意味だけです。CSPの中身が妥当かどうか、アプリケーション側に脆弱性が無いかどうかは、この診断では分かりません。

「診断できませんでした」と出ます。

応答が5秒以内に返らない、宛先へ到達できない、リダイレクトが5回を超える、のいずれかが多い原因です。localhostや社内アドレスは入力の時点で弾かれます。httpで入力して転送が繰り返される場合は、httpsのURLを直接入力してみてください。

CSPとX-Frame-Optionsは両方設定すべきですか?

現在のブラウザはCSPのframe-ancestorsを優先し、その場合X-Frame-Optionsを無視します。とはいえX-Frame-Optionsを残しておく害はほとんどないため、両方書いておく構成が一般的です。本ツールはどちらか一方でもあれば良好と判定します。

どの項目から手を付ければよいですか?

X-Content-Type-Optionsのnosniffが最も低コストです。次にReferrer-PolicyとPermissions-Policy、続いてサーバー情報の露出を止め、HSTSとCSPは影響範囲を確認しながら段階的に進めてください。

セキュリティヘッダーの設定を相談する(株式会社ARISTA)設定箇所の切り分け、CSPの許可先の洗い出し、複数サイトの一括見直しに対応します。診断対象のURLは送信されません。

この記事を共有

← 使い方ガイドの一覧へ戻る