内网搭建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