必须确保/etc/at.allow不存在且/etc/at.deny显式存在并预置全部普通租户用户名,以此实施黑名单管控;root始终不受限制,修改后策略即时生效无需重启atd服务。

在多租户高安全开发沙箱环境中,禁用普通用户使用 at 命令是防御延迟型 DDoS 攻击(如批量调度大量耗时任务、触发资源洪泛)的有效前置控制手段。关键不在于“拦截运行时行为”,而在于从调度源头切断非授权用户的任务提交能力——/etc/at.deny 是最直接、轻量且无需重启服务的系统级阻断方式。
确认系统当前采用 deny 优先策略
at 权限控制依赖两个文件的共存状态:
- 若 /etc/at.allow 存在,则只有其中列出的用户可使用 at;其他所有用户(包括普通租户)默认无权使用
- 若 /etc/at.allow 不存在,而 /etc/at.deny 存在,则其中列出的用户被明确禁止,其余用户(含新创建租户)默认允许 —— 这正是需要规避的风险态
- 若两者都不存在,仅 root 可用 at,但该状态不可靠,易被后续误操作打破
因此,**必须确保 /etc/at.allow 不存在,且 /etc/at.deny 显式存在并已预置全部普通租户用户名**。这是实施黑名单管控的前提。
精准添加租户到 /etc/at.deny 并设严苛权限
以租户 user1、user2、devteam 为例,执行以下操作(需 root 权限):
- 执行 echo -e "user1\nuser2\ndevteam" >> /etc/at.deny 追加用户名(每行一个,无空格或注释)
- 立即设置文件权限:chmod 600 /etc/at.deny,防止非 root 用户读取或篡改名单
- 检查是否存在 /etc/at.allow:ls -l /etc/at.allow;若存在,直接 rm -f /etc/at.allow
修改后策略即时生效,无需重启 atd 服务。注意:root 始终不受 /etc/at.deny 限制,这是设计保障,无需也不应写入该文件。
验证阻断效果与清理残留任务
切换至任一被禁租户账户(如 su - user1),执行:
- at -l → 应返回错误:at: 使用許可されていません
- echo "date" | at now + 1 minute → 同样报 “使用許可されていません”
- 若此前该用户已提交过 at 任务,需手动清理:sudo atrm $(sudo atq | awk '$3 ~ /user1/ {print $1}')
该验证步骤不可跳过,避免因历史任务残留导致误判策略失效。
配合沙箱环境强化纵深防御
仅禁用 at 不足以覆盖全部调度风险,需与沙箱机制协同:
- 在容器或虚拟机级沙箱中(如 Kata Containers 或 gVisor),关闭 atd 服务:systemctl disable --now atd,从运行时层面移除攻击面
- 对租户 home 目录启用磁盘配额(xfs_quota 或 quota),限制其可提交的作业总大小与数量
- 结合 PAM 模块(如 pam_time.so)限制租户每日可调用 at 的时段与频次,作为策略兜底
单一配置无法替代分层防护,/etc/at.deny 是第一道门,但门后还需加固墙体与警报系统。

















