Kubetier

Built-in roles

T0

T0cluster-admincluster

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)
apiGroupresources / urlsverbs
***
(non-resource)**
Audit: RequestResponseK8s docs ↗
T0system:kube-controller-managercluster

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)
apiGroupresources / urlsverbs
"", events.k8s.ioeventscreate patch update
coordination.k8s.ioleasescreate
coordination.k8s.ioleasesget update
""secrets, serviceaccountscreate
""secretsdelete
""configmaps, namespaces, secrets, serviceaccountsget
""secrets, serviceaccountsupdate
authentication.k8s.iotokenreviewscreate
authorization.k8s.iosubjectaccessreviewscreate
**list watch
""serviceaccounts/tokencreate
Audit: RequestResponseK8s docs ↗

T1

T1system:nodecluster

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)
apiGroupresources / urlsverbs
authentication.k8s.iotokenreviewscreate
authorization.k8s.iolocalsubjectaccessreviews, subjectaccessreviewscreate
""servicesget list watch
""nodescreate get list watch
""nodes/statuspatch update
""nodespatch update
"", events.k8s.ioeventscreate patch update
""podsget list watch
""podscreate delete
""pods/statuspatch update
""pods/evictioncreate
""configmaps, secretsget list watch
""persistentvolumeclaims, persistentvolumesget
""endpointsget
certificates.k8s.iocertificatesigningrequestscreate get list watch
coordination.k8s.ioleasescreate delete get patch update
storage.k8s.iovolumeattachmentsget
""serviceaccounts/tokencreate
""persistentvolumeclaims/statusget patch update
storage.k8s.iocsidriversget list watch
storage.k8s.iocsinodescreate delete get patch update
node.k8s.ioruntimeclassesget list watch
resource.k8s.ioresourceclaimsget
resource.k8s.ioresourceslicesdeletecollection
""serviceaccountsget
Audit: RequestResponseK8s docs ↗
T1system:persistent-volume-provisionercluster

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)
apiGroupresources / urlsverbs
""persistentvolumescreate delete get list watch
""persistentvolumeclaimsget list update watch
storage.k8s.iostorageclassesget list watch
"", events.k8s.ioeventscreate patch update watch
Audit: RequestResponseK8s docs ↗
T1adminnamespaced

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)
apiGroupresources / urlsverbs
""pods/attach, pods/exec, pods/portforward, pods/proxy, secrets, services/proxyget list watch
""serviceaccountsimpersonate
""pods, pods/attach, pods/exec, pods/portforward, pods/proxycreate delete deletecollection patch update
""pods/evictioncreate
""configmaps, persistentvolumeclaims, replicationcontrollers, replicationcontrollers/scale, secrets, serviceaccounts, services, services/proxycreate delete deletecollection patch update
""serviceaccounts/tokencreate
"", events.k8s.ioeventscreate delete deletecollection patch update
appsdaemonsets, deployments, deployments/rollback, deployments/scale, replicasets, replicasets/scale, statefulsets, statefulsets/scalecreate delete deletecollection patch update
autoscalinghorizontalpodautoscalerscreate delete deletecollection patch update
batchcronjobs, jobscreate delete deletecollection patch update
extensionsdaemonsets, deployments, deployments/rollback, deployments/scale, ingresses, networkpolicies, replicasets, replicasets/scale, replicationcontrollers/scalecreate delete deletecollection patch update
policypoddisruptionbudgetscreate delete deletecollection patch update
networking.k8s.ioingresses, networkpoliciescreate delete deletecollection patch update
coordination.k8s.ioleasescreate delete deletecollection get list patch update watch
resource.k8s.ioresourceclaims, resourceclaimtemplatescreate delete deletecollection patch update
""configmaps, endpoints, persistentvolumeclaims, persistentvolumeclaims/status, pods, replicationcontrollers, replicationcontrollers/scale, serviceaccounts, services, services/statusget list watch
""bindings, limitranges, namespaces/status, pods/log, pods/status, replicationcontrollers/status, resourcequotas, resourcequotas/statusget list watch
""namespacesget list watch
"", events.k8s.ioeventsget list watch
discovery.k8s.ioendpointslicesget list watch
appscontrollerrevisions, daemonsets, daemonsets/status, deployments, deployments/scale, deployments/status, replicasets, replicasets/scale, replicasets/status, statefulsets, statefulsets/scale, statefulsets/statusget list watch
autoscalinghorizontalpodautoscalers, horizontalpodautoscalers/statusget list watch
batchcronjobs, cronjobs/status, jobs, jobs/statusget list watch
extensionsdaemonsets, daemonsets/status, deployments, deployments/scale, deployments/status, ingresses, ingresses/status, networkpolicies, replicasets, replicasets/scale, replicasets/status, replicationcontrollers/scaleget list watch
policypoddisruptionbudgets, poddisruptionbudgets/statusget list watch
networking.k8s.ioingresses, ingresses/status, networkpoliciesget list watch
resource.k8s.ioresourceclaims, resourceclaims/status, resourceclaimtemplatesget list watch
authorization.k8s.iolocalsubjectaccessreviewscreate
rbac.authorization.k8s.iorolebindings, rolescreate delete deletecollection get list patch update watch
Audit: RequestResponseK8s docs ↗
T1editnamespaced

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)
apiGroupresources / urlsverbs
""pods/attach, pods/exec, pods/portforward, pods/proxy, secrets, services/proxyget list watch
""serviceaccountsimpersonate
""pods, pods/attach, pods/exec, pods/portforward, pods/proxycreate delete deletecollection patch update
""pods/evictioncreate
""configmaps, persistentvolumeclaims, replicationcontrollers, replicationcontrollers/scale, secrets, serviceaccounts, services, services/proxycreate delete deletecollection patch update
""serviceaccounts/tokencreate
"", events.k8s.ioeventscreate delete deletecollection patch update
appsdaemonsets, deployments, deployments/rollback, deployments/scale, replicasets, replicasets/scale, statefulsets, statefulsets/scalecreate delete deletecollection patch update
autoscalinghorizontalpodautoscalerscreate delete deletecollection patch update
batchcronjobs, jobscreate delete deletecollection patch update
extensionsdaemonsets, deployments, deployments/rollback, deployments/scale, ingresses, networkpolicies, replicasets, replicasets/scale, replicationcontrollers/scalecreate delete deletecollection patch update
policypoddisruptionbudgetscreate delete deletecollection patch update
networking.k8s.ioingresses, networkpoliciescreate delete deletecollection patch update
coordination.k8s.ioleasescreate delete deletecollection get list patch update watch
resource.k8s.ioresourceclaims, resourceclaimtemplatescreate delete deletecollection patch update
""configmaps, endpoints, persistentvolumeclaims, persistentvolumeclaims/status, pods, replicationcontrollers, replicationcontrollers/scale, serviceaccounts, services, services/statusget list watch
""bindings, limitranges, namespaces/status, pods/log, pods/status, replicationcontrollers/status, resourcequotas, resourcequotas/statusget list watch
""namespacesget list watch
"", events.k8s.ioeventsget list watch
discovery.k8s.ioendpointslicesget list watch
appscontrollerrevisions, daemonsets, daemonsets/status, deployments, deployments/scale, deployments/status, replicasets, replicasets/scale, replicasets/status, statefulsets, statefulsets/scale, statefulsets/statusget list watch
autoscalinghorizontalpodautoscalers, horizontalpodautoscalers/statusget list watch
batchcronjobs, cronjobs/status, jobs, jobs/statusget list watch
extensionsdaemonsets, daemonsets/status, deployments, deployments/scale, deployments/status, ingresses, ingresses/status, networkpolicies, replicasets, replicasets/scale, replicasets/status, replicationcontrollers/scaleget list watch
policypoddisruptionbudgets, poddisruptionbudgets/statusget list watch
networking.k8s.ioingresses, ingresses/status, networkpoliciesget list watch
resource.k8s.ioresourceclaims, resourceclaims/status, resourceclaimtemplatesget list watch
Audit: RequestK8s docs ↗
T1system:kube-schedulercluster

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)
apiGroupresources / urlsverbs
"", events.k8s.ioeventscreate patch update
coordination.k8s.ioleasescreate
coordination.k8s.ioleasesget list update watch
coordination.k8s.ioleasecandidatescreate delete deletecollection get list patch update watch
""nodesget list watch
""podsdelete get list watch
""bindings, pods/bindingcreate
""pods/statuspatch update
""replicationcontrollers, servicesget list watch
apps, extensionsreplicasetsget list watch
appsstatefulsetsget list watch
policypoddisruptionbudgetsget list watch
""persistentvolumeclaims, persistentvolumesget list watch
authentication.k8s.iotokenreviewscreate
authorization.k8s.iosubjectaccessreviewscreate
storage.k8s.iocsinodesget list watch
storage.k8s.iovolumeattachmentsget list watch
""namespacesget list watch
storage.k8s.iocsidriversget list watch
storage.k8s.iocsistoragecapacitiesget list watch
resource.k8s.iodeviceclassesget list watch
resource.k8s.ioresourceclaimsget list patch update watch
resource.k8s.ioresourceclaims/statusget list patch update watch
""pods/finalizersupdate
resource.k8s.ioresourceslicesget list watch
resource.k8s.ioresourceclaimscreate delete
resource.k8s.ioresourceclaims/bindingpatch update
Audit: MetadataK8s docs ↗

T2

T2system:node-proxiercluster

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)
apiGroupresources / urlsverbs
""endpoints, serviceslist watch
""nodesget list watch
"", events.k8s.ioeventscreate patch update
networking.k8s.ioservicecidrslist watch
discovery.k8s.ioendpointsliceslist watch
Audit: MetadataK8s docs ↗
T2system:kube-dnscluster

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)
apiGroupresources / urlsverbs
""endpoints, serviceslist watch
Audit: MetadataK8s docs ↗
T2system:auth-delegatorcluster

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)
apiGroupresources / urlsverbs
authentication.k8s.iotokenreviewscreate
authorization.k8s.iosubjectaccessreviewscreate
Audit: RequestResponseK8s docs ↗
T2system:monitoringcluster

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)
apiGroupresources / urlsverbs
(non-resource)/flagz, /healthz, /healthz/*, /livez, /livez/*, /metrics, /metrics/slis, /readyz, /readyz/*, /statuszget
""nodes/metricsget
Audit: MetadataK8s docs ↗

T3

T3viewnamespaced

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)
apiGroupresources / urlsverbs
""configmaps, endpoints, persistentvolumeclaims, persistentvolumeclaims/status, pods, replicationcontrollers, replicationcontrollers/scale, serviceaccounts, services, services/statusget list watch
""bindings, limitranges, namespaces/status, pods/log, pods/status, replicationcontrollers/status, resourcequotas, resourcequotas/statusget list watch
""namespacesget list watch
"", events.k8s.ioeventsget list watch
discovery.k8s.ioendpointslicesget list watch
appscontrollerrevisions, daemonsets, daemonsets/status, deployments, deployments/scale, deployments/status, replicasets, replicasets/scale, replicasets/status, statefulsets, statefulsets/scale, statefulsets/statusget list watch
autoscalinghorizontalpodautoscalers, horizontalpodautoscalers/statusget list watch
batchcronjobs, cronjobs/status, jobs, jobs/statusget list watch
extensionsdaemonsets, daemonsets/status, deployments, deployments/scale, deployments/status, ingresses, ingresses/status, networkpolicies, replicasets, replicasets/scale, replicasets/status, replicationcontrollers/scaleget list watch
policypoddisruptionbudgets, poddisruptionbudgets/statusget list watch
networking.k8s.ioingresses, ingresses/status, networkpoliciesget list watch
resource.k8s.ioresourceclaims, resourceclaims/status, resourceclaimtemplatesget list watch
Audit: MetadataK8s docs ↗
T3system:basic-usercluster

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)
apiGroupresources / urlsverbs
authorization.k8s.ioselfsubjectaccessreviews, selfsubjectrulesreviewscreate
authentication.k8s.ioselfsubjectreviewscreate
Audit: NoneK8s docs ↗
T3system:discoverycluster

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)
apiGroupresources / urlsverbs
(non-resource)/api, /api/*, /apis, /apis/*, /healthz, /livez, /openapi, /openapi/*, /readyz, /version, /version/get
Audit: NoneK8s docs ↗
T3system:public-info-viewercluster

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)
apiGroupresources / urlsverbs
(non-resource)/healthz, /livez, /readyz, /version, /version/get
Audit: NoneK8s docs ↗