要让 auditd 捕获系统时间篡改,必须监控 adjtimex、settimeofday、clock_settime 三个内核级系统调用,并配置 b64/b32 双架构规则;启用 ENRICHED 日志格式、增量异步刷盘、规则锁定及远程日志同步,结合进程路径、UID 和参数值判断合法性。

要让 auditd 真正捕获系统时间被篡改的行为,关键不是监控 timedatectl 或 date 命令本身,而是盯住内核级时间调整动作。所有合法或恶意的时间修改,最终都必须调用底层系统调用——auditd 正是通过审计这些调用实现无遗漏覆盖。
必须监控的三个核心系统调用
-
adjtimex:用于微调时钟偏移和频率(NTP 平滑校正常用,但也可被滥用于隐蔽跳变) -
settimeofday:直接设置系统时间与时区(高危操作,会导致秒级跳变) -
clock_settime:设置 POSIX 时钟(如CLOCK_REALTIME,容器、应用层常见调用路径)
注意:stime 已基本弃用;仅监控 64 位架构会漏掉 32 位程序或容器内调用,必须双架构覆盖。
配置双架构审计规则
在 /etc/audit/rules.d/time.rules 中写入:
-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
保存后执行:
sudo augenrules --load sudo systemctl restart auditd
验证是否生效:
sudo auditctl -l | grep time_change
应看到两条规则(b64 和 b32 各一条)。
确保日志可信且可追溯
- 编辑
/etc/audit/auditd.conf,设log_format = ENRICHED(启用纳秒级时间戳与完整上下文) - 设
flush = incremental_async,减少写入延迟对时间戳精度的影响 - 运行
sudo 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 秒),即属高危行为 -
clock_settime被非系统服务进程(如python3、java)频繁调用,也需重点排查
不复杂但容易忽略











