セキュリティヘッダー5つを.htaccessで設定する方法
HSTS、X-Content-Type-Options、X-Frame-Options、Referrer-Policy、Permissions-Policy の5つについて、それぞれが何を防ぐのか、.htaccess での書き方、HSTS で特に注意する副作用を説明します。
セキュリティヘッダーの役割
セキュリティヘッダーとは、サーバーがページを返すときに付ける HTTP レスポンスヘッダーのうち、ブラウザの動作を安全な側に制限するものです。HTML や PHP を書き換える必要がなく、Apache なら .htaccess に数行を足すだけで効きます。侵入そのものを防ぐ仕組みではありませんが、クリックジャッキングや MIME タイプの誤認、意図しない参照元の送信といった「ブラウザ側で起きる攻撃」を止める多層防御の一部です。
この記事では、副作用が少なく効果がはっきりしている5つを扱います。Content-Security-Policy は設定の難しさが段違いのため、CSP の始め方に分けています。
5つのヘッダーの意味
Strict-Transport-Security(HSTS) は、「このサイトには今後 https でだけ接続せよ」とブラウザに記憶させます。http で始まるリンクを踏んでも、ブラウザが内部で https に書き換えるため、中間者が http の通信を横取りする余地がなくなります。
X-Content-Type-Options: nosniff は、ブラウザがファイルの中身を推測して種類を決める動作(スニッフィング)を禁止します。画像として置いたファイルがスクリプトとして実行される、といった誤認を防ぎます。
X-Frame-Options は、他のサイトが自分のページを iframe で埋め込むことを禁止します。透明な iframe を重ねてボタンを押させるクリックジャッキングを防ぎます。CSP の frame-ancestors で代替できますが、古いブラウザ向けに併記するのが一般的です。
Referrer-Policy は、自分のサイトから外部へ移動するときに送る参照元 URL の範囲を決めます。strict-origin-when-cross-origin にすると、外部サイトにはドメインまでしか伝わらず、URL に含まれるトークンや検索語が漏れません。
Permissions-Policy は、カメラ、マイク、位置情報などのブラウザ機能をページ内で使えるかを宣言します。使わない機能を明示的に止めておくと、埋め込んだ広告や外部スクリプトが勝手に要求することを防げます。
.htaccess での書き方
Apache で mod_headers が有効なサーバーでは、次の記述をサイトのルートにある .htaccess に追加します。
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
</IfModule>
always を付けるのは、404 や 500 などのエラー応答にもヘッダーを付けるためです。付けないと、エラーページだけが無防備になります。保存したら、セキュリティヘッダー診断で実際の応答に含まれているかを確かめてください。反映されていない場合は、mod_headers が無効か、サーバー側が .htaccess を読んでいない(nginx のみの構成など)可能性があります。
副作用と順番
HSTS だけは、順番を間違えると取り返しがつきにくいヘッダーです。http でしか動かないページが1つでも残った状態で HSTS を出すと、ブラウザは max-age の期間(上の例では1年)その記憶を保ち、http でのアクセスを拒み続けます。最初は max-age=300(5分)程度で試し、問題がなければ伸ばしてください。includeSubDomains は、サブドメインに http のみのサービス(社内ツールやテスト環境)がないことを確かめてから付けます。preload はブラウザの組み込みリストに登録する指定で、取り消しに数か月かかるため、十分に運用してから検討します。
X-Frame-Options の SAMEORIGIN は、自サイト内の埋め込みは許し、外部からの埋め込みを拒みます。他社のサービスに自分のページを iframe で埋め込んでもらっている場合は、CSP の frame-ancestors で相手のドメインを個別に許可する必要があります。
Permissions-Policy は、地図の埋め込みで位置情報を使う、問い合わせフォームでカメラ撮影を使う、といったページでは該当する機能を指定から外してください。
確認に使えるツール
- セキュリティヘッダー診断: 現在のヘッダーを採点し、足りない設定を .htaccess の形で提示します
- .htaccess生成: https 化や転送の設定とあわせて .htaccess を組み立てます
- Content-Security-Policy生成: CSP を導入する段階になったら使います