核心是让worker进程仅拥有读静态文件、写日志、访问临时目录三类必要权限:创建专用系统用户nginx,配置user nginx nginx;网站根目录755(root:nginx),上传目录750(nginx:nginx)并禁脚本执行,日志目录750(root:nginx),私钥600(root:root)。

实施最小权限访问原则,核心是让 Nginx 进程只拥有完成任务所必需的最低权限——不多给一比特,也不少给一关键能力。这不是简单改个用户,而是一整套从运行身份、文件权限、网络暴露到响应行为的闭环控制。
明确 worker 进程的运行身份
主进程由 root 启动是必要的(绑定 80/443 端口),但所有处理请求的 worker 进程必须降权运行:
- 创建专用系统用户:
useradd -r -s /sbin/nologin -M nginx,确保无登录能力、无家目录、不加入 sudo/adm 等高权限组 - 在
nginx.conf的最外层(main 上下文)写明:user nginx nginx;,不能省略组名,也不能写在 http 或 server 块内 - 重启后验证:
ps aux | grep 'nginx: worker',UID 列应显示为 nginx 用户的数字 ID,而非 root 或 65534
按用途分层设置文件系统权限
用户设对了,目录权限没跟上,等于门锁好了却把钥匙扔在门口:
- 网站根目录(如
/var/www/html):属主root:nginx,权限755—— nginx 可读可进入,不可写 - 上传目录(如
/var/www/uploads):属主nginx:nginx,权限750,并在 location 中禁用脚本执行:location ~ \.(php|sh|pl|py)$ { deny all; } - 日志目录(如
/var/log/nginx):属主root:nginx,权限750;Nginx 启动时由主进程初始化,worker 仅需追加写入权限(通过组写权限实现) - SSL 私钥(如
/etc/ssl/private/example.key):属主root:root,权限600;主进程读取后内存持有,worker 不直接访问 - 配置文件(
/etc/nginx/下):属主root:root,权限644;子配置若需部署工具更新,可设为640,组为 nginx
限制网络与响应层面的暴露面
最小权限不止于文件系统,还体现在服务对外表现上:
- 隐藏版本和服务器标识:
server_tokens off;放在 http 块中,避免泄露 Nginx 版本号 - 精简响应头:
more_clear_headers "Server" "X-Powered-By";(需启用ngx_http_headers_more_module) - 禁用目录遍历:
autoindex off;显式关闭;并拒绝访问隐藏文件:location ~ /\. { deny all; } - 防火墙协同:配合 iptables 设置默认 DROP 策略,仅开放 80/443/22(SSH),并允许已建立连接和本地回环
叠加运行时约束与审计能力
单点防护易被绕过,需多层加固形成纵深防御:
- 若使用 systemd 托管,在
/etc/systemd/system/nginx.service.d/override.conf中添加:NoNewPrivileges=yes、ProtectSystem=strict、RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 - 禁用非必要模块(如 autoindex、ssi、perl),编译时加
--without-http_autoindex_module等参数 - 开启访问日志与错误日志,确保每类请求可追溯;对敏感路径(如
/admin、/api)单独记录或限流 - 将 user 指令、目录权限、响应头策略纳入 CI/CD 部署检查清单,防止人工误操作回退


















