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:
| Verb | Descrição |
|---|---|
get | Ler um recurso |
list | Listar recursos |
watch | Monitorar recursos |
create | Criar um recurso |
update | Atualizar um recurso |
patch | Modificar parcialmente um recurso |
delete | Excluir um recurso |
deletecollection | Excluir múltiplos recursos |
Wildcard: * para todas as ações.
Resources
Os resources são os objetos do Kubernetes:
pods,services,configmaps,secretsdeployments,replicasets,statefulsetsnodes,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