Menu
Szybki wybór
Hosting Domeny VPS SSL Kalkulator Porównania FAQ
Aktywne kody
Wszystkie kody rabatowe

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

Najczęstsze pytania

Czym różni się Role od ClusterRole w Kubernetes RBAC? +
Role jest ograniczona do jednego namespace — definiuje uprawnienia do zasobów tylko w tym namespace. ClusterRole jest globalna — dotyczy wszystkich namespace'ów lub zasobów nieobjętych namespace'em (nodes, persistentvolumes, clusterroles). RoleBinding może bindować ClusterRole do namespace (ograniczając jej zakres do jednego namespace), co jest użyteczne gdy chcesz standardowej roli (np. read-only) bez powielania jej w każdym namespace osobno.
Jak sprawdzić czy użytkownik ma uprawnienia do konkretnej operacji? +
Użyj kubectl auth can-i, np.: kubectl auth can-i get pods --namespace production (czy mam prawo listować pody w production?), kubectl auth can-i create deployments (w domyślnym namespace), kubectl auth can-i "*" "*" (czy jestem adminiem?). Możesz też sprawdzić za innego użytkownika: kubectl auth can-i delete pods --as=jane --namespace production. To bardzo przydatne do weryfikacji przed i po zmianie RBAC.
Co to jest ServiceAccount i kiedy go używać? +
ServiceAccount to tożsamość dla procesów działających wewnątrz podów — odpowiednik użytkownika K8s, ale dla aplikacji a nie ludzi. Każdy pod dostaje automatycznie domyślny ServiceAccount (o nazwie "default") z tokenem montowanym pod /var/run/secrets/kubernetes.io/serviceaccount/token. Jeśli aplikacja nie potrzebuje dostępu do K8s API, dodaj automountServiceAccountToken: false do Deployment. Jeśli potrzebuje (np. operator, CI/CD agent), stwórz dedykowany ServiceAccount z minimalnym RoleBinding.
Jak bezpiecznie dać deweloperowi dostęp do klastra K8s? +
Bezpieczny przepływ dla dewelopera: (1) Stwórz klucz prywatny + CSR (Certificate Signing Request), (2) Prześlij CSR przez Kubernetes CertificateSigningRequest API i zatwierdź przez kubectl certificate approve, (3) Stwórz kubeconfig z certyfikatem i adresem API serwera, (4) Stwórz RoleBinding przypisujący minimalną rolę (np. view albo custom read-only) tylko dla namespace developera. Nigdy nie dawaj cluster-admin deweloperom. Używaj namespace'ów jako granic dostępu.
Czym RBAC różni się od ABAC w Kubernetes? +
ABAC (Attribute-Based Access Control) to starsza metoda K8s — reguły definiowane w pliku JSON na każdym API serwerze, bez możliwości zarządzania przez kubectl. RBAC (Role-Based Access Control) jest dynamiczny — zarządzasz nim przez API K8s (kubectl create role, kubectl create rolebinding), zmiany działają natychmiast bez restartu. ABAC jest praktycznie deprecated — wszystkie nowe klastry używają RBAC (domyślnie włączone od K8s 1.8). RBAC jest też audytowalny przez kubectl get rolebindings --all-namespaces.

Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.