本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。

这是尚未发布的文档。 Admission Controller 1.34-dev.

威胁模型

Kubernetes安全特别兴趣小组(SIG)已为Kubernetes定义了准入控制威胁模型。SUSE Security Admission Controller团队不断依据该威胁模型对Admission Controller进行评估,并致力于提供安全默认设置。建议Admission Controller管理员阅读并理解该威胁模型,并根据需要使用它来制定自己的特定情况威胁模型。

有关每个威胁的详细信息请参见https://github.com/kubernetes/sig-security/tree/main/sig-security-docs/papers/admission-control[SIG安全发布的文档]。

Kubernetes威胁

威胁1 - 攻击者通过流量淹没Webhook,导致其无法操作

情景

在网络层面上,攻击者可以访问Webhook端点,可能会发送大量流量,导致准入控制器有效地拒绝服务。

缓解措施

Webhook失败时关闭。如果Webhook未能及时响应,出于任何原因,API服务器应拒绝该请求。 这是Admission Controller的默认行为。

失败时关闭意味着如果出于任何原因,Admission Controller停止响应或崩溃,API服务器默认拒绝该请求。 即使该请求通常被Admission Controller接受。

威胁2 - 攻击者传递需要复杂处理的工作负载,导致超时

情景

攻击者可以在网络层面访问准入控制器,向准入控制器传递需要复杂处理的请求,导致超时,因为准入控制器使用计算能力来处理工作负载。

缓解措施

Webhook失败时关闭并对调用者进行身份验证。 这是Admission Controller的默认行为。

威胁3 - 攻击者利用Webhook的错误配置绕过

情景

具有在集群中创建工作负载权限的攻击者能够利用错误配置来绕过预期的安全控制。

缓解措施

定期审查Webhook配置可以帮助发现问题。

威胁4 - 攻击者有权删除或修改Kubernetes Webhook对象

情景

具有Kubernetes API访问权限的攻击者拥有足够的权限删除集群中的Webhook对象。

缓解措施

RBAC权限应严格控制。

待办事项

大部分RBAC不在当前讨论的范围内。然而,以下内容将在适当的时候提供,以帮助Admission Controller用户:

  • 关于实施最低RBAC的指导。

  • 提供和文档化一个能够检测并阻止RBAC更改的策略。

威胁5 - 攻击者获得Webhook的有效凭证访问权限

情景

攻击者获得准入控制Webhook的有效客户端凭证。

缓解措施

Webhook失败关闭。 这是Admission Controller的默认行为。

威胁6 - 攻击者获得集群管理员凭证访问权限

情景

攻击者获得Kubernetes集群中的集群管理员级别凭证。

缓解措施

不适用

威胁7 - 攻击者在容器网络上嗅探流量

情景

具有容器网络访问权限的攻击者能够嗅探API服务器与准入控制Webhook之间的流量。

缓解措施

由于Webhook对所有流量使用TLS加密,Admission Controller是安全的。

威胁8 - 攻击者对Webhook进行中间人攻击

情景

在容器网络上的攻击者,具有NET_RAW能力,可以尝试使用中间人工具拦截API服务器与准入控制Webhook之间的流量。

缓解

为 Webhooks 配置带有 mTLS 认证的集群,并在 Admission Controller 堆栈中启用 mTLS 功能。或者,使用支持网络策略的 CNI 设置 mTLS。有关更多信息,请参阅 "使用互信 TLS 保护 Webhooks"

使用 capabilities-psp 策略,并将其配置为丢弃 NET_RAW 能力。

威胁 9 - 攻击者通过欺骗窃取 Webhook 的流量。

情景

攻击者可以通过欺骗,将原本发送给准入控制Webhook的 API 服务器流量重定向。

缓解

为 Webhooks 配置带有 mTLS 认证的集群,并在 Admission Controller 堆栈中启用 mTLS 功能。或者,使用支持网络策略的 CNI 设置 mTLS。有关更多信息,请参阅 "使用互信 TLS 保护 Webhooks"

威胁 10 - 滥用变更规则创建特权容器。

情景

攻击者能够导致变更入场控制器修改工作负载,从而允许创建特权容器。

缓解

审查并测试所有规则。

威胁 11 - 攻击者将工作负载部署到免于入场控制的命名空间。

情景

攻击者能够将工作负载部署到免于入场控制器配置的 Kubernetes 命名空间。

缓解措施

RBAC 权限受到严格控制。

待办事项

大多数 RBAC 不在此决策的范围内。然而,Admission Controller 团队的目标是:

  • 通过我们的文档警告用户,并 建议 使用最低限度的 RBAC。

  • 提供一个能够检测 RBAC 变更并*可能*阻止它们的策略。

威胁 12 - 由于缺少匹配(例如,缺少 initcontainers),阻止规则可能被绕过。

情景

攻击者创建了一个工作负载描述文件,使用了 Kubernetes API 的某个特性,而该特性未被准入控制器覆盖。

缓解

审查并测试所有规则。您应该审查更改任何政策部署中规则的 PR。

威胁 13 - 攻击者利用阻止列表上的错误字符串匹配绕过规则。

情景

具有创建工作负载权限的攻击者利用错误的字符串匹配绕过规则。

缓解

审查并测试所有规则。

待办事项

引入测试以覆盖此规则。 和往常一样,您应该审查更改政策部署中规则的 PR。

威胁 14 - 攻击者使用没有规则的 Kubernetes API 的新/旧功能。

情景

攻击者拥有创建工作负载的权限,利用 Kubernetes API 的新功能(例如,已更改的 API 版本)绕过规则。

缓解

审查并测试所有规则。有一项策略测试是否使用了已弃用的资源。它可以从 已弃用的 API 版本策略 获取。

deprecated-api-versions-policy 仅处理已知的自定义资源。威胁既包括已弃用的资源版本,也包括被误用的新未知版本,因此该策略仅覆盖部分问题。

威胁 15 - 攻击者在运行 Webhook 控制器的节点上部署特权容器。

情景

攻击者拥有在集群中部署特权容器的权限,在运行准入控制器 Webhook 的集群节点上创建特权容器。

缓解

准入控制器使用限制性策略来防止特权工作负载。

威胁 16 - 攻击者挂载特权节点主机路径,允许修改 Webhook 控制器配置。

情景

攻击者拥有在工作负载中部署 hostPath 卷的权限,创建一个允许访问准入控制器 Pod 文件的卷。

部署 kubewarden-default Helm 图表并启用其推荐的策略,其中包括 hostpaths-psp 策略。该策略配置为减少共享的 hostPath 卷。

威胁 17 - 攻击者对运行入场 Webhook 的集群节点具有特权 SSH 访问权限。

情景

威胁 17 - 攻击者对运行准入 Webhook 的集群节点具有特权 SSH 访问权限。

缓解措施

不适用

威胁 18 - 攻击者利用策略将入场请求中的机密数据发送到外部系统。

情景

威胁 18 - 攻击者利用策略将准入请求中的机密数据发送到外部系统。

攻击者能够配置一个侦听准入请求并将敏感数据发送到外部系统的策略。

  • 为 Webhooks 配置带有 mTLS 认证的集群,并在 Admission Controller 堆栈中启用 mTLS 功能。或者,使用支持网络策略的 CNI 设置 mTLS。

  • 默认情况下,Admission Controller 策略没有网络访问权限,并在受限环境中运行,严格控制 Webhooks 的外部访问。

Admission Controller 威胁

Admission Controller 威胁 1 - 为准入控制器建立信任。

情景

假设有一个受信任的新 Kubernetes 集群,攻击者有可能在部署前破坏 Admission Controller 堆栈,从而绕过任何保护策略的执行。

例如,通过:

  • 使用未签名和恶意的镜像进行:

    • Admission Controller-控制器

    • 策略服务器

    • 任何 Admission Controller 依赖项

    • 任何可选依赖项(Grafana、Prometheus 等)

  • 通过破坏 Helm 图表的有效载荷

缓解

  1. Admission Controller 提供软件材料清单,列出所需的所有镜像。这有助于实现零信任。Kubernetes 管理员必须在受信任的环境中验证 Admission Controller 镜像、其依赖项的镜像和图表。例如,您可以使用 cosign。顺便说一下,这是隔离的安装所需的实现的一部分。

  2. 请使用签名的 Helm 图表,并对这些 Helm 图表中的 Admission Controller 镜像采用经过验证的摘要,而不是标签。不过,这并不能确保依赖项的安全性。