Nginx 安全网关
你的网站是否曾被扫描出以下高危问题?
🔸 Host 头注入:攻击者伪造 Host 头,窃取密码重置链接
🔸 敏感文件泄露:.git、.env、backup.zip 被直接下载
🔸 目录遍历:访问 /static/../../../etc/passwd
🔸 Nginx 版本号暴露:让黑客精准利用已知漏洞
别再依赖“防火墙万能”了,3 步堵住 90% 的 Web 漏洞!
Nginx 本身就是一个强大的安全网关,只需几行配置,就能实现企业级防护。
✅ 无需额外软件
✅ 零成本加固
✅ 符合等保 2.0 要求
今天,手把手教你从 0 搭建一个安全、干净、合规的 Nginx 网关!
🛡️ 第一步:隐藏身份 —— 隐藏 Nginx 版本号
攻击者第一步就是探测你的服务版本。
暴露版本 = 送漏洞地图!
🔧 配置方法
在 nginx.conf 的 http 块中添加:
server_tokens off;
✅ 效果:原响应头:Server: nginx/1.24.0优化后:Server: nginx📌 额外建议:
如果使用了 error_page 自定义错误页,确保页面中也不包含版本信息!
🚫 第二步:封堵入口 —— 禁止敏感文件与目录访问
很多数据泄露,都是因为一个 .env 或 .git 文件被公开下载!
通用防护配置(推荐放在 http 或 server 块)
# 禁止访问隐藏文件(以 . 开头)
location ~ /\. {deny all;return 404;
}# 禁止访问特定敏感文件
location ~* \.(env|git|svn|htaccess|htpasswd|bak|log|sql|zip|tar\.gz)$ {deny all;return 403;
}# 禁止访问备份文件(如 config.php.bak)
location ~* \.bak$ {deny all;return 403;
}# 禁止目录遍历(Nginx 默认已防,但显式加固更安全)
location ~ \.\./ {deny all;return 403;
}
原理说明:~ 表示正则匹配~* 表示不区分大小写deny all 直接拒绝访问,不返回文件内容🌐 第三步:锁定身份 —— 防 Host 头攻击(关键!)
什么是 Host 头攻击?
当 Nginx 配置了宽松的 server_name(如 server_name _; 或未设置默认拒绝 server)时,攻击者可构造恶意 Host 头:
GET /password-reset HTTP/1.1
Host: attacker.com如果后端代码使用 Host 头生成重置链接(如 https://attacker.com/reset?token=xxx),攻击者就能窃取用户凭证!
安全配置方案
1. 设置默认拒绝的 server 块
在所有 server 块之前,添加一个“兜底”配置:
server {listen 80 default_server;listen 443 ssl default_server;server_name _ "";return 403;
}此配置会拒绝所有未明确匹配的域名请求。2. 明确指定合法域名
在你的业务 server 块中,只允许真实域名:
server {listen 80;server_name www.yourdomain.com yourdomain.com;# 你的业务配置...
}3. (可选)在应用层二次校验
即使 Nginx 层做了防护,后端也应校验 Host 是否在白名单内,形成纵深防御。
🛠️ 第四步:添加安全响应头(提升浏览器防护)
现代浏览器支持多种安全策略,通过响应头启用:
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https:" always;
说明:X-Frame-Options: DENY:防点击劫持X-Content-Type-Options: nosniff:防 MIME 嗅探always:确保错误页面也携带这些头🧪 验证是否生效
1. 检查版本是否隐藏
curl -I http://your-domain.com→ 确保 Server 字段不含版本号。
2. 测试敏感文件访问
curl -I http://your-domain.com/.env→ 应返回 403 或 404,不能返回 200。
3. 测试 Host 头攻击
curl -H "Host: evil.com" http://your-server-ip/→ 应返回 403,而非业务页面。
📋 完整安全配置模板(推荐收藏)
# /etc/nginx/nginx.conf 或站点配置# 隐藏版本
server_tokens off;# 默认拒绝 server(放在最前面!)
server {listen 80 default_server;listen 443 ssl default_server;server_name _ "";return 403;
}# 业务 server
server {listen 80;server_name yourdomain.com www.yourdomain.com;# 安全响应头add_header X-Content-Type-Options "nosniff" always;add_header X-Frame-Options "DENY" always;add_header X-XSS-Protection "1; mode=block" always;# 敏感文件防护(可放 http 块全局生效)location ~ /\. {deny all;return 404;}location ~* \.(env|git|bak|log|sql|zip)$ {deny all;return 403;}# 你的业务 location...location / {proxy_pass http://backend;}
}🌟 总结:安全网关 4 大核心原则
原则 | 配置要点 |
|---|---|
最小暴露 | 隐藏版本、关闭无用模块 |
最小权限 | 只允许合法域名、拒绝未知 Host |
纵深防御 | Nginx + 应用层双重校验 |
主动防护 | 添加安全头、阻断敏感路径 |
