/etc/crontab中任务默认受系统umask(如022)影响,文件权限可能不安全;应显式设置umask(如077)或用包装shell统一管控,并验证父目录权限与输出文件实际权限。

直接在 /etc/crontab 中执行任务时,新生成的文件默认权限受系统级 umask 控制。若未显式设置,常见默认 umask 是 022(导致文件为 644、目录为 755),可能造成敏感日志或临时文件被非授权用户读取——尤其当脚本输出到共享目录或需限制组/其他用户访问时。
明确 /etc/crontab 的执行上下文
/etc/crontab 是系统级配置,每行必须指定运行用户(如 root 或 www-data),任务以该用户身份执行,但不加载该用户的 shell 初始化文件(如 ~/.bashrc 或 /etc/profile),因此其环境变量(含 umask)来自 cron 守护进程启动时的默认值,通常由系统 init 系统或 cron 服务配置决定。
- 查看当前 cron 进程的 umask:可临时在 crontab 中加一行测试
* * * * * root umask > /tmp/cron_umask.log 2>&1,然后检查日志 - 不同发行版默认 umask 可能不同:Ubuntu/Debian 通常为
022,CentOS/RHEL 可能为002(影响组写权限) - 注意:
/etc/cron.d/下的文件格式与/etc/crontab一致,同样需指定用户且受相同 umask 影响
在任务中显式设置 umask(推荐做法)
最可靠、最透明的方式,是在每个定时命令前或脚本开头显式调用 umask,覆盖 cron 默认值。这比修改全局 umask 更安全,避免影响其他系统服务。
- 在
/etc/crontab行内直接写:0 2 * * * root umask 077 && /usr/local/bin/backup.sh > /var/log/backup.log 2>&1
确保umask和后续命令在同一 shell 上下文中执行(用&&连接) - 在脚本头部固定设置:
#!/bin/bash<br>umask 077<br># 后续所有 touch、cp、echo > 等操作都遵循此权限
- 若需区分文件和目录权限(如希望目录为
750、文件为640),仅靠 umask 不够,应配合chmod显式赋权
统一管控:通过 cron 的 SHELL 环境变量注入初始化逻辑
/etc/crontab 开头支持定义 SHELL、PATH、MAILTO 等变量。可自定义一个包装 shell,使其自动设置 umask 并加载必要环境:
- 新建
/usr/local/bin/safe-shell:#!/bin/bash<br>umask 007 # 示例:组可读写,其他无权限<br>exec /bin/bash "$@"
并赋予执行权限:chmod +x /usr/local/bin/safe-shell - 在
/etc/crontab顶部添加:SHELL=/usr/local/bin/safe-shell - 此后所有通过该 crontab 启动的任务,都会继承这个 umask,无需每行重复
验证与审计关键输出路径
即使设置了 umask,仍需确认目标路径本身的父目录权限允许预期行为(例如:若父目录权限是 755 且 umask=077,新文件仍为 600,但父目录可被他人遍历;若父目录是 750,则更稳妥)。
- 定期检查高风险输出目录:
find /var/log /tmp /var/spool -type d -perm /007 -ls(找其他用户有写/执行权限的目录) - 对 cron 生成的关键文件做权限快照:
stat -c "%a %n" /var/log/backup.log,结合日志时间判断是否符合预期 - 在脚本末尾加入校验逻辑:
[[ "$(stat -c "%a" "$OUTPUT_FILE")" == "600" ]] || { echo "权限异常!"; exit 1; }










