druid-springboot-starter默认启用监控页面,公网项目可能泄漏DB信息

1. 问题描述

druid是国内及公司内部最经常使用的数据库链接池配置管理工具;其内置监控页面,用于拦截sql及实时监控链接池/sql信息,该页面在原生的druid包中默认为禁用,但其用于适配springboot的druid-spring-boot-starter包,默认打开该监控页面(http://ip:port/druid/index.html) ,打开后存在以下风险:html

1.1 暴露DB信息

因为druid监控页面地址是固定的,容易被猜,监控页面默认没有任何安全措施,容易暴露项目信息,如:数据库域名地址、库名、表名、查询的sql及url等,若是druid有漏洞,甚至可能被攻击。git

  • 泄漏DB域名、使用用户及库名: github

  • 泄漏SQL信息: web

  • 泄漏URL信息: spring

1.2 成为非法广告的肉机

监控页面中的多个tab页含阿里云广告,且power by链接到做者我的域名,估计没续费,已被澳门赌场站点抢占,国内该类广告是违法的,以下图: sql

2. 影响范围

  • springboot项目:该问题咱们已向官方提交request官方还没有修复,因此咱们使用的任意版本druid-spring-boot-starter都有问题。
  • 非sprinboot项目:若是手工启用监控页面,且未指定登陆用户名、密码及容许访问的IP,也存在相同问题。

3. 解决办法

判断项目是否添加druid监控页面的方法:是否能打开druid监控页面(http://ip:port/druid/index.html) ,能打开,则已添加;反之,未添加。数据库

3.1 springboot项目

关闭监控页面及相关的stat、web-stat监控项,在springboot的application-${env}.yml中,建议添加或调整为以下配置:安全

spring:
  datasource:
    druid:
      filter:
        stat:
          enabled: false
        wall:
          enabled: false
        slf4j:
          enabled: false
        log4j2:
          enabled: false
        log4j:
          enabled: false
        commons-log:
          enabled: false
      stat-view-servlet:
        enabled: false # 如启用,建议:配置用户名&密码并指定容许访问的IP,确保信息[数据库地址/用户名/表结构等]不泄漏,安全无小事
        login-username: athm@dealer
        login-password: l5vTEgeUL0rQQ3CU
        allow: 127.0.0.1
      web-stat-filter:
        enabled: false
        session-stat-enable: false

特别说明: druid项目代码贡献人数众多,无统一管理,接近40%的issue无人处理,存在代码管理混乱等问题,druid-spring-boot-starter中启用监控页面的功能为一个非主要维护者提交的代码,竟被采纳,因此咱们建议对druid-spring-boot-starter的配置项尽可能保守:即便默认关闭的配置,咱们也手工指明,避免后续版本默认调整为启用。springboot

上述配置信息,详细说明:session

spring:
  datasource:
    druid:
      filter:
        stat:
          enabled: false #默认值为true,监控sql\慢sql等功能,咱们建议修改成false,若是须要打开监控页面或者将慢sql输出到日志中,则修改成true。
        wall:
          enabled: false #默认值为false,sql防火墙,支持过滤sql,如禁止使用delete *等操做。
        slf4j:
          enabled: false #指定使用slf4j日志组件,支持选择将各类操做过程输出到日志中。
        log4j2:
          enabled: false #指定使用log4j2日志组件,支持选择将各类操做过程输出到日志中。
        log4j:
          enabled: false #指定使用log4j日志组件,支持选择将各类操做过程输出到日志中。
        commons-log:
          enabled: false #指定使用commons-log日志组件,支持选择将各类操做过程输出到日志中。
      stat-view-servlet:
        enabled: false #默认值为true,即打开监控页面,但存在泄漏信息的风险,因此修改成false
        login-username: athm@dealer #配置监控页面登陆用户名,启用监控页面后才可用,建议业务方,从新定义,别使用咱们的给定值
        login-password: l5vTEgeUL0rQQ3CU #配置监控页面登陆密码,启用监控页面后才可用,建议业务方,从新定义,别使用咱们的给定值
        allow: 127.0.0.1 #配置容许访问监控页面的IP地址
      web-stat-filter:
        enabled: false #默认值为true,统计web关联的监控信息如session/url等,建议修改成false
        session-stat-enable: false #该功能模块代码不完善,特定场景下会诱发异常,非特别需求,建议修改成false

其余建议: 某些特定场景,如线上问题分析、故障复盘等,须要打开监控页面,则建议指定登陆用户名&密码及容许访问的IP,确保信息不外泄。

3.2 非springboot项目

默认不启用druid监控页面,若是如今已启用,建议删除;若有特殊需求须要打开监控页面,建议给监控页面配置用户名、密码或容许访问的IP,确保信息不外泄。
非springboot项目配置druid监控页面的方法

4. 修改后验证方法

打开监控页面(http://ip:port/druid/index.html)报404。

99. 引文

相关文章
相关标签/搜索