Kubernetes RBAC — zarządzanie dostępem do klastra
Opublikowano: 10 kwietnia 2026 · Kategoria: Bezpieczeństwo / Kubernetes
Domyślny klaster Kubernetes często uruchamia się z kubeconfig dającym cluster-admin każdemu kto go posiada. To zasada "king of the castle" — jeden kubeconfig, pełne uprawnienia, zero granularności. RBAC (Role-Based Access Control) pozwala precyzyjnie zdefiniować kto, do jakich zasobów i z jakimi operacjami ma dostęp. Ten artykuł przeprowadzi Cię przez cały model RBAC: od zrozumienia Role i ClusterRole, przez tworzenie kubeconfig dla dewelopera, po audyt kto ma dostęp do czego w klastrze.
Model RBAC — cztery kluczowe zasoby
| Zasób | Zakres | Opis |
|---|---|---|
Role | Namespace | Definiuje uprawnienia w obrębie jednego namespace |
ClusterRole | Cały klaster | Uprawnienia do wszystkich namespace'ów lub zasobów globalnych (nodes) |
RoleBinding | Namespace | Przypisuje Role lub ClusterRole do użytkownika/grupy/SA w namespace |
ClusterRoleBinding | Cały klaster | Przypisuje ClusterRole globalnie (we wszystkich namespace'ach) |
Tworzenie Role i RoleBinding
# Role — uprawnienia read-only do podow i logów w namespace "production"
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
namespace: production
rules:
- apiGroups: [""] # "" = core API (pods, services, configmaps)
resources: ["pods", "pods/log"]
verbs: ["get", "list", "watch"]
- apiGroups: ["apps"]
resources: ["deployments", "replicasets"]
verbs: ["get", "list", "watch"]
---
# RoleBinding — przypisanie roli uzytkownikowi "jane"
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: jane-pod-reader
namespace: production
subjects:
- kind: User
name: jane # nazwa z certyfikatu lub OIDC token claim
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io # Quickcreate przez kubectl kubectl create role pod-reader \ --verb=get,list,watch \ --resource=pods,pods/log \ -n production kubectl create rolebinding jane-pod-reader \ --role=pod-reader \ --user=jane \ -n production # Weryfikacja kubectl get role,rolebinding -n production kubectl describe rolebinding jane-pod-reader -n production
ClusterRole i ClusterRoleBinding
# ClusterRole — monitoring: odczyt metryk z calego klastra
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: monitoring-reader
rules:
- apiGroups: [""]
resources: ["nodes", "namespaces", "pods", "services", "endpoints"]
verbs: ["get", "list", "watch"]
- apiGroups: ["metrics.k8s.io"]
resources: ["nodes", "pods"]
verbs: ["get", "list"]
---
# ClusterRoleBinding — dla grupy "monitoring-team" (np. z OIDC)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: monitoring-team-binding
subjects:
- kind: Group
name: monitoring-team # nazwa grupy z OIDC claims
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: monitoring-reader
apiGroup: rbac.authorization.k8s.io ServiceAccount dla aplikacji
# ServiceAccount dla aplikacji CI/CD (np. ArgoCD agent)
apiVersion: v1
kind: ServiceAccount
metadata:
name: deploy-agent
namespace: production
automountServiceAccountToken: false # nie montuj automatycznie — bezpieczniej
---
# Role z minimalnymi uprawnieniami dla agenta CI/CD
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: deploy-role
namespace: production
rules:
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "update", "patch"]
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: deploy-agent-binding
namespace: production
subjects:
- kind: ServiceAccount
name: deploy-agent
namespace: production
roleRef:
kind: Role
name: deploy-role
apiGroup: rbac.authorization.k8s.io
---
# Deployment uzywajacy dedykowanego SA (nie "default")
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
template:
spec:
serviceAccountName: deploy-agent # explicit SA
automountServiceAccountToken: false Tworzenie kubeconfig dla użytkownika
# 1. Generuj klucz prywatny i CSR dla "jane"
openssl genrsa -out jane.key 4096
openssl req -new -key jane.key -out jane.csr -subj "/CN=jane/O=dev-team"
# 2. Stwórz CertificateSigningRequest w K8s
cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: jane
spec:
request: $(base64 -w 0 jane.csr)
signerName: kubernetes.io/kube-apiserver-client
expirationSeconds: 31536000 # 1 rok
usages: ["client auth"]
EOF
# 3. Zatwierdz CSR (jako admin)
kubectl certificate approve jane
# 4. Pobierz certyfikat
kubectl get csr jane -o jsonpath='{.status.certificate}' | base64 -d > jane.crt
# 5. Stwórz kubeconfig dla jane
kubectl config set-cluster production-cluster \
--server=https://k8s-api.example.com:6443 \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--embed-certs=true \
--kubeconfig=jane-kubeconfig.yaml
kubectl config set-credentials jane \
--client-certificate=jane.crt \
--client-key=jane.key \
--embed-certs=true \
--kubeconfig=jane-kubeconfig.yaml
kubectl config set-context jane@production \
--cluster=production-cluster \
--user=jane \
--namespace=production \
--kubeconfig=jane-kubeconfig.yaml
kubectl config use-context jane@production --kubeconfig=jane-kubeconfig.yaml Audyt dostępów — kubectl auth can-i
# Sprawdz wlasne uprawnienia kubectl auth can-i get pods -n production kubectl auth can-i create deployments kubectl auth can-i "*" "*" # Czy jestem cluster-admin? # Sprawdz uprawnienia innego uzytkownika (impersonation — wymaga uprawnien) kubectl auth can-i delete pods --as=jane -n production # Sprawdz uprawnienia ServiceAccount kubectl auth can-i list deployments \ --as=system:serviceaccount:production:deploy-agent \ -n production # Pelny audyt — kto ma dostep do konkretnego zasobu kubectl get rolebindings,clusterrolebindings --all-namespaces \ -o custom-columns='KIND:kind,NAMESPACE:.metadata.namespace,NAME:.metadata.name,ROLE:.roleRef.name,SUBJECTS:.subjects[*].name' # Zainstaluj rbac-lookup (narzedzie do audytu) kubectl krew install rbac-lookup kubectl rbac-lookup jane kubectl rbac-lookup deploy-agent --kind serviceaccount