当前位置: 首页 > 科技观察

如何使用NTS保护NTP

时间:2023-03-16 12:48:41 科技观察

许多计算机使用网络时间协议(NTP)通过Internet同步它们的系统时钟。NTP是少数仍在普遍使用的不安全互联网协议之一。可以观察客户端和服务器之间网络流量的攻击者可以向客户端提供虚假数据并强制其将系统时钟设置为任何时间和日期,具体取决于客户端的实现和配置。如果客户端的系统时钟不准确,某些程序和服务可能无法运行。例如,如果根据客户端的系统时钟,Web服务器的证书似乎已过期,则Web浏览器将无法正常运行。可以使用网络时间安全(NTS)保护NTP。Fedora33[1]是第一个支持NTS的Fedora版本。NTS是一种新的NTP认证机制。它使客户端能够验证他们从服务器接收的数据包在传输过程中没有被修改。当启用NTS时,攻击者唯一能做的就是丢弃或延迟数据包。有关NTS的更多详细信息,请参阅RFC8915。NTP使用对称密钥得到很好的保护。不幸的是,服务器必须为每个客户端提供不同的密钥,并且必须安全地分发密钥。这对于本地网络上的私人服务器可能是实用的,但它不能扩展到拥有数百万客户端的公共服务器。NTS包括一个密钥建立(NTS-KE)协议,该协议可自动创建服务器与其客户端之间使用的加密密钥。它在TCP端口4460上使用传输层安全性(TLS)。它旨在扩展到非常大量的客户端,同时对准确性的影响最小。服务器不需要保存任何特定于客户端的状态。它为客户端提供cookie,这些cookie已加密并包含验证NTP数据包所需的密钥。隐私是NTS的目标之一。每次服务器响应时,客户端都会得到一个新的cookie,因此它不必重复使用cookie。这可以防止被动观察者在客户端在网络之间迁移时跟踪它们。Fedora中默认的NTP客户端是Chrony。Chrony在4.0版本中添加了NTS支持,但没有更改默认配置。Chrony仍然使用pool.ntp.org项目的公共服务器,默认情况下不启用NTS。目前,支持NTS的公共NTP服务器非常少。两个主要提供商是Cloudflare和Netnod。Cloudflare服务器位于世界各地。他们使用的是任播任播地址,这应该可以让大多数客户端连接到附近的服务器。Netnod服务器位于瑞典。将来,我们可能会看到更多支持NTS的公共NTP服务器。为了获得最佳可靠性,配置NTP客户端的一般建议是至少拥有三台工作服务器。为了达到最好的准确率,建议选择距离较近的服务器,以减少网络延迟和网络路由不对称导致的不对称。如果您不关心细粒度的精度,则可以忽略此建议并使用您信任的任何NTS服务器,无论它们位于何处。如果你真的想要高精度但没有近距离的NTS服务器,你可以将远距离的NTS服务器与附近的非NTS服务器混合使用。但是,这样的配置不如仅使用NTS服务器安全。攻击者仍然不能强迫客户端接受任意时间,但他们确实可以更好地控制客户端的时钟及其估计的精度,这在某些环境中可能是不可接受的。在安装程序中启用客户端NTS安装Fedora33时,您可以在时间和日期对话框的网络时间配置中启用NTS。在单击“+”(添加)按钮之前,输入服务器名称并检查NTS支持。您可以使用NTS添加一台或多台服务器或池。要删除默认服务器池(2.fedora.pool.ntp.org),请取消选中“使用”列中的相应标记。Fedora安装程序中的网络时间配置在配置文件中启用客户端NTS如果您是从以前的Fedora版本升级,或者如果您没有在安装程序中启用NTS,您可以直接在/etc/chrony.conf中启用NTS。除了推荐的iburst选项外,nts选项也可以用于特定的服务器。例如:servertime.cloudflare.comiburstntsservernts.sth1.ntp.seiburstntsservernts.sth2.ntp.seiburstnts您还应该允许客户端将NTS密钥和cookie保存到磁盘,这样它就没有在每次启动时重复NTS-KE会话。将以下行添加到chrony.conf,如果它不存在:ntsdumpdir/var/lib/chrony如果您不希望DHCP提供的NTP服务器与您指定的服务器混合,请删除或注释chrony中的以下行.conf:sourcedir/run/chrony-dhcp编辑完chrony.conf后,保存更改并重新启动chronyd服务:systemctlrestartchronyd检查客户端状态以root身份运行以下命令以检查NTS密钥建立是否成功:#chronyc-NauthdataName/IP地址ModeKeyIDTypeKLenLastAtmpNAKCookCLen=============================================================================time.cloudflare.comNTS11525633m008100nts.sth1.ntp.seNTS11525633m008100nts.sth2.ntp.seNTS11525633m008100KeyID、Type和KLen列应具有非零值.如果它们为零,请检查系统日志中是否有来自chronyd的错误消息。失败的一个可能原因是防火墙阻止客户端连接到服务器的TCP端口(端口4460)。另一个可能的失败原因是由于客户端的时钟错误导致无法验证证书。这就是NTS的鸡生蛋还是蛋生鸡的问题。您可能需要手动更正日期或暂时禁用NTS以使NTS正常工作。如果你的电脑有一个实时时钟,几乎所有的电脑都有,并且有一块好的电池作为后备电源,这个操作应该只需要做一次。如果电脑没有实时时钟或电池,像一些常见的小型ARM电脑(如树莓派),可以在/etc/sysconfig/chronyd中加入-s选项,恢复上次保存的时间关机或重启。时钟会落后于实际时间,但如果计算机没有关闭太久并且服务器的证书没有更新太接近过期时间,应该足以让时间检查成功。作为最后的手段,您可以使用nocerttimecheck指令禁用时间检查。有关详细信息,请参见chrony.conf(5)手册页。运行以下命令以确认客户端正在进行NTP测量:#chronyc-NsourcesMS名称/IP地址StratumPollReachLastRxLastsample==================================================================================^*time.cloudflare.com3637745+355us[+375us]+/-11ms^+nts.sth1.ntp.se1637744+237us[+237us]+/-23ms^+nts.sth2.ntp.se1637744-170us[-170us]+/-22msReach列应该有一个非零值,最好是377。上面显示的值377是一个八进制数表示最后八个请求有有效响应。如果启用了NTS,验证检查将包括NTS身份验证。如果该值很少或从不达到377,则NTP请求或响应会在网络上丢失。众所周知,一些主要的网络运营商拥有可以阻止或限制大型NTP数据包速率的中间设备,以减轻利用ntpd监控协议的放大攻击。不幸的是,这会影响受NTS保护的NTP数据包,尽管它们不会导致任何放大。NTP工作组正在考虑使用NTP的替代端口来解决此问题。在服务器上启用NTS如果您有自己的运行chronyd的NTP服务器,则可以启用服务器的NTS支持以安全地同步其客户端。如果服务器是其他服务器的客户端,则应使用NTS或对称密钥与它们同步。客户端假定所有服务器到主时间服务器之间的同步链是安全的。启用服务器NTS类似于在Web服务器上启用HTTPS。您只需要一个私钥和证书。例如,证书可以由Let'sEncrypt机构使用certbot工具签署。当您拥有密钥和证书文件(包括中间证书)时,使用以下指令在chrony.conf中指定它们:ntsserverkey/etc/pki/tls/private/foo.example.net.keyntsservercert/etc/pki/tls/certs/foo.example.net.crt确保客户端配置中前面提到的ntsdumpdir指令存在于chrony.conf中。它允许服务器将其密钥保存到磁盘,以便服务器的客户端在重新启动服务器时不必获取新的密钥和cookie。重新启动chronyd服务:systemctlrestartchronyd如果系统日志中没有来自chronyd的错误消息,那么它应该能够接受客户端连接。如果服务器有防火墙,则需要同时允许UDP123和TCP4460端口。NTP和NTS-KE服务。您可以使用以下命令在客户端计算机上进行快速测试:$chronyd-Q-t3'serverfoo.example.netiburstntsmaxsamples1'2020-10-13T12:00:52Zchronydversion4.0starting(+CMDMON+NTP+REFCLOCK+RTC+PRIVDROP+SCFILTER+SIGND+ASYNCDNS+NTS+SECHASH+IPV6+DEBUG)2020-10-13T12:00:52Z禁用系统时钟控制2020-10-13T12:00:55Z系统时钟错误-0.001032秒(忽略)2020-10-13T12:00:55Zchronydexiting如果您看到“系统时钟错误”消息,则表明它工作正常。在服务器上,您可以使用以下命令检查它处理了多少NTS-KE连接和经过身份验证的NTP数据包:#chronycserverstatsNTPpacketsreceived:2143106240NTPpacketsdropped:117180834Commandpacketsreceived:16819527Commandpacketsredropped:log0corlientdropped:574257223NTS-接受的KE连接:104个NTS-KE连接丢弃:0个经过身份验证的NTP数据包:52139如果您看到非零的“NTS-KE连接已接受”和“经过身份验证的NTP数据包”,这意味着至少一些客户端能够连接到NTS-KE端口并发送经过身份验证的NTP请求。Fedora33Beta安装程序包括一个较旧的Chrony预发布版,它不适用于当前的NTS服务器,因为NTS-KE端口已更改。因此,在安装程序中的网络时间配置中,服务器始终显示为不工作。安装后,需要更新chrony包以与当前服务器一起使用。