Nginx安全

核心原则:Nginx安全防护需遵循"最小权限、纵深防御、主动监控"三大原则,从配置优化、漏洞修复、攻击拦截、日志审计四个维度入手,降低被攻击风险,保障服务稳定运行。本笔记整理日常运维中高频用到的安全配置、常见漏洞及防御方案,兼顾实用性和可落地性。

一、基础安全配置

1. 隐藏敏感信息,减少攻击面

Nginx默认会暴露版本号、服务器标识等敏感信息,攻击者可通过这些信息针对性利用已知漏洞,需优先隐藏相关信息。

隐藏Nginx版本号:在http块中添加配置,关闭版本号显示,避免攻击者通过版本号定位漏洞(如CVE-2025-53859、CVE-2024-7347等版本相关漏洞)。 # http块中添加 ``server_tokens off;

精简HTTP响应头:移除不必要的响应头(如Server、X-Powered-By),减少后端技术栈泄露,需安装ngx_headers_more模块。 # http块中添加,移除敏感响应头 ``more_clear_headers "Server"; ``more_clear_headers "X-Powered-By"; ``# 可选:自定义Server头,进一步隐藏信息 ``more_set_headers 'Server:Custom-Server';

禁用目录遍历:禁止Nginx自动列出目录内容,防止敏感文件(如配置文件、日志)泄露,默认autoindex为off,建议显式配置确认。 # server块或location块中添加 ``autoindex off; ``# 禁止访问隐藏文件(如.git、.conf) ``location ~ /\. { `` deny all; ``}

2. 限制请求与连接,防御DoS/CC攻击

通过限制单个IP的请求频率、并发连接数,以及请求体大小,防止恶意请求耗尽服务器资源,缓解DoS、CC攻击压力。

限制请求频率:控制单个IP单位时间内的请求数,避免高频请求攻击。 # http块中定义请求频率规则 ``limit_req_zone $binary_remote_addr zone=req_per_ip:10m rate=5r/s; ``# server块或location块中应用 ``location / { `` limit_req zone=req_per_ip burst=10 nodelay; # burst允许突发请求,nodelay不延迟处理 ``}

限制并发连接数:限制单个IP和服务器的最大并发连接数,保护服务器资源。 # http块中定义连接数规则 ``limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m; ``limit_conn_zone $server_name zone=conn_per_server:10m; ``# server块中应用 ``server { `` limit_conn conn_per_ip 50; # 单个IP最多50个并发连接 `` limit_conn conn_per_server 200; # 服务器最多200个并发连接 ``}

限制请求体大小:防止大文件上传耗尽资源,同时防御恶意文件上传攻击。 # http块、server块或location块中添加(根据需求调整大小) ``client_max_body_size 10m; # 限制请求体最大为10MB ``client_body_buffer_size 128k; # 设置请求体缓冲大小

优化超时设置:缩短空闲连接超时时间,防止慢速攻击占用连接资源。 # http块中添加 ``client_body_timeout 10s; # 请求体读取超时 ``client_header_timeout 10s; # 请求头读取超时 ``keepalive_timeout 65s; # 长连接超时时间 ``send_timeout 10s; # 响应发送超时

3. 严格访问控制,保护敏感路径

通过IP黑白名单、身份认证等方式,限制对敏感路径(如管理后台)的访问,防止未授权访问。

IP黑白名单:仅允许指定IP或IP段访问敏感路径,拒绝其他所有IP。 # 针对/admin目录(管理后台)设置白名单 ``location /admin/ { `` allow 192.168.1.0/24; # 允许内网IP段 `` allow 10.0.0.1; # 允许单个IP `` deny all; # 拒绝其他所有IP ``}

基础身份认证(Basic Auth):对敏感路径添加账号密码验证,进一步提升安全性。 # 生成密码文件(需安装htpasswd工具) ``# htpasswd -c /etc/nginx/.htpasswd admin ``# 配置敏感路径认证 ``location /private/ { `` auth_basic "Admin Area"; # 认证提示信息 `` auth_basic_user_file /etc/nginx/.htpasswd; # 密码文件路径 ``}

禁止访问敏感文件:拦截对备份文件、配置文件、日志文件等敏感资源的访问。 # 禁止访问后缀为bak、conf、sql、log的文件 ``location ~* \.(bak|conf|sql|log|env)$ { `` deny all; `` return 404; ``}

4. HTTPS强化,保障传输安全

禁用不安全的SSL/TLS协议和加密套件,强制使用HTTPS传输,防止数据被窃听、篡改,防御中间人攻击。

基础SSL配置:仅支持安全的TLS版本,使用强加密套件。 server { `` listen 443 ssl; `` server_name example.com; `` `` # SSL证书路径 `` ssl_certificate /etc/nginx/ssl/example.crt; `` ssl_certificate_key /etc/nginx/ssl/example.key; `` `` # 仅支持TLS1.2、TLS1.3,禁用SSLv3、TLSv1.0、TLSv1.1 `` ssl_protocols TLSv1.2 TLSv1.3; `` # 优先使用服务器端加密套件 `` ssl_prefer_server_ciphers on; `` # 强加密套件配置 `` 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; `` `` # 启用SSL会话缓存,提升性能 `` ssl_session_cache shared:SSL:10m; `` ssl_session_timeout 1d; `` `` # 启用OCSP装订,提升HTTPS安全性和加载速度 `` ssl_stapling on; `` ssl_stapling_verify on; `` resolver 8.8.8.8 8.8.4.4 valid=300s; `` resolver_timeout 5s; ``}

强制HTTPS跳转:将所有HTTP请求重定向至HTTPS,避免明文传输。 server { `` listen 80; `` server_name example.com; `` # 永久重定向至HTTPS `` return 301 https://$host$request_uri; ``}

启用HSTS:强制浏览器仅通过HTTPS访问,防止SSL剥离攻击。 # server块中添加(HTTPS站点) ``add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;说明:max-age设置为2年(63072000秒),includeSubDomains表示所有子域名生效,preload表示提交至浏览器预加载列表。

二、常见Web攻击防御

1. 跨站脚本攻击(XSS)防御

通过配置安全响应头、过滤恶意请求,阻止XSS攻击,防止恶意脚本注入。

配置X-XSS-Protection头:启用浏览器内置XSS防护机制,检测到XSS攻击时阻止页面加载。 add_header X-XSS-Protection "1; mode=block" always;

配置Content-Security-Policy(CSP):限制页面可加载的资源来源,防止恶意脚本加载。 add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:; connect-src 'self';" always;说明:default-src 'self'表示默认仅允许加载自身域名资源,可根据实际需求调整。

过滤恶意请求参数:拦截包含XSS、SQL注入特征的请求。set $block 0; ``# 拦截常见XSS、SQL注入特征 ``if ($query_string ~* "union.*select|eval|base64_decode|script|iframe") { `` set $block 1; ``} ``if ($block = 1) { `` return 403; # 禁止访问 ``}

2. 点击劫持防御

通过X-Frame-Options头,禁止网站被嵌入到其他网站的iframe中,防止点击劫持攻击。

server块中添加 add_header X-Frame-Options "SAMEORIGIN" always;

可选值说明:

DENY:禁止任何网站嵌入当前网站。

SAMEORIGIN:仅允许当前域名下的页面嵌入。

ALLOW-FROM uri:仅允许指定uri的网站嵌入(兼容性较差)。

3. 跨站请求伪造(CSRF)防御

通过设置Cookie的SameSite属性,限制Cookie在跨站请求时的发送,防止CSRF攻击。

server块中添加,设置Cookie安全属性 add_header Set-Cookie "cookie_name=cookie_value; HttpOnly; Secure; SameSite=Strict;" always;

说明:HttpOnly防止JavaScript读取Cookie,Secure仅在HTTPS下生效,SameSite=Strict禁止跨站发送Cookie。

4. 防盗链配置

防止其他网站盗用当前网站的静态资源(图片、视频、CSS等),节省服务器带宽,同时避免恶意滥用。

针对图片、视频等静态资源配置防盗链 location ~* \.(jpg|png|gif|mp4|mp3|css|js) { # 允许的referer(自身域名、无referer) valid_referers none blocked \*.example.com example.com; # 非法referer拒绝访问 if (invalid_referer) { return 403; } }

三、Nginx漏洞修复与版本管理

1. 常见漏洞及修复方案

Nginx存在多个已知漏洞(如缓冲区溢出、内存泄露、HTTP/3相关漏洞等),需及时修复,优先通过升级版本解决。

  1. CVE-2025-53859:属于ngx_mail_smtp_module缓冲区读取溢出漏洞,风险等级为低危,影响Nginx版本范围是0.7.22 - 1.29.0,修复方案为升级至1.29.1及以上版本。

  2. CVE-2025-23419:属于SSL会话重用漏洞,风险等级为中危,影响Nginx版本范围是1.11.4 - 1.27.3,修复方案为升级至1.27.4、1.26.3及以上对应版本。

  3. CVE-2024-32760:属于HTTP/3缓冲区覆盖漏洞,风险等级为中危,影响Nginx版本范围是1.25.0 - 1.25.5、1.26.0,修复方案为升级至1.27.0、1.26.1及以上对应版本。

  4. CVE-2024-24989:属于HTTP/3空指针解引用漏洞,风险等级为高危,影响Nginx版本为1.25.3,修复方案为升级至1.25.4及以上版本。

  5. CVE-2022-41741:属于ngx_http_mp4_module内存损坏漏洞,风险等级为中危,影响Nginx版本范围是1.1.3 - 1.23.1、1.0.7 - 1.0.15,修复方案为升级至1.23.2、1.22.1及以上对应版本。

2. 版本管理最佳实践

定期检查官方安全公告(https://nginx.org/en/security_advisories.html),及时了解最新漏洞信息。

优先使用稳定版(Stable Version),避免使用测试版,降低漏洞风险。

升级前备份配置文件(nginx.conf及站点配置),避免升级失败导致服务中断。

编译安装时,禁用不必要的模块(如--without-http_autoindex_module),减少攻击面。

四、日志审计与监控

日志是排查安全问题、发现攻击行为的关键,需配置合理的日志策略,结合工具实现实时监控。

1. 日志配置优化

分离安全日志:单独记录异常访问行为,便于排查攻击。 # http块中定义安全日志格式 ``log_format security '$remote_addr - $http_user_agent - ($time_local) "$request" $status $request_time'; ``# server块中配置安全日志路径 ``access_log /var/log/nginx/security.log security;

日志轮换与压缩:使用logrotate工具定期归档、压缩日志,避免日志文件过大占用磁盘空间。 # /etc/logrotate.d/nginx 配置示例 ``/var/log/nginx/*.log { `` daily `` rotate 7 `` compress `` missingok `` notifempty `` postrotate `` systemctl reload nginx `` endscript ``}

2. 实时监控与应急响应

集成Fail2Ban:自动监控日志,封禁频繁发起异常请求(如多次403、404)的IP,缓解暴力破解、CC攻击。 # Fail2Ban配置示例(/etc/fail2ban/jail.d/nginx.conf) ``[nginx-bad-request] ``enabled = true ``filter = nginx-bad-request ``action = iptables(name=nginx, port=http, protocol=tcp) ``logpath = /var/log/nginx/security.log ``maxretry = 5 ``bantime = 3600 # 封禁1小时

监控工具推荐:使用Prometheus + Grafana + nginx-module-vts,实时监控Nginx的连接数、请求量、错误率等指标,及时发现异常。

应急响应流程:发现攻击后,立即封禁攻击IP → 查看日志定位攻击类型 → 修复漏洞/优化配置 → 恢复服务 → 复盘攻击原因,完善防护策略。

五、高级防护策略

1. 部署Web应用防火墙(WAF)

结合ModSecurity(开源WAF)或Nginx Plus内置WAF,拦截SQL注入、XSS、命令注入等常见Web攻击,实现深度防御。

ModSecurity配置示例 modsecurity on; modsecurity_rules_file /etc/nginx/modsecurity/modsecurity.conf; # 加载OWASP CRS规则集(常用的Web攻击规则) include /etc/nginx/modsecurity/crs/owasp-crs.conf;

2. 反向代理安全优化

若Nginx作为反向代理,需隐藏后端服务信息,防止攻击者通过Nginx攻击后端服务器。

隐藏后端服务的响应头 proxy_hide_header X-Powered-By; proxy_hide_header Server; # 防止缓存投毒,定义合理的缓存键 proxy_cache_key "schemerequest_methodhostrequest_uri"; proxy_cache_valid 200 302 10m; # 动态内容不缓存,避免缓存投毒 proxy_no_cache $cookie_sessionid;

3. 最小权限运行Nginx

避免使用root用户运行Nginx,创建专用的低权限用户(如nginx),降低被攻击后权限泄露的风险。

http块中配置用户 user nginx nginx; # 重启Nginx生效 systemctl restart nginx

六、总结

Nginx安全防护是一个持续优化的过程,核心是"减少暴露面、拦截恶意行为、及时修复漏洞、做好日志监控"。日常运维中,需优先完成基础安全配置,定期升级版本、审计日志,结合WAF、Fail2Ban等工具构建纵深防御体系。同时,需根据实际业务场景调整配置,避免过度防护影响服务可用性,平衡安全与性能。

相关推荐
buhuimaren_2 小时前
LAMP架构部署配置
nginx·php
xiaokangzhe2 小时前
web技术与nginx网站环境部署
运维·前端·nginx
智慧地球(AI·Earth)2 小时前
OpenClaw设置教程之安全篇
人工智能·安全·openclaw
程序员一点2 小时前
第23章:备份与灾难恢复策略
linux·运维·网络·数据库·openeuler
静候光阴2 小时前
为本地ollama设置网页搜索mcp服务器
运维·服务器
艾莉丝努力练剑2 小时前
确保多进程命名管道权限一致的方法
java·linux·运维·服务器·开发语言·网络·c++
NGC_66113 小时前
TCP三次握手
运维·服务器·网络
陈皮糖..3 小时前
Docker Compose 学习之多容器应用编排与运维实践 —— 基于 Nginx+MySQL+Redis 服务栈的部署与管理
运维·redis·学习·mysql·nginx·docker
桌面运维家3 小时前
Windows自动运维:VHD虚拟磁盘大屏监控实践
运维