1、时间同步服务的层级概念
在绝大多数IT工程师实际工作过程中,针对于局域网的时间同步,遇到最多的场景是根据实际的需求,搭建一个简单的NTP时间同步服务以时间对局域网中的服务器、网络设备、个人电脑等基础设施实现同步授时功能。虽然这样的日常工作可以解决绝大多数的时间同步需求,然而当网络规模达到足够大的时候,单层级的时间同步服务就无法满足诸如“不同设备需要不同时间精度”这样的需求。在这样的场景之下,无论是使用老式的ntpd还是当下主流的chrony时间同步服务,都需要在对应的配置文件中配置不同的层级(stratum),对时间服务器进行层级的区分,以chrony为例,在chrony.conf
配置文件之下,就存在“local stratum
”这样的参数(当然如果默认的配置文件不存在这个参数,也可以手动进行添加),如下:
NTP协议中,通常从0到16这些不同的层级。层级数值越小,表示时钟的准确度越高,第0层级通常是卫星或原子钟提供最权威的原始时间,第1层级的时间从第0层级获取,第2层级从第1层级获取时间,以此类推,而第16层级则被定义为没有进行时间同步,是不能使用的。
通常情况下,在局域网内搭建一台简单的单层级时间同步服务器时,倘若局域网与互联网之间不是完全的物理隔离,首先我们会为这台服务器寻找一台可靠的时间同步源,这个时间同步源往往来自互联网的一台时间同步服务器。实际上,互联网上不同机构的时间服务器也属于不同的层级。例如,若将安装有chrony的Linux主机,且已连接到中国科学院国家授时中心,通过命令“chronyc sources -v
”命令,我们可以发现中科院国家授时中心的NTP服务器集群(ntp.ntsc.ac.cn)有1和2两个不同的层级,而微软公司的时间同步服务器(time.windows.com)则位于3这个层级上,若抛开网络传输距离和延迟不谈,而只从NTP的层级角度来看,中科院国家授时中心的声明的时间精度是高于微软公司的,而至于微软公司NTP服务器的上一层是谁的时间服务器,我们就不得而知了。
2、常规时间同步的安全性局限和对应解决方案NTS协议
用于时间同步的协议是NTP协议,该协议原有的NTPv3版本中,默认通过123端口和UDP方式传输实现时间同步——这是在当下的网络环境下,为数不多的,仍旧采用不安全方式传输的公有协议版本。由于时间同步这一场景必须要保证足够的低延迟,也就注定了时间的同步不太可能放弃UDP传输转而采用TCP传输(这也是NTPv3一直沿用至今的原因之一)。针对NTPv3在安全层面上的局限性,新的NTPv4尽管仍旧保留123端口的UDP传输,但在协议层面上加入了两个扩展,用于通过TLS证书链验证的方式保证安全性,构成NTS协议。相关协议报文如下:
3、实验拓扑
本次实验通过两个大的步骤进行:
第一个步骤是搭建多层级的时间同步服务,在时间同步体系中,第0层级(Stratum 0)是由卫星或者原子钟生成权威的时间,第1层级(Stratum 1)通常是全球或国家级的公共时间同步服务,这两个层级对于绝大多数IT工程师而言基本接触不到,基于此,本实验则在不隔离互联网的局域网环境内搭建第2层级(Stratum 2)和第3层级(Stratum 3)的时间同步服务器;
第二个步骤是在第3层级NTP服务器和客户端之间,通过OpenSSL搭建的CA证书服务器签发有效期为10年的证书,并将证书导入到客户端中安装,最终实现可信时间同步。最终拓扑如下:
4、实验步骤
4.1、搭建常规多层级时间服务
(1)在Stratum 2这一层级的debian服务器上,通过命令“apt install chrony -y
”安装时间同步服务,如下:
(2)在Stratum 2这一层级的debian服务器上,通过命令“vim /etc/chrony/chrony.conf
”修改chrony的配置文件,修改字段如下,修改完成后保存退出:
(3)在Stratum 2这一层级的debian服务器上,通过命令“systemctl restart chronyd
”重启chrony时间服务,并通过命令“chronyc sources -v
”查看时间同步情况,验证是否成功,如下:
(4)在stratum 3这一层级的OpenEuler服务器上,通过命令“yum install chrony -y
”安装时间同步服务,如下:
(5)在Stratum 3这一层级的debian服务器上,通过命令“vim /etc/chrony.conf
”修改chrony的配置文件,修改字段如下,修改完成后保存退出:
(6)在Stratum 3这一层级的debian服务器上,通过命令“systemctl restart chronyd
”重启chrony时间服务,并通过命令“chronyc sources -v
”查看时间同步情况,验证是否成功,如下:
(7)在debian客户端上,通过命令“apt install chrony -y
”安装时间同步服务,如下:
(8)在debian客户端上,通过命令“vim /etc/chrony/chrony.conf
”修改chrony的配置文件,修改字段如下,修改完成后保存退出:
(9)在debian客户端上,通过命令“systemctl restart chronyd
”重启chrony时间服务,并通过命令“chronyc sources -v
”查看时间同步情况,验证是否成功,如下:
由此,基于chrony的常规多层级时间服务搭建完成。
4.2、通过OpenSSL签发证书实现可信时间同步服务
(1)先决条件:在stratum 3这一层级的OpenEuler服务器上,已经安装OpenSSL、并且该服务器的主机名已经修改为ymh(主机名可根据实际情况自定义,只要后续证书信息填写时CN字段与主机名保持一致即可),如下:
(2)在stratum 3这一层级的OpenEuler服务器上,进入目录/etc/pki/tls/private
,此目录是红帽系Linux自签证书的存放目录,如果是debian系Linux,则进入/etc/ssl/private
(3)在stratum 3这一层级的OpenEuler服务器上的/etc/pki/tls/private
目录下,执行以下命令:
#生成CA服务器密钥
openssl genrsa -des3 -out server.key 2048#通过密钥文件server.key生成CA证书请求,该命令执行后,会要求填写一些信息,注意CN字段和主机名一致即可
openssl req -new -key server.key -out server.csr#根据CA证书请求生成CA证书,有效期10年,该命令执行后,会要求填写一些信息,注意CN字段和主机名一致即可
openssl req -new -x509 -key server.key -out ca.crt -days 3650#根据CA证书生成服务器证书,该证书为crt格式,后续要导入到客户端中安装
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt#将CA密钥与服务器证书合并为pem,此步骤必须进行,是启用NTS协议必要的先决条件
cat server.key server.crt > server.pem
以上命令执行完成后,会在当前目录下生成6个文件,如下:
其中服务器证书server.crt信息如下:
(4)在stratum 3这一层级的OpenEuler服务器上的/etc/pki/tls/private
目录下,输入以下命令,对server.crt
、server.key
、server.pem
这三个证书相关文件进行赋权,如果权限不对,chrony会因为无权读取相应证书文件而认证失败(红帽官网文档建议使用644权限,本实验采用777权限):
chown root:chrony server.key server.crt
chown root:chrony server.key server.crt
chown root:chrony server.pem
chmod 777 *
(5)在stratum 3这一层级的OpenEuler服务器上,通过命令“vim /etc/chrony.conf
”修改chrony的配置文件,修改或添加以下字段,修改完成后保存退出:
(6)在stratum 3这一层级的OpenEuler服务器上,通过命令“systemctl restart chronyd
”重启chrony,重启完成后,通过命令“systemctl status chronyd
”确认启用NTS协议后的chrony无报错,如下:
(7)确认debian客户端已经安装ca-certificates
,如果没有安装,则通过apt包管理器进行安装,无误后,将stratum 3这一层级的OpenEuler服务器上的服务器证书server.crt
传送到debian客户端的/usr/local/share/ca-certificates
目录下:
(8)在debian客户端上输入命令“update-ca-certificates
”将server.crt
证书安装到系统中,如下:
(9)在debian客户端上通过命令“apt install chrony -y
”安装时间同步服务,如下:
(10)在debian客户端上通过命令“vim /etc/chrony/chrony.conf
”修改chrony配置文件,如下:
(11)输入命令“vim /etc/hosts
”修改debian客户端的hosts文件,确保debian客户端可以解析stratum 3时间服务器的主机名,并验证,如下:
(12)在debian客户端上输入命令“systemctl restart chronyd
”重启chrony服务,并通过“chronyc sources -v
”命令验证与时间同步服务器的连接是否正常,如下:
(13)验证:在stratum 3这一层级的OpenEuler服务器上,通过命令“chronyc serverstats
”,查看客户端连接到本端状态,如果 NTS-KE connections accepted
和 Authenticated NTP packets
项至少带有一个非零值,这意味着至少有一个客户端能够连接到 NTS-KE 端口并发送经过身份验证的 NTP 请求,如下:
5、搭建过程中可能会遇到的报错
可信时间服务端或客户端配置完成,并重启chrony进程后,输入“systemctl status chronyd”可能会出现以下报错:
The certificate is NOT trusted.
(由于本实验为自签证书,操作系统默认是不信任的,因此自签证书需要通过update-ca-certificates命令安装后才正常);
The name in the certificate does not match the expected.
(证书的CN字段内容与可信时间服务端的主机名不一致)
TLS: Error while reading file.
(可信时间服务端证书相关文件权限不够)
6、参考来源
https://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/9/html/configuring_basic_system_settings/assembly_overview-of-network-time-security-in-chrony_configuring-time-synchronization#proc_enabling-nts-on-the-server_assembly_overview-of-network-time-security-in-chrony 《13.5. chrony 中的网络时间安全概述(NTS)》
https://cloud.tencent.com/developer/information/linux%20%E5%AE%89%E8%A3%85ca%E8%AF%81%E4%B9%A6 《linux 安装ca证书》
https://blog.csdn.net/weixin_44594317/article/details/145821748 《使用nginx在linux配置https详细步骤》