Derek Osei found the email at 6:52 a.m., before his coffee had finished brewing. Subject line: "Northbeam Payroll — Type II Exceptions Requiring Management Response." Derek was VP of Engineering at Northbeam Payroll, a payroll and benefits platform processing roughly $1.1 billion a year in disbursements for 400-odd mid-market employers. Northbeam was eleven weeks from closing a $3.4 million enterprise contract with a national retail chain — a deal that hinged, in no small part, on a clean SOC 2 Type II report the retailer's vendor security team had explicitly requested.
The exceptions were not exotic. Northbeam's auditor, sampling 25 terminated employees across the six-month observation window, found that 6 of them — including two former engineers with production database credentials and one former customer success rep with access to a payroll processing tool — still had active accounts between 14 and 61 days after their last day of employment. A seventh case involved a marketing contractor whose AWS console access had never been reviewed in fourteen months, despite three role changes. None of it was malicious. All of it was avoidable. And all of it now sat in a qualified-opinion-risk conversation with a prospect's procurement team.
I got looped in that week as the outside advisor helping Northbeam's leadership triage the response. What struck me — and what strikes me on almost every engagement like this one — is that access control failures are rarely about bad technology. Northbeam had Okta. They had a ticketing system. They had an offboarding checklist in Confluence that nobody updated. The gap wasn't tooling; it was that provisioning, deprovisioning, and review had never been designed as a system with owners, SLAs, and evidence. That's what this article gives you.
Who This Is For and What You'll Walk Away With
This is written for the person who owns — or is about to own — access governance ahead of a SOC 2 examination: a VP of Engineering, an IT director, a first compliance hire, or a founder wearing all three hats. You'll get the real mechanics of CC6.2 and CC6.3 — the two Common Criteria that govern user provisioning, deprovisioning, and periodic review — translated into a program you can actually run: a joiner/mover/leaver workflow with named owners, a privileged access model, an access-review cadence with evidence templates, and the exception list your auditor is most likely to write up. This article is scoped to who gets access to what, and for how long — the identity lifecycle and privilege governance side of CC6. It is deliberately distinct from the authentication mechanisms (MFA, password policy, session timeout) covered in SOC 2 Logical Security: System Access and Authorization — read that one alongside this article for the full CC6 picture.
Why Auditors Circle Access Controls First
If you ask a Type II auditor which control area produces the most exceptions across a portfolio of clients, access control administration wins almost every time — not because it's technically hard, but because it's operationally relentless. A firewall rule, once configured correctly, tends to stay correct. A user's access, by contrast, needs to change every time someone joins, changes roles, goes on leave, gets promoted, or leaves — and every one of those events is a chance for the process to be skipped, delayed, or done inconsistently.
CC6 sits inside the Common Criteria — the Trust Services Criteria category required in every SOC 2 report regardless of which optional categories a company adds — and it maps to the COSO framework's control-activities principles around restricting access to protected information assets. In my own portfolio of clients, the pattern is consistent: companies under 100 employees usually pass their first Type II with access findings; companies that have scaled past 150–200 employees without formalizing the JML process almost never do. Growth is what breaks informal access management, not malice.
"I don't fail companies for having imperfect access controls. I fail them for not being able to tell me, with evidence, who approved access and when it was removed. The control can be simple. It just has to be provable." — Marcus Webb, Director of IT Audit, Continuum CPAs
CC6.2 and CC6.3: What This Article Covers (and What It Doesn't)
It's worth being precise about scope, because "access controls" is a phrase that gets used loosely and it causes confusion between this article and its sibling. Under the Common Criteria, the points of focus most directly relevant to user and privilege administration are:
CC6.2 — prior to issuing system credentials and granting access, the entity registers and authorizes new internal and external users, and access is removed when no longer required.
CC6.3 — the entity authorizes, modifies, or removes access based on roles, responsibilities, or the system design and changes; it considers the concepts of least privilege and segregation of duties; and access is reviewed periodically.
That's this article: the identity lifecycle, role assignment, privileged access, and recertification. What it is not is the mechanism by which access is technically enforced once granted — password composition, multi-factor authentication, single sign-on, session timeout, network-level authentication architecture. Those points of focus (principally CC6.1 and CC6.6) belong to SOC 2 Logical Security: System Access and Authorization. Auditors test both, but they test them differently: this article's controls get tested through HR records, ticket trails, and review sign-offs; the sibling article's controls get tested through system configuration screenshots and authentication logs. Keep the two workstreams organizationally separate even if the same person owns both — it makes audit fieldwork faster and your evidence cleaner.
The Joiner-Mover-Leaver Lifecycle, End to End
Every access-control program worth having is built around one idea: access should track a person's current, authorized business need, continuously, from their first day to well after their last. Practitioners shorthand this as JML — joiner, mover, leaver — and it's the backbone CC6.2 and CC6.3 are built to test.
flowchart TD
A[HR system: new hire, role change,\nor termination event created] --> B{Event type}
B -->|Joiner| C[Manager submits access request\ntied to role/job profile]
B -->|Mover| D[Manager submits change request:\nadd new access, flag old access\nfor removal]
B -->|Leaver| E[HR triggers termination workflow\nsame day as last-day notice]
C --> F[Access owner approves\nagainst least-privilege baseline]
D --> F
F --> G[IT/IAM provisions or modifies\naccess in target systems]
G --> H[Ticket closed with evidence:\napprover, systems, timestamp]
E --> I[IT/IAM disables all accounts\nwithin defined SLA]
I --> J[Access owner confirms removal\nacross all in-scope systems]
J --> H
H --> K[Access logged in identity\nsystem of record]
K --> L[Periodic access review\nsamples the record]
L -->|Exception found| M[Remediate + document\ncorrective action]
L -->|Clean| N[Recertification evidence\nfiled for audit]The diagram looks simple. The discipline is in making every arrow produce a timestamped, attributable record — because an auditor doesn't test whether your process is well-designed on paper; they test whether it operated for every sampled individual across the observation window.
Lifecycle Stage | Trigger Event | Primary Owner | Required Action | Evidence Generated |
|---|---|---|---|---|
Joiner | Signed offer / HR new-hire record | Hiring manager + IT/IAM | Access provisioned to role-based baseline only | Access request ticket, approval, provisioning log |
Joiner (privileged) | Role requires elevated/admin access | System owner + security | Separate approval beyond baseline; time-bound if possible | Privileged access request, second approval, expiry date |
Mover (role change) | HR role/department update | New manager + old manager | New access added; old access flagged for removal | Change ticket, dual sign-off, before/after access snapshot |
Mover (leave of absence) | HR leave record | IT/IAM | Account suspended, not deleted, for duration of leave | Suspension log, reactivation approval |
Leaver (voluntary) | Resignation notice in HR system | HR + IT/IAM | All access disabled by/at last day per SLA | Termination ticket, disable timestamp, system-by-system checklist |
Leaver (involuntary) | Termination decision | HR + Legal + IT/IAM | Access disabled at or before notification, same-day | Same-day disable log, security incident note if risk flagged |
Periodic recertification | Calendar / risk-tier cadence | Access/system owner | Confirm each user's access is still required | Signed review record, exceptions log, remediation tickets |
Provisioning: Turning a Job Offer Into Access, Deliberately
Provisioning is the joiner half of JML, and it's where most companies' instincts are actually decent — nobody wants a new hire sitting idle on day one, so there's usually urgency to get access sorted. The risk isn't that provisioning happens too slowly; it's that it happens too loosely. A common anti-pattern I see: a new engineer joins, and rather than being provisioned against a defined role template, someone on the team "clones" the access of whoever sits next to them, because it's fast. Six months later nobody remembers why that engineer has access to the billing database, because the person they were cloned from left that team two roles ago.
The fix is a role-based baseline: every job function in the company maps to a documented, minimum-necessary set of system access, built once and reused for every joiner in that role. New hires get exactly the baseline, no more, at day one. Anything beyond the baseline — admin rights, access to a sensitive customer database, production infrastructure — requires a distinct, logged approval from the system or data owner, not the hiring manager alone. This is the practical expression of least privilege: granting the minimum access necessary to do the job, by design, rather than by exception review months later.
"We stopped asking 'what access does this person need' and started asking 'what access does this role need.' The moment we made that switch, provisioning tickets got faster and our access review got shorter, because there was nothing weird to explain." — Priya Nataraj, CISO, Northbeam Payroll
Role Family | Baseline Systems | Baseline Access Level | Requires Additional Approval For |
|---|---|---|---|
Customer Success | CRM, support ticketing, read-only billing view | Standard user | Refund issuance, account deletion tools |
Software Engineering | Source control, staging environment, CI/CD | Standard developer | Production database, cloud console admin |
Finance/Accounting | ERP, expense system, read-only payroll reports | Standard user | Bank transfer initiation, payroll run approval |
Site Reliability/Ops | Monitoring, staging + production infra (scoped) | Elevated (role-justified) | Root/admin cloud account access |
People/HR | HRIS, benefits admin portal | Standard user | Compensation data export, org-wide HRIS admin |
Sales | CRM, quoting tool | Standard user | Contract system admin, discount override rights |
Approval Workflows: Who Actually Signs Off
A role-based baseline only works if the approval chain behind it is unambiguous. The recurring failure mode I see in mid-size companies is a request that gets "approved" by whoever happened to be online in the ticketing tool that day — often someone with no real authority over the system being granted. Auditors test for authorized approval, which means the approver has to be someone the company has formally designated as the owner of that access decision, and that designation itself needs to exist in writing.
A clean model separates three roles for every access decision: the requester (usually the hiring or people manager, who knows the business need), the approver (the system or data owner, who knows whether the access is appropriate), and the provisioner (IT/IAM, who executes the technical change and logs it). Collapsing requester and approver into the same person is the single most common design flaw I flag in readiness assessments — it means access requests are effectively self-approved.
Activity | Requester | Approver | Provisioner | Reviewer (Periodic) |
|---|---|---|---|---|
Standard joiner access | Hiring manager | System/data owner (or delegate) | IT/IAM team | System owner, quarterly/annual |
Privileged access grant | Manager or self (with justification) | Security lead + system owner (dual) | IT/IAM team | Security lead, quarterly |
Mover access change | New manager | System/data owner | IT/IAM team | System owner, next review cycle |
Leaver access removal | HR (termination trigger) | IT/IAM confirms completion | IT/IAM team | Compliance, sampled in every audit period |
Service account creation | Engineering lead | Security lead | IT/IAM or platform team | Security lead, quarterly |
Emergency/break-glass access | Requesting engineer | On-call security approver (post-hoc allowed) | Automated or on-call IT | Security lead, within 5 business days |
Privileged Access: Why It Gets Extra Scrutiny
Standard user access, if compromised, usually causes contained damage. Privileged access — production database admin, cloud root accounts, domain admin, source-code deployment rights, payroll run approval — is where a single compromised credential or a single careless grant can cause company-defining damage. That asymmetry is exactly why privileged access management gets its own line of testing in most SOC 2 fieldwork, even though it's technically a subset of the same CC6.2/CC6.3 points of focus.
The practical program has four pillars: an accurate inventory of every privileged account and the system it touches; restriction of privileged accounts to only the people whose job genuinely requires standing elevated access; separation of privileged accounts from everyday accounts (an engineer's admin login should not be the same credential they use to read email); and monitoring of what privileged accounts actually do, because provisioning controls alone don't tell you whether elevated access was misused. Where budget allows, time-bound or just-in-time elevation — where standing admin rights are replaced by short-lived, approved elevation requests — meaningfully shrinks the attack surface and gives auditors a cleaner story than "these twelve people have permanent root."
Privileged Access Control | What It Prevents | Implementation Baseline | Maturity Upgrade |
|---|---|---|---|
Privileged account inventory | Unknown/orphaned admin accounts | Spreadsheet or IAM report, reviewed quarterly | Automated discovery via IAM/PAM tool |
Separate privileged credentials | Lateral movement from routine account compromise | Distinct admin login, not used for daily work | Hardware-token-gated privileged login |
Least-privilege scoping | Blast radius of a compromised account | Role-scoped admin rights, not blanket root | Just-in-time elevation with automatic expiry |
Dual approval for grants | Unilateral self-escalation | Manager + security sign-off for any elevation | Automated approval workflow with audit trail |
Session recording/monitoring | Undetected misuse of elevated access | Centralized logging of privileged actions | Session recording + anomaly alerting |
Periodic privileged recertification | Privilege creep over time | Quarterly review of every privileged grant | Continuous entitlement monitoring |
Break-Glass: Emergency Access Without Losing Control
Every environment eventually has a 2 a.m. incident where someone needs access they don't normally have, right now, and there's no time for the standard dual-approval workflow. The mistake companies make isn't having an emergency path — auditors expect one — it's leaving it undocumented, so "emergency access" quietly becomes the backdoor people use whenever the normal process feels slow. A defensible break-glass procedure grants emergency access fast, but requires it to be logged and justified within a fixed window afterward, reviewed by someone independent of the requester.
Break-Glass Element | Requirement | Owner | Timing |
|---|---|---|---|
Emergency access request | Logged with reason, system, requester identity | Requesting engineer/on-call | At time of use |
Real-time notification | Alert sent to security on-call automatically | Automated tooling | Immediate |
Post-hoc approval | Security lead reviews justification | Security lead | Within 24 hours |
Access expiry | Credential automatically revoked | IAM/PAM tooling | End of incident or max 24–48 hrs |
Documentation | Incident ticket links access grant to remediation | Requesting engineer | Within 5 business days |
Audit review | Sampled specifically in every review cycle | Compliance/security | Quarterly |
Service Accounts and Non-Human Identities
Somewhere around the third or fourth integration a company builds — a CI/CD pipeline that deploys to production, a monitoring tool that reads logs across every service, a data pipeline that pulls from three SaaS APIs — human-centric access thinking starts to break down, because the majority of new "identities" being created aren't people. Service accounts, API keys, and machine identities routinely outnumber human accounts in a mature SaaS environment, and they're disproportionately likely to be over-privileged, because nobody wants a pipeline to fail at 3 a.m. for a permissions reason, so the instinct is to grant broad access "just in case."
Auditors increasingly test service accounts with the same rigor as human accounts, and for good reason: a service account with standing admin rights and no owner is a more attractive target than most human accounts, because it's less likely to be monitored and less likely to trigger anomaly alerts tuned for human behavior patterns. The fix is to treat every service account as a first-class identity with an owner, a documented purpose, a defined scope, and a rotation/expiry schedule for its credentials — not as invisible infrastructure plumbing.
"We found forty-one service accounts during our first inventory exercise. We knew what eleven of them did. That gap, more than anything else, is what convinced our board to fund a real IAM program." — Jamal Ibrahim, VP Engineering, Corvid Health
Service Account Control | Requirement | Owner | Review Cadence |
|---|---|---|---|
Inventory and ownership | Every service account has a named human owner | Engineering/platform lead | Quarterly |
Purpose documentation | Documented reason for the account and its scope | Account owner | At creation, reviewed quarterly |
Least-privilege scoping | Access limited to what the integration requires | Security + account owner | At creation and on change |
Credential rotation | API keys/secrets rotated on a fixed schedule | Platform/security team | Per policy (e.g., 90 days) |
No shared human use | Service accounts never used for interactive human login | Security | Continuous (monitored) |
Decommission trigger | Account disabled when integration is retired | Account owner | At retirement, verified quarterly |
Deprovisioning: The Leaver Process and Why Timing Is Everything
If provisioning is where companies are fast but loose, deprovisioning is where they're slow and inconsistent — and it's the single most commonly cited exception in SOC 2 access-control testing, Northbeam's situation included. The reason is structural: provisioning has an obvious, motivated requester (the new hire needs to work). Deprovisioning has no equivalent pull — the departing employee isn't asking for their access to be removed, and the people who know it should happen (HR, the departing manager) aren't always the people with the technical ability to do it (IT/IAM).
The fix is to make termination an automatic trigger rather than a manual reminder. The moment HR records a termination date — whether that's initiated at resignation or at the termination decision itself — it should fire a workflow that IT/IAM is obligated to close within a defined SLA, with a system-by-system checklist so nothing gets missed (email, SSO/identity and access management platform, VPN, source control, cloud consoles, physical badge, SaaS tools provisioned outside the SSO umbrella). That last category — the SaaS tool someone signed up for with a personal or shared login outside single sign-on — is where I find the most overlooked residual access, because it never shows up in an SSO-based audit.
Timing matters more than most companies initially budget for. A voluntary resignation with two weeks' notice can usually tolerate access removal timed to the actual last day. An involuntary termination — particularly one involving any conflict — should trigger access removal at or before the individual is notified, because the risk of retaliatory action rises sharply between notification and the traditional "end of day" removal window.
Risk Tier | Example Roles | Access Removal SLA | Trigger Point |
|---|---|---|---|
Standard voluntary departure | Individual contributor, no privileged access | Same business day as last day | HR last-day record |
Standard involuntary departure | Individual contributor, performance-based | At time of notification | HR termination decision |
Privileged access holder (voluntary) | Engineer, sysadmin, finance approver | Same business day as last day, privileged access first | HR last-day record + privileged access flag |
Privileged access holder (involuntary) | Any role with admin/financial access | Immediately at notification, before the meeting ends | Security/HR joint trigger |
High-risk termination (any role) | Conflict, security concern, legal hold | Immediately, all access, badge revoked in parallel | Security-initiated |
Contractor/vendor personnel | Any contracted role | End of contract date or earlier per contract terms | Vendor management + HR |
Movers: The Access Risk Almost Nobody Budgets For
Joiners get attention because they're visible — someone's onboarding checklist has a line item for it. Leavers get attention (eventually) because HR has a termination process that inherently touches IT. Movers — people who change roles, teams, or responsibilities while staying employed — get almost none, and it's the quietest source of privilege creep I see across engagements. An engineer promoted from the payments team to the platform team keeps their payments database access "just in case they need to help out." A support rep who moves into sales retains their support ticketing admin rights. Multiply that by three or four years of internal mobility and you get a workforce where access no longer maps to job function at all — which is precisely the drift CC6.3's least-privilege and periodic-review language exists to catch.
The structural fix is to treat every role change as a two-sided event: new access is added against the new role's baseline, and existing access is explicitly reviewed for removal — not left for "the next access review" to catch, because the next access review is often six or twelve months away, and by then nobody remembers why the access was ever granted, so it gets rubber-stamped as still-needed.
Mover Scenario | New Access Required | Old Access Action | Common Failure Mode |
|---|---|---|---|
Lateral move (same level, new team) | New team's baseline access | Full removal of old team's systems | Old access left "in case it's needed" |
Promotion into management | People-management tools, broader reporting access | Individual-contributor tool access reviewed, not automatically kept | Manager access added, IC access never revisited |
Promotion into privileged role | Elevated/admin access per new role | Standard access retained only if still relevant | Privileged access granted without removing prior standing access |
Temporary role/project assignment | Time-bound project access | Access set to auto-expire at project end | Temporary access becomes permanent by default |
Return from leave of absence | Reactivation of prior baseline access | Confirm role/access still matches current position | Account reactivated with stale, unreviewed permissions |
Department transfer | New department's systems | Prior department's systems, especially sensitive data, removed | Cross-department sensitive access lingers for years |
Periodic Access Reviews: The Control That Catches Everything Else
Provisioning and deprovisioning controls, however well designed, will still drift — people's actual access diverges from their actual need over time, quietly, through a hundred small decisions nobody meant as a policy violation. Periodic access review (sometimes called recertification) is the control that catches that drift, and it's the single piece of evidence a Type II auditor is most likely to sample directly, because it's the clearest proof that CC6.3's "reviewed periodically" language is actually operating, not just written down.
A good access review isn't a mass email asking managers to reply "looks fine" — that's the version that produces a rubber stamp, not a control. It's a structured exercise where the access owner for each in-scope system receives the actual list of who has access and at what level, is asked to affirmatively confirm or flag each entry, and where flagged entries generate a tracked remediation ticket with a close date. The review needs a defined population (which systems and which accounts are in scope), a defined cadence, a named reviewer for each system, and a retained record of the outcome — because "we did the review" without evidence is functionally the same, to an auditor, as not doing it.
"The review itself takes an afternoon if you've done the provisioning work right all year. It takes three weeks of archaeology if you haven't. I can always tell which company I'm dealing with within the first ten minutes." — Sarah Kowalski, Compliance Manager, Trellis Analytics
System/Data Tier | Review Cadence | Reviewer | Evidence Retained |
|---|---|---|---|
Production infrastructure / cloud root | Quarterly | Security lead + infrastructure owner | Signed review record, exceptions log |
Customer/payment data systems | Quarterly | Data owner + security lead | Signed review record, sampled screenshots |
Core business applications (CRM, ERP, HRIS) | Semi-annual | Application/system owner | Signed review record |
Standard SaaS tools (non-sensitive) | Annual | Department/application owner | Signed review record |
Privileged/admin accounts (all systems) | Quarterly | Security lead | Signed review record, dual sign-off |
Service accounts and API keys | Quarterly | Engineering/platform lead | Ownership confirmation, rotation log |
Physical access (badges, server room) | Semi-annual | Facilities/security lead | Signed review record |
Running the Review: Sampling, Evidence, and Sign-Off
Mechanically, a clean access review follows five steps: pull the current access list directly from the system (never from memory or a stale spreadsheet); route it to the accountable owner; require an explicit decision — keep, modify, or remove — on every line, not just the exceptions; execute removals within a defined turnaround (I recommend five business days); and retain the completed, signed review artifact somewhere the auditor can find it without a scavenger hunt. Skipping the "explicit decision on every line" step is the most common shortcut I see, and it's the one that undermines the whole exercise, because an unreviewed line looks identical to an approved line until someone actually checks.
For smaller companies, a well-run manual review — a spreadsheet export, a review meeting, signed sign-off — is entirely acceptable to auditors and is often the right level of investment below roughly 100–150 employees. Past that point, the manual version starts to consume disproportionate staff time and becomes more error-prone, which is where identity governance tooling earns its cost.
Approach | Time Cost (est., mid-size company) | Strength | Weakness |
|---|---|---|---|
Manual spreadsheet review | 15–30 staff hours per cycle | Low cost, works for small scope | Error-prone, slow to scale, evidence trail relies on discipline |
Ticketing-system-driven review | 8–15 staff hours per cycle | Built-in evidence trail, integrates with existing workflow | Still requires manual data pulls from each system |
Identity governance (IGA) platform | 2–5 staff hours per cycle (after setup) | Automated evidence, continuous entitlement visibility | Upfront implementation cost and configuration time |
Hybrid (IGA for privileged/critical, manual for low-risk) | 4–8 staff hours per cycle | Focuses automation spend where risk is highest | Requires clear tiering to avoid gaps |
Automating Access Reviews With IGA and IAM Tooling
The tooling category that matters most here is identity and access management platforms with identity-governance capability — commercial names in this space include Okta, SailPoint, Saviynt, and Microsoft Entra ID Governance, among others — which centralize the "who has access to what" question that otherwise requires manually querying a dozen disconnected systems. The value isn't just time saved; it's that automated tooling produces a continuous, timestamped evidence trail rather than a point-in-time snapshot assembled under audit-prep pressure, which is exactly the kind of evidence a Type II examination — testing operating effectiveness across months, not a single day — rewards.
Automation doesn't remove the need for human judgment, though. A tool can tell you that Priya has access to the payments database; it can't tell you whether Priya's current role still justifies that access without a human owner making the call. The realistic target for most growing companies is automating the data collection and workflow (who has what, routing it to the right reviewer, tracking remediation to closure) while keeping the decision firmly with an accountable human owner.
"Automation didn't replace our reviewers. It replaced the two weeks we used to spend just figuring out who to ask." — Elena Vasquez, Head of IAM, Fenwick Cloud
Common Access-Control Exceptions Auditors Write Up
Across the readiness assessments and Type II examinations I've been part of, the exception list is remarkably repetitive. It's worth naming the recurring ones explicitly, because seeing them in advance is the cheapest way to avoid them.
Common Exception | Root Cause | Typical Remediation | Prevention |
|---|---|---|---|
Terminated employee retains active access past SLA | No automated trigger from HR system to IT | Manual audit of terminations vs. active accounts; immediate removal | Automate termination-to-deprovisioning trigger |
Access review performed but not documented/signed | Review treated as informal conversation | Reconstruct evidence retroactively (painful, often incomplete) | Standardize review template with mandatory sign-off |
Mover retains prior role's access indefinitely | Role-change process doesn't require old-access removal | Manual cleanup during next review cycle | Two-sided mover workflow (add new, remove old) |
Service account with no identified owner | Accounts created ad hoc during integration work | Assign interim owner, decommission if unused | Mandatory owner field at account creation |
Privileged access granted without documented approval | Urgency bypassed the approval workflow | Retroactive approval + policy reminder | Break-glass process with post-hoc review requirement |
Contractor access outlives the contract | No link between contract end date and IT offboarding | Immediate removal, contract terms updated | Vendor/contractor access tied to contract management system |
Access review population incomplete (system missed) | No master inventory of in-scope systems | Expand review scope, note as prior-period gap | Maintain and periodically validate a system-of-record inventory |
Same person requests and approves their own access | Roles not segregated in the workflow tool | Redesign approval routing | Enforce requester/approver separation in the ticketing tool |
The Evidence File: What to Keep Before the Auditor Asks
Every control in this article eventually reduces to one question during fieldwork: can you produce evidence, for the sample the auditor selects, that the control operated as designed? Building the evidence habit into daily operations — rather than reconstructing it retroactively during audit prep — is the difference between a two-week evidence-gathering scramble and a same-day request fulfillment. I tell every client the same thing: if you can't produce the artifact within an hour of being asked, it isn't really operating as a control, it's an intention.
"The clients who breeze through fieldwork aren't the ones with the fanciest tools. They're the ones whose Slack channel or ticketing system already has the approval sitting there, timestamped, months before I ever asked for it." — Marcus Webb, Director of IT Audit, Continuum CPAs
Evidence Artifact | Demonstrates | Where It Should Live | Retention |
|---|---|---|---|
New-hire access request + approval | Provisioning followed role baseline and approval chain | Ticketing system (e.g., Jira, ServiceNow) | Full audit period + 1 year |
Role/access baseline documentation | Least privilege was designed intentionally | Policy repository / wiki | Current version + revision history |
Termination workflow log | Access removed within SLA of departure | HRIS + IT ticketing system, cross-referenced | Full audit period + 1 year |
Signed periodic access review records | Recertification occurred on schedule, per system | Access review tool or shared drive with sign-off | Full audit period + 1 year |
Privileged access grant approvals | Dual approval and justification for elevated access | Ticketing system or PAM tool | Full audit period + 1 year |
Service account inventory with owners | Non-human identities are governed, not invisible | IAM/asset inventory system | Continuously maintained, versioned |
Exception/remediation tracker | Deficiencies were identified and closed | GRC tool or tracked spreadsheet | Full audit period + 1 year |
System-of-record inventory (in-scope systems) | Review population was complete | Policy repository, reviewed periodically | Current version + revision history |
Contractors, Consultants, and Third-Party Privileged Access
Contractors and consultants are where JML discipline most often quietly collapses, because they frequently sit outside the standard HRIS-triggered workflow entirely — nobody's tracking their "last day" the way HR tracks an employee's, so the trigger for deprovisioning simply doesn't exist unless someone builds it deliberately. I've seen contractor access outlive the underlying contract by six months or more, purely because nobody owned the "contract ended, now remove access" step. This overlaps meaningfully with broader vendor risk management, but the access-control piece specifically needs its own trigger independent of the vendor's overall risk rating.
The fix is to route every contractor and consultant engagement through the same access-request and access-removal machinery as employees, with the contract end date (or a defined renewal checkpoint) serving as the deprovisioning trigger instead of an HR termination record. Any contractor granted privileged access — which happens often with implementation partners, MSPs, and outsourced DevOps — should be held to the same dual-approval and time-bound access standard as an internal privileged user, arguably a tighter one, since the company has less day-to-day visibility into that individual's activity.
Contractor/Third-Party Access Control | Requirement | Owner | Trigger for Removal |
|---|---|---|---|
Standard contractor account | Role-based baseline, same as equivalent employee role | Engaging manager + IT/IAM | Contract end date or 90-day renewal checkpoint |
Privileged contractor/MSP access | Dual approval, time-bound, documented scope | Security lead + engaging manager | Contract end date, reviewed monthly if standing |
Access via shared/vendor login | Prohibited where avoidable; individual accounts required | Security | N/A — replace with named accounts |
Contractor access review | Included explicitly in periodic access review population | Compliance/security | Same cadence as employee review |
Contract management linkage | Contract system flags access-review team at contract end | Procurement/legal + IT | Automated where contract management tooling allows |
Segregation of Duties: Where Access Design Meets Fraud Risk
Segregation of duties is technically a control-activities concept that spans finance and IT, but it shows up squarely inside access administration because it's enforced primarily through who is granted which combination of access rights. The classic conflict: the same person who can create a vendor in the accounting system can also approve payments to that vendor — which means a single compromised or dishonest account can originate and approve a fraudulent payment with no independent check. Access reviews that only ask "does this person still need this access" miss SoD conflicts entirely, because both individual grants might be perfectly legitimate; it's the combination that's the risk.
Building a segregation-of-duties matrix — a short list of access combinations that should never coexist on a single account — and checking new grants against it during the approval step is far cheaper than discovering the conflict during an access review or, worse, during a fraud investigation.
Conflicting Combination | Risk | Typical Mitigation |
|---|---|---|
Create vendor + approve vendor payment | Fraudulent payment to a fictitious or unauthorized vendor | Split across two roles; system-enforced dual approval |
Initiate payroll change + approve payroll run | Unauthorized salary changes processed without oversight | Separate HRIS edit rights from payroll approval rights |
Deploy code to production + approve own change | Unreviewed or malicious code reaching production | Mandatory independent code review/approval before deploy |
Grant system access + approve own access request | Self-escalation of privileges | Requester/approver separation enforced in workflow tooling |
Modify audit logs + system administrator access | Evidence tampering, undetected misuse | Immutable/centralized logging outside admin's control |
Issue customer refund + reconcile revenue accounts | Concealed revenue leakage | Refund approval routed to a second, independent approver |
Mapping the Program Back to CC6.2 and CC6.3
It helps to close the loop between the operational program described above and the specific criteria an auditor is testing against, so nothing in your program is built without a clear line back to what's actually being examined.
Program Element | Primary Criterion | What the Auditor Samples |
|---|---|---|
Role-based provisioning baseline | CC6.2, CC6.3 | New-hire access requests vs. documented role baseline |
Approval workflow (requester/approver/provisioner) | CC6.2 | Access request tickets with named, authorized approver |
Privileged access controls | CC6.3 | Privileged grant approvals, dual sign-off, scope documentation |
Termination/deprovisioning SLA | CC6.2 | Termination dates vs. account disable timestamps |
Mover (role-change) access updates | CC6.3 | Role-change tickets showing old access removed |
Periodic access review/recertification | CC6.3 | Signed review records, exceptions log, remediation evidence |
Service account governance | CC6.2, CC6.3 | Service account inventory, ownership, rotation logs |
Segregation-of-duties matrix | CC6.3 | Access combinations checked against conflict matrix |
Case Study: Northbeam Payroll Closes the Gap Before the Retail Deal
Back to Derek and the $3.4 million contract. Northbeam had 90 days between the exception letter and the retailer's final security sign-off — realistically closer to 60 once legal and procurement calendars were accounted for. We didn't rebuild their access program from scratch; we fixed the specific structural gaps the exceptions had exposed. First, HR's termination workflow was rewired to fire an automated IT ticket the same day a termination date was recorded, with a five-business-day disable SLA for standard roles and same-day for privileged roles — closing the gap that had produced six of the seven original exceptions. Second, every one of Northbeam's 41 service accounts was inventoried and assigned a named owner, with three unowned accounts decommissioned outright. Third, the informal Confluence offboarding checklist was replaced with a system-by-system ticket template that couldn't be closed until every listed system showed a confirmed disable action.
By the time the follow-up sample was pulled 60 days later, all 25 tested terminations showed access removal within SLA, and the auditor's management letter reflected the remediation as closed with no repeat finding in the current period. The retail contract closed on schedule. Derek's summary to his board, which I've borrowed for other clients since: "We didn't buy new software. We wrote down who was supposed to do what, and then made the system remind them."
Case Study: Corvid Health Tames Its Service Account Sprawl
Corvid Health, a healthtech SaaS company Jamal Ibrahim's team supports, hit its access-control wall differently — not through a termination miss, but through the discovery, during pre-audit readiness work, that nobody could produce a complete list of what had access to their patient-adjacent data systems. The forty-one service accounts mentioned earlier were Corvid's; eleven had known owners and documented purposes, the rest were integration artifacts from three years of rapid product development, several with standing admin rights nobody could justify.
Over a ten-week sprint, Corvid's platform team paired every remaining service account with a named owner or decommissioned it, moved credential storage into a secrets manager with 90-day rotation, and — critically — added a mandatory "owner" field to the internal tooling used to spin up any new integration, closing off the ability to create an unowned account going forward. Their subsequent Type II examination sampled twelve service accounts; all twelve had documented owners, scoped access, and rotation evidence within policy. Jamal's framing to his engineering org was pragmatic rather than compliance-driven, which I think is why it stuck: "unowned access is a production risk before it's ever a compliance risk — we'd have wanted this inventory even without an audit."
Case Study: Fenwick Cloud Builds Review Cadence From Zero Pre-Series C
Fenwick Cloud, where Elena Vasquez leads IAM, is the earlier-stage story: a 70-person company preparing for its first-ever SOC 2 Type II ahead of a Series C round where investors were explicitly asking about it. Fenwick had never run a formal access review — access decisions lived in the collective memory of a small engineering team, which had worked fine at 20 people and had become untenable at 70. Rather than jumping straight to an enterprise IGA platform, Elena's team built a tiered manual process first: quarterly reviews for privileged and production access, annual for standard SaaS tools, using a spreadsheet export and a structured sign-off template modeled closely on the cadence table earlier in this article.
That lower-cost approach ran clean for two full quarters before Fenwick invested in identity-governance tooling, and — notably — the readiness assessment ahead of their Type II found zero access-related findings, because the manual process, while unglamorous, had been run with real rigor from day one. The lesson Elena took from it, and one I repeat to every early-stage client: the tooling tier matters far less than whether someone is actually accountable for running the review on schedule.
Building the Program: A 90-Day Roadmap
For a company starting close to zero — no formal JML process, no documented access reviews — the following sequencing gets a defensible program in place inside a single quarter, which is realistically the minimum runway needed before a Type II observation period should begin.
Phase | Weeks | Key Activities | Output |
|---|---|---|---|
Foundation | 1–3 | Inventory in-scope systems; document role-based access baselines; define JML process owners | System inventory, role baseline doc, RACI |
Provisioning/Deprovisioning | 4–6 | Build/automate HR-to-IT termination trigger; standardize approval workflow in ticketing tool | Automated termination workflow, approval templates |
Privileged Access | 5–8 | Inventory privileged accounts and service accounts; assign owners; implement dual approval | Privileged/service account inventory, approval workflow |
Review Cadence | 7–10 | Design review templates by system tier; run first full access review cycle | Signed review records, exceptions log |
Remediation | 9–11 | Close identified exceptions; update policies to close root causes | Closed remediation tickets, updated policy docs |
Evidence Readiness | 10–13 | Assemble evidence repository; conduct internal mock walkthrough | Audit-ready evidence file, readiness assessment findings closed |
The Cost of Waiting vs. the Cost of Building It Right
Every client asks some version of "how much does this actually cost us," and the honest, illustrative answer from my own engagements is that the cost curve is asymmetric: the program described above is cheap to build proactively and expensive to reconstruct under audit pressure. Northbeam's 90-day remediation consumed roughly 120 combined staff hours across IT, HR, and engineering, plus advisory time — a fraction of what a delayed or lost $3.4 million contract would have cost, and a fraction of what a repeat qualified opinion the following year would have cost in sales-cycle friction.
Investment Path | Illustrative Time Cost | Illustrative Risk Reduction | Best Fit |
|---|---|---|---|
Reactive remediation post-exception | 100–150 staff hours in a compressed window, plus advisory fees | Fixes the specific finding, doesn't prevent recurrence without process change | Companies already mid-audit-cycle with findings |
Proactive manual program (spreadsheet-based) | 20–40 staff hours to build, 10–20 hours per quarter to run | High, if run with discipline; depends entirely on consistent execution | Companies under ~150 employees |
Proactive automated program (IGA/IAM tooling) | 60–100 hours to implement, 5–10 hours per quarter to run | High and self-sustaining; less dependent on individual discipline | Companies over ~150 employees or high system complexity |
No formal program | Minimal upfront, unbounded downstream | Near-zero; findings are a matter of when, not if | Nobody, if a SOC 2 report is the goal |
Where This Fits in Your Broader SOC 2 Program
Access administration doesn't operate in isolation from the rest of your control environment, and it's worth naming the connective tissue so you don't build it as a silo. It's one of the core IT general controls auditors test across virtually every engagement, and the discipline you build here — a readiness assessment upfront to find the gaps, then day-to-day control activities that keep provisioning and review running — is the same discipline that shows up elsewhere in your Common Criteria: Universal Requirements for All SOC 2 Reports. Granting deploy access to production, for instance, is an access-control decision, but the change itself needs to move through the change management process your engineering org already runs — the two controls are adjacent, not identical, and auditors will test them separately even when the same ticket touches both.
The access findings you generate (or avoid) also flow directly into how your report reads: exceptions surface in the auditor's report structure as either clean testing results or documented deviations, and your ongoing monitoring activities are what give you visibility into access drift between formal review cycles rather than only at audit time. If you're running ISO 27001 alongside SOC 2 — increasingly common for companies selling into both US and European enterprise buyers — the good news is that access governance work isn't duplicated effort. The underlying discipline (role-based provisioning, timely deprovisioning, periodic review) satisfies both frameworks' access-control expectations, which is exactly the argument I make in running ISO 27001 and SOC 2 together. If you're still deciding which framework — or both — makes sense for your business, ISO 27001 vs SOC 2: which one do you need and the ISO 27001, SOC 2 & NIST CSF crosswalk are useful companion reads for mapping this program's output across all three.
Access Governance as a Business Advantage, Not Just an Audit Line Item
It's tempting to treat everything in this article as compliance overhead — a tax paid to keep an auditor satisfied. I'd push back on that framing, because in every engagement I've run, the companies that build a real access-management program get something more valuable than a clean report: they get an organization that actually knows who can touch what, which shortens security questionnaires, speeds up enterprise sales cycles, and meaningfully reduces the odds of the kind of insider-access incident that turns into a very different, much more expensive conversation than an audit exception.
The discipline compounds, too. A control deficiency caught during a quarterly access review and closed with a documented corrective action plan costs a few hours. The same gap discovered by an attacker who used a departed employee's still-active VPN credential costs immeasurably more, and no GRC tool retroactively fixes that math. Every client I've watched invest seriously in continuous monitoring of access — rather than treating it as a once-a-year fire drill — tells me the same thing a year later: the audit got easier, but that was the smaller win. The bigger one was sleeping better.
"Our SOC 2 report is what gets us in the door with enterprise procurement. Our access-review discipline is what actually keeps us safe. I stopped separating the two in my head a long time ago." — Tom Reyes, Founder, Ridgeline Security Advisors
If you're building or tightening this program now, PentesterWorld has practical starting points rather than blank pages. The SOC 2 Control Matrix / RACI Template mirrors the provisioning RACI structure used throughout this article and adapts directly to your own systems. Pair it with the SOC 2 Readiness Checklist to find your access-control gaps before an auditor does, and the SOC 2 Gap Analysis Tool to prioritize what to fix first. If policy language is what's missing, the SOC 2 Policy Pack includes access-control and privileged-access policy templates ready to adapt, and the SOC 2 Glossary is worth bookmarking as you bring the rest of your team up to speed on the terminology this article uses. None of it replaces the accountable ownership a real program needs — but it removes the excuse of starting from nothing.
