Skip to main content
Version: v1.0.x

ClusterAuthzRoleBinding

A ClusterAuthzRoleBinding connects a subject (identified by a JWT claim-value pair) to one or more ClusterAuthzRole resources, granting or denying the roles' permissions. Each role mapping can optionally be scoped to a specific namespace, project, or component within the resource hierarchy.

API Version

openchoreo.dev/v1alpha1

Resource Definition

Metadata

ClusterAuthzRoleBindings are cluster-scoped resources.

apiVersion: openchoreo.dev/v1alpha1
kind: ClusterAuthzRoleBinding
metadata:
name: <binding-name>

Spec Fields

FieldTypeRequiredDefaultDescription
entitlementEntitlementClaimYes-Subject identification from JWT claims
roleMappingsClusterRoleMapping[]Yes-List of role-scope pairs this binding applies to
effectstringNoallowallow or deny

EntitlementClaim

FieldTypeRequiredDescription
claimstringYesJWT claim name (e.g., groups, sub, email)
valuestringYesJWT claim value to match (e.g., platformEngineer)

ClusterRoleMapping

Each entry in the roleMappings array pairs a role reference with an optional scope.

FieldTypeRequiredDescription
roleRefRoleRefYesReference to the cluster role to bind
scopeClusterTargetScopeNoNarrows the mapping to a specific namespace, project, or component. Omit for cluster-wide

RoleRef

FieldTypeRequiredDescription
kindstringYesMust be ClusterAuthzRole
namestringYesName of the ClusterAuthzRole to bind

ClusterTargetScope

All fields are optional. Omitted fields mean "all" at that level.

FieldTypeRequiredDescription
namespacestringNoScope to a specific namespace
projectstringNoScope to a specific project (requires namespace)
componentstringNoScope to a specific component (requires namespace and project)
important
  • roleMappings[].roleRef.kind must be ClusterAuthzRole. ClusterAuthzRoleBindings cannot reference namespace-scoped AuthzRole resources. This is enforced by a validation rule on the resource.
  • scope.project requires scope.namespace, and scope.component requires scope.project.

Examples

Grant Admin Access Cluster-Wide

apiVersion: openchoreo.dev/v1alpha1
kind: ClusterAuthzRoleBinding
metadata:
name: platform-admins-binding
spec:
entitlement:
claim: groups
value: platformEngineer
roleMappings:
- roleRef:
kind: ClusterAuthzRole
name: platform-admin
effect: allow

Grant Viewer Access to a Service Account

apiVersion: openchoreo.dev/v1alpha1
kind: ClusterAuthzRoleBinding
metadata:
name: backstage-reader-binding
spec:
entitlement:
claim: sub
value: openchoreo-backstage-client
roleMappings:
- roleRef:
kind: ClusterAuthzRole
name: viewer
effect: allow

Namespace-Scoped Admin with Cluster-Wide Reader

Multiple role mappings can be combined in a single binding, each with an independent scope:

apiVersion: openchoreo.dev/v1alpha1
kind: ClusterAuthzRoleBinding
metadata:
name: acme-admins-binding
spec:
entitlement:
claim: groups
value: acme-admins
roleMappings:
- roleRef:
kind: ClusterAuthzRole
name: admin
scope:
namespace: acme
- roleRef:
kind: ClusterAuthzRole
name: cluster-reader
effect: allow

In this example, acme-admins gets full admin access scoped to the acme namespace and cluster-wide read-only visibility into cluster-level resources — all in a single CR.

Allow and Deny

Both ClusterAuthzRoleBinding and AuthzRoleBinding carry an effect field: either allow or deny. Evaluation runs once per entitlement value the caller presents, and each entitlement value is resolved independently using a deny-overrides strategy:

  • If any binding matching that entitlement value has effect allow AND no binding matching that entitlement value has effect deny: ALLOW
  • If any binding matching that entitlement value has effect deny: DENY
  • If no bindings match: DENY (default deny)

The per-entitlement results are then unioned: the request is allowed if any one of the caller's entitlement values allows it.

A deny therefore overrides allow bindings carrying the same entitlement value, including across role kinds and down the resource hierarchy. It does not override access granted to a different entitlement value. If a user belongs to both acme-developers and crm-developers, a deny on crm-developers will not revoke access that acme-developers grants.

To revoke access, remove the binding that grants it or narrow its scope.