其他
dubbo-go 可信 RPC 调用实现
定义可信
何为可信?可信的定义很广泛,依场景不同有不同的定义。在微服务架构中,每个服务都是无状态的,多个服务之间不可信,为了实现服务间更好地隔离,服务间应进行认证和鉴权。
如支付之类的业务场景,安全性敏感的服务会有限制匿名系统调用的需求,其他业务在接入该类敏感业务之前,需要通过审批方可正常调用,这就需要对这类敏感服务进行权限管控。尽管 Dubbo 开源版本中支持 Token 方式的鉴权实现,但是该实现方式总体来说安全性并不高,并且无法满足我们需要动态下发以及变更的灵活性需求。
针对于此,我们内部着重从巩固安全性和拓展灵活性层面重新设计了一套 Dubbo/Dubbo-Go 的服务间调用的鉴权认证功能。本文我们将主要从实现层面讲解其大致实现思路。
可信方案
可信流程
1、使用该功能的应用需要提前申请对应的证书,并向提供服务的应用提交申请访问工单,由双方负责人审批通过后,请求鉴权服务中心自动生成键值对。
// Authenticator
type Authenticator interface {
// Sign
// give a sign to request
Sign(protocol.Invocation, *common.URL) error
// Authenticate
// verify the signature of the request is valid or not
Authenticate(protocol.Invocation, *common.URL) error
}
使用者可通过 SPI 机制定制签名和认证方式,以及适配公司内部基础设施的密钥服务下发 AK/SK。
示例
以 Helloworld 示例 中的代码接入当前社区版本中的默认鉴权认证功能实现为例:
Helloworld 示例:
https://github.com/apache/dubbo-samples/tree/master/golang/helloworld/dubbo
在无需改变代码的情况下,只需要在配置上增加额外的相关鉴权配置即可,dubbo-go 服务端配置示例如下:
services:
"UserProvider":
# 可以指定多个registry,使用逗号隔开;不指定默认向所有注册中心注册
registry: "hangzhouzk"
protocol : "dubbo"
# 相当于dubbo.xml中的interface
interface : "com.ikurento.user.UserProvider"
loadbalance: "random"
# 本服务开启auth
auth: "true"
# 启用auth filter,对请求进行验签
filter: "auth"
# 默认实现通过配置文件配置AK、SK
params:
.accessKeyId: "SYD8-23DF"
.secretAccessKey: "BSDY-FDF1"
warmup: "100"
cluster: "failover"
methods:
- name: "GetUser"
retries: 1
loadbalance: "random"
references:
"UserProvider":
# 可以指定多个registry,使用逗号隔开;不指定默认向所有注册中心注册
registry: "hangzhouzk"
protocol: "dubbo"
interface: "com.ikurento.user.UserProvider"
cluster: "failover"
# 本服务开启sign filter,需要签名
filter: "sign"
# 默认实现通过配置文件配置AK、SK
params:
.accessKeyId: "SYD8-23DF"
.secretAccessKey: "BSDY-FDF1"
methods:
- name: "GetUser"
retries: 3
总结
Apache Dubbo 作为一款老而弥新的服务治理框架,无论是其自身还是其生态都还在飞速进化中。本文描述的最新实现的可信服务调用,是为了避免敏感接口被匿名用户调用而在 SDK 层面提供的额外保障,在 RPC 层面保障安全性。
作者信息:
本文缩略图:icon by Lusiro
Tips:
# 点下“在看”❤️
# 然后,公众号对话框内发送“EDAS”,试试手气?😆
# 本期奖品是来自淘宝心选的凉席 。