RBAC - Role-Based Access Control
RBAC (Role-Based Access Control) controls who can perform what actions in Kubernetes. It's essential for securing your cluster and following the principle of least privilege.
Overview
RBAC provides:
- Role Definitions - What actions can be performed
- Role Bindings - Who can perform those actions
- Service Account Security - Secure pod-to-API access
- Least Privilege - Minimal required permissions
- Audit Trail - Track who did what
RBAC Components
Roles and ClusterRoles
Role: Namespace-scoped permissions ClusterRole: Cluster-wide permissions
RoleBindings and ClusterRoleBindings
RoleBinding: Binds role to user/group in namespace ClusterRoleBinding: Binds cluster role cluster-wide
Common Roles
Developer Role
Allows developers to manage resources in their namespace:
yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: developer
namespace: devops-studio
rules:
- apiGroups: [""]
resources: ["pods", "services", "configmaps"]
verbs: ["get", "list", "create", "update", "delete"]
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "create", "update", "delete"]Read-Only Role
Allows viewing resources without modification:
yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: viewer
namespace: devops-studio
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["get", "list", "watch"]Admin Role
Full access to namespace:
yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: admin
namespace: devops-studio
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]Service Accounts
Create Service Account
yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: app-service-account
namespace: devops-studioBind Role to Service Account
yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: app-role-binding
namespace: devops-studio
subjects:
- kind: ServiceAccount
name: app-service-account
namespace: devops-studio
roleRef:
kind: Role
name: developer
apiGroup: rbac.authorization.k8s.ioUse Service Account in Pod
yaml
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
serviceAccountName: app-service-account
containers:
- name: app
image: nginx:latestBest Practices
Least Privilege
- Start with minimal permissions
- Add permissions only when needed
- Review permissions regularly
- Remove unused permissions
Service Account Security
- Use dedicated service accounts for each application
- Don't use default service account
- Limit service account permissions
- Rotate service account tokens
Role Design
- Namespace-scoped when possible
- Group related permissions
- Document why permissions are needed
- Review and audit regularly
Common Patterns
Read-Only Access
yaml
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["get", "list", "watch"]Deployment Management
yaml
rules:
- apiGroups: ["apps"]
resources: ["deployments", "replicasets"]
verbs: ["get", "list", "create", "update", "delete", "patch"]Secret Access
yaml
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list"]
resourceNames: ["app-secret"] # Specific secret onlyTroubleshooting
Permission Denied
bash
# Check user's permissions
kubectl auth can-i create deployments --namespace devops-studio
# Check service account permissions
kubectl auth can-i create pods --as=system:serviceaccount:devops-studio:app-service-account
# View role bindings
kubectl get rolebindings -n devops-studio
kubectl get clusterrolebindingsDebug Access Issues
bash
# Describe role binding
kubectl describe rolebinding <name> -n <namespace>
# Check service account
kubectl get serviceaccount -n <namespace>
kubectl describe serviceaccount <name> -n <namespace>