我们想为我们的客户提供一个预装应用程序的集群,因此希望给客户除我们提供的命名空间和系统命名空间(例如“kube-system”)之外的所有权利,以便他们看不到敏感信息秘密中的信息或破坏那里的任何东西。我们已经用 OPA 进行了测试,但不幸的是你不能在那里拦截 GET 请求,这意味着秘密仍然可以查看。它也不适用于 RBAC,因为您不能拒绝访问那里的特定命名空间。
有没有办法做到这一点?
谢谢和最好的问候
吠陀
我们想为我们的客户提供一个预装应用程序的集群,因此希望给客户除我们提供的命名空间和系统命名空间(例如“kube-system”)之外的所有权利,以便他们看不到敏感信息秘密中的信息或破坏那里的任何东西。我们已经用 OPA 进行了测试,但不幸的是你不能在那里拦截 GET 请求,这意味着秘密仍然可以查看。它也不适用于 RBAC,因为您不能拒绝访问那里的特定命名空间。
有没有办法做到这一点?
谢谢和最好的问候
吠陀
我通过给用户一个只对命名空间具有权限的 ClusterRole 和一个对所有东西都具有权限的 ClusterRole 来解决了这个问题。我将命名空间的 ClusterRole 与 ClusterRoleBinding 绑定,将另一个 ClusterRole 与 RoleBinding 绑定。因此,用户还拥有对他动态创建的命名空间的权限,他需要在 ClusterRole 上使用 RoleBinding 来允许执行所有操作。
为了自动执行此操作,我使用工具 Argo-Events,它在命名空间创建事件上触发 RoleBinding 部署。通过 OPA,我可以防止用户更改或删除命名空间。
您绝对可以使用 OPA 来评估 GET 请求,而不是通过准入控制器(因为它最终决定了将在 Kubernetes 中持久化的内容,而 GET 请求本质上只能读取)。您将要使用的是 Kubernetes授权 webhook,您可以将其添加到针对任何请求咨询的授权者链中。这是一篇关于该主题的非常好的博客文章。
需要考虑的一些注意事项: