Queremos proporcionar un clúster para nuestros clientes con aplicaciones preinstaladas y, por lo tanto, queremos otorgar al cliente todos los derechos excepto en los espacios de nombres proporcionados por nosotros y los espacios de nombres del sistema, como "kube-system", para que no puedan ver la información confidencial. información en secretos o romper cualquier cosa allí. Ya hemos probado con OPA, pero desafortunadamente no puede interceptar solicitudes GET allí, lo que significa que los secretos aún se podrán ver. Tampoco funciona con RBAC porque no puede denegar el acceso a un espacio de nombres en particular allí.
¿Hay una manera de lograr esto?
Gracias y un saludo
vedat
Definitivamente puede usar OPA para evaluar las solicitudes GET, solo que no a través del controlador de admisión (ya que en última instancia decide qué se mantendrá en Kubernetes, y las solicitudes GET, por naturaleza, solo se leen). Lo que querrás usar es un webhook de autorización de Kubernetes, que puedes agregar a la cadena de autorizadores consultados para cualquier solicitud. Aquí hay una publicación de blog bastante buena sobre el tema.
Algunas advertencias a tener en cuenta:
Resolví el problema dándole al usuario un ClusterRole que solo tiene permisos en espacios de nombres y un ClusterRole que tiene permisos en todo. Enlacé el ClusterRole para el espacio de nombres con un ClusterRoleBinding y el otro ClusterRole con un RoleBinding. Para que el usuario también tenga permisos en los espacios de nombres que crea dinámicamente, necesita un RoleBinding en el ClusterRole que puede hacer todo.
Para hacer esto automáticamente, uso la herramienta Argo-Events, que desencadena una implementación de RoleBinding en un evento de creación de espacio de nombres. Y con OPA evito que el usuario pueda cambiar o eliminar espacios de nombres.