|
|
| Version |
1.0 |
| Date |
2026-06-22 |
| Domain |
mptwork.com |
| Deployment |
GitHub Enterprise Cloud with an enterprise account mptwork (github.com/enterprises/mptwork) |
| Identity model |
Enterprise Managed Users (EMU) — accounts created/controlled via Microsoft Entra (SAML + SCIM) |
| Companion SOP |
Entra ID authentication & SSO — sop-entra-id-authentication-sso-mptwork.md |
Goal: stand up GitHub so every developer signs in with their @mptwork.com identity through the company IdP, accounts are provisioned/deprovisioned automatically, and users are fully company-controlled managed accounts rather than personal GitHub.com accounts.
0. Choose deployment, tier, and identity model
Deployment:
| Option |
Use |
| GitHub Enterprise Cloud |
GitHub-hosted (GitHub.com); this SOP's path. Data-residency regions available via GHE.com |
| GitHub Enterprise Server |
Self-hosted (air-gapped / strict residency) |
Tier / pricing: GitHub Enterprise Cloud lists at ~$21/user/month. Add-ons: GitHub Advanced Security (now sold as Secret Protection + Code Security) and Copilot (Business ~$19, Enterprise ~$39, the latter requiring Enterprise Cloud). A 30-day Enterprise Cloud trial is available.
Identity model — the irreversible decision (make it now):
| Model |
What it means |
| Enterprise Managed Users (EMU) (recommended for "enterprise users") |
GitHub creates and fully controls each account from your IdP via SCIM; usernames are suffixed (e.g., jsmith_mptwork); users cannot use these accounts for personal/public work outside the enterprise; profile name/email are IdP-controlled. True SCIM lifecycle. |
| Standard enterprise + SAML SSO |
Users keep their personal GitHub.com accounts and authenticate via your IdP; SCIM only sends invitations, not full provisioning. Less control. |
Critical: EMU must be set up on a new enterprise account from inception — a standard enterprise cannot be converted to EMU later. Choose EMU now if you want company-controlled enterprise users. This SOP uses EMU.
Part 1 — Subscribe and create the EMU enterprise
- Engage GitHub Sales (or your Microsoft EA rep — GitHub is Microsoft-owned and pricing can route through an EA) to purchase Enterprise Cloud and request a new EMU enterprise. (Or start the 30-day trial to pilot.)
- GitHub provisions the enterprise
mptwork and emails you to set up the "setup user" — a special emergency-access account that bypasses SSO (the EMU break-glass). Set its password and store it offline. - Sign in as the setup user, go to the enterprise → Settings, and on the setup user generate a personal access token (classic) to configure SCIM later.
Part 2 — Verify the mptwork.com domain
- Enterprise → Settings → Verified & approved domains → Add a domain →
mptwork.com. - Verify. A verified domain lets you restrict email notifications to
@mptwork.com and display verified badges.
Add the TXT record GitHub provides at your DNS host:
| Type |
Host |
Value |
| TXT |
_github-challenge-mptwork-org.mptwork.com (as shown) |
XXXXXXXX (copy exact from GitHub) |
- In Entra → Enterprise applications → New application → add the GitHub Enterprise Managed User gallery app. Open Single sign-on → SAML and note the Login/Sign-on URL, Issuer (Identifier), and download the certificate.
- As the setup user, go to enterprise → Settings → Authentication security:
- Select Require SAML authentication.
- Sign on URL = Entra Login URL; Issuer = Entra Identifier; Public certificate = the Entra signing certificate.
- Use Test SAML configuration (expect a green tick), then Save.
- Save the SAML recovery codes GitHub displays — they're needed to change/disable SAML if SSO breaks.
- As the setup user, ensure SCIM is enabled and use the personal access token from Part 1 as the SCIM bearer token (partner-IdP flow uses the gallery app).
- In the Entra GitHub Enterprise Managed User app → Provisioning → Automatic:
- Tenant URL (SCIM endpoint):
https://api.github.com/scim/v2/enterprises/mptwork/ - Secret token: the setup user's token.
- Configure attribute mappings (userName, name, emails, externalId) and use the Roles attribute to set each user's enterprise role (member / owner / guest collaborator).
- Assign users/groups (e.g.,
Staff-GitHub) to the app and start provisioning. GitHub creates managed accounts named like jsmith_mptwork; unassigning/disabling a user in Entra invalidates sessions and disables the GitHub account.
Use a single partner IdP (Entra) for both SAML and SCIM — GitHub doesn't support mixing IdPs (e.g., Okta + Entra).
Part 5 — Organizations and repositories
- Under the enterprise, create organizations by business line, e.g.
mptwork-eng, mptwork-data, mptwork-it. - Within each org, create teams (ideally mapped to IdP groups) and repositories.
- Set repository visibility appropriately — in EMU, repos are private or internal (no public repos); internal repos are visible across the enterprise.
Part 6 — Roles and access
| Scope |
Roles |
| Enterprise |
Owner (full admin), Member, Guest collaborator (limited to internal repos — for vendors/contractors) |
| Organization |
Owner, Member; team maintainer |
| Repository |
Read, Triage, Write, Maintain, Admin |
- Assign enterprise roles via the Roles attribute in the IdP (Part 4).
- Drive org/team membership from IdP groups so access follows joiners/movers/leavers automatically.
- Keep enterprise Owners to a minimum.
Part 7 — Security baseline
- SSO + 2FA are enforced through Entra (managed users authenticate only via SAML).
- Repository rulesets / branch protection: require pull-request reviews, status checks, and block direct pushes to
main; require Code Owner review on sensitive paths. - Push protection / secret scanning: enable GitHub Secret Protection to block committed secrets; enable Code Security (code scanning/CodeQL, dependency review) for vulnerability detection.
- Audit log streaming: stream the enterprise audit log to Microsoft Sentinel or your SIEM.
- IP allow lists and policy controls at the enterprise level for restricted access.
Part 8 — Actions (CI/CD)
- GitHub Actions runs pipelines; Enterprise includes a monthly Actions minutes allowance (Linux 1×, Windows 2×, macOS 10× consumption).
- Use GitHub-hosted runners or register self-hosted runners for special hardware/data-locality needs.
- Prefer OIDC from Actions to cloud providers (AWS/Azure/GCP) over long-lived secrets; manage Actions policies (allowed actions, required workflows) at the enterprise/org level.
Part 9 — User lifecycle (SCIM)
| Event |
Mechanism |
| Joiner |
Assign to the Entra GitHub EMU app → SCIM creates name_mptwork, sets role and group/team access |
| Mover |
Change Entra group membership → org/team access follows |
| Leaver |
Disable/unassign in Entra → SCIM disables the managed account and ends sessions; seat reclaimed |
| Contractor |
Provision as a guest collaborator (internal-repo access only) |
Reconcile consumed seats vs licensed seats, especially before renewal.
Part 10 — Ongoing operations
| Cadence |
Activity |
| Daily / as needed |
Access requests; security alerts; failed sign-ins |
| Weekly |
SCIM provisioning health; ruleset/branch-protection adherence; secret-scanning alerts |
| Monthly |
Seat/license reconciliation; audit-log review; Actions minutes usage |
| Quarterly |
Enterprise Owner and org/team membership review; SAML certificate expiry check; recovery-code custody check |
| Annually |
Renew subscription; confirm GHAS (Secret Protection/Code Security) and Copilot scope; seat true-up |
Appendix — EMU vs standard, and caveats
EMU vs standard enterprise
|
EMU |
Standard + SAML |
| Account ownership |
Company-controlled, created by IdP |
User's personal GitHub account |
| SCIM |
True provisioning/deprovisioning |
Invitations only |
| Public/personal use |
Not allowed |
Allowed (personal account) |
| Set up later? |
No — at inception only |
Can add SAML to existing org |
Caveats
- EMU is irreversible — decide before creating the enterprise. Managed users can't change their profile name/email (IdP-controlled) and can't collaborate publicly outside the enterprise.
- The setup user is the SSO-bypass break-glass; protect it and the SAML recovery codes.
- One partner IdP for both SAML and SCIM (Entra here) — mixing IdPs is unsupported.
- SAML certificates expire — track the Entra app's signing-certificate expiry to avoid an SSO outage.
- Verify current pricing/steps at
github.com/pricing and GitHub Docs — tiers, GHAS packaging, and console layout change periodically.