Skip to content

Document Okta SCIM group push for GA (DOCS-270) - #4237

Open
SharpRake wants to merge 1 commit into
mainfrom
okta-scim-update
Open

SharpRake wants to merge 1 commit into
mainfrom
okta-scim-update

Conversation

@SharpRake

Copy link
Copy Markdown
Collaborator

[ ] Check if this is a typo or other quick fix and ignore the rest :)

Type of change

Documentation Update

  • Adds Step 5, "Push groups to grant roles," to the Okta SCIM guide: map a group to a role, push it from Okta, and verify the SCIM-managed role bindings.
  • Updates Step 1 and Step 2 of the Okta SCIM guide: enabling SCIM clears the default role, Push Groups is now selected, and the SAML placeholder values are spelled out.
  • Updates the SCIM overview and the group mappings guide so they no longer say SCIM assigns no roles or that group push must stay off. Entra ID group push stays off.

What should this PR do?

resolves https://linear.app/chainguard/issue/DOCS-270/customer-facing-docs-cover-scim-ga-updates-for-okta

Documents Okta SCIM group push, which grants Chainguard roles from Okta groups, for the SCIM GA release.

Why are we making this change?

At GA, Okta can push groups over SCIM, and Chainguard grants mapped roles as persistent role bindings. The published pages said the opposite: that SCIM assigns no roles and that readers should leave group push turned off.

What are the acceptance criteria?

  • Step 5 of the Okta SCIM guide works as written against an org with /Groups enabled.
  • The SCIM overview and group mappings guide no longer contradict the Okta guide, and both link to Step 5.
  • Entra ID guidance is unchanged: group push stays off.
  • Engineering (Steven Johnson) and Product (Grace Larsen) confirm the open questions below.

Open questions for reviewers. I tested everything on staging, but these points rest on observed behavior rather than a spec:

  • The last paragraph of Step 5 recommends Push now when a reactivated user gets a group's role back from stale membership. Is that the right advice, or is it a bug to fix?
  • Step 5 uses chainctl iam external-group-role-mappings create for SCIM groups, although its --external-group-id help still describes a token claim value.
  • A SCIM DELETE left a user's identity deactivated even after Okta provisioned them again through a new IdP. These pages don't cover it yet, pending engineering's answer.

How should this PR be tested?

Any documentation published to Chainguard Academy is reviewed carefully for accuracy. GUI procedures, API commands, and CLI code snippets in a draft are run and tested thoroughly — by both the author and the reviewer — to confirm they work exactly as written. This helps ensure that readers can follow along and get the same results. See the edu repo's README.

  1. Check the preview link and ensure the changes look right
  2. Open the Okta SCIM guide and review Steps 1, 2, and 5. To run Step 5, you need an org where /Groups is enabled. During testing, staging (chainops.dev) supported it and production returned 501.
  3. Open the SCIM overview and the group mappings guide, and confirm that the links to Step 5 resolve to the right heading.

🤖 Generated with Claude Code

…er-scim-ga-updates-for-okta

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Mark Drake <mark@chainguard.dev>
@SharpRake
SharpRake requested a review from a team as a code owner October 16, 2026 22:59
@vercel

vercel Bot commented Oct 16, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
chainguard-docs-preview Ready Ready Preview Oct 16, 2026 10:59pm UTC

Request Review

@@ -49,17 +49,19 @@ chainctl iam identity-providers scim enable $IDENTITY_PROVIDER

Generate the token first: `scim enable` fails with `etag: etag is required` if the identity provider has no token issued yet. If it instead fails with a message about owner-tier identities, your organization doesn't yet have two directly assigned owners; refer to the [prerequisites for SCIM provisioning](/platform/administration/custom-idps/scim-provisioning/scim-overview/#prerequisites).

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Enabling SCIM needs at least one owner who can sign in and whose owner role is assigned directly (not through SCIM or a group mapping), not two. The same "two owners" wording is at okta-scim line 24 and scim-overview.md lines 40 and 71, outside this diff. Two is a good recommendation, but it isn't enforced.

Then map the Okta group to a Chainguard role. Replace `<okta_group_name>` with the group's name exactly as it appears in Okta, and `<role_name>` with the role to grant, such as `viewer` or `editor`:

```sh
chainctl iam external-group-role-mappings create \

@heplayskeys heplayskeys Oct 18, 2026 •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Two additions: the mapping must use the group's name as it was first pushed, and you can only map a role you already hold. owner and support are never granted through SCIM: a mapping to either is accepted but gives no access.

```

{{< note >}}
Okta doesn't send a stable identifier for groups, so Chainguard matches a pushed group by its name. If you rename the group in Okta, the mapping stops matching, and Chainguard reports no error. After a rename, create a mapping for the new name.

@heplayskeys heplayskeys Oct 18, 2026 •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

This is the reverse of what happens. After a rename the group keeps the name it had at its first push as the key, so the existing mapping keeps working and a mapping for the new name matches nothing.

Suggested: "Okta doesn't send a stable identifier for groups, so Chainguard identifies a group by its name the first time it is pushed, matched exactly including case. If you rename the group in Okta, the mapping keeps working under the original name, so keep using the original name in mappings. You can't reuse the original name for a new group until you unlink the original with Delete the group in the target app."

1. If you set up the provisioning app before group push was available, open its **Provisioning** tab, select **Integration**, click **Edit**, and select **Push Groups** under **Supported provisioning actions**.
2. On the provisioning app's **Assignments** tab, click **Assign** > **Assign to Groups**, and assign the group. Okta pushes group membership only for users assigned to the app, and assigning the group also provisions its members as Chainguard users.
3. On the **Push Groups** tab, click **Push Groups** > **Find groups by name**, and enter the group's name.
4. Leave **Push group memberships immediately** selected, and click **Save**.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Worth adding how to retire a group. Delete the group in the target app removes the group and the roles only it granted. Leave the group in the target app sends nothing, so the group and its roles stay as they were and people removed from it later keep their roles. Deleting a group never deprovisions its members: unassign them from the app to remove them.


The group's **Push Status** changes to **Active** once Okta has pushed it.

### Verify the role bindings

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Two additions. A new mapping or a membership change takes up to about five minutes to apply, and a person's first sign-in applies theirs immediately. And chainctl iam identity-providers scim groups list $IDENTITY_PROVIDER shows the pushed group, its name and member count, so readers can confirm the group arrived before anyone has signed in.


To confirm that removal works, remove the member from the group in Okta, then list the role bindings again. Chainguard deletes the binding shortly after Okta sends the change.

If you assigned the member to the provisioning app only through the group, removing them from the group also deactivates their Chainguard user. Okta doesn't remove a deactivated user from the group it pushed, so the user can get the group's role back if they're reactivated. If that happens, open the **Push Groups** tab and select **Push now** from the group's **Push Status** menu. Okta then sends the group's current membership, and Chainguard removes the role.

@heplayskeys heplayskeys Oct 18, 2026 •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

The workaround is right, but the cause is slightly different. Okta deactivates the user without sending a membership removal, so Chainguard still holds the membership, and after reactivation the role is restored from it, normally within about five minutes. Push now makes Okta send the group's current members, which removes the stale member.

Suggested: "...the user can get the group's role back a few minutes after they're reactivated. To prevent this, select Push now before you reactivate the user."

* **Deactivation takes effect at the user's next login or token refresh.** When your IdP deactivates or unassigns a provisioned user, their current access token runs out on its own schedule (up to an hour), and Chainguard refuses every attempt to log in or refresh after the deactivation. Reactivating the user in your IdP restores their ability to log in; it does not restore any role bindings that were removed while they were deactivated.
* **Provisioning does not assign roles.** A provisioned user who logs in gets the identity provider's default role, plus any group-mapped roles and role bindings they hold, same as any other user.
* **Deactivation takes effect at the user's next login or token refresh.** When your IdP deactivates or unassigns a provisioned user, their current access token runs out on its own schedule (up to an hour), and Chainguard refuses every attempt to log in or refresh after the deactivation. Reactivating the user in your IdP restores their ability to log in; it does not restore any role bindings that were removed while they were deactivated. Bindings from Okta group push are the exception: Chainguard re-creates them from the user's group memberships.
* **Provisioning assigns roles only through pushed groups.** A provisioned user who logs in gets any group-mapped roles and role bindings they hold, same as any other user. With Okta, they also get role bindings from the groups Okta pushes, as described in [Push groups to grant roles](/platform/administration/custom-idps/scim-provisioning/okta-scim/#step-5-push-groups-to-grant-roles). Enabling SCIM clears the identity provider's default role.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

"Chainguard re-creates them from the user's group memberships" should add "within a few minutes", since a background process restores them.

This branch was successfully deployed

1 active deployment
Preview — 77f115d3 Deployed Oct 16, 2026 by vercel[bot]
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.

2 participants