HSTS(HTTP Strict Transport Security)についてまとめる


はじめに

セキュリティの重要性が増してくる昨今、Webサイトにも様々なセキュリティ強化の規格が策定されています。
その中でも、対応サイトが増えているように感じるHSTS(HTTP Strict Transport Security)についてまとめました。

HSTS(HTTP Strict Transport Security)とは?

HTTPレスポンスヘッダにHSTSに関する事項を記載することで、指定した有効期間内はブラウザ(ユーザエージェント)が同一ドメインにアクセスする際はTLSによる通信を強制する仕組みです。
つまり、HTTPでアクセスしようとしても、ブラウザが「このドメインはHTTPSでアクセスするドメインだ!」と覚えていてくれて、HTTPSでリクエストを送ってくれるということですね。

HSTS(HTTP Strict Transport Security)はRFC6797で規定されています。
そのAbstractの原文には以下のとおり記述されています。

This specification defines a mechanism enabling web sites to declare
themselves accessible only via secure connections and/or for users to
be able to direct their user agent(s) to interact with given sites
only over secure connections. This overall policy is referred to as
HTTP Strict Transport Security (HSTS). The policy is declared by web
sites via the Strict-Transport-Security HTTP response header field
and/or by other means, such as user agent configuration, for example.

HSTSを設定する理由

HSTSは主にリクエスト内のデータを傍受する中間者攻撃を防止するのに役立ちます。

本来は、中間者攻撃によってリクエストが傍受されてもTLSにより通信が暗号化されているため、通信内容は理解できません。
しかし、巧みな攻撃者は標的型攻撃メールやリンク偽装などで、暗号化されていないHTTPによるアクセスに導き、暗号化しない状態で通信させることで、Cookieの値や、フォーム送信した情報を傍受しようとします。

ここで活躍するのがHSTSです。
HSTSは一度正規のサイトにアクセスした際に、サーバーから「今後このドメインにアクセスする際は〇〇秒の間HTTPSでアクセスしてね」という命令を送ります。
ブラウザはこの情報を保存しておくことで、同一ドメインにアクセスする際はHTTPでのアクセスを試みることはなく、HTTPSでのアクセスを行ってくれます。

HSTSの実装について

HSTSは以下の要素で成り立ちます。

  • ブラウザがHSTSの命令を解釈してHTTPをHTTPSに変換する動作
  • サーバーからのHSTSを行うための命令

ここではサーバー側からどのように命令を出すのかを見ていきたいと思います。

Strict-Transport-Securityレスポンスヘッダー

サーバー側からブラウザに命令を出すのにはStrict-Transport-Securityレスポンスヘッダーを用います。基本的な指定は以下のようになっています。

Strict-Transport-Securityの指定

このレスポンスヘッダーを追加することで、expire-timeで指定された秒数だけ当該ドメインに対してHSTSが有効になります。
ここで、expire-timeに小さい値を設定してしまうと、次回アクセスまでの間が空いた際にHSTSが働かなくなってしまうのでご注意ください。

HTTPレスポンスヘッダー
Strict-Transport-Security: max-age=<expire-time>

includeSubDomainsオプション

includeSubDomainsオプションを行うと、当該ドメインだけではなく、そのドメインのサブドメインまでHSTSの効力が行き届くようになります。

HTTPレスポンスヘッダー(サブドメインを通した指定)
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains

HSTS Pre-Loaded Listについて

通常は一度Webサーバーにアクセスし、HSTSの情報をキャッシュしないと動作しないのですが、pre-loaded listに事前に追加を行うことで、初回のアクセスからHSTSを動作させることができます。

Googleさんが管理する以下のサイトでリストへの登録申請が行えるようです。
https://hstspreload.org/

実装サンプル

QiitaさんもHSTSを導入しているみたいでしたので、FireFoxの開発者ツールで見てみました。
ヘッダーの下から3番目に指定している箇所がありますね。
max-ageが2592000秒なので、30日間有効な設定みたいですね。

まとめ

今回はWebのセキュリティを強化する規格であるHSTS(HTTP Strict Transport Security)についてまとめました。
HSTSを設定することで、中間者攻撃に情報を取られる可能性を減らすことができます。
また、HSTSはレスポンスヘッダーに値を追加することで実装できるため、ApacheやNginx等有名なWebサーバーはもちろん、ヘッダーを追加する機能さえあればCDN等でも導入できますので、必要性を検討の上、是非導入を考えてみてください。

参考

RFC 6797 HTTP Strict Transport Security (HSTS)
Mozilla MDN web docs Strict-Transport-Security

おまけ

平成31年度春季の情報処理安全確保支援士試験にもHSTSに関する問題が出てたりしました。