Skip to content

GBAC#1584

Open
paulohtb6 wants to merge 23 commits intov-WIP/26.1from
gbac
Open

GBAC#1584
paulohtb6 wants to merge 23 commits intov-WIP/26.1from
gbac

Conversation

@paulohtb6
Copy link
Copy Markdown
Contributor

@paulohtb6 paulohtb6 commented Feb 24, 2026

Description

Related PR to add Security to Admin API v2: redpanda-data/api-docs#60
Single sourcing to Cloud: redpanda-data/cloud-docs#536

This pull request introduces comprehensive documentation for Group-Based Access Control (GBAC) in Redpanda, detailing how permissions can now be assigned to OIDC groups in addition to individual users. It adds new conceptual and how-to guides, updates navigation, and describes configuration, usage patterns, and limitations for GBAC. It also documents new configuration properties relevant to group extraction from authentication tokens.

The most important changes are:

GBAC Documentation and How-to Guides:

  • Added a new how-to guide gbac.adoc under security/authorization, with detailed instructions, usage patterns, configuration, and examples for assigning groups to roles and creating group-based ACLs. [1] [2]
  • Added partials for UI-based group-to-role assignment (gbac-assign-group-role.adoc) and group ACL creation (gbac-create-group-acl.adoc). [1] [2]

Navigation and Discoverability:

  • Updated navigation (nav.adoc) to include GBAC under both Kubernetes and general security/authorization sections, making the new documentation easily discoverable. [1] [2]
  • Updated the main authorization index to mention group-based access control alongside ACLs and RBAC.

Release Notes and Feature Announcements:

  • Announced GBAC as a new feature in the release notes, summarizing its capabilities and usage patterns.
  • Documented two new configuration properties for GBAC: nested_group_behavior and oidc_group_claim_path.

OIDC Authentication Documentation:

  • Added a tip to the OIDC authentication documentation highlighting that GBAC can be used to assign permissions to groups, not just users.

Resolves DOC-1789
Review deadline: March 3rd

Page previews

Checks

  • New feature
  • Content gap
  • Support Follow-up
  • Small fix (typos, links, copyedits, etc)

@paulohtb6 paulohtb6 requested a review from a team as a code owner February 24, 2026 19:23
@netlify
Copy link
Copy Markdown

netlify bot commented Feb 24, 2026

Deploy Preview for redpanda-docs-preview ready!

Name Link
🔨 Latest commit 55d4b82
🔍 Latest deploy log https://app.netlify.com/projects/redpanda-docs-preview/deploys/69c6ecc05a0efd000853c7a4
😎 Deploy Preview https://deploy-preview-1584--redpanda-docs-preview.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Feb 24, 2026

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: cba04e91-1f30-462b-adb0-50e0ccb95fc9

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch gbac

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Member

@nguyen-andrew nguyen-andrew left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good so far! Just some minor comments and questions

@@ -0,0 +1,336 @@
// tag::single-source[]

Group-based access control (GBAC) builds on xref:manage:security/authorization/rbac.adoc[role-based access control (RBAC)] to simplify permission management at scale. Instead of assigning roles or ACLs to individual users, you assign them to OIDC groups managed by your identity provider (IdP). Users inherit permissions from all groups reported in their OIDC token claims, so onboarding and offboarding require no changes in Redpanda.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if we should mention OIDC earlier in the paragraph (like in the first sentence) so readers immediately understand that GBAC depends on OIDC being configured. I think the OIDC dependency could be easy to miss upfront until the reader reads further down (like the Prerequisites section).

Users with more than 200 group memberships in Azure AD receive a URL reference in their token instead of a list of group names. Redpanda does not follow that URL and cannot resolve groups in this case. Mitigation: filter token claims to include only the groups relevant to Redpanda.

Nested groups::
Redpanda does not recursively resolve nested group hierarchies. If group A contains group B, only the direct memberships reported in the token are used. Use `nested_group_behavior: suffix` to extract the last path segment from hierarchical group names when needed.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adding a link to Customize token claim extraction#nested_group_behavior or the nested_group_behavior section in the cluster properties reference could be helpful here too, if possible.

Copy link
Copy Markdown
Contributor

@treevon treevon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks good. The token extraction section is really nice with clear examples

== Prerequisites

* xref:manage:security/authentication.adoc#oidc[OIDC authentication] must be configured and enabled on your cluster.
* Superuser access to configure cluster properties and manage ACLs.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit - this is a prerequisite to enable OIDC, so should appear first

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@treevon for Cloud should we just remove this superuser prereq?

--resource-pattern-type prefixed
----

If your groups use path-style names (with xref:reference:properties/cluster-properties.adoc#nested_group_behavior[`nested_group_behavior`] set to `none`), use the full path as the principal name:
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should move this to the section on claim extraction

Copy link
Copy Markdown
Member

@nguyen-andrew nguyen-andrew left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me

end
....

== Prerequisites
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggest moving Prerequisites up above How GBAC works


. Click *Create role* to open the role creation form, or select an existing role and click *Edit*.

. In the *Principals* field, enter the group principal using the `Group:<name>` format. For example, `Group:engineering`.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
. In the *Principals* field, enter the group principal using the `Group:<name>` format. For example, `Group:engineering`.
. For *Principals*, enter the group principal using the `Group:<name>` format. For example, `Group:engineering`.

Not sure how this will look?
Image

--
endif::[]
====

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's a little weird that the options for Create group-based ACLs include rpk and Console but right after View groups and roles options include rpk and Admin API. We can add Console for that too, right?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added Console tab

Comment on lines +305 to +307
ifdef::env-cloud[]
Contact Redpanda support to configure these properties on Cloud clusters.
endif::[]
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need to confirm that, that these properties will not be configurable in Cloud? And it looks like we still need to create a PR in cloud-docs to add GBAC to Cloud.

----

==== CSV-formatted group claim

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For CSV, I think the text should go above the example, similar to the others

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I feel like the text would make more sense below the token example rather then before. For ex, I think this reads better

this is an example token group claim from the idp
this is how redpanda would extract the groups from that token

rather than

this is how redpanda would extract the groups from that token
this is an example token group claim from the idp

When xref:manage:audit-logging.adoc[audit logging] is enabled, authentication events across Kafka API, HTTP Proxy, Schema Registry, and Admin API include the user's IdP group memberships in the `user.groups` field with type `idp_group`.

== Suggested reading

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The list of suggested readings have already been linked above, and idk if the labs are really relevant. I'd probably replace with a Next steps

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed Suggested reading to Next steps, but I think the labs automatically display based on the page categories

* Assign a group as a member of an RBAC role so that all users in the group inherit the role's ACLs.
* Create ACLs directly with a `Group:<name>` principal.

Group membership is managed entirely by your IdP. Redpanda reads group information from the OIDC token at authentication time and works across all Redpanda APIs (Kafka, Admin, Schema Registry, and HTTP Proxy).
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please conditionalize out Admin API for cloud


* xref:manage:security/authorization/gbac.adoc[Configure Group-Based Access Control]
* xref:manage:kubernetes/security/authorization/k-role-controller.adoc[Manage Roles and ACLs (Operator)]
* xref:manage:security/authorization/rbac.adoc[Role-Based Access Control (RBAC)]
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you please conditionalize all these /rbac links for Cloud to xref:security:authorization/rbac/rbac.adoc. We have Security up a level in Cloud

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These are for the Kubernetes doc, so n/a

GBAC works across all Redpanda APIs:

* Kafka API
* Admin API
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

GBAC doesn't actually have any impact/influence on the Admin API. I think the Admin API only checks that your principal is a superuser and doesn't consider the groups at all (because I don't think you can set ACLs for Admin API endpoints).

Comment on lines +40 to +41
* Group assigned to a role: Assign a group as a member of a role-based access control (RBAC) role. All users in the group inherit the role's ACLs.
* Group as an ACL principal: Create an ACL with a `Group:<name>` principal. Users in that group receive that permission directly.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I feel I'd make sense to put "Group as an ACL principal" first and "Group assigned to a role" second, since Group assigned to a role (which gets ACLs) is 1 more layer of indirection than Group ACLs:

  • Group <-- ACLs
  • Group -- Role <-- ACLs


* No wildcard ACLs for groups: ACL matching for `Group:` principals uses literal string comparison only. Wildcard patterns are not supported.

== Assign groups to roles
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Related: https://github.com/redpanda-data/docs/pull/1584/changes#r2997647468
I feel sort of the same way with the ordering of this section and L169, I think showing Direct Group ACLs first and then showing the additional indirection of Group--Roles<--ACLs would be easier to understand.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Never mind, I just saw the note about "Redpanda Console assigns ACLs through roles". Maybe the overloading of the term "role" is a little confusing and reordering it might not help.


== Create group-based ACLs

You can grant permissions directly to a group by creating an ACL with a `Group:<name>` principal. This works the same as creating an ACL for a user, but uses the `Group:` prefix instead of `User:`.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the ACL terminology table might also need to be updated (the row for "Principal")


== Create group-based ACLs

You can grant permissions directly to a group by creating an ACL with a `Group:<name>` principal. This works the same as creating an ACL for a user, but uses the `Group:` prefix instead of `User:`.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might be nice to have a link to the ACLs page so the reader can see more details of how to use ACLs?

----
+
This helps diagnose incorrect claim paths, missing groups, or token content issues. The debug level reverts automatically after the expiry period (default: 300 seconds).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be helpful to add the example of how to decode & inspect the OIDC token to check for groups (as shown in the TOI), or is that more in the realm of IdP documentation rather than redpanda documention?

When xref:manage:audit-logging.adoc[audit logging] is enabled, authentication events across Kafka API, HTTP Proxy, Schema Registry, and Admin API include the user's IdP group memberships in the `user.groups` field with type `idp_group`.
endif::[]
ifdef::env-cloud[]
When xref:manage:audit-logging.adoc[audit logging] is enabled, authentication events across Kafka API, HTTP Proxy, and Schema Registry include the user's IdP group memberships in the `user.groups` field with type `idp_group`.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewing this the first time around made me realize that we were missing audit logging for Authorization events against direct group ACLs, so I added that recently. See

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's a sample audit log for the API Activity event (6003) with an Authorization matched against an ALLOW ACL directly on a Group:

{
    "category_uid": 6,
    "class_uid": 6003,
    "metadata": {
        "product": {
            "name": "Redpanda",
            "uid": "0",
            "vendor_name": "Redpanda Data, Inc.",
            "version": "v26.1.0-dev"
        },
        "profiles": [
            "cloud"
        ],
        "version": "1.0.0"
    },
    "severity_id": 1,
    "time": 1774544504327,
    "type_uid": 600303,
    "activity_id": 3,
    "actor": {
        "authorizations": [
            {
                "decision": "authorized",
                "policy": {
                    "desc": "acl: {principal type {group} name {/sales} host {{any_host}} op all perm allow}, resource: type {topic} name {sales-topic} pattern {literal}",
                    "name": "aclAuthorization"
                }
            }
        ],
        "user": {
            "name": "alice",
            "type_id": 1,
            "groups": [
                {
                    "type": "idp_group",
                    "name": "/sales"
                }
            ]
        }
    },
    "api": {
        "operation": "produce",
        "service": {
            "name": "kafka rpc protocol"
        }
    },
    "cloud": {
        "provider": ""
    },
    "dst_endpoint": {
        "ip": "127.0.1.1",
        "port": 9092,
        "svc_name": "kafka rpc protocol"
    },
    "resources": [
        {
            "name": "sales-topic",
            "type": "topic"
        }
    ],
    "src_endpoint": {
        "ip": "127.0.0.1",
        "name": "rdkafka",
        "port": 42728
    },
    "status_id": 1,
    "unmapped": {
        "authorization_metadata": {
            "acl_authorization": {
                "host": "{{any_host}}",
                "op": "all",
                "permission_type": "allow",
                "principal": "type {group} name {/sales}"
            },
            "resource": {
                "name": "sales-topic",
                "pattern": "literal",
                "type": "topic"
            }
        }
    }
}

* Assign a group as a member of an RBAC role so that all users in the group inherit the role's ACLs.
* Create ACLs directly with a `Group:<name>` principal.

Group membership is managed entirely by your IdP. Redpanda reads group information from the OIDC token at authentication time and works across all Redpanda APIs (Kafka, Admin, Schema Registry, and HTTP Proxy).
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar note as this comment - GBAC doesn't actually have any impact/influence on the Admin API.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants