🛡️ RBAC
RBAC (Control de Acceso Basado en Roles) decide quién puede hacer qué en el clúster. Une tres piezas:
| Pieza | Analogía | Ejemplo |
|---|---|---|
| Quién (Service Account, User o Group) | La credencial | app-sa |
| Qué (Role) | La lista de puertas permitidas | leitor-pods |
| RoleBinding | Quien entrega la lista a la credencial | app-sa-leitor |
El clúster SaveinCloud ya viene con RBAC activo: sin un permiso explícito, la respuesta es siempre denegado.
RBAC se configura con kubectl. El Panel Nuvion no tiene una pantalla para este recurso.
🚀 Antes de comenzar
- Tener el acceso al clúster configurado (vea Acceso al Clúster).
- Tener la Service Account
app-sa(Service Accounts) y el Roleleitor-pods(Roles). Si aún no los tiene, créelos rápidamente:
kubectl create serviceaccount app-sa
kubectl create role leitor-pods --verb=get,list,watch --resource=pods
🚀 1. Probar antes de dar el permiso
kubectl auth can-i list pods --as=system:serviceaccount:default:app-sa
Respuesta esperada: no
El comando kubectl auth can-i pregunta al clúster si una identidad tiene
determinado permiso. --as= hace la prueba en nombre de otra identidad.
🚀 2. Crear el RoleBinding
kubectl create rolebinding app-sa-leitor --role=leitor-pods --serviceaccount=default:app-sa
Salida esperada: rolebinding.rbac.authorization.k8s.io/app-sa-leitor created
El formato default:app-sa significa namespace:nombre-de-la-service-account.
🚀 3. Probar después del permiso
kubectl auth can-i list pods --as=system:serviceaccount:default:app-sa
kubectl auth can-i delete pods --as=system:serviceaccount:default:app-sa
kubectl auth can-i list services --as=system:serviceaccount:default:app-sa
Respuestas esperadas, en orden: yes, no, no. La Service Account puede leer
pods, pero no eliminar pods ni leer services.
🚀 4. Ver el RoleBinding
kubectl describe rolebinding app-sa-leitor
La salida muestra el Role (leitor-pods) y el Subject (app-sa).
🚀 5. Prueba real dentro de un pod (opcional)
Cree el archivo pod-rbac.yaml:
apiVersion: v1
kind: Pod
metadata:
name: pod-rbac
spec:
serviceAccountName: app-sa
containers:
- name: curl
image: curlimages/curl
command: ["sleep", "3600"]
kubectl apply -f pod-rbac.yaml
Cuando el pod esté Running, solicite la lista de pods usando el token de la Service Account:
kubectl exec pod-rbac -- sh -c 'curl -s --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://kubernetes.default.svc/api/v1/namespaces/default/pods | head -n 12'
La respuesta es una lista en JSON (PodList). Ahora intente leer services, lo que el
Role no permite:
kubectl exec pod-rbac -- sh -c 'curl -s --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://kubernetes.default.svc/api/v1/namespaces/default/services'
La respuesta trae "reason": "Forbidden", es decir, el acceso fue denegado.
🚀 6. Dar permiso en todo el clúster (ClusterRoleBinding)
Para que valga en todos los namespaces, use un ClusterRole con un ClusterRoleBinding:
kubectl create clusterrolebinding app-sa-leitor-geral --clusterrole=view --serviceaccount=default:app-sa
Evite dar cluster-admin. Ese rol libera todo en el clúster, y quien lo tenga
puede leer todos los Secrets y eliminar cualquier recurso.
✅ Cómo saber si funcionó
El paso 3 devuelve yes, no, no, y el paso 5 lista los pods pero niega los services.
Para ver todos los permisos de una identidad:
kubectl auth can-i --list --as=system:serviceaccount:default:app-sa
❗ Problemas comunes
Cómo leer un mensaje de error de permiso:
User "maria" cannot list resource "pods" in API group "" in the namespace "default"
Dice quién (maria), qué intentó hacer (list), en qué recurso (pods) y dónde (default). Falta un RoleBinding para esa identidad.
| Síntoma | Causa | Solución |
|---|---|---|
Forbidden incluso con RoleBinding | RoleBinding en otro namespace | Créelo en el mismo namespace del recurso |
can-i responde no | Nombre de la Service Account o del Role incorrecto | Verifique con kubectl describe rolebinding |
role "x" not found | El Role no existe | Cree el Role antes del RoleBinding |
🧹 Limpieza
kubectl delete pod pod-rbac
kubectl delete rolebinding app-sa-leitor
kubectl delete clusterrolebinding app-sa-leitor-geral
kubectl delete role leitor-pods
kubectl delete clusterrole leitor-nodes
kubectl delete serviceaccount app-sa
➡️ Próximo paso: Users
🧠 ¿Dudas?
¡Hable con nuestro equipo de soporte técnico de SaveinCloud!