Categories
程式開發

CloudFlare開源網絡時間安全協議:同時支持NTP和NTS


CloudFlare最近宣布網絡時間安全(Network Time Security,NTS)協議發布第一個主要版本。該版本構建在他們之前發布time.cloudflare.com之上,這是其免費的時間服務,支持網絡時間協議(Network Time Protocol,NTP)和NTS。

CloudFlare的免費時間服務time.cloudflare.com,同時支持NTP和正在興起的NTS協議。但是,在它發布的時候,並沒有太多可用的NTS客戶端。隨著他們的新CFNTS項目的發布,CloudFlare希望能夠鼓勵NTS協議的廣泛採用。NTPSec最近發布了對NTS的支持。

如果你組合使用time.cloudflare.com和NTPsec或者它們的新CFNTS項目的話,CloudFlare推薦啟用NTS。他們還提到daemon需要支持TLS 1.3。

NTS是由兩個子協議形成的套件。第一個是網絡時間安全秘鑰交換(Network Time Security Key Exchange,NTS-KE)。該協議負責秘鑰材料的創建,並且負責與第二個協議NTPv4的參數協商。 NTPv4是當前版本的NTP協議,允許客戶端與遠程的服務器同步時間。

CloudFlare的加密工程師Watson Ladd和軟件工程師Pop Chunhapanya這樣說到:

為了維護NTPv4的可擴展性,很重要的一點就是服務器不維護每個客戶端的狀態。一個很小的服務器就能為數百萬個NTP客戶端提供服務。在提供安全性的同時又能保證這種屬性是通過cookie來實現的,cookie由服務器提供給客戶端並且包含了服務器的狀態。

為了在第一階段完成這一點,客戶端需要發送一個請求給NTS-KE 服務器並通過TLS獲取一個響應。在這個階段,涉及到多個功能:

  • 協商在第二階段使用的AEAD算法;
  • 協商第二個協議(目前,標準只定義了NTS如何與NTPv4協作);
  • 協商NTP服務器的IP地址和端口;
  • 創建第二階段使用的cookie;
  • 從TLS會話創建兩個對稱秘鑰(C2S和S2C)。

CloudFlare開源網絡時間安全協議:同時支持NTP和NTS 1

NTS過程的第一階段

在第二階段,客戶端現在可以安全地與協商過的NTP服務器同步它們的時鐘。為了確保安全完成,客戶端會發送帶有四個擴展的NTPv4包。第一個擴展為唯一的標識符擴展,包含了用於防止重播攻擊的隨機nonce。第二個擴展是NTS cookie擴展,它會為客戶端提供兩個cookies中的某一個。因為只有客戶端記得兩個AEAD秘鑰(C2S和S2C),所以服務器端需要這個cookie來提取秘鑰。每個cookie中包含了秘鑰,這些秘鑰由服務器端所持有的秘鑰進行了加密。

第三個擴展是NTS cookie佔位符擴展,這是客戶端發送給服務端的一個信號,用來請求額外的cookie。之所以需要它是為了確保響應不會比請求明顯長太多,以避免放大攻擊(amplification attacks)。最後一個擴展是NTS認證器和加密擴展字段的擴展,它包含AEAD算法的一個密文,以C2S作為密鑰,NTP頭信息、時間戳和所有上述的擴展作為相關的數據。我們需要此頭信息來防止時間戳仿造

按照Ladd和Chunhapanya所述:

第二次握手可以重複很多次,而不會回到第一個階段,因為每個請求和響應都會給客戶端一個新的cookie。因此,TLS中昂貴的公鑰操作被分攤到大量請求中。

團隊決定使用Rust來實現他們的服務,這與他們通常所選擇的Go語言有所不同。正如作者們所指出的,他們決定使用Rust是因為“在響應NTP包的過程中垃圾收集暫停將會對精確性產生負面影響”。他們還指出,Rust的內存安全性、不可為空性、線程安全性、不可變性和錯誤處理的特性是他們做出選擇時的主要考慮因素。

隨著這個版本的發布,CloudFlare已經將他們的時間服務添加到公共NTP池中。 NTP池是一個由志願者維護的服務,它在世界範圍內提供NTP服務器。然而,他們注意到NTS在池模型中不能很好地運行。為了獲得最佳的安全性,CloudFlare建議啟用NTS並使用time.cloudflare.com或其他支持NTS的服務器。

CFNTS服務已經基於2-Clause BSD許可證開源。 CloudFlare希望他們的解決方案能夠讓更多的客戶在未來支持NTS。目前,他們正在積極地尋求對代碼庫的貢獻。

原文鏈接:

CloudFlare Releases Open Source Implementation of Network Time Security Protocol