首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >一个配置完善的 Nginx,胜过十台 WAF!

一个配置完善的 Nginx,胜过十台 WAF!

作者头像
ICT系统集成阿祥
发布2025-11-30 11:21:44
发布2025-11-30 11:21:44
210
举报
文章被收录于专栏:数通数通

Nginx作为高性能的HTTP反向代理和网关服务器,是Web服务的第一道防线。通过针对性的配置优化,仅需3个核心步骤就能封堵SQL注入、XSS跨站、CSRF跨站请求伪造、文件包含、恶意爬虫等90%的常见Web漏洞,同时兼顾性能与安全性。本文将从环境准备到实战配置,手把手教你搭建安全的Nginx网关。

前提条件

  1. 已安装Nginx(推荐1.20+稳定版,本文以CentOS 7/8、Ubuntu 22.04为例),可通过yum install nginx(CentOS)或apt install nginx(Ubuntu)快速安装。
  2. 拥有Nginx配置文件的修改权限(通常在/etc/nginx/目录)。
  3. 了解基础的Nginx反向代理配置(若需代理后端服务)。

核心思路

Nginx安全网关的核心是**“过滤恶意请求+限制非法访问+加固服务本身”**,通过内置模块(如ngx_http_core_modulengx_http_rewrite_module)和少量第三方模块(可选)实现,无需复杂开发。


第一步:请求过滤——拦截恶意参数与请求(堵60%漏洞)

Web漏洞的根源大多是恶意请求参数(如SQL注入的union select、XSS的<script>)或非法请求方法(如PUT/DELETE)。通过Nginx的if指令、正则匹配和请求方法限制,直接在网关层拦截此类请求。

1.1 限制HTTP请求方法

仅允许业务必需的GETPOSTHEAD方法,拒绝PUTDELETEOPTIONS等高危方法(若业务不需要),防止通过非常规方法发起攻击。

修改Nginx主配置文件/etc/nginx/nginx.conf或站点配置文件(如/etc/nginx/conf.d/your_site.conf),在server块中添加:

代码语言:javascript
复制
# 限制HTTP请求方法
if ($request_method !~ ^(GET|POST|HEAD)$ ) {
    return 403; # 拒绝非法方法,返回403 Forbidden
}

1.2 拦截恶意请求参数

通过正则匹配,拦截包含SQL注入、XSS、文件包含等恶意特征的请求URI或参数,直接返回403。

server块中添加恶意参数过滤规则

代码语言:javascript
复制
# 定义恶意特征匹配变量
set $block_sql_injection 0;
set $block_xss 0;
set $block_file_include 0;

# 匹配SQL注入特征(可根据业务扩展)
if ($request_uri ~* "(union|select|insert|update|delete|drop|truncate|or|and|exec|xp_cmdshell)") {
    set $block_sql_injection 1;
}
if ($args ~* "(union|select|insert|update|delete|drop|truncate|or|and|exec|xp_cmdshell)") {
    set $block_sql_injection 1;
}

# 匹配XSS跨站脚本特征
if ($request_uri ~* "<script>|<iframe>|<img src=|onclick=|onload=|javascript:") {
    set $block_xss 1;
}
if ($args ~* "<script>|<iframe>|<img src=|onclick=|onload=|javascript:") {
    set $block_xss 1;
}

# 匹配文件包含/路径遍历特征
if ($request_uri ~* "\.\./|\.\./|/etc/passwd|/proc/self/environ") {
    set $block_file_include 1;
}

# 触发拦截:任意恶意特征匹配成功则返回403
if ($block_sql_injection = 1 || $block_xss = 1 || $block_file_include = 1) {
    return 403;
}

1.3 过滤异常User-Agent

拦截恶意爬虫、扫描器的异常User-Agent(如sqlmapnmapBurpSuite),防止自动化攻击。

server块中添加:

代码语言:javascript
复制
# 拦截恶意User-Agent
if ($http_user_agent ~* (sqlmap|nmap|burp|scanner|crawler|spider|bot|curl/7\.47\.0) ) {
    return 403;
}
# 拦截空User-Agent(可选,部分正常请求也可能为空,需根据业务调整)
if ($http_user_agent = "") {
    return 403;
}

验证效果

重启Nginx(systemctl restart nginx)后,尝试访问包含恶意参数的URL(如http://your_domain/?id=1 union select 1,2,3),应返回403 Forbidden。


第二步:访问控制——限制来源与请求频率(堵20%漏洞)

通过IP白名单/黑名单请求频率限制,防止暴力破解、DDoS攻击、CSRF等漏洞利用,同时限制敏感接口的访问范围。

2.1 IP访问控制

  • 白名单:仅允许指定IP/网段访问后台、管理接口等敏感路径。
  • 黑名单:拦截已知的恶意IP(可手动添加或结合第三方IP库)。
示例1:限制管理后台仅允许内网IP访问

假设管理后台路径为/admin,仅允许内网192.168.1.0/24和公网IP1.2.3.4访问:

代码语言:javascript
复制
# 敏感路径IP白名单
location /admin {
    # 允许的IP
    allow 192.168.1.0/24;
    allow 1.2.3.4;
    # 拒绝其他所有IP
    deny all;
    # 反向代理后端服务(若有)
    proxy_pass http://backend_admin;
}
示例2:拦截恶意IP黑名单

创建IP黑名单文件/etc/nginx/blacklist_ip.conf,添加恶意IP:

代码语言:javascript
复制
deny 10.0.0.1;
deny 20.0.0.0/24;

nginx.confhttp块中引入该文件,全局拦截:

代码语言:javascript
复制
http {
    include /etc/nginx/blacklist_ip.conf;
    # 其他配置...
}

2.2 请求频率限制(防暴力破解/DDoS)

使用Nginx的ngx_http_limit_req_module模块限制单IP的请求频率,防止暴力破解登录接口、批量请求等攻击。

步骤1:定义频率限制规则

nginx.confhttp块中添加:

代码语言:javascript
复制
# 定义请求频率限制的共享内存区(key为IP,大小10M,可存储约16万IP)
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
# 解释:rate=10r/s 表示单IP每秒最多10个请求,可根据业务调整(如5r/s、20r/m)
步骤2:应用频率限制到指定路径

server块或location块中添加:

代码语言:javascript
复制
# 对登录接口限制频率
location /api/login {
    # 应用频率限制,burst=20表示允许20个突发请求(超出则排队),nodelay表示不排队直接拒绝
    limit_req zone=req_limit burst=20 nodelay;
    proxy_pass http://backend_api;
}

# 全局频率限制(可选,对整个站点生效)
location / {
    limit_req zone=req_limit burst=50 nodelay;
    proxy_pass http://backend;
}

2.3 防CSRF(可选,结合后端)

Nginx层可通过验证Referer/Origin请求头,防止跨站请求伪造(CSRF),要求请求必须来自本站。

server块中添加:

代码语言:javascript
复制
# 验证Referer,仅允许本站请求(适用于POST接口)
location /api/ {
    if ($request_method = POST) {
        if ($http_referer !~* (your_domain.com|your_subdomain.com) ) {
            return 403;
        }
    }
    proxy_pass http://backend_api;
}

注意:部分合法请求(如移动端APP)可能无Referer,需结合后端Token验证。


第三步:服务加固——关闭敏感信息与硬ening配置(堵10%漏洞)

通过关闭Nginx版本暴露、配置安全响应头、限制文件上传等,减少攻击面,防止攻击者利用服务本身的漏洞或敏感信息进行攻击。

3.1 关闭Nginx版本暴露

攻击者常通过Server响应头获取Nginx版本,进而利用对应版本的漏洞。修改nginx.confhttp块:

代码语言:javascript
复制
http {
    # 关闭版本号显示
    server_tokens off;
    # 其他配置...
}

3.2 添加安全HTTP响应头

通过add_header添加安全头,防御XSS、点击劫持、MIME类型嗅探等漏洞,主流浏览器会根据这些头启用安全机制。

server块或location块中添加:

代码语言:javascript
复制
# 安全响应头配置
add_header X-Frame-Options "DENY"; # 禁止页面被嵌入iframe,防点击劫持
add_header X-XSS-Protection "1; mode=block"; # 启用XSS保护,检测到XSS则阻止页面加载
add_header X-Content-Type-Options "nosniff"; # 禁止MIME类型嗅探
add_header Content-Security-Policy "default-src 'self'; script-src 'self'"; # 内容安全策略(CSP),严格限制资源加载(需根据业务调整)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; # HSTS,强制使用HTTPS(仅在配置SSL后添加)

3.3 限制文件上传与访问

若业务包含文件上传功能,需在Nginx层限制上传文件的类型、大小,并禁止访问上传目录中的可执行文件(如.php.sh),防止文件上传漏洞利用。

示例:文件上传目录安全配置

假设上传目录为/upload,后端存储路径为/var/www/upload

代码语言:javascript
复制
location /upload {
    # 限制上传文件大小(结合后端)
    client_max_body_size 10M;
    # 禁止访问可执行文件
    location ~* \.(php|sh|py|pl|jsp|asp)$ {
        deny all;
    }
    # 仅允许访问图片、文档等合法类型
    location ~* \.(jpg|jpeg|png|gif|pdf|doc|docx)$ {
        root /var/www;
        expires 7d;
    }
}

3.4 禁止访问敏感文件

拦截对/etc/passwd.htaccessconfig.php等敏感文件的访问,防止配置泄露。

server块中添加:

代码语言:javascript
复制
# 禁止访问敏感文件
location ~* (\.htaccess|\.htpasswd|config\.php|/etc/passwd|/proc/self/environ) {
    deny all;
}
# 禁止访问隐藏文件(以.开头)
location ~ /\. {
    deny all;
}

3.5 配置SSL/TLS(强制HTTPS)

若未配置HTTPS,所有请求均为明文传输,易被窃听、篡改。需配置SSL证书(可通过Let’s Encrypt免费获取),并禁用弱加密算法。

示例SSL配置
代码语言:javascript
复制
server {
    listen 80;
    server_name your_domain.com;
    # 强制跳转到HTTPS
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name your_domain.com;

    # SSL证书路径
    ssl_certificate /etc/nginx/ssl/your_domain.crt;
    ssl_certificate_key /etc/nginx/ssl/your_domain.key;

    # 禁用弱SSL/TLS协议,仅启用TLS 1.2+
    ssl_protocols TLSv1.2 TLSv1.3;
    # 强加密算法
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    # 会话缓存
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # 其他安全配置...
}

可选增强:集成第三方模块

若需更高级的安全能力,可编译安装Nginx第三方模块:

  1. ngx_http_modsecurity_module:集成ModSecurity(Web应用防火墙WAF),提供更细粒度的规则防护(如OWASP Top 10)。
  2. ngx_http_geoip_module:结合GeoIP库,按国家/地区拦截访问。
  3. ngx_http_secure_link_module:生成带签名的安全链接,防止资源盗链。

最终验证与维护

  1. 配置检查:执行nginx -t验证配置文件是否有语法错误。
  2. 日志监控:查看Nginx访问日志(/var/log/nginx/access.log)和错误日志(/var/log/nginx/error.log),分析拦截的恶意请求。
  3. 规则更新:定期更新恶意特征、IP黑名单、User-Agent规则,适配新的攻击手段。
  4. 漏洞扫描:使用工具(如Nessus、AWVS)扫描站点,验证防护效果。

总结

通过请求过滤、访问控制、服务加固这3个核心步骤,Nginx安全网关可封堵90%的常见Web漏洞,成为Web服务的坚固防线。需注意的是,Nginx防护是第一道防线,后端服务仍需做好输入验证、参数过滤、权限控制等安全措施,形成“网关+后端”的双层防护体系。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ICT系统集成阿祥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前提条件
  • 核心思路
  • 第一步:请求过滤——拦截恶意参数与请求(堵60%漏洞)
    • 1.1 限制HTTP请求方法
    • 1.2 拦截恶意请求参数
    • 1.3 过滤异常User-Agent
    • 验证效果
  • 第二步:访问控制——限制来源与请求频率(堵20%漏洞)
    • 2.1 IP访问控制
      • 示例1:限制管理后台仅允许内网IP访问
      • 示例2:拦截恶意IP黑名单
    • 2.2 请求频率限制(防暴力破解/DDoS)
      • 步骤1:定义频率限制规则
      • 步骤2:应用频率限制到指定路径
    • 2.3 防CSRF(可选,结合后端)
  • 第三步:服务加固——关闭敏感信息与硬ening配置(堵10%漏洞)
    • 3.1 关闭Nginx版本暴露
    • 3.2 添加安全HTTP响应头
    • 3.3 限制文件上传与访问
      • 示例:文件上传目录安全配置
    • 3.4 禁止访问敏感文件
    • 3.5 配置SSL/TLS(强制HTTPS)
      • 示例SSL配置
  • 可选增强:集成第三方模块
  • 最终验证与维护
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档