防范恶意脚本通过定时任务持久化,关键在于管住“谁在跑、跑什么、在哪跑、有没有人知道”四件事:一要摸清所有任务来源(用户级、系统级、周期目录、systemd timer);二要强制绝对路径、最小权限、禁用高危语法;三要全量日志记录、实时变更监控与基线告警;四要脚本签名校验、加密存储及aide哈希扫描。

防范恶意脚本通过定时任务实现持久化,关键在于把“谁在跑、跑什么、在哪跑、有没有人知道”四件事全部管住。不是只看 crontab 里写了啥,而是构建一个覆盖识别、权限、监控、验证的闭环机制。
一、摸清所有定时任务来源,不漏一处
攻击者常在多个位置埋点,必须逐一排查:
- 用户级任务:用 crontab -l 查当前用户;sudo crontab -u root -l 查 root;对其他用户也执行 crontab -l -u username
- 系统级配置:cat /etc/crontab 和 ls /etc/cron.d/ && cat /etc/cron.d/*
- 周期性目录:ls -l /etc/cron.hourly /etc/cron.daily /etc/cron.weekly,检查脚本属主和权限
- systemd timer:systemctl list-timers --all,再用 systemctl cat xxx.timer 看 ExecStart 是否调用可疑路径
二、强制路径规范与最小权限落地
90% 的恶意任务靠宽松写法存活,必须立下硬规矩:
- 所有命令必须写绝对路径,如 /usr/bin/python3 /opt/scripts/backup.py,禁用 python3 backup.py
- /etc/cron.d/ 下文件属主必须是 root:root,权限设为 600;脚本统一放在 /opt/scripts/ 或 /usr/local/bin/,权限不高于 640
- 禁止使用通配符(如 /scripts/*.sh)、bash -c、sh -c、eval,这些是命令注入高危入口
- 普通用户需执行任务时,不给 crontab 权限,改用 sudoers 精确授权,例如:username ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx
三、日志全量记录 + 实时变更监控
没有日志等于没审计,没有监控等于等入侵:
- 启用 cron 日志:在 /etc/rsyslog.d/50-cron.conf 中加 cron.* /var/log/cron.log,重启 rsyslog
- 每个任务单独重定向输出:0 2 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1,并用 chattr +a /var/log/backup.log 防篡改
- 用 auditctl 监控关键路径:auditctl -w /etc/cron.d -p wa -k cron_d_changes,auditctl -w /etc/crontab -p wa -k crontab_changes
- 设置基线告警:非工作时间触发、含 wget/curl/sh -c、执行耗时突增 200%、从 /tmp 调起解释器,立即通知
四、脚本完整性校验与可信执行
攻击者常不动 crontab,只换脚本内容——防护重心必须前移到脚本本身:
- 对核心脚本使用 GPG 签名,执行前强制校验:gpg --verify /opt/scripts/deploy.sh.sig /opt/scripts/deploy.sh
- 敏感脚本存于 LUKS 加密分区,任务启动时挂载,执行完卸载
- 定期用 AIDE 扫描关键路径哈希:aide --check,发现异常即告警
- 临时目录挂载加 noexec 选项,防止 /tmp/.mal.sh 类脚本直接执行










