BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース CloudFlareがNetwork Time Securityプロトコルのオープンソース実装をリリース

CloudFlareがNetwork Time Securityプロトコルのオープンソース実装をリリース

原文(投稿日:2019/11/24)へのリンク

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)の生成

NTSプロセスの第1ステージ

NTSプロセスの第1ステージ(提供:CloudFlatre)

 

第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がサポートされることを望んでおり、コードベースでのコントリビューションを積極的に募集している。

この記事に星をつける

おすすめ度
スタイル

BT