Cloudflare で SSL

某違法サイトも利用していたという CDN のサービスが Cloudflare です。

CDN はコンテンツ配信のためのサーバネットワークで、閲覧者に近いサーバからコンテンツを配信することにより、読み込み速度向上や通信リソース節約などを目的とするものです。

この仕組みを利用すると、代理となるサーバを経由してコンテンツを配信することになるため、もともとのサーバが隠れることになります。

これはどういうことかというと、

hoge.test というドメインでサイトを運用していたとして、ブラウザがそのサイトのページを表示するときには、DNShoge.test の IP アドレスを引いて、その IP アドレス(仮に 192.0.2.1 とします)を使用して通信を行うことになります。
IP アドレスがわかれば、その IP アドレスを管理している運営会社からサイトの運営者をたどることができます。*1
しかし Cloudflare を利用している場合は、hoge.test ドメインの IP アドレスを引くと CDN のサーバの IP アドレスが得られるように設定します。
これにより、実際のコンテンツを配信するのは 192.0.2.1 のサーバではなく、CDN のサーバ=別の IP アドレスのサーバになります。
そのドメインで運用されている本当のサーバの IP アドレスが隠れてしまうということになるわけです。

話がそれそうになってしまいましたが、つまり CDN を導入すると以下のような構成になるということです。

導入前:ブラウザ <--(1)--> 本当のサーバ
導入後:ブラウザ <--(2)--> CDN のサーバ <--(3)--> 本当のサーバ


さてここで SSL について考えてみます。SSL(/TLS) はブラウザなどとサーバの間の通信を暗号化したり実在性の認証を行ったりするものです。

上記でいえば、本当のサーバに SSL の設定をしていたとすると、それは (1) と (3) の部分になります。

導入後は、ブラウザと直接やり取りをする相手は CDN のサーバになるため、(2) の部分で SSL の設定を行う必要があります。

Cloudflare では、(2)、(3) の部分をどのようにするか設定を行うことができます。大きく分けて以下の2つがあります。

  • Flexible
  • Full

上記いずれも (2) の部分は SSL 化してくれます。
それぞれの違いは、Flexible は (3) の部分で SSL 通信を行わず、Full は (3) の部分で SSL 通信を行う というものです。

Flexible を利用すれば、本当のサーバで SSL を導入していなくてもブラウザに対しては SSL 化できる、ということになります。

ただし、Full を利用できるのであれば Full を利用した方がよいでしょう。セキュリティ的な側面も1つですが、サイトの設定周りに大きく影響する可能性があります。
Flexible を利用する場合は以下のような点に注意が必要です。

  • HTTP でアクセスされてきたときに HTTPS にリダイレクトしている
  • ページに http://~ をハードコーディングしている
  • HTTP か HTTPS かを見て何かを切り替えている (Wordpress など)

Cloudflare の場合、X-Forwarded-Proto というヘッダに "https" を設定して送信してくれるので、これを見て処理を行うようにする必要があるかもしれません。



*1:ドメイン名の取得者からたどる方法もあると思います