RBAC (Role-Based Access Control) controla quem pode fazer o quê no cluster Kubernetes, baseado em roles e bindings.
Conceito Geral
- Role: define permissões (verbos + recursos) em um namespace
- ClusterRole: define permissões no cluster inteiro
- RoleBinding: associa Role a usuários/grupos/serviceaccounts
- ClusterRoleBinding: associa ClusterRole globalmente
Requisição (kubectl/API)
↓
Autenticação (quem é você?)
↓
Autorização RBAC (o que pode fazer?)
↓
Subject (User/ServiceAccount/Group)
↓
Binding (Role/ClusterRole)
↓
Permissões (get, list, create, delete...)
↓
Recursos (pods, services, nodes...)
↓
Permitido ou Negado
Criar Service Account
kubectl create serviceaccount app-sa -n production
Role (Namespace Scope)
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: production
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
ClusterRole (Cluster Scope)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: node-reader
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "list"]
RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: production
subjects:
- kind: ServiceAccount
name: app-sa
namespace: production
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: read-nodes
subjects:
- kind: ServiceAccount
name: app-sa
namespace: production
roleRef:
kind: ClusterRole
name: node-reader
apiGroup: rbac.authorization.k8s.io
Verificar Permissões
# Verificar se pode executar ação
kubectl auth can-i create deployments --namespace production
# Como outro usuário
kubectl auth can-i list pods --namespace production --as app-sa
# Listar todas as permissões
kubectl auth can-i --list --namespace production
Criar Usuário com Certificado
# Gerar chave privada
openssl genrsa -out developer.key 2048
# Criar CSR
openssl req -new -key developer.key -out developer.csr -subj "/CN=developer/O=dev-team"
# Assinar com CA do cluster
openssl x509 -req -in developer.csr \
-CA /etc/kubernetes/pki/ca.crt \
-CAkey /etc/kubernetes/pki/ca.key \
-CAcreateserial \
-out developer.crt -days 365
# Adicionar ao kubeconfig
kubectl config set-credentials developer \
--client-certificate=developer.crt \
--client-key=developer.key
kubectl config set-context developer-context \
--cluster=kubernetes \
--namespace=development \
--user=developer
Audit Policy
# /etc/kubernetes/audit-policy.yaml
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
resources:
- group: ""
resources: ["secrets", "configmaps"]
- level: RequestResponse
verbs: ["create", "update", "delete"]
Habilitar Audit no API Server
# No kube-apiserver.yaml
--audit-policy-file=/etc/kubernetes/audit-policy.yaml
--audit-log-path=/var/log/kubernetes/audit.log
--audit-log-maxage=30
Listar Roles e Bindings
kubectl get roles,rolebindings -n production
kubectl get clusterroles,clusterrolebindings
kubectl describe role pod-reader -n production