web日志权限应设为umask 007,使文件默认660、目录770,确保仅所有者及所属组可访问;必须在进程启动前配置,否则新日志仍按旧umask创建。

Web应用日志文件权限过宽(比如 664 或 644)会导致敏感信息被同服务器其他用户读取,而 umask 是控制这一行为最底层、最可靠的手段——它在日志文件被 fopen()、open() 等系统调用创建的瞬间就生效,不依赖应用层代码是否显式调用 chmod()。
为什么不能靠 chmod -R 事后补救
很多运维习惯性在日志目录上跑 chmod -R 640 /var/log/myapp,但这治标不治本:
- 新生成的日志文件仍按旧
umask创建(比如仍是644),下次就又暴露了 -
chmod -R会误伤已有配置文件、归档压缩包等非日志文件 - 如果应用以多个用户身份运行(如 worker 进程切换到
www-data,但日志轮转脚本用root执行),权限会反复冲突 - 容器环境里
chmod -R可能因只读文件系统或挂载限制直接失败
umask 007 是 Web 日志的黄金值
对绝大多数 Web 应用(Nginx、Apache、Python Flask/Gunicorn、Node.js PM2),推荐将 umask 设为 007:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 文件默认权限
666& (~007) =660(rw-rw----):所有者和所属组可读写,其他人完全不可见 - 目录默认权限
777& (~007) =770(rwxrwx---):确保日志目录可进入、可写入 - 比
077更合理:允许运维组(如adm或自定义logviewers组)加入日志组,无需提权即可查日志 - 比
022更安全:彻底阻断其他用户(包括同一服务器上其他 Web 应用的运行用户)读取日志
必须在进程启动前设置 umask
umask 是进程级属性,子进程继承父进程的值。Web 应用启动链越长,越容易漏设:
- systemd 服务:在
.service文件的[Service]段加UMask=0007(注意是四位八进制,不是007) - Supervisor:在
[program:myapp]下加umask=0007 - Shell 启动脚本(如
start.sh):第一行必须是umask 007,且不能放在cd或export之后 - 容器镜像:Dockerfile 中用
USER www-data后,必须跟RUN umask 007 && ...;或在 entrypoint 脚本开头设umask 007 - 切忌只改
~/.bashrc:Web 进程通常不走交互式 shell,该配置完全无效
验证是否真正生效
别信配置文件写了就完事,必须实测:
- 重启应用后,在其工作目录下手动触发日志写入(如发一个 HTTP 请求),再立即执行:
ls -l $(find . -name "*.log" -mmin -1 | head -n1) - 检查输出是否类似
-rw-rw---- 1 www-data adm 123 Apr 28 21:55 access.log—— 关键是末三位是---,不是r--或rw- - 用另一个普通用户(不在
adm组)尝试读取:sudo -u nobody cat /var/log/myapp/access.log,应返回Permission denied - 如果看到
644,说明进程没继承到umask,回头检查启动方式和配置加载顺序
最易被忽略的是:Web 应用框架(如 Django 的 rotatingfilehandler)或日志库(如 logrotate)可能绕过进程 umask,自行指定 mode=0644。此时必须在代码/配置中显式覆盖,但前提是先确保 umask 已正确设置——否则连“覆盖”的机会都没有。










