Di episode ini kita akan coba bahas Kubernetes RBAC (Role-Based Access Control) dan RoleBinding untuk authorization. Kita akan mempelajari Role, ClusterRole, RoleBinding, ClusterRoleBinding, dan best practice untuk implementing fine-grained access control.

Catatan
Untuk kalian yang ingin membaca episode sebelumnya, bisa click thumbnail episode 32 di bawah ini
Di episode sebelumnya kita sudah belajar tentang ServiceAccount yang provide identity untuk Pod. Selanjutnya di episode 33 kali ini, kita akan coba bahas RBAC (Role-Based Access Control) dan RoleBinding, yang control apa yang authenticated user dan ServiceAccount bisa lakukan di cluster.
Catatan: Disini saya akan menggunakan Kubernetes Cluster yang di install melalui K3s.
Authentication answer "siapa kalian?" (ServiceAccount), sementara authorization answer "apa yang bisa kalian lakukan?" (RBAC). RBAC enable fine-grained access control, allowing kalian untuk grant specific permission ke user dan application based on principle of least privilege.
RBAC (Role-Based Access Control) adalah Kubernetes authorization mechanism yang regulate access ke cluster resource based on role assigned ke user atau ServiceAccount.
Bayangkan RBAC seperti building security - badge kalian (ServiceAccount) identify kalian, tapi RBAC determine floor mana yang bisa kalian access, pintu mana yang bisa kalian buka, dan action apa yang bisa kalian perform di setiap room.
Key RBAC component:
RBAC IllustrationRole define permission dalam specific namespace.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
namespace: default
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]Karakteristik:
ClusterRole define permission cluster-wide atau untuk cluster-scoped resource.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: node-reader
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "list", "watch"]Karakteristik:
RoleBinding grant Role permission ke subject dalam namespace.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: ServiceAccount
name: my-app-sa
namespace: default
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.ioKarakteristik:
ClusterRoleBinding grant ClusterRole permission cluster-wide.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: read-nodes
subjects:
- kind: ServiceAccount
name: monitoring-sa
namespace: monitoring
roleRef:
kind: ClusterRole
name: node-reader
apiGroup: rbac.authorization.k8s.ioKarakteristik:
Kubernetes resource belong ke API group:
rules:
# Core API group (empty string)
- apiGroups: [""]
resources: ["pods", "services", "configmaps"]
# apps API group
- apiGroups: ["apps"]
resources: ["deployments", "statefulsets"]
# rbac.authorization.k8s.io API group
- apiGroups: ["rbac.authorization.k8s.io"]
resources: ["roles", "rolebindings"]Kubernetes object yang bisa accessed:
resources:
- "pods"
- "services"
- "deployments"
- "configmaps"
- "secrets"
- "persistentvolumeclaims"Restrict access ke specific resource instance:
rules:
- apiGroups: [""]
resources: ["configmaps"]
resourceNames: ["app-config", "app-secrets"]
verbs: ["get", "update"]Action yang bisa performed:
verbs:
- "get" # Read single resource
- "list" # List resource
- "watch" # Watch untuk change
- "create" # Create new resource
- "update" # Update existing resource
- "patch" # Partially update resource
- "delete" # Delete resource
- "deletecollection" # Delete multiple resourceAccess ke resource subresource:
rules:
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get"]
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["create"]# Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
namespace: production
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
---
# RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: production
subjects:
- kind: ServiceAccount
name: app-reader
namespace: production
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io# Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: deployment-admin
namespace: development
rules:
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
---
# RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: deployment-admin-binding
namespace: development
subjects:
- kind: ServiceAccount
name: deployer-sa
namespace: development
roleRef:
kind: Role
name: deployment-admin
apiGroup: rbac.authorization.k8s.io# ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-reader
rules:
- apiGroups: [""]
resources: ["pods", "services", "nodes"]
verbs: ["get", "list", "watch"]
- apiGroups: ["apps"]
resources: ["deployments", "statefulsets"]
verbs: ["get", "list", "watch"]
---
# ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cluster-reader-binding
subjects:
- kind: ServiceAccount
name: monitoring-sa
namespace: monitoring
roleRef:
kind: ClusterRole
name: cluster-reader
apiGroup: rbac.authorization.k8s.io# Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: app-manager
namespace: production
rules:
# Manage Deployment
- apiGroups: ["apps"]
resources: ["deployments", "replicasets"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
# Manage Service
- apiGroups: [""]
resources: ["services"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
# Read ConfigMap dan Secret
- apiGroups: [""]
resources: ["configmaps", "secrets"]
verbs: ["get", "list"]
# View Pod dan log
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list", "watch"]
---
# RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: app-manager-binding
namespace: production
subjects:
- kind: ServiceAccount
name: app-manager-sa
namespace: production
roleRef:
kind: Role
name: app-manager
apiGroup: rbac.authorization.k8s.ioKubernetes provide default ClusterRole:
Read-only access ke most resource:
kubectl get clusterrole view -o yamlPermission:
Read-write access ke most resource:
kubectl get clusterrole edit -o yamlPermission:
Full access dalam namespace:
kubectl get clusterrole admin -o yamlPermission:
Full cluster access:
kubectl get clusterrole cluster-admin -o yamlPermission:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: developer-view
namespace: development
subjects:
- kind: ServiceAccount
name: developer-sa
namespace: development
roleRef:
kind: ClusterRole
name: view # Built-in ClusterRole
apiGroup: rbac.authorization.k8s.ioCombine multiple ClusterRole:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: monitoring-role
aggregationRule:
clusterRoleSelectors:
- matchLabels:
rbac.example.com/aggregate-to-monitoring: "true"
rules: [] # Rule automatically filled by aggregation
---
# Component role 1
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: monitoring-pods
labels:
rbac.example.com/aggregate-to-monitoring: "true"
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
---
# Component role 2
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: monitoring-nodes
labels:
rbac.example.com/aggregate-to-monitoring: "true"
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "list", "watch"]# Check jika kalian bisa perform action
kubectl auth can-i create deployments
# Check untuk specific user/ServiceAccount
kubectl auth can-i get pods --as=system:serviceaccount:default:my-app-sa
# Check di specific namespace
kubectl auth can-i delete services --namespace=production
# List semua permission
kubectl auth can-i --list
kubectl auth can-i --list --as=system:serviceaccount:default:my-app-sa# Run command as ServiceAccount
kubectl get pods --as=system:serviceaccount:default:my-app-sa
# Run command as user
kubectl get pods --as=john@example.com# ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: cicd-deployer
namespace: default
---
# Role - Deploy application
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: deployer-role
namespace: production
rules:
# Manage Deployment
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "create", "update", "patch"]
# Manage Service
- apiGroups: [""]
resources: ["services"]
verbs: ["get", "list", "create", "update", "patch"]
# Manage ConfigMap
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get", "list", "create", "update", "patch"]
# Read Pod (untuk status checking)
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
---
# RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: cicd-deployer-binding
namespace: production
subjects:
- kind: ServiceAccount
name: cicd-deployer
namespace: default
roleRef:
kind: Role
name: deployer-role
apiGroup: rbac.authorization.k8s.io# ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: developer
namespace: development
---
# Role - Development environment access
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: developer-role
namespace: development
rules:
# Full access ke Deployment
- apiGroups: ["apps"]
resources: ["deployments", "replicasets"]
verbs: ["*"]
# Full access ke Service
- apiGroups: [""]
resources: ["services"]
verbs: ["*"]
# Full access ke ConfigMap
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["*"]
# Read-only Secret
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list"]
# Pod management
- apiGroups: [""]
resources: ["pods", "pods/log", "pods/exec"]
verbs: ["get", "list", "watch", "create", "delete"]
---
# RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: developer-binding
namespace: development
subjects:
- kind: ServiceAccount
name: developer
namespace: development
roleRef:
kind: Role
name: developer-role
apiGroup: rbac.authorization.k8s.io# ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: prometheus
namespace: monitoring
---
# ClusterRole - Read metric cluster-wide
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus-role
rules:
# Read node
- apiGroups: [""]
resources: ["nodes", "nodes/metrics", "nodes/stats"]
verbs: ["get", "list", "watch"]
# Read pod
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
# Read service
- apiGroups: [""]
resources: ["services", "endpoints"]
verbs: ["get", "list", "watch"]
# Read metric
- apiGroups: ["metrics.k8s.io"]
resources: ["nodes", "pods"]
verbs: ["get", "list"]
---
# ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: prometheus-binding
subjects:
- kind: ServiceAccount
name: prometheus
namespace: monitoring
roleRef:
kind: ClusterRole
name: prometheus-role
apiGroup: rbac.authorization.k8s.io# ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: namespace-admin
namespace: production
---
# RoleBinding - Gunakan built-in admin role
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: namespace-admin-binding
namespace: production
subjects:
- kind: ServiceAccount
name: namespace-admin
namespace: production
roleRef:
kind: ClusterRole
name: admin # Built-in ClusterRole
apiGroup: rbac.authorization.k8s.ioProblem: Giving cluster-admin ke everyone.
# Bad: Terlalu permissive
roleRef:
kind: ClusterRole
name: cluster-adminSolusi: Grant minimum necessary permission:
# Good: Specific permission
roleRef:
kind: ClusterRole
name: viewProblem: Granting cluster-wide access ketika namespace access sufficient.
# Bad: Cluster-wide access
kind: ClusterRoleBindingSolusi: Gunakan RoleBinding untuk namespace-scoped access:
# Good: Namespace-scoped
kind: RoleBinding
metadata:
namespace: productionProblem: Menggunakan wildcard (*) untuk everything.
# Bad: Terlalu broad
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]Solusi: Be specific:
# Good: Specific permission
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]Problem: Deploying RBAC tanpa testing.
Solusi: Selalu test:
kubectl auth can-i get pods --as=system:serviceaccount:default:my-app-saProblem: Wrong atau missing API group.
# Bad: Missing API group untuk deployment
rules:
- apiGroups: [""] # Wrong! Deployment ada di "apps"
resources: ["deployments"]Solusi: Gunakan correct API group:
# Good: Correct API group
rules:
- apiGroups: ["apps"]
resources: ["deployments"]Grant hanya necessary permission:
# Minimal permission
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"] # Hanya yang neededPrefer Role over ClusterRole:
# Good: Namespace-scoped
kind: Role
metadata:
namespace: productionGunakan view, edit, admin ketika appropriate:
roleRef:
kind: ClusterRole
name: view # Built-in rolemetadata:
name: app-manager
annotations:
description: "Manage application di production namespace"
permissions: "deployments, services, configmaps"Review RBAC regularly:
# List semua RoleBinding
kubectl get rolebindings --all-namespaces
# List semua ClusterRoleBinding
kubectl get clusterrolebindings
# Check specific permission
kubectl auth can-i --list --as=system:serviceaccount:default:my-app-sa# Reader role
kind: Role
name: pod-reader
# Writer role
kind: Role
name: pod-writer
# Admin role
kind: Role
name: pod-adminkubectl get roles
kubectl get roles --all-namespaces
kubectl get clusterroleskubectl get rolebindings
kubectl get rolebindings --all-namespaces
kubectl get clusterrolebindingskubectl describe role pod-reader
kubectl describe rolebinding read-pods
kubectl describe clusterrole view
kubectl describe clusterrolebinding cluster-adminkubectl get role pod-reader -o yaml
kubectl get rolebinding read-pods -o yaml# Delete Role
kubectl delete role pod-reader
# Delete RoleBinding
kubectl delete rolebinding read-pods
# Delete ClusterRole
kubectl delete clusterrole custom-role
# Delete ClusterRoleBinding
kubectl delete clusterrolebinding custom-bindingPada episode 33 ini, kita telah membahas RBAC dan RoleBinding di Kubernetes secara mendalam. Kita sudah belajar cara implement fine-grained access control menggunakan Role, ClusterRole, RoleBinding, dan ClusterRoleBinding.
Key takeaway:
RBAC fundamental untuk Kubernetes security. Dengan memahami dan properly implementing RBAC, kalian bisa ensure secure, controlled access ke cluster resource, protecting application dan data dari unauthorized access.
Bagaimana, makin jelas kan tentang RBAC dan RoleBinding di Kubernetes? Jadi, pastikan tetap semangat belajar dan nantikan episode selanjutnya!
Catatan
Untuk kalian yang ingin melanjutkan ke episode selanjutnya, bisa click thumbnail episode 34 di bawah ini