开发者学堂课程【2022阿里云云原生中间件开发者大会集锦:阿里云中间件开源项目新版本发布】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1053/detail/15280
阿里云中间件开源项目新版本发布
内容介绍:
一、目录介绍
二、Nacos 2.1简介
三、鉴权插件
四、配置加密插件
五、更多插件支持
本课程主要是阿里云中间件开源项目新版本发布,主题是 Nacos 2.1.0版本发布,支持特性定制插件,那么 Nacos 于2020年4月29日发布了2.1.0版本,从这个版本开始Nacos 就支持社区用户在不改动源代码的情况下,进行部分能力的一个插件化定制,本次分享会对2.1版本中添加的开放插件功能进行一个简单的说明。
一、目录介绍
本次分享的主要分为四个部分,首先是对Nacos 2.1版本做一个简单的介绍,然后介绍鉴权插件和配置加密插件的相关原理,同时,也会以阿里云mse微服务引擎的对应的插件实现做为一个插件实现样例来进行说明,最后分享一下Nacos后续版本对于其它插件的计划。
二、Nacos 2.1简介
1. Nacos 简介
那么开始关于 Nacos 2.1版本的简介,首先都知道 Nacos 是dynamic naming and configuration service 首字母简称,目标是一个更易于构建云原生的一个动态服务,发现配置管理和服务管理和服务管理平台,Nacos它是诞生于阿里巴巴08年的一个五彩石项目,然后在阿里十年双11中进行成长,这一阶段主要是帮助业务进行一个解决微服务的扩展性和高可用的问题。解决了百万实力的一个创新的新问题之后,那么在18年决定将Nacos进行开源,输出阿里十年关于微服务发现和配置管理的一个能力沉淀,然后推动整个微服务行业发展,加速企业数字化转型。
2. Nacos2.1架构图
随着Nacos开源社区的一个发展,然后用户用越来越多,用户规模也越来越大,那么社区就开始发现Nacos1.0这种http的架构开始暴露出一些性能的问题,于是开始新增了关于grpc,使用grpc之后,作为更高效通信方式的一个优化,同时,也对内核架构进行了大量的重构和更新,最终的结果是将性能提升了十倍。
那么同时,Nacos也在考虑进行一个插件化的改造,让Nacos的架构更与扩展和更新,变得更易用,能更加满足不同用户的不同需求,那么,本次分享中的鉴权插件和加密插件就是基于这样的一个场景而扩展出来的。
三、鉴权插件
那么首先来看,鉴权插件相关的事情。
1.插件化前鉴权插件原理
那么,在了解进程插件原理之前,先来了解一下,在没有插件化之前那个是怎么做鉴权的,那么Nacos1.2版本后就加入了一个简易的账号密码的体系,提供给社区进行一个简单的一个请求鉴权,那么如下图所示,请求在客户端中会通过grpc或http,来发送这个请求到服务端,用户在开启鉴权工程之后,再发送请求前,需要在请求中设置user name, password,或者对应生成的一个临时token,用来标记这个请求的一个身份信息,那个服务端会从这个请求获取到对应的身份信息之后,会先进行什么验证,比如用户名、密码验证或者token验证等等。通过之后再进行一个权限的校验,比如是否有读权限或者有写权限,如果都通过了才会进行这个请求的正式处理。
2. 插件化前特点
(1)、鉴权信息固定
那么在未插件化之前的这个鉴权是侵入到所有请求的主流程中的,而且它的信息非常固定,只支持user name,password以及对应生成的token,不能满足用户实际使用的需要。
(2)、鉴权能力弱
同时,服务端实现的加入逻辑非常简单,在安全性能力上并不是很强。因此,很多用户就会有一个升级的诉求,进行这个鉴权体系的一个改进,特别是很多公司都有自己的一个员工账号体系,或者有自己的安全系统。
(3)、需要修改代码源
如果想让Nacos接入它们的安全系统,就需要它们来进行源代码的修改,但是Nacos社区又非常活跃,然后本身也处于高速发展期,代码变更非常的频繁,这导致对于广大用户或者运营开发者来说,维护成本非常高。
它需要时常合并社区的代码,并且要解决过程中遇到的一些冲突问题,这就导致它们非常难以维护这些改动。
3.插件化后鉴权原理
那么基于这上面的介绍,可以看到原始的插件功能信息非常简单,难以扩展,而且它的强安全能力无法满足很多用户的一个强安全的诉求,看一下,在2.1版本添加精选插件之后,会不会有什么改变?
(1)、主流程不感知具体信息
那么,如下图所示,首先请求的主链路是不变的,请求在客户端中仍然会通过加grpc 和http 发送请求到服务端,那么不同的是,原来是有固定的用户名密码信息来作为它的身份信息,注入到请求中,而现在被替换成了一个叫identity的一个抽象,这个抽象是实际是由鉴权插件进行提供的,客户端在发送这个请求之前,会有鉴权插件管理器,将请求中的资源信息,如它的配置,id是哪一个,服务名是哪个,给提取出来,然后传递到鉴权插件之中,鉴权插件的实现,可以根据初始化的时候的一个配置信息,比如用它的户名或者ak,以及它的请求的资源信息来计算它的实际的身份信息,那么这里的身份信息完全是由插件来定义的,它可以是不依赖资源的用户密码,也可以是依赖资源的签名信息等等。
那么鉴权插件管理器,最后会获取到identity信息之后,会将这部分信息注入到请求当中,然后服务端收到这个请求后,会先让鉴权插件的管理器来读取这部分的信息,比如它所请求的资源,以及它的一个身份identity 信息,然后选择对应的一个插件进行鉴权。
(2)、自定义开发鉴权能力
那么这个鉴权插件的具体逻辑也是由鉴权插件来自由的实现,Nacos是不会再关注鉴权过程本身,只会关注鉴权结果,只要它返回的鉴权结果是成功的,那么,请求就会被正常的进行处理。
那么,插件的,具体的实现注入,依赖的是java的spi的机制,插件开发者只需要实现对应的插件接口,并且按照spi的标准打包放入到对应的class path当中,那么java这边apm就会自动的将这个插件进行拾译并注入使用,插件化后的鉴权实际上它是解耦了注入信息这个行为和和生成信息的这个行为,它是结合了这两个操作,然后使得Nacos不再关注这个信息内容本身,只关注注入的过程,那么用户可以根据自己的实际的需要,或者对接系统的一个实际的一个身份信息和鉴权接口,来开发它对应的一个鉴权插件和逻辑。
(3)、不需要修改代码源
然后因为这种扩展机制,所以用户不在不需要修改源代码的情况下,只需要维护插件代码本身,就可以在API不改变的情况下,进行Nacos的一个升级。而不需要改动鉴权相关的代码。这样极大的减少了用户的一个维护的成本。
4.实例-微服务引擎(MSE)
那么接下来,以阿里云mse微服务引擎的鉴权插件的时间为例,简单介绍一下,插件化之后的进程使用。
如下图所示,主链路仍然是用户发起请求,然后客户端通过加grpc或http的方式发送到服务端,在发送请求之前,那么见证参数管理器从请求中读取到资源信息,然后传递给见证插件,那么这里的见证插件上面是阿里云插件,那么这个插件是从参数中提取accessKey和secret key,那么再根据这两个key和它请求的resource共同计算一个带有时效性的一个签名,那么在identity信息中返回accessKey和签名,并不会返回secret key。
在鉴权参与管理技术中获取到accessKey和签名之后,它会将这两个信息注入到它的请求中。那么请求中就带上了这个身份信息,服务端在获取到这个身份信息之后,提取出来,并且同时提取了它的资源信息。然后就在选择阿里云的服务端的一个见证插件实现,最终会调用阿里ak服务来进行身份验证,验证主要是验证accessKey和它的签名是否是对应的。并且它的签名是否是在时效内的,之后它会调用一个阿里云的ram服务来进行鉴权,看是否这个身份,这个ak对这个resource对这个资源是有操作权限的,如果两者都通过了之后,它就会对这个请求进行真正的处理,如果它有其中有一个不通过,那么这个请求就会被拒绝。
四、配置加密插件
那么前面介绍完了鉴权插件,再了解一下2.1版本另外一个开放的插件,也是呼声很高的,用户呼声很高的一个加密插件。
1.加密插件原理
那么在Nacos2.1之前,不支持配置性加密的,传输和存储都是明文。那部分对安全要求很高的用户,通常会在发布配置前自己进行加密获取配置之后再自己进行解密。这样的话,对业务的侵入性要求很高。
(1)、密文发布
加入了加密插件之后,2.1版本的客户端可以接受用户发布的一个明文配置,然后在客户端中调用实际的插件实现来进行加密,加密之后,将加密之后的密文配置传输给服务端,那么服务端再将密文存储到MySQL中,这样就实现了一个密文发布。
那么在客户端读取的时候,仍然会读取到密文,获取到密文之后,再调用插件的实现来进行解密,最后返回给用户的应用,这样就实现了对用户应用来说是明文发布明文使用,但是实际在所有的传输和存储过程中它都是密文。
(2)、加密存储
然后对于使用默认控制台和一些旧版本sdk的用户来说,它们的传输是没有办法进行加密的,仍然是明文加密,但是在服务端可以使用加密插件管理器以及加密插件对配置进行加密,然后进行密文的存储。
(3)、不需要修改源代码
同样的因为是使用SPI地址,那么用户并不需要修改源代码,只需要管理自己的一个插件实现即可,只要插件的API没有被修改,那么仍然是可以平滑的进行一个Nacos的升级,而不需要改变它的一个插件的代码,它的维护成本会变很低。
2. 加密插件实现样例
那么,同样的,以阿里云MSE微服务引擎的配置加密插件来为例,简单介绍一下插件化之后的配置加密使用。
首先可以看到在客户端版本上,如果用新版本的客户端,使用阿里云的配置加密,就可以实现用户发布明文,然后在客户端中进行加密,阿里的插件调用的是阿里云的kms服务进行加密,进行密文传输,密文存储,最后在使用的时候,客户端再次调用kms的服务来进行解密,最后返回给客户的应用,然后在控台方阿里云mse的控制台同样也带上了阿里云加密的插件,用户的浏览器和mse控制台之间是通过ht pps协议进行加密的传输,然后再mes控制台侧同样调用了阿里云的实现的插件,调用kms服务进行加密,然后再传输到服务端中进行存储,那么这样的话就是两条链路都是进行一个密文的传输和密文存储,这样就极大的保证安全性。
五、更多插件支持
介绍完鉴权插件和加减密插件之后,来看一下Nacos后续版本对于其它插件的支持。
首先2.1.0版本已经发布了,对鉴权和加密这两个插件的支持,那么在计划当中,将在2.2.0版本支持另一个社区呼声很高的,多数据类型的一个插件支持,目前只支持mysql协议和the by协议的数据库,将来会通过插件形式支持更多数据源,然后同样还有一个寻址插件,是用来帮助用户动态搭建Nacos集群的一个插件,那么另外还有一个呼声比较高的插件就是配置操作的插件,当这个插件公布之后,用户可以实现这个插件,然后再用户修改配置之后,这个插件可以做一些用户想要的操作,比如是白名单,或者是用户配置格式的校验,或者是web hop的回调等。当然,社区还有更多的插件化需求将在2.3以后的版本会陆续的支持,欢迎大家一起贡献社区。