Capítulo 9.1 - RBAC (Role-Based Access Control)
Objetivos de Aprendizaje
Al final de este capítulo, usted será capaz de:
- Comprender qué es RBAC y por qué utilizarlo
- Crear Roles y ClusterRoles
- Crear RoleBindings y ClusterRoleBindings
- Comprender los verbs y resources
- Gestionar los permisos de usuarios y Service Accounts
- Aplicar el principio de menor privilegio
Introducción
RBAC (Role-Based Access Control) es el mecanismo de autorización de Kubernetes que permite controlar quién puede hacer qué en el clúster. Es esencial para la seguridad y el cumplimiento.
Conceptos Clave
Roles vs ClusterRoles
Role: Permisos en un namespace específico
ClusterRole: Permisos a nivel de clúster (todos los namespaces)
RoleBindings vs ClusterRoleBindings
RoleBinding: Vincula un Role a usuarios en un namespace
ClusterRoleBinding: Vincula un ClusterRole a usuarios a nivel de clúster
Creación de un Role
Role Básico
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] # Grupo API core (sin prefijo)
resources: ["pods"]
verbs: ["get", "watch", "list"]
Resultado: Permite leer los Pods en el namespace default.
Role con Múltiples Recursos
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: production
name: app-manager
rules:
- apiGroups: [""]
resources: ["pods", "services", "configmaps"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
- apiGroups: ["apps"]
resources: ["deployments", "replicasets"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
Creación de un ClusterRole
ClusterRole para Nodes
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: node-reader
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "watch", "list"]
Resultado: Permite leer los nodes en todo el clúster.
ClusterRole con ResourceNames
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
resourceNames: ["my-secret", "another-secret"]
verbs: ["get", "list"]
Resultado: Acceso solo a los secrets especificados.
Verbs (Acciones)
Los verbs definen las acciones permitidas:
| Verb | Descripción |
|---|---|
get | Leer un recurso |
list | Listar recursos |
watch | Observar recursos |
create | Crear un recurso |
update | Actualizar un recurso |
patch | Modificar parcialmente un recurso |
delete | Eliminar un recurso |
deletecollection | Eliminar varios recursos |
Wildcard: * para todas las acciones.
Resources
Los resources son los objetos de Kubernetes:
pods,services,configmaps,secretsdeployments,replicasets,statefulsetsnodes,namespaces,persistentvolumes- Etc.
Wildcard: * para todos los recursos.
RoleBinding
Vincular un Role a un Usuario
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: alice
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
Vincular un Role a un ServiceAccount
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: ServiceAccount
name: my-app-sa
namespace: default
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
Vincular un ClusterRole a un Usuario (Namespace Scope)
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-nodes
namespace: default
subjects:
- kind: User
name: bob
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: node-reader
apiGroup: rbac.authorization.k8s.io
Resultado: Bob puede leer los nodes, pero solo en el namespace default.
ClusterRoleBinding
Vincular un ClusterRole a Nivel de Clúster
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cluster-admin-binding
subjects:
- kind: User
name: admin
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
Resultado: El usuario admin tiene los permisos de cluster-admin en todo el clúster.
Roles Predefinidos
Kubernetes proporciona ClusterRoles predefinidos:
cluster-admin
Acceso completo al clúster:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-admin
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
- nonResourceURLs: ["*"]
verbs: ["*"]
admin
Acceso completo en un namespace:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: admin
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
edit
Puede modificar los recursos (excepto RBAC):
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: edit
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
- apiGroups: ["rbac.authorization.k8s.io"]
resources: ["*"]
verbs: [] # Sin acceso RBAC
view
Solo lectura:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: view
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["get", "list", "watch"]
Ejemplo Completo: Desarrollador
Paso 1: Crear el Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: development
name: developer
rules:
- apiGroups: [""]
resources: ["pods", "services", "configmaps", "secrets"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
- apiGroups: ["apps"]
resources: ["deployments", "replicasets"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
Paso 2: Crear el RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: developer-binding
namespace: development
subjects:
- kind: User
name: developer1
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: developer
apiGroup: rbac.authorization.k8s.io
Resultado: developer1 puede gestionar las aplicaciones en el namespace development.
Comandos Útiles
Verificación
# Ver los Roles
kubectl get roles
kubectl get rolebinding
# Ver los ClusterRoles
kubectl get clusterroles
kubectl get clusterrolebinding
# Detalles
kubectl describe role pod-reader
kubectl describe rolebinding read-pods
# Verificar los permisos
kubectl auth can-i create pods --namespace=default
kubectl auth can-i delete deployments --namespace=production
Prueba de Permisos
# Probar como usuario
kubectl get pods --as=developer1
# Ver los permisos de un usuario
kubectl auth can-i --list --as=developer1 --namespace=development
Buenas Prácticas
1. Principio de Menor Privilegio
Otorgar solo los permisos necesarios.
2. Roles Específicos
Crear roles específicos en lugar de usar cluster-admin.
3. Aislamiento de Namespaces
Utilizar namespaces para aislar los entornos.
4. Service Accounts
Utilizar Service Accounts para las aplicaciones en lugar de usuarios.
5. Auditoría
Activar el audit logging para rastrear los accesos.
Resumen
En este capítulo, usted ha aprendido:
RBAC: Control de acceso basado en roles
Roles: Permisos en un namespace
ClusterRoles: Permisos a nivel de clúster
RoleBindings: Vincular roles a usuarios/ServiceAccounts
Verbs: Acciones permitidas (get, list, create, update, delete, etc.)
Resources: Objetos de Kubernetes (pods, services, deployments, etc.)
Roles predefinidos: cluster-admin, admin, edit, view
Buenas prácticas: Menor privilegio, roles específicos, aislamiento
Próximos Pasos
Capítulo 9.2: Service Accounts
Capítulo 9.3: Network Policies
Lab 9.1: Configuración de RBAC para un Usuario
Capítulo creado el: Diciembre 2024