Saltar al contenido principal

🛡️ RBAC

RBAC (Control de Acceso Basado en Roles) decide quién puede hacer qué en el clúster. Une tres piezas:

PiezaAnalogíaEjemplo
Quién (Service Account, User o Group)La credencialapp-sa
Qué (Role)La lista de puertas permitidasleitor-pods
RoleBindingQuien entrega la lista a la credencialapp-sa-leitor

El clúster SaveinCloud ya viene con RBAC activo: sin un permiso explícito, la respuesta es siempre denegado.

info

RBAC se configura con kubectl. El Panel Nuvion no tiene una pantalla para este recurso.


🚀 Antes de comenzar​

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
aviso

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íntomaCausaSolución
Forbidden incluso con RoleBindingRoleBinding en otro namespaceCréelo en el mismo namespace del recurso
can-i responde noNombre de la Service Account o del Role incorrectoVerifique con kubectl describe rolebinding
role "x" not foundEl Role no existeCree 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!