Saltar al contenido principal

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:

VerbDescripción
getLeer un recurso
listListar recursos
watchObservar recursos
createCrear un recurso
updateActualizar un recurso
patchModificar parcialmente un recurso
deleteEliminar un recurso
deletecollectionEliminar varios recursos

Wildcard: * para todas las acciones.


Resources​

Los resources son los objetos de Kubernetes:

  • pods, services, configmaps, secrets
  • deployments, replicasets, statefulsets
  • nodes, 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