ウェブサイト脆弱性:HSTSの有効化方法とHSTSが必要である理由
May 30, 2023
Table of Contents
【HSTSになっていない事の何が問題か】
HSTSが有効になっていない場合、サイトにHTTPでアクセスした場合に強制的にHTTPS接続にリダイレクトがされないということです。これを悪用して、HTTPS対応しているサイトにおいて、HTTP接続を行う事が可能になり、情報漏洩を引き起こすといった攻撃が可能になってしまいます。一言で言えば、HTTPSを形骸化されてしまう、ということです。そのため、HTTPでの接続はHTTPSに強制する必要があり、HSTS設定をする必要が出てくるわけです。目的は、平文での送信による情報漏洩を防ぐことにあります。
他のケースでは、ホームページにURLを貼る際に、ユーザーが間違えてhttpsではなくhttpで記載してしまった場合に、そのURL経由でアクセスした他のユーザーは全てhttp通信でアクセスすることになり、平文での通信が意図せず行われる、というシナリオもありえます。公衆Wi-Fiでアクセスされた場合、危険度は格段に上がります(WIFI通信が暗号化されていないためです。中間者攻撃のリスクが高くなります)。こうしたケースも、HTTPSを強制するHSTSを設定する事で防げます。ユーザーが、URLからsを一文字取るだけでこれだけの危険が起きるのです。
【サイトでHSTSが有効になっているかどうかはどうやって確認すればいいか】
Mozilla ObservatoryのようなHTTPヘッダーの脆弱性をスキャンするツールを使うことで、HSTSに対応できているかどうかの確認ができます。有効になっていないと出る場合は、HSTS対応できていません。HSTSのPreload設定ができているかどうかを確認する方法は、Preloadリストにアクセスし、ホスト名を入力することで確認できます。
【HSTSの設定方法】
nginx.confファイルのserverディレクティブ以下に、以下のディレクティブを追加します。
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
後述するPreload設定をする場合は、以下のディレクティブを追加して下さい。
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
これでHSTSに対応できるようになりました。Nginxを再起動して下さい。
sudo systemctl restart nginx
【Preload設定について】
HSTSPreloadリストに登録されたサイトは、ブラウザでチェックが行われ、以降は必ずHTTPSでのみ通信が行われます。結果、いかなる例外もなくHTTPでの通信は行えなくなり、HTTPSのみで通信が行われるので、セキュリティホールを突いてHTTP通信に戻すといった事が一切できなくなります。例えばHTTPでアクセスしようとしてもアクセスできなくなりますから、完全にHTTPSでの通信が保証されるのです。また、HTTPSでの通信が確定している結果、通信速度の改善といったメリットもあります。さらに、間接的にSEOへの好影響がある可能性も言及されています(近年のGoogleがHTTPS対応を検索ランキング上位表示のためのアドバンテージにしている事と関連します)。
ただし一度Preloadリストに登録されてしまうと、すぐに外す事はできず、外す申請をしてからそれが有効になるまでに数ヶ月から一年の時間がかかるため、その間はHTTPSでしかサイトにアクセスできない状態になりますから、Preloadリスト登録はよく考えてから行う必要があります。
考えられるケースとしては、Preload登録してしまったがために、それまでHTTPでサイトにアクセスしていたユーザーがアクセスできなくなり、これをサイト側のダウンだと誤解し、サイトがダウンしていると騒ぎ始めるケースが考えられます。こうした事態を防ぐためにも、Preload登録前には、HTTPSでしかアクセスできなくなることを、サイト利用者に事前に通知をすることが必要と言えます。
なお最新の設定手順については、Mozialla Websecurity当該ページやOWASP Cheat Sheet当該ページが役に立つので、必要に応じてご参照ください。