【Dubbo3高级特性】「提升系统安全性」手把手教你如何通过令牌进行Dubbo3服务验证及服务鉴权控制实战指南(一)

简介: 【Dubbo3高级特性】「提升系统安全性」手把手教你如何通过令牌进行Dubbo3服务验证及服务鉴权控制实战指南

系列文章目录

如果你看到了这里,那么接下来你将会认识Dubbo3的诞生将如何引领微服务领域更进一步,从而迈入云原生的领域,这当然不仅仅是Dubbo3,之前也介绍了Java生态另外一个云原生领域的技术Quarkus等技术,而本文内容侧重点去介绍Dubbo3迈向云原生 的技术分析和探索,如果有不正确的地方,还需要大家多多指正。


通过令牌进行服务验证

令牌Token的验证方式主要通过客户端和服务端的令牌验证定义并且通过注册中心层面进行维护和存储和管理的实现机制

使用场景

在一定程度上实现客户端和服务端的可信鉴权,避免任意客户端都可以访问,降低出现安全问题的风险。

主要原理

通过令牌验证在注册中心控制权限,以决定要不要下发令牌给消费者, 可以防止消费者绕过注册中心访问提供者, 另外通过注册中心可灵活改变授权方式,而不需修改或升级提供者。如下图所示。



运作流程和实现原理

服务提供者

  1. 创建对应的令牌Token,通过我们定义的对应token配置,进行读取的参数信息从而进行相关的Generate Token。


注册中心

  1. 接收到了服务提供者传递上报过来的token值,作为该对应服务接口或者整个服务提供者的token值进行管理维护。


  1. 针对于相关的传递过来的token值进行校验和核对工作之后,没有问题则会进行存储到注册中心。


服务消费者

  1. 服务消费者可以从注册中心上面获取token令牌值



  1. 服务消费者会将获取到的token数据值,伴随着调用接口的同时传递给服务提供者。



服务提供者

  1. 服务提供者接收到了对应的服务消费者传递过来的token数据值,进行校验和核对是否属于我们认可的token值,从而实现了控制制定我们服务体系内部的消费者的调用请求。如果不一致则直接会返回失败。



配置方式(服务提供者)

配置对应的token值的范围有几种方式,我们常用的token配置主要有服务级别和接口级别等。

令牌验证,为空表示不开启,如果为true,表示随机生成动态令牌,否则使用静态令牌,令牌的作用是防止消费者绕过注册中心直接访问,保证注册中心的授权功能有效,如果使用点对点调用,需关闭令牌功能

服务级别

可以设置对应的整个服务应用级别的配置,但是优先级会被接口级别的覆盖,可以作为全局的默认值所使用。

随机token令牌,使用UUID生成

该参数接收两种类型值:boolean类型-True则生成UUID随机令牌,若为String则自定义令牌。

xml配置模式进行控制

xml

复制代码

<dubbo:provider token="true" />
SpringBoot的配置模式进行控制

使用 Spring Boot 减少非必要配置,结合 Annotation 与 application.properties/application.yml 开发 Dubbo 应用

properties

复制代码

dubbo.provider.token=true

或者

yaml

复制代码

dubbo:
 provider:
  token: true

使用这种方式的安全级别好一些,因为每次生产的都是uuid,无规律话,不容易被第三方客户端进行破解从而进行调用。

固定token令牌,相当于密码

定义了全局provider的token数据uuid模式,对所有的接口和服务实现均起作用!定义了全局provider的token数据-123456,对所有的接口和服务实现均起作用!

xml配置模式进行控制

xml

复制代码

<dubbo:provider token="123456" />
SpringBoot的配置模式进行控制

properties

复制代码

dubbo.provider.token=123456

或者

yaml

复制代码

dubbo:
 provider:
  token: 123456

接口类级别

随机token令牌,使用UUID生成

实现方式和效果与服务级别相同。

xml

复制代码

<dubbo:service interface="com.xxx.TestService" token="true" />

或者可以采用@DubboService注解中的token属性进行标识。

定义了该service接口的token数据,对该接口的所有方法实现均起作用!

固定token令牌,相当于密码

xml

复制代码

<dubbo:service interface="com.xxx.TestService" token="123456" />

或者可以采用@DubboService注解中的token属性进行标识。

定义了该service接口的token数据,对该接口的所有方法实现均起作用!

配置方式(服务消费者)

Dubbo官方并未直接暴漏对应的对于消费者端的DubboReference或者ReferenceConfig上配置token,但是通过源码可以知道,Dubbo采用隐式参数传递token,通过attachment进行携带进行传输。

java

复制代码

RpcContext.getContext().setAttachment("token","123456"):
注意要点
  • token的配置也可以在,协议级别,使用的spring boot的starter配置中未找到协议级别如何配置。
  • 配置Token的生产者的服务,只会允许消费者通过注册中心注册后,才可以获取到对应的token数据,再消费的数据才能够访问,否则会出现出现无效token的错误。
  • 由上面的介绍,数据token是由注册中心下发拉取到的。

实际案例

建立API接口

java

复制代码

public interface CommonRpcApi {
    RpcResponse<Boolean> tokenAuth(RpcRequest<String> requestParam);
}

建立服务端的案例

java

复制代码

@DubboService(token = "token")
public class DefaultCommonRpcApi implements CommonRpcApi {
    @Override
    public RpcResponse<Boolean> tokenAuth(RpcRequest<String> requestParam) {
        return RpcResponse.success();
    }
}

建立消费端的案例

注册中心模式进行调用

java

复制代码

@DubboReference
    CommonRpcApi commonRpcApi;
    @GetMapping("/token")
    public ResponseEntity<RpcResponse<String>> doTokenAuth(){
        return ResponseEntity.ok(commonRpcApi.tokenAuth(new RpcRequest(RpcContext.getContext().getAttachment("token"))));
    }

验证结果没有任何问题和错误异常。

直连模式进行调用

模拟非注册中心过来的外部rpc调用,用于校验token不同或者不进行token鉴权的场景!

java

复制代码

@DubboReference(url = "dubbo://${dubbo.address:localhost}:28081")
    CommonRpcApi commonRpcApi;
    @GetMapping("/token")
    public ResponseEntity<RpcResponse<String>> doTokenAuth(){
        return ResponseEntity.ok(commonRpcApi.tokenAuth(new RpcRequest(RpcContext.getContext().getAttachment("token"))));
    }
出现了报错!

kotlin

复制代码

org.apache.dubbo.rpc.RpcException: Invalid token! Forbid invoke remote service interface com.dubbo.shopping.api.oss.CommonRpcApi method tokenAuth() from consumer 192.168.1.104 to provider 192.168.1.104, consumer incorrect token is null
consumer incorrect token is null

出现了不一致的问题在,当存在这种场景我们很难捕捉到对应的uuid模式的token值,那么我们可以指定token值进行测试效果。

建立服务端的案例2

java

复制代码

@DubboService(token = "123456")
public class DefaultCommonRpcApi implements CommonRpcApi {
    @Override
    public RpcResponse<Boolean> tokenAuth(RpcRequest<String> requestParam) {
        return RpcResponse.success();
    }
}
直连模式进行调用

我们手动注入token进行控制校验模式

java

复制代码

@DubboReference(url = "dubbo://${dubbo.address:localhost}:28081")
    CommonRpcApi commonRpcApi;
    @GetMapping("/token")
    public ResponseEntity<RpcResponse<String>> doTokenAuth(){
        RpcContext.getContext().setAttachment("token","123456");
        return ResponseEntity.ok(commonRpcApi.tokenAuth(new RpcRequest(RpcContext.getContext().getAttachment("token"))));
    }

发现调用结果又变的正常了!


通过服务鉴权控制调用

基于上面的【通过令牌进行服务验证】的控制实现,对于安全性而言还是缺乏了机动性、可配置、灵活性等。所以接下来引入通过了【服务鉴权控制】从而增加安全性和机动性以及可配置化等功能实现。

服务鉴权-特性说明

Dubbo3服务鉴权类似支付之类的对安全性敏感的业务可能会有限制匿名调用的需求。在加固安全性方面,2.7.5引入了基于AK/SK机制的认证鉴权机制,并且引入了鉴权服务中。

鉴权服务中心

主要原理是消费端在请求需要鉴权的服务时,会通过SK、请求元数据、时间戳、参数等信息来生成对应的请求签名,通过Dubbo3的Attachment机制携带到对端进行验签,验签通过才进行业务逻辑处理。如下图所示:



总体流程图



使用场景

针对于调用方进行相关的服务调用鉴权

使用方式
接入方式
  1. 使用者需要在微服务站点上填写自己的应用信息,并为该应用生成唯一的证书凭证。
  2. 在管理站点上提交工单,申请某个敏感业务服务的使用权限,并由对应业务管理者进行审批,审批通过之后,会生成对应的 AK/SK到鉴权服务中心。
  3. 导入该证书到对应的应用下,并且进行配置。配置方式也十分简单,以注解方式为例:


【Dubbo3高级特性】「提升系统安全性」手把手教你如何通过令牌进行Dubbo3服务验证及服务鉴权控制实战指南(二)https://developer.aliyun.com/article/1470990



相关文章
|
1月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
79 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
2月前
|
Dubbo Java 应用服务中间件
微服务框架Dubbo环境部署实战
微服务框架Dubbo环境部署的实战指南,涵盖了Dubbo的概述、服务部署、以及Dubbo web管理页面的部署,旨在指导读者如何搭建和使用Dubbo框架。
220 17
微服务框架Dubbo环境部署实战
|
2月前
|
缓存 负载均衡 Dubbo
Dubbo技术深度解析及其在Java中的实战应用
Dubbo是一款由阿里巴巴开源的高性能、轻量级的Java分布式服务框架,它致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
72 6
|
3月前
|
JSON Dubbo Java
【Dubbo协议指南】揭秘高性能服务通信,选择最佳协议的终极攻略!
【8月更文挑战第24天】在分布式服务架构中,Apache Dubbo作为一款高性能的Java RPC框架,支持多种通信协议,包括Dubbo协议、HTTP协议及Hessian协议等。Dubbo协议是默认选择,采用NIO异步通讯,适用于高要求的内部服务通信。HTTP协议通用性强,利于跨语言调用;Hessian协议则在数据传输效率上有优势。选择合适协议需综合考虑性能需求、序列化方式、网络环境及安全性等因素。通过合理配置,可实现服务性能最优化及系统可靠性提升。
57 3
|
3月前
|
缓存 Dubbo Java
Dubbo服务消费者启动与订阅原理
该文章主要介绍了Dubbo服务消费者启动与订阅的原理,包括服务消费者的启动时机、启动过程以及订阅和感知最新提供者信息的方式。
Dubbo服务消费者启动与订阅原理
|
3月前
|
Dubbo 网络协议 Java
深入掌握Dubbo服务提供者发布与注册原理
该文章主要介绍了Dubbo服务提供者发布与注册的原理,包括服务发布的流程、多协议发布、构建Invoker、注册到注册中心等过程。
深入掌握Dubbo服务提供者发布与注册原理
|
3月前
|
负载均衡 Dubbo Java
Dubbo服务Spi机制和原理
该文章主要介绍了Dubbo中的SPI(Service Provider Interface)机制和原理,包括SPI的基本概念、Dubbo中的SPI分类以及SPI机制的实现细节。
Dubbo服务Spi机制和原理
|
3月前
|
C# 开发者 Windows
勇敢迈出第一步:手把手教你如何在WPF开源项目中贡献你的第一行代码,从选择项目到提交PR的全过程解析与实战技巧分享
【8月更文挑战第31天】本文指导您如何在Windows Presentation Foundation(WPF)相关的开源项目中贡献代码。无论您是初学者还是有经验的开发者,参与这类项目都能加深对WPF框架的理解并拓展职业履历。文章推荐了一些适合入门的项目如MvvmLight和MahApps.Metro,并详细介绍了从选择项目、设置开发环境到提交代码的全过程。通过具体示例,如添加按钮点击事件处理程序,帮助您迈出第一步。此外,还强调了提交Pull Request时保持专业沟通的重要性。参与开源不仅能提升技能,还能促进社区交流。
44 0
|
3月前
|
Dubbo Java Nacos
【实战攻略】破解Dubbo+Nacos+Spring Boot 3 Native打包后运行异常的终极秘籍——从零开始彻底攻克那些让你头疼不已的技术难题!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心受到欢迎,但使用Dubbo+Nacos+Spring Boot 3进行GraalVM native打包后常遇运行异常。本文剖析此问题及其解决策略:确认GraalVM版本兼容性;配置反射列表以支持必要类和方法;采用静态代理替代动态代理;检查并调整配置文件;禁用不支持的功能;利用日志和GraalVM诊断工具定位问题;根据诊断结果调整GraalVM配置。通过系统排查方法,能有效解决此类问题,确保服务稳定运行。
98 0
|
3月前
|
缓存 负载均衡 Dubbo
Dubbo服务集群容错原理(重要)
该文章主要介绍了Dubbo服务集群容错的原理,包括集群容错技术的概念、Dubbo中使用的集群容错技术种类及其原理。