Skip to main content

Chapter 9.1 - RBAC (Role-Based Access Control)

Learning Objectives​

By the end of this chapter, you will be able to:

  • Understand what RBAC is and why to use it
  • Create Roles and ClusterRoles
  • Create RoleBindings and ClusterRoleBindings
  • Understand verbs and resources
  • Manage permissions for users and Service Accounts
  • Apply the principle of least privilege

Introduction​

RBAC (Role-Based Access Control) is the Kubernetes authorization mechanism that controls who can do what in the cluster. It is essential for security and compliance.


Key Concepts​

Roles vs ClusterRoles​

Role: Permissions within a specific namespace
ClusterRole: Permissions at the cluster level (all namespaces)

RoleBindings vs ClusterRoleBindings​

RoleBinding: Binds a Role to users within a namespace
ClusterRoleBinding: Binds a ClusterRole to users at the cluster level


Creating a Role​

Basic Role​

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] # Core API group (no prefix)
resources: ["pods"]
verbs: ["get", "watch", "list"]

Result: Allows reading Pods in the default namespace.

Role with Multiple Resources​

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: production
name: app-manager
rules:
- apiGroups: [""]
resources: ["pods", "services", "configmaps"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
- apiGroups: ["apps"]
resources: ["deployments", "replicasets"]
verbs: ["get", "list", "create", "update", "patch", "delete"]

Creating a ClusterRole​

ClusterRole for Nodes​

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: node-reader
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "watch", "list"]

Result: Allows reading nodes across the entire cluster.

ClusterRole with ResourceNames​

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
resourceNames: ["my-secret", "another-secret"]
verbs: ["get", "list"]

Result: Access only to the specified secrets.


Verbs (Actions)​

Verbs define the authorized actions:

VerbDescription
getRead a resource
listList resources
watchWatch resources
createCreate a resource
updateUpdate a resource
patchPartially modify a resource
deleteDelete a resource
deletecollectionDelete multiple resources

Wildcard: * for all actions.


Resources​

Resources are the Kubernetes objects:

  • pods, services, configmaps, secrets
  • deployments, replicasets, statefulsets
  • nodes, namespaces, persistentvolumes
  • Etc.

Wildcard: * for all resources.


RoleBinding​

Binding a Role to a User​

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: alice
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io

Binding a Role to a ServiceAccount​

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

Binding a ClusterRole to a User (Namespace Scope)​

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-nodes
namespace: default
subjects:
- kind: User
name: bob
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: node-reader
apiGroup: rbac.authorization.k8s.io

Result: Bob can read nodes, but only within the default namespace.


ClusterRoleBinding​

Binding a ClusterRole at the Cluster Level​

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cluster-admin-binding
subjects:
- kind: User
name: admin
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io

Result: The admin user has cluster-admin permissions across the entire cluster.


Predefined Roles​

Kubernetes provides predefined ClusterRoles:

cluster-admin​

Full access to the cluster:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-admin
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
- nonResourceURLs: ["*"]
verbs: ["*"]

admin​

Full access within a namespace:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: admin
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]

edit​

Can modify resources (except RBAC):

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: edit
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
- apiGroups: ["rbac.authorization.k8s.io"]
resources: ["*"]
verbs: [] # No RBAC access

view​

Read-only:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: view
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["get", "list", "watch"]

Complete Example: Developer​

Step 1: Create the Role​

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: development
name: developer
rules:
- apiGroups: [""]
resources: ["pods", "services", "configmaps", "secrets"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
- apiGroups: ["apps"]
resources: ["deployments", "replicasets"]
verbs: ["get", "list", "create", "update", "patch", "delete"]

Step 2: Create the RoleBinding​

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: developer-binding
namespace: development
subjects:
- kind: User
name: developer1
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: developer
apiGroup: rbac.authorization.k8s.io

Result: developer1 can manage applications in the development namespace.


Useful Commands​

Verification​

# View Roles
kubectl get roles
kubectl get rolebinding

# View ClusterRoles
kubectl get clusterroles
kubectl get clusterrolebinding

# Details
kubectl describe role pod-reader
kubectl describe rolebinding read-pods

# Check permissions
kubectl auth can-i create pods --namespace=default
kubectl auth can-i delete deployments --namespace=production

Testing Permissions​

# Test as a user
kubectl get pods --as=developer1

# View a user's permissions
kubectl auth can-i --list --as=developer1 --namespace=development

Best Practices​

1. Principle of Least Privilege​

Grant only the necessary permissions.

2. Specific Roles​

Create specific roles rather than using cluster-admin.

3. Namespace Isolation​

Use namespaces to isolate environments.

4. Service Accounts​

Use Service Accounts for applications rather than users.

5. Audit​

Enable audit logging to trace access.


Summary​

In this chapter, you learned:

RBAC: Role-Based Access Control
Roles: Permissions within a namespace
ClusterRoles: Permissions at the cluster level
RoleBindings: Bind roles to users/ServiceAccounts
Verbs: Authorized actions (get, list, create, update, delete, etc.)
Resources: Kubernetes objects (pods, services, deployments, etc.)
Predefined roles: cluster-admin, admin, edit, view
Best practices: Least privilege, specific roles, isolation


Next Steps​

Chapter 9.2: Service Accounts
Chapter 9.3: Network Policies
Lab 9.1: Configuring RBAC for a User


Chapter created on: December 2024