auditd监控系统时钟同步变更的核心是捕获adjtimex、settimeofday、clock_settime等底层系统调用,而非依赖ntpd/chronyd进程日志;需配置双架构审计规则、启用enriched日志格式、锁定规则并远程转发日志,结合上下文(如uid、参数值)区分合法与可疑行为。

auditd 监控系统时钟同步变更,核心是捕获底层时间调整系统调用,而非依赖 ntpd 或 chronyd 进程日志。因为攻击者或异常程序可能绕过服务管理,直接调用内核接口修改时间——这正是 auditd 发挥不可替代作用的场景。
必须监控的系统调用 系统时间同步与手动修改本质相同,均由以下内核接口完成:
-
adjtimex:用于微调时钟频率与偏移(NTP 平滑校正常用,但也可被滥用于隐蔽跳变) -
settimeofday:直接设置系统时间与时区(高危,导致秒级跳变) -
clock_settime:设置 POSIX 时钟(如CLOCK_REALTIME,容器、应用层常见调用路径) -
stime(仅旧系统):已基本弃用,可忽略
这些调用在不同架构下编号不同,需双架构覆盖。
配置双架构审计规则
在 /etc/audit/rules.d/time-sync.rules 中写入:
-a always,exit -F arch=b64 -S adjtimex,settimeofday,clock_settime -k time_sync -a always,exit -F arch=b32 -S adjtimex,settimeofday,clock_settime -k time_sync
保存后执行:
sudo augenrules --load sudo systemctl restart auditd
验证是否生效:
auditctl -l | grep time_sync
确保日志可信性与可追溯性
- 编辑
/etc/audit/auditd.conf,设log_format = ENRICHED(启用纳秒精度、进程上下文等关键字段) - 设
flush = incremental_async减少写入延迟对时间戳的影响 - 启用
auditctl -e 2锁定规则(防止 root 临时卸载 auditd 绕过) - 将
/var/log/audit/audit.log实时转发至远程 rsyslog 服务器,该服务器应由独立 NTP 源(如pool.ntp.org)同步,避免本地时钟被污染影响日志顺序
区分合法同步与可疑变更 单纯记录不够,需结合上下文判断风险:
- 正常
chronyd调用adjtimex时,exe字段为/usr/sbin/chronyd,auid为系统服务 UID(如 996) - 非特权用户(UID 1–999)触发
settimeofday,或adjtimex的a0(offset 参数)绝对值超过 ±1000000 微秒(±1 秒),即属高危行为 - 查询示例:
ausearch -k time_sync -ui 1-999 --start today | aureport -f -i ausearch -k time_sync -m syscall | awk '/adjtimex/ && $NF > 1000000 || $NF
不依赖服务进程名,只信系统调用
不要写 -w /usr/sbin/chronyd -p x 这类规则——它只能捕获进程启动,无法覆盖 chronyd 内部调用 clock_settime 的行为,更无法捕获恶意二进制直接调用 settimeofday。auditd 的价值正在于穿透应用层,直击系统调用。
规则生效后,每次时间变更都会在 /var/log/audit/audit.log 中生成带 key="time_sync" 的条目,含完整调用方、参数、时间戳与权限上下文。











