Skip to main content

Privilege Separation

Split a service into components with different authority so compromise of one parser or workflow does not grant the complete service privilege.

Split authority by function

Privilege separation divides a service into components that receive only the authority needed for one function. A network-facing parser can accept untrusted input without also holding signing keys, deployment credentials, policy administration, or unrestricted filesystem access.

It differs from separation of privilege. Privilege separation limits what one compromised component can do. Separation of privilege requires more than one independent condition or actor to authorize a sensitive action. A design can use both.

Define component authority

For each component, list permitted system calls, files, sockets, devices, network destinations, credentials, key operations, data classes, administrative actions, and child processes. Define the narrow message schema between components. Treat every message across the split as untrusted input with authenticated sender context and bounded size.

Place secret custody and high-impact actions in the smallest component that can validate a complete request. Do not give a front-end a general signing or command API when it needs one specific operation.

Enforce the split

Use separate operating-system identities, processes, containers or virtual machines, capability sets, filesystem views, network policy, credential scopes, and key-service policies. Remove inherited file descriptors, environment secrets, debug access, runtime sockets, and broad metadata credentials.

The boundary must survive deployment and recovery. A shared service account, writable binary, common administrator, or unrestricted control socket can collapse the separation.

Failure and residual risk

Splitting code creates protocols and state transitions. A confused-deputy flaw in the privileged helper can convert a narrow API into broad authority. Shared libraries, kernels, hosts, logs, caches, and control planes remain common failure domains. Excessive fragmentation increases operational complexity and can make policy inconsistent.

Privilege separation does not correct unsafe logic inside the privileged component. It reduces the consequence of compromise only when enforcement denies the blocked actions.

Pomerium boundary

Pomerium components have documented roles in the access path. Operators must still run them with narrow workload identities, filesystem and network access, configuration authority, and key permissions. Separating Pomerium from upstream workloads helps only when a compromised upstream cannot read Pomerium credentials or change its deployment.

Evaluation checklist

  • Which parser or externally reachable component has the highest exploit exposure?
  • What exact files, sockets, keys, resources, and operations can each component access?
  • Can one component ask a privileged helper to act as a confused deputy?
  • Which shared identity, host, administrator, deployment path, or recovery action collapses the split?
  • Does a negative test prove that compromise of one component cannot perform the prohibited action?

Sources and further reading

Keep learning

Security Engineering FoundationsAuthorization and Policy

Separation of Privilege

Require independent conditions, authorities, or actors before the system permits a sensitive action.

Learn this term
Platform and Component SecuritySecurity Engineering Foundations

Trusted Computing Base

Identify every component whose correct behavior is necessary for a stated security property, then reduce and verify that trusted set.

Learn this term
Security Engineering FoundationsSecurity Operations and Risk

Defense in Depth

Place complementary controls across distinct failure domains so one failure does not expose the protected asset.

Learn this term

Get a Personalized Demo

Schedule a Call with a Pomerium Engineer

Get a Demo