关键在于最小权限+明确归属+分层隔离:创建专用用户(如nginx),配置user nginx nginx;网站根目录755(root:nginx),静态文件644,上传目录750(nginx:nginx)并禁脚本执行,日志目录750(root:nginx),私钥600(root:root)。

防止网站被恶意篡改,关键不是堵住所有写入口,而是让 Nginx 进程能正常读取和提供服务,同时确保其他用户(包括攻击者账户)无法修改网站文件或执行任意代码。核心是“最小权限 + 明确归属 + 分层隔离”。
确认并统一 Nginx 运行身份
权限错乱的起点往往是属主不一致。Nginx 主进程与工作进程必须以同一非 root 用户运行,且该用户只拥有必要路径的访问权:
- 运行 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/www/html(假设网站根目录为 /var/www/html),确保整个站点目录归属与运行身份完全一致
设置网站根目录与文件的严格权限
目录需可遍历、文件需可读取,但禁止组和其他用户写入或执行 —— 尤其要防上传后门被解析执行:
- 网站根目录(如 /var/www/html)设为 755:属主 rwx,属组 rx,其他 rx;确保 Nginx 用户能进入并列出内容,但他人不能写入
- 静态文件(.html、.css、.js 等)设为 644:属主 rw,属组 r,其他 r;禁止执行权限
- 动态脚本(如 .php)仍设为 644,**绝不设 755 或 600** —— 执行由 PHP-FPM 完成,Nginx 只需读取;若误加执行位,可能被利用为 WebShell 入口
- 敏感配置文件(如 .env、config.php)应移出 Web 根目录;若必须留在内,用 location ~ \.env$ { deny all; } 阻断访问
切断 Web 层对系统路径的越界访问
即使本地权限正确,错误的 root 或 alias 配置仍可能导致路径遍历,使攻击者读取 /etc/passwd 或覆盖关键文件:
- 静态资源优先用 alias 而非 root,例如:location ^~ /static/ { alias /var/www/assets/; } —— 不拼接 URI,天然防 ../
- 禁用自动索引:autoindex off;,避免目录被列出来暴露结构
- 拦截非法路径模式:if ($request_uri ~ "\.\.|//") { return 403; }(放在 location 内)
- 用 try_files $uri =404; 做兜底,确保只响应真实存在的文件,不回溯父目录
隔离可写目录并限制执行能力
上传目录、缓存目录等必须可写,但绝不能被 Web 解析执行,否则等于开放后门:
- 单独创建上传目录(如 /var/www/uploads),设属主为 www-data:www-data,权限 755
- 在对应 location 中禁用脚本解析:location ~ /\.(php|sh|pl|py|jsp|asp|rb|cgi)$ { deny all; }
- 若使用 PHP,确保 upload_tmp_dir 和 opcache.file_cache 等临时路径不在 Web 可达范围内
- 对日志目录(/var/log/nginx)也做同样处理:属主 www-data,权限 750,文件 640,并配置 logrotate 使用 create 640 www-data www-data











