谁能用 crontab
定时任务的访问控制靠两个文件实现:允许名单与拒绝名单。规则有明确的优先级,只要允许名单文件存在,拒绝名单就会被忽略;两者都不存在的系统,行为随发行版与版本而变,部分实现只允许管理员使用。因此加固时应当显式选择一种策略,而不是依赖默认值。
基本信息
| 适用平台 | Linux 各发行版(cron 实现不同,文件位置一致) |
|---|---|
| 控制文件 | /etc/cron.allow 与 /etc/cron.deny |
| 优先级 | 存在允许名单时忽略拒绝名单 |
| 权限要求 | 文件属主应为 root,普通用户不可写 |
典型使用场景
- 只允许特定账号在服务器上配置定时任务
- 安全基线整改,明确禁止普通用户使用定时任务
- 为运维账号开白名单,同时避免影响系统自身的定时任务
- 排查某个账号明明被加入拒绝名单却仍能创建任务的原因
- 变更后验证策略是否真的按预期生效
配置示例
配置示例
sudo tee /etc/cron.allow > /dev/null <<'EOF' # 仅允许 root 与 deploy 使用
root
deploy
EOF
sudo chmod 0644 /etc/cron.allow
sudo ls -l /etc/cron.allow /etc/cron.deny # 核对属主与权限
sudo -u ops crontab -l # 用目标账号实测是否被拒绝
sudo journalctl -u crond --since today | tail # 被拒时日志里会有记录拒绝名单写法
拒绝名单写法
echo baduser | sudo tee -a /etc/cron.deny # 追加到拒绝名单
sudo cat /etc/cron.deny # 核对内容
# 注意:若 /etc/cron.allow 已存在,本规则不会生效规则组合对照
| allow 存在 | deny 存在 | 结果 |
|---|---|---|
| 是 | 是 | 只允许名单内用户,deny 被忽略 |
| 是 | 否 | 只允许名单内用户 |
| 否 | 是 | 名单外用户都可用 |
| 否 | 否 | 行为依实现而定,多数仅管理员可用 |
只修改拒绝名单却期望阻止某个用户,而系统里已经存在允许名单时,规则不会生效;改完必须用目标账号实测一次。
加固建议
- 显式创建允许名单并只写入必要账号,避免依赖默认行为
- 文件属主设为 root 且不允许组写,权限过宽会被直接忽略
- 把系统自身需要的账号(如 root)保留在名单内,避免影响系统任务
- 把这项配置纳入基线检查,机器重装或迁移后容易遗漏
- 改完留一份变更记录,出现任务不执行时能快速回溯
被拒绝的用户执行任务管理命令时通常会收到明确错误,同时系统日志里也有记录,排查时两边对照看最快。