Strict-Transport-Security について

みなさん、もう SSL 化しましたか?今回はサイトオーナー向けの内容です。

早速だがタイトルにある言葉を見聞きしたことがあるだろうか。Strict-Transport-Security はサイトがブラウザに送るレスポンスヘッダーの一つだ。一体どういう効果があるのか、OWASP によると

Once a supported browser receives this header that browser will prevent any communications from being sent over HTTP to the specified domain and will instead send all communications over HTTPS.

えー要約します。

「ブラウザがサイトからこのヘッダーを受け取ると、以降そのドメインとのいかなる HTTP 通信も行わず、代わりに HTTPS 通信を用いるようになる。」

要するに「私のサイトとは以降 HTTPS のみで通信してください。」というメッセージをブラウザに伝え、記憶させるシグナルということだね。これにより、そのサイトとは少なくとも暗号化されていない通信は行われないことが保証されたことになり、ダウングレード攻撃などのセキュリティリスクも無くなる、ということのようだ。

Strict-Transport-Security が取りうる値は以下。

必須か 意味
max-age=<秒数> Yes ブラウザがそのドメインに HTTPS のみでアクセスすることを記憶する時間
includeSubDomains No 同じ設定を全てのサブドメインにも適用する
preload No Google が管理する HSTS プリロードリストに登録する

うん、全然難しくない。

Nginx で設定するなら以下のような書き方になる。

例 1:

add_header Strict-Transport-Security "max-age=31536000";

ブラウザは、31536000 秒間(1 年間)あなたのサイトと HTTPS 通信のみ行うことを保証する。

例 2:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

ブラウザは、1 年間あなたのサイトとサブドメインも含めて HTTPS 通信のみ行うことを保証する。

例 3:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";

これはおそらく Google にクローリングされた際に上記のサイトに登録されるのだろう。普通の訪問者にとっては例 2 と同じだ。

includeSubDomains に注意

実はここからがこの記事の本題なんだよね。

まず、仮にあなたが example.com というドメインのサイトを持っているとしよう。example.com の SSL 証明書を取得し、サイトは SSL 化に成功した。そして例 2 のヘッダーを設定したとする。

すると、https://example.com にアクセスしたブラウザは example.com とその全てのサブドメイン、つまり *.example.com に対して 「HTTPS のみでアクセスする」ということを記憶する。

この時点ではそれで問題無いのだが、もしこの後、一年以内に test.example.com という別サイトを作りたくなった場合を考えてみよう。

test.example.com はちょっとしたテスト用のサイトか、あるいは 1 ページしかない告知サイト、いずれにしても改めて SSL 証明書を取得するまでもないサイトだ。あなたはサイトを非 HTTPS で設定し、設定が正しいかどうかをテストするためにアドレスバーに test.example.com と打ち込んだ。

ブラウザは https://test.example.com を表示しようとして警告を出すだろう。丁寧に http:// から打ち込んでも同じ結果になるはずだ。ここまで読んでいれば理由はもうわかるよね。そう、ブラウザは覚えているのだ。

こうなったらあなたの取るべき行動は以下の三つのうちのどれか。

  • SSL 証明書を取得し test.example.com も SSL サイトにする
  • example.com の Strict-Transport-Security の値から includeSubDomains を取り除き、1 年間待つ
  • これをする

当たり前だが最後のオプションは自分のブラウザにしか効果がないので、test.example.com が公開サイトの場合は使えない。


自分でよく調べもせずにコピペばかりしていると思わぬところでつまずいてしまうことがある。気をつけようね。

Leave a comment - コメントを残す