核心是让nginx更小、更哑、更难被利用:用非root用户运行、裁剪capabilities、根文件系统只读、网络最小化暴露。

在容器环境中隔离 Nginx Web 服务,核心不是“让 Nginx 更强”,而是“让它更小、更哑、更难被利用”。重点在于切断攻击者从 Web 层横向渗透到宿主机或其他容器的路径。以下四点是落地最直接、见效最明显的隔离措施。
用非 root 用户运行容器进程
这是隔离的起点。默认以 root 启动容器,一旦 Nginx 或 PHP-FPM 出现漏洞(如远程代码执行),攻击者可直接获得容器内 root 权限,进而尝试逃逸或挂载敏感路径。必须强制降权:
- 在
nginx.conf开头明确设置user nginx nginx;(先用useradd -r -s /sbin/nologin nginx创建专用用户) - Docker 运行时加
--user 1001:1001参数,与配置文件中用户 UID/GID 一致 - 避免在 Dockerfile 中用
USER root,也不要用sudo或su切换权限
限制容器能力与文件系统权限
即使降权,root 容器仍拥有大量内核能力(capabilities),比如加载模块、修改网络栈。应主动裁剪:
- 启动时用
--cap-drop=ALL清空所有能力,再按需添加必要项,例如仅保留--cap-add=NET_BIND_SERVICE(允许绑定 80/443 端口) - 根文件系统设为只读:
--read-only,再通过-v /var/log/nginx:/var/log/nginx:rw单独开放日志写入目录 - SSL 证书等敏感配置文件挂载时加
:ro标志,禁止容器内修改
网络层面做最小化暴露
容器默认桥接网络容易被同网段其他容器扫描或攻击。隔离要从网络拓扑入手:
- 不用
docker run --network bridge,改用自定义网络:docker network create --driver bridge --subnet 172.20.0.0/16 nginx-net - 对外仅暴露必需端口(如 80/443),不映射管理端口(如 8080)、调试端口(如 9000)
- 若部署在 Kubernetes,用
NetworkPolicy限制 ingress 流量来源 IP 段,或禁止跨命名空间访问
配置 Nginx 本身强化边界控制
Nginx 是容器里唯一对外的入口,它要承担第一道“隔离墙”的职责:
- 关闭版本标识:
server_tokens off;,防止攻击者根据版本号精准投递漏洞利用 - 禁用危险模块:编译或镜像中移除
autoindex、ssi等非必需模块,减少攻击面 - 限制请求行为:用
limit_req控制单 IP 请求频率;用location ~* \.(bak|git|svn)$ { return 403; }阻止敏感文件访问 - 强制域名访问:
if ($host !~ ^(example.com|www.example.com)$) { return 444; },拒绝 IP 直连或非法 Host 头











