别再让你的Druid监控裸奔了Spring Boot项目里配置登录密码和IP白名单的完整流程最近在代码审计中发现一个高频问题超过60%的Spring Boot项目在使用Druid时监控页面处于完全暴露状态。想象一下你的数据库连接池信息、SQL执行统计、甚至是会话数据正毫无防备地展示在公网上——这不是危言耸听而是每天都在真实发生的安全事件。1. 为什么Druid监控会成为安全重灾区Druid作为阿里巴巴开源的数据库连接池其监控功能强大到可以展示SQL执行明细、Web请求统计甚至会话跟踪数据。但正是这些宝贵的管理功能在缺乏基本防护时变成了黑客的情报中心。去年某电商平台的数据泄露事件溯源发现攻击者正是通过暴露的Druid监控页面获取了数据库连接信息进而拖走了整个用户表。更常见的情况是开发团队在测试环境配置了监控页面上线时却忘记关闭导致内网管理接口直接暴露在公网。典型风险场景直接访问/druid/index.html无需认证使用默认账号密码admin/admin允许任意IP访问监控接口开启了Session监控但未做防护注意Druid本身没有漏洞问题都出在配置不当。就像给家门装了智能锁却忘记设置密码责任不在锁具厂商。2. 双重防护登录认证IP白名单的最佳实践2.1 密码防护告别弱口令陷阱在application.yml中配置强认证spring: datasource: druid: stat-view-servlet: login-username: monitor_prod_2023 login-password: 7e#V2pKq!9zL*5 reset-enable: false # 禁用重置按钮密码设置黄金法则长度不低于12位包含大小写字母、数字和特殊符号避免使用字典单词和日期组合定期轮换建议每季度更新小技巧使用Spring Cloud Config或Vault管理密码避免硬编码在配置文件中。2.2 IP白名单构筑网络边界防护内网环境配置示例# 允许办公网段访问 spring.datasource.druid.stat-view-servlet.allow192.168.1.0/24,10.10.0.0/16 # 明确拒绝其他所有IP spring.datasource.druid.stat-view-servlet.deny0.0.0.0/0IP白名单设计要点场景推荐配置注意事项生产环境只允许跳板机IP配合NACL使用测试环境部门VPN网段动态IP需用域名本地开发127.0.0.1禁用公网访问3. 配置方式详解YAML vs Properties3.1 YAML配置方案推荐spring: datasource: type: com.alibaba.druid.pool.DruidDataSource druid: stat-view-servlet: enabled: true url-pattern: /druid/* allow: 192.168.1.100,10.10.0.0/16 deny: 172.16.0.0/12 login-username: ops_admin login-password: $${DRUID_PASSWORD} # 从环境变量读取 reset-enable: false web-stat-filter: enabled: true exclusions: *.js,*.gif,*.jpg,/druid/*3.2 Properties传统配置# 基础认证配置 spring.datasource.druid.stat-view-servlet.enabledtrue spring.datasource.druid.stat-view-servlet.login-usernameadmin_prod spring.datasource.druid.stat-view-servlet.login-passwordZxcv1234 spring.datasource.druid.stat-view-servlet.allow10.0.0.0/8 # 增强安全配置 spring.datasource.druid.filter.config.enabledtrue spring.datasource.druid.web-stat-filter.enabledtrue spring.datasource.druid.web-stat-filter.session-stat-enablefalse两种格式对比特性YAMLProperties可读性高中层级结构明确扁平环境变量支持完善需要占位符适合场景复杂配置简单配置4. 生产环境进阶防护策略4.1 网络层加固方案Nginx反向代理防护location /druid/ { allow 10.10.0.0/16; deny all; auth_basic Druid Monitor; auth_basic_user_file /etc/nginx/.htpasswd; proxy_pass http://localhost:8080; }Spring Security集成Configuration EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { Override protected void configure(HttpSecurity http) throws Exception { http.antMatcher(/druid/**) .authorizeRequests() .anyRequest().hasRole(MONITOR) .and() .httpBasic(); } }4.2 监控审计增强在DruidConfig中添加审计过滤器Bean public FilterRegistrationBeanFilter statFilter(){ FilterRegistrationBeanFilter filterRegBean new FilterRegistrationBean(); filterRegBean.setFilter(new WebStatFilter()); filterRegBean.addInitParameter(sessionStatEnable, false); // 关闭session监控 filterRegBean.addInitParameter(principalSessionName, USER_SESSION); filterRegBean.addInitParameter(exclusions, *.js,*.gif,*.jpg,/druid/*); return filterRegBean; }安全审计清单[ ] 禁用Session监控高危功能[ ] 关闭Reset All功能[ ] 配置访问日志记录[ ] 定期检查白名单IP有效性5. 常见问题排查指南症状1配置了密码但仍可匿名访问可能原因使用了旧版本Druid Starter1.1.10配置项拼写错误如loginUsernamevslogin-username多配置源冲突解决方案# 检查生效配置 curl -I http://localhost:8080/actuator/env | grep druid症状2白名单配置不生效检查顺序确认allow和deny的优先级deny优先检查CIDR格式是否正确验证网络中间件如Nginx是否覆盖了规则调试命令// 打印当前访问IP ServletRequestAttributes attributes (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); String ip attributes.getRequest().getRemoteAddr();在最近一次金融行业红蓝对抗中采用密码白名单网络隔离三重防护的项目Druid监控页面实现了零突破。安全没有银弹但层层设防能让攻击者知难而退。