Implementing RBAC for Kubernetes Cluster
Overview
Configure Kubernetes Role-Based Access Control (RBAC) to enforce least-privilege access to cluster resources. This skill covers Role/ClusterRole design, RoleBinding configuration, service account security, namespace isolation, and audit logging for multi-tenant Kubernetes environments.
Objectives
- Design RBAC role hierarchy for multi-tenant clusters
- Create granular Roles and ClusterRoles for different personas
- Configure RoleBindings and ClusterRoleBindings with least privilege
- Secure service accounts and limit their default permissions
- Integrate RBAC with external identity providers (OIDC)
- Audit and monitor RBAC usage with Kubernetes audit logs
Key Concepts
RBAC API Objects
- Role: Namespace-scoped permissions (pods, services, deployments within a namespace)
- ClusterRole: Cluster-wide permissions (nodes, namespaces, PVs, CRDs)
- RoleBinding: Grants Role to users/groups/serviceAccounts in a namespace
- ClusterRoleBinding: Grants ClusterRole cluster-wide
Kubernetes RBAC Verbs
get, list, watch: Read-only operations
create, update, patch: Write operations
delete, deletecollection: Destructive operations
impersonate: Assume identity of another user
escalate: Modify RBAC roles (highly privileged)
bind: Create RoleBindings (highly privileged)
Persona-Based Access Model
- Cluster Admin: Full cluster management (limit to 2-3 people)
- Namespace Admin: Full control within assigned namespace
- Developer: Deploy and manage workloads in assigned namespace
- Viewer: Read-only access to namespace resources
- CI/CD Service Account: Deploy workloads, manage configmaps/secrets
Implementation Steps
Step 1: Disable Default Permissive Settings
- Ensure
--authorization-mode=RBAC is enabled on API server
- Remove default cluster-admin bindings from non-admin users
- Disable auto-mounting of service account tokens in pods
- Restrict access to default service account in each namespace
Step 2: Create Custom Roles
# Developer Role - namespace scoped
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: app-team
name: developer
rules:
- apiGroups: ["", "apps", "batch"]
resources: ["pods", "deployments", "services", "configmaps", "jobs"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list"] # read secrets but limit create/update
- apiGroups: [""]
resources: ["pods/log", "pods/exec"]
verbs: ["get", "create"]
Step 3: Bind Roles to Users/Groups
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: developer-binding
namespace: app-team
subjects:
- kind: Group
name: "dev-team"
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: developer
apiGroup: rbac.authorization.k8s.io
Step 4: Secure Service Accounts
- Create dedicated service accounts per application
- Disable automountServiceAccountToken for pods that don't need API access
- Use projected service account tokens with audience and expiry
- Bind minimum required permissions to each service account
Step 5: OIDC Integration
- Configure API server with OIDC flags (issuer-url, client-id, username-claim, groups-claim)
- Map OIDC groups to Kubernetes groups in RoleBindings
- Use short-lived tokens from OIDC provider
- Configure kubectl with OIDC authentication plugin
Step 6: Audit and Monitoring
- Enable Kubernetes audit logging (audit-policy.yaml)
- Log all RBAC-related events (role creation, binding changes)
- Alert on ClusterRoleBinding creation/modification
- Monitor for privilege escalation attempts
- Regular review of who has cluster-admin access
Security Controls
| Control |
NIST 800-53 |
Description |
| Access Control |
AC-3 |
RBAC enforcement |
| Least Privilege |
AC-6 |
Minimum necessary Kubernetes permissions |
| Account Management |
AC-2 |
Service account lifecycle |
| Audit |
AU-3 |
Kubernetes audit logging |
| Separation of Duties |
AC-5 |
Namespace isolation |
Common Pitfalls
- Granting cluster-admin to CI/CD pipelines
- Using wildcard (*) verbs or resources in ClusterRoles
- Not restricting pods/exec which allows container shell access
- Leaving default service account with broad permissions
- Not auditing who can create RoleBindings (privilege escalation vector)
Verification
1---2name: implementing-rbac-for-kubernetes-cluster3description: Configure Kubernetes Role-Based Access Control (RBAC) to enforce least-privilege access to cluster resources. This skill covers Role/ClusterRole design, RoleBinding configuration, service account secu4domain: cybersecurity5subdomain: identity-access-management6tags: [iam, identity, access-control, authorization, rbac, kubernetes, k8s]7version: "1.0"8author: mahipal9license: Apache-2.010---1112# Implementing RBAC for Kubernetes Cluster1314## Overview15Configure Kubernetes Role-Based Access Control (RBAC) to enforce least-privilege access to cluster resources. This skill covers Role/ClusterRole design, RoleBinding configuration, service account security, namespace isolation, and audit logging for multi-tenant Kubernetes environments.1617## Objectives18- Design RBAC role hierarchy for multi-tenant clusters19- Create granular Roles and ClusterRoles for different personas20- Configure RoleBindings and ClusterRoleBindings with least privilege21- Secure service accounts and limit their default permissions22- Integrate RBAC with external identity providers (OIDC)23- Audit and monitor RBAC usage with Kubernetes audit logs2425## Key Concepts2627### RBAC API Objects281. **Role**: Namespace-scoped permissions (pods, services, deployments within a namespace)292. **ClusterRole**: Cluster-wide permissions (nodes, namespaces, PVs, CRDs)303. **RoleBinding**: Grants Role to users/groups/serviceAccounts in a namespace314. **ClusterRoleBinding**: Grants ClusterRole cluster-wide3233### Kubernetes RBAC Verbs34- `get`, `list`, `watch`: Read-only operations35- `create`, `update`, `patch`: Write operations36- `delete`, `deletecollection`: Destructive operations37- `impersonate`: Assume identity of another user38- `escalate`: Modify RBAC roles (highly privileged)39- `bind`: Create RoleBindings (highly privileged)4041### Persona-Based Access Model42- **Cluster Admin**: Full cluster management (limit to 2-3 people)43- **Namespace Admin**: Full control within assigned namespace44- **Developer**: Deploy and manage workloads in assigned namespace45- **Viewer**: Read-only access to namespace resources46- **CI/CD Service Account**: Deploy workloads, manage configmaps/secrets4748## Implementation Steps4950### Step 1: Disable Default Permissive Settings511. Ensure `--authorization-mode=RBAC` is enabled on API server522. Remove default cluster-admin bindings from non-admin users533. Disable auto-mounting of service account tokens in pods544. Restrict access to default service account in each namespace5556### Step 2: Create Custom Roles57```yaml58# Developer Role - namespace scoped59apiVersion: rbac.authorization.k8s.io/v160kind: Role61metadata:62 namespace: app-team63 name: developer64rules:65- apiGroups: ["", "apps", "batch"]66 resources: ["pods", "deployments", "services", "configmaps", "jobs"]67 verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]68- apiGroups: [""]69 resources: ["secrets"]70 verbs: ["get", "list"] # read secrets but limit create/update71- apiGroups: [""]72 resources: ["pods/log", "pods/exec"]73 verbs: ["get", "create"]74```7576### Step 3: Bind Roles to Users/Groups77```yaml78apiVersion: rbac.authorization.k8s.io/v179kind: RoleBinding80metadata:81 name: developer-binding82 namespace: app-team83subjects:84- kind: Group85 name: "dev-team"86 apiGroup: rbac.authorization.k8s.io87roleRef:88 kind: Role89 name: developer90 apiGroup: rbac.authorization.k8s.io91```9293### Step 4: Secure Service Accounts94- Create dedicated service accounts per application95- Disable automountServiceAccountToken for pods that don't need API access96- Use projected service account tokens with audience and expiry97- Bind minimum required permissions to each service account9899### Step 5: OIDC Integration1001. Configure API server with OIDC flags (issuer-url, client-id, username-claim, groups-claim)1012. Map OIDC groups to Kubernetes groups in RoleBindings1023. Use short-lived tokens from OIDC provider1034. Configure kubectl with OIDC authentication plugin104105### Step 6: Audit and Monitoring106- Enable Kubernetes audit logging (audit-policy.yaml)107- Log all RBAC-related events (role creation, binding changes)108- Alert on ClusterRoleBinding creation/modification109- Monitor for privilege escalation attempts110- Regular review of who has cluster-admin access111112## Security Controls113| Control | NIST 800-53 | Description |114|---------|-------------|-------------|115| Access Control | AC-3 | RBAC enforcement |116| Least Privilege | AC-6 | Minimum necessary Kubernetes permissions |117| Account Management | AC-2 | Service account lifecycle |118| Audit | AU-3 | Kubernetes audit logging |119| Separation of Duties | AC-5 | Namespace isolation |120121## Common Pitfalls122- Granting cluster-admin to CI/CD pipelines123- Using wildcard (*) verbs or resources in ClusterRoles124- Not restricting pods/exec which allows container shell access125- Leaving default service account with broad permissions126- Not auditing who can create RoleBindings (privilege escalation vector)127128## Verification129- [ ] All users authenticate via OIDC (no static tokens/certs)130- [ ] No unnecessary ClusterRoleBindings to cluster-admin131- [ ] Developers limited to their assigned namespaces132- [ ] Service accounts use least-privilege roles133- [ ] automountServiceAccountToken disabled by default134- [ ] Audit logging captures RBAC changes135- [ ] `kubectl auth can-i` validates expected permissions per persona