在 nginx.conf 全局块最顶部配置 user 指令(如 user nginx nginx;),可使 Worker 进程以非 root 用户运行,Master 进程仍以 root 启动;该用户需提前创建为无登录权限的系统用户,并赋予必要文件访问权限,再通过 ps 命令验证进程身份分离,最后结合 systemd、SELinux 等机制实现纵深防御。
直接在 nginx.conf 全局块(main context)最顶部写一行 user 指令,指定非 root 用户和组,就能让 Worker 进程降权运行——Master 进程仍以 root 启动,不受影响。
user 指令只能出现在 events 块和 http 块之前,也就是整个配置文件的最外层、最上方。放错位置会报错:"user" directive is not allowed here。
user nginx nginx;
events { ... }
http { ... }
http、server 或 location 块内部nobody,行为不可靠user root root;,这会让 Worker 也以 root 运行,失去安全意义Worker 进程会切换到该用户身份运行,所以这个用户得提前创建,并限制其系统权限。
sudo useradd -r -s /sbin/nologin -d /var/www nginx
-r 表示创建系统用户;-s /sbin/nologin 禁止登录;-d 指定家目录(可选但建议)root 拥有,权限设为 600,Worker 用户不可读改完配置重启 Nginx 后,用系统命令确认 Master 和 Worker 的实际运行身份是否分离。
ps aux | grep nginx
root 开头的 master process,多行 nginx(或你指定的用户名)开头的 worker process
ps -o pid,user,group,comm -C nginx
sudo -u nginx ls -l /var/www/html/index.html
仅靠 user 指令不够,需结合操作系统级防护形成纵深防御。
User=root 在 service 文件中保障 Master 启动,同时通过 AmbientCapabilities=CAP_NET_BIND_SERVICE 让 Master 只保留绑定端口能力,剥离其他 root 权限httpd_t 域,必要时用 semanage fcontext 标记自定义路径autoindex、ssi,关闭 server_tokens,防止信息泄露暴露版本或架构