在CentOS系统中使用chrony实现NTP加密认证,核心就是通过生成共享密钥、配置密钥文件、在chrony.conf中指定密钥ID和认证方式,让客户端和服务端之间的时间同步数据包经过MD5或SHA1/SHA256哈希校验,防止中间人篡改时间信息。整个过程分为三步:生成密钥、配置服务端、配置客户端,下面逐一拆解。
为什么要做NTP认证?因为NTP协议本身是明文传输的,如果网络中存在攻击者,可以伪造NTP响应包,把你的服务器时间拨快或拨慢。时间不准会导致日志混乱、证书验证失败、数据库同步异常、定时任务错乱等一系列严重问题。尤其是金融、政务、运维监控等场景,时间安全是基础中的基础。chrony是CentOS 7及以后版本默认的NTP客户端和服务端,替代了老旧的ntpd,它支持对称密钥认证(symmetric key)和自动密钥(autokey),实际生产环境中用得最多的就是对称密钥认证,简单可靠。
一、生成NTP认证密钥chrony使用的密钥文件默认存放在/etc/chrony.keys,如果不存在需要手动创建。密钥生成可以用chrony自带的工具,也可以手动写入。推荐用命令行生成,格式规范不容易出错。
# 生成一个密钥ID为1,类型为MD5的密钥 chronyc keygen 1 MD5 # 或者生成SHA1类型 chronyc keygen 1 SHA1 # 也可以生成SHA256类型(chrony 4.0+支持) chronyc keygen 1 SHA256
执行完命令后,密钥会自动写入/etc/chrony.keys文件。你也可以直接用文本编辑器手动添加,格式如下:
# /etc/chrony.keys 1 MD5 你的随机密码字符串这里 # 或者 1 SHA256 你的随机密码字符串这里
密码字符串建议用openssl生成随机串,比如:
openssl rand -base64 20
生成的密钥文件权限必须设为600,属主为chrony用户或root,否则chrony启动时会报权限错误:
chmod 600 /etc/chrony.keys chown root:root /etc/chrony.keys二、配置NTP服务端(chrony作为时间源服务器)
如果你的CentOS机器本身就是时间源服务器(比如内网NTP Server),需要在chrony.conf中开启允许客户端连接,并指定使用哪个密钥进行认证。编辑/etc/chrony.conf:
# 允许特定网段的客户端访问 allow 192.168.1.0/24 # 指定密钥文件 keyfile /etc/chrony.keys # 指定使用密钥ID 1进行认证 commandkey 1 # 开启NTP端口(默认UDP 123) port 123 # 如果本机也需要同步外部时间源,可以加上 server ntp1.aliyun.com iburst server ntp2.aliyun.com iburst # 如果是纯内网时间源,不需要server行,直接本地时钟即可 local stratum 10
这里有几个关键点要注意:commandkey 1表示客户端发命令时用密钥1认证;如果你希望客户端查询时间时也必须认证,还需要加上:
# 要求客户端查询时也进行认证 ntpsigndsocket /var/run/chrony/chronyd.sock
实际上更常用的做法是在allow指令后面直接加认证要求,chrony 3.x以后支持在allow后面指定key选项:
allow 192.168.1.0/24 key 1
这样只有持有正确密钥的客户端才能从这台服务器同步时间。配置完成后重启chronyd服务:
systemctl restart chronyd systemctl enable chronyd
检查服务状态和端口监听:
systemctl status chronyd ss -ulnp | grep 123三、配置NTP客户端(chrony连接加密认证的时间源)
客户端配置相对简单,核心是指定server地址、密钥文件和密钥ID。编辑客户端的/etc/chrony.conf:
# 指定上游NTP服务器地址和密钥 server 192.168.1.100 key 1 # 指定密钥文件 keyfile /etc/chrony.keys # 如果有多个上游服务器,每个都可以指定不同密钥 # server 192.168.1.101 key 2 # 记录漂移文件 driftfile /var/lib/chrony/drift # 允许前几次快速同步 makestep 1.0 3 # 开启NTP客户端日志(可选,方便排错) logdir /var/log/chrony
配置完成后同样重启服务:
systemctl restart chronyd
然后用chronyc命令验证同步状态和认证是否生效:
# 查看同步源 chronyc sources -v # 查看详细源信息,包含认证状态 chronyc sourcestats -v # 查看时间同步状态 chronyc tracking
如果sources输出中你的server显示前面有一个^*符号或者显示"MS"(means authenticated),说明认证成功。如果显示"?"或者没有认证标识,说明密钥不匹配或者配置有误。
四、防火墙和SELinux注意事项NTP使用UDP 123端口,如果开了防火墙必须放行:
firewall-cmd --permanent --add-service=ntp firewall-cmd --reload # 或者直接放端口 firewall-cmd --permanent --add-port=123/udp firewall-cmd --reload
SELinux方面,chrony默认策略通常没问题,但如果你把密钥文件放到了非标准路径,可能需要调整上下文:
# 查看SELinux是否阻止 ausearch -m avc -ts recent | grep chrony # 如果有deny,修复上下文 restorecon -Rv /etc/chrony.keys五、密钥管理和安全建议
密钥管理是整个方案中最容易被忽视但最重要的环节。几条硬核建议:
第一,密钥ID不要用1以外的值虽然可以,但建议统一规划,内网用1-10,不同业务段用不同ID,方便后续轮换。第二,密钥要定期轮换,建议每90天更换一次,更换时服务端和客户端同时更新密钥文件,然后重启服务,利用chrony的平滑过渡机制不会造成时间跳变。第三,密钥文件权限严格600,不要让其他用户可读。第四,不要在密钥文件里用简单密码,用openssl rand生成至少16字节以上的随机串。第五,如果是生产环境多台服务器,建议用配置管理工具(如Ansible)统一下发密钥文件,避免手动操作出错。
六、常见问题排查实际部署中经常遇到的问题有这么几个:客户端同步了但认证没生效,多半是密钥文件路径不一致或者密钥ID写错;服务端拒绝连接,检查allow规则和防火墙;时间同步偏差很大,检查makestep参数和上游服务器是否可达;chronyc sources显示"^?"表示正在连接,等几秒刷新再看。还有一种情况是客户端和服务端用了不同的哈希算法,比如服务端配了MD5客户端配了SHA256,必须保持一致。
如果你需要同时支持多个客户端网段使用不同密钥,可以在chrony.conf中写多行allow:
allow 192.168.1.0/24 key 1 allow 192.168.2.0/24 key 2 allow 10.0.0.0/8 key 3
这样不同网段用不同密钥,安全性更高,也方便独立管理。
七、chrony相比ntpd在认证方面的优势chrony在NTP认证方面比老的ntpd更现代、更灵活。它支持更快的初始同步、更好的网络抖动处理、更细粒度的访问控制。ntpd的密钥管理需要用ntp-keygen工具,而且配置语法更复杂。chrony的keygen命令直接集成,配置文件语法更简洁,密钥轮换也更方便。CentOS 7以后默认就是chrony,没必要再折腾ntpd了。如果你还在用CentOS 6,那只能用ntpd,但强烈建议升级系统版本。
总结一下整个流程:生成密钥放到/etc/chrony.keys,服务端配置allow+key+commandkey,客户端配置server+key+keyfile,开防火墙UDP 123,重启服务,用chronyc验证。整个过程十分钟内可以完成,但安全效果是质的提升。时间同步这件事看起来小,实际上是整个基础设施信任链的起点,做好NTP认证是运维基本功中的基本功。
