Skip to content

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-studio

Bind 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.io

Use Service Account in Pod

yaml
apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  serviceAccountName: app-service-account
  containers:
  - name: app
    image: nginx:latest

Best Practices

Least Privilege

  1. Start with minimal permissions
  2. Add permissions only when needed
  3. Review permissions regularly
  4. Remove unused permissions

Service Account Security

  1. Use dedicated service accounts for each application
  2. Don't use default service account
  3. Limit service account permissions
  4. Rotate service account tokens

Role Design

  1. Namespace-scoped when possible
  2. Group related permissions
  3. Document why permissions are needed
  4. 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 only

Troubleshooting

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 clusterrolebindings

Debug 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>

Additional Resources

Released under the MIT License.