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