Nginx 安全加固配置清单:从传输层到应用层的全面防护

Nginx 作为全球占有率最高的 Web 服务器和反向代理,承载着大量核心业务流量。然而,默认配置下的 Nginx 并非为安全而生——它优先考虑的是通用性和性能。如果直接部署到生产环境,可能暴露版本信息、遭受 DDoS 攻击、被利用进行 SSRF 探测,甚至成为恶意流量的跳板。

本文整理了一份可落地的 Nginx 安全加固清单,涵盖信息隐藏、访问控制、传输安全、限流防刷等关键维度,并附上配置片段,帮助你在不牺牲性能的前提下显著提升 Web 安全基线。

一、隐藏敏感信息,减少攻击面

攻击者通常从信息收集开始。Nginx 默认会在响应头和错误页面中暴露版本号,这相当于告诉攻击者“我可能有哪些已知漏洞”。

关闭版本号显示:

http {
    server_tokens off;
}

serverlocation 块中同样生效。关闭后,Server 头只显示 nginx,不再附带具体版本。对于更彻底的隐藏,可使用 more_set_headers 模块(需编译 headers-more-nginx-module)修改或删除 Server 头。

禁用不必要的 HTTP 方法:

if ($request_method !~ ^(GET|POST|HEAD)$) {
    return 405;
}

大多数业务只需要 GET、POST 和 HEAD。禁用 PUT、DELETE、TRACE 等方法可以防止文件上传漏洞和跨站追踪攻击。

二、传输层安全:HTTPS 与 HSTS

明文 HTTP 传输意味着 Cookie、Token 和表单数据可被中间人窃取。全站 HTTPS 已是底线要求。

强制 HTTP 跳转 HTTPS:

server {
    listen 80;
    server_name example.com;
    return 301 https://$server_name$request_uri;
}

配置强加密套件与 HSTS:

server {
    listen 443 ssl http2;
    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers on;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
}

HSTS 头告诉浏览器在指定时间内强制使用 HTTPS 访问,防止 SSL 剥离攻击。includeSubDomainspreload 需谨慎启用,确保所有子域都支持 HTTPS。

三、安全响应头:构建纵深防御

除了 HSTS,还有多个响应头可以抵御 XSS、点击劫持和 MIME 嗅探攻击。

add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; frame-ancestors 'self'" always;

其中 CSP(内容安全策略) 是防御 XSS 最有力的武器之一。它通过白名单机制限制脚本、样式和资源的加载来源。即使攻击者成功注入恶意脚本,CSP 也会阻止其执行。需要注意的是,CSP 配置需要与前端资源加载方式匹配,建议先以 Content-Security-Policy-Report-Only 模式观察,确认无遗漏后再正式启用。

关于 XSS 的常见注入方式和前端防御手段,可参考《XSS 的常见方式和前端如何防御》一文,其中详细介绍了反射型、存储型和 DOM 型 XSS 的差异,以及输入过滤、输出编码和 CSP 的协同策略。

四、访问控制与限流防刷

Nginx 天然适合作为第一道防线拦截恶意流量。

限制请求速率:

http {
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;

    server {
        location /api/ {
            limit_req zone=req_limit burst=20 nodelay;
            limit_req_status 429;
        }
    }
}

以上配置限制单 IP 每秒 10 个请求,突发允许 20 个。对于登录接口等敏感路径,可设置更严格的速率。

限制并发连接数:

limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

server {
    limit_conn conn_limit 20;
    limit_conn_status 503;
}

封禁恶意 IP 与 User-Agent:

if ($http_user_agent ~* (sqlmap|nikto|nmap|masscan)) {
    return 403;
}

对于已知的扫描器、注入工具,可直接拒绝。更灵活的方式是结合 geo 模块或 map 指令维护黑名单。

五、防止 SSRF 与路径穿越

Nginx 作为反向代理时,若配置不当,可能被利用进行 SSRF 攻击。例如,使用 proxy_pass 时如果 URL 中包含用户可控变量,攻击者可能构造 http://169.254.169.254/ 访问云元数据。

安全实践:

  • 避免在 proxy_pass 中直接拼接用户输入;
  • 使用 resolver 指令并限制解析范围;
  • 对内部服务使用独立域名,并在 Nginx 层做白名单校验。

防止路径穿越:

location ~* \.\./ {
    deny all;
}

同时确保 rootalias 指令指向的目录不包含敏感文件。

六、日志与监控

安全加固离不开可观测性。确保访问日志和错误日志开启,并记录关键字段。

log_format security '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" '
                    'rt=$request_time';

access_log /var/log/nginx/access.log security;
error_log /var/log/nginx/error.log warn;

定期分析日志中的异常状态码(如大量 403、429、499)和可疑 User-Agent,可及时发现攻击行为。结合 Fail2ban 等工具,可实现自动封禁。

七、其他加固建议

  • 禁用目录列表: 确保 autoindex off;(默认即为 off,但需确认未被误开)。
  • 限制请求体大小: client_max_body_size 10m; 防止超大请求耗尽资源。
  • 设置超时时间: client_body_timeout 10s; client_header_timeout 10s; send_timeout 10s; 减少慢速攻击影响。
  • 关闭 server_name 中的通配符: 避免成为任意域名的默认主机。
  • 使用非 root 用户运行: Nginx master 进程通常以 root 启动,但 worker 进程应以 www-datanginx 用户运行。

结语

Nginx 安全加固不是一次性任务,而是持续迭代的过程。上述清单覆盖了从传输层到应用层的主要风险点,但具体配置需根据业务特点调整。例如,CSP 策略过严可能导致前端功能异常,限流阈值过低可能误伤正常用户。

建议在测试环境验证每项配置后再上线,并定期回顾日志和漏洞公告。安全的核心在于纵深防御——Nginx 只是其中一环,后端应用的输入验证、数据库的防注入措施同样不可或缺。关于 MySQL 防止 SQL 注入的几种写法,可参考相关专题文章,从参数化查询、存储过程到 ORM 框架,构建完整的数据访问安全体系。

未经允许不得转载:任鹏个人博客 » Nginx 安全加固配置清单:从传输层到应用层的全面防护

赞 (0) 打赏

评论 0

取消
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏