← All resources
White paper

The Standing Access Problem

Why least privilege fails by hand, and how to enforce it by mechanism.

Read the full white paper

Tell us where to send it. No spam, just the paper.

Thanks. Enjoy the paper.

By submitting you agree we may email you about Simcha DB Studio. Unsubscribe anytime.

Who Can Touch Production?

Eliminating standing database access.

Executive Summary

The most dangerous object in most companies is a person with production credentials and an open terminal.

Security programs spend enormous effort on the perimeter: firewall rules, network segmentation, endpoint agents, threat feeds. Meanwhile the single most consequential change any employee can make to the business often travels a path with almost no controls on it. An engineer opens a terminal, connects to production with a credential that never expires, and runs a statement against the live database. There is no reviewer, no record of the exact bytes that ran, and frequently no way to prove afterward who did what. That path is not an edge case. In most organizations it is the normal way production databases are changed.

The instinctive fix is to trust the right people: hire carefully, restrict the credential to a few senior engineers, and rely on their judgment. That is not a control. It is the absence of one, dressed up as culture. The honest goal is not trusted people making careful changes. It is a system in which nobody, including administrators, can apply an unreviewed, unlogged change to production, because the platform will not let them. The credential itself is the vulnerability. Reviewed, recorded change is the control that replaces it.

This paper makes the case in five moves: it names the standing-access problem precisely, argues that least privilege has to govern change and not just reads, describes the target state of reviewed change replacing direct sessions, explains what an audit trail must do to count as evidence rather than decoration, and closes with a concrete anti-pattern-to-control mapping. Where Simcha DB Studio implements a given control, the paper says so, and where it does not, it says that too.

The standing-access problem

Ask any incident responder where the uncontrolled change comes from and the answer is rarely a firewall misconfiguration. It is the ad hoc direct database session on production. A person with credentials opens a client, connects to the live system, and types. Whatever they type takes effect immediately, with no gate in front of it and often no durable record behind it. Of every path a change can take into production, this is the single largest uncontrolled-change vector, and it is the one most companies have normalized.

Break-glass access that outlives the emergency.

Emergency access is legitimate: sometimes production is on fire and a human needs a direct hand on the database now. The failure is not granting that access. It is that the grant is almost never revoked. Break-glass access is handed out during an incident and then quietly becomes permanent, because nobody owns the job of taking it back. What was meant to be a rare, time-boxed exception silently converts into a standing credential that sits on someone laptop for years.

Shared administrator credentials.

The problem compounds when the credential is shared. A single administrator login used by several people erases attribution entirely: when a destructive change lands, the log, if there is one, names an account rather than a person. Nobody can say who ran it, which means nobody is accountable for it, which means the control that accountability is supposed to provide does not exist. Shared logins are convenient precisely because they remove the friction that a real access model is supposed to impose.

The honest engineer and the stolen credential look identical.

The deepest reason standing access is dangerous is that the same credential serves two very different actors and the database cannot tell them apart. The honest engineer in a hurry, skipping review to ship a fix, and the attacker holding a stolen credential both present the same authentication and get the same power. Every standing credential is therefore an insider-risk surface and an external-breach surface at once. This is why credentials matter so much in breach data: industry reporting consistently finds privilege misuse and the human element among the most persistent breach patterns,

and breaches that begin with stolen or compromised credentials take the longest to identify and contain, at an average of 292 days2. When the same key opens the door for both your engineer and your adversary, reducing how many of those keys exist, and putting a gate in front of what they can do, is not paranoia. It is arithmetic.

Least privilege applies to change, not just reads

Most access models are built around one question: who is allowed to read which data. That question matters, and data-exposure controls are real. But it is the easier half of the problem. The harder and higher-stakes question is who is allowed to change the database: who can ALTER a table, DROP an object, or deploy a schema migration into production. A leaked SELECT is a confidentiality incident. An unreviewed DROP is a business-continuity incident. Least privilege has to reach the second case, not stop at the first.

Separation of duties.

The foundational control for change is separation of duties: the person who authors a change must not be the person who approves it. This is not bureaucracy for its own sake. A second set of eyes on every production change catches the mistake the author is too close to see, and it removes the single-actor failure mode in which one person can conceive, approve, and apply a destructive change with nobody else in the loop. Separation of duties is a bedrock requirement of established control frameworks precisely because self-approval is where quiet disasters originate.

Review bound to exact content.

Separation of duties only means something if the approval is bound to the exact content that runs. A review of one version of a script confers no safety if a different version executes. The reviewed bytes must equal the executed bytes, guaranteed by the system rather than by trust. If a script can be edited after it is approved and still run under that stale approval, review is theater. The control has to make any post-approval edit invalidate the approval automatically.

Scoped roles that grant only what a job needs.

Least privilege in practice means roles that grant the minimum a function requires and nothing more. Standards make this explicit. NIST SP 800-53 defines least privilege as an access-enforcement control in its own right, and the same family requires that access be enforced and audited, not merely declared,

while PCI DSS Requirement 7 requires access to be restricted by business need to know4. In database terms this means the following distinctions have to be real, not aspirational:

A reviewer can approve or reject a change but cannot author the change they are approving.

A developer can author and submit a change but cannot approve their own work or push it to production unilaterally.

A read-only role can inspect data and schema without any ability to alter, drop, or deploy.

An administrator governs the system without that governance becoming a bypass around review for their own changes.

From standing access to reviewed change

The target state is not "give fewer people the credential." It is to remove the direct-session path for routine change altogether and replace it with a reviewed one. In that state, changing production is a workflow, not a login. The shape of it is concrete and buildable, and most of it is a matter of routing rather than invention.

Every change is a versioned script through an approval gate.

Routine production change stops being a live-typed statement and becomes a versioned script that must pass an approval gate before it can run. The script is authored, submitted, reviewed by someone other than the author, and only then eligible to execute. There is no path from idea to production that skips the gate, which means there is no ordinary case in which an unreviewed change reaches the live database. The rare genuine emergency is handled as an explicit, logged exception rather than as the default way work gets done.

Execution runs under the platform, with a recorded actor.

The execution itself does not happen under a human sitting on a shared production login. It runs under the platform, against a stored target connection, with the actor who initiated it recorded as a first-class fact. This inverts the shared-credential problem: instead of many people behind one anonymous login, every execution carries the identity of the specific person who ran it. Attribution stops being something you reconstruct after an incident and becomes something the system captures by construction.

Read-only where change is not the job.

Not every connection needs the power to change anything. Connections can be marked read-only, so that a reporting user, an analyst, or a support engineer who needs to inspect data cannot accidentally or maliciously alter it. This is least privilege applied at the connection level: the connection grants exactly the capability the task requires and withholds the rest.

Revocation that forces re-review.

The final piece is that trust, once granted, is not permanent by default. An administrator can revoke a granted approval, which forces the change back through review rather than silently trusting an already-signed approval. Combined with content binding, this means neither the passage of time nor a quiet edit can leave a stale approval standing in for a real one. Approval is a live state the system maintains, not a checkbox ticked once and forgotten.

An audit trail that is evidence, not decoration

Almost every system claims to log. The distance between "we log things" and "we can prove what happened" is enormous, and it is exactly the distance that matters when an investigation or an audit arrives. A log that can be quietly edited, that leaks secrets into its own records, or that has already rolled over the window you need is not evidence. It is decoration that fails at the one moment it exists for.

Immutable execution records.

The foundation is that every execution is recorded immutably. Each record captures the SQL snapshot taken at run time, the target connection, the actor who ran it, the start and end time, the status, the rows affected, and the full error output. Because the snapshot is captured at execution, the record shows what actually ran, not what someone believes ran. This is the raw material of accountability: for any change, there is a complete, self-contained account of who ran what, against which target, when, and with what result.

Append-only and tamper-evident.

Recording is necessary but not sufficient. The trail also has to resist tampering, including by insiders with database access. The mechanism is an append-only, tamper-evident chain: database triggers seal each record into a hash chain linked to the record before it, so that any modification to any record invalidates every hash that follows it. You cannot quietly rewrite history, because rewriting one record breaks the chain from that point forward. An integrity-verification endpoint walks the chain and pinpoints the first broken record, which turns tamper detection into a specific, actionable finding rather than a vague suspicion.

Secrets redacted before they are written.

An audit trail that captures everything, including credentials, is itself a breach waiting to happen. Sensitive fields (passwords, tokens, secrets, API keys, and MFA tokens) are redacted before the record is ever written, so the trail never becomes a plaintext store of the very secrets it is meant to protect. The log records that an action happened and who took it without hoarding the material an attacker would most want.

A defined retention window.

Finally, evidence has to still exist when it is needed. Retention is configurable, with a 90-day default, so the trail covers a defined window rather than silently discarding records or growing without bound. Standards make retention and monitoring a first-class requirement: NIST SP 800-53 mandates audit and accountability controls,

and PCI DSS Requirement 10 requires that access be logged and monitored4. A defined window is what lets you answer an auditor precisely instead of hoping the relevant record happens to survive.

A model for zero unreviewed change

The controls above compose into a single model whose goal is simple to state: no change reaches production unreviewed and unrecorded, including changes made by administrators. The most useful way to see the model is as a direct answer to the specific anti-patterns that standing access produces. Each common bad habit has a control that removes it.

ANTI-PATTERNCONTROL
Direct psql on prodVersioned script through an approval gate
Author approves own changeSeparation of duties enforced
Approval survives a silent editContent-hash binding invalidates approval on any edit
Shared admin loginUnique identities with per-actor attribution
Logs that can be editedAppend-only tamper-evident chain
Access granted foreverRevocation that forces re-review

None of these controls depends on trusting the people involved more. Each one removes a way for a single actor, honest or hostile, to change production without a second party and a durable record. That is the entire point: the model does not ask people to be careful. It makes unreviewed change something the system does not permit.

How this maps to Simcha DB Studio.

The following is what the product actually implements, every customer gets the complete product, so every control below is included. Role-based access control ships with five built-in roles (Admin, Developer, Reviewer, Deployer, and Viewer), and the author of a change cannot approve their own work: separation of duties is enforced. This ChangeOps governance is part of the product. Approval is bound to a content hash, so any edit to a script recomputes the hash and automatically invalidates a prior approval, guaranteeing that the reviewed bytes equal the executed bytes. Administrators can revoke a granted approval, forcing re-review. Connections can be marked read-only.

Every execution is recorded immutably: the SQL snapshot captured at run time, the target connection, the actor, start and end time, status, rows affected, and full error output. The audit trail is append-only and tamper-evident, with database triggers sealing each record into a hash chain, sensitive fields redacted before writing, an integrity-verification endpoint that pinpoints the first broken record, and configurable retention that defaults to 90 days. The audit-trail view and the integrity endpoint are included, as are custom roles with section-level grants, SSO federation (SAML, OIDC, and LDAP, covering Azure AD, Okta, Google, and Cognito) with group-based role mapping, and MFA (TOTP plus hashed backup codes).

Conclusion

Ask what the system will let anyone do, not who you trust.

Standing production access endures because it feels like a people problem with a people answer: hire well, restrict the credential, rely on judgment. But trust is not a control, and the same credential that empowers your best engineer empowers whoever steals it. The way out is not more careful people. It is a system in which the direct-session path for routine change simply does not exist, because every change is a versioned script that a second party reviews, that executes under a recorded actor, and that lands in an append-only trail no insider can quietly rewrite.

Built this way, the least-privilege and insider-risk mandates stop being posture and become mechanism. Separation of duties is enforced rather than requested. Approval is bound to content rather than to trust. Access is revocable rather than permanent. Accountability is captured by construction rather than reconstructed after the fact. The result is the state the mandate was always reaching for: nobody, administrators included, can apply an unreviewed, unlogged change to production, because the platform will not permit it.

References

References.

1. Verizon. 2024 Data Breach Investigations Report. Privilege misuse and the human element as recurring breach patterns.

2. IBM Security and Ponemon Institute. Cost of a Data Breach Report 2024. Breaches involving stolen or compromised credentials took the longest to identify and contain, at an average of 292 days; global average breach cost 4.88 million USD.

3. National Institute of Standards and Technology. NIST SP 800-53 Rev. 5. AC-6 (least privilege), AC-3 (access enforcement), AU-2 and AU-3 (audit and accountability).

4. PCI Security Standards Council. PCI DSS v4.0. Requirement 7 (restrict access by business need to know) and Requirement 10 (log and monitor all access).

Note on figures: the figures cited (292-day average identification-and-containment time for credential-based breaches; 4.88 million USD global average breach cost) are drawn from the IBM Security and Ponemon Cost of a Data Breach Report 2024 and are reproduced as published. No other statistics or percentages are asserted; qualitative breach-pattern observations reflect the cited industry reporting and should be assessed against your own environment.