NTS協定簡析
目前網際網路中ntp是仍在使用不安全的網際網路協定之一。後來Cloudflare釋出了NTS協定,去保證NTP的安全。
NTP傳統請求過程
- 用戶端向NTP伺服器發送查詢包
- 伺服器用時鐘時間進行響應
- 用戶端計算其時鐘和遠端時鐘之間的內插補點得到估計值,并試圖補償其中的網絡延遲
注意:NTP 用戶端會查詢多個伺服器并實施算法來選擇最佳估計值,并拒絕明顯錯誤的答案。
NTS連接配接過程
- 協商在第二階段使用的 AEAD 算法;
- 協商第二個協定(目前,标準隻定義了 NTS 如何與 NTPv4 協作);
- 協商 NTP 伺服器的 IP 位址和端口;
- 建立第二階段使用的 cookie;
- 從 TLS 會話建立兩個對稱秘鑰(C2S 和 S2C)。
支援NTS協定的伺服器
目前支援NTS的公共伺服器非常少,主要的提供商有Cloudflare和Netnod
如何使用NTS
ntpclient現在有兩個版本,一個是python版本,一個是go版本,另外則是chrony已經有分支支援nts。fedora從33版本已經開始支援NTS了。
條件
系統僅支援Debian 9 (Stretch), Debian 10 (Buster), Ubuntu 16.04 LTS (Xenial Xerus) , Ubuntu 18.04 LTS (Bionic Beaver).
編譯ntsclient
拉取庫
git clone https://gitlab.com/hacklunch/ntsclient; cd ntsclient; make
假如不想ntsclient以root使用者運作
sudo setcap CAP_SYS_TIME+ep ./ntsclient
執行
./ntsclient --config ntsclient.toml
編譯NTPsec
拉取庫,使用./buildprep安裝建構需要的包
git clone https://gitlab.com/NTPsec/ntpsec.git; cd ntpsec;sudo ./buildprep
建構完成後,可以用waf建構NTPsec
./waf configure
./waf build
設定配置檔案,建立ntp.conf
# Exchange time with everybody, but don't allow configuration.
# This is the right security setup for 99% of deployments.
restrict default kod limited nomodify nopeer noquery
restrict -6 default kod limited nomodify nopeer noquery
# Local users may interrogate the NTP server more closely.
restrict 127.0.0.1
restrict -6 ::1
# Minimal logging - we declare a drift file and that's it.
driftfile /var/lib/ntp/ntp.drift
server nts.netnod.se:4460 nts iburst
server sth1.nts.netnod.se:4460 nts iburst
server sth2.nts.netnod.se:4460 nts iburst
開始測試,測試前需要暫停ntp,chrony,openntpd
sudo service ntp stop
sudo service chrony stop
sudo service openntpd stop
開啟啟動NTPsec伺服器
sudo ./build/main/ntpd/ntpd -n -d -c ntp.conf