サイトの常時SSLにHSTSを使用する方法

· 3 min read
サイトの常時SSLにHSTSを使用する方法

サイトを常時 SSL 化する場合、リダイレクトによる設定が一般的ですが、
サーバー側で HSTS(HTTP Strict Transport Security)という設定をすることで
セキュリティを高めることができます。

今回は HSTS の設定方法と、その注意点についてまとめます。


HTTP Strict Transport Security (エイチティーティーピー・ストリクト・トランスポート・セキュリティ、略称 HSTS)とは、WebサーバーがWebブラウザに対して、現在接続しているドメイン(サブドメインを含む場合もある)に対するアクセスにおいて、次回以降HTTPの代わりにHTTPSを使うように伝達するセキュリティ機構である。RFC 6797 で規定されている。HTTP Strict Transport Security – Wikipedia

簡単に説明すると、
SSL 化したとしても http でアクセスされる場合があり、
セキュリティ上では万全ではない(通信を傍受されたり
フィッシング詐欺に遭ったりする危険性がある)ようです。

それを防ぐ仕組みとしてサーバー側で
HTTPS で必ず接続するようにとブラウザに指示するのが、HSTS の設定です。


HSTS の設定方法

HSTS の設定方法は .htaccess に以下の内容を記述します。

header set Strict-Transport-Security "max-age=31536000"

なお、nginx の場合は以下の通り。

server{
    listen      443;
    ssl on;
    ...
    add_header Strict-Transport-Security "max-age=31536000"; # 追加
}

max-age は有効期間です。単位は秒で、86,400 秒は 1 日です。
31,536,000 は 1 年間を設定しています。

そのほか、includeSubDomainspreload のオプション項目があります。

  1. includeSubDomains・・・ルールをすべてのサブドメインにも適用したい場合に設定します。
  2. preload・・・プリロードさせたい場合に設定します。(内容は後述しています)

設定反映後、ブラウザで実際にアクセスして
レスポンスヘッダに HSTS の項目が設定されていることが確認できます。

# curl --head http://18.183.225.54
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 03 May 2017 06:16:45 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.24
Link: <http://18.183.225.54/?rest_route=/>; rel="https://api.w.org/"
#Strict-Transport-Security: max-age=31536000;

参考:
HTTP Strict Transport Security – Web セキュリティ | MDN

以上です。


おまけ

HSTS をさらに確実にするために
「プリロード HSTS(Preload HSTS)」という仕組みがあります。
こちらについての解説は以下に記載しておりますので、ご興味のある方はぜひ。

<!--more-->

HSTS の設定は 2 回目以降のアクセスについて、
HTTP の URL をブラウザに打ち込んでも HTTPS でアクセスさせる仕組みです。

しかし、初回のアクセスについては
HTTP でアクセスすることがあり得るので、セキュリティは万全とはいえない状態です。

そのため、HSTS をさらに確実にするために
プリロード HSTS(Preload HSTS)」という仕組みがあります。

これは、プリロード HSTS に対応しているブラウザ(Firefox、Chrome、Safari)に
「このドメインは HSTS を設定している」ということを事前に知らせておくことができるので、
初めてアクセスするときから HTTP を使わず HTTPS で接続できるようになります。


設定方法

上で記載した HSTS の設定に、includeSubDomains と preload を追加してやります。

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

これでサーバ側の設定は完了です。


ドメインをプリロードリストに登録する

Google では、ドメインを HSTS Pre-loaded List に登録するサービスを行っています。
ここからドメインを登録すれば、各対応ブラウザにも反映されます。

HSTS Preload Submission
https://hstspreload.appspot.com/

上部の入力ボックス内にプリロードするドメインを入力し、Enter を押下します。

成功すればこの様な画面になりますので、Submit の 2 箇所のチェックボックス
(お前はドメインサイトの所有者か、サブドメインも HTTPS 化してるか)
にチェックを入れ Enter を押下します。

設定に誤りがあると、この様にエラー画面になりますので、もう一度設定を確認します。

プリロードリストへの反映は時間がかかりますが、
反映後はメジャーブラウザで HTTPS がデフォで通信しに来ます。


プリロードリストに登録するときの注意点

ここで重要なのが、プリロードリストに登録するときに条件が書かれている点です。

  1. 有効な証明書を持っている
  2. 同じホスト上の HTTP から HTTPS にリダイレクトしている
  3. すべてのサブドメインで HTTPS 化している
    • そのサブドメインの DNS レコードが存在する場合は特に、www のサブドメインに HTTPS をサポートしている必要がある
  4. HTTPS リクエストのために以下の HSTS ヘッダを送信している
    • max-age が少なくとも 18 週間(10886400 秒)でなければいけない
    • includeSubDomains を指定する必要がある
    • preload を指定する必要がある
    • HTTPS サイトから追加のリダイレクトを提供している場合は、そのリダイレクトも HSTS ヘッダを持っている必要がある

上記を満たしている必要があります。
結構たいへんですね。


プリロード HSTS まとめ

プリロード HSTS は上記の条件を満たした場合にのみ適用できるものなので、
通常のリダイレクト処理で HTTPS 化したほうが無難そうです。。

もしサイトのセキュリティを高めたいという方は、ぜひご一考ください。

※参考サイト
https://www.note.technology/note/201604111454
http://tuono034s.com/web-entry/2310/