SSL私钥文件权限必须为600、属主root:root且不可被Web访问,否则违反等保2.0等合规要求;推荐存于/etc/nginx/ssl/或/etc/ssl/private/,父目录权限需设为700,并在Docker构建、启动及运行态全程校验。

ssl_certificate_key 对应的私钥文件,必须严格满足权限审计要求:文件权限为 600(即 -rw-------),属主属组均为 root:root,且不能位于任何 Web 可访问路径下。这不是“建议”,而是等保2.0、PCI DSS、GDPR 等主流合规标准的硬性条款。
私钥权限必须是 600
600 是唯一被接受的权限模式:
- 644 或更高权限(如 664、755)会被所有合规扫描工具(Trivy、OpenSCAP、等保测评系统)直接判定为高危项,导致一票否决
- 私钥本质是服务器身份凭证,一旦被非属主读取,即可用于 HTTPS 流量解密或中间人攻击
- Nginx 主进程以 root 启动,能读取 600 权限文件;工作进程无需直接读磁盘,靠主进程内存传递密钥
存放路径必须隔离且不可被 HTTP 访问
路径选择直接影响审计结果:
使用 Python 脚本下载 Docker 镜像并打包为 tar 文件。用户说“下载镜像”“拉取镜像”“pull xxx”“帮我下载 nginx 镜像”等时触发。支持 SOCKS5 代理直连(推荐)和国内镜像站加速两种模式。
- 推荐位置:/etc/nginx/ssl/ 或 /etc/ssl/private/ —— 这两个目录默认不在 Nginx 的 root 或 location 映射范围内
- 绝对禁止位置:/var/www/、/usr/share/nginx/html/、任何被 server 块中 root 指令指向的路径
- 验证方式:在浏览器中请求该私钥的 URL(如 https://yoursite.com/ssl/example.key),必须返回 403 或 404,绝不能返回 200 + 文件内容
父目录权限也需同步收紧
仅改私钥文件权限不够,整条路径都需最小权限控制:
- 若私钥放在 /etc/ssl/private/,则该目录权限必须设为 700(drwx------)
- 执行命令:
chmod 700 /etc/ssl/private/ && chown root:root /etc/ssl/private/ - 目录可执行(x)是必须的(否则无法进入),但仅限 owner,组和其他用户不能列出内容或进入
部署链路中必须嵌入权限校验
不能依赖上线后人工修复,需在交付全流程强制管控:
- Docker 构建阶段:COPY 私钥后立即执行
RUN chmod 600 /etc/nginx/ssl/*.key && chown root:root /etc/nginx/ssl/*.key - 容器启动时:entrypoint.sh 开头加入检查逻辑,例如
[[ $(stat -c "%a" /etc/nginx/ssl/key.pem) == "600" ]] || exit 1 - 运行态定期扫描:
find /etc/nginx -name "*.key" -perm /037 -ls,发现权限过宽文件立即告警

















