Dubbo3序列化安全问题
序列化安全
在 Dubbo 3.0 中,序列化协议的安全性得到了加强。
1. 序列化安全性升级
-
Triple 协议:
- 推荐使用 Triple 协议 的非 Wrapper 模式,该模式在安全性上更为严格。
- 需要开发人员编写 IDL(接口描述语言)文件,这虽然增加了开发的复杂性,但提高了序列化的安全性。
- 默认情况下,该协议是安全的,因此适合高安全性需求的应用场景。
-
Wrapper 模式:
- 允许与其他序列化数据兼容,提供更好的兼容性,但在安全性方面可能存在潜在风险。
- 对于 Hessian2 协议,推荐高安全属性的用户开启白名单模式,以限制可反序列化的类。
- 默认情况下,框架开启了黑名单模式,拦截恶意调用,以增强安全性。
2. 安全性最佳实践
- 开启 Token 鉴权机制:
- 必须使用其他序列化协议的应用,建议开启 Token 鉴权机制,以防止未授权请求对 Provider 的安全威胁。
- 启用 Token 鉴权时,还需要同时开启注册中心的鉴权功能,以确保整个调用链的安全性。
3. 推荐措施
-
根据需求选择协议:
- 如果应用对安全性要求高,建议优先考虑使用 Triple 协议的非 Wrapper 模式。
- 对于需要兼容性但安全性要求相对较低的场景,可以使用 Wrapper 模式,但需要开启安全机制。
-
编写 IDL 文件:
- 对于使用 Triple 协议的项目,建议认真编写 IDL 文件,确保接口的清晰和安全性。
-
使用 Token 鉴权:
- 确保在项目中实现 Token 鉴权,确保请求来源的可靠性。
4. 总结
- Dubbo 3.0 在序列化安全方面的加强是为了应对日益严峻的安全挑战,开发者需要根据实际需求选择合适的序列化协议,并注意实现必要的安全措施,以保护服务的安全性和完整性。
类检查机制概述
特性说明
- 类检查机制确保服务提供者与消费者之间的兼容性和安全性,防止因类版本不匹配、方法签名不兼容或类缺失而引发的问题。
使用场景
- 适用于需要维护版本兼容性和安全性的场合,尤其是在微服务架构中,多个服务可能会涉及不同版本的类。
使用方式
- 该机制自 Dubbo >= 3.1.6 开始支持,适用于 Hessian2、Fastjson2 序列化和泛化调用,其他序列化方式暂不支持。
检查模式
-
检查模式分为三个级别:
- STRICT(严格检查):
- 禁止反序列化所有不在允许序列化列表(白名单)中的类。
- WARN(告警):
- 禁止序列化所有在不允许序列化列表(黑名单)中的类,同时在反序列化不在允许序列化列表(白名单)中的类时,记录告警日志。
- DISABLE(禁用):
- 不进行任何检查。
- STRICT(严格检查):
-
默认配置:
- 在 3.1 版本中,默认为 WARN 级别。
- 在 3.2 版本中,默认为 STRICT 级别。
配置方式
-
通过 ApplicationConfig 配置:
ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setSerializeCheckStatus("STRICT");
-
通过 Spring XML 配置:
-
<dubbo:application name="demo-provider" serialize-check-status="STRICT"/>
-
通过 Spring Properties / dubbo.properties 配置:
dubbo.application.serialize-check-status=STRICT
-
通过 System Property 配置:
-Ddubbo.application.serialize-check-status=STRICT
-
日志提示:
- 配置成功后,可以在日志中看到类似以下的提示:
INFO utils.SerializeSecurityManager: [DUBBO] Serialize check level: STRICT
注意事项
- 在同一进程(Dubbo Framework Model)下,如果多个应用配置了不同的检查模式,最终将生效“最宽松”的级别。例如,若一个配置为
STRICT
,另一个为WARN
,则最终生效WARN
级别。
Serializable 接口检查
-
检查模式:
- 分为两个级别:
true
:开启检查,拒绝反序列化所有未实现Serializable
的类。false
:关闭检查。
- 分为两个级别:
-
默认配置:
- Dubbo 中默认配置为
true
开启检查。
- Dubbo 中默认配置为
-
配置方式:
-
通过 ApplicationConfig 配置:
ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setCheckSerializable(true);
-
通过 Spring XML 配置:
<dubbo:application name="demo-provider" check-serializable="true"/>
-
通过 Spring Properties / dubbo.properties 配置:
dubbo.application.check-serializable=true
-
通过 System Property 配置:
-Ddubbo.application.check-serializable=true
-
-
日志提示:
- 配置成功后,可以在日志中看到类似以下的提示:
INFO utils.SerializeSecurityManager: [DUBBO] Serialize check serializable: true
注意事项
- 在同一进程下,如果多个应用配置了不同的
Serializable
接口检查模式,最终生效“最宽松”的级别。 - 目前尚未打通 Hessian2、Fastjson2 内置的
Serializable
检查配置。 - 对于泛化调用,仅需配置
dubbo.application.check-serializable
修改检查配置。 - 对于 Hessian2 序列化,需要同时修改
dubbo.application.check-serializable
和dubbo.hessian.allowNonSerializable
两个配置。 - 对于 Fastjson2 序列化,目前暂不支持修改。
总结
- 类检查机制和
Serializable
接口检查是 Dubbo 3.0 为了提升安全性和兼容性而引入的重要特性。合理配置这些检查机制,可以有效防止因类版本不匹配和反序列化风险而带来的潜在问题。在开发和部署微服务时,建议根据应用需求合理配置相应的检查模式和接口检查。