去哪儿数据库自动化平台实践通讯协议
作者介绍:
钱芳园
专注数据库和数据库自动化领域的工程师,擅长MySQL、Redis运维以及基于go语言的数据库自动化开发。
一、背景
新一代去哪儿数据库自动化平台设计整体架构如下:
架构说明:
【1】平台是分层构建,不同层级的模块功能专注不同的功能,上图只是列出部分模块。
【2】Server是整个架构的初始化模块,也是整个平台的管控节点。
【3】Meta是整个架构的元数据中心。
【4】每个模块都是独立的存在,同一层级的模块之间可以相互调用,低层级的模块不能主动调用高层级的模块。
根据自动化平台的规划,平台需要部署一套Agent和各种Plugin在目标服务器上,Agent和Plugin具备执行各种命令、任务。但是AgentPlugin需要与Server之间传输一些敏感信息(密码、秘钥等),需要设计一套交互协议,防止敏感信息泄露,确保数据传输的安全性。二、目标
设计一套AgentPlugin和Server之间的通信协议,需要实现以下目标:满足功能上的需求,可以接受请求,执行命令和任务。确保敏感信息传输的安全性。对部分影响较大的请求进行认证。尽可能不依赖外部服务。三、分析通讯方式
目前主流两个服务之间的通讯方式有:httphttps、tcp、udp、rcp。
通讯方式
协议层
优点
缺点
tcpudp
传输层
完全可定制化的通讯协议,可以具备较高的安全性。
需要从底层实现一套复杂的通讯协议,开发成本非常高。
rpc
应用层
成熟的通讯协议,现有框架可以完整支持,可以在此基础上完成二次开发,并且性能较高。
需要指定的客户端才能通讯,调试不太方便,开发成本稍高。
httphttps
应用层
成熟的通讯协议,现有框架可以完整支持,可以在此基础上完成二次开发,并且客户端较多,调试非常方便。
相比rcp,性能较低,开发成本较低。
目前AgentPlugin和Server之间的通讯的性能要求不高,最主要的是满足功能上的需求和防止敏感信息泄露,方便开发、调试。故我们采用开发成本稍低的http协议。
需要加密的接口
AgentPlugin和Server之间通讯时,90的场景是获取一些非敏感性信息,例如:服务器信息、硬件信息等。如果这些非敏感的信息进行加密会大大浪费资源,增加双方的负担。故我们对含有非敏感信息的接口不采用加密的通讯方式,仅对含有敏感信息的接口进行加密传输。
加密协议
加密方式大致分为对称加密和非对称加密。两者主要的区别在于加密和解密的秘钥是否是同一个。对称加密
对称加密用的秘钥既可以用来加密明文数据,也可以用来解密密文数据,故被称之为对称加密。一般情况下对称加密的加密算法是公开的,一旦秘钥泄露则密文就会很容破解,所以对称加密的关键在于秘钥的安全管理。
加密过程如下:密文Func(明文,秘钥)
其中Func为加密算法。
解密过程如下:明文Func(密文,秘钥)
其中Func为加密算法。
对称加密算法主要有AES、DES、3DES等,由于DES和3DES在安全性方面不如AES,故现在不再推荐使用DES和3DES。
名称
密钥长度
运算速度
安全性
资源消耗
是否推荐
DES
56位
较快
低
中
不推荐
3DES
112位或168位
慢
中
高
不推荐
AES
128、192、256位
快
高
低
推荐非对称加密
非对称加密有一对秘钥,可以用其中任何一个秘钥来加密,用另一个秘钥来解密。一般情况下会把其中的一把秘钥公开,可以使用这个秘钥对任何数据进行加密,只要另一把秘钥不泄露就可以确保数据安全。为了区分这两个秘钥,可以公开的秘钥称为公钥,不能公开的秘钥称为私钥。
加密过程如下:密文Func(明文,公钥)
其中Func为加密算法。
解密过程如下:明文Func(密文,私钥)
其中Func为加密算法。
常见的非对称加密算法有RSA、DSA等。
名称
成熟度
安全性(取决于密钥长度)
运算速度
资源消耗
RSA
高
高
慢
高
DSA
高
高
慢
只能用于数字签名
ECC
低
高
快
低(计算量小,存储空间占用小,带宽要求低)
RSA加密算法是目前最有影响力的公钥加密算法,并且被普遍认为是目前最优秀的公钥方案之一。RSA是第一个能同时用于加密和数字签名的算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。
对称加密和非对称加密算法比较:
加密方式
优势
劣势
对称加密
速度快,资源消耗低
安全性不如非对称加密
非对称加密
安全性高
加解密速度低,资源消耗高
基于加密和解密速度上的考虑,目前AgentPlugin和Server之间采用对称加密算法。
流程设计流程图
图示以Agent和Server认证过程为例。Agent和Server之间都含有一个固定的key,这个key是编码在二进制代码中,无法访问。认证过程
1。agent启动时会收集自身和环境信息,并向server注册。
2。server收到注册请求之后,会针对本次请求的agent生成配置信息。随机生成一个securityKey(每个agent每次注册都会生成新的securityKey)。使用securityKey加密agent的原始配置信息。使用key加密securityKey。
3。server将配置信息(包含加密之后的securityKey)发送给agent。
4。agent收到配置信息后,使用对应的key解析securityKey,然后使用securityKey解密出原始的配置信息。请求过程
1。server生成token。生成包含server身份信息在内的服务信息。使用agent对应的securityKey加密服务信息。使用加密之后的服务信息生成token。
2。server向agent下发指令请求,并附加token。
3。agent收到请求之后,进行检查。解析token并获取服务信息。使用securityKey解密服务信息,并获取请求的身份信息。检查身份信息是否正确,如果检查错误则直接拒绝请求。
4。agent执行指令并返回结果。说明
1。agent和server共有的keykey只用于加密和解密sercurityKey,不用于其他用途,即使泄露也不会影响认证。agent和server是二进制编译部署,key不存在与配置文件中,key不会在网络中以任何形式传输。key不参与数据加密过程,即使server向agent请求时,key不相同认证也会通过。后面如果需要考虑替换掉key,只需要保证agent注册的时候server与agent的key相同就可以注册成功。
2。securityKey每个agent专属一个securityKey。每个agent启动注册均会随机生成一个securityKey,如果存在旧的securityKey则会被覆盖。securityKey是用来加密敏感信息,防止敏感信息。securityKey仅在注册过程中传输一次,并且只存在于agent的内存中,不会以任何形式存在于文件中。
3。token
token中包含加密之后的server身份信息,agent认证时会做如下检查:agent检查token身份信息是否符合要求,如果身份信息不符合要求则认证不予通过。agent会将身份信息与请求来源进行比较,如果不同则被认为token为非法
作者:钱芳园
来源:微信公众号:Qunar技术沙龙
出处:https:mp。weixin。qq。comsOtj6OxkSsq5cYG6VOSR2g