Pular para o conteúdo principal

Capítulo 9.1 - RBAC (Role-Based Access Control)

Objetivos de Aprendizagem​

Ao final deste capítulo, você será capaz de:

  • Entender o que é RBAC e por que utilizá-lo
  • Criar Roles e ClusterRoles
  • Criar RoleBindings e ClusterRoleBindings
  • Entender verbs e resources
  • Gerenciar permissões de usuários e Service Accounts
  • Aplicar o princípio do menor privilégio

Introdução​

RBAC (Role-Based Access Control) é o mecanismo de autorização do Kubernetes que permite controlar quem pode fazer o quê no cluster. É essencial para segurança e conformidade.


Conceitos-Chave​

Roles vs ClusterRoles​

Role: Permissões em um namespace específico
ClusterRole: Permissões em nível de cluster (todos os namespaces)

RoleBindings vs ClusterRoleBindings​

RoleBinding: Vincula um Role a usuários em um namespace
ClusterRoleBinding: Vincula um ClusterRole a usuários em nível de cluster


Criação de um Role​

Role Básico​

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] # Grupo API core (sem prefixo)
resources: ["pods"]
verbs: ["get", "watch", "list"]

Resultado: Permite ler os Pods no namespace default.

Role com Múltiplos 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"]

Criação de um 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 ler os nodes em todo o cluster.

ClusterRole com 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: Acesso apenas aos secrets especificados.


Verbs (Ações)​

Os verbs definem as ações permitidas:

VerbDescrição
getLer um recurso
listListar recursos
watchMonitorar recursos
createCriar um recurso
updateAtualizar um recurso
patchModificar parcialmente um recurso
deleteExcluir um recurso
deletecollectionExcluir múltiplos recursos

Wildcard: * para todas as ações.


Resources​

Os resources são os objetos do Kubernetes:

  • pods, services, configmaps, secrets
  • deployments, replicasets, statefulsets
  • nodes, namespaces, persistentvolumes
  • Etc.

Wildcard: * para todos os recursos.


RoleBinding​

Vincular um Role a um Usuário​

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 um Role a um 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 um ClusterRole a um Usuário (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 pode ler os nodes, mas apenas no namespace default.


ClusterRoleBinding​

Vincular um ClusterRole em Nível de Cluster​

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: O usuário admin tem as permissões de cluster-admin em todo o cluster.


Roles Pré-definidos​

O Kubernetes fornece alguns ClusterRoles pré-definidos:

cluster-admin​

Acesso completo ao cluster:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-admin
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
- nonResourceURLs: ["*"]
verbs: ["*"]

admin​

Acesso completo em um namespace:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: admin
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]

edit​

Pode modificar recursos (exceto RBAC):

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: edit
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
- apiGroups: ["rbac.authorization.k8s.io"]
resources: ["*"]
verbs: [] # Sem acesso RBAC

view​

Somente leitura:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: view
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["get", "list", "watch"]

Exemplo Completo: Desenvolvedor​

Etapa 1: Criar o 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"]

Etapa 2: Criar o 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 pode gerenciar aplicações no namespace development.


Comandos Úteis​

Verificação​

# Ver Roles
kubectl get roles
kubectl get rolebinding

# Ver ClusterRoles
kubectl get clusterroles
kubectl get clusterrolebinding

# Detalhes
kubectl describe role pod-reader
kubectl describe rolebinding read-pods

# Verificar permissões
kubectl auth can-i create pods --namespace=default
kubectl auth can-i delete deployments --namespace=production

Teste de Permissões​

# Testar como usuário
kubectl get pods --as=developer1

# Ver permissões de um usuário
kubectl auth can-i --list --as=developer1 --namespace=development

Boas Práticas​

1. Princípio do Menor Privilégio​

Conceda apenas as permissões necessárias.

2. Roles Específicos​

Crie roles específicos ao invés de usar cluster-admin.

3. Isolamento por Namespace​

Use namespaces para isolar ambientes.

4. Service Accounts​

Use Service Accounts para aplicações ao invés de usuários.

5. Auditoria​

Ative o audit logging para rastrear acessos.


Resumo​

Neste capítulo, você aprendeu:

RBAC: Controle de acesso baseado em papéis
Roles: Permissões em um namespace
ClusterRoles: Permissões em nível de cluster
RoleBindings: Vincular roles a usuários/ServiceAccounts
Verbs: Ações permitidas (get, list, create, update, delete, etc.)
Resources: Objetos Kubernetes (pods, services, deployments, etc.)
Roles pré-definidos: cluster-admin, admin, edit, view
Boas práticas: Menor privilégio, roles específicos, isolamento


Próximos Passos​

Capítulo 9.2: Service Accounts
Capítulo 9.3: Network Policies
Lab 9.1: Configuração de RBAC para um Usuário


Capítulo criado em: Dezembro 2024