🛡️ RBAC
RBAC (Controle de Acesso Baseado em Funções) decide quem pode fazer o quê no cluster. Ele junta três peças:
| Peça | Analogia | Exemplo |
|---|---|---|
| Quem (Service Account, User ou Group) | O crachá | app-sa |
| O quê (Role) | A lista de portas permitidas | leitor-pods |
| RoleBinding | Quem entrega a lista ao crachá | app-sa-leitor |
O cluster SaveinCloud já vem com o RBAC ativo: sem uma permissão explícita, a resposta é sempre negado.
O RBAC é configurado com o kubectl. O Painel Nuvion não tem uma tela para esse recurso.
🚀 Antes de começar
- Ter o acesso ao cluster configurado (veja Acesso ao Cluster).
- Ter a Service Account
app-sa(Service Accounts) e a Roleleitor-pods(Roles). Se ainda não tiver, crie rapidamente:
kubectl create serviceaccount app-sa
kubectl create role leitor-pods --verb=get,list,watch --resource=pods
🚀 1. Testar antes de dar a permissão
kubectl auth can-i list pods --as=system:serviceaccount:default:app-sa
Resposta esperada: no
O comando kubectl auth can-i pergunta ao cluster se uma identidade tem
determinada permissão. O --as= faz o teste em nome de outra identidade.
🚀 2. Criar o RoleBinding
kubectl create rolebinding app-sa-leitor --role=leitor-pods --serviceaccount=default:app-sa
Saída esperada: rolebinding.rbac.authorization.k8s.io/app-sa-leitor created
O formato default:app-sa significa namespace:nome-da-service-account.
🚀 3. Testar depois da permissão
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
Respostas esperadas, na ordem: yes, no, no. A Service Account pode ler
pods, mas não apagar pods nem ler services.
🚀 4. Ver o RoleBinding
kubectl describe rolebinding app-sa-leitor
A saída mostra a Role (leitor-pods) e o Subject (app-sa).
🚀 5. Prova real dentro de um pod (opcional)
Crie o arquivo 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
Quando o pod estiver Running, peça a lista de pods usando o token da 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'
A resposta é uma lista em JSON (PodList). Agora tente ler services, que a
Role não 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'
A resposta traz "reason": "Forbidden", ou seja, o acesso foi negado.
🚀 6. Dar permissão no cluster inteiro (ClusterRoleBinding)
Para valer em todos os namespaces, use um ClusterRole com um ClusterRoleBinding:
kubectl create clusterrolebinding app-sa-leitor-geral --clusterrole=view --serviceaccount=default:app-sa
Evite dar cluster-admin. Esse papel libera tudo no cluster, e quem o tiver
pode ler todos os Secrets e apagar qualquer recurso.
✅ Como saber se deu certo
O passo 3 devolve yes, no, no, e o passo 5 lista os pods mas nega os services.
Para ver todas as permissões de uma identidade:
kubectl auth can-i --list --as=system:serviceaccount:default:app-sa
❗ Problemas comuns
Como ler uma mensagem de erro de permissão:
User "maria" cannot list resource "pods" in API group "" in the namespace "default"
Ela diz quem (maria), o que tentou fazer (list), em qual recurso (pods) e onde (default). Falta um RoleBinding para essa identidade.
| Sintoma | Causa | Solução |
|---|---|---|
Forbidden mesmo com RoleBinding | RoleBinding em outro namespace | Crie no mesmo namespace do recurso |
can-i responde no | Nome da Service Account ou da Role errado | Confira com kubectl describe rolebinding |
role "x" not found | Role não existe | Crie a Role antes do RoleBinding |
🧹 Limpeza
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 passo: Users
🧠 Dúvidas?
Fale com nosso time de suporte técnico da SaveinCloud!