Niveles de permiso¶
Un permiso de kubelatch es siempre la combinación de un sujeto, un cluster, un nivel y un ámbito. Aquí ves qué permite cada nivel, dónde se puede conceder, qué exige y, sobre todo, qué no puede garantizar.
Los seis niveles¶
| Nivel | Qué permite | Ámbito | Exige PSA |
|---|---|---|---|
viewer |
Lectura de lo que incluye el rol view de Kubernetes: pods, pods/log, workloads, servicios, configmaps… sin secrets. Con ámbito *, además lectura de nodes, namespaces, persistentvolumes, storageclasses y CRDs. |
namespace o * |
No |
developer |
Todo lo de viewer más crear, modificar y borrar deployments, statefulsets, daemonsets, replicasets, jobs, cronjobs, pods, configmaps, services, persistentvolumeclaims, ingresses y horizontalpodautoscalers. |
namespace | Sí |
debugger |
Complemento: exec, attach y port-forward en pods, contenedores efímeros y lectura de pods y logs. |
namespace | Sí |
secrets-reader |
Complemento: lectura (get, list, watch) de secrets. |
namespace | No |
admin |
El rol admin de Kubernetes en el namespace. |
namespace | Sí |
cluster-admin |
El rol cluster-admin de Kubernetes en todo el cluster. Caducidad obligatoria de 8 h como máximo. |
* |
No |
Un sujeto puede tener varios permisos en el mismo cluster. Lo normal es combinarlos: developer en apps más debugger en apps para quien necesita entrar en sus pods.
Qué deja fuera developer, y por qué¶
developer no es el rol edit de Kubernetes. edit incluye secrets, pods/exec y serviceaccounts/token, que son justo lo que un permiso de trabajo diario no debería dar sin pensarlo. developer no tiene:
secrets,serviceaccountsniserviceaccounts/token;- los subrecursos
exec,attach,portforward,proxyyephemeralcontainersde los pods; roles,rolebindings,resourcequotasnilimitranges.
Esas capacidades quedan repartidas en niveles aparte (debugger, secrets-reader, admin) para que concederlas sea una decisión explícita y auditada.
El namespace es la frontera¶
Kubernetes lo dice en su propia documentación: las fronteras dentro de un namespace son débiles. kubelatch no puede cambiar eso, y conviene entenderlo antes de conceder nada.
Quien puede crear pods en un namespace puede montar cualquier Secret de ese namespace y usar cualquier ServiceAccount de ese namespace, con sus permisos. Por tanto:
- Quien tiene
developeren un namespace alcanza sus Secrets y sus ServiceAccounts, aunque el nivel no incluyasecrets. Le basta con desplegar un pod que los monte. secrets-readerydebuggerson comodidades, no fronteras. Ahorran desplegar un pod para leer un Secret o para inspeccionar otro, pero no protegen nada quedeveloperno alcance ya.- Los tokens de ServiceAccount obtenidos desde un pod no pasan por kubelatch. Lo que se haga con ellos queda en la auditoría nativa del cluster, no en la de kubelatch. Por eso conviene mantenerla activa en el proveedor.
La consecuencia práctica: concede developer, debugger y admin solo en namespaces cuyo contenido pueda ver y tocar esa persona. Lo que quieras separar entre equipos, sepáralo en namespaces distintos.
Pod Security Admission¶
Sin Pod Security Admission, quien crea pods puede crear uno privilegiado que monte el disco del nodo, y desde el nodo alcanza el cluster entero. Un contenedor efímero añadido con debugger puede hacer lo mismo.
Por eso developer, debugger y admin exigen que el namespace tenga la etiqueta pod-security.kubernetes.io/enforce con valor baseline o restricted. kubelatch lo comprueba al conceder el permiso, leyendo el namespace en el cluster.
KUBELATCH_REQUIRE_PSA=false desactiva la comprobación, y «Permisos» lo avisa en la cabecera. Solo tiene sentido si otra herramienta (OPA, Kyverno) impone lo mismo.
Namespaces protegidos¶
kube-system, kube-public, kube-node-lease y kubelatch-system no admiten permisos de ningún nivel. KUBELATCH_PROTECTED_NAMESPACES añade otros a la lista. Lo que haya que hacer ahí se hace con el acceso nativo de administración, fuera de kubelatch.
Ámbitos permitidos¶
*(todo el cluster) solo se admite conviewerycluster-admin.cluster-adminsolo se admite con*.- El resto de niveles solo se conceden sobre un namespace, que debe existir en ese cluster en el momento de conceder.
viewer con * ve también los logs de todos los namespaces, y los logs pueden contener secretos. Concédelo sabiendo eso.
cluster-admin como acceso de emergencia auditado¶
cluster-admin da control total del cluster. kubelatch lo trata como un acceso de emergencia: exige fecha de caducidad y no admite más de 8 h. Queda registrado quién lo concedió y a quién, y cada petición hecha con él queda en la auditoría. Es la vía preferida para una intervención urgente mientras kubelatch funciona.
Cómo se materializa en el cluster¶
El reconciliador traduce los permisos activos a RBAC estándar en cada cluster:
| Ámbito | Objeto que crea | Apunta a | Sujeto del binding |
|---|---|---|---|
| Namespace | RoleBinding kubelatch-<nivel> en ese namespace |
ClusterRole del nivel | Grupo kubelatch:ns:<namespace>:<nivel> |
* |
ClusterRoleBinding kubelatch-<nivel>-cluster |
ClusterRole del nivel | Grupo kubelatch:cluster:<nivel> |
Los bindings nunca nombran a personas: nombran grupos. El proxy usa la impersonación para actuar como cada persona con los grupos de sus permisos activos, y el API server aplica los bindings de esos grupos (ver El viaje de una petición).
viewer, developer, debugger y secrets-reader son ClusterRoles propios (kubelatch-<nivel>) agregados: sus reglas vienen de un ClusterRole base (kubelatch-<nivel>-base) y de cualquier otro ClusterRole con la etiqueta kubelatch.io/aggregate-to-<nivel>: "true". viewer recoge además todo lo etiquetado para el rol view estándar, y developer recoge todo lo de viewer. Así, añadir un CRD a un nivel es crear un ClusterRole pequeño con esa etiqueta, sin tocar kubelatch. admin y cluster-admin apuntan directamente a los roles de Kubernetes del mismo nombre.
Un binding existe mientras al menos un sujeto habilitado tenga un permiso activo con ese nivel y ese ámbito. El reconciliador lo crea al conceder, lo borra cuando sobra y recoge las caducidades en su pasada periódica. El proxy deja de enviar el grupo de un permiso caducado al instante, sin esperar a esa pasada.
Endurecimiento opcional
Un admin de namespace puede crear a mano un RoleBinding a kubelatch-developer. No da acceso a través de kubelatch, porque el proxy solo impersona a quien tiene permisos vigentes, pero confunde. deploy/k8s/hardening/vap-kubelatch-bindings.yaml es un ValidatingAdmissionPolicy que reserva esos bindings al reconciliador. Ver Modelo de seguridad.