web服务器权限隔离核心是运行用户降权、目录权限分治、动静资源分离:创建专用低权用户(如webproc),严格划分根目录、上传目录、数据目录、日志目录的读写执行权限,上传文件存于web根目录外并禁用脚本执行,内网对接启用双向mtls或api网关鉴权。

Web服务器权限隔离不是加一层锁,而是把整个运行环境按角色切开——让进程跑得低、目录管得死、上传和执行永远不共存。核心就三点:运行用户降权、目录权限分治、动静资源分离。
运行用户必须是非特权专用账号
别让Nginx或Apache用root启动,也别复用系统已有账户(如www-data可能被其他服务共享)。正确做法是:
- 创建独立用户组,例如nginx-sec,再建专属用户webproc
- 在nginx.conf或httpd.conf中明确指定:user webproc nginx-sec;
- 确认PHP-FPM也使用同一低权用户,且其www.conf里
user = webproc、group = nginx-sec - 检查/bin/sh等敏感二进制文件对webproc用户设为不可执行(
chmod 750 /bin/sh并移除组执行位)
网站目录权限严格分层控制
“能写不能执行,能执行不能写”是铁律。不同目录按用途划清边界:
- 根目录(/var/www/html):仅webproc用户有读+执行权,组和其他用户无任何权限
-
上传目录(/var/www/html/upload):webproc可写+读,但禁止执行脚本——Nginx配置中加
location ~ \.(php|sh|py|pl)$ { deny all; } - 数据目录(/var/www/data):仅应用进程可写,Web服务器本身不直接访问;通过API或消息队列间接调用
- 日志目录(/var/log/nginx):webproc可追加写,但不可读、不可删;由logrotate统一管理
上传与执行彻底物理隔离
上传文件默认存到Web根目录外,再由后端服务校验后决定是否移动或链接。避免任何路径拼接式访问:
- 前端上传接口返回的URL不指向/upload/,而是经CDN或代理中转的静态地址(如https://static.example.com/u/abc123.jpg)
- Web服务器配置中禁用autoindex(目录浏览),关闭Options Indexes,防止遍历暴露结构
- 对.htaccess或.user.ini等覆盖配置文件统一禁止解析(Apache设
AllowOverride None,Nginx不启用fastcgi_param PHP_VALUE) - NTFS或ext4文件系统上,对上传目录挂载noexec,nosuid,nodev选项(Linux需在/etc/fstab中配置)
内网服务对接不走信任通道
DMZ里的Web服务器连内网数据库或API,不能靠防火墙放行就认为安全:
- 内网服务只监听内网IP(如10.10.20.5:3306),禁用0.0.0.0:3306
- 数据库账号按最小权限分配:Web应用账号仅允许SELECT/INSERT指定表,禁用DROP、CREATE、FILE
- Web与内网服务间通信启用双向mTLS,或统一走API网关,由网关做鉴权、限流、请求体审计
- 支付回调、用户同步等关键操作,必须经过消息队列中转,并对每条消息签名+验签











