CloudFlareは、同社のNetwork Time Security(NTS)プロトコルの最初のメジャーリリースを発表した。同社が以前リリースした、Network Time Protocol(NTP)とNTSをサポートする無償のタイムサービズであるtime.cloudflare.comがベースとなっている。
CloudFlareの無償タイムサービスであるtime.cloudflare.comは、NTPに加えて最新のNTSプロトコルをサポートしているが、リリース時点では、利用可能なNTSクライアントがあまり多くはなかった。新たなCNFTSプロジェクトのリリースによって同社は、NTSプロトコルの普及を促進したいと考えている。また、先日リリースされたNTPSecもNTSをサポートしている。
CloudFlareでは、NTPsecまたは同社のCNFTSプロジェクトでtime.cloudflare.comを使用することを推奨している。注意する点としては、使用に際してTLS 1.3をサポートするデーモンが必要なことだ。
NTSは2つのサブプロトコルからなるスイートである。1番目のNetwork Time Security Key Exchange(NTS-KE)は、キーマテリアルの生成処理と、第2のプロトコルであるNTPv4のためのパラメータネゴシエーションを担当する。現行のNTPプロトコルであるNTPv4は、クライアントがリモートサーバとの時間同期を行うことを可能にする。
CloudFlareの暗号処理エンジニアであるWatson Ladd氏と、同社ソフトウェアエンジニアのPop Chunhapanya氏は、次のように述べている。
NTPv4のスケーラビリティを維持する上で重要なのは、サーバがクライアント毎の状態を保持する必要のないことです。ごく小規模なサーバでも、数百万台のNTPクライアントに対応が可能なのです。この特徴を維持しながらセキュリティを提供するために、クッキーを使用して、サーバの状態をクライアントに提供しています。
第1ステージでこれを実現するため、クライアントはNTS-KEサーバにリクエストを送信し、TLS経由で応答を受信する。このステージにはいくつかの機能がある。
- 第2ステージで使用するAEADアルゴリズムのネゴシエーション
- 第2プロトコルのネゴシエーション(現在の標準では、NTPv4を使用するNTSの動作のみが定義されている)
- NTPサーバのIPアドレスとポートのネゴシエーション
- 第2ステージで使用するクッキーの生成
- TLSセッションによる2つの対象鍵(C2SとS2C)の生成
第2ステージでは、クライアントが、ネゴシエーションしたNTPサーバとの時間同期を安全に行うことができる。これを実現するため、クライアントは、NTPv4パケットを4つのエクステンションを加えて送信する。第1のエクステンションであるユニークIDエクステンション(unique identifier extension)には、リプレイ攻撃を防ぐためのランダムなナンス(nonce)が含まれている。次のNTSクッキーエクステンション(NTS cookie extension)は、2つのクッキーのひとつをクライアントに提供する。2つのAEAD鍵(C2SとS2C)はクライアントのみが記憶しているため、サーバが鍵を取得するためにこのクッキーが必要なのだ。このクッキーには、サーバの秘密鍵で暗号化された鍵情報が格納されている。
第3のエクステンションであるNTSクッキープレースホルダエクステンション(NTS cookie placeholder extension)では、サーバからの追加クッキーを要求するために、クライアントからシグナルが送信される。これは、要求に対する応答が必要以上に長いものでないことを保証して、アンプ攻撃(amplification attack)を防止するために必要なものだ。最後のエクステンションであるNTS認証及び暗号化エクステンションフィールドエクステンション(NTS authenticator and encrypted extension fields extension)には、C2Sを鍵に使用したAEADアルゴリズムによる暗号化テキスト(ciphertext)とNTPヘッダ、タイムスタンプ、および関連データとしてこれまでのすべてのエクステンションが含まれている。このヘッダは、タイムスタンプのなりすまし(spoof)を防止するために必要となる。
Ladd、Chunhapanya両氏が、次のように説明している。
第2のハンドシェイクは、第1ステージに戻ることなく何回も繰り返すことが可能なので、リクエストとレスポンス毎に新たなクッキーをクライアントに提供することができます。これによって、公開キー操作に伴って発生する高いコストを、多数のリクエストで分割償却することが可能になるのです。
開発チームは、同社が開発言語として通常使用しているGoではなく、Rustを選択してサービスを実装した。チームによれば、Rustを選択したのは、"NTPパケットへの応答中のガベージコレクションによる停止が、精度に悪影響を与える"ためだ。Rustのメモリ安全性、非null機能、スレッド安全性、不変性(immutability)、エラー処理なども、言語選択において重要な要素となった。
今回のリリースに合わせて、CloudFlareでは、同社のタイムサービスに公開NTPプールを追加した。NTPプールはボランティアがメンテナンスするサービスで、世界中でNTPサーバを提供している。ただしプールモデルでは、NTSが十分に機能しない点に注意が必要である。最高のセキュリティを得るために、CloudFlareでは、NTSを有効にした上で、time.cloudflare.comまたはNTPをサポートする他のサーバを使用することを推奨している。
CNFTSサービスは、2-Clause BSDライセンス下でオープンソースとして公開されている。CloudFlareでは、同社のソリューションによって、将来的により多くのクライアントでNTSがサポートされることを望んでおり、コードベースでのコントリビューションを積極的に募集している。