防止nginx日志被篡改需三步:控归属(chown为nginx运行用户)、限权限(目录750、文件640)、拦越权(logrotate设create/su,web层禁访问.log)。

防止 Nginx 日志文件被非法篡改,核心不是“防写入”,而是“控归属 + 限权限 + 拦越权”。日志必须由 Nginx 进程可写,但绝不能被其他用户(尤其是低权限或攻击者账户)读、写或执行。关键在于让日志目录和文件只对 Nginx 运行身份开放最小必要权限。
确认并统一运行身份
权限错乱的根源常是属主不匹配。Nginx 主进程和工作进程需以同一用户/组身份操作日志:
- 运行 ps aux | grep nginx,查看主进程 USER 列(如 www-data 或 nginx)
- 检查 /etc/nginx/nginx.conf 中的 user 指令(如 user www-data www-data;),若未设置,可能默认为 nobody
- 执行 sudo chown -R www-data:www-data /var/log/nginx,确保整个日志目录归属与运行身份一致
设置严格但可用的目录与文件权限
权限过松(如 755、644)会让其他用户读取敏感信息;过严(如 700、600)可能导致 Nginx 工作进程因组权限缺失而无法写入(尤其在多 worker 场景下):
- 日志目录(如 /var/log/nginx)设为 750:属主 rwx,属组 rx,其他无任何权限
- 日志文件(access.log、error.log 等)设为 640:属主 rw,属组 r,其他无权限
- 执行命令示例:sudo chmod 750 /var/log/nginx 和 sudo chmod 640 /var/log/nginx/*.log
堵住 logrotate 引发的权限漏洞
日志轮转是权限被重置的高发环节。若 logrotate 以 root 身份创建新日志,默认归属 root:root、权限 644,Nginx 将无法写入,且日志内容暴露:
- 编辑 /etc/logrotate.d/nginx,确保包含两行关键配置:
create 640 www-data www-data(新建文件权限与属主属组)
su www-data www-data(以该用户身份执行轮转) - 测试配置是否生效:sudo logrotate -d /etc/logrotate.d/nginx,观察调试输出中是否显示 “creating new log file with mode = 0640”
切断 Web 层对日志的直接访问路径
即使本地权限正确,若日志目录意外暴露在 Web 根路径下,攻击者可通过 URL 直接下载日志文件(如 https://example.com/logs/access.log):
- 确认 /var/log/nginx 不在任何 root 或 alias 指令指向的路径中
- 在站点配置中添加防护规则,禁止匹配日志路径的请求:
location ~ ^/logs/ { return 403; }
location ~ \.log$ { deny all; } - 定期检查是否存在误配:grep -r "log" /etc/nginx/sites-enabled/











