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

时间:2021-01-20 14:51:18

标签: kubernetes rbac open-policy-agent

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

有没有办法做到这一点?

谢谢和最好的问候

吠陀

2 个答案:

答案 0 :(得分:2)

您绝对可以使用 OPA 来评估 GET 请求,而不是通过准入控制器(因为这最终决定了将在 Kubernetes 中持久化的内容,而 GET 请求本质上只能读取)。您要使用的是 Kubernetes authorization webhook,您可以将其添加到针对任何请求咨询的授权者链中。 Here 是一篇关于该主题的非常好的博文。

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

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

答案 1 :(得分:2)

我通过给用户一个只拥有命名空间权限的 ClusterRole 和一个拥有所有权限的 ClusterRole 解决了这个问题。我将命名空间的 ClusterRole 与 ClusterRoleBinding 绑定,另一个 ClusterRole 与 RoleBinding 绑定。 为了让用户对他动态创建的命名空间也有权限,他需要在 ClusterRole 上有一个 RoleBinding,它被允许做所有事情。

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