Kubernetes API 服务器绕过风险
Kubernetes API 服务器是集群外部各方(用户和服务)与其交互的入口点。
作为此角色的一部分,API 服务器具有多个内置的安全控制措施,例如审计日志记录和准入控制器。但是,存在修改集群配置或内容以绕过这些控制措施的方法。
本页面介绍了如何绕过内置于 Kubernetes API 服务器中的安全控制措施,以便集群运营商和安全架构师可以确保适当地限制这些绕过方法。
静态 Pod
每个节点上的kubelet会加载并直接管理存储在命名目录中或从特定 URL 作为静态 Pod获取的任何清单文件。API 服务器不管理这些静态 Pod。攻击者如果对该位置具有写入权限,则可以修改从该来源加载的静态 Pod 的配置,或者可以引入新的静态 Pod。
静态 Pod 被限制访问 Kubernetes API 中的其他对象。例如,您无法配置静态 Pod 以从集群装载 Secret。但是,这些 Pod 可以执行其他安全敏感操作,例如使用hostPath
从底层节点装载。
默认情况下,kubelet 会创建一个镜像 pod,以便在 Kubernetes API 中可以看到静态 Pod。但是,如果攻击者在创建 Pod 时使用无效的命名空间名称,则它将不会在 Kubernetes API 中可见,并且只能通过具有访问受影响主机权限的工具发现。
如果静态 Pod 无法通过准入控制,kubelet 不会将 Pod 注册到 API 服务器。但是,Pod 仍然在节点上运行。有关更多信息,请参考kubeadm 问题 #1541。
缓解措施
- 仅在节点需要时启用 kubelet 静态 Pod 清单功能。
- 如果节点使用静态 Pod 功能,请将对静态 Pod 清单目录或 URL 的文件系统访问权限限制为需要访问的用户。
- 限制对 kubelet 配置参数和文件的访问,以防止攻击者设置静态 Pod 路径或 URL。
- 定期审计并集中报告对托管静态 Pod 清单和 kubelet 配置文件的目录或网络存储位置的所有访问。
kubelet API
kubelet 提供了一个 HTTP API,该 API 通常在集群工作节点上的 TCP 端口 10250 上公开。根据所使用的 Kubernetes 发行版,API 也可能在控制平面节点上公开。直接访问 API 允许公开有关节点上运行的 pod 的信息、这些 pod 的日志以及在节点上运行的每个容器中执行命令。
当 Kubernetes 集群用户具有对Node
对象子资源的 RBAC 访问权限时,该访问权限充当与 kubelet API 交互的授权。确切的访问权限取决于已授予的子资源访问权限,如kubelet 授权中所述。
对 kubelet API 的直接访问不受准入控制的约束,也不由 Kubernetes 审计日志记录。攻击者如果直接访问此 API,则可能能够绕过检测或阻止某些操作的控制措施。
kubelet API 可以配置为以多种方式对请求进行身份验证。默认情况下,kubelet 配置允许匿名访问。大多数 Kubernetes 提供商会将默认值更改为使用 Webhook 和证书身份验证。这允许控制平面确保调用者有权访问nodes
API 资源或子资源。默认的匿名访问不会与控制平面进行此断言。
缓解措施
- 使用诸如RBAC之类的机制,限制对
nodes
API 对象的子资源的访问权限。只有在需要时(例如,通过监视服务)才授予此访问权限。 - 限制对 kubelet 端口的访问。仅允许指定的受信任 IP 地址范围访问该端口。
- 确保kubelet 身份验证设置为 webhook 或证书模式。
- 确保在集群上未启用未经身份验证的“只读”Kubelet 端口。
etcd API
Kubernetes 集群使用 etcd 作为数据存储。etcd
服务侦听 TCP 端口 2379。唯一需要访问的客户端是 Kubernetes API 服务器以及您使用的任何备份工具。直接访问此 API 允许公开或修改集群中保存的任何数据。
对 etcd API 的访问通常通过客户端证书身份验证进行管理。etcd 信任的任何证书颁发机构颁发的任何证书都允许完全访问存储在 etcd 中的数据。
对 etcd 的直接访问不受 Kubernetes 准入控制的约束,也不由 Kubernetes 审计日志记录。攻击者如果具有对 API 服务器的 etcd 客户端证书私钥的读取权限(或可以创建新的受信任客户端证书),则可以通过访问集群密钥或修改访问规则来获取集群管理员权限。即使没有提升其 Kubernetes RBAC 权限,攻击者如果可以修改 etcd,也可以检索任何 API 对象或在集群中创建新的工作负载。
许多 Kubernetes 提供商将 etcd 配置为使用双向 TLS(客户端和服务器都验证彼此的证书以进行身份验证)。尽管该功能存在,但 etcd API 的授权没有得到广泛接受的实现。由于没有授权模型,任何具有对 etcd 的客户端访问权限的证书都可以用来获取对 etcd 的完全访问权限。通常,仅用于运行状况检查的 etcd 客户端证书也可以授予完全的读写访问权限。
缓解措施
- 确保 etcd 信任的证书颁发机构仅用于对该服务的身份验证目的。
- 控制对 etcd 服务器证书的私钥、以及对 API 服务器的客户端证书和密钥的访问。
- 考虑在网络级别限制对 etcd 端口的访问,以仅允许来自指定和受信任的 IP 地址范围的访问。
容器运行时套接字
在 Kubernetes 集群中的每个节点上,与容器交互的访问权限由容器运行时(或运行时,如果您已配置了多个运行时)控制。通常,容器运行时会公开一个 kubelet 可以访问的 Unix 套接字。攻击者如果访问此套接字,则可以启动新的容器或与正在运行的容器进行交互。
在集群级别,此访问权限的影响取决于在受损节点上运行的容器是否可以访问密钥或其他机密数据,攻击者可以使用这些数据将权限提升到其他工作节点或控制平面组件。
缓解措施
- 确保您严格控制对容器运行时套接字的文件系统访问权限。如果可能,请将此访问权限限制为
root
用户。 - 使用诸如 Linux 内核命名空间之类的机制,将 kubelet 与节点上运行的其他组件隔离。
- 确保您限制或禁止使用
hostPath
装载,这些装载直接或通过装载父目录包含容器运行时套接字。此外,hostPath
装载必须设置为只读,以减轻攻击者绕过目录限制的风险。 - 限制用户对节点的访问权限,尤其是限制对节点的超级用户访问权限。