要追踪crontab定时任务变动,需主动部署auditd审计:监控/var/spool/cron和/etc/crontab等路径写入行为,捕获crontab命令execve调用链,结合每日配置快照与checksum比对,并扩展监控systemd timer等非cron调度源。

要追踪 crontab 定时任务的变动记录,关键不是看“任务是否执行”,而是监控“谁在何时修改了任务配置”。系统本身不自动记录 crontab 的增删改操作,必须主动部署审计机制。
盯住 crontab 配置文件的变更
用户级任务存于 /var/spool/cron/用户名,系统级任务在 /etc/crontab 和 /etc/cron.d/ 目录下。这些文件被修改时,就是任务变动的直接证据。
- 用 auditd 监控写入行为:添加规则
-w /var/spool/cron -p wa -k cron_spool和-w /etc/crontab -p wa -k cron_etc,再运行sudo augenrules --load - 查修改痕迹:
sudo ausearch -k cron_spool --start yesterday | aureport -f -i,输出含操作用户、时间、进程名(如 vim/crontab 命令) - 配合文件系统属性:对关键目录设不可修改位(
sudo chattr +a /var/spool/cron不推荐;更稳妥的是chattr +i仅限只读场景,需临时移除才能修改)
捕获 crontab 命令调用链
用户执行 crontab -e 或 crontab file 时,实际触发的是 execve 系统调用。这是比文件监控更底层、更难绕过的入口。
- 加 auditd 规则:
-a always,exit -F arch=b64 -S execve -F exe=/usr/bin/crontab -F key=crontab_cmd - 查谁、何时、用什么参数调用了 crontab:
sudo ausearch -k crontab_cmd --start today | aureport -m -i,能看到 UID、AUID、命令行完整参数 - 注意区分:root 执行
crontab -u alice -e会显示 AUID=alice,UID=root,可明确责任归属
定期快照比对配置内容
auditd 能记录“改了”,但不保存“改成什么样”。要还原每次修改前后的差异,需主动做配置快照。
- 每天凌晨自动归档:
tar -cf /backup/crontab-$(date +\%F).tar /var/spool/cron /etc/crontab /etc/cron.d/ - 用 sha256sum 记录指纹:
find /var/spool/cron /etc/crontab /etc/cron.d -type f -exec sha256sum {} \; > /var/log/crontab-checksum.log - 发现异常时,用
diff对比相邻两天的 tar 包或 checksum 文件,快速定位哪一文件、哪一行被改动
覆盖非 cron 触发源的变动
很多定时逻辑已迁移到 systemd timer 或自研调度器,它们的配置变动同样属于“定时任务变动”,不能只盯 crontab。
- 监控 systemd timer 单元文件:
sudo auditctl -w /etc/systemd/system/*.timer -p wa -k systemd_timer - 检查 timer 启用状态变化:
systemctl list-timers --all结合journalctl -u timers.target --since yesterday - 扫描可疑脚本调用:
grep -r "systemctl.*start.*timer" /etc/cron.d/ /etc/cron.daily/,确认是否存在混用调度机制

















