內網搭建NTS服務器
關鍵字 : ntp nts ipv6
NTS 是 Network Time Security(網絡時間安全)的縮寫,是 NTP 的一種安全擴展機制。它利用傳輸層安全(TLS)和相關數據的認證加密(AEAD),為 NTP 的客戶端 - 服務器模式提供加密安全保障,以防止時間同步過程中的中間人攻擊等安全問題
環境 :
- Centos 9 兩臺 (一臺做NTP服務端,另一臺做NTP客戶端)
- IP :
- NTP服務端
- IP :
192.168.132.11
和fd15:4ba5:5a2b:1008:192:168:132:11
- 主機名 :
ntpserver
- IP :
- NTP客戶端 :
192.168.132.12
和fd15:4ba5:5a2b:1008:192:168:132:12
- NTP服務端
本文是模擬在內網中搭建NTS服務端,以便讓網內的服務器同步時間
一。前置任務 :
1.創建自簽名服務端證書.
- 本例中,服務端證書和私鑰的文件名是 :
ntpserver.crt
和ntpserver.key
- 根CA和中介CA的文件名是 :
imca.crt
和rootca.crt
- 服務端證書中SAN的DNS必須包含 NTP服務端的主機名.在本例中,DNS有2個 :
ntpserver
和ntpserver-ipv6
- 如果服務端證書是通過中介CA簽署,則服務端證書必須包含中介CA證書。順序是 : 服務端證書+中介CA證書
cat ntpserver.crt imca.crt >new-ntpserver.crt
- 證書和私鑰以及CA證書需設置屬性,以便被
chrony用戶
讀取
# 本例中包含 中介CA的服務端證書 和 私鑰 以及 根CA證書 拷貝到 /etc/pki目錄下了
chown :chrony /etc/pki/new-ntpserver.crt /etc/pki/rootca.crt
chown chrony /etc/pki/ntpserver.key
結果如下 :
-rw-r-----. 1 root chrony 1587 May 25 20:15 new-ntpserver.crt
-rw-------. 1 chrony root 241 May 25 20:13 ntpserver.key # 僅允許chrony用戶讀取私鑰
-rw-r-----. 1 root chrony 768 May 6 12:27 rootca.crt
二。安裝和配置NTS服務端
2.1 安裝chrony
dnf install chrony
安裝完畢后,會得到系統服務 chronyd.service
以及 客戶端軟件 chronyc
2.2 配置NTS服務端
配置文件是/etc/chrony.conf
2.2.1修改 /etc/chrony.conf
,增加如下內容 :
initstepslew 1
manual
# 允許IPV4 和 IPV6的網絡范圍
allow 192.168.132.0/24
allow fd15:4ba5:5a2b:1008:192:168::/64# 啟用NTS 私鑰和公鑰要能被系統用戶chrony讀取
ntsserverkey /etc/pki/ntpserver.key
ntsservercert /etc/pki/new-ntpserver.crt
ntstrustedcerts /etc/pki/rootca.crt# 處理NTS請求的進程數量.缺省是1
ntsprocesses 3# 服務端生成新密鑰的周期(單位:秒,缺省是1周).每天一次
ntsrotate 86400smoothtime 400 0.01
2.2.2 修改 /etc/chrony.conf
,注釋如下內容 :
server
和pool
開頭的行。因為假設場景是以本機作為NTP服務端,所以屏蔽上游的NTP源sourcedir
開頭的行
注釋后的效果如下 :
# server ntp1.aliyun.com iburst
# pool 2.centos.pool.ntp.org iburst
# sourcedir /run/chrony-dhcp
2.3 開放防火墻
firewall-cmd --permanent --add-port=123/udp
# TCP 4460 是NTS-KE協議的端口
firewall-cmd --permanent --add-port=4460/tcp
firewall-cmd --reload
2.4 重啟chronyd
systemctl restart chronyd
然后檢查服務狀態,確保啟動成功
systemctl status chronyd
如下為啟動成功的日志:
May 25 20:30:55 myserver1 systemd[1]: Starting NTP client/server...
May 25 20:30:55 myserver1 chronyd[3887]: chronyd version 4.6.1 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASY>
May 25 20:30:55 myserver1 chronyd[3887]: Loaded 0 symmetric keys
May 25 20:30:55 myserver1 chronyd[3887]: Using right/UTC timezone to obtain leap second data
May 25 20:30:55 myserver1 chronyd[3887]: Frequency -6.921 +/- 0.581 ppm read from /var/lib/chrony/drift
May 25 20:30:55 myserver1 chronyd[3887]: Loaded seccomp filter (level 2)
May 25 20:30:55 myserver1 systemd[1]: Started NTP client/server.
特別說明 :
- 由于chronyd 是由操作系統用戶chrony啟動,因此必須確保證書、私鑰、根證書文件能被用戶chrony讀取
- 查看chronyd的進程情況
ps -ef |grep chronyd
輸出類似如下 :
chrony 846 1 0 08:34 ? 00:00:00 /usr/sbin/chronyd -F 2
chrony 847 846 0 08:34 ? 00:00:00 /usr/sbin/chronyd -F 2
chrony 848 846 0 08:34 ? 00:00:00 /usr/sbin/chronyd -F 2
chrony 849 846 0 08:34 ? 00:00:00 /usr/sbin/chronyd -F 2
至此,NTS的服務端搭建完成
三。安裝和配置NTS客戶端
3.0 將根證書(rootca.crt)拷貝到/etc/pki目錄下并設置屬性
scp -p 192.168.132.11:/etc/pki/rootca.crt /etc/pki/
chown :chrony /etc/pki/rootca.crt
3.1 安裝chrony
dnf install chrony
安裝完畢后,會得到系統服務 chronyd.service
以及 客戶端軟件 chronyc
3.2 配置NTS客戶端
配置文件是/etc/chrony.conf
3.2.1修改 /etc/chrony.conf
,增加如下內容 :
# server最后的nts表示服務端啟用nts。且使用域名(不用使用IP地址)
server ntpserver iburst nts
server ntpserver-ipv6 iburst nts# 根據情況決定是否在客戶端設置此選項
allow 192.168.132.0/24
allow fd15:4ba5:5a2b:1008:192:168::/64# 指定NTS的信任證書
ntstrustedcerts /etc/pki/rootca.crt
3.2.2 修改 /etc/chrony.conf
,注釋如下內容 :
server
和pool
開頭的行。因為假設場景是以步驟二的服務器作為NTP時間源,所以屏蔽其他的NTP源sourcedir
開頭的行
注釋后的效果如下 :
# server ntp1.aliyun.com iburst
# pool 2.centos.pool.ntp.org iburst
# sourcedir /run/chrony-dhcp
3.3 開放防火墻
firewall-cmd --permanent --add-port=123/udp
# TCP 4460 是NTS-KE協議的端口
firewall-cmd --permanent --add-port=4460/tcp
firewall-cmd --reload
3.4 設置域名與IP的對應關系
編輯/etc/hosts
,增加如下內容 :
# NTS 服務端的IP地址和主機名
192.168.132.11 ntpserver
fd15:4ba5:5a2b:1008:192:168:132:11 ntpserver-ipv6
3.4 重啟chronyd
systemctl restart chronyd
然后檢查服務狀態,確保啟動成功
systemctl status chronyd
成功啟動日志如下 :
May 25 23:19:40 myclient systemd[1]: Starting NTP client/server...
May 25 23:19:40 myclient chronyd[1223]: chronyd version 4.6.1 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +NTS +SECHASH +IPV6 +DEBUG)
May 25 23:19:40 myclient chronyd[1223]: Loaded 0 symmetric keys
May 25 23:19:40 myclient chronyd[1223]: Using right/UTC timezone to obtain leap second data
May 25 23:19:40 myclient chronyd[1223]: Frequency 14.467 +/- 5.921 ppm read from /var/lib/chrony/drift
May 25 23:19:40 myclient chronyd[1223]: Loaded seccomp filter (level 2)
May 25 23:19:40 myclient systemd[1]: Started NTP client/server.
特別說明 :
- 重啟服務后,容易出現"證書發行人不可信任的錯誤"。可能原因有2個,1是根證書(
rootca.crt
)的屬性,即chrony用戶要有讀取根證書的權限;2是服務端證書中SAN沒有包含NTS服務端的主機名(因為客戶端是通過域名訪問服務端)
#四。驗證
4.1 在客戶端查看時間源信息
chronyc sources
輸出如下 :
210 Number of sources = 1
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntpserver 8 8 377 6 +117us[ +124us] +/- 524us
^+ ntpserver-ipv6 8 8 377 142 +30us[ +36us] +/- 373us
4.2 在服務端查看認證情況
chronyc serverstats
輸出如下 :
NTP packets received : 5
NTP packets dropped : 0
Command packets received : 1
Command packets dropped : 0
Client log records dropped : 0
NTS-KE connections accepted: 1 # 非0值說明有客戶端連接到NTS-KE端口且發送了驗證請求
NTS-KE connections dropped : 0
Authenticated NTP packets : 5 # 非0值說明有客戶端連接到NTS-KE端口且發送了驗證請求
Interleaved NTP packets : 0
NTP timestamps held : 0
NTP timestamp span : 0
NTP daemon RX timestamps : 0
NTP daemon TX timestamps : 5
NTP kernel RX timestamps : 5
NTP kernel TX timestamps : 0
NTP hardware RX timestamps : 0
NTP hardware TX timestamps : 0
4.3 在客戶端查看驗證情況
chronyc -N authdata
輸出類似如下 :
Name/IP address Mode KeyID Type KLen Last Atmp NAK Cook CLen
=========================================================================
ntpserver NTS 1 30 128 597m 0 0 8 64
ntpserver-ipv6 NTS 1 30 128 580m 0 0 8 64
說明 :
- 輸出結果中的
KeyID、Type、KLen
三列的值應該為非0
五。一些說明
- 啟用NTS后,無需創建同步密鑰。即無需執行
chrony_keygen
命令 - NTS目前采用單向認證模式,即服務端向客戶端驗證,而客戶端無需向服務端表明身份。所以只在服務端配置了證書和私鑰
- 搭建過程中容易出錯的地方有 : 證書、私鑰和根證書文件的屬性;/etc/chrony.conf中的
allow
指令,以及客戶端配置/etc/hosts
- 無論是服務端還是客戶端,在重啟
chronyd服務
后,一定要執行systemctl status chronyd
查看服務的狀態,如果輸出有異常,就需要解決問題
六。參考文檔 :
- 搭建基于chrony+OpenSSL(NTS協議)多層級可信時間同步服務
https://blog.csdn.net/muxia_jhy/article/details/147876353 - chrony.conf :
man chrony.conf