Cloudflare

秘密鍵なしで暗号通信を実現?
ーコラムー
2019年11月29日号



今回は暗号通信に関するお話です。
CloudflareにはKeyless SSLというユニークな機能がありますのでご紹介致します。


BYOKとHYOK

CloudflareなどのCDN&クラウド型WAFサービスは、クライアントとサーバの間に入り、高速化やセキュリティに関する機能を提供しますが、機能の性質上、TLSの暗号通信を一旦復号して、再度暗号化する必要があります。コンテンツキャッシュや、WAFによるアプリケーションレベルでの攻撃検知を行うためには、暗号化されたままでは行えないためです。



そのため、Cloudflareのエッジサーバ上に、サイトの証明書と秘密鍵が格納された状態にします。 証明書はCloudflareから購入することも出来ますし、他で購入したものをインポートすることも出来ます。このことをBYOK(Bring Your Own Key)と言います。
しかし、一部では秘密鍵を他社へ共有することが出来ない要件、または技術的な障害が存在することがあります。
かといってヘビーなトラフィックをさばいたり、日々進化する攻撃に対処できる設備やその運用を、自前で設けるのは困難であり、非効率です。

そこでCloudflareでは、秘密鍵をお客様のデータセンターに保持したまま、通常と同様の暗号化/復号の処理を行えるKeyless SSL機能を開発しました。 鍵を自社で保持するため、HYOK(Hold Your Own Key)などと呼ばれることがあります。 Keyless SSLでは、お客様のデータセンター側に鍵を保管するKeyサーバが必要になります。





通常のフロー

Keyless SSLのしくみを説明する前に、まずはTLSハンドシェイクの流れについておさらいします。以下は鍵交換方式としてRSAを採用した場合のフロー(ざっくり版)です。 図では、サーバがCloudflareのアイコンになっていますが、クラウドフレア以外のサーバでも同様です。




  1. クライアントはClient Randomという乱数を生成し、Client Helloメッセージにのせてサーバ(この場合Cloudflare)へ送ります。
  2. サーバはServer Randomという乱数を生成し、Server Helloメッセージにのせてクライアントへ送ります。
  3. クライアントはプリ・マスター・シークレットを生成し、サイトの公開鍵を用いて暗号化してClient Key Exchangeメッセージへのせてサーバへ送ります。
  4. サーバは自身の秘密鍵を用いて上記3のデータを復号し、プリ・マスター・シークレットを取り出します。
  5. クライアント、サーバそれぞれがClient Random、Server Random、プリ・マスター・シークレットを用いてマスター・シークレットを生成します。生成されたマスター・シークレットは同一のものとなるため、交換は行いません。
  6. クライアント、サーバそれぞれがマスター・シークレットを元にセッションキーを生成します。
  7. セッションキーを使って暗号通信を行います。


Keyless SSLのフロー

CloudflareのKeyless SSLを用いた場合は以下のようなフローになります(RSAの場合)。


  1. クライアントはClient Randomという乱数を生成し、Client HelloメッセージにのせてCloudflareへ送ります。
  2. CloudflareはServer Randomという乱数を生成し、Server Helloメッセージにのせてクライアントへ送ります。
  3. クライアントはプリ・マスター・シークレットを生成し、サイトの公開鍵を用いて暗号化してClient Key ExchangeメッセージへのせてCloudflareへ送ります。ここまでは通常と同様の手順です。
  4. Cloudflareは暗号化されたプリ・マスター・シークレットをKey Serverへ送ります。
  5. Key Serverは4で受信したデータを秘密鍵で復号し、取り出したプリ・マスター・シークレットをCloudflareへ送ります。この時の通信は暗号化されたトンネル上で行われます。これ以降は通常の手順と同様です。
  6. クライアント、サーバそれぞれがClient Random、Server Random、プリ・マスター・シークレットを用いて、マスター・シークレットを生成します。生成されたマスター・シークレットは、同一のものとなるため、交換は行いません。
  7. クライアント、サーバそれぞれがマスター・シークレットを元に、セッションキーを生成します。
  8. セッションキーを使って暗号通信を行います。


この手順はSSLのセッション単位で行われますので、リクエスト単位で行われる訳ではありません。 SSLのセッションタイムアウトはデフォルトで18時間ですが、変更することも可能です(5分~48時間)。




まとめ

Keyless SSLは、セッションキーの元になるデータの1つであるプリ・マスター・シークレットを暗号化された状態でKey Serverへ送り、復号して返してもらう仕組みです。
プリ・マスター・シークレットを取り出す処理だけを外部へ出した感じですね。 コンテンツへのリクエストの都度、この処理が発生する訳ではありませんので、応答性に関する影響は限定的です。 通常のBYOKの場合、証明書と秘密鍵をCloudflareのダッシュボードへインポートすると、瞬く間に世界中のエッジサーバへ配布されますので、ポリシーとしてそれを許容できない企業もあろうかと思います。そのような場合の解決策としてご検討なさってみてはいかがでしょうか。






角田貴寛

 執筆者:角田 貴寛

三井情報株式会社
ソリューション技術本部 次世代基盤第二技術部 第一技術室
CISSP、CEH
現在、セキュリティ関連調査研究・教育業務に従事