RBAC, Role-Based Access Control, determina qué identidades pueden realizar acciones sobre los recursos de la API de Kubernetes.

Una autorización se compone de tres elementos:
Subject → RoleBinding → Role → reglas permitidas- El
Subjectpuede ser un usuario, grupo o ServiceAccount. - El
Roledefine verbos, recursos y grupos de API. - El
RoleBindingasigna esas reglas al Subject dentro de un namespace.
RBAC es aditivo: Kubernetes suma todos los permisos obtenidos mediante Roles, ClusterRoles y Bindings. No existen reglas RBAC de denegación capaces de retirar un permiso concedido por otro Binding. Documentación oficial.
Escenario de ejemplo
Se creará el ServiceAccount lector-operaciones en donweb-lab. Podrá:
- Leer y observar pods.
- Consultar logs de pods.
- Leer Deployments y ReplicaSets.
No podrá:
- Leer Secrets.
- Crear, modificar o eliminar workloads.
- Ejecutar comandos dentro de pods.
- Acceder a recursos de otro namespace.
- Leer recursos globales como Nodes o PersistentVolumes.
Role, ClusterRole y sus Bindings
| Recurso | Define permisos | Alcance habitual |
|---|---|---|
Role | Sobre recursos namespaced | Un namespace |
ClusterRole | Sobre recursos globales o reglas reutilizables | Cluster |
RoleBinding | Asigna Role o ClusterRole | Un namespace |
ClusterRoleBinding | Asigna ClusterRole | Todo el cluster |
Un RoleBinding puede referenciar un ClusterRole, pero solo concede sus permisos sobre recursos namespaced del namespace del Binding.
Usa Role y RoleBinding cuando el acceso no necesite salir de un namespace. Kubernetes recomienda preferir permisos namespaced y evitar ClusterRoleBindings innecesarios. Buenas prácticas RBAC.
Requisitos previos
- Cluster Kubernetes con RBAC habilitado.
kubectlconfigurado con el contexto correcto.- Permisos para crear ServiceAccounts, Roles y RoleBindings.
- Namespace de ensayo.
- Acceso administrativo alternativo para corregir errores.
- Una matriz previa de acciones que deben permitirse y denegarse.
Paso 1: comprobar contexto y permisos administrativos
kubectl config current-context
kubectl version
kubectl get namespacesComprueba si tu identidad puede administrar RBAC en el namespace:
kubectl auth can-i create serviceaccounts \
-n donweb-lab
kubectl auth can-i create roles.rbac.authorization.k8s.io \
-n donweb-lab
kubectl auth can-i create rolebindings.rbac.authorization.k8s.io \
-n donweb-labNo utilices una cuenta cluster-admin para las operaciones diarias. Evita también agregar usuarios a system:masters, ya que ese grupo evita las comprobaciones RBAC y no puede limitarse mediante Bindings.
Paso 2: crear el namespace de ensayo
kubectl create namespace donweb-lab \
--dry-run=client \
-o yaml \
| kubectl apply -f -Comprueba:
kubectl get namespace donweb-labPaso 3: definir la matriz de permisos
Antes de escribir YAML, documenta el contrato de acceso:
| Acción | Resultado |
|---|---|
get, list, watch sobre pods | Permitido |
get sobre pods/log | Permitido |
get, list, watch sobre Deployments | Permitido |
| Leer Secrets | Denegado |
| Crear pods o Deployments | Denegado |
Usar pods/exec | Denegado |
| Acceder a otro namespace | Denegado |
| Acceder a recursos cluster-scoped | Denegado |
No empieces con permisos amplios para reducirlos después. Define primero las operaciones exactas que requiere la identidad.
Paso 4: crear el manifiesto RBAC
Guarda lo siguiente como rbac-lector.yaml:
apiVersion: v1
kind: ServiceAccount
metadata:
name: lector-operaciones
namespace: donweb-lab
automountServiceAccountToken: false
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: lector-operaciones
namespace: donweb-lab
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- pods/log
verbs:
- get
- apiGroups:
- apps
resources:
- deployments
- replicasets
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: lector-operaciones
namespace: donweb-lab
subjects:
- kind: ServiceAccount
name: lector-operaciones
namespace: donweb-lab
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: lector-operacionesEl grupo de API vacío "" representa los recursos core, como pods. Los Deployments y ReplicaSets pertenecen al grupo apps.
pods/log es un subrecurso distinto de pods. Permitir get pods no concede automáticamente acceso a sus logs.
El valor automountServiceAccountToken: false evita que las credenciales se monten automáticamente en cualquier Pod que use esta identidad. Si un workload necesita realmente consultar la API, habilita el token de forma explícita en ese Pod y conserva los permisos mínimos.
Paso 5: validar sin persistir
kubectl apply \
--dry-run=server \
-f rbac-lector.yamlRevisa las diferencias:
kubectl diff -f rbac-lector.yamlkubectl diff devuelve código 1 cuando existen diferencias y un código mayor ante un error. No ocultes indiscriminadamente el resultado con || true.
Comprueba también que el API server reconoce los recursos:
kubectl api-resources \
--api-group=rbac.authorization.k8s.ioPaso 6: aplicar y revisar los objetos
kubectl apply -f rbac-lector.yamlComprueba explícitamente los recursos RBAC. kubectl get all no los incluye:
kubectl get serviceaccount,role,rolebinding \
-n donweb-lab
kubectl describe role lector-operaciones \
-n donweb-lab
kubectl describe rolebinding lector-operaciones \
-n donweb-labRevisa que el RoleBinding apunte al Role y ServiceAccount esperados.
Paso 7: probar los permisos permitidos
Define la identidad completa:
SA='system:serviceaccount:donweb-lab:lector-operaciones'Comprueba pods:
kubectl auth can-i get pods \
--as="$SA" \
-n donweb-lab
kubectl auth can-i list pods \
--as="$SA" \
-n donweb-lab
kubectl auth can-i watch pods \
--as="$SA" \
-n donweb-labComprueba el subrecurso de logs:
kubectl auth can-i get pods \
--subresource=log \
--as="$SA" \
-n donweb-labComprueba Deployments:
kubectl auth can-i list deployments.apps \
--as="$SA" \
-n donweb-labTodos deben responder:
yesLa opción --as requiere que quien realiza la prueba tenga permiso para impersonar esa identidad. Si recibes un error de impersonación, la prueba debe ejecutarla un administrador autorizado.
Paso 8: probar las denegaciones
Un diseño de mínimo privilegio no queda validado únicamente con pruebas positivas.
Secrets
kubectl auth can-i get secrets \
--as="$SA" \
-n donweb-lab
kubectl auth can-i list secrets \
--as="$SA" \
-n donweb-labResultado esperado:
noLos permisos list y watch sobre Secrets también pueden revelar su contenido, no solo sus nombres. Seguridad de Secrets.
Creación de workloads
kubectl auth can-i create pods \
--as="$SA" \
-n donweb-lab
kubectl auth can-i create deployments.apps \
--as="$SA" \
-n donweb-labResultado esperado:
noCrear Pods o Deployments puede permitir montar Secrets, seleccionar ServiceAccounts más privilegiados o acceder a volúmenes del namespace. Por eso, el permiso para crear workloads representa una capacidad de escalada indirecta.
Ejecución dentro de pods
kubectl auth can-i create pods \
--subresource=exec \
--as="$SA" \
-n donweb-labResultado esperado:
nopods/exec utiliza normalmente el verbo create, no get.
Otro namespace
kubectl auth can-i list pods \
--as="$SA" \
-n defaultResultado esperado:
noRecursos globales
kubectl auth can-i get nodes \
--as="$SA"
kubectl auth can-i list persistentvolumes \
--as="$SA"Resultado esperado:
nokubectl auth can-i evalúa los permisos efectivos de la identidad, incluida la suma de todos sus Bindings. Referencia de kubectl auth can-i.
Paso 9: revisar todos los permisos efectivos
kubectl auth can-i --list \
--as="$SA" \
--namespace=donweb-labBusca permisos inesperados procedentes de otros RoleBindings o ClusterRoleBindings.
Para inventariar los Bindings:
kubectl get rolebindings \
--all-namespaces
kubectl get clusterrolebindingsDespués inspecciona los que contengan el ServiceAccount, su namespace o grupos amplios como system:serviceaccounts.
Eliminar una regla de este Role no revoca un permiso si otra vinculación continúa concediéndolo.

Cómo utilizar el ServiceAccount desde un Pod
Un workload que necesite consultar la API puede declarar:
spec:
serviceAccountName: lector-operaciones
automountServiceAccountToken: trueEn versiones modernas de Kubernetes, el kubelet monta mediante TokenRequest un token temporal y rotatorio. Evita crear Secrets con tokens permanentes salvo que exista una necesidad específica y documentada. ServiceAccounts.
Para una prueba manual temporal:
kubectl create token lector-operaciones \
-n donweb-lab \
--duration=10mEl resultado es una credencial sensible. No la pegues en tickets, logs, capturas ni repositorios.
Restringir acceso a un objeto concreto
resourceNames puede limitar algunos verbos a objetos específicos:
rules:
- apiGroups:
- ""
resources:
- configmaps
resourceNames:
- configuracion-publica
verbs:
- getEsto permite leer únicamente el ConfigMap indicado.
resourceNames no puede restringir operaciones create o deletecollection. Para list y watch, el cliente debe enviar un field selector compatible con metadata.name.
Permisos que requieren una revisión especial
Evita conceder sin una justificación explícita:
- Recursos o verbos con
"*". - El ClusterRole
cluster-admin. - Membresía en
system:masters. - Lectura, listado o watch de Secrets.
- Creación o modificación de Pods y workloads.
pods/exec,pods/attachypods/portforward.nodes/proxy.serviceaccounts/token.- Los verbos
bind,escalateeimpersonate. - Gestión de certificados y su aprobación.
- Creación de PersistentVolumes.
- MutatingWebhookConfiguration y ValidatingWebhookConfiguration.
Los comodines incluyen recursos y subrecursos que puedan agregarse en el futuro, incluidos CRD nuevos. Una regla que parece aceptable hoy puede volverse excesiva tras una actualización.
Problemas frecuentes
El ServiceAccount no puede leer logs
Comprueba que el Role incluya:
resources:
- pods/log
verbs:
- getTambién puede necesitar get sobre pods para que la herramienta resuelva el nombre y estado del Pod.
Los permisos parecen mayores que los declarados
RBAC es aditivo. Revisa:
kubectl auth can-i --list \
--as="$SA" \
-n donweb-lab
kubectl get rolebindings -A
kubectl get clusterrolebindingsBusca otras vinculaciones que incluyan el ServiceAccount o grupos amplios.
El Role contiene la regla, pero el acceso se deniega
Comprueba:
- Namespace del RoleBinding.
- Nombre y namespace del ServiceAccount.
roleRef.- Grupo de API del recurso.
- Verbo correcto.
- Subrecurso correcto.
- Errores de mayúsculas o pluralización.
No puedo modificar roleRef
El campo roleRef de un RoleBinding es inmutable. Si necesitas enlazar otro Role:
kubectl delete rolebinding lector-operaciones \
-n donweb-lab
kubectl apply -f rbac-lector.yamlEl Pod no recibe un token
El ejemplo establece:
automountServiceAccountToken: falseEsto es intencional. Habilítalo explícitamente solo en workloads que necesiten acceder a la API.
Un usuario con permisos de Deployment puede leer Secrets indirectamente
Es posible crear un Deployment que monte Secrets o utilice otro ServiceAccount del namespace. La capacidad de crear workloads debe considerarse una frontera de confianza fuerte, incluso si no existe una regla directa sobre Secrets.
Monitoreo y revisión periódica
Registra y revisa:
- Cambios en Roles y ClusterRoles.
- Nuevos RoleBindings y ClusterRoleBindings.
- Uso de
cluster-admin. - Acceso a Secrets.
- Operaciones
pods/exec. - Creación de tokens.
- Impersonaciones.
- Errores de autorización repetidos.
- Cuentas y Bindings sin propietario vigente.
Combina RBAC con auditoría del API server, Pod Security Admission, NetworkPolicies y gestión segura de Secrets. RBAC controla la API, pero no reemplaza los demás controles.
Cómo revertir la configuración
kubectl rollout undo no revierte recursos RBAC.
Para cortar primero el acceso, elimina el RoleBinding:
kubectl delete rolebinding lector-operaciones \
-n donweb-labComprueba que el acceso haya sido revocado:
kubectl auth can-i list pods \
--as="$SA" \
-n donweb-labDespués elimina el Role y el ServiceAccount:
kubectl delete role lector-operaciones \
-n donweb-lab
kubectl delete serviceaccount lector-operaciones \
-n donweb-labTambién puedes aplicar una versión anterior del manifiesto:
kubectl apply -f rbac-lector-anterior.yamlRecuerda que otro Binding podría conservar permisos equivalentes. Vuelve a ejecutar todas las pruebas negativas después del rollback.

Buenas prácticas
- Define primero la matriz de acceso.
- Usa RoleBindings antes que ClusterRoleBindings.
- Evita comodines en recursos y verbos.
- Separa namespaces con niveles de confianza diferentes.
- Deshabilita el montaje automático de tokens cuando no sea necesario.
- Prefiere tokens temporales mediante TokenRequest.
- Prueba permisos permitidos y denegados.
- Revisa todos los Bindings efectivos.
- Documenta propietario, propósito y fecha de revisión.
- Elimina accesos obsoletos inmediatamente.