Skip to main content

Roles reference

Suggested reading

Start with the Access management overview for the tenancy model and the two binding resources. Identity concepts come from the Identity overview.

Hub ships with four built-in roles: one organization role (org-admin) and three realm roles (realm-admin, realm-editor, realm-viewer). This page enumerates the permissions each grants. Custom roles are not supported.

The three tables below are grouped by the tier the resource lives on. Columns are the same in each: one organization role and the three realm roles.

Cells use four values:

CellMeaning
RWRead and write — get, list, create, update, delete
RRead only — get, list
FilteredAllowed, but only over the rows the caller can see. SelfSubjectAccessReview returns the exact predicate.
No access from this role. Access may still flow from another role or from the control plane's own RBAC.

Realm roles apply only inside the realm their RealmRoleBinding is namespaced to. A subject with realm-admin in prod-east has no permissions in prod-west.

Organization-scoped resources

Cluster-scoped resources that model the organization shell.

Resourceorg-adminrealm-adminrealm-editorrealm-viewer
realmsRWFiltered+write ownedFilteredFiltered
namespaces (realm facade)RFilteredFilteredFiltered
identityprovidersRW
usersR
groupsR
organizationrolebindingsRW
spacesRWR 1R 1R 1
spaces/registrationtokencreate
lensesFilteredFilteredFilteredFiltered

Lenses are global and carry no realm scoping. Every principal, org-admin included, gets the same shared-or-owner filter: you see lenses you own plus lenses shared with the organization.

Realm-scoped resources

Namespaced by realm, or filtered by the realms and control planes the caller can see.

Resourceorg-adminrealm-adminrealm-editorrealm-viewer
realmrolebindingsRWRW
controlplanesRWRWR
controlplanes/registrationtokencreatecreate
resourcesFilteredFilteredFiltered
resources/eventsFilteredFilteredFiltered
resourcestatsFilteredFilteredFiltered
resourcerelationshipsFilteredFilteredFiltered
resourcerelationshiptreesFilteredFilteredFiltered
typedefinitionsFilteredFilteredFiltered
typedefinitions/distributionFilteredFilteredFiltered
crossplanepackagesRW 2FilteredFilteredFiltered
crossplanepackages/distributionR 2FilteredFilteredFiltered
queries (metrics)FilteredFilteredFiltered

For a realm-admin, Filtered on the resource-aggregation rows means "every row in my realm". For realm-editor and realm-viewer it additionally narrows to what the control plane grants, per the next table.

resourcestats and metrics queries are POST-as-read endpoints: the query arrives in the request body, so authorization is on the create verb even though the operation only reads.

Resource reads inside a control plane

The rows above say which realms and control planes you can reach. This table says how much of a reached control plane's contents you see. realm-editor and realm-viewer project into an aggregation ClusterRole; whatever verbs that ClusterRole grants is what the role can perform on resources synced from that control plane.

org-adminrealm-adminrealm-editorrealm-viewer
Reads scoped toEverything synced 3crossplane-edit and controlplane-editcrossplane-view and controlplane-view

org-admin gets nothing here — it's an organization-tier role and doesn't cascade into any realm. Bind a realm role to reach control plane contents.

One row, because the mapping doesn't vary by control-plane type: Hub passes both names and takes whichever the control plane has. What a realm role gets inside a control plane covers that, along with how the aggregation labels widen it and why per-control-plane RBAC only ever adds.

Grants every principal holds

Independent of any role binding, every authenticated principal may:

  • create selfsubjectreviewskubectl auth whoami.
  • create selfsubjectaccessreviews (what can I do?).
  • Read the discovery, docs and OpenAPI endpoints.

Footnotes

  1. Read access to spaces comes from the built-in system:basic-user role, which every authenticated principal holds — not from the realm role. 2 3

  2. Provisional. org-admin sees these globally today because the per-realm filter for them doesn't exist yet. They move to filtered access when it lands. 2

  3. Unlike the other two roles, realm-admin isn't scoped by an aggregation ClusterRole — it reads every resource the hub-connector synced, so the connector's sync scope is the bound. That's --limit-to-cluster-roles (set through connector.sync.limitToClusterRoles), defaulting to crossplane-admin on every control plane regardless of type; in demo mode the chart substitutes cluster-admin. See the connector-side sync bound.