大型系统中的证书管理
大型系统中的证书管理
随着安全的要求,现在我们在越来越多的通信中使用 TLS 加密。下图是一个微服务架构下数据流向的例子
蓝色部分,即和三方交互时需要 TLS 加密认证
红色部分,各个微服务、消息中间件等通信需要 TLS 加密认证
绿色部分,各个微服务和存储层通信也需要 TLS 加密认证
安全上对我们的要求逐步变化为,仅蓝色使用 TLS=》蓝色和红色使用 TLS=》全部使用 TLS 加密
证书管理的必要性
从安全的角度上来说,我们最好能支持证书的更换和热加载。如果您的业务当前使用加密的场景不多,可能暂时看不到证书管理的意义。但是当你在各个方面使用 TLS 更加频繁之后,会发现证书管理可带来如下好处:
可以通过抽象出场景,通过场景和证书的关联联系,在各个地方通信使用的证书,可以统一更换。
统一提供证书过期告警等功能
统一提供证书的变更通知,通知到各个实例
以我在工作中接触到的两个基础 PAAS 平台,都有证书管理的功能,可见证书管理的必要性。
PS: 开源组件大多都拥有证书配置能力,没有可对接证书管理的能力,但这个能力很难贡献给社区,需要自己开发。
证书管理概念
在 TLS 会话中,从依赖的证书文件角度来看,可以分为加密流程和验证流程。
加密证书
TLS 加密流程的证书,包含证书链文件和密钥
验证证书
TLS 验证流程的证书,仅包含证书链文件
拆分为加密流程和验证流程的合理性
这使得加密流程证书和验证流程证书可以互相独立的替换,更方便在大型场景下复用证书。
让我们来假设如下的场景:
客户 A、客户 B、客户 C、客户 D 的验证流程证书自然不相同,但服务跟客户交互的时候,使用的加密流程证书确实同一份。如果将两个阶段的证书合一,那么在更换证书的时候,就需要更新 4 份数据,当你有 1000 名用户的时候,这个数字将会是 1000,这对于存储和应用程序来说都是不小的冲击。
Scene
Scene 是在一个会话中,代表会话和请求证书、验证证书的绑定关系。Scene 和请求证书、验证证书都是 1:1 的关系。这使得我们不仅仅可以修改证书文件,也可以对 TLS 会话中使用的证书进行修改。在证书无法复用,且证书绑定了多个场景的时候,针对单个场景修改其绑定的证书。
以上图作为例子,假设客户 D 有特殊的要求,要求加密流程使用特定的证书或密钥,我们就可以将客户 D 的场景绑定到客户 D 独有的加密证书
多集群管理
如果证书管理需要管理多个集群,那么证书和 Scene 前面可以加上层级来隔离,如环境、集群等。
对小型系统的建议
如果规模不大,且 TLS 场景有限,需要考虑一下有无拆分加密证书和验证证书的必要,可以合一,应用程序直接以合一的证书 id 来关联,而非场景 id。虽不方便复用,但大大降低了复杂性。
证书管理的功能
证书管理场景
设定一个 TLS 会话
使用 TLS 会话
这要求应用程序持久化场景信息
组织架构相关
大型系统下,证书管理是一个必须的组件,且一定是由团队最底层的组织架构承接。如若不然,那么由底层组织架构维护的组件,因为依赖关系,无法基于证书管理来统一实现证书的更换和过期告警。除非不基于证书管理自己构筑一套能力。
TLTR
随着组件和使用加密场景的不断扩大,证书管理是一个必须的组件,通过抽象出场景的概念来复用证书,通过变更通知在微服务模式下快速更换所有微服务实例上的证书,并提供统一的证书过期告警功能来提醒管理员更换证书。
版权声明: 本文为 InfoQ 作者【张俭】的原创文章。
原文链接:【http://xie.infoq.cn/article/deb9534ec32f9e501df5eee2b】。文章转载请联系作者。
评论