一个配置完善的 Nginx,胜过十台 WAF!
2025-11-24 09:12:08
RAIZ
前提条件
已安装Nginx(推荐1.20+稳定版,本文以CentOS 7/8、Ubuntu 22.04为例),可通过 yum install nginx(CentOS)或apt install nginx(Ubuntu)快速安装。拥有Nginx配置文件的修改权限(通常在 /etc/nginx/目录)。了解基础的Nginx反向代理配置(若需代理后端服务)。
核心思路
第一步:请求过滤——拦截恶意参数与请求(堵60%漏洞)
1.1 限制HTTP请求方法
# 限制HTTP请求方法
if ($request_method !~ ^(GET|POST|HEAD)$ ) {
return 403; # 拒绝非法方法,返回403 Forbidden
}
1.2 拦截恶意请求参数
# 定义恶意特征匹配变量
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
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;
}
验证效果
第二步:访问控制——限制来源与请求频率(堵20%漏洞)
2.1 IP访问控制
白名单
:仅允许指定IP/网段访问后台、管理接口等敏感路径。 黑名单
:拦截已知的恶意IP(可手动添加或结合第三方IP库)。
示例1:限制管理后台仅允许内网IP访问
# 敏感路径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黑名单
deny 10.0.0.1;
deny 20.0.0.0/24;
http {
include /etc/nginx/blacklist_ip.conf;
# 其他配置...
}
2.2 请求频率限制(防暴力破解/DDoS)
步骤1:定义频率限制规则
# 定义请求频率限制的共享内存区(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:应用频率限制到指定路径
# 对登录接口限制频率
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(可选,结合后端)
# 验证Referer,仅允许本站请求(适用于POST接口)
location /api/ {
if ($request_method = POST) {
if ($http_referer !~* (your_domain.com|your_subdomain.com) ) {
return 403;
}
}
proxy_pass http://backend_api;
}
第三步:服务加固——关闭敏感信息与硬ening配置(堵10%漏洞)
3.1 关闭Nginx版本暴露
http {
# 关闭版本号显示
server_tokens off;
# 其他配置...
}
3.2 添加安全HTTP响应头
# 安全响应头配置
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 限制文件上传与访问
示例:文件上传目录安全配置
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 禁止访问敏感文件
# 禁止访问敏感文件
location ~* (\.htaccess|\.htpasswd|config\.php|/etc/passwd|/proc/self/environ) {
deny all;
}
# 禁止访问隐藏文件(以.开头)
location ~ /\. {
deny all;
}
3.5 配置SSL/TLS(强制HTTPS)
示例SSL配置
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;
# 其他安全配置...
}
可选增强:集成第三方模块
ngx_http_modsecurity_module
:集成ModSecurity(Web应用防火墙WAF),提供更细粒度的规则防护(如OWASP Top 10)。 ngx_http_geoip_module
:结合GeoIP库,按国家/地区拦截访问。 ngx_http_secure_link_module
:生成带签名的安全链接,防止资源盗链。
最终验证与维护
配置检查
:执行 nginx -t验证配置文件是否有语法错误。日志监控
:查看Nginx访问日志( /var/log/nginx/access.log)和错误日志(/var/log/nginx/error.log),分析拦截的恶意请求。规则更新
:定期更新恶意特征、IP黑名单、User-Agent规则,适配新的攻击手段。 漏洞扫描
:使用工具(如Nessus、AWVS)扫描站点,验证防护效果。