
(本文字数:5954,阅读时长大约:8分钟)
许多计算机使用网络时间协议(NetworkTimeProtocol)(NTP)通过互联网来同步系统时钟。NTP是少数几个仍在普遍使用的不安全的互联网协议之一。攻击者如果能够观察到客户端和服务器之间的网络流量,就可以向客户端提供虚假的数据,并根据客户端的实现和配置,强迫其将系统时钟设置为任何时间和日期。如果客户端的系统时钟不准确,一些程序和服务就可能无法工作。例如,如果根据客户端的系统时钟,Web服务器的证书似乎已经过期,Web浏览器将无法正常工作。可以使用网络时间安全(NetworkTimeSecurity)(NTS)来保证NTP的安全。
Fedora33[1]是第一个支持NTS的Fedora版本。NTS是一种新的NTP验证机制。它使客户端能够验证它们从服务器接收的数据包在传输过程中有没有被修改。当NTS启用时,攻击者唯一能做的就是丢弃或延迟数据包。关于NTS的更多细节,请参见RFC8915。
使用对称密钥可以很好地保证NTP的安全。遗憾的是,服务器必须为每个客户端配备不同的密钥,而且密钥必须安全地分发才行。这对于本地网络上的私有服务器来说可能是实用的,但它不能扩展到有着数百万客户端的公共服务器上。
NTS包括一个密钥建立(KeyEstablishment)(NTS-KE)协议,它可以自动创建服务器与其客户端之间使用的加密密钥。它在TCP端口4460上使用传输层安全(TransportLayerSecurity)(TLS)。它被设计成可以扩展到非常多的客户端,而对准确性的影响最小。服务器不需要保存任何客户端特定的状态。它为客户提供cookie,cookie是加密的,包含验证NTP数据包所需的密钥。隐私是NTS的目标之一。客户端在每次服务器响应时都会得到一个新的cookie,所以它不必重复使用cookie。这可以防止被动观察者跟踪在网络之间迁移的客户端。
Fedora中默认的NTP客户端是Chrony。Chrony在4.0版本中增加了NTS支持,但并没有改变默认配置。Chrony仍然使用项目中的公共服务器,而且默认情况下NTS没有启用。
目前,支持NTS的公共NTP服务器非常少。两个主要的提供商是Cloudflare和Netnod。Cloudflare服务器分布在世界各地的不同地方。他们使用的是任播(anycast)地址,应该可以让大多数客户到达一个接近的服务器。Netnod服务器位于瑞典。在未来,我们可能会看到更多支持NTS的公共NTP服务器。
为了获得最佳的可靠性,配置NTP客户端的一般建议是至少有三个工作的服务器。为了达到最好的精度,建议选择距离较近的服务器,以减少网络延迟和非对称网络路由造成的不对称性。如果你不关心细粒度的精度,你可以忽略这个建议,使用任何你信任的NTS服务器,无论它们位于哪里。
如果你确实想要高准确度,但又没有近距离的NTS服务器,你可以将远处的NTS服务器和近处的非NTS服务器混合使用。但是,这样的配置不如只使用NTS服务器的配置安全。攻击者仍然不能强迫客户机接受任意时间,但他们确实对客户机的时钟及其估计精度有更大的控制权,这在某些环境下可能是不可接受的。
在安装程序中启用客户端NTS
Fedora安装程序中的网络时间配置
在配置文件中启用客户端NTS如果你从之前的Fedora版本升级,或者你没有在安装程序中启用NTS,你可以直接在/etc/中启用NTS。除了推荐的iburst选项外,还可以对指定服务器使用nts选项。例如:
你还应该允许客户端将NTS密钥和cookie保存到磁盘上,这样它就不必在每次启动时重复NTS-KE会话。在中添加以下一行,如果还没有的话:
ntsdumpdir/var/lib/chrony
如果不想让DHCP提供的NTP服务器与你指定的服务器混在一起,请在中删除或注释以下一行:
sourcedir/run/chrony-dhcp
当你完成编辑后,保存你的更改并重新启动chronyd服务:
systemctlrestartchronyd检查客户端状态
在root用户下运行以下命令,检查NTS密钥建立是否成功:
chronyc-NsourcesMSName/IPaddressStratumPollReachLastRxLastsample===============================================================================^*+355us[+375us]+/-11ms^++237us[+237us]+/-23ms^+[-170us]+/-22ms
Reach列应该有一个非零值,最好是377。上图所示的值377是一个八进制数,它表示最后八个请求都有有效的响应。如果启用了NTS的话,验证检查将包括NTS认证。如果该值一直很少或从未达到377,则表明NTP请求或响应在网络中丢失了。众所周知,一些主要的网络运营商有中间设备,它可以阻止或限制大的NTP数据包的速率,以缓解利用ntpd的监控协议进行的放大攻击。不幸的是,这影响了受NTS保护的NTP数据包,尽管它们不会引起任何放大。NTP工作组正在考虑为NTP提供一个替代端口,作为解决这个问题的办法。
在服务器上启用NTS如果你有自己的NTP服务器,运行着chronyd,你可以启用服务器的NTS支持,让它的客户端安全同步。如果该服务器是其他服务器的客户端,它应该使用NTS或对称密钥与之同步。客户端假设同步链在所有服务器到主时间服务器之间是安全的。
启用服务器NTS类似于在Web服务器上启用HTTPS。你只需要一个私钥和证书。例如,证书可以由Let'sEncrypt权威机构使用certbot工具签署。当你有了密钥和证书文件(包括中间证书),在中用以下指令指定它们:
ntsserverkey/etc/pki/tls/private//etc/pki/tls/certs/
确保之前在客户端配置中提到的ntsdumpdir指令存在于中。它允许服务器将其密钥保存到磁盘上,这样服务器的客户端在重启服务器时就不必获取新的密钥和cookie了。
重新启动chronyd服务:
systemctlrestartchronyd
如果系统日志中没有来自chronyd的错误信息,那么它应该是可以接受客户端连接的,如果服务器有防火墙,则需要同时允许UDP123和TCP4460端口的NTP和NTS-KE服务。
你可以用下面的命令在客户端机器上进行快速测试:
$chronyd-Q-t3''2020-10-13T12:00:52(+CMDMON+NTP+REFCLOCK+RTC+PRIVDROP+SCFILTER+SIGND+ASYNCDNS+NTS+SECHASH+IPV6+DEBUG)2020-10-13T12:00:52ZDisabledcontrolofsystemclock2020-10-13T12:00:55(ignored)2020-10-13T12:00:55Zchronydexiting
如果你看到一个“Systemclockwrong”消息,说明它是正确工作的。
在服务器上,你可以使用下面的命令来检查它已经处理了多少个NTS-KE连接和认证的NTP数据包:
#chronycserverstatsNTPpacketsreceived:2143106240NTPpacketsdropped:117180834Commandpacketsreceived:16819527Commandpacketsdropped:0Clientlogrecordsdropped:574257223NTS-KEconnectionsaccepted:104NTS-KEconnectionsdropped:0AuthenticatedNTPpackets:52139
如果你看到非零的“NTS-KEconnectionsaccepted”和“AuthenticatedNTPpackets”,这意味着至少有一些客户端能够连接到NTS-KE端口,并发送一个认证的NTP请求。
Fedora33Beta安装程序包含一个较旧的Chrony预发布版本,它不能与当前的NTS服务器一起工作,因为NTS-KE端口已经改变。因此,在安装程序中的网络时间配置中,服务器总是显示为不工作。安装后,需要更新chrony包,才能与当前的服务器配合使用。↩︎
via:
作者:MiroslavLichvar选题:lujun9972译者:wxy校对:wxy
本文由LCTT原创编译,Linux中国荣誉推出