这个坑值得记一笔。等保测评扫出一堆高危,说 nginx 的 ssl 私钥是 644 权限任意用户可读,可改成 600 之后 nginx -s reload 报 Permission denied,站点直接起不来。

刚开始盯着「目录权限也没收紧,上一级 letsencrypt 目录是 755 可以被遍历」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。私钥被 chmod 644 是因为部署脚本用 cp 覆盖时沿用了源文件权限;nginx 的 worker 进程以 nginx 用户运行,600 且属主为 root 时读不到;证书更新脚本每次跑完都把权限改回 644。

第一件事是确认私钥当前的属主和权限

ls -l /etc/nginx/ssl/*.key && stat -c '%U %a' /etc/nginx/ssl/site.key

随后把属主改成 root 并给 nginx 组读权限

chown root:nginx /etc/nginx/ssl/site.key && chmod 640 /etc/nginx/ssl/site.key

然后确认 nginx 用户能读到文件

sudo -u nginx head -c 20 /etc/nginx/ssl/site.key

剩下的就是重载并检查证书加载情况

nginx -t && systemctl reload nginx

改完先别撤,确认这几项。ls 显示私钥为 640 且属主 root 属组 nginx,nginx -t 通过,站点 HTTPS 正常访问,扫描报告里这条高危消失。

补一句。不要为了省事给 600 再把 nginx 跑成 root;证书续期脚本里要显式带 chown 和 chmod,否则下次续期权限又被打回原样。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189