Dubbo 安全防御与加固
核心防御原则
最小化攻击面:关闭不需要的协议和功能
纵深防御:不依赖单一安全机制
不信任客户端输入:序列化方式由服务端决定
保持更新:及时升级到最新安全版本
版本升级(最重要)
推荐版本
| 分支 |
推荐最低版本 |
安全特性 |
| 2.7.x |
2.7.22+ |
修复所有已知 CVE |
| 3.0.x |
3.0.14+ |
修复泛化调用绕过 |
| 3.1.x |
3.1.11+ |
STRICT 模式、修复恶意包解码 |
| 3.2.x |
3.2.5+ |
默认 STRICT 模式 |
升级要点
Dubbo 3.2+ 默认使用 STRICT 序列化检查模式
Dubbo 3.2+ 默认序列化从 Hessian2 切换为 Fastjson2
高版本不保证向后兼容,需要测试
序列化安全配置
启用 STRICT 模式(强烈推荐)
1 2 3
|
dubbo.application.serialize-check-status=STRICT
|
三种检查模式
| 模式 |
行为 |
适用场景 |
| STRICT |
只允许白名单类,其他全部拒绝 |
生产环境(推荐) |
| WARN |
阻止黑名单类,其他允许但记录日志 |
过渡期 |
| DISABLE |
不检查 |
绝对禁止在生产使用 |
自定义白名单
1 2 3 4 5 6 7 8
|
dubbo.application.trust-serialize-class-level=1
dubbo.application.trust-serialize-class=com.myapp.model.*
|
关闭不必要的功能
禁用 HTTP 协议(防止 CVE-2019-17564)
1 2 3
| <dubbo:protocol name="dubbo" port="20880" />
|
禁用 Telnet(防止 CVE-2021-32824)
1 2 3 4 5 6
| dubbo.provider.telnet=
dubbo.provider.telnet=ls,status
|
限制泛化调用(防止 CVE-2021-30179、CVE-2023-23638)
1 2
| <dubbo:provider generic="false" />
|
禁用不安全的序列化方式
1 2 3
| dubbo.provider.serialization=hessian2
|
配置中心安全(防止 CVE-2021-30180/30181)
ZooKeeper 认证
1 2
| zookeeper.server.auth.provider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
|
1 2
| # 设置 ACL setAcl /dubbo auth:admin:cdrwa
|
Nacos 认证
1 2 3
| nacos.core.auth.enabled=true nacos.core.auth.plugin.nacos.token.secret.key=自定义密钥
|
网络隔离
配置中心(ZooKeeper:2181、Nacos:8848)不应暴露到外网
使用防火墙限制访问 IP
网络层防护
Dubbo 端口访问控制
1 2 3
| # iptables: 只允许特定 IP 访问 Dubbo 端口 iptables -A INPUT -p tcp --dport 20880 -s 10.0.0.0/8 -j ACCEPT iptables -A INPUT -p tcp --dport 20880 -j DROP
|
启用 Dubbo Token 认证
1 2 3 4
| <dubbo:provider token="true" />
<dubbo:provider token="your-secret-token" />
|
Token 认证可以防止未授权的 Consumer 调用
但不能防止直接发送恶意 Dubbo 协议包
使用 TLS 加密
1 2 3 4
| dubbo.ssl.enabled=true dubbo.ssl.server-cert-chain-file=server.crt dubbo.ssl.server-private-key-file=server.key
|
依赖安全
移除危险的 Gadget Chain 依赖
| 依赖 |
风险 |
建议 |
| commons-collections:3.x |
CC 链 |
升级到 4.x |
| commons-beanutils < 1.9.4 |
CB 链 |
升级到最新版 |
| rome |
ROME 链 |
评估是否需要,不需要则移除 |
| xbean-naming |
XBean JNDI 链 |
评估是否需要 |
| groovy < 2.4.4 |
Groovy 链 |
升级到最新版 |
使用依赖检查工具
1 2 3 4 5 6
| <plugin> <groupId>org.owasp</groupId> <artifactId>dependency-check-maven</artifactId> <version>8.4.0</version> </plugin>
|
1
| mvn dependency-check:check
|
JDK 安全配置
限制 JNDI 远程类加载(防止 JNDI 注入)
1 2 3
| -Dcom.sun.jndi.rmi.object.trustURLCodebase=false -Dcom.sun.jndi.ldap.object.trustURLCodebase=false
|
使用 JEP 290 反序列化过滤
1 2
| -Djdk.serialFilter=!org.apache.commons.collections.*;!org.apache.xbean.*
|
监控与审计
反序列化日志监控
1 2 3
| dubbo.application.serialize-check-status=WARN dubbo.application.logger=slf4j
|
监控日志中的 Serialization security check 关键词
网络流量监控
使用 IDS/IPS 监控 20880 端口的异常流量
检测特征:dabb magic + 异常的 Serialization ID
检测特征:大量来自同一 IP 的 RPC 请求
安全检查清单
1 2 3 4 5 6 7 8 9 10
| [ ] Dubbo 版本 >= 2.7.22 / 3.0.14 / 3.1.11 / 3.2.5 [ ] 启用 STRICT 序列化检查模式 [ ] 禁用 HTTP 协议(如不需要) [ ] 禁用 Telnet invoke 命令 [ ] 配置中心启用认证 [ ] 配置中心不暴露到外网 [ ] Dubbo 端口 (20880) 有访问控制 [ ] 移除不必要的 Gadget Chain 依赖 [ ] JDK 已限制 JNDI 远程类加载 [ ] 已配置反序列化日志监控
|