HSTS(HTTP Strict Transport Security)について詳細、設定方法を解説します

※この記事は社内の勉強会で使用した資料を一部改訂したものになります。

HSTSとは?

HSTSとは「HTTP Strict Transport Security」の略称で、Webサーバーがアクセスしてきたブラウザに「HTTPの代わりにHTTPSを使用する」よう指示するセキュリティ機構です。

リダイレクトとは違うの?

HTTPSを強制する方法の1つとして「HTTPでアクセスしてきた場合はHTTPSに転送する」というリダイレクトがあります。しかしこの設定の場合、通信の流れは

1.HTTPリクエスト

2.HTTPレスポンス

3.HTTPSリクエスト

4.HTTPSレスポンス

となり、2において通信の傍受、改ざんのおそれがあります。

つまり、その点において中間者攻撃(=MITM)のリスクがあります。

有効期限の設定

WebサーバーでHSTSを有効にしておくと、ブラウザからの初回アクセス時にHSTSを保持していない時、サーバーはブラウザに「次からこのドメインにアクセスする時は◯◯秒間HTTPSでアクセスしてね」というレスポンスを返します。(一般的には31536000秒=1年の設定が多いです)

ブラウザはこの情報を保存し、同じドメインにHTTPでリクエストしようとするとHTTPSのリクエストに変更してからアクセスします。
なお、このレスポンスがブラウザに送られるたびに、そのドメインに対する有効期限が更新されるため、HSTSの期限切れを防ぐ事ができます。

ちなみにHSTSはレスポンスヘッダに値を追加する事で実装できるため、Apache等のWebサーバーはもとより、ヘッダを追加する機能があるCDNにおいても導入する事が可能です。

HSTSの問題点とその解決策

HSTSの仕様上、初回アクセス時におけるHTTPSの通信は担保されません。つまり、十分にHSTSの設定されたサイトにアクセスした場合でも、最初の通信だけは中間者攻撃が介在する余地があります。サイトのドメインをGoogleの運営するHSTS先読みサービスに登録し、HSTSの設定にpreloadオプションを付与することで、初回アクセス時でもHTTPS通信を行うことが可能になります。

HSTSの構文


max-age=<expire-time>|必須
秒数を指定し、その期間内はサイトにHTTPSだけで接続するようブラウザキャッシュに保存させます。

includeSubDomains|オプション
省略可能なオプション。この引数が指定されると、そのサイトの全てのサブドメインにもこのルールが適用されます。

preload|オプション
省略可能なオプション。仕様書では定義されていない非公式なオプション。Googleの運営するHSTS先読みサービス(https://hstspreload.org/)にドメインの追加を申請する事で、HSTSプリロードリストへ当該ドメインが追加されます。リストへの登録後、WebサーバーのHSTSの設定ファイルにpreloadオプションを付与する事で機能します。

Apache、Nginx、IISでの設定方法

基本的にはレスポンスヘッダに「Strict-Transport-Secutiry」を追加するだけです。

【Apache】mod_headerモジュールを用いて、レスポンスヘッダに追加

Header set Strict-Transport-Security: "max-age=31536000; includeSubDomains; preload"

【Nginx】add_headerディレクティブでレスポンスヘッダに追加

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

【IIS】IISマネージャーからレスポンスヘッダに追加

(1) 「IISマネージャー」を開く
(2) 「機能ビュー」を開く
(3) 「HTTP応答ヘッダ」をダブルクリックする
(4) 「操作」のペインで「追加」をクリックする
(5) 「名前」「値」を以下のように設定する(有効期限1年、サブドメイン)
名前:Strict-Transport-Security
値:max-age=31536000; includeSubDomains; preload;
(6) 「OK」を押下する

ちなみにレオンテクノロジーのサイトは?

Mozillaが実装しているHSTSの先読みリストにてレオンテクノロジーのドメインが確認できました。登録済みです。

国内CDNサービスシェア上位3位の設定例

CloudFront

そのままでは適応ができません。
Lambda@Edgeを組み合わせることによって適応可能です。
CloudFrontEventのOriginResponseをトリガーにスクリプトを実行します。


javascript

'use strict';
exports.handler = (event, context, callback) => {
  const response = event.Records[0].cf.response;
  const headers = response.headers;
  headers['strict-transport-security'] = [{
    key: 'Strict-Transport-Security',
    value: 'max-age=31536000; includeSubdomains; preload'
  }];
  callback(null, response);
};

Cloudflare

ダッシュボードで設定可能です。
Cloudflare SSL/TLS appから、「HSTSを有効にする」をクリック。

1. Log in to the Cloudflare dashboard.
2. Click the appropriate Cloudflare account for the domain requiring HSTS.
3. Ensure the proper domain is selected.
4. Click on the Cloudflare SSL/TLS app.
5. Click Enable HSTS under the HTTP Strict Transport Security (HSTS) section.
6. A confirmation window appears. Review the warning content.
7. To proceed, click I Understand.
8. Click Next.

Akamai CDN

ダッシュボードから設定可能です。
Modify Outgoing Response Headerで、HSTSのヘッダーを登録します。

参考サイト

https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Strict-Transport-Security
https://ja.wikipedia.org/wiki/HTTP_Strict_Transport_Security
https://tools.ietf.org/html/rfc6797
https://53ningen.com/config-hsts-to-nginx-and-apache/
https://qiita.com/rocinante-ein/items/8250ec6a6712a9dcb96a
https://news.mynavi.jp/article/20171002-a047/
https://terasolunaorg.github.io/guideline/5.1.1.RELEASE/ja/Security/LinkageWithBrowser.html
https://ssl.sakura.ad.jp/column/always-on-ssl2/
https://www.cybertrust.ne.jp/journal/google-hsts.html
https://transparencyreport.google.com/https/overview?hl=ja
https://developers.google.com/web/fundamentals/security/encrypt-in-transit/why-https
https://rms.ne.jp/Introduction_to_https/redirect_and_hsts.html
https://itneko.com/nginx-hsts/
https://inaba-serverdesign.jp/blog/20190807/hsts_preload_settings.html
https://jp.alibabacloud.com/help/doc-detail/95839.htm
https://www.ipa.go.jp/security/ipg/documents/ssltls_server_config_20150803.pdf

レオンテクノロジーは現在、一緒に働く仲間を募集しております!
興味がある方はこちらから!

セキュリティに関するご相談はこちらから!

こんな記事も読まれています