你的网站是否曾被扫描出以下高危问题?
? Host 头注入:攻击者伪造 Host 头,窃取密码重置链接
? 敏感文件泄露:.git、.env、backup.zip被直接下载
? 目录遍历:访问/static/../../../etc/passwd
? Nginx 版本号暴露:让黑客精准利用已知漏洞
别再依赖“防火墙万能”了!
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 大核心原则
一个配置完善的 Nginx,胜过十台 WAF!
花 10 分钟加固,省下 100 小时救火。
? 觉得实用?点赞 + 转发,让更多同事远离“低级漏洞”!
? 你在生产环境还做了哪些 Nginx 安全加固?欢迎留言分享!
本文链接:https://www.kinber.cn/post/5779.html 转载需授权!
推荐本站淘宝优惠价购买喜欢的宝贝:

支付宝微信扫一扫,打赏作者吧~
