cybozu.com を真に常時 SSL にする話

@ymmt2005 こと山本泰宇です。

今回は cybozu.com を安全に利用するために暗号化した通信(SSL)を常時使用するための取り組みを紹介します。

HTTP と HTTPS

Web ブラウザのアドレスバーに "www.cybozu.com" と打ち込むと、通常は暗号化されない HTTP 通信が行われます。そこでまず考えられるのは、Web サーバーにて HTTP 通信を受け付けたら、HTTPS に永続的リダイレクトをすることです。Apache なら以下のような設定になるでしょう。

<VirtualHost *:80>
    ServerName www.cybozu.com
    Redirect permanent / https://www.cybozu.com/
</VirtualHost>

一見これで良いようにも思えますが、最初の HTTP 通信時に中間者攻撃を仕掛けられた場合は、攻撃者の思うままのレスポンスが返ってしまうので万全ではありません。そこで考案されたのが HTTP Strict Transport Security (HSTS) です。

HSTS とその弱点

HSTS はサーバーから "Strict-Transport-Security" というヘッダを返すことで、以後そのブラウザで "www.cybozu.com" と入力すると HTTP ではなく HTTPS で暗号化した通信を行うようにする機能です。Apache なら SSL のバーチャルホストで以下のように設定します。

<VirtualHost *:443>
    ServerName www.cybozu.com
    SSLEngine on
    Header set Strict-Transport-Security "max-age=315360000; includeSubDomains"
</VirtualHost>

しかし、いくつかの弱点があります。

  • 対応ブラウザが Chrome と Firefox

    IE と Safari はまだ対応していません。

  • はじめて訪れる際は HTTP でアクセスするので、中間者攻撃をされる可能性がある

詳細は徳丸浩氏の「HTTPSを使ってもCookieの改変は防げないことを実験で試してみた」にて解説されています。

Preloaded HSTS

対応ブラウザが限定される方はどうにもなりませんが、Chrome と Firefox については初回訪問から HTTPS 通信を行うようにする preloaded HSTS という仕組みがあります。ブラウザのソースコードに、"www.cybozu.com" なら HTTPS で通信するというルールを直接書いておくのです。

実際に Chrome に組み込まれているリストは、以下のソースコードで確認できます。

Firefox はこの Chrome のリストを参照してリストを生成しているようです(Preloading HSTS)。

Chrome のリストに cybozu.com を組み込む

先のソースコードには、以下のような行があります。

{ "name": "cybozu.com", "include_subdomains": true,  "mode": "force-https" },

cybozu.com はお客様ごとに異なるサブドメインを発行してグループウェアを利用していただいているので、"cybozu.com" 以下のすべてのサブドメインを対象にしてもらいました。手続きについては、以下のページに書いてある通り、メールを出して依頼します。

参考までに、我々が送ったメールの文面は以下の通りです。

Dear .... My name is xxxx. I am writing this mail as a representative of my company, Cybozu, to ask you to add our domain to Chrome's preloaded HSTS list. Cybozu is a leading groupware vendor in Japan. Its cloud service called "cybozu.com" has 4000+ customer companies. Every customer of "cybozu.com" has a subdomain under cybozu.com all of which are SSL-enabled with HSTS. So, would you please add "cybozu.com" to Chrome's preloaded HSTS list? [Format] {"name": "cybozu.com", "include_subdomains": true, "mode": "force-https"} Information about our service: * https://cdn-demo.cybozu.com/ (A customer domain for demonstration) * https://www.cybozu.com/jp/ (for Japanese) * https://kintone.cybozu.com/us/ (for US) Sincerely,

まとめ

cybozu.com の通信を常時暗号化する HSTS を Chrome にソースコードレベルで組み込む取組を紹介いたしました。お客様が安全にご利用いただけるよう、今後も各種の取り組みを続けてまいります。

Preloaded HSTS は @hasegawayosuke 氏の tweet で知りました。いつも有益な情報をいただけるので感謝しております。