今回は暗号通信に関するお話です。
CloudflareにはKeyless SSLというユニークな機能がありますのでご紹介致します。
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のアイコンになっていますが、クラウドフレア以外のサーバでも同様です。
CloudflareのKeyless SSLを用いた場合は以下のようなフローになります(RSAの場合)。
この手順はSSLのセッション単位で行われますので、リクエスト単位で行われる訳ではありません。 SSLのセッションタイムアウトはデフォルトで18時間ですが、変更することも可能です(5分~48時間)。
Keyless SSLは、セッションキーの元になるデータの1つであるプリ・マスター・シークレットを暗号化された状態でKey Serverへ送り、復号して返してもらう仕組みです。
プリ・マスター・シークレットを取り出す処理だけを外部へ出した感じですね。
コンテンツへのリクエストの都度、この処理が発生する訳ではありませんので、応答性に関する影響は限定的です。
通常のBYOKの場合、証明書と秘密鍵をCloudflareのダッシュボードへインポートすると、瞬く間に世界中のエッジサーバへ配布されますので、ポリシーとしてそれを許容できない企業もあろうかと思います。そのような場合の解決策としてご検討なさってみてはいかがでしょうか。
執筆者:角田 貴寛
三井情報株式会社
ソリューション技術本部 次世代基盤第二技術部 第一技術室
CISSP、CEH
現在、セキュリティ関連調査研究・教育業務に従事