首页
社区
课程
招聘
[原创]从RPC协议看集权设施防护
发表于: 2023-6-8 13:52 5830

[原创]从RPC协议看集权设施防护

2023-6-8 13:52
5830

RPC协议主要用来进行远程过程调用,用一句话来概括,就是允许用户程序调用服务器上的函数进行计算,由此实现两者交互。

 

早先的企业环境中,所有的服务都在一台主机上,就会导致服务器负荷过重,无法保证业务的正常运作。正因如此,后来企业就更换了一种思路,将不同服务分开,分别存放在不同主机上,暂时解决了负荷问题。但是久而久之,这样的方式也开始显现弊端,比如当用户需要使用不同服务器上的服务协作来完成任务时,服务与服务之间该如何交互?

 

这就是RPC要解决的问题,简言之,RPC可以允许一台机器上的程序调用另一台机器上的函数,通过各计算机协作进行计算,以保证用户任务顺利完成

 

接下来我们详细说说RPC的原理。

RPC原理

同AD域内的大多数协议一样,RPC也采用的是请求响应模式。通常的请求响应,只需要客户端和服务器直接做交互就行了,但在RPC中,增加了两个处理过程,即客户端存根和服务器存根。

 

此存根的作用为:当客户端想调用服务器上的某函数时,需要把客户端的参数提供给服务器。而为了保证参数的保密、完整、可用和响应的高效性,客户端需要对传输过程做些特殊处理,包括将数据序列化、封装数据、寻址、传递数据等。

 

如果这一系列复杂行为都由客户端来操作,将会耗时耗力,所以RPC就建立了一个存根,让它来协调管理这些过程,减轻客户端负担。

 

在存根的作用下,客户端将参数递交给它,后续只需要等待接收服务器返回的数据就行了。因此,用户其实是感受不到这个跟服务器交互的过程的,这一切似乎都像在本机上完成的一样。

 

以上内容,我们提到存根的一个重要作用——序列化。

 

所以,什么是序列化?

 

客户端把参数交给存根后,如果存根直接将参数交给服务器,当服务器的系统与客户端不一样时,服务器就不能解析该参数,也无法调用相应函数,等于客户端也就得不到正确的返回结果。

 

为了让服务器能正确解析客户端的参数,我们就需要将参数转化成服务器能理解的方式。

 

在RPC中,客户端存根就把要传递的数据信息序列化成二进制,以方便服务器识别并处理。

 

这里的数据信息不单包括参数,还有要调用的函数ID。客户端存根将它们统一序列化成二进制后,打包递交给传输层。

 

传输层使用TCP协议,所以RPC中,上层传递下来的二进制信息需要进一步封装在TCP包中,寻址后发送给相应的服务器。

 

可都封装好了,为什么要有寻址这一步骤呢?

 

简而言之,寻址的重要作用就是找到该函数对应的服务器地址。但是企业环境中,各服务分散在不同的服务器上,如果都由客户端来“记忆”,将导致巨大的资源浪费。为了方便查询分散的服务地址,RPC中会将所有服务和对应地址都集中在一起,这个集中了所有服务地址的机器就是注册中心。

 

通过注册中心,客户端和服务器可以更方便地交互。

 

对服务器来说,它每增加或注销一项服务就通知注册中心进行更改,而不必一一告知客户端。对客户端来说,它也不必记住每一项服务所在地址,也不用管服务地址是否有变化。只需要在申请服务时,从注册中心查找到服务地址,向该地址发送数据包就行了。也就是说服务端的变化对客户端几乎没有影响。

 

数据包传递到服务器后,先由传输层对其解析,得到序列化过的二进制包。

 

要把这个二进制包转化成服务器能理解的数据格式,就需要与序列化相对的反序列化。

 

通常在服务器上,同样拥有一个服务端存根,它和客户端存根的作用一样,用来管理RPC过程中的大部分事务,反序列化也由它来完成。

 

在这里,服务端存根对二进制包反序列化,得到参数和要调用的函数ID,然后递交给服务器。服务器计算后得到结果,返回给客户端。

 

RPC中,结果返回时,同样需要服务端存根来对其进行序列化后传输,客户端收到响应数据包后由客户端存根再次对其反序列化,得到结果。

 

这样,在RPC协议规范下,客户端就成功调用了服务端的函数来完成计算。

结语

相比于HTTP等传输协议,RPC将数据序列化成二进制,直接在传输层上与服务端交互,极大地提高了传输效率。并且使用存根来管理RPC的底层过程,让客户端和服务端的交互变得透明,从而为用户提供了方便。

 

不过,抛开传输效率的便利,RPC中同样也存在很多安全威胁,比如Zerologon(CVE-2020-1472)、Printnightmare(CVE-2021-34527)等,攻击者利用这些漏洞,可以直接通过RPC协议连接服务器,并向其发送恶意代码,从而获取控制目标服务器的权限,这也是使用协议时要提防的一个方向。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 9024
活跃值: (6245)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
坚持一个规则,服务器绝不向客户端发送call类型的调用就行了吧?
2023-6-8 16:03
0
游客
登录 | 注册 方可回帖
返回
//