Nginx安全加固:隐藏、限制、加密、升级,一篇足矣!

2026-07-29 08:42:55 RAIZ

 

Nginx作为当前互联网基础设施中应用最广泛的Web服务器和反向代理之一,其安全性直接关系到业务的稳定运行。默认安装的Nginx配置以满足基本功能为主,在安全层面存在较多可优化空间。

一、基础安全配置

1. 隐藏版本信息

默认情况下,Nginx会在HTTP响应头的Server字段中返回完整的版本号,如“Server: nginx/1.24.0”。攻击者可以利用这一信息快速定位特定版本的已知漏洞发起针对性攻击。关闭版本显示是成本最低、效果最直接的安全措施。

/etc/nginx/nginx.conf的http块中添加:

http {
    server_tokens off;
}

配置完成后,响应头中的Server字段仅显示“nginx”,不再包含版本号。该指令同样可以在server或location块中单独设置。修改后务必执行nginx -t检查语法,确认无误后执行nginx -s reload生效。

2. 限制请求体大小

恶意用户可能通过发送超大请求体来耗尽服务器内存或磁盘资源,造成拒绝服务。Nginx默认的client_max_body_size为1MB,对于需要处理文件上传的业务而言显然不够,但对于不需要大体积请求的场景,保留默认值即可起到防护作用。

http {
    client_max_body_size 10M;
}

该指令可根据实际业务需求在http、server或location块中分别设置。设置为0表示不限制,生产环境中不建议这样做。

3. 限制HTTP请求方法

业务系统中真正需要用到的HTTP方法通常只有GET、POST和HEAD。PUT、DELETE、OPTIONS等方法如果未被业务使用,应当直接拒绝,防止攻击者利用非常规方法发起攻击。

在server块中添加:

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

也可以返回444让Nginx直接关闭连接而不返回任何响应。需要特别注意的是,如果业务使用了RESTful API设计,PUT和DELETE是必需的,此时不应一刀切地禁用。

二、访问控制与攻击防护

4. 限制敏感目录和文件访问

代码仓库目录(如.git)、配置文件(如.htaccess)、备份文件等一旦被公开访问,可能导致源代码泄露或敏感信息暴露。通过location正则匹配可以精准拦截:

location ~ /\.git {
    deny all;
}
location ~ /\.ht {
    deny all;
}
location ~* \.(bak|config|sql|fla|psd|ini|log|sh|inc|swp|dist)$ {
    deny all;
}

上述配置中,~*表示不区分大小写匹配,能够覆盖更多变种写法。

5. 配置IP访问控制

对于管理后台、监控接口等敏感路径,应限制仅允许特定IP或网段访问:

location /admin/ {
    allow 192.168.1.0/24;
    allow 10.0.0.1;
    deny all;
}

allow和deny指令按顺序执行,先匹配到的规则优先生效。

6. 启用请求限流

限流是防范DDoS攻击和暴力破解的有效手段。Nginx的限流基于漏桶算法实现:请求以不同速率到达,以固定速率离开。

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
    server {
        location /login/ {
            limit_req zone=one burst=20 nodelay;
        }
    }
}

$binary_remote_addr作为key可以节省内存空间。rate=10r/s表示每秒允许10个请求;burst=20允许短时突发20个请求排队;nodelay表示突发请求不延迟处理,超出部分直接返回503。限流参数的设置需要结合业务实际QPS进行调整,过严会影响正常用户体验。

7. 限制并发连接数

与限流 complementary,限制单个IP的并发连接数可以防止慢连接耗尽worker进程资源:

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;
    server {
        limit_conn addr 10;
    }
}

每个IP地址最多同时维持10个连接。该值需根据业务特性合理设定。

三、SSL/TLS加密配置

8. 启用HTTPS并禁用不安全协议

传输层加密是安全的基础。现代TLS最佳实践要求仅启用TLS 1.2和TLS 1.3,彻底禁用SSLv2、SSLv3、TLS 1.0和TLS 1.1:

server {
    listen 443 ssl http2;
    server_name example.com;
    
    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:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
}

加密套件优先选择支持前向保密(PFS)的ECDHE套件。ssl_prefer_server_ciphers on确保服务端优先选择强加密套件。

9. 开启HSTS与OCSP Stapling

HSTS(HTTP Strict Transport Security)强制浏览器仅通过HTTPS访问站点,从根本上防止SSL剥离攻击:

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

OCSP Stapling可以提升SSL握手性能并增强安全性:

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/ssl/ca-certificates.crt;

10. 强制HTTP跳转HTTPS

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

四、安全HTTP响应头

在server块中添加以下响应头,可以在浏览器层面防范多种攻击:

add_header X-Frame-Options "SAMEORIGIN" always;        # 防止点击劫持
add_header X-Content-Type-Options "nosniff" always;    # 防止MIME类型嗅探
add_header X-XSS-Protection "1; mode=block" always;    # 启用浏览器XSS过滤器
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';" always;

CSP(内容安全策略)的配置需要根据业务实际情况逐步收紧,过严可能导致页面功能异常。

五、系统层面加固

11. 使用专用用户运行Nginx

Nginx默认以www-data或nobody用户运行。应确保该用户仅拥有运行Nginx所需的最小权限,切勿以root用户运行。检查/etc/nginx/nginx.conf中的user指令:

user www-data;

12. 配置文件权限

Nginx主配置文件应设置为仅允许所有者读写,组用户可读:

chmod 640 /etc/nginx/nginx.conf
chown root:www-data /etc/nginx/nginx.conf

13. 日志监控

定期检查Nginx访问日志和错误日志,可以及时发现异常请求模式和攻击尝试。建议配置日志轮转并设置告警机制,对频繁的404、403、5xx状态码以及异常User-Agent保持关注。

六、版本管理与漏洞响应

14. 保持Nginx版本更新

及时更新是安全运维的基本要求。2026年曝光的CVE-2026-42533堆缓冲区溢出漏洞潜伏长达15年,CVSSv4评分高达9.2,攻击者仅需构造恶意HTTP请求即可触发服务崩溃甚至远程代码执行。该漏洞影响NGINX开源版0.9.6至1.31.2全线版本。

15. 升级建议

  • • 开源稳定版:升级至1.30.4及以上
  • • 开源主线版:升级至1.31.3及以上
  • • 商业NGINX Plus:升级至37.0.3.1及以上

升级完成后务必核对版本号并重启服务。对于容器和K8s环境,需同步更新镜像。

16. 无法立即升级时的临时缓解

若业务存在兼容问题暂时无法升级,可尝试简化map和rewrite正则配置,减少多层嵌套捕获逻辑,以缩小攻击面。但需注意,临时措施仅能降低风险而非彻底解决,官方补丁发布后应尽快完成升级。

Nginx安全加固是一项系统性工作,涉及配置优化、访问控制、传输加密、系统权限和版本管理多个层面。上述配置项覆盖了日常运维中最常见的安全风险点,读者可根据自身业务场景选择性落地。配置修改后务必使用nginx -t检查语法,并在测试环境验证无误后再应用于生产。安全没有终点,持续关注官方安全公告、定期审视配置有效性,才是长久之道。

注:转载文章来源于网络,版权归原作者或企业所有,侵删!

 

我要咨询