at任务默认通过邮件发送执行结果,存在敏感信息泄露风险;应通过重定向输出、禁用自动邮件、改用可控日志三步切断邮件敏感流,并停用本地邮件服务加固。

at命令默认会把任务执行结果(包括标准输出和标准错误)通过本地邮件发给提交者,而如果任务中涉及echo "password=xxx"、curl带token的请求、或调用含敏感信息的脚本,这些内容就会原样出现在邮件正文里,存进/var/spool/mail/$USER——这是典型的敏感信息残留风险。
避免邮件泄露敏感输出的核心思路
不是“配置at发邮件时过滤内容”,而是**让at任务本身不产生需要发送的输出**。at不提供内置的邮件内容清洗机制,唯一可靠方式是主动控制任务的输入/输出流向。
- 所有可能含敏感信息的命令,必须显式重定向 stdout 和 stderr
- 禁用 at 的自动邮件通知(用
-m参数控制),改由任务内部按需、脱敏后主动记录或上报 - 绝不依赖“任务执行完系统自动发邮件”来传递结果
实际操作:三步切断邮件敏感流
1. 任务内重定向所有输出到空设备或安全日志
在 at 输入中,对每条可能打印敏感内容的命令加 >/dev/null 2>&1 或定向到受控文件:
curl -s "https://api.example.com/token?auth=abc123" > /tmp/at_result.log 2>&1echo "DB_PASS=supersecret" | openssl enc -aes-256-cbc -pbkdf2 -salt -out /secure/secrets.enc -pass file:/etc/keys/master.key >/dev/null 2>&1
2. 显式禁用 at 自动邮件
提交时加上 -m 参数——注意:-m 的含义是“即使没有输出也强制发邮件”,所以**不要加它**;默认行为是“有输出才发”。只要确保任务无输出,就不会触发邮件。
3. 如需保留执行痕迹,改用可控日志方式
例如:
- 写入专用日志:
date >> /var/log/at-jobs.log && your_command >> /var/log/at-jobs.log 2>&1 - 加密归档:
your_command 2>&1 | gpg --encrypt --recipient admin@company.com > /backup/at_$(date +%s).gpg - 调用审计接口:
curl -X POST https://audit.internal/log -d "job=reset-token&status=ok&time=$(date -u)"(不带原始 token)
额外加固建议
检查并限制本地邮件服务暴露面:
若非必要,可停用 postfix 或 sendmail,只保留 mailx 作为本地 MUA(不运行 SMTP 服务):
systemctl stop postfix && systemctl disable postfix- 确认
netstat -tlnp | grep :25无监听,/var/spool/mail/权限为0700,属主仅用户本人
验证是否生效:
提交一个测试任务:at now+1min,输入 echo "SECRET_TOKEN=xxx" >/dev/null 2>&1,然后 ctrl+d。一分钟后检查 mail 命令是否收不到新邮件,ls -l /var/spool/mail/$USER 时间戳未更新。











