nginx安全笔记

基础安全防护(必做)

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

核心目标:避免暴露Nginx版本号、服务器标识、敏感文件等信息,防止攻击者针对性利用漏洞。

  • 隐藏Nginx版本号:默认情况下,Nginx会在错误页面和HTTP响应头中暴露版本号(如Server: nginx/1.24.0),需在主配置文件(/etc/nginx/nginx.conf 或 /usr/local/nginx/conf/nginx.conf)的http块中添加指令,修改后需验证配置并重新加载。 配置示例: http { server_tokens off; # 关闭版本号显示,移除响应头中的版本信息 # 其他原有配置... } 生效命令:nginx -t (检查配置语法)、nginx -s reload (重新加载配置)

  • 自定义Server响应头(可选):若需进一步隐藏服务器标识,可安装headers-more-nginx-module模块,自定义Server头,避免暴露Nginx身份。 配置示例:more_set_headers 'Server: Custom-Server';

  • 禁止敏感文件/目录访问:拦截.git(项目版本信息)、.htaccess、.htpasswd、config(配置文件)、backup(备份文件)等敏感资源,防止信息泄露,在站点server块中添加规则。 配置示例: server { # 禁止访问.git目录(正则匹配,忽略大小写) location ~ /\.git { deny all; } # 禁止访问.ht开头的隐藏文件 location ~ /\.ht { deny all; } # 禁止访问自定义敏感目录 location ~ /(config|backup)/ { deny all; } # 禁止访问备份、配置、日志等敏感文件 location ~* \.(bak|conf|sql|log|env)$ { deny all; return 404; } }

  • 禁用目录遍历:默认autoindex已关闭,显式配置确保禁止Nginx自动列出目录内容,避免敏感文件路径泄露。 配置示例:autoindex off; (添加在http、server或location块中)

  • 自定义错误页面:默认错误页面(404、500等)会暴露服务器信息,配置自定义页面可隐藏敏感信息,同时提升用户体验,需使用internal指令禁止直接访问错误页面。 配置示例: server { error_page 404 /custom_404.html; error_page 500 502 503 504 /custom_50x.html; # 配置404错误页面路径,internal禁止直接访问 location = /custom_404.html { root /usr/share/nginx/html; internal; } }

1.2 权限管控,遵循最小权限原则

核心目标:避免高权限运行Nginx,防止攻击者通过漏洞获取服务器最高权限,同时限制文件/目录访问权限,防止篡改、泄露。

  • 非root用户运行Nginx:默认Nginx以root用户启动,需创建专用低权限用户(如nginx),修改配置指定用户运行。 配置示例: user nginx nginx; # 添加在主配置文件顶部,指定用户和用户组 注意:需确保网站根目录、日志目录等对该用户有读写权限。

  • 文件/目录权限规范:严格控制权限,避免过度开放,通用规则如下: - 文件权限:644(所有者读写,组和其他用户仅读取) - 目录权限:755(所有者读写执行,组和其他用户读执行) - 禁止Nginx用户拥有文件写入权限(除上传目录等特殊场景)

  • 禁用非必要模块:编译Nginx时移除autoindex、ssi等非必要模块,降低漏洞风险,如编译时添加--without-http_autoindex_module参数。

二、核心安全加固(进阶)

2.1 加密传输,防止数据窃听篡改

核心目标:启用HTTPS,禁用弱协议和加密套件,确保数据传输过程中不被窃听、篡改,是企业级服务的必备配置。

  • 获取SSL证书:可选择付费证书(DigiCert、Comodo等)或免费证书(Let's Encrypt,有效期3个月,支持自动续期),适合个人和中小企业。

  • 强制HTTPS跳转:将所有HTTP请求301永久重定向到HTTPS,避免明文传输。 配置示例: # HTTP站点配置,仅用于跳转 server { listen 80; server_name yourdomain.com www.yourdomain.com; return 301 https://hostrequest_uri; # 永久重定向到HTTPS }

  • HTTPS核心配置:配置证书路径、启用安全协议和加密套件,优化SSL性能。 配置示例: server { listen 443 ssl http2; # 启用HTTP/2,提升传输效率 server_name yourdomain.com www.yourdomain.com; # 证书文件路径(需替换为实际路径) ssl_certificate /etc/nginx/ssl/yourdomain.crt; ssl_certificate_key /etc/nginx/ssl/yourdomain.key; ssl_trusted_certificate /etc/nginx/ssl/intermediate.crt; # 中间证书 # 禁用弱协议(SSLv3、TLS1.0/1.1存在漏洞) ssl_protocols TLSv1.2 TLSv1.3; # 优先使用服务器端加密套件,启用强加密算法 ssl_prefer_server_ciphers on; ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; # SSL会话缓存,提升性能 ssl_session_timeout 1d; ssl_session_cache shared:SSL:10m; # 启用HSTS,强制浏览器仅通过HTTPS访问 add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; }

2.2 访问控制,限制非法访问

核心目标:通过IP黑白名单、身份验证、请求限制等方式,防止敏感接口被恶意扫描、暴力破解,控制访问范围。

  • IP黑白名单配置:针对管理后台、敏感接口等关键路径,仅允许指定IP/网段访问,拒绝其他所有IP。 配置示例(管理后台IP白名单): location /admin { allow 192.168.1.0/24; # 允许内网网段 allow 1.2.3.4; # 允许指定公网IP deny all; # 拒绝其他所有IP }

  • Basic Auth身份验证:对敏感路径(如管理后台、私人接口)启用基础认证,需使用htpasswd工具生成用户密码文件。 操作步骤: 1. 安装htpasswd:yum install httpd-tools(CentOS)或 apt install apache2-utils(Ubuntu) 2. 生成密码文件:htpasswd -c /etc/nginx/.htpasswd admin(admin为用户名,会提示输入密码) 3. 配置Nginx: location /private { auth_basic "Admin Area"; # 认证提示信息 auth_basic_user_file /etc/nginx/.htpasswd; # 密码文件路径 }

  • 请求频率与并发连接限制:抵御CC攻击、DDoS攻击,限制单IP请求速率和并发连接数,避免服务器资源耗尽。 配置示例: http { # 定义请求速率限制(单IP每秒最多5个请求,缓存区10M) limit_req_zone binary_remote_addr zone=req_per_ip:10m rate=5r/s; # 定义并发连接限制(单IP最多20个并发连接) limit_conn_zone binary_remote_addr zone=conn_per_ip:10m; server { location / { limit_req zone=req_per_ip burst=10 nodelay; # burst允许突发流量,nodelay不延迟丢弃 limit_conn conn_per_ip 20; } } }

  • 超时配置优化:缩短空闲连接超时时间,释放服务器资源,防止慢速攻击。 配置示例(添加在http块中): client_body_timeout 10s; # 读取请求体超时 client_header_timeout 10s; # 读取请求头超时 send_timeout 10s; # 发送响应超时 keepalive_timeout 65s; # 长连接超时时间

2.3 反向代理安全(若使用反向代理)

核心目标:隐藏后端服务信息,防止后端服务被直接攻击,优化代理安全配置。

  • 隐藏后端服务响应头:代理过程中,隐藏后端服务的X-Powered-By、Server等敏感头信息。 配置示例: location /proxy { proxy_pass http://backend_server; proxy_hide_header X-Powered-By; # 隐藏后端语言标识 proxy_hide_header Server; # 隐藏后端服务器标识 }

  • 缓存安全配置:防止缓存中毒,合理设置缓存规则,动态内容不缓存。 配置示例: proxy_cache_key "schemerequest_methodhostrequest_uri"; # 自定义缓存键 proxy_cache_valid 200 302 10m; # 200、302状态码缓存10分钟 proxy_no_cache $cookie_sessionid; # 携带sessionid的动态内容不缓存

三、常见攻击防御(重点)

3.1 SQL注入与XSS跨站脚本攻击防御

核心目标:拦截包含恶意参数的请求,防止恶意脚本注入、数据库 被攻击,在server块中添加过滤规则。

  • 恶意参数过滤 :通过正则匹配,拦截SQL注入、XSS相关的恶意特征。 配置示例: server { set block 0; # SQL注入特征拦截(可根据业务扩展) if (query_string ~* "union.*select|eval|base64_decode|phpinfo|insert|delete|drop") { set block 1; } # XSS跨站脚本特征拦截 if (request_uri ~* " 启用安全响应头:通过HTTP响应头增强浏览器安全机制,防止XSS和点击劫持。 配置示例(添加在server或location块中): # 防止点击劫持(禁止页面被嵌入iframe) add_header X-Frame-Options "SAMEORIGIN" always; # 限制资源加载来源,防御XSS(可根据业务调整) add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'" always; # 禁止浏览器自动解析未声明的MIME类型,防止XSS add_header X-Content-Type-Options "nosniff" always;

  • 拦截恶意User-Agent:匹配恶意爬虫、扫描器的User-Agent特征,直接返回403。 配置示例: if (http_user_agent \~\* (sqlmap\|nmap\|burp\|scanner\|crawler\|spider\|bot)) { return 403; } # 可选:拦截空User-Agent(需根据业务调整,部分正常请求可能为空) if (http_user_agent = "") { return 403; }

  • 限制HTTP请求方法:仅允许业务必需的GET、POST、HEAD方法,拒绝PUT、DELETE、OPTIONS等高危方法(若业务不需要)。 配置示例: if (request_method !\~ \^(GET\|POST\|HEAD)) { return 405; # 方法不允许 }

3.3 防盗链配置

核心目标:防止网站静态资源(图片、视频、CSS、JS)被其他网站盗用,节省服务器带宽,在location块中配置。

  • 配置示例: location ~* \.(jpg|png|gif|mp4|css|js) { # 允许自身域名及可信域名访问(none允许直接访问,blocked允许不带referer的请求) valid_referers none blocked \*.yourdomain.com yourdomain.com; # 非法referer,返回403 if (invalid_referer) { return 403; } }

3.4 动态IP封禁(Fail2Ban集成)

核心目标:自动封禁频繁发起攻击的IP,无需手动操作,适用于暴力破解、高频恶意请求场景。

  • 配置步骤: 1. 安装Fail2Ban:yum install fail2ban(CentOS)或 apt install fail2ban(Ubuntu) 2. 创建Nginx相关配置文件:/etc/fail2ban/jail.d/nginx.conf 3. 配置示例: [nginx-bad-request] enabled = true filter = nginx-bad-request action = iptables(name=nginx, port=http, protocol=tcp) logpath = /var/log/nginx/security.log # 监控的Nginx安全日志路径 maxretry = 5 # 最大尝试次数 bantime = 3600 # 封禁时间(秒) 4. 重启Fail2Ban:systemctl restart fail2ban

四、日志监控与应急响应

4.1 日志配置优化

核心目标:规范日志记录,分离安全日志,便于后续审计、异常排查和攻击溯源,避免日志包含敏感信息。

  • 安全日志分离:自定义日志格式,记录攻击相关的关键信息(IP、User-Agent、请求、状态码),单独存储。 配置示例: http { # 自定义安全日志格式 log_format security 'remote_addr - http_user_agent - (time_local) "request" $status'; # 安全日志存储路径 access_log /var/log/nginx/security.log security; # 普通访问日志(可选,按需配置) access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log warn; # 错误日志,记录异常信息 }

  • 日志轮换与压缩:使用logrotate工具定期归档、压缩日志,避免日志文件过大,占用磁盘空间。 配置示例(/etc/logrotate.d/nginx): /var/log/nginx/*.log { daily # 每日轮换 rotate 7 # 保留7天日志 compress # 压缩归档日志 missingok # 日志不存在时不报错 notifempty # 空日志不轮换 postrotate systemctl reload nginx # 轮换后重新加载Nginx endscript }

4.2 实时监控

核心目标:及时发现异常访问行为,快速响应攻击,可结合工具实现自动化监控。

  • 工具推荐: - Prometheus + Grafana:通过nginx-module-vts模块监控Nginx流量、连接数、请求状态等关键指标,可视化展示。 - ELK/Splunk:集中化分析日志,实现异常行为告警(如高频403、500状态码)。 - 自定义脚本:编写Shell脚本,定期检测日志中的异常模式(如高频恶意请求),触发邮件或短信 告警。

4.3 应急响应流程

核心目标:攻击发生后,快速止损、排查原因、恢复服务,降低损失,关键步骤如下:

  1. 快速止损:封禁攻击IP(通过iptables或Fail2Ban),暂停受攻击的接口或服务,若有WAF,启用紧急防护规则。

  2. 排查原因:查看Nginx日志(security.log、error.log),定位攻击类型(SQL注入、XSS、DDoS等)、攻击IP和请求特征。

  3. 修复漏洞:根据攻击类型,补充防护配置(如添加恶意参数过滤、调整权限),升级Nginx版本修复已知漏洞。

  4. 恢复服务:验证防护配置生效后,恢复服务,持续监控日志,防止二次攻击。

  5. 复盘优化:记录攻击过程、防护措施和效果,优化安全配置,完善防护体系。

五、日常维护与注意事项

  • 定期更新:定期升级Nginx到最新稳定版本,修补官方发布的安全漏洞,同时更新依赖模块(如OpenSSL)。

  • 配置备份:定期备份Nginx主配置文件、站点配置文件和证书文件,防止配置丢失或被篡改,建议每日自动备份。

  • 定期巡检:检查配置文件语法(nginx -t)、日志异常、权限设置,排查潜在安全隐患,建议每周巡检一次。

  • 最小化配置:删除Nginx默认的测试页面、无用的server块和配置,关闭非必要功能,减少攻击面。

  • 密码管理:若使用Basic Auth,定期更换密码,密码需复杂度足够(包含大小写、数字、特殊字符),避免弱密码。

  • 多层防护:结合防火墙(iptables/ufw)限制端口开放,部署WAF(如ModSecurity)拦截Web攻击,构建网络层、应用层、日志层的多层防护体系。

六、常用安全命令(备查)

  • 检查Nginx配置语法:nginx -t

  • 重新加载Nginx配置:nginx -s reload

  • 重启Nginx服务:systemctl restart nginx

  • 查看Nginx版本:nginx -v(简单版本)、nginx -V(详细版本,包含模块)

  • 查看Nginx运行状态:systemctl status nginx

  • 封禁IP(iptables):iptables -A INPUT -s 攻击IP -j DROP

  • 解除IP封禁(iptables):iptables -D INPUT -s 攻击IP -j DROP

  • 查看Nginx访问日志(实时):tail -f /var/log/nginx/access.log

  • 生成Basic Auth密码文件:htpasswd -c /etc/nginx/.htpasswd 用户名

相关推荐
J超会运2 小时前
OpenEuler系统Nginx性能优化全攻略
运维·nginx·性能优化
Sombra_Olivia2 小时前
Vulhub 中的 adminer CVE-2021-21311
安全·web安全·网络安全·渗透测试·vulhub
不只会拍照的程序猿2 小时前
《嵌入式AI筑基笔记02:Python数据类型02,从C的“硬核”到Python的“包容”》
开发语言·笔记·python
早睡早起好好code2 小时前
Qwen2.5-VL研究_待完善...
图像处理·人工智能·笔记·深度学习·学习
_muffinman2 小时前
LED点阵8*8驱动开发笔记(Ai8051U单片机)
驱动开发·笔记·单片机
Wyawsl3 小时前
Nginx性能优化与监控笔记
笔记·nginx·性能优化
xiaokangzhe3 小时前
nginx安全笔记
笔记·nginx·安全
小璐资源网3 小时前
《Nginx安全配置:隐藏版本信息与敏感头》
运维·nginx·安全
-Springer-3 小时前
STM32 学习 —— 个人学习笔记9-1(USART串口协议 & 串口发送及接收数据)
笔记·stm32·学习