7.5.8 安全审计与合规检查项
安全审计与合规检查的目标是确保 Nginx 与 HTTPS 配置符合企业安全基线与行业规范,并具备可追踪、可验证的安全控制。本节给出审计流程、原理草图、可执行命令示例、排错路径与练习,形成可落地的审计闭环。
审计原理草图(资产→配置→验证→整改→复测):
一、审计准备与基线清单
基线文件与范围建议包括:Nginx 主配置、证书链与私钥、访问/错误日志、WAF 规则、变更记录。示例目录结构:
/etc/nginx/nginx.conf
/etc/nginx/conf.d/*.conf
/etc/ssl/certs/site.crt
/etc/ssl/private/site.key
/var/log/nginx/access.log
/var/log/nginx/error.log
二、关键检查项与命令示例(含解释与预期效果)
1) TLS 版本与加密套件
检查 Nginx 当前生效配置(输出合并后的完整配置):
sudo nginx -T | sed -n '1,200p'
# 预期:能在输出中看到 ssl_protocols/ssl_ciphers/ssl_prefer_server_ciphers
验证对外服务支持的协议版本:
# 检测是否禁用 TLS1.0/1.1
echo | openssl s_client -connect example.com:443 -tls1_1 2>/dev/null | grep -E "Protocol|Cipher"
echo | openssl s_client -connect example.com:443 -tls1_2 2>/dev/null | grep -E "Protocol|Cipher"
echo | openssl s_client -connect example.com:443 -tls1_3 2>/dev/null | grep -E "Protocol|Cipher"
# 预期:TLS1.1 连接失败或无有效协商;TLS1.2/1.3 成功
2) 证书链完整性与有效期
# 检查证书与私钥匹配
openssl x509 -noout -modulus -in /etc/ssl/certs/site.crt | openssl md5
openssl rsa -noout -modulus -in /etc/ssl/private/site.key | openssl md5
# 预期:两次 md5 一致
# 检查证书有效期
openssl x509 -noout -dates -in /etc/ssl/certs/site.crt
# 预期:notAfter 在未来且符合续期策略
3) 私钥权限与存放路径
sudo stat -c "%a %U %G %n" /etc/ssl/private/site.key
# 预期:权限为 600,属主为 root 或 nginx 进程用户
sudo find /etc/ssl/private -type f -perm /022 -ls
# 预期:无可被组/其他用户写入的私钥文件
4) HSTS 与安全头检查
示例配置(确保在 server 中生效):
server {
listen 443 ssl http2;
server_name example.com;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer" always;
add_header Content-Security-Policy "default-src 'self'" always;
# 其他配置...
}
验证响应头是否生效:
curl -I https://example.com | egrep -i "strict-transport-security|x-frame-options|x-content-type-options|referrer-policy|content-security-policy"
# 预期:所有安全头均出现,且值符合基线
5) 重定向与强制 HTTPS 覆盖
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
验证:
curl -I http://example.com | head -n 1
# 预期:HTTP/1.1 301 Moved Permanently
6) 反向代理透传与真实 IP 获取
示例配置:
real_ip_header X-Forwarded-For;
set_real_ip_from 10.0.0.0/8;
set_real_ip_from 192.168.0.0/16;
log_format main '$remote_addr - $http_x_forwarded_for - $request';
access_log /var/log/nginx/access.log main;
验证:
sudo tail -n 2 /var/log/nginx/access.log
# 预期:remote_addr 为真实客户端 IP 或可信代理 IP,X-Forwarded-For 可追溯
7) 日志保留与脱敏
示例(使用 logrotate):
sudo cat /etc/logrotate.d/nginx
示例期望:
/var/log/nginx/*.log {
daily
rotate 30
compress
missingok
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
endscript
}
三、合规检查清单(可作为审计表模板)
- 协议与加密:禁用 TLS 1.0/1.1,启用 TLS 1.2/1.3;限制弱加密套件与空加密
- 证书管理:证书链完整、未过期、签发机构可信;私钥权限最小化
- 安全头与策略:HSTS、X-Frame-Options、X-Content-Type-Options、CSP 等按需启用
- 访问控制:管理后台白名单/双因素;禁止目录遍历与敏感文件下载
- 日志与审计:访问与错误日志保留周期符合要求;脱敏策略到位
- WAF 与防护:SQL 注入、XSS、暴力破解拦截策略生效
- 配置变更:变更审批、回滚策略明确;配置纳入版本控制
- 漏洞管理:Nginx 与依赖库定期更新;漏洞修复记录完整
- 备份与灾备:关键配置、证书、日志具备备份与演练记录
四、排错与常见问题定位
1) HSTS 未生效
- 检查是否在 80 端口或未启用 https 的 server 中设置
- 确认 add_header ... always;
- curl -I https://example.com 验证
2) TLS1.1 仍可连接
- 确认 ssl_protocols TLSv1.2 TLSv1.3;
- 重载配置:sudo nginx -t && sudo systemctl reload nginx
3) 证书链不完整
- 使用 openssl s_client -connect example.com:443 -showcerts 检查是否缺失中间证书
- 重新合并证书链:cat server.crt intermediate.crt > fullchain.crt
五、审计脚本示例(快速核查)
#!/usr/bin/env bash
set -e
DOMAIN="example.com"
CRT="/etc/ssl/certs/site.crt"
KEY="/etc/ssl/private/site.key"
echo "[1] TLS 版本"
echo | openssl s_client -connect ${DOMAIN}:443 -tls1_1 2>/dev/null | grep Protocol || echo "TLS1.1 disabled"
echo | openssl s_client -connect ${DOMAIN}:443 -tls1_2 2>/dev/null | grep Protocol
echo | openssl s_client -connect ${DOMAIN}:443 -tls1_3 2>/dev/null | grep Protocol
echo "[2] 证书有效期"
openssl x509 -noout -dates -in $CRT
echo "[3] 私钥权限"
stat -c "%a %U %G %n" $KEY
echo "[4] 安全头"
curl -I https://${DOMAIN} | egrep -i "strict-transport-security|x-frame-options|x-content-type-options|referrer-policy|content-security-policy"
执行:
chmod +x /usr/local/bin/nginx_audit.sh
sudo /usr/local/bin/nginx_audit.sh
预期:输出 TLS1.1 禁用信息、安全头完整、证书有效期合理、私钥权限为 600。
六、练习与实操任务
1) 用 openssl s_client 验证 TLS1.1 禁用,记录输出结果。
2) 给站点加上 HSTS 与 CSP 头,curl -I 验证其生效。
3) 将 Nginx 配置加入 Git 管理,模拟一次配置变更并记录审计证据。
4) 手工拆分证书链,制造链不完整问题,再用 s_client -showcerts 排查并修复。
5) 设置 logrotate 保留 30 天日志,并检查是否按期轮转。