计划任务为什么要白名单
定时任务是攻击者做持久化最喜欢的位置之一,也是普通账号越权执行的常见入口。很多系统默认靠 cron.deny 黑名单控制,甚至两个文件都不存在,结果是只要能登录就能写计划任务。收敛的正确姿态是用 /etc/cron.allow 与 /etc/at.allow 白名单:只列出确实需要跑定时任务的账号,其余一律拒绝。规则很简单,allow 文件存在时以它为准,deny 文件会被忽略。
基本信息
| 加固项 | 计划任务创建权限白名单 |
|---|---|
| 适用平台 | Linux(RHEL/CentOS、Debian/Ubuntu,cronie/vixie-cron) |
| 权限要求 | root |
| 达标判据 | cron.allow、at.allow 存在且仅列授权用户 |
| 生效优先级 | allow 存在则忽略 deny,两者都在时以 allow 为准 |
典型使用场景
- 等保与 CIS 基线明确要求限制 crontab 使用范围
- 跳板机、堡垒机上只允许运维账号建计划任务
- 业务账号拆分成专用账号后,逐个确认谁还需要定时任务
- 应急排查中清点异常定时任务并顺手关闭普通账号的创建权
- 容器或虚拟化宿主机上收紧运维入口
加固:只允许 root 建任务
加固:只允许 root 建任务
printf 'root\n' > /etc/cron.allow # 每行一个用户名,不要写逗号
printf 'root\n' > /etc/at.allow
chmod 600 /etc/cron.allow /etc/at.allow # 防止被普通用户读取或篡改
rm -f /etc/cron.deny /etc/at.deny # allow 优先,deny 留着只会造成误判核查:先盘清现有任务
核查:先盘清现有任务
cat /etc/cron.allow /etc/at.allow 2>/dev/null # 看白名单内容
for u in $(cut -f1 -d: /etc/passwd); do crontab -l -u "$u" 2>/dev/null | grep -v '^#' | sed "s/^/$u: /"; done # 全量盘点各账号任务
ls -l /etc/cron.d /etc/cron.daily /var/spool/cron # 系统级与用户级任务目录相关文件与语义
| 文件或目录 | 作用 | 注意点 |
|---|---|---|
| /etc/cron.allow | 允许创建计划任务的用户白名单 | 存在即生效,优先于 cron.deny |
| /etc/cron.deny | 禁止名单 | allow 存在时完全被忽略 |
| /etc/at.allow、at.deny | at 命令的同类控制 | 需要 atd 服务在运行才起作用 |
| /etc/cron.d 与 cron.hourly 等 | 系统级任务目录 | 属 root,白名单管不到这里,需单独核查内容 |
| /var/spool/cron/<user> | 用户级 crontab 落盘位置 | 白名单只挡新建,已存在的任务仍在跑 |
建设白名单前必须先跑上面的盘点命令:白名单一旦生效,不在列表里的账号连 crontab -e 都会被拒绝,如果业务账号漏登记,任务会在无人察觉时停掉。稳妥顺序是先盘点、再登记常用账号、最后加严。
allow 文件里每行只能是一个用户名,不能写逗号分隔或域账号格式;用 printf 或编辑器逐行写最可靠。用 sed、echo -e 批量拼接容易写出行尾空格或空行,导致规则意外生效范围变化。