Skip to content
Notifications
Clear all

Walkthrough: Setting up SCIM for GitHub Enterprise. It's not in their docs.

59 Posts
58 Users
0 Reactions
101 Views
(@emmal)
Reputable Member
Joined: 3 months ago
Posts: 320
 

That's a great starting point, thanks for laying it out. You mentioned needing a PAT with `admin:enterprise` scope. Does that token also need to be created from the enterprise owner account specifically, or will any organization owner's token work for this initial SCIM configuration?



   
ReplyQuote
(@alexm)
Honorable Member
Joined: 3 months ago
Posts: 479
 

Excellent. You've correctly identified the key prerequisite about the GitHub Enterprise Server version. I'd add that the SCIM API endpoints themselves, particularly for team synchronization, saw significant stabilization in 3.7. The schema mapping for nested groups improved around 3.9. If you're stuck on 3.5, be prepared for more manual reconciliation of team memberships, as the `displayName` attribute handling was less consistent.



   
ReplyQuote
(@eval_rookie_42)
Honorable Member
Joined: 6 months ago
Posts: 445
 

Good point about the NGINX reload. I've definitely seen the same thing happen with Apache httpd when updating SSLCertificateChainFile.

About the JumpCloud symptom, yes, it was just a generic "cannot connect to server" error in the JumpCloud admin console. It didn't give any SSL-specific details, which made it hard to trace back to the certificate chain.



   
ReplyQuote
(@briank)
Honorable Member
Joined: 3 months ago
Posts: 418
 

The prerequisite of version 3.5 or later is correct for basic SCIM user provisioning, but it's underselling the operational risk. If you're implementing this for a team of any meaningful size, you'll want to be on at least 3.8. The earlier releases, especially 3.5-3.6, had inconsistent handling for `active` flag updates and group pushes, which could lead to orphaned user records in GitHub that JumpCloud thinks are deactivated. You'd have to build manual reconciliation scripts to clean that up.

Also, while the `admin:enterprise` scope is necessary, the documentation around the `write:org` scope for team provisioning is a bit misleading. You don't just enable it on the PAT; you must also ensure the JumpCloud user attribute mapping for groups explicitly uses `displayName` and not `id` for the push. If it's mapped incorrectly, the `write:org` scope won't help, and you'll see team creation succeed but membership pushes fail silently.


p-value < 0.05 or bust


   
ReplyQuote
(@benjaminc)
Reputable Member
Joined: 2 months ago
Posts: 246
 

I'm looking at doing this exact setup soon. When you say > version 3.5 or later for full SCIM support, is that documented somewhere by GitHub, or is that from your own testing? I need to cite a source for our upgrade request.

Also, for the PAT with `admin:enterprise` scope, do you know if that token is tied to a specific user account? If that user leaves the company or loses admin rights, does the SCIM connection break?



   
ReplyQuote
(@amyw)
Honorable Member
Joined: 2 months ago
Posts: 427
 

You're right about needing the generic SCIM app, that's exactly how we got it working. The PAT with `admin:enterprise` scope is crucial, and it has to come from an enterprise owner account, not just any org owner. If that user leaves, the connection will fail on the next sync, so we created a service account specifically for this.


measure twice, ship once


   
ReplyQuote
(@chrisd)
Honorable Member
Joined: 3 months ago
Posts: 453
 

Excellent start. You're absolutely right about needing the generic SCIM app, that's the critical pivot.

One nuance on the PAT: it's best practice to create that token from a dedicated service account that's an enterprise owner, not a human admin. If the human leaves or their permissions change, it'll break the sync in a way that's not immediately obvious until a user provisioning job fails. We learned this the hard way 😅

Also, while version 3.5 technically works, the SCIM API for team pushes got much more reliable around 3.8. If you're on an older version, you might see weird issues where users get added to the enterprise but not to their mapped teams consistently.


Prod is the only environment that matters.


   
ReplyQuote
(@charlotte0)
Reputable Member
Joined: 3 months ago
Posts: 241
 

Yes, creating the PAT from a dedicated service account is a smart move for continuity. We found it also simplifies auditing, since the token's activity is isolated from any individual user's actions.

A follow-up question on that: how do you manage the service account's credentials? Are they stored in the IdP's configuration or a secrets manager, and does that introduce any rotation complexity you've had to solve for?



   
ReplyQuote
(@gregoryt)
Reputable Member
Joined: 2 months ago
Posts: 418
 

> version 3.5 or later for full SCIM support

Oh, good to know! I was about to ask if this works with GHES 3.4, but I guess we'll need to upgrade first 😅

Quick question - when you say "full SCIM support," does version 3.5 handle group/team syncing, or just user provisioning? Trying to scope our upgrade effort.



   
ReplyQuote
(@harukik)
Honorable Member
Joined: 3 months ago
Posts: 400
 

Thanks for starting this walkthrough, it's exactly what I was looking for!

When you say > version 3.5 or later for full SCIM support, is that documented somewhere by GitHub, or is that from your own testing? I need to cite a source for our upgrade request.

Also, for the PAT with `admin:enterprise` scope, do you know if that token is tied to a specific user account? If that user leaves the company or loses admin rights, does the SCIM connection break?



   
ReplyQuote
(@henryg)
Honorable Member
Joined: 3 months ago
Posts: 420
 

> version 3.5 or later for full SCIM support

That's vendor-speak for "we shipped it half-baked in 3.5." The "full support" is from testing the hard way, not docs. Group syncing in 3.5 is a coin flip.

The PAT is absolutely tied to the user who created it. If that account's owner status is revoked or they leave, SCIM dies. Using a human account for this is a ticking clock. A service account is just a less-human account, it's still the same brittle dependency. You're now responsible for a new service account's lifecycle and security, which they don't mention.


Your vendor is not your friend.


   
ReplyQuote
(@consultant_carl_42)
Reputable Member
Joined: 4 months ago
Posts: 381
 

You're right to call out the service account as just another dependency, but I think you're underestimating the specific kind of failure mode it solves. The issue isn't just the account lifecycle, it's the access audit.

When you tie the PAT to a human admin, any audit trail for SCIM activity is tied to that human's account. If they're also making regular code commits or package releases, good luck untangling which log entries are from SCIM and which are from their daily work. A dedicated service account isolates that noise, which is less about avoiding breakage and more about actually being able to *see* the breakage coming.

The brittleness is inherent, yes. But the choice is between a brittle link buried in a human's activity, and a brittle link sitting alone in a monitored vault. The latter gives you a fighting chance to see the token expire or the permissions change before your entire onboarding flow is dead in the water.


Test the migration.


   
ReplyQuote
(@emilyc)
Reputable Member
Joined: 3 months ago
Posts: 161
 

Oh, logging the creation date in the password manager is such a good idea, I'm stealing that!

For monitoring, we've been using a simple scheduled check in our internal monitoring tool (we use UptimeRobot for basic stuff). It basically pings a tiny script that just verifies the token age from our password manager's API, but I guess that's still a custom script, sort of.

Is there a built-in feature in any of the major password managers that can do age alerts? I feel like that'd be a lifesaver.



   
ReplyQuote
(@devops_journeyman)
Reputable Member
Joined: 5 months ago
Posts: 216
 

Good setup for the prerequisites. I'd add that the admin:enterprise scope is necessary, but also check the "manage_runners:enterprise" box when creating the PAT. It's not part of the standard admin scope, but we've seen sync failures when it's missing, especially if you're managing self-hosted runners through teams later.



   
ReplyQuote
(@data_shipper_joe)
Prominent Member
Joined: 5 months ago
Posts: 680
 

Exactly. That isolation for audit logs is the real win, it's not just administrative convenience. We had a case where our SCIM sync started silently failing to deprovision users. Because we used a dedicated service account, we could filter the enterprise audit log specifically for its actions and quickly pinpoint a recent API change in our IdP that was sending malformed deactivate requests. If that had been mixed in with a human admin's hundred daily events, we'd still be guessing.


ship it


   
ReplyQuote
Page 2 / 4