Built-in roles
T0
Full unrestricted access to every resource in the cluster.
The Kubernetes equivalent of root.
- →
Auto-reconciled: any modification or deletion is reverted on the next API server restart.
- →
Audit all ClusterRoleBindings to this role; each one is effectively cluster root.
- →
Membership in the system:masters group also bypasses RBAC entirely and grants equivalent access without any binding.
Permissions (2)
| apiGroup | resources / urls | verbs |
|---|---|---|
| * | * | * |
| (non-resource) | * | * |
Controller manager identity with full read/write access to most resources needed to reconcile cluster state, including secrets and SA token creation.
- →
Use --use-service-account-credentials so each controller gets its own scoped ServiceAccount instead of sharing one identity.
- →
A compromised single identity here yields broad cluster-wide read/write across nearly all resource types.
- →
Holds list on secrets cluster-wide, which is T0 on its own: one identity reads every credential in every namespace.
Permissions (11)
| apiGroup | resources / urls | verbs |
|---|---|---|
| "", events.k8s.io | events | create patch update |
| coordination.k8s.io | leases | create |
| coordination.k8s.io | leases | get update |
| "" | secrets, serviceaccounts | create |
| "" | secrets | delete |
| "" | configmaps, namespaces, secrets, serviceaccounts | get |
| "" | secrets, serviceaccounts | update |
| authentication.k8s.io | tokenreviews | create |
| authorization.k8s.io | subjectaccessreviews | create |
| * | * | list watch |
| "" | serviceaccounts/token | create |
T1
Kubelet node identity role.
Grants the API access a kubelet needs for pods scheduled to that node, including reading referenced secrets/configmaps and reporting node/pod status.
Correct scoping depends on the Node authorizer and NodeRestriction admission plugin.
- →
Node authorizer limits each kubelet to objects related to pods scheduled on that node; NodeRestriction limits unsafe kubelet mutations of Node and Pod objects.
- →
CVE-2022-3294: node name spoofing allowed privilege escalation via this role in Kubernetes <= 1.23.
- →
Compromise of a node identity yields node-level access and can expose credentials for workloads scheduled there.
Permissions (25)
| apiGroup | resources / urls | verbs |
|---|---|---|
| authentication.k8s.io | tokenreviews | create |
| authorization.k8s.io | localsubjectaccessreviews, subjectaccessreviews | create |
| "" | services | get list watch |
| "" | nodes | create get list watch |
| "" | nodes/status | patch update |
| "" | nodes | patch update |
| "", events.k8s.io | events | create patch update |
| "" | pods | get list watch |
| "" | pods | create delete |
| "" | pods/status | patch update |
| "" | pods/eviction | create |
| "" | configmaps, secrets | get list watch |
| "" | persistentvolumeclaims, persistentvolumes | get |
| "" | endpoints | get |
| certificates.k8s.io | certificatesigningrequests | create get list watch |
| coordination.k8s.io | leases | create delete get patch update |
| storage.k8s.io | volumeattachments | get |
| "" | serviceaccounts/token | create |
| "" | persistentvolumeclaims/status | get patch update |
| storage.k8s.io | csidrivers | get list watch |
| storage.k8s.io | csinodes | create delete get patch update |
| node.k8s.io | runtimeclasses | get list watch |
| resource.k8s.io | resourceclaims | get |
| resource.k8s.io | resourceslices | deletecollection |
| "" | serviceaccounts | get |
Allows external storage provisioners to create and delete PersistentVolumes and read PersistentVolumeClaims and StorageClasses.
- →
Can create PersistentVolumes with hostPath; pods mounting those volumes gain direct access to the node filesystem.
- →
Intended exclusively for external storage provisioner controllers; verify no application workloads hold this role.
Permissions (4)
| apiGroup | resources / urls | verbs |
|---|---|---|
| "" | persistentvolumes | create delete get list watch |
| "" | persistentvolumeclaims | get list update watch |
| storage.k8s.io | storageclasses | get list watch |
| "", events.k8s.io | events | create patch update watch |
Namespace administrator with read/write access to most namespaced resources, including Roles and RoleBindings.
Still constrained by RBAC privilege-escalation prevention unless explicit bind/escalate is also granted.
- →
Can create Roles/RoleBindings in the namespace, but cannot grant permissions it does not already hold unless explicit bind/escalate permissions are present.
- →
Can read/write secrets and run workloads as any ServiceAccount in the namespace, making it T1 in normal namespaces and potentially T0 in kube-system.
- →
Aggregation rule: ClusterRoles labeled 'rbac.authorization.k8s.io/aggregate-to-admin: "true"' are automatically merged in.
- →
In clusters created with Kubernetes v1.22+, default aggregated admin/edit no longer include broad Endpoints write access because of CVE-2021-25740; upgraded clusters may retain legacy grants.
- →
Holds impersonate on serviceaccounts and create on serviceaccounts/token: in a namespace hosting a cluster-privileged ServiceAccount, or on a cluster without PodSecurity restricted, this reaches cluster-admin (contextual T0).
Permissions (29)
| apiGroup | resources / urls | verbs |
|---|---|---|
| "" | pods/attach, pods/exec, pods/portforward, pods/proxy, secrets, services/proxy | get list watch |
| "" | serviceaccounts | impersonate |
| "" | pods, pods/attach, pods/exec, pods/portforward, pods/proxy | create delete deletecollection patch update |
| "" | pods/eviction | create |
| "" | configmaps, persistentvolumeclaims, replicationcontrollers, replicationcontrollers/scale, secrets, serviceaccounts, services, services/proxy | create delete deletecollection patch update |
| "" | serviceaccounts/token | create |
| "", events.k8s.io | events | create delete deletecollection patch update |
| apps | daemonsets, deployments, deployments/rollback, deployments/scale, replicasets, replicasets/scale, statefulsets, statefulsets/scale | create delete deletecollection patch update |
| autoscaling | horizontalpodautoscalers | create delete deletecollection patch update |
| batch | cronjobs, jobs | create delete deletecollection patch update |
| extensions | daemonsets, deployments, deployments/rollback, deployments/scale, ingresses, networkpolicies, replicasets, replicasets/scale, replicationcontrollers/scale | create delete deletecollection patch update |
| policy | poddisruptionbudgets | create delete deletecollection patch update |
| networking.k8s.io | ingresses, networkpolicies | create delete deletecollection patch update |
| coordination.k8s.io | leases | create delete deletecollection get list patch update watch |
| resource.k8s.io | resourceclaims, resourceclaimtemplates | create delete deletecollection patch update |
| "" | configmaps, endpoints, persistentvolumeclaims, persistentvolumeclaims/status, pods, replicationcontrollers, replicationcontrollers/scale, serviceaccounts, services, services/status | get list watch |
| "" | bindings, limitranges, namespaces/status, pods/log, pods/status, replicationcontrollers/status, resourcequotas, resourcequotas/status | get list watch |
| "" | namespaces | get list watch |
| "", events.k8s.io | events | get list watch |
| discovery.k8s.io | endpointslices | get list watch |
| apps | controllerrevisions, daemonsets, daemonsets/status, deployments, deployments/scale, deployments/status, replicasets, replicasets/scale, replicasets/status, statefulsets, statefulsets/scale, statefulsets/status | get list watch |
| autoscaling | horizontalpodautoscalers, horizontalpodautoscalers/status | get list watch |
| batch | cronjobs, cronjobs/status, jobs, jobs/status | get list watch |
| extensions | daemonsets, daemonsets/status, deployments, deployments/scale, deployments/status, ingresses, ingresses/status, networkpolicies, replicasets, replicasets/scale, replicasets/status, replicationcontrollers/scale | get list watch |
| policy | poddisruptionbudgets, poddisruptionbudgets/status | get list watch |
| networking.k8s.io | ingresses, ingresses/status, networkpolicies | get list watch |
| resource.k8s.io | resourceclaims, resourceclaims/status, resourceclaimtemplates | get list watch |
| authorization.k8s.io | localsubjectaccessreviews | create |
| rbac.authorization.k8s.io | rolebindings, roles | create delete deletecollection get list patch update watch |
Read/write access to most namespaced resources.
Can deploy workloads, exec/attach where included by aggregation, read/write secrets, and run Pods as any ServiceAccount in the namespace.
Lacks RBAC role/rolebinding management.
- →
Can read secrets and run Pods as any ServiceAccount in the namespace, so treat it as T1 despite the friendly name.
- →
Aggregation rule: ClusterRoles labeled 'rbac.authorization.k8s.io/aggregate-to-edit: "true"' are automatically merged in.
- →
Cannot manage Roles/RoleBindings by default, but workload creation and ServiceAccount token access are sufficient for many attack paths.
- →
In clusters created with Kubernetes v1.22+, default aggregated edit no longer includes broad Endpoints write access.
- →
Holds impersonate on serviceaccounts and create on serviceaccounts/token: in a namespace hosting a cluster-privileged ServiceAccount, or on a cluster without PodSecurity restricted, this reaches cluster-admin (contextual T0).
Permissions (27)
| apiGroup | resources / urls | verbs |
|---|---|---|
| "" | pods/attach, pods/exec, pods/portforward, pods/proxy, secrets, services/proxy | get list watch |
| "" | serviceaccounts | impersonate |
| "" | pods, pods/attach, pods/exec, pods/portforward, pods/proxy | create delete deletecollection patch update |
| "" | pods/eviction | create |
| "" | configmaps, persistentvolumeclaims, replicationcontrollers, replicationcontrollers/scale, secrets, serviceaccounts, services, services/proxy | create delete deletecollection patch update |
| "" | serviceaccounts/token | create |
| "", events.k8s.io | events | create delete deletecollection patch update |
| apps | daemonsets, deployments, deployments/rollback, deployments/scale, replicasets, replicasets/scale, statefulsets, statefulsets/scale | create delete deletecollection patch update |
| autoscaling | horizontalpodautoscalers | create delete deletecollection patch update |
| batch | cronjobs, jobs | create delete deletecollection patch update |
| extensions | daemonsets, deployments, deployments/rollback, deployments/scale, ingresses, networkpolicies, replicasets, replicasets/scale, replicationcontrollers/scale | create delete deletecollection patch update |
| policy | poddisruptionbudgets | create delete deletecollection patch update |
| networking.k8s.io | ingresses, networkpolicies | create delete deletecollection patch update |
| coordination.k8s.io | leases | create delete deletecollection get list patch update watch |
| resource.k8s.io | resourceclaims, resourceclaimtemplates | create delete deletecollection patch update |
| "" | configmaps, endpoints, persistentvolumeclaims, persistentvolumeclaims/status, pods, replicationcontrollers, replicationcontrollers/scale, serviceaccounts, services, services/status | get list watch |
| "" | bindings, limitranges, namespaces/status, pods/log, pods/status, replicationcontrollers/status, resourcequotas, resourcequotas/status | get list watch |
| "" | namespaces | get list watch |
| "", events.k8s.io | events | get list watch |
| discovery.k8s.io | endpointslices | get list watch |
| apps | controllerrevisions, daemonsets, daemonsets/status, deployments, deployments/scale, deployments/status, replicasets, replicasets/scale, replicasets/status, statefulsets, statefulsets/scale, statefulsets/status | get list watch |
| autoscaling | horizontalpodautoscalers, horizontalpodautoscalers/status | get list watch |
| batch | cronjobs, cronjobs/status, jobs, jobs/status | get list watch |
| extensions | daemonsets, daemonsets/status, deployments, deployments/scale, deployments/status, ingresses, ingresses/status, networkpolicies, replicasets, replicasets/scale, replicasets/status, replicationcontrollers/scale | get list watch |
| policy | poddisruptionbudgets, poddisruptionbudgets/status | get list watch |
| networking.k8s.io | ingresses, ingresses/status, networkpolicies | get list watch |
| resource.k8s.io | resourceclaims, resourceclaims/status, resourceclaimtemplates | get list watch |
Scheduler identity.
Reads pods, nodes, storage and scheduling metadata, then writes binding/status decisions for pods.
Cluster-scoped but limited to scheduling concerns.
- →
Uses create on pods/binding and update/patch on pods/status for scheduling decisions; this is not the RBAC special verb bind.
- →
Reads PriorityClasses, PersistentVolumes, PersistentVolumeClaims, and related scheduling data, giving visibility into workload placement constraints.
Permissions (27)
| apiGroup | resources / urls | verbs |
|---|---|---|
| "", events.k8s.io | events | create patch update |
| coordination.k8s.io | leases | create |
| coordination.k8s.io | leases | get list update watch |
| coordination.k8s.io | leasecandidates | create delete deletecollection get list patch update watch |
| "" | nodes | get list watch |
| "" | pods | delete get list watch |
| "" | bindings, pods/binding | create |
| "" | pods/status | patch update |
| "" | replicationcontrollers, services | get list watch |
| apps, extensions | replicasets | get list watch |
| apps | statefulsets | get list watch |
| policy | poddisruptionbudgets | get list watch |
| "" | persistentvolumeclaims, persistentvolumes | get list watch |
| authentication.k8s.io | tokenreviews | create |
| authorization.k8s.io | subjectaccessreviews | create |
| storage.k8s.io | csinodes | get list watch |
| storage.k8s.io | volumeattachments | get list watch |
| "" | namespaces | get list watch |
| storage.k8s.io | csidrivers | get list watch |
| storage.k8s.io | csistoragecapacities | get list watch |
| resource.k8s.io | deviceclasses | get list watch |
| resource.k8s.io | resourceclaims | get list patch update watch |
| resource.k8s.io | resourceclaims/status | get list patch update watch |
| "" | pods/finalizers | update |
| resource.k8s.io | resourceslices | get list watch |
| resource.k8s.io | resourceclaims | create delete |
| resource.k8s.io | resourceclaims/binding | patch update |
T2
kube-proxy identity with list/watch access to Services, Endpoints, EndpointSlices, and Nodes to maintain service routing rules.
- →
Bound to the kube-proxy ServiceAccount by default.
- →
Cluster-wide watch on Services, Endpoints, and EndpointSlices provides full service-routing topology visibility to any holder of this role.
Permissions (5)
| apiGroup | resources / urls | verbs |
|---|---|---|
| "" | endpoints, services | list watch |
| "" | nodes | get list watch |
| "", events.k8s.io | events | create patch update |
| networking.k8s.io | servicecidrs | list watch |
| discovery.k8s.io | endpointslices | list watch |
CoreDNS/kube-dns identity with list/watch access to Services, Endpoints, EndpointSlices, and Namespaces cluster-wide to answer DNS queries for workloads.
- →
Compromise of the CoreDNS ServiceAccount can expose cluster service-discovery topology and, with config write access, enable DNS poisoning.
- →
The common poisoning vector is write access to the CoreDNS ConfigMap in kube-system, not this read/list role by itself.
Permissions (1)
| apiGroup | resources / urls | verbs |
|---|---|---|
| "" | endpoints, services | list watch |
Allows extension API servers to delegate authentication and authorization to the main Kubernetes API server via TokenReview and SubjectAccessReview.
- →
Used by aggregated API servers (metrics-server, custom API extensions) to validate caller identities.
- →
A compromised extension server with this role can probe whether arbitrary service account tokens are valid against the API server.
Permissions (2)
| apiGroup | resources / urls | verbs |
|---|---|---|
| authentication.k8s.io | tokenreviews | create |
| authorization.k8s.io | subjectaccessreviews | create |
Monitoring role for scraping component, node, and API-server metrics.
Low direct write risk, but metrics can leak version, topology, and workload metadata.
- →
Metrics endpoints can expose sensitive operational data: request rates, error rates, resource names, and label values.
- →
Verify only monitoring ServiceAccounts (Prometheus, Datadog, etc.) are bound to this role.
- →
Reads Node objects cluster-wide, which is T2 rather than pure recon: node annotations can carry overlay network details, so the role is bounded by what those objects hold rather than by being read-only.
Permissions (2)
| apiGroup | resources / urls | verbs |
|---|---|---|
| (non-resource) | /flagz, /healthz, /healthz/*, /livez, /livez/*, /metrics, /metrics/slis, /readyz, /readyz/*, /statusz | get |
| "" | nodes/metrics | get |
T3
Read-only access to most namespace resources.
Cannot read secrets or modify any state.
- →
Does not include secrets, a common misconception.
Secret access must be explicitly granted.
- →
Aggregation rule: ClusterRoles labeled 'rbac.authorization.k8s.io/aggregate-to-view: "true"' are automatically merged in.
- →
Still useful for reconnaissance: pod names, service endpoints, environment variable names, and event logs reveal cluster topology.
Permissions (12)
| apiGroup | resources / urls | verbs |
|---|---|---|
| "" | configmaps, endpoints, persistentvolumeclaims, persistentvolumeclaims/status, pods, replicationcontrollers, replicationcontrollers/scale, serviceaccounts, services, services/status | get list watch |
| "" | bindings, limitranges, namespaces/status, pods/log, pods/status, replicationcontrollers/status, resourcequotas, resourcequotas/status | get list watch |
| "" | namespaces | get list watch |
| "", events.k8s.io | events | get list watch |
| discovery.k8s.io | endpointslices | get list watch |
| apps | controllerrevisions, daemonsets, daemonsets/status, deployments, deployments/scale, deployments/status, replicasets, replicasets/scale, replicasets/status, statefulsets, statefulsets/scale, statefulsets/status | get list watch |
| autoscaling | horizontalpodautoscalers, horizontalpodautoscalers/status | get list watch |
| batch | cronjobs, cronjobs/status, jobs, jobs/status | get list watch |
| extensions | daemonsets, daemonsets/status, deployments, deployments/scale, deployments/status, ingresses, ingresses/status, networkpolicies, replicasets, replicasets/scale, replicasets/status, replicationcontrollers/scale | get list watch |
| policy | poddisruptionbudgets, poddisruptionbudgets/status | get list watch |
| networking.k8s.io | ingresses, ingresses/status, networkpolicies | get list watch |
| resource.k8s.io | resourceclaims, resourceclaims/status, resourceclaimtemplates | get list watch |
Minimal self-introspection access for authenticated users.
Allows checking your own identity and effective permissions.
- →
Bound to the 'system:authenticated' group by default; every authenticated user has this.
- →
SelfSubjectAccessReview/SelfSubjectRulesReview lets users enumerate their own permissions, which attackers use to map available attack surface.
Permissions (2)
| apiGroup | resources / urls | verbs |
|---|---|---|
| authorization.k8s.io | selfsubjectaccessreviews, selfsubjectrulesreviews | create |
| authentication.k8s.io | selfsubjectreviews | create |
Read access to API discovery endpoints.
Allows enumerating available API groups, versions, resource types, and server version information.
- →
Bound to 'system:authenticated' by default and commonly also available in limited form to unauthenticated clients.
- →
Restricting discovery can break kubectl and client tooling; limit unauthenticated network access at the infrastructure level instead.
Permissions (1)
| apiGroup | resources / urls | verbs |
|---|---|---|
| (non-resource) | /api, /api/*, /apis, /apis/*, /healthz, /livez, /openapi, /openapi/*, /readyz, /version, /version/ | get |
Allows reading non-sensitive public cluster information such as health, readiness, liveness, and version endpoints.
- →
Bound to both 'system:authenticated' and 'system:unauthenticated'; truly public to the network.
- →
Exposes the Kubernetes version string, which helps attackers target known version-specific CVEs.
Permissions (1)
| apiGroup | resources / urls | verbs |
|---|---|---|
| (non-resource) | /healthz, /livez, /readyz, /version, /version/ | get |
