技能目标
核心安全配置
高级防护
前言
在当今互联网环境中,Web 服务的安全性已成为运维工作的核心重点。Nginx 作为高性能的 Web 服务器和反向代理工具,凭借轻量级、高并发、模块化的优势,广泛应用于各类 Web 架构中,但默认配置下的 Nginx 仍存在诸多安全隐患,易遭受 SQL 注入、DDoS 攻击、盗链等威胁。同时,随着数据隐私法规的完善和用户安全意识的提升,HTTPS 加密传输已成为 Web 服务的必备要求。本文将聚焦两大核心技能目标,通过实战案例详解 Nginx 核心安全配置与高级防护手段,结合 HTTPS 完整部署流程,帮助运维人员构建安全、可靠的 Nginx 服务体系。
一、技能目标概述
本次实战围绕两大核心技能目标展开,层层递进、兼顾基础与进阶,确保学习者能够学以致用:
-
核心安全配置:掌握 Nginx 基础安全加固手段,从访问控制、请求限制、信息隐藏等维度减少攻击面,防范常见的基础网络攻击,保障服务基础安全;
-
高级防护:突破基础配置局限,学习 Web 应用防火墙(WAF)集成、恶意 IP 动态封禁、安全响应头优化等进阶技巧,应对复杂网络攻击场景,提升服务抗攻击能力。
同时,将 HTTPS 部署与安全防护深度结合,实现"加密传输+安全防护"双重保障,覆盖从证书申请、配置优化到安全验证的全流程,满足生产环境实战需求。
二、核心安全配置实战(技能目标1)
核心安全配置是 Nginx 安全防护的基础,重点在于"最小化暴露攻击面",通过简单可落地的配置,抵御 80% 以上的常见基础攻击。以下配置均基于 Linux 环境(CentOS 8/ Ubuntu 20.04),所有示例可直接复制使用,需根据自身业务场景调整参数。
2.1 基础安全加固:隐藏敏感信息
攻击者常通过服务器响应头中的 Nginx 版本号、技术栈信息,针对性利用已知漏洞。因此,隐藏敏感信息是安全加固的第一步,操作简单但效果显著。
2.1.1 隐藏 Nginx 版本号
默认情况下,Nginx 响应头会显示具体版本号(如 Server: nginx/1.26.3),需通过配置隐藏:
# 编辑 Nginx 主配置文件(路径根据实际安装位置调整) vim /usr/local/nginx/conf/nginx.conf # 在 http 块中添加以下配置,关闭版本号显示 http { server_tokens off; # 隐藏响应头中的 Nginx 版本号 # 其他原有配置(如 include mime.types; 等)保持不变 } # 检查配置语法并平滑重启 Nginx nginx -t nginx -s reload
验证:使用 curl 命令查看响应头,确认版本号已隐藏(无 nginx/xxx 信息):
curl -I https://your-domain.com
若需彻底清除 Server 响应头,可安装 headers-more 模块,添加 more_clear_headers Server; 配置,进一步减少信息泄露风险。
2.1.2 禁止目录浏览
默认情况下,若 Nginx 配置中未指定默认首页,访问目录时会显示文件列表,可能泄露敏感文件(如配置文件、日志文件),需禁止目录浏览:
server { listen 80; server_name your-domain.com; root /usr/share/nginx/html; autoindex off; # 禁止目录浏览(核心配置) index index.html index.htm; # 指定默认首页 }
2.2 访问控制:限制非法访问
通过 IP 黑白名单、请求来源限制等方式,仅允许合法请求访问服务,拒绝恶意 IP 和非法调用,尤其适用于管理后台、API 接口等敏感路径。
2.2.1 IP 黑白名单配置
针对敏感路径(如 /admin 管理后台),仅允许内网 IP 或特定公网 IP 访问,拒绝其余所有请求:
location /admin { allow 192.168.10.0/24; # 允许内网网段(根据自身内网调整) allow 203.0.113.5; # 允许特定公网 IP deny all; # 拒绝其余所有 IP 访问 }
注意事项:若 Nginx 前有 CDN 或负载均衡器,需使用 real_ip 模块获取客户端真实 IP,否则会将 CDN/负载均衡器的 IP 误判为客户端 IP,导致黑白名单失效:
http { # 添加真实 IP 配置(CDN/负载均衡器的 IP 段) set_real_ip_from 10.0.0.0/8; # 替换为 CDN/负载均衡器的 IP 段 real_ip_header X-Forwarded-For; }
2.2.2 User-Agent 与 Referer 控制
拦截恶意爬虫、扫描工具(如 sqlmap、nikto),同时实现静态资源防盗链,防止他人盗用网站资源(如图片、JS、CSS):
# 拦截已知恶意 User-Agent(爬虫、扫描工具) if ($http_user_agent ~* "(sqlmap|nikto|acunetix|hydra|crawler)") { return 444; # 444 状态码表示关闭连接,不返回任何响应,避免暴露服务信息 } # 静态资源防盗链(仅允许自身域名及子域名引用) location ~* \.(jpg|png|js|css|mp4)$ { valid_referers none blocked your-domain.com *.your-domain.com; if ($invalid_referer) { return 403; # 非法引用返回 403 禁止访问 } }
提示:User-Agent 和 Referer 可被伪造,仅作为辅助防护手段,不能作为唯一安全依据。
2.3 请求限制:防范暴力攻击与资源滥用
通过限制请求速率、并发连接数,防止暴力破解(如登录接口)、DDoS 攻击、API 滥用,避免服务器资源被耗尽。
2.3.1 速率限制(Rate Limiting)
限制单个 IP 单位时间内的请求次数,适用于登录接口、API 接口等易遭受暴力攻击的路径:
http { # 定义限流区域:基于客户端 IP,占用 10MB 内存,每秒允许 2 个请求 limit_req_zone $binary_remote_addr zone=api_rate:10m rate=2r/s; server { # 针对登录接口启用限流 location /api/login { limit_req zone=api_rate burst=5 nodelay; # burst=5 允许突发 5 个请求,nodelay 不延迟处理 proxy_pass http://backend; # 转发到后端服务(根据实际调整) } } }
关键参数说明:rate=2r/s 表示平均每秒允许 2 个请求;burst=5 表示允许突发 5 个请求(超出速率的请求放入令牌桶);nodelay 表示突发请求立即处理,避免用户等待。
2.3.2 并发连接限制
限制单个 IP 的最大并发连接数,防止单个 IP 占用过多服务器连接资源:
http { # 定义并发连接限制区域:基于客户端 IP,占用 10MB 内存 limit_conn_zone $binary_remote_addr zone=perip:10m; server { # 全局限制:单个 IP 最大 3 个并发连接 limit_conn perip 3; # 针对下载路径限制:单个 IP 最大 1 个并发下载连接 location /download { limit_conn perip 1; } } }
2.4 文件与请求安全:防范路径遍历与恶意请求
限制请求体大小、禁止访问敏感文件、限制 HTTP 方法,防范路径遍历、文件上传攻击等风险。
2.4.1 限制请求体大小
防止攻击者通过上传大文件耗尽服务器磁盘和内存资源,根据业务需求设置合理大小(如 10M):
http { client_max_body_size 10m; # 限制请求体最大为 10M client_body_buffer_size 128k; # 请求体缓冲区大小 }
2.4.2 禁止访问敏感文件
禁止访问 .git、.env、.htaccess 等敏感配置文件,避免泄露数据库密码、密钥等核心信息:
location ~* \.(git|env|htaccess|log)$ { deny all; # 禁止访问所有敏感文件 return 404; # 伪装成文件不存在,减少信息泄露 }
2.4.3 限制 HTTP 方法
默认情况下,Nginx 支持 GET、POST、PUT、DELETE 等多种 HTTP 方法,仅保留业务必需的方法(如 GET、POST、HEAD),禁止不必要的方法:
if ($request_method !~ ^(GET|POST|HEAD)$) { return 405; # 不允许的 HTTP 方法返回 405 }
三、高级防护实战(技能目标2)
核心安全配置可抵御基础攻击,但面对复杂的 Web 攻击(如 SQL 注入、XSS、DDoS 变种),需借助高级防护手段,实现"主动防御+动态拦截",进一步提升 Nginx 服务的安全性。
3.1 集成 Web 应用防火墙(WAF):抵御复杂攻击
Nginx 原生不具备专业 WAF 功能,但可通过集成开源 WAF(如 ModSecurity),实现对 OWASP Top 10 常见攻击(SQL 注入、XSS、路径遍历等)的拦截。ModSecurity 是一款开源 WAF,支持自定义规则,可与 Nginx 无缝集成。
3.1.1 安装 ModSecurity 模块
# Ubuntu 环境安装 sudo apt update sudo apt install libmodsecurity3 libmodsecurity-dev nginx-mod-http-modsecurity # CentOS 环境安装(需启用 EPEL 源) sudo yum install epel-release sudo yum install mod_security mod_security-nginx
3.1.2 配置 ModSecurity 核心规则
ModSecurity 需加载核心规则集(CRS)才能实现有效防护,CRS 包含大量预定义的攻击拦截规则:
# 编辑 Nginx 主配置文件,启用 ModSecurity http { modsecurity on; modsecurity_rules_file /etc/modsecurity/modsecurity.conf; # 主配置文件 modsecurity_rules_file /usr/share/modsecurity-crs/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf; modsecurity_rules_file /usr/share/modsecurity-crs/rules/REQUEST-910-IP-REPUTATION.conf; modsecurity_rules_file /usr/share/modsecurity-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf; modsecurity_rules_file /usr/share/modsecurity-crs/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf; modsecurity_rules_file /usr/share/modsecurity-crs/rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf; modsecurity_rules_file /usr/share/modsecurity-crs/rules/REQUEST-933-APPLICATION-ATTACK-XSS.conf; modsecurity_rules_file /usr/share/modsecurity-crs/rules/REQUEST-940-APPLICATION-ATTACK-SQLI.conf; modsecurity_rules_file /usr/share/modsecurity-crs/rules/RESPONSE-950-DATA-LEAKAGES.conf; modsecurity_rules_file /usr/share/modsecurity-crs/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf; }
提示:若出现误报(如正常请求被拦截),可在 EXCLUSION-RULES 配置文件中添加自定义白名单规则,排除合法请求。
3.2 恶意 IP 动态封禁:应对持续性攻击
对于持续性的恶意攻击(如频繁扫描、暴力破解),仅靠速率限制无法彻底解决,需结合 Fail2ban 工具,动态封禁恶意 IP,实现"发现攻击-自动封禁-定时解封"的闭环防护。
3.2.1 安装 Fail2ban
# Ubuntu 环境 sudo apt install fail2ban -y # CentOS 环境 sudo yum install fail2ban -y
3.2.2 配置 Fail2ban 针对 Nginx 防护
创建 Nginx 专属配置文件,监控 Nginx 日志,识别恶意请求并封禁 IP:
# 复制默认配置文件,创建自定义配置 sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # 编辑自定义配置文件 sudo vim /etc/fail2ban/jail.local
添加以下 Nginx 防护配置:
[nginx-http-auth] enabled = true filter = nginx-http-auth logpath = /var/log/nginx/error.log maxretry = 3 # 最大失败次数(超过则封禁) bantime = 3600 # 封禁时间(单位:秒,此处为 1 小时) findtime = 600 # 检测时间窗口(单位:秒,10 分钟内超过 maxretry 次则封禁) [nginx-badbots] enabled = true filter = nginx-badbots logpath = /var/log/nginx/access.log maxretry = 1 bantime = 86400 # 封禁 24 小时
重启 Fail2ban 服务,使配置生效:
sudo systemctl restart fail2ban sudo systemctl enable fail2ban
查看封禁状态:sudo fail2ban-client status nginx-http-auth,可手动解封 IP:sudo fail2ban-client set nginx-http-auth unbanip 恶意IP。
3.3 安全响应头优化:增强浏览器端防护
通过添加安全相关的 HTTP 响应头,增强浏览器的安全防护能力,防范 XSS、点击劫持、中间人攻击等风险,符合现代 Web 安全标准。
server { listen 443 ssl; # 后续 HTTPS 配置,此处先添加安全响应头 server_name your-domain.com; # 安全响应头配置(添加到 server 块或 http 块,全局生效) add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # HSTS 强制 HTTPS 访问,有效期 1 年 add_header X-Frame-Options "SAMEORIGIN" always; # 防止点击劫持,仅允许同域名嵌入 iframe add_header X-XSS-Protection "1; mode=block" always; # 开启 XSS 防护,发现攻击立即阻断 add_header X-Content-Type-Options "nosniff" always; # 禁止浏览器猜测文件类型,防止 MIME 类型混淆攻击 add_header Content-Security-Policy "default-src 'self'; img-src 'self' data:; script-src 'self'" always; # 限制资源加载来源,防范 XSS add_header Referrer-Policy "strict-origin-when-cross-origin" always; # 控制 Referrer 信息传递,保护用户隐私 }
验证:使用 curl -I https://your-domain.com 查看响应头,确认所有安全头均已生效。
3.4 日志审计与监控:及时发现攻击行为
安全防护的核心是"早发现、早处置",通过配置 Nginx 结构化日志,结合监控工具,实时追踪请求行为,及时发现异常攻击。
3.4.1 配置 Nginx 安全日志
http { # 定义日志格式,包含客户端 IP、请求方法、状态码、User-Agent 等关键信息 log_format security '$remote_addr [$time_local] "$request_method $request_uri" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # 启用访问日志和错误日志,指定存储路径 access_log /var/log/nginx/access.log security; error_log /var/log/nginx/error.log warn; # 错误日志级别设为 warn,记录异常信息 }
3.4.2 日志监控建议
可结合 ELK 栈(Elasticsearch、Logstash、Kibana)或 Grafana 等工具,对 Nginx 日志进行实时分析和可视化监控,重点关注以下异常信息:
-
频繁出现 403、404、500 状态码的请求(可能是恶意扫描或攻击);
-
同一 IP 短时间内发送大量请求(可能是 DDoS 攻击或暴力破解);
-
请求中包含 SQL 注入、XSS 等攻击载荷(如 union select、<script> 等关键词)。
四、HTTPS 部署实战(与安全防护深度结合)
HTTPS 是 Web 服务安全的基础,通过 SSL/TLS 协议对数据传输进行加密,防止数据在传输过程中被窃取、篡改。本节结合前文安全配置,完成 HTTPS 从证书申请到配置优化的全流程部署,实现"加密+防护"双重保障。
4.1 证书申请(Let's Encrypt 免费证书)
推荐使用 Let's Encrypt 提供的免费 SSL 证书,有效期 3 个月,可通过 Certbot 工具自动申请和续期,适合个人和中小企业使用。
4.1.1 安装 Certbot 工具
# Ubuntu 环境 sudo apt update sudo apt install certbot python3-certbot-nginx -y # CentOS 环境 sudo yum install epel-release sudo yum install certbot python3-certbot-nginx -y
4.1.2 申请并配置证书
Certbot 可自动检测 Nginx 配置,申请证书并修改配置文件,启用 HTTPS:
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
执行命令后,按照提示操作:
-
输入邮箱地址(用于证书到期提醒);
-
同意 Let's Encrypt 协议;
-
选择是否开启 HTTP 强制跳转 HTTPS(推荐选择 2,开启 301 永久跳转)。
申请完成后,Certbot 会自动在 Nginx 配置文件中添加 SSL 相关配置,并设置 HTTP 到 HTTPS 的 301 重定向。
4.2 HTTPS 安全配置优化
默认的 SSL 配置仍有优化空间,需调整加密协议和加密套件,禁用不安全的 SSL 版本(如 SSLv3、TLSv1.0),提升加密安全性和性能。
server { listen 80; server_name your-domain.com www.your-domain.com; return 301 https://$host$request_uri; # HTTP 强制跳转 HTTPS(301 永久跳转,传递 SEO 权重) } server { listen 443 ssl http2; # 启用 HTTP/2,提升传输性能 server_name your-domain.com www.your-domain.com; # SSL 证书路径(Certbot 自动生成,无需修改) ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; # SSL 安全配置优化 ssl_protocols TLSv1.2 TLSv1.3; # 仅启用安全的 TLS 协议,禁用 SSLv3、TLSv1.0、TLSv1.1 ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; # 强加密套件 ssl_prefer_server_ciphers on; # 优先使用服务器配置的加密套件 ssl_session_cache shared:SSL:10m; # 启用 SSL 会话缓存,提升性能 ssl_session_timeout 10m; # 会话超时时间 # 启用 OCSP Stapling,提升证书验证效率,减少客户端等待时间 ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 114.114.114.114 valid=300s; # DNS 解析器 resolver_timeout 5s; # 证书文件权限设置(防止泄露) ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # HSTS 强制 HTTPS # 整合前文核心安全配置和高级防护配置 server_tokens off; autoindex off; client_max_body_size 10m; # 其他安全配置(如 IP 黑白名单、WAF、安全响应头等) }
4.3 证书自动续期与验证
Let's Encrypt 证书有效期为 3 个月,需设置自动续期,避免证书过期导致服务不可用:
# 添加定时任务,每天凌晨 3 点自动续期 sudo crontab -e # 添加以下内容 0 3 * * * /usr/bin/certbot renew --quiet
验证 HTTPS 配置有效性:
-
访问
https://your-domain.com,查看浏览器地址栏是否显示"小锁"图标,确认证书有效; -
使用
nmap --script ssl-enum-ciphers -p 443 your-domain.com扫描 SSL 协议和加密套件,确认仅启用 TLSv1.2、TLSv1.3; -
使用
curl -I https://your-domain.com验证安全响应头、HTTPS 跳转是否正常。
五、实战总结与注意事项
本文围绕核心安全配置、高级防护两大技能目标,结合 HTTPS 部署实战,构建了一套完整的 Nginx 安全防护体系。通过基础加固、访问控制、请求限制等核心配置,抵御常见基础攻击;通过 WAF 集成、恶意 IP 动态封禁、安全响应头优化等高级手段,应对复杂攻击场景;通过 HTTPS 加密部署,实现数据传输安全,三者结合形成"基础防护+进阶防御+加密传输"的三重保障。
5.1 关键注意事项
-
配置变更前,务必执行
nginx -t检查配置语法,避免配置错误导致服务中断; -
定期更新 Nginx 和相关模块(如 ModSecurity),修复已知漏洞,降低被攻击风险;
-
证书文件需妥善保管,权限设置为 600(仅 root 用户可读写),避免私钥泄露;
-
安全配置需结合业务场景调整,避免过度防护导致正常请求被拦截(如合理设置限流参数、添加白名单);
-
定期查看 Nginx 日志和 Fail2ban 日志,及时发现异常攻击行为,优化防护规则。
5.2 进阶提升方向
若需进一步提升 Nginx 安全等级,可探索以下方向:
-
集成第三方商业 WAF(如阿里云 WAF、腾讯云 WAF),应对更复杂的高级攻击;
-
启用 HTTP/3 协议,进一步提升传输性能和安全性;
-
实现 Nginx 集群部署,结合负载均衡,提升服务可用性和抗 DDoS 能力;
-
通过脚本实现恶意 IP 黑名单的自动更新(如对接第三方威胁情报平台)。