作者:Rory McCune(Aqua Security)
准入控制[1]是 Kubernetes 安全的关键部分,与身份验证和授权一样。Webhook 准入控制器被广泛用于以各种方式帮助提高 Kubernetes 集群的安全性,包括限制工作负载的特权和确保部署到集群的镜像满足组织的安全需求。
但是,与添加到集群中的任何其他组件一样,安全风险也会出现。一个安全风险的例子是没有正确处理准入控制器的部署和管理。为了帮助准入控制器用户和设计者适当地管理这些风险,SIG Security 的安全文档[2]子小组花了一些时间为准入控制器开发一个威胁模型[3]。这种威胁模型考虑了可能由不正确使用准入控制器引起的风险,准入控制器可能允许安全策略被绕过,甚至允许攻击者未经授权地访问集群。
从威胁模型出发,我们开发了一套应被采用的安全最佳实践,以确保集群运营者在避免使用准入控制器的任何风险的同时,可以获得准入控制器的安全利益。
从威胁模型中,出现了几个关于如何确保准入控制器安全的主题。
webhook 配置
重要的是要确保集群中的任何安全组件都得到了良好的配置,这里的准入控制器也不例外。在使用准入控制器时,需要考虑几个安全最佳实践。
- 为所有 webhook 流量正确配置 TLS。API 服务器和准入控制器 webhook 之间的通信应该进行身份验证和加密,以确保可能处于网络位置的攻击者不能查看或修改该通信。为了实现这种访问,API 服务器和 webhook 必须使用来自受信任的证书颁发机构的证书,这样它们才能验证彼此的身份。
- 只允许通过身份验证的访问。如果攻击者可以向准入控制器发送大量的请求,他们可能会淹没服务,导致服务失败。确保所有访问都需要强身份验证,应该可以降低这种风险。
- 准入控制器失败封闭。这是一种权衡利弊的安全实践,因此集群操作员是否想要配置它将取决于集群的威胁模型。如果一个准入控制器失败封闭(fail closed),当 API 服务器不能从它获得响应时,所有部署都会失败。这将通过禁用准入控制器阻止攻击者绕过准入控制器,但是,这会破坏集群的操作。由于集群可以有多个 webhook,一种比较平衡的方法可能是对关键控制设置失败封闭,并较少的关键控制允许失败打开(fail open)。
- 定期检查 webhook 配置。配置错误可能会导致安全问题,所以检查准入控制器 webhook 配置以确保设置正确是很重要的。这种检查可以由基础架构作为代码扫描器自动完成,也可以由管理员手动完成。
准入控制的集群配置
在大多数情况下,集群使用的准入控制器 webhook 将被安装为集群中的一个工作负载。因此,重要的是要确保 Kubernetes 的安全特性能够很好地配置,这些特性会影响 Kubernetes 的运行。
- 限制RBAC[4]的权限。任何有权限修改 webhook 对象的配置或准入控制器使用的工作负载的用户都可能破坏它的操作。因此,务必确保只有集群管理员拥有这些权限。
- 防止特权的工作负载。容器系统的现实情况之一是,如果工作负载被赋予了特定的特权,它可能会爆发到底层集群节点,并影响该节点上的其他容器。当准入控制器服务在它们所保护的集群中运行时,确保对特权工作负载的任何需求都被仔细审查并尽可能地加以限制是很重要的。
- 严格控制系统外部访问。作为集群中的安全服务,准入控制器系统将访问敏感信息,如凭据。为了减少这些信息被发送到集群外部的风险,应该使用网络策略来限制准入控制器服务对外部网络的访问。
- 每个集群都有一个专用的 webhook。虽然有可能有服务于多个集群的准入控制器 webhook,但当使用该模型时,对 webhook 服务的攻击将在共享的地方产生更大的影响,这是有风险的。此外,当多个集群使用一个准入控制器时,复杂性和访问需求将会增加,使其更难确保安全。
准入控制器规则
任何用于 Kubernetes 安全的准入控制器的一个关键元素是它所使用的规则库。规则需要能够准确地达到他们的目标,避免假阳性和假阴性的结果。
- 定期测试和审查规则。准入控制器规则需要测试,以确保其准确性。它们还需要定期审查,因为 Kubernetes API 将随着每个新版本的变化而变化,规则需要随着每个 Kubernetes 版本的发布而评估,以了解任何可能需要的变化,以保持它们的最新。
参考资料
[1]准入控制: https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/
[2]安全文档: https://github.com/kubernetes/community/tree/master/sig-security#security-docs
[3]威胁模型: https://github.com/kubernetes/sig-security/tree/main/sig-security-docs/papers/admission-control
[4]RBAC: https://kubernetes.io/docs/reference/access-authn-authz/rbac/