核心是通过 /etc/at.allow(白名单)和 /etc/at.deny(黑名单)实现权限控制:1. 有 at.allow 时仅其内用户可用,at.deny 被忽略;2. 无 allow 但有 deny 时,其中用户被禁,其余默认允许;3. 两者皆无则仅 root 可用。

要防止非授权用户通过 at 提交一次性任务,核心是利用系统级黑白名单机制,即通过配置 /etc/at.allow 和 /etc/at.deny 文件实现细粒度权限控制。这套机制不依赖服务重启,修改后立即生效,但需注意文件存在性与优先级规则。
明确黑白名单的优先级和行为逻辑
系统判断用户能否使用 at 时,严格按以下顺序执行:
- 若
/etc/at.allow存在,则仅该文件中列出的用户可使用at(包括at、atq、atrm等全部相关命令),其他所有用户一律拒绝,/etc/at.deny将被忽略 - 若
/etc/at.allow不存在,而/etc/at.deny存在,则其中列出的用户被禁止,其余用户默认允许 - 若两个文件都不存在,只有 root 可以使用
at;普通用户会收到 “at: 使用許可されていません” 类似提示
推荐的安全配置方式
生产环境建议采用白名单模式(即启用 /etc/at.allow),它更符合最小权限原则,避免遗漏导致越权:
- 创建空的
/etc/at.allow:touch /etc/at.allow,再用echo root >> /etc/at.allow确保 root 可用 - 如需授权特定运维人员,逐行追加用户名,例如:
echo "admin" >> /etc/at.allow - 设置文件权限为
600(仅 root 可读写):chmod 600 /etc/at.allow - 若已存在
/etc/at.deny,建议先移除或清空,避免规则冲突
验证配置是否生效
无需重启 atd 服务,直接测试目标用户权限即可:
- 切换到待验证用户(如
su - smith),运行at -l - 若返回
at: 使用許可されていません,说明已被成功限制 - 尝试提交任务:
echo "date" | at now + 1 minute,同样应报相同拒绝信息 - root 用户始终不受
.deny影响,但若未出现在.allow中,也会被白名单机制拦截(因此务必确保 root 在其中)
配套注意事项
仅靠黑白名单还不够,还需同步落实基础防护:
-
atd服务本身必须处于运行状态,否则所有at请求均失败;可用systemctl status atd检查 - 用户残留任务不会自动清除,禁用前建议用
sudo -u username atq | awk '{print $1}' | xargs -r sudo atrm批量清理 - 不要依赖
at.deny做主控——空文件虽默认放行所有人,但新增账户易被遗漏,风险高于白名单 - 定期审计
/var/spool/at/目录权限(应为drwx------且属主为root:daemon)











