Nginx安全基线需分层设防:路径准入(白名单+高危路径阻断)、连接与请求双限流(按路径分级)、协议与头部加固(HTTPS/真实IP/方法限制)、响应头与日志增强(安全头+完整日志+隐藏服务标识)。

Nginx 作为流量入口网关,应在请求抵达后端前完成主动拦截与标准化处理。安全基线不是堆砌规则,而是按处理流程分层设防:从路径准入、连接控制、协议校验,到响应加固与日志审计,每层职责清晰、可验证、不重叠。
路径级访问控制:只放行已知合法路径
拒绝一切未明确允许的访问,避免依赖“黑名单式”封禁。重点防护高危路径和敏感资源:
- 用正则精确匹配业务 API,例如:
location ~ ^/api/v1/(users|orders|products)$ { proxy_pass http://backend; } - 主动阻断调试与管理类路径:
location ~ ^/api/v1/(admin|debug|swagger|actuator|health) { return 403; } - 禁止访问敏感文件后缀:
location ~ \.(env|git|yml|log|bak|sql|htaccess)$ { return 404; } - 显式拦截目录遍历与隐藏文件:
location ~ /\.|/\.\. { return 403; }
连接与请求双限流:应对不同形态攻击
仅限速率易被慢速连接绕过,仅限连接数挡不住高频短连接扫描。必须组合配置,并区分路径严控程度:
- 定义两个独立共享内存区:
limit_conn_zone $binary_remote_addr zone=perip:10m;和limit_req_zone $binary_remote_addr zone=perip_req:10m rate=50r/s; - 全局基础防护:
limit_conn perip 30;+limit_req zone=perip_req burst=100 nodelay; - 登录等敏感路径加严:
location /auth/login { limit_req zone=perip_req burst=5 nodelay; } - 静态资源路径可放宽速率但限制连接数,防止资源耗尽
协议与头部加固:统一收口常见绕过入口
不把协议松散、头伪造、方法滥用等问题留给后端处理,Nginx 层必须兜底:
- 强制 HTTPS 并禁用旧协议:
if ($scheme = http) { return 301 https://$host$request_uri; },配合ssl_protocols TLSv1.3; - 标准化真实客户端 IP:
map $http_x_forwarded_for $real_ip { "" $remote_addr; default $remote_addr; },后续限流与日志均基于$real_ip - 严格限制 HTTP 方法:
if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE|PATCH|OPTIONS)$) { return 405; } - 拒绝空 UA 或已知扫描工具:
if ($http_user_agent ~* "(nmap|sqlmap|nikto|wget|curl)") { return 403; }
响应头与日志增强:提升客户端防护与可追溯性
安全响应头影响浏览器行为,完整日志支撑事后分析与合规审计:
- 添加关键安全头:
add_header X-Content-Type-Options "nosniff";、add_header X-Frame-Options "DENY";、add_header X-XSS-Protection "1; mode=block";、add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"; - 启用并规范日志格式:
log_format main '...'; access_log logs/access.log main;,确保记录$real_ip、请求时间、状态码、UA、Referer 等字段 - 隐藏服务标识:
server_tokens off;,并配置proxy_hide_header Server;、proxy_hide_header X-Powered-By; - 定期切割日志,避免单文件过大影响分析效率











