nginx安全加固需围绕等保、gdpr、pci dss等合规要求,聚焦进程权限最小化(非root运行)、敏感信息隐藏(server_tokens off等)、访问控制与请求限制(ip白名单、基础认证、限速)、tls强加密(仅tlsv1.2+、禁用弱算法)及日志脱敏审计(禁录敏感字段、ip哈希处理)。

Nginx 安全加固不是堆砌配置,而是围绕等保、GDPR、PCI DSS 等合规要求,做可验证、可审计、可回溯的实质性检查。核心不在于“有没有配”,而在于“配得对不对、启没启用、日志留不留痕”。
检查 Nginx 进程权限是否最小化
非 root 运行是底线,否则任意模块漏洞都可能直接提权。
- 执行
ps -ef | grep nginx,确认所有worker process所属用户为nginx或www-data,不能出现 root - 查
/etc/nginx/nginx.conf开头是否有user nginx;(或等效非特权用户) - 运行
id nginx,确认该用户是系统账户(非登录 shell,如/sbin/nologin) - 执行
passwd -S nginx,输出应含LK或Password locked,表示账号被锁定,无法交互登录
验证敏感信息是否真正隐藏
暴露版本号、目录结构、后端标识,等于主动提供攻击地图。
- 在配置中全局或 server 块内设置
server_tokens off; - 若使用反向代理,必须加
proxy_hide_header Server;和proxy_hide_header X-Powered-By; - 访问一个不存在路径(如
/xyz123),检查响应头和 HTML 页面是否完全不显示 Nginx 版本、操作系统路径、模块名等 - 确认静态资源 location 中已设
autoindex off;,防止目录遍历式扫描
核对访问控制与请求行为是否生效
放任未授权访问或高频请求,等于放弃边界防御。
- 对管理路径(如
/admin、/phpmyadmin)检查是否同时启用:
✓allow 192.168.10.0/24; deny all;(IP 白名单)
✓auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd;(基础认证)
✓limit_req zone=admin_login burst=3 nodelay;(防暴力破解) - 在关键 location 中限制 HTTP 方法:
if ($request_method !~ ^(GET|HEAD|POST)$) { return 405; }或更严谨的limit_except GET POST HEAD { deny all; } - 检查是否启用速率限制:
limit_req_zone $binary_remote_addr zone=api:10m rate=5r/s;并在对应 location 中调用
确认 TLS 与安全响应头是否符合强合规标准
仅开启 HTTPS 不够,必须满足协议、算法、头策略三重达标。
-
ssl_protocols必须只含TLSv1.2 TLSv1.3,严禁 TLSv1.0/TLSv1.1(PCI DSS 明令禁止) -
ssl_ciphers中不得出现RC4、MD5、DES、3DES、NULL;推荐组合:
ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384 - 响应头必须包含:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
X-Frame-Options: DENY或SAMEORIGIN
X-Content-Type-Options: nosniff
Content-Security-Policy: default-src 'self';(按需扩展) - 使用
curl -I https://your-domain.com或 SSL Labs 验证最终得分 ≥ A
审查日志与数据处理是否满足审计与脱敏要求
日志既是溯源依据,也是数据泄露高危区。
-
log_format中避免直接记录敏感字段:禁用$args、$http_cookie、$request_uri(含 token/password) - 使用
map实现字段级脱敏:
map $args $sanitized_args { ~*(password|token)=([^&\s]+) "-[REDACTED]-"; default $args; } - IP 地址建议哈希截取:
map $remote_addr $anonymized_ip { default md5($remote_addr); },再在 log_format 中写${anonymized_ip:0:8} - 确保
access_log和error_log路径存在、可写,且格式含$remote_addr $time_local $request_method $uri $status $body_bytes_sent等关键字段
不复杂但容易忽略











