GitHub permission audit checklist for private engineering orgs
Most GitHub access audits go wrong for a simple reason: the org already drifted, but nobody has one clean view of the drift.
This checklist is for org admins, engineering managers, and security-minded platform teams who need to review repo access in a way that is fast, repeatable, and defensible.
TL;DR
- Problem: stale admins, direct grants, inherited access, and old exceptions build up quietly until an audit or security review forces the cleanup.
- Who this is for: GitHub org admins, engineering managers, and platform teams responsible for private code and least privilege.
- What this helps you fix: a practical review order for high-risk access, temporary exceptions, external collaborators, service accounts, and the evidence you should keep.
1. What usually breaks
- An ex-employee still has
adminon one or more repos. - A contractor still has direct repo access because the original exception was never removed.
- A sensitive repo inherits access from a broad parent team that nobody wants to untangle by hand.
- Service accounts and bot tokens exist, but nobody can explain who owns them or why they still need the permissions they have.
- An auditor asks who can see private code, and the answer takes hours to assemble.
The point of the audit is not to count every permission. It is to decide whether the live access model still matches how the org actually works.
2. Review in this order
- Repository admins: check every repo with
adminormaintainoutside a small trusted group. - Direct user grants: find user-to-repo permissions that bypass teams and ask whether each one is still justified.
- External collaborators: confirm the owner, purpose, and end date for each external access path.
- Inherited team access: review sensitive repos attached high in the hierarchy, where parent access may now be too broad.
- Unowned repositories: if nobody can name the owning team, you do not have a stable permission model yet.
- Machine access: review service accounts, bot identities, and automation tokens separately from human access.
3. The checklist
- [ ] List critical repos, sensitive repos, and customer-facing systems first.
- [ ] Review everyone with
adminormaintain. - [ ] Review direct user grants and record the reason for each one that remains.
- [ ] Review external collaborators and contractor access.
- [ ] Check whether sensitive repos inherit access from teams that are now too broad.
- [ ] Confirm the owning team for every important repo.
- [ ] Review service accounts, deploy keys, and long-lived automation identities.
- [ ] Keep an audit note of what changed, what remained as an exception, and who approved it.
4. What evidence to keep
Good audits leave a paper trail. Keep a dated snapshot of the current state, a short list of the risky findings, the approved exceptions, and who signed off the cleanup.
- Export or snapshot of current repo and team access
- List of repos with high privilege or direct grants
- Named owners for exceptions that remain
- Proof of cleanup for stale users, contractors, and broad team mappings
5. Where native GitHub gets slow
GitHub gives you the underlying access model, but it does not give you a fast org-wide review surface. Once you have enough repos and enough exceptions, the bottleneck becomes visibility and review effort, not the absence of permissions features.
If you want the broader operating model behind this checklist, read the GitHub governance and permission drift guide. If the immediate question is whether team access should replace direct grants, continue with GitHub team access vs direct repository access.
6. Turn the checklist into a live review
If you want a faster starting point than manual clicking, see our GitHub permission audit tool page or run the free audit directly.
Related guides
- GitHub governance and permission drift guide for private orgs
- How to audit GitHub repo access in a private org
- GitHub team access vs direct repository access
- GitHub offboarding playbook for private engineering teams
- GitHub permission audit tool