大型系统中的证书管理

大型系统中的证书管理#

随着安全的要求,现在我们在越来越多的通信中使用TLS加密。下图是一个微服务架构下数据流向的例子

cert-manager1

  • 蓝色部分,即和三方交互时需要TLS加密认证
  • 红色部分,各个微服务、消息中间件等通信需要TLS加密认证
  • 绿色部分,各个微服务和存储层通信也需要TLS加密认证

安全上对我们的要求逐步变化为,仅蓝色使用TLS=》蓝色和红色使用TLS=》全部使用TLS加密

证书管理的必要性#

从安全的角度上来说,我们最好能支持证书的更换和热加载。如果您的业务当前使用加密的场景不多,可能暂时看不到证书管理的意义。但是当你在各个方面使用TLS更加频繁之后,会发现证书管理可带来如下好处:

  • 可以通过抽象出场景,通过场景和证书的关联联系,在各个地方通信使用的证书,可以统一更换。
  • 统一提供证书过期告警等功能
  • 统一提供证书的变更通知,通知到各个实例

以我在工作中接触到的两个基础PAAS平台,都有证书管理的功能,可见证书管理的必要性。

PS: 开源组件大多都拥有证书配置能力,没有可对接证书管理的能力,但这个能力很难贡献给社区,需要自己开发。

证书管理概念#

在TLS会话中,从依赖的证书文件角度来看,可以分为加密流程和验证流程。

加密证书#

TLS加密流程的证书,包含证书链文件和密钥

验证证书#

TLS验证流程的证书,仅包含证书链文件

拆分为加密流程和验证流程的合理性#

这使得加密流程证书和验证流程证书可以互相独立的替换,更方便在大型场景下复用证书。

让我们来假设如下的场景:

cert-manager2

客户A、客户B、客户C、客户D的验证流程证书自然不相同,但服务跟客户交互的时候,使用的加密流程证书确实同一份。如果将两个阶段的证书合一,那么在更换证书的时候,就需要更新4份数据,当你有1000名用户的时候,这个数字将会是1000,这对于存储和应用程序来说都是不小的冲击。

Scene#

Scene是在一个会话中,代表会话和请求证书、验证证书的绑定关系。Scene和请求证书、验证证书都是1:1的关系。这使得我们不仅仅可以修改证书文件,也可以对TLS会话中使用的证书进行修改。在证书无法复用,且证书绑定了多个场景的时候,针对单个场景修改其绑定的证书。

以上图作为例子,假设客户D有特殊的要求,要求加密流程使用特定的证书或密钥,我们就可以将客户D的场景绑定到客户D独有的加密证书

多集群管理#

如果证书管理需要管理多个集群,那么证书和Scene前面可以加上层级来隔离,如环境、集群等。

对小型系统的建议#

如果规模不大,且TLS场景有限,需要考虑一下有无拆分加密证书和验证证书的必要,可以合一,应用程序直接以合一的证书id来关联,而非场景id。虽不方便复用,但大大降低了复杂性。

证书管理的功能#

cert-manager3

证书管理场景#

设定一个TLS会话#

cert-manager4

使用TLS会话#

这要求应用程序持久化场景信息

cert-manager5

组织架构相关#

大型系统下,证书管理是一个必须的组件,且一定是由团队最底层的组织架构承接。如若不然,那么由底层组织架构维护的组件,因为依赖关系,无法基于证书管理来统一实现证书的更换和过期告警。除非不基于证书管理自己构筑一套能力。

TLDR#

随着组件和使用加密场景的不断扩大,证书管理是一个必须的组件,通过抽象出场景的概念来复用证书,通过变更通知在微服务模式下快速更换所有微服务实例上的证书,并提供统一的证书过期告警功能来提醒管理员更换证书。