Making controls work ← Back to services Get in touch →

Worked example · one control, end to end

A developer must not be able to ship their own change

Tested in every ISO 27001 and SOC 2 audit, and a common failure in teams that ship quickly. What follows is a working version in a real pipeline, how it gets tested, and the five places it tends to break. Free to read, no signup.

ISO/IEC 27001 A.5.3 · A.8.31 · NIST 800-53 AC-5 · SOC 2 CC8.1 · AWS / Azure / GCP

ASituation

Why this control fails in fast teams

Nobody sets out to let one person write and release code unchecked. It happens because the company grew faster than the permissions did.

  • Everyone had production access on day one and nobody has taken it away since, because taking access away is a conversation and leaving it is not.
  • Pull requests are reviewed, in the culture but not in the config. The team genuinely reviews everything. The platform would still let an admin merge unreviewed at 2am, and that is what gets tested.
  • The deploy runs as a service account with more rights than any human, and whoever can edit the workflow file can borrow them.
  • There is an emergency path that was invented once during an incident and never written down or reviewed since.
  • A consultant wrote a change management policy describing a process that does not resemble how anything ships.

The last one is the most expensive. A policy describing a process nobody follows gives the auditor a documented standard to test against, so the exception is raised against your own wording.

BThe control

What a working version looks like

The separation has to live in platform configuration rather than in a document. If the only thing preventing a self-release is that nobody would do it, there is nothing for an auditor to test.

Split the five capabilities

Commit, approve, deploy to production, manage access, and modify the pipeline. These are five different things, and the grid in section C says which pairs one person may never hold. Start here: most environments have never separated deploy from commit at all.

Make the approval gate non-negotiable and non-self-servable

Branch protection on the release branch, a required reviewer who cannot be the author, and administrators included in the rule rather than exempt from it. The common failure is an admin bypass that nobody remembers enabling.

Deploy through a separate identity, with the environment gated

Production deployment runs under an identity that developers cannot assume directly, behind an environment protection rule with its own reviewer. Human access to production is broken out from the ability to release code into it.

Put the pipeline itself in scope

Whoever can edit the workflow file can remove the gate. The pipeline definition needs the same protection as the code it releases: review required, and change history retained.

Design the emergency path instead of improvising it

Break-glass access is legitimate and auditors expect it. What they do not accept is an emergency route with no trigger condition, no logging and no review afterwards. Define who can invoke it, what it grants, how long it lasts, and who reviews every use inside a set number of days.

Do not slow the team down to pass an audit

A control that makes shipping painful gets bypassed within a month, and then you have both an ineffective control and a documented process you are breaching. The separation should cost a reviewer a few minutes, not a release train a day.

CConflicts

The conflict grid

Any single person holding two capabilities marked as a conflict breaches segregation of duties. This is the table the test is run against, so it is worth checking your own access before anybody else does.

CommitApproveDeployManage accessEdit pipeline
Develop / commit·ConflictConflictConflictConflict
Review / approveConflict·MonitorConflictConflict
Deploy to productionConflictMonitor·ConflictConflict
Manage accessConflictConflictConflict·Conflict
Edit the pipelineConflictConflictConflictConflict·

Conflict — never one person.   Monitor — tolerable only where the approval is genuinely independent, and worth watching for self-approval.

  • Commit and deploy — the author could release their own change to production unchecked. This is the pair the whole control exists to prevent.
  • Commit and approve — the author approves their own work, so independent review is lost even though the process looks followed.
  • Manage access and edit the pipeline — one person controls both who has rights and the gate that enforces them. Rarely spotted, hard to argue with once found.
DThe test

How it gets tested

Three moves, none of which involve reading your policy. That is why documentation on its own does not carry an audit.

Pull the population, not a sample of your choosing

An export of who can commit, who can approve, who can deploy and who can administer access, plus every production release in the audit period. Taken from the systems, not from a spreadsheet you maintain.

Pass — the export is complete and reconciles to the period.   Exception — the list is manually maintained and cannot be tied back to the platform.

Re-perform the conflict analysis independently

Every user mapped to their capabilities, and every conflicting combination flagged. A competent auditor will not rely on your own analysis here — they will redo it from the raw access data.

Pass — no individual holds a conflicting pair.   Exception — a user can create and release a change without independent approval.

Prove the platform enforces it

Not that the gate exists, but that it cannot be walked around: approval required, self-approval impossible, administrators inside the rule, deployment restricted to a separate identity. Where the separation lives in custom code rather than platform configuration, this becomes a code review.

Pass — the gate holds under test and cannot be self-approved.   Exception — the gate is optional, bypassable by an admin, or self-approvable.

Where a conflict is found, it is not automatically a failure. The next question is whether an independent detective review catches it afterwards, and how quickly. That argument only works if the review is evidenced — which brings us to the next part.

EEvidence

What makes evidence hold up

Evidence gathered in good faith is often accurate and still unusable. Four questions decide whether it stands.

  • 01Timestamped. Capture date and time in UTC, with the on-screen clock in the image where possible.
  • 02Source-attributable. Which system, which account, which export or query produced it.
  • 03Complete for the period. A single point-in-time snapshot will not survive a review covering twelve months.
  • 04Unaltered. Raw export retained, any redaction noted, every item referenced to the step it supports.

This is the part that quietly consumes engineering time: pulling exports out of four systems, re-taking captures that failed one of the four questions, and answering the follow-ups. On a turnkey programme that work sits with me.

FBreaks

Where it usually goes wrong

  • Administrators exempt from branch protection. The rule is on, and the people most able to cause damage are outside it.
  • Self-approval technically possible. Nobody does it. The platform allows it. The control fails on the second fact, not the first.
  • The deploy service account is a shared back door. Its credentials sit somewhere several engineers can reach, so its separation is theoretical.
  • Break-glass access never reviewed. Used four times last year, reviewed zero times, and no record of what was done under it.
  • Leavers still hold deploy rights. Offboarding covered the identity provider and missed the platform that actually releases code.

Four of these five are configuration, and can be closed in an afternoon once somebody knows where to look. The fifth — break-glass — needs a process designed around it, and that takes a conversation rather than a setting.

GNext step

One control. A certification is around a hundred.

The depth above is the depth a whole programme gets. On a turnkey engagement I design the controls around how your company already works, put them in place, gather the evidence, and handle the auditor.

Making controls work, then certifying them

Tell me the situation in a couple of lines: the environment, the deadline, and who is asking for the certificate. Thirty minutes, no charge. If it is not something I should be doing, I will say so.