Web应用关键进程需从身份、路径、能力、上下文四维度最小化权限隔离:一设专用低权用户并清理高危组;二按用途分目录实施“能写不能执行”;三通过中间件配置与内核能力双重约束防绕过;四对内网通信实行零信任,限制数据库权限、启用mTLS或API网关。

Web 应用关键运行进程的最小化权限隔离,不是给账号“减点权限”就完事,而是从身份、路径、能力、上下文四个维度同步收紧——让进程只知道自己该跑哪、能碰哪些文件、能调哪些系统功能、连谁都不该随便连。
一、创建专用低权运行用户,彻底剥离登录与高危组
别复用 www-data 或 nginx 这类系统默认账户,它们常被多个服务共享,也容易被预设进 adm、sudo 等敏感组。
- 新建独立用户和组:
useradd -r -s /sbin/nologin webproc && groupadd nginx-sec - 确认该用户无家目录、无 shell(
/etc/passwd中对应行末尾为/sbin/nologin) - 执行
groups webproc查看当前所属组,逐个清理:deluser webproc adm && deluser webproc sudo && deluser webproc docker - 仅保留
webproc和nginx-sec两个组,不加入任何系统级高权组
二、按用途切分目录权限,严格执行“能写不能执行”铁律
权限失控往往发生在上传目录或日志目录——攻击者上传一句话木马后直接执行,根源就是目录同时具备写+执行权限。
- 网站根目录(如
/var/www/html):仅webproc用户有r-x权限,组和其他用户全无权限(chmod 750) - 上传目录(如
/var/www/html/upload):webproc可读写(rw-),但禁止执行——Nginx 配置中加:location ~ \.(php|py|sh|pl)$ { deny all; } - 数据目录(如
/var/www/data):Web 进程不直连,由后端服务通过 API 或消息队列访问;该目录所有者设为应用专属用户,webproc无任何权限 - 日志目录(如
/var/log/nginx):webproc仅可追加写(chown root:webproc+chmod 750+setgid),不可读不可删
三、中间件配置与内核能力双重约束,堵死绕过路径
仅改 Linux 用户权限不够,攻击者可能通过 PHP 的 system() 或 Nginx 的 fastcgi_param 指令绕过限制。
- Nginx 主配置中明确指定:
user webproc nginx-sec;,并关闭autoindex on、禁用ssi模块 - PHP-FPM 的
www.conf中设置:user = webproc、group = nginx-sec,且关闭php_admin_flag类指令 - 若需绑定 80/443 端口,不用 root 启动,改用 capability:
CapabilityBoundingSet=CAP_NET_BIND_SERVICE(systemd 场景)或--cap-add=NET_BIND_SERVICE(容器场景) - 对上传目录挂载
noexec,nosuid,nodev(Linux 下通过/etc/fstab或容器--tmpfs实现)
四、内网通信与资源访问必须“零信任”,不靠防火墙放行
DMZ 区 Web 服务器连内网数据库或 API,不能认为“只开 3306 端口+防火墙白名单”就安全——一旦 Web 进程被攻陷,它就能以自身身份发起连接。
- 数据库监听地址限定为内网 IP(如
bind-address = 10.10.20.5),禁用0.0.0.0 - 数据库账号按表粒度授权:
GRANT SELECT,INSERT ON app_db.orders TO 'webapp'@'%';,禁用DROP、FILE、EXECUTE - Web 与内网服务间启用双向 mTLS,或统一走 API 网关——网关负责鉴权、限流、请求头校验,Web 进程只认网关证书
- 容器环境额外启用
--read-only根文件系统,并仅对日志、临时目录做:rw映射

















