linux中可通过auditd监控adjtimex、settimeofday、clock_settime等系统调用以捕获时间修改行为,防止时钟回拨导致审计日志错乱;需配置双架构规则、启用enriched日志格式、同步至远程可信时间源,并结合告警与权限加固实现纵深防护。

在Linux中,利用auditd监控系统时间修改行为(如settimeofday、clock_settime等系统调用),可及时捕获人为或异常的时钟调整操作,从而防止因时钟回拨导致日志时间戳错乱、审计事件顺序失真甚至审计记录被“覆盖”或“跳过”的风险。
监控关键时间修改系统调用
系统时间变更主要通过以下系统调用实现,需对它们进行规则级审计:
-
adjtimex:调整内核时钟频率和偏移(常用于NTP平滑校正) -
settimeofday:直接设置系统时间和时区(危险,易造成跳变) -
clock_settime:设置POSIX时钟(如CLOCK_REALTIME) -
stime(较老系统):设置系统时间(已基本被settimeofday替代)
在/etc/audit/rules.d/time.rules中添加如下规则(需重启auditd或重载规则):
-a always,exit -F arch=b64 -S adjtimex,settimeofday,clock_settime -k time-change -a always,exit -F arch=b32 -S adjtimex,settimeofday,clock_settime -k time-change
注意:同时指定b64和b32架构以覆盖所有可能调用路径(尤其容器或32位兼容程序)。
确保日志时间戳自身可靠
auditd默认使用内核时间戳(kernel timestamp),若系统时间被回拨,审计日志中的msg=audit(...)时间字段也会倒退——这会破坏审计连续性。解决方法:
- 启用
auditctl -e 2(锁定规则,防绕过) - 配置
/etc/audit/auditd.conf中:log_format = ENRICHED(启用增强格式,含纳秒级精度)flush = incremental_async(降低延迟,减少时间漂移影响) - 将audit日志同步写入远程日志服务器(如rsyslog+TLS),其时间由可信NTP源保障,避免本地时钟污染
识别并告警异常时间跳变
仅记录不够,需主动检测。可用aureport或自定义脚本分析time-change事件:
- 实时监控示例(配合
ausearch+awk):ausearch -m syscall -i -k time-change --start recent | awk '/settimeofday|clock_settime/ && /auid!=4294967295/ {print $0}'
过滤非登录用户(auid=4294967295为unset)的调用,聚焦真实管理员行为 - 检查时间偏移量:
解析ausearch -i -k time-change输出中的old-time/new-time字段(部分内核版本支持),或结合adjtimex -p历史输出比对 - 集成到SIEM或Zabbix:提取
ausearch --key time-change --start today结果,当单日修改次数>3次或绝对偏移>60秒时触发告警
加固与最佳实践
审计是手段,防护才是目标。建议组合实施:
- 禁用非必要时间修改权限:
chmod 000 /usr/bin/timedatectl(若不用systemd-timesyncd)chown root:root /usr/bin/date+chmod 750(限制普通用户执行) - 启用chrony或systemd-timesyncd,并配置为只允许平滑校正(
makestep 1 -1或makestep 1.0 -1),禁止大步长跳变 - 在关键业务主机上,考虑启用
CONFIG_SECURITY_LOCKDOWN_LSM内核选项,阻止未授权的clock_settime调用 - 定期验证audit日志完整性:
sudo aureport -i --summary --start this-week | grep "time-change"











