Druid作为阿里巴巴开源的数据库连接池组件,其内置的监控页面为开发者提供了实时查看SQL执行情况、连接池状态等实用功能。但在实际部署中,很多团队会忽略这个页面的安全防护,导致监控接口直接暴露在公网。
去年我们团队在一次安全审计中就发现,某业务系统的/druid路径未做任何访问控制,任何人都能通过浏览器查看完整的SQL执行记录、数据源配置等敏感信息。更严重的是,部分生产环境甚至保留了默认的弱密码或完全未设置密码。
未受保护的Druid监控页面可能造成以下安全威胁:
重要提示:根据OWASP Top 10,这类未授权访问问题长期位列API安全风险前三名。我们在渗透测试中发现,约35%的Java应用存在类似监控接口暴露问题。
针对Druid监控页面的防护,业内常见有以下几种方案:
| 方案类型 | 实施难度 | 安全性 | 维护成本 |
|---|---|---|---|
| 修改Druid源码 | 高 | 高 | 高 |
| 应用层过滤器 | 中 | 中 | 中 |
| Nginx反向代理 | 低 | 高 | 低 |
| 网络ACL限制 | 低 | 中 | 低 |
综合比较后,我们选择Nginx方案作为最佳实践,主要基于以下考虑:
在开始配置前,需要确认:
检查Nginx模块:
bash复制nginx -V 2>&1 | grep -o http_auth_basic_module
在Nginx配置文件中添加以下内容(假设Druid监控路径为/druid):
nginx复制location /druid {
# 基础认证配置
auth_basic "Druid Monitor Authentication Required";
auth_basic_user_file /etc/nginx/.htpasswd;
# IP白名单限制
allow 192.168.1.0/24;
allow 10.0.0.1;
deny all;
# 强制HTTPS
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
# 反向代理到实际应用
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
生成密码文件:
bash复制# 安装htpasswd工具(Debian/Ubuntu)
sudo apt-get install apache2-utils
# 创建密码文件(首次使用-c参数)
sudo htpasswd -c /etc/nginx/.htpasswd admin
为进一步提升安全性,建议补充以下配置:
nginx复制# 禁用敏感HTTP方法
if ($request_method !~ ^(GET|POST|HEAD)$ ) {
return 405;
}
# 防止点击劫持
add_header X-Frame-Options "SAMEORIGIN";
# XSS防护
add_header X-XSS-Protection "1; mode=block";
# 禁用内容类型嗅探
add_header X-Content-Type-Options "nosniff";
# CSP策略
add_header Content-Security-Policy "default-src 'self'";
bash复制# 测试认证是否生效
curl -I http://yourserver/druid
# 应返回401 Unauthorized
# 带认证测试
curl -u admin:password http://yourserver/druid
bash复制# 从非白名单IP访问测试
curl --interface eth1 http://yourserver/druid
# 应返回403 Forbidden
问题1:认证通过但仍返回403
问题2:HTTPS重定向循环
问题3:静态资源加载失败
bash复制# 每月更新密码
sudo htpasswd /etc/nginx/.htpasswd admin
nginx复制log_format druid_access '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/druid_access.log druid_access;
bash复制# 使用nmap定期检测端口暴露情况
nmap -sV --script http-vuln-cve2017-5638 yourserver -p 80,443
nginx复制location /druid {
auth_request /auth;
...
}
location = /auth {
internal;
proxy_pass http://auth-service/verify;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
这套方案在我们多个生产环境中稳定运行超过两年,成功拦截了数千次恶意扫描尝试。实际部署时建议根据具体网络架构调整IP白名单范围,金融类业务建议将监控页面部署在独立的管理VPC中。