Pular para o conteúdo principal

🛡️ RBAC

RBAC (Controle de Acesso Baseado em Funções) decide quem pode fazer o quê no cluster. Ele junta três peças:

PeçaAnalogiaExemplo
Quem (Service Account, User ou Group)O cracháapp-sa
O quê (Role)A lista de portas permitidasleitor-pods
RoleBindingQuem 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.

informação

O RBAC é configurado com o kubectl. O Painel Nuvion não tem uma tela para esse recurso.


🚀 Antes de começar​

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
aviso

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.

SintomaCausaSolução
Forbidden mesmo com RoleBindingRoleBinding em outro namespaceCrie no mesmo namespace do recurso
can-i responde noNome da Service Account ou da Role erradoConfira com kubectl describe rolebinding
role "x" not foundRole não existeCrie 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!