用时间戳缩小植入窗口
计划任务文件本身不带「谁在什么时候写的」这类信息,但它的修改时间可以快速把范围缩小:把 /etc/cron.d/、/etc/cron.daily/ 以及用户 crontab 目录下所有文件的 mtime 排一次序,落在事件窗口内的那几个文件就是重点,再与认证日志、文件监视记录交叉,就能定位到改写者。
先排除自动化来源
crontab 文件被改写未必意味着入侵:配置管理工具、软件包升级、部署脚本都会周期性重写它们。判定前先确认该主机是否处于自动化管理之下,把这类写入排除掉;剩下的改动才需要用审计记录去追。
基本信息
| 适用平台 | Linux(cron、anacron 的实现) |
|---|---|
| 关键路径 | /etc/crontab、/etc/cron.d/、/etc/cron.daily 等、/var/spool/cron/crontabs/ |
| 命令 | stat、find -newermt、ls -lt --time-style=long-iso |
| 辅助手段 | auditd 对 crontab 路径设置监视规则 |
| 注意 | mtime 只表示写入时刻,不等于任务开始运行的时刻 |
典型使用场景
- 发现可疑定时任务:先按 mtime 判断它是什么时候被加进来的
- 缩小调查范围:把多主机上的 cron 文件时间汇总排序,找共同时间点
- 验证处置效果:清除恶意任务后确认文件时间不再变化
- 比对部署节奏:区分配置管理写入与人工写入
- 建立基线:正常环境下记录各文件的期望时间,异常时一眼可见
盘点时间戳
盘点时间戳
# 列出所有计划任务文件的时间戳
stat -c '%n | mtime=%y | ctime=%z' /var/spool/cron/crontabs/* /etc/cron.d/* 2>/dev/null
# 找出事件窗口内被修改过的文件
find /etc/cron.d /etc/cron.daily /var/spool/cron -newermt '2026-01-01' -type f 2>/dev/null
# 按时间排序,最新的排在最前
ls -lt --time-style=long-iso /etc/cron.d/ /var/spool/cron/crontabs/ 2>/dev/null | head -20
# 有审计子系统时直接查谁改过这些路径
ausearch -f /etc/cron.d -ts recent 2>/dev/null | tail -20时间字段读法
| 字段 | 含义 | 分析用法 |
|---|---|---|
| mtime | 内容最后修改时刻 | 判断任务被加入的大致时间 |
| ctime | inode 属性变更时刻 | 权限或属主调整也会更新它 |
| atime | 最后访问时刻 | 受挂载选项影响,参考价值有限 |
| 文件属主 | 文件归属账号 | 异常属主本身即线索 |
| 权限位 | 可执行与可读范围 | 过宽的权限便于植入 |
auditd 对 crontab 路径设置 -w 监视后,可直接得到写入者账号、进程与精确时间;前提是监视规则在事件发生前就已生效。
不同发行版存放用户 crontab 的路径不同(Debian 系 /var/spool/cron/crontabs,RHEL 系 /var/spool/cron),排查时两个路径都要看。