ペパボ研究所主席研究員の松本です。Twitter上ではまつもとりー(@matsumotory)と呼ばれています。2017年の5月25日から2日間にわたり開催された、第37回インターネットと運用技術研究会で、高集積マルチテナントWebサーバの大規模証明書管理について研究発表してきました。論文(研究会予稿)とスライドを以下に公開します(論文画像をクリックするとPDFで読むことが出来ます)。
論文(研究会予稿)
スライド
研究の概要は以下の通りです。
インターネットの利用に際して,ユーザーや企業においてセキュリティ意識が高まっている.また,HTTPのパフォーマンス上の問題を解消するために,HTTP/2がRFCとして採択された.それらを背景に,常時HTTPS化が進む中で,高集積マルチテナント方式のWebサーバで管理している大量のホストもHTTPS化を進めていく必要がある.同方式は単一のサーバプロセスで複数のホストを管理する必要があるが,Webサーバの標準的な設定を用いて事前にホスト数に依存した数の証明書を読み込んでおく方法では,必要なメモリ使用量が増大することで,サーバプロセスの起動時や,CGIのようなプロセスの複製時にOSのページテーブルのエントリ数に依存するシステムコールの性能が著しく低下する.そこで,Server Name Indication(SNI)を利用可能である条件下において,事前にサーバプロセスに証明書を読み込んでおくことなく,SSL/TLSハンドシェイク時にホスト名から動的にホストに紐づく証明書を読み込み,メモリ使用量を低減させる手法を提案する.実装には,我々が開発した,mrubyを用いて高速かつ少ないメモリ使用量でWebサーバの機能を拡張するモジュールngx_mrubyを採用して,動的にサーバ証明書を選択する機能を実装した.また,サーバ証明書データは,Redisによるキャッシュサーバによって管理し,本手法の有効性を評価した.
内容としては概要にある通りなのですが、弊社ではホスティングサービスやECサービスにおいて、大量にドメインやホストを保持し,常時HTTPS化に向けてドメインに紐づく証明書をどう管理していくかという課題がありました。さらにその課題を細分化すると、証明書を大量に読み込むことによる性能面の課題と、Webサーバの設定や証明書ファイルの管理の課題がありました。それらをペパボ研究所として解決するために、証明書をサーバ起動時にファイルベースで静的に全てのホストの数だけ読み込むのではなく、証明書データはファイルやデータベースなど任意の場所に配置し、サーバ起動時には読み込まずに、TLS/SSLハンドシェイク時に動的に読み込む方式を提案しました。
本手法によって、設定ファイルやプロセスのメモリ使用量はドメインや数に依存せず軽量となり、メモリ使用量増大による性能劣化の課題も同時に解決することができました。さらに、動的に証明書を読むことによって、新規のホストや証明書追加時にも、Webサーバプロセスを再起動することなく、ホストとホストに紐づく証明書データを用意するだけで、HTTPSで通信可能な新規ホスト環境を用意できるようになり、飛躍的に運用技術が洗練されました。また、TLS/SSLハンドシェイクのコストから見ると、動的に証明書を読み込む処理はほぼ無視できる程度であることも実験から明らかとなり、実運用上は問題とならない性能を出せています。
今後は、現在運用している実サービス上で、引き続き問題なく動いているか、本手法を適用する前後でサーバのリソース使用量や処理可能なリクエストに変化は生じたか、運用面ではどうであったかなどを引き続きモニタリングしながら、その運用実績も論文に反映していきたいと思っております。
【PR】パートナー積極採用中!
ペパボ研究所では、新しいパートナーを求めています。詳細については、当研究所のトップページをご覧ください。