Kubernetes RBAC

Kubernetes RBAC — roles, bindings, service accounts, and permission verification.

Inspect Existing RBAC

List roles and bindings
kubectl get roles -A
kubectl get rolebindings -A
kubectl get clusterroles | head -20
kubectl get clusterrolebindings | head -20
Describe a role to see its permissions
kubectl describe role pod-reader -n default
kubectl describe clusterrole admin
kubectl describe clusterrolebinding cluster-admin

Check Permissions

Test what a user or service account can do
kubectl auth can-i create pods                     # current user
kubectl auth can-i create pods --as=system:serviceaccount:default:myapp
kubectl auth can-i '*' '*'                         # am I cluster-admin?
kubectl auth can-i list secrets -n monitoring --as=jane
List all permissions for a service account
kubectl auth can-i --list --as=system:serviceaccount:default:myapp

Create Roles

Namespace-scoped Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
  namespace: default
rules:
- apiGroups: [""]
  resources: ["pods", "pods/log"]
  verbs: ["get", "list", "watch"]
Cluster-wide ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "list"]

Create Bindings

Bind a Role to a ServiceAccount
kubectl create rolebinding myapp-pod-reader \
  --role=pod-reader \
  --serviceaccount=default:myapp \
  -n default
Bind a ClusterRole across the cluster
kubectl create clusterrolebinding monitoring-reader \
  --clusterrole=view \
  --serviceaccount=monitoring:prometheus

Service Accounts

Create and use service accounts
kubectl create serviceaccount myapp -n default
kubectl get serviceaccount -n default
Get the token for a service account (Kubernetes 1.24+)
kubectl create token myapp -n default              # short-lived token
kubectl create token myapp -n default --duration=24h

Aggregated ClusterRoles

Built-in aggregation labels
# admin, edit, view are aggregated ClusterRoles
# Adding label rbac.authorization.k8s.io/aggregate-to-view: "true"
# to your ClusterRole automatically merges it into "view"
kubectl get clusterrole view -o yaml | grep -A5 aggregationRule

Troubleshooting

Debug access denied errors
# Check the error message for the missing permission
# Error: pods is forbidden: User "system:serviceaccount:default:myapp"
#   cannot list resource "pods" in API group "" in the namespace "monitoring"

# Verify bindings exist
kubectl get rolebindings,clusterrolebindings -A | grep myapp