radar:idp:<group-id> subjects, which you bind in your own Kubernetes RBAC exactly as you already bind your raw IdP groups.
This page covers the end-to-end process. It builds on two pages you should read first:
- SSO - group passthrough rides on top of a working SSO connection.
- RBAC under Cloud mode - the binding recipes and governance models you’ll use in the final step.
The identity Radar presents to your cluster
When a signed-in user drives a cluster request, the control plane does not forward the user’s raw IdP identity (their IdP email, their real IdP group names) to your cluster. It asserts a Radar-scoped, prefixed identity that you opt into through your own RBAC. On each request the control plane injects a groups header containing:radar:* is the vocabulary to bind against. A legacy cloud:* copy of the role / org / user subjects is still emitted so older bindings keep working, but IdP groups and the email subject exist only under radar:*. Write new bindings against radar:*.kubectl, some for CI, some binding a platform admin to cluster-admin. If Radar asserted the raw identity, every one of those bindings would become reachable the moment someone signs into Radar. With the prefixed identity, only the bindings you explicitly grant to a radar:* subject are reachable. You can grep radar: across your RBAC and see the complete, auditable list of what Radar can touch.
This is channel isolation - a smaller, deliberately scoped, auditable door - not a blast-radius cap on a control-plane compromise. State it that way to a security team: the value is that Radar can reach only what you bound to radar:*, and that set is greppable and reviewable.
The process end to end
- Connect SSO. Group passthrough requires a working SSO connection (SSO).
- Emit a stable group claim from your IdP so memberships arrive as
radar:idp:<group-id>. - Verify the groups arrive as stable IDs before you write any RBAC.
- Bind
radar:idp:<group-id>in your Kubernetes RBAC, optionally disabling the default role tiers for scoped users.
1. Connect SSO
Follow SSO end to end. Group passthrough is enabled per connection as part of SSO onboarding; if groups don’t arrive after you complete the steps below, contact support to confirm passthrough is active on your connection.2. Emit a stable group claim from your IdP
This is two actions: your IdP has to emit a groups claim, and the SSO setup has to map that claim into Radar. Both are required - a claim your IdP emits but no one maps never reaches your cluster.- In your IdP, add a groups claim to the assertion / token it sends (see the provider examples below).
- In the SSO setup portal (the “Open SSO setup” link from your SSO connection), open Attribute mappings → Edit attribute mappings, find the
groupsattribute, and set its IdP field name to the exact attribute name your IdP emits the claim under. Save.
- Microsoft Entra: add a groups claim (App registration → Token configuration, or Enterprise App → Single sign-on → Attributes & Claims). Leave the source attribute at its default so the value is the group object ID (GUID), not
sAMAccountNameor the cloud display name. - Okta: emit a groups claim on the SAML / OIDC app and use the immutable group ID as the value, not the group label.
- Generic OIDC / SAML: expose your IdP’s groups claim and source it from a stable ID.
3. Verify before writing RBAC
Before you author a single RoleBinding, confirm your IdP actually sends the groups - as stable IDs. You can check this yourself in the SSO setup portal, no support ticket needed:- In the setup portal, click Test sign-in (or just have a user who belongs to the group sign in normally).
- Open the Sessions list, click the sign-in you just made, and expand the SAML response (SAML) or token payload.
- Confirm a groups attribute is present and its values are stable IDs (e.g.
a1b2c3d4-1234-5678-9abc-def012345678), not display names with spaces.
kind: Group, name: radar:idp:<group-id>.
4. Bind the groups in Kubernetes RBAC
You now bindradar:idp:<group-id> subjects in your own Roles and RoleBindings, exactly as you bind your raw IdP groups today. A minimal example - a vendor group that can edit one namespace:
radar:email:<lowercased-email>- bind an individual human by email, for RBAC that grants specific people rather than groups.radar:user:<user-id>- bind by opaque, email-independent user ID (see Per-user bindings).
radar:viewer → view, etc.). For external or namespace-scoped users who should have no baseline access on top of their group, disable the default viewer tier so they start from nothing:
radar:idp:<group-id> bindings. The RBAC governance models walk through the mixed and full-IdP setups in depth - this page is the “how the groups get there” half of that.
How enforcement works
Kubernetes RBAC is the single policy source; there is no second permission system to configure. But where the check happens differs by surface, and the distinction matters:- Direct resource reads and writes (get / list / watch of pods, nodes, etc.; create / update / delete; exec / logs / attach) are served by an impersonating client: Radar calls the Kubernetes API as your asserted identity, and Kubernetes itself allows or denies. The API server is the enforcement point.
- Cached surfaces - the timeline / change feeds and the topology / neighborhood graph - are served from a shared cache rather than per-user live calls. For these, Radar asks Kubernetes “is this user allowed to see this kind here?” via a
SubjectAccessReview, then filters the cached data against that answer.
Full impersonation enforcement requires the Radar Helm chart at the version that enables cloud-mode (see Connecting a cluster). On older charts you get header injection only, and the in-cluster ServiceAccount still calls with its own ambient permissions - so tier and group bindings don’t actually enforce until the chart is rolled.
Troubleshooting
A user signs in fine but sees nothing. Almost always the IdP is emitting group display names instead of stable IDs. Names that contain spaces (or commas / non-ASCII characters) are dropped, so noradar:idp:* subject reaches the cluster and nothing is bound. Point the group claim at the immutable group object ID and have the user sign in again. Secondary causes: no RoleBinding yet names that group’s ID, or group passthrough isn’t enabled on the connection (contact support).
Renaming a group in the IdP broke access. You bound a display name rather than the object ID, and the rename changed the string your RoleBinding referenced. Rebind to the group’s immutable ID; renames won’t affect it.
A group with a clean ID still grants nothing. Confirm the RoleBinding subject is exactly radar:idp:<group-id> (the radar:idp: prefix is required - the raw group ID alone won’t match) and that the ID in the binding matches the ID your IdP emits, character for character.
See also
- SSO - the connection this builds on.
- RBAC under Cloud mode - binding recipes, the default role tiers, and the mixed vs full-IdP governance models.
- Organizations & roles - the Cloud roles that seed the default tiers.
- Connecting a cluster - the chart values that enable cloud-mode enforcement.