×

从 0 搭建 Nginx 安全网关:3 步堵住 90% 的 Web 漏洞!

hqy hqy 发表于2025-10-30 01:54:17 浏览7 评论0

抢沙发发表评论

你的网站是否曾被扫描出以下高危问题?
Host 头注入:攻击者伪造 Host 头,窃取密码重置链接
敏感文件泄露.git.envbackup.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 大核心原则

原则
配置要点
最小暴露
隐藏版本、关闭无用模块
最小权限
只允许合法域名、拒绝未知 Host
纵深防御
Nginx + 应用层双重校验
主动防护
添加安全头、阻断敏感路径

一个配置完善的 Nginx,胜过十台 WAF!

花 10 分钟加固,省下 100 小时救火。

? 觉得实用?点赞 + 转发,让更多同事远离“低级漏洞”!

? 你在生产环境还做了哪些 Nginx 安全加固?欢迎留言分享!


打赏

本文链接:https://kinber.cn/post/5779.html 转载需授权!

分享到:


推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

 您阅读本篇文章共花了: 

群贤毕至

访客