Why developer access to production is a SOX ITGC test
When an auditor asks who can deploy to a financial system and whether developers can ship their own code, the question is about the program changes area of your IT general controls. The control you are being tested on separates development, test and production duties, so that the people who write a change are not the people who move it into production. Where full separation is impractical, the expectation is that management monitors developer activity in production and can show that someone independent reviews it. The auditor is looking for proof that the separation exists or that the monitoring works, not a policy that says it does.
The risk the auditor has in mind is spelled out in PCAOB AS 2110, which lists IT personnel gaining access beyond their duties, breaking down segregation of duties, and unauthorized changes to programs as IT risks to internal control over financial reporting. A developer with production rights can change a calculation, a posting rule or an approval workflow without going through the approved change path, and the automated controls that depend on that logic may then produce wrong numbers with no visible trail. This is why auditors often trace production access before they trace individual changes.
This is hard for reasons that are common in practice: shared administrator accounts on servers and databases, small teams where the same two or three engineers build, test and operate a system, and legacy financial applications that were never designed with separate environments. Start by listing every account and group that can write to production code, configuration, databases and deployment pipelines, including vendor and break-glass accounts. Then confirm with your IT team whether each one is still needed and who reviews its use. Any gap you cannot close should have a documented monitoring control with a named reviewer and retained review evidence.
Which systems and people does developer access to production cover?
Scope for developer access to production starts with which systems feed financial reporting and which people can change them. Each decision below widens or narrows the controls you must design, test and evidence, so settle them in writing before the first walkthrough. SEC guidance also limits the work: management evaluates only the IT general controls needed for the reliable operation of controls that address financial reporting risks.
Financially significant applications and databases
Start from the financial statement accounts and the applications that initiate, process or report them, then include the databases those applications write to. A general ledger, subledger or consolidation tool that feeds a reported balance is usually in scope, while a collaboration tool is not. Each in-scope application and database brings its own production access path, so every entry you add multiplies the access reviews and deployment records you must produce.
Infrastructure, interfaces and configuration repositories
Servers, containers, cloud accounts, interface engines and the repositories that hold configuration or parameter files can change financial results without touching application code. Decide whether a file transfer job or a rate table is in scope, because a developer who can edit it can alter calculations. Repositories and pipelines that deploy to these components belong in scope for the same reason.
Developers, DBAs, release engineers and vendor staff
List every person and group who holds production rights, including developers with break-glass access, database administrators who can run scripts, release engineers who approve pipelines, and vendor support staff working through remote sessions. Each group needs a different test: developers are checked for deployment rights, DBAs for direct data changes, and vendors for how their access is granted, logged and removed. An incomplete list is the most common reason a scope is challenged.
Emergency and firefighter accounts
Emergency access that lets a developer fix a failed batch at night usually falls inside scope, because it grants the same production rights as normal access. Define who may use it, what triggers it, how a ticket is raised and how the session is reviewed afterward. Expect the auditor to sample emergency sessions and trace them to approvals, so the account must log enough to support that trace.
Service and integration accounts
Service accounts that run scheduled jobs, deploy pipelines or move data between systems can change production without a person logging in. Inventory each one, record its owner and the systems it touches, and confirm whether anyone can use its credentials interactively. Accounts with write access to financial data are usually in scope even when no one reviews their activity by hand.
Separated environments and deployment paths
Scope narrows when development, test and production are separated and the only route into production runs through a controlled pipeline. Where full separation is impractical, scope widens because you must monitor developer activity in production and reconcile it to approved changes. Confirm in your own environment which path each in-scope system actually uses, since a documented pipeline with a hidden shortcut will fail testing.
How an auditor tests developer access to production
This table lists the steps an external auditor typically takes to test whether developers can change financial systems in production, what evidence each step produces, and where findings usually arise. Read it as a test plan: each row is a question the auditor must answer before relying on automated controls that depend on this access restriction.
| Test step | What the auditor does | Evidence requested | Common findings |
|---|---|---|---|
| Access listing for production roles | Obtains the full list of users and groups with write, deploy or admin rights to production systems and reviews it against job roles. | Role and group export from the production application, OS, database and pipeline, dated near the test date. | Developers in production admin groups, shared or generic accounts, and roles that were never removed after a transfer. |
| Walkthrough of the deployment path | Follows one change from code commit to production to confirm which tools, pipelines and credentials actually move code into production. | Pipeline configuration, deployment runbooks, and a screen record or observed run of a real release. | Manual copy steps or direct server logins that bypass the documented pipeline. |
| Sample of production changes traced to identities | Selects a sample of production deployments and traces each to the committer, the approver and the account that executed the deployment. | Change tickets, merge request records, pipeline run logs and deployment audit entries for each sampled change. | Deployments executed under a service account with no named person, or commit and deploy identities that do not match. |
| Developer cannot approve own change | Checks that the person who wrote a change cannot also merge, approve or release it, including through admin override. | Branch protection or approval rule settings, and approval records showing reviewer and author differ. | Approval rules that allow the author to approve, or admins who can bypass review without a logged reason. |
| Privileged and emergency access logs | Reviews logs of break-glass, sudo or emergency accounts used on production and checks each use against an approved emergency change. | Privileged session logs, emergency access request forms, and post-event review sign-offs. | Emergency access used with no ticket, or reviews completed by the same person who used the access. |
| Review of exceptions | Asks how exceptions to the separation are approved, recorded and reviewed, and tests a sample to confirm reviews happened on time. | Exception register, compensating monitoring reports, and evidence that management reviewed each exception. | Exceptions that never expire, or monitoring reports that nobody signs. |
How to separate developer access from production step by step
This sequence moves a team from unknown production access to a documented state where developers cannot deploy their own changes to financial systems, and any remaining access is monitored and reviewed.
Inventory production access and privileged accounts
The IT team, with the application owners, lists every account and group that can reach production for each financially significant application, database, server and cloud account. Include shared administrator accounts, service accounts, CI/CD runners, and developers who hold standing rights. Compare the list against HR records and the in-scope system list from SOX ITGC scoping. The step is done when the inventory names each account, its owner, its privilege level and how it authenticates, and every entry has been confirmed by the system owner.
Define environments and their owners
Document the development, test, and production environments for each in-scope system, with a named owner for each. Record which network segments, databases, and deployment targets belong to each environment and which accounts are allowed to cross between them. Confirm with the application owner which environment is the system of record for financial reporting. The output is an environment register signed by the business and IT owners, showing where developer access is permitted and where it is not.
Design roles and restrict deploy and merge rights
Design roles so that developers can propose changes but cannot push or merge to protected branches that feed production. In GitLab Community Edition, protected branches let maintainers restrict which roles can push or merge, block direct pushes by setting push access to no one, and keep force pushes disabled unless explicitly allowed. Apply these settings to the release branches for in-scope systems and confirm that the settings are enforced for every user, including administrators. The output is a role design document and a screenshot or export of the branch protection configuration for each repository.
Create a dedicated deployment identity
Create a non-human deployment identity, such as a pipeline service account, that is the only principal able to deploy to production. Grant it the minimum permissions needed for the deployment target, store its credentials in a secrets manager, and prevent interactive logins with it. Remove production deployment rights from individual developer accounts. Verify by attempting a manual deployment as a developer and recording the denial. The output is an identity record showing the account, its permissions, its credential storage location and the denied test attempt.
Enforce change approval before deployment
Configure the pipeline so that a production deployment runs only when a linked, approved change ticket exists and the merge has been reviewed by someone other than the author. Use the change management module of your ticketing system, such as the Assistance module in GLPI with its ITIL-based change records, to hold approvals. Record the ticket reference in the pipeline run so an auditor can trace each deployment to its approval. Confirm the gate by running a deployment without an approval and recording that it is blocked. The output is a pipeline configuration record that documents the gate logic, the approval source and the blocked test run.
Add static analysis to the pipeline
Run code scanning in the pipeline before any merge or deployment reaches production. Semgrep Community Edition scans many languages, including Java, JavaScript, Python, C#, Go and Terraform, with community or custom rules, and can run in CI/CD to scan repositories continuously. Agree on which findings block a release and which are recorded for follow-up. Keep scan results attached to each pipeline run. The output is a scan configuration file, a documented blocking policy and sample scan results from a recent release. Confirm the language coverage for your own stack before relying on it.
Monitor and log any remaining developer production access
Where full separation is impractical, such as urgent fixes or database support, define a break-glass procedure. Grant elevated access only through a named, time-limited request that is approved after the fact by a manager who did not perform the work. Log every session, retain the logs under the organization's retention policy, and reconcile logged activity to change tickets. Review the logs against the approved emergency changes, which are covered in the emergency changes topic. The output is a break-glass procedure, an access request record for each event and a reconciliation report.
Run and sign the first access review
Perform a first access review against the inventory from step one. The reviewer confirms that each production account and role is still needed, that developers hold no standing deployment rights, and that the deployment identity is the only automated path to production. Remove or document every exception, and record the reason. Have the business owner and the IT owner sign the review, dated and retained with the evidence. Confirm that the review covers privileged and service accounts as well as named users. The output is a signed first review with its exception log, which becomes the baseline for recurring reviews.
Which evidence shows developers cannot deploy to production
Auditors do not take a developer's word that production is locked down. They look for records that show who can deploy, what the platform permits, and whether each production change traces back to an approved request. The cards below cover the artifacts that carry that proof and how to keep each one current between audit dates.
Production access lists with role assignments
A current list of every account and group with production write, deploy or administrative rights, with the role each holds and the approver who granted it. Auditors compare this list against job titles and the development roster to find developers who hold deploy rights they do not need. Export it on a fixed schedule, store the export with a timestamp, and reconcile it to the HR leaver and transfer records. A list without dates cannot show what changed during the audit period.
Branch protection and pipeline configuration exports
Settings that stop developers from pushing or merging straight to the branches that feed production. In GitLab, protected branches can restrict push and merge roles and can block direct pushes by setting push access to no one, with force pushes disabled unless explicitly allowed. Export these settings and the CI/CD deployment job definitions periodically, and keep a copy of each version so the auditor can see the configuration in force on any given date. Confirm the export includes the protection settings, not just the branch names.
Deployment logs tied to approved change tickets
Pipeline and deployment records that show each production release, who triggered it, the commit or artifact deployed, and the change ticket that authorized it. This is the card auditors sample most often, because it proves the control operated rather than merely existed. Link the deployment identifier to the ticket number in both systems, and retain the logs for the full audit period. Ask your team how a deployment without a linked ticket is blocked or flagged.
Privileged session logs for break-glass use
Records of the occasions when a developer or administrator used emergency production access outside the normal pipeline, including who was granted access, when the session started and ended, and what was done. Each break-glass event should map to an emergency change record with after-the-fact review. Keep session recordings or command logs in a location the developers cannot edit. Confirm with your platform team which logging tool captures these sessions, since not every self-hosted stack records shell activity by default.
Periodic access reviews with sign-off
A dated review in which a named manager or control owner confirms that each person on the production access list still needs that access. The review should record who reviewed, what they removed or kept, and the evidence they used. Schedule the review at a frequency your control design states, and keep the signed output with the population it covered. A review that is performed but not signed, or that signs off on a list that omits some accounts, will usually be treated as a deficiency.
Exception records and their approvals
Documented cases where a developer deployed to production or held standing access outside the normal control, with the business reason, the approver, the duration and the removal date. Exceptions are expected in small teams, and auditors accept them when they are rare, approved in advance and closed on time. Track each exception in your ticketing system, such as GLPI's Assistance module or Zammad, so the population is complete. An empty exception log can raise questions if deployment logs show activity that no ticket explains.
What meeting developer access controls costs
This table compares the cost components of keeping developers away from production financial systems, showing who is paid, whether each cost is one-time or recurring, and what drives it. Read it as a checklist for a quote: most of the spend is engineering and review time, not software licenses. The main takeaway is that open-source tools reduce license spend but do not remove the effort of designing access, reviewing it each period and producing evidence for the auditor.
| Cost component | One-time or recurring | What drives it and how to reduce it |
|---|---|---|
| Access design and environment separation | One-time, with periodic revision | Number of financially significant systems and how many share environments. Reduce by defining one production access model per system before build-out and documenting it once. |
| Pipeline and repository configuration | One-time, then recurring changes | Number of repositories, branches and deployment pipelines touching in-scope systems. Protected branches and restricted deploy roles on GitLab Community Edition remove license cost but still require engineering time to configure and test. |
| Licenses or hosting for tooling | Recurring | Commercial versus open-source choice, hosting location and user count. Self-hosted open-source tools such as GitLab Community Edition, Semgrep Community Edition and GLPI avoid license fees, but hosting, patching and backup remain your cost. |
| Engineering time for break-glass and monitoring | One-time build, recurring operation | Frequency of emergency access and the depth of logging you require. Reduce by scripting break-glass access with time limits and automatic log capture, and by routing alerts to a single review queue. |
| Recurring access reviews | Recurring, usually each period | Number of users, roles and production systems in scope. Reduce by generating role listings from the identity source and limiting reviews to in-scope systems. |
| Evidence upkeep | Recurring | Volume of tickets, approvals, deployment logs and review sign-offs. Reduce by linking each deployment to an approved change record in a ticketing tool such as GLPI or Zammad, so evidence is produced as work happens. |
| External testing or readiness review | Periodic or one-time before an audit | Scope of the review and whether it covers pipelines, access rights and logs. Ask the provider to name the systems, deliverables and timeline in writing before work starts. |
| Auditor sampling effort | Recurring, set by the auditor | Number of changes sampled and how cleanly each traces to an approval and a separate deployer. Clear records and consistent access rules lower follow-up requests and retesting. |
Which open-source tools produce developer access evidence
Four open-source tools can each produce a different piece of the evidence an auditor asks for on developer access to production. Repository controls show who can change code, scanning shows what was checked, and ticketing and intake records show who approved the change and why it was requested.
Repository push and merge restrictions
GitLab Community Edition (MIT) offers protected branches, which let you restrict which roles can push or merge to a branch. Setting push access to no one blocks direct pushes to a production branch, so every change must arrive through a merge request. Keep force pushes disabled unless someone has explicitly allowed them, because a forced rewrite can erase the history an auditor samples. Confirm which protected branch settings your deployed version exposes and export the configuration as evidence.
Automated code scanning in pipelines
Semgrep Community Edition (LGPL-2.1-only) scans code in many languages, including Java, Python, Go, TypeScript and Terraform, using community or custom rules. Run it as a pipeline stage so every merge request produces a recorded scan result before it can reach production. Custom rules can flag patterns that matter to your financial systems, such as hard-coded account identifiers or disabled approval checks. Confirm which languages and rule sets your license and version support for your codebase, and retain pipeline logs as evidence.
Change requests and approval records
GLPI (GPL-3.0-or-later) includes an Assistance module that lets users create, follow and process tickets, problems and changes following ITIL practices. Use its change records to hold the request, the business and IT approvals, and the link to the code merge that implemented the change. Auditors can then trace a sampled production deployment back to an approved request. Confirm which approval workflow steps and retention settings your installed version provides before relying on them.
Request intake in one ticket system
Zammad (AGPL-3.0-only) is a web-based helpdesk that brings requests from email, chat, telephone and social media into one ticket system. For developer access, it gives you one intake point for access requests and deployment requests, so requests from business users are not handled in private email threads. Each request keeps its history, which helps show who asked for elevated rights and when. Confirm which channels and ticket fields your deployment uses, and check the AGPL-3.0 obligations with counsel if you modify the software.
Who owns developer access controls and who can help
Management owns the developer access control, and that ownership does not transfer to anyone else. Your team decides who may deploy to financially significant systems, approves exceptions, runs the periodic reviews and keeps the records an auditor will ask for. Even when an outside firm builds the configuration, your staff must be able to explain why the control is designed the way it is and show that it runs every period.
- Control design: Document which environments exist, which roles may push or merge, and who may move code into production for each in-scope system.
- Access approval: Require a named approver and a business reason for every production access grant, including temporary elevation.
- Periodic review: Have a person who is independent of the administrators review the production access list and the deployment log on a defined schedule, and record the outcome.
- Evidence retention: Keep access lists, approval tickets, review sign-offs and pipeline logs in a location the auditor can reach for the full audit period.
Before relying on the control, confirm that a named owner can walk an auditor through each step without the consultant in the room.
An implementation partner such as DeployOpen can prepare the technical side of this control inside your own infrastructure. Work of this kind is normally agreed as a fixed scope with written deliverables before it starts, so the boundaries of what the partner does and does not own are clear from the beginning. The partner prepares and documents the setup, and management remains responsible for operating it.
- Environment separation: Set up development, test and production environments with distinct credentials, network boundaries and deployment targets.
- Pipeline and repository configuration: Configure protected branches, required approvals and deployment permissions so that developers cannot push directly to production paths.
- Access inventories: Build an export of users, roles and group memberships for each in-scope system that management can review.
- Evidence exports: Produce repeatable reports from pipeline logs, repository settings and ticketing records, stored in your environment.
The partner cannot approve access, sign reviews or attest that the control operated. Ask for the scope, deliverables and handover documents in writing before work begins.
The external auditor tests the control and reports what they find. Under the PCAOB standards that govern ICFR audits, the auditor evaluates whether the control is designed effectively and whether it operated effectively over the period. They select samples, inspect records and communicate deficiencies, but they do not perform the management control on your behalf.
- Design testing: The auditor checks whether the environment separation and approval rules, as documented, would prevent or detect unauthorized production changes.
- Operating testing: The auditor samples production deployments and access grants and traces each one to an approval, a test result and a review.
- Findings reporting: Deficiencies are communicated to management and the audit committee according to their severity.
- Independence limits: The auditor cannot design, configure or run the controls for management, because that would compromise their independence.
Ask your auditor early which records they will sample and in what format, so your team can produce them without relying on the implementation partner during fieldwork.
Where developer access controls usually fail an audit
Auditors testing SOX IT general controls over program changes look for one question: could someone change a financially significant system without that change being approved, tested and traceable? The gaps below are where that answer tends to turn into a deficiency. Each one has a concrete fix that management can design, operate and evidence.
Shared admin or root credentials
When several people, or a scheduled job, deploy with one shared administrator or root login, no log can show who made a given change. Give each deployment path its own named identity with the minimum rights it needs, and store its credentials in a secrets manager rather than in scripts or wikis. Check that individual administrator accounts exist for break-glass work and that the shared account is disabled or removed from production.
Self-approved merges
If a developer can both approve and merge their own change, the approval control exists only on paper. Require at least one reviewer who is not the author, and make the approval rule enforced by the platform rather than by convention. In GitLab, protected branches can restrict who may push or merge to a branch, which lets you tie merge rights to a role that excludes the change author. Test a sample of merged changes to confirm each has an independent approver.
Deployment identities that bypass the pipeline
A service account or engineer who can copy code straight to production skips testing, approval and the audit trail built into the pipeline. Set push access on the production branch to no one, so that the only path to production runs through the approved pipeline. Review which identities hold deploy rights to production hosts, containers and cloud accounts, and remove any that the pipeline does not use.
Undocumented break-glass use
Emergency access is sometimes necessary, but auditors treat undocumented emergency access as an unauthorized change. Keep break-glass accounts locked until a ticket is raised, log every session, and require a documented reason tied to an incident or change record. Schedule a review after the fact by someone outside the team that used the access, and confirm that each session matches a ticket. Helpdesk tools such as GLPI can hold the change record that links these events together.
Unsigned access reviews
Access lists that no one reviews drift away from job duties, and a review that is never signed gives an auditor no evidence it happened. Have the control owner for each financial system review developer and administrator access to production at a defined frequency, remove access that no longer fits, and sign the result with a date. Confirm the reviewer does not hold the access being reviewed. The review should cover both application roles and infrastructure rights.
Production database rights for troubleshooting
Developers often receive direct write or schema rights on production databases to diagnose problems, and those rights let them change financial data outside the application's controls. Replace standing rights with read-only access for investigation, and route any data fix through a documented change with its own approval. Log queries that run under elevated rights and review them periodically. Ask the database team to show which accounts can alter tables or run updates in production.
What buyers ask before bringing in help with developer access
How much effort does separating developer access from production take?
Effort depends mainly on how many financially significant systems are in scope, how many repositories, pipelines and deployment paths reach them, and how much separation already exists. A single ERP with one deployment pipeline is a very different job from a set of interfaced ledgers, data warehouses and vendor-hosted modules. The main work items are mapping who can push, merge, approve and deploy today, redesigning roles so developers no longer hold production rights, and building the review trail auditors will sample. Ask any provider to break the effort into discovery, access redesign, pipeline changes and evidence setup, and to state which items the client's own staff must complete.
How long does developer access work usually take to finish?
The duration is set by scope, not by a standard timeline. The factors that move it most are the number of in-scope applications and environments, the state of the current repositories and CI/CD tooling, whether the platform is cloud, on-premises or vendor-hosted, and how quickly the client can approve role changes and give access to system owners. Work that must be finished before a fiscal year end or an auditor walkthrough usually needs an earlier start date than the work itself. Ask for the milestones in the written scope, the dependencies the client must clear, and what happens if an approval is delayed.
Can a small team handle developer access controls in-house?
A small team can often do it in-house if it has someone who understands both the financial applications and the source control and deployment tooling, and if the scope is limited to a few systems. The work gets harder when developers, administrators and approvers are the same few people, because segregation of duties then depends on compensating monitoring rather than design. Internal staff usually need time for role design, pipeline changes, review of logs and sampling of changes before the auditor arrives. Ask which of those tasks the team can absorb during normal operations and which would compete with release work or the close calendar.
What does the client need to provide during the engagement?
The engagement needs named people, not just a project sponsor. Typically this includes a system owner for each in-scope financial application who can approve who should have what access, repository administrators who can change branch protection and deployment settings, change approvers from business and IT who sign off on production releases, and a named internal reviewer who checks the access reports and exception logs on an agreed schedule. Clients should also provide a current list of accounts, service accounts and deployment keys so the review starts from facts. Ask the provider to list these roles in the scope so the client can confirm who will be available.
Can an implementation partner issue the SOX audit opinion on developer access?
No. An implementation partner can prepare systems, role designs, pipeline configuration and evidence, but only the company's independent external auditor can issue the attestation under the Section 404 framework. Management owns the controls and the assessment of their effectiveness, and the external auditor tests them. A partner also should not be asked to certify that the controls are effective. Ask any provider to state in writing which deliverables are preparation work for management and which, if any, would be inputs the auditor might consider, and to confirm that the auditor selection and communication stay with the company.
What should a written scope and quote for this work include?
A written scope should name the in-scope applications, databases, repositories, pipelines and deployment paths, and state which environments are separated and which are monitored instead. It should list each deliverable, such as a role matrix, branch protection settings, a deployment approval workflow, a monitoring report and an evidence pack, along with the client's responsibilities and the dates for each milestone. The quote should separate one-time design and implementation from any recurring review, support or testing retainer. Ask whether the price includes tooling licenses, hosting, training and rework after the auditor's first walkthrough, and what changes trigger a scope revision.
Which open-source tools support the evidence for this control?
Source control platforms such as GitLab Community Edition provide protected branch settings that can restrict who may push or merge and block direct pushes to production branches. Static analysis such as Semgrep Community Edition can run in CI/CD pipelines to scan repositories continuously, which supports review evidence. Ticketing tools such as GLPI, with its Assistance module, or Zammad can hold the request and approval trail that links a deployment to an authorized change. Confirm with each vendor that the features you need, including audit logging and approval rules, are available in the edition you plan to run, and test the evidence exports with your auditor before relying on them.
How DeployOpen prepares developer access controls for SOX audits
DeployOpen plans and implements self-hosted open-source platforms inside your own infrastructure, including the separation of development, test and production and the access and monitoring evidence auditors ask for. We prepare the systems and evidence; your organization owns the controls and an independent auditor issues any conclusion on them.
How we scope
- Agree in writing which financially significant applications, repositories, pipelines and production accounts fall under developer access controls.
- Map which developers currently hold deploy, merge, admin or direct production access, and record who approves exceptions.
- Confirm with your auditor and internal audit which monitoring is acceptable where full environment separation is impractical.
How we build
- Configure protected branches so developers cannot push directly to release branches and merges require an approved reviewer.
- Set up separate development, test and production environments with production deployment limited to a restricted pipeline role.
- Add static analysis such as Semgrep to CI/CD so scan results are retained alongside each change for reviewer inspection.
How we hand over
- Deliver written configuration records, role matrices and the access rules that show how developer permissions were restricted.
- Provide a test script that lets your team reproduce a blocked direct push and a blocked production deployment by a developer.
- Document how to pull access logs and approval records for a sample period so your auditor can trace changes to approvals.
How we support
- Fixed-scope engagements agree deliverables and timelines in writing before work starts.
- Ongoing support, upgrades and periodic re-testing of access rules are available as a retainer.
- Confirm with your auditor which evidence format, retention period and sample size they will accept before the first audit period.

