如何在 Kubernetes 中限制对 "kube-system" 等命名空间的访问

How to restrict access for namespaces like "kube-system" in Kubernetes

我们希望为我们的客户提供一个预装应用程序的集群,因此希望为客户提供除我们提供的命名空间和系统命名空间(例如“kube-system”)之外的所有权利,以便他们看不到秘密中的敏感信息或破坏那里的任何东西。我们已经用 OPA 进行了测试,但不幸的是你不能在那里拦截 GET 请求,这意味着秘密仍然是可见的。 它也不适用于 RBAC,因为您不能拒绝访问那里的特定命名空间。

有办法实现吗?

谢谢并致以最诚挚的问候

吠陀

你绝对可以使用 OPA 来评估 GET 请求,而不是通过准入控制器(因为它最终决定了 Kubernetes 中将保留什么,而 GET 请求本质上只能读取)。您需要使用的是 Kubernetes authorization webhook, which you can add to the chain of authorizers consulted for any request. Here 关于该主题的一个非常好的博客 post。

需要考虑的一些注意事项:

  1. 您需要完全控制集群才能使用自定义授权方配置 API 服务器。目前,许多托管云产品无法做到这一点。
  2. Gatekeeper 等流行工具不支持,即您需要为此部署和管理“vanilla”OPA。

我通过为用户提供一个仅对命名空间具有权限的 ClusterRole 和一个对所有内容都具有权限的 ClusterRole 来解决该问题。我将命名空间的 ClusterRole 与 ClusterRoleBinding 绑定在一起,将另一个 ClusterRole 与 RoleBinding 绑定在一起。 为了让用户也对他动态创建的名称空间具有权限,他需要一个允许执行所有操作的 ClusterRole 上的 RoleBinding。

为了自动执行此操作,我使用工具 Argo-Events,它会在命名空间创建事件上触发 RoleBinding 部署。 使用 OPA,我可以防止用户更改或删除名称空间。