对于多主K8s群集,推荐的证书策略是什么?

时间:2018-08-07 23:07:08

标签: kubernetes kubernetes-security

多主K8s集群部署在每个服务,每个控制器节点上使用唯一的证书是否非典型?我见过的大多数指南会为每个服务(API,Controller,Scheduler)生成唯一的证书,然后将这些证书用于每个Controller节点上的同义服务。

Kubernetes是否禁止或阻止每个服务,每个节点的唯一证书?使用DNS / IP SAN,应该仍然可以使每个服务都响应单个群集地址,因此我很好奇这一决定是为了简化说明,还是我实际上缺少了某些要求。 / p>

谢谢。

1 个答案:

答案 0 :(得分:3)

  

Kubernetes是否禁止或阻止每个服务,每个站点的唯一证书   节点?使用DNS / IP SAN,应该仍然可以   服务响应单个群集地址,所以我很好奇   决定是为了更简单的说明,或者   实际上我缺少一些要求

当我们运行Kubernetes集群时,我们可以拥有成千上万的私钥和公钥,并且不同的组件通常不知道它们是否有效。因此,存在一个证书颁发机构,它是一个第三方实体,它告诉感兴趣的元素“此证书是受信任的”。

documentation

  

每个Kubernetes集群都有一个集群根证书颁发机构   (CA)。群集组件通常使用CA来验证   API服务器的证书,由API服务器验证kubelet客户端   证书等。

这实际上表明每个群集中可以有不同的证书,但这不是必须的,您可以想象CA的许多不同组合。您可以有一个负责对所有密钥进行签名的全局CA,也可以有一个CA用于每个群集,一个CA用于内部通信,一个CA用于外部,等等。

任何提出由群集CA签名的客户端证书的请求都将被视为已认证。在该身份验证过程中,应该可以从“通用名称”字段(CN)获取用户名,并从该证书的“组织”字段获取组。因此答案是肯定的,除非群集中的证书颁发机构对其签名,否则您可以对群集中的每个服务,节点或任何组件使用不同的证书。

为具有多个主服务器(HA群集)的主服务器创建证书时,必须确保负载均衡器IP和DNS名称是该证书的一部分。否则,每当客户端尝试通过LB通过API服务器进行通信时,客户端都会抱怨,因为证书上的通用名称不同于其想要与之通信的通用名称。

更进一步,每个核心集群组件除具有主证书外,还具有自己的客户端证书,因为它们每个对具有不同通用名称的集群都有不同的访问级别。 值得注意的是, kubelet 的证书名称稍有不同,因为每个kublet都具有不同的身份(运行kubelet的主机名将是证书的一部分),它与NodeAuthorizer和节点限制准入插件。从最小特权的角度来看,这些功能很重要-在另一种情况下,它们限制了kubelet与apiserver的无限制访问和交互。 使用此功能,您可以将kubelet限制为仅能够修改其节点资源而不是整个集群,因为同样地,它只能读取其节点机密,而不是集群中的所有机密,等等。

编辑-评论之后:

假设您要就为什么更多的人不使用多个证书征求意见,我认为这是因为它并没有真正提高安全性。由于证书不如CA重要,因此CA是实体之间可以安全地相互通信的可靠担保人。因此,您可以创建多个CA-其原因更多的是HA方法而不是安全性。当然,如果您拥有一个受信任的CA,则不需要更多的证书种类,因为通过增加证书种类的数量实际上并没有达到任何目标。