HSTSとは
HSTS(HTTP Strict Transport Security)とは、Webサーバーからブラウザに対して「今後はHTTPSでのみアクセスしてください」と伝える仕組みです。
サーバーがHTTPレスポンスヘッダーに以下のような情報を含めることで、ブラウザに指示を出します:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
この設定を受け取ったブラウザは、指定された期間(上の例では1年間)、そのサイトへのアクセスを自動的にHTTPSに変換します。ユーザーがhttp://でアクセスしようとしても、ブラウザが勝手にhttps://に書き換えてくれるのです。
HSTSがないとどうなる?中間者攻撃の例
HSTSが設定されていないと、中間者攻撃(Man-in-the-Middle Attack)のリスクがあります。
具体的なシナリオを見てみましょう:
- あなたがカフェのWi-Fiに接続します
- ブラウザに
http://your-bank.comと入力します - 通常なら、サーバーが「HTTPSにリダイレクトしてください」と応答します
- しかし、悪意のある第三者がWi-Fiの通信を傍受していた場合、このリダイレクト応答を横取りできます
- 攻撃者は偽のサイトを表示させ、あなたのログイン情報を盗みます
HSTSが設定されていれば、ブラウザは最初からHTTPSで接続するため、HTTPでの通信が発生せず、この攻撃を防げます。
設定方法(nginx / Apache)
nginxの場合
server {
listen 443 ssl;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
}
Apacheの場合
<VirtualHost *:443>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</VirtualHost>
設定のポイント:
- max-age:ブラウザがHTTPS接続を強制する期間(秒)。最低でも1年(31536000秒)を推奨
- includeSubDomains:サブドメインにも適用する。設定前にすべてのサブドメインがHTTPS対応していることを確認
- preload:後述するpreloadリストへの登録に必要
HSTS Preloadリスト
HSTSには一つ弱点があります。ユーザーが初めてそのサイトにアクセスするときは、まだHSTSの情報がブラウザに保存されていないため、HTTPで接続される可能性があります。
この問題を解決するのがHSTS Preloadリストです。これはブラウザにあらかじめ「このドメインは常にHTTPSで接続する」という情報を組み込む仕組みです。
hstspreload.orgから登録を申請できます。登録されると、Chrome、Firefox、Safariなどの主要ブラウザが、初回アクセスからHTTPSを強制するようになります。
注意:preloadリストへの登録は簡単に取り消せません。すべてのサブドメインを含め、恒久的にHTTPSを使う覚悟が必要です。