最近不少开发/运维同学反馈:项目上线后被安全扫描出高危漏洞——Druid监控页面未做任何校验,直接对外暴露!

可能有同学觉得“一个监控页面而已,能有什么风险?”

大错特错!未防护的Druid页面,相当于给黑客递上了服务器“说明书”:数据库连接信息、执行过的SQL(含手机号、密码等敏感参数)、JVM内存占用、服务器资源使用情况全被看得一清二楚,后续很可能引发数据泄露、服务器被攻击等严重问题。

今天就给大家分享一套 基于Nginx的Druid监控页面加固方案,涵盖“彻底关闭”“权限管控”两种核心场景,新手也能直接复制配置使用,建议收藏转发备用!

一、先搞懂:为什么Druid暴露是高危漏洞?

Druid是Java项目常用的数据源连接池,自带的监控页面(默认路径 /druid/* 或 /druid/index.html),初衷是方便开发者查看应用运行状态,但如果直接对外暴露且无校验,会泄露3类致命信息:

  • 数据库核心信息:连接地址、用户名、连接池大小,黑客可直接尝试破解数据库;

  • 业务敏感数据:执行过的全量SQL语句,可能包含用户手机号、身份证、支付密码等;

  • 服务器/应用状态:JVM内存使用、CPU负载、接口调用链路,为黑客针对性攻击提供依据。

更可怕的是,很多项目上线时会忽略这个页面,导致它长期“裸奔”,成为安全扫描的高频漏洞点。

二、Nginx核心加固方案(按需选择)

Nginx作为前端反向代理,是拦截外部请求的“第一道防线”。我们可以通过Nginx配置,直接对Druid路径进行管控,以下是两种最实用的方案:

方案1:彻底关闭(推荐!无需监控场景)

如果生产环境不需要查看Druid监控,最安全的方式是直接拦截所有访问Druid路径的请求,返回403(拒绝访问)或404(伪装不存在)。

核心配置(直接复制到你的Nginx server块中):

server {
    listen 80; # 你的端口,HTTPS则改为443
    server_name your-domain.com; # 替换为你的域名/服务器IP

    # 关键:拦截所有druid相关路径
    location ~* druid {
        return 403; # 拒绝访问,也可改为return 404; 伪装页面不存在
    }

    # 你的原有业务配置(转发到后端服务)
    location / {
        proxy_pass http://your-backend-server; # 替换为你的后端服务地址(如127.0.0.1:8080)
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

配置说明:

  • location ~* druid:通过正则匹配所有链接中包括“druid”的请求,覆盖所有Druid相关页面;

  • 返回403还是404?403明确告知“禁止访问”,404让黑客误以为页面不存在,可根据需求选择;

  • 配置后生效:执行 nginx -t 校验配置,无错误后执行 nginx -s reload 重启Nginx。

方案2:保留监控+权限管控(需内部查看场景)

如果运维/开发需要查看监控,不能直接关闭,可通过“IP白名单”或“账号密码认证”限制访问(优先选IP白名单,更安全)。

方式2.1:IP白名单(仅允许内部IP访问)

只放行公司内网IP或运维人员的固定IP,其他外部IP一律拒绝,适合内部网络环境稳定的场景。

server {
    listen 80;
    server_name your-domain.com;

    location ~* druid {
        # 允许访问的内部IP/网段(替换为你的实际IP,多个用空格分隔)
        allow 192.168.1.100; # 运维人员固定IP
        allow 10.0.0.0/8;    # 公司内网网段(示例)
        deny all; # 拒绝所有其他IP

        # 转发到后端Druid页面(保留原有代理配置)
        proxy_pass http://your-backend-server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # 原有业务配置...
}
方式2.2:账号密码认证(需输入密码访问)

通过账号密码校验访问,适合需要跨网络查看监控的场景(如居家办公)。步骤分两步:生成密码文件 + 配置Nginx。

第一步:生成密码文件(需安装htpasswd工具)

# CentOS/RHEL系统安装
yum install httpd-tools -y

# Ubuntu/Debian系统安装
apt install apache2-utils -y

# 生成密码文件(创建用户admin,按提示输入密码)
# 注意:-c参数是创建新文件,若文件已存在,去掉-c避免覆盖
htpasswd -c /etc/nginx/conf.d/druid_passwd admin

第二步:配置Nginx认证

server {
    listen 80;
    server_name your-domain.com;

    location ~* druid {
        # 密码认证配置
        auth_basic "Druid监控页面认证"; # 弹出的认证提示语
        auth_basic_user_file /etc/nginx/conf.d/druid_passwd; # 刚才生成的密码文件路径

        # 转发到后端
        proxy_pass http://your-backend-server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # 原有业务配置...
}

配置生效后,访问/druid会弹出账号密码输入框,只有输入正确才能进入。

三、额外加固:应用层双重保障(关键!)

Nginx是“外层防护”,建议同时修改后端应用配置,实现双重加固,避免因Nginx配置失误导致漏洞:

  1. 生产环境直接关闭Druid监控(Spring Boot项目):

# application-prod.yml(生产环境配置文件)
spring:
  datasource:
    druid:
      stat-view-servlet:
        enabled: false # 关闭监控页面
  1. 若必须开启,在应用层也配置IP白名单:

spring:
  datasource:
    druid:
      stat-view-servlet:
        enabled: true
        allow: 192.168.1.0/24 # 仅允许内网网段访问
        deny: 0.0.0.0/0 # 拒绝其他所有IP
  1. 检查其他暴露页面:除了Druid,还要排查/swagger/*、/actuator/*等监控/文档页面,统一做权限管控。

四、总结:3个核心注意点

  1. 优先彻底关闭:生产环境能不用Druid监控就不用,直接关闭是最安全的方案;

  2. 权限最小化:若必须保留,优先用IP白名单,其次用账号密码,绝对不能对外裸奔;

  3. 双重防护:Nginx外层拦截 + 应用层配置,避免单一防护失效。

最后提醒:配置完成后,一定要用外部IP测试一下——访问你的域名/druid,确认无法直接进入(或需要认证),才算加固成功!

如果觉得这篇指南有用,欢迎转发给身边的开发/运维同学,避免因小漏洞引发大风险~

你还遇到过哪些项目上线前的安全坑?评论区分享一下!

省钱小妙招

独家福利来啦!美团、饿了么、滴滴打车、菜鸟裹裹、电影票红包大放送!每天都有哦!

快来瞅瞅,动动手指就能省下一笔!别错过,赶紧按照文中操作领取你的专属红包吧!

如果你还有其他想要的红包类型,记得留言告诉我们哦,我们会尽力满足大家的需求!

图片

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐