By NHI Mgmt Group Editorial TeamBased on Cerbos: “From OPA to our own engine - the Cerbos journey” (June 11, 2025)

TL;DR: Moving from OPA to a custom policy decision engine delivered up to 17x faster authorization decisions, clearer reasoning, and lower memory and CPU overhead, according to Cerbos. The deeper lesson is that authorization platforms win when they separate policy from code without forcing teams to absorb engine complexity.


At a glance

What this is: This is a Cerbos analysis of moving from OPA to a custom policy decision engine, with the central finding that separating policy from code improved authorization performance and explainability.

Why it matters: IAM teams should care because authorization is a control plane problem, and the design choice between external policy engines and embedded logic affects auditability, latency, and how consistently permissions are enforced across applications.


Context

Authorization is the part of access control that decides whether a principal can perform an action on a resource. In application environments, that decision logic often becomes tangled with product code, which makes it harder to govern, explain, and evolve as permissions grow more complex.

Cerbos frames its engine shift as a response to those governance limits rather than a pure engineering preference. For IAM and application teams, the underlying question is how to keep policy separate from code without creating a second system that developers cannot operate confidently.

The article is therefore about authorization architecture, not just tooling choice. Its relevance is broader than one platform because the same pattern appears wherever teams need consistent policy decisions across applications, APIs, and runtime layers.


Key questions

Q: How should teams separate authorization from application code in business apps?

A: Teams should move access rules into a centralized policy layer and keep the application focused on business logic. That lets security and product owners adjust roles, approvals, and visibility rules without rewriting endpoints. It also improves auditability because the entitlement model lives in one place instead of being duplicated across services.

Q: Why do custom policy engines matter for authorization governance?

A: They matter because authorization is not only about correctness, but about how quickly teams can change policy, explain decisions, and keep enforcement consistent. When the engine is too opaque or too rigid, developers work around it, and the governance model starts to fragment across services.

Q: What are the signs that an authorization model has become too tightly coupled to the application code?

A: A tightly coupled model usually shows up when small policy changes require code changes, deployments, or manual edits across multiple services. Another warning sign is when authorization checks are mixed with business logic, making the code hard to test or refactor. If teams cannot upgrade policy without untangling application behavior, the design has already become too rigid.

Q: Should IAM teams prioritise policy portability or engine specialisation?

A: Prioritise portability when many services need the same access rules, and specialisation when a single use case demands very low latency or custom decision output. The right answer depends on whether governance consistency or execution optimisation is the bigger operational constraint.


Technical breakdown

Why external policy engines hit a ceiling for authorization

Policy engines like OPA are designed to evaluate rules separately from application code, which is why they are attractive for centralized authorization. The ceiling appears when the surrounding product needs decision explanations, custom output, or specialised application workflows that the generic engine does not model cleanly. At that point, the engine becomes part of the product architecture, not just a policy backend. The trade-off is less about raw correctness and more about whether the control plane can evolve at the same speed as the application it governs.

Practical implication: Treat the policy engine as part of the application control plane and test whether it can support explainability, not just allow or deny decisions.

What changes when authorization becomes a dedicated decision service

A dedicated policy decision point centralises the evaluation of principal, action, and resource, which helps teams separate permission logic from business logic. That separation improves governance because authorization becomes observable, testable, and easier to modify without redeploying every application path. It also creates a clearer boundary for logging and audit trails. The real architectural benefit is not abstraction for its own sake, but the ability to change authorization behaviour without rewriting application logic each time requirements shift.

Practical implication: Keep authorization decisions outside the application code path wherever possible so policy changes do not require broad application rewrites.

Why performance and explainability are linked in authorization design

Authorization systems are often treated as lightweight, but they sit on critical request paths and can block every downstream operation. If decision latency is high, teams compensate with caching, shortcuts, or duplicated logic, which weakens governance. Explainability matters for the same reason: when developers cannot see why access was denied, they rebuild policy understanding in code, tickets, or ad hoc exceptions. A well-designed decision engine has to optimise for both speed and evidence, because one without the other becomes operationally brittle.

Practical implication: Measure authorization platforms for decision latency and decision trace quality together, not as separate concerns.


NHI Mgmt Group analysis

Authorization is becoming a governance layer, not just an application feature. Once policy logic moves out of code, the control point becomes reusable across services, but also more visible as a shared dependency. That changes how IAM teams should think about ownership, testing, and change control. The practical conclusion is that authorization architecture deserves the same governance discipline as identity lifecycle and privileged access.

Decision explainability is now part of authorization quality. A policy engine that returns only allow or deny leaves developers guessing, which encourages hard-coded exceptions and brittle business logic. Detailed decision reasoning turns access control from a black box into a reviewable control surface. The implication is that teams should assess whether their authorization layer can support audit and debugging without becoming a support burden.

Specialised engines create an identity control plane trade-off between flexibility and portability. A custom decision engine can be optimised for a narrow use case, but the more specific it becomes, the more carefully teams must manage portability and future integration. That does not weaken the architecture, but it does make architecture decisions part of the security programme. Practitioners should treat authorization platform selection as a lifecycle choice, not a one-time implementation detail.

Policy separation only works when developers can actually use it. The article reinforces a broader IAM lesson: governance fails when the control is technically sound but operationally inaccessible. If policy authors need a new language or too much engine knowledge, teams drift back toward embedded logic and inconsistent enforcement. The practitioner conclusion is that usability is a security property in authorization design.

Application authorization needs a named control surface for what this article is really solving: policy decision portability. Cerbos's shift shows that the useful boundary is not just between policy and code, but between reusable decision logic and environment-specific execution concerns. That boundary lets organisations evolve permissions without recreating the same rules in every service. Practitioners should design for policy portability, or accept policy sprawl as the default.

From our research library:

What this signals

Policy decision portability: The architectural lesson is not that every team needs a custom engine, but that authorization should be governable as a reusable decision layer. When policy lives in application code, consistency breaks under scale and auditability becomes dependent on individual developers.

What should change in practice is how teams evaluate authorization platforms. They should test whether the control can support explainability, low latency, and change management without forcing each service to replicate the same permission logic.

This also affects IAM programme design beyond application teams. Authorization controls that are easy to consume are more likely to stay centralised, which is what keeps permissions reviewable across the lifecycle.


For practitioners

  • Define the authorization control plane Separate policy evaluation from application logic so access rules can be governed independently of feature code and released without application rewrites.
  • Test for decision explainability Require that denied requests return enough policy context for developers and auditors to understand the decision path, not just the final outcome.
  • Measure latency on the request path Benchmark authorization decision time under realistic load, because access checks sit in front of every protected operation and directly affect user experience.
  • Avoid rebuilding policy in application code Audit services for embedded permission logic, duplicate rules, and local exceptions that bypass the shared decision layer.

Key takeaways

  • Authorization architecture becomes a governance question when policy is separated from application code but still has to remain explainable and fast.
  • The article shows that decision latency, memory use, and debugging quality all influence whether shared authorization stays operationally viable.
  • Teams should look for a reusable decision layer that developers can actually adopt, or permission logic will drift back into application code.

Standards & Framework Alignment

This section maps relevant standards and security frameworks to the operational risks and controls described in this guidance.

NIST SP 800-53 Rev 5, NIST CSF 2.0 and OWASP ASVS set the governance and control requirements practitioners need to meet.

FrameworkControl / ReferenceRelevance
NIST SP 800-53 Rev 5AC-6 — Least PrivilegeAuthorization policy decisions directly enforce least privilege across application requests.
Recommendation — Apply AC-6 to keep permission decisions separate from application logic and tightly scoped to required actions.
NIST CSF 2.0PR.AA-05 — Access Permissions, Entitlements and AuthorizationsThe article centres on how authorisation decisions are governed and evaluated in production.
Recommendation — Use PR.AA-05 to centralise and review access permissions through a shared decision layer.
OWASP ASVSV8 — AuthorizationThe subject is application-level authorization design and enforcement.
Recommendation — Apply V8 requirements to verify that authorization logic is consistently enforced outside business code.

Key terms

  • Access Control Plane: The layer that coordinates identity, policy, approvals, enforcement, and logging across multiple systems. It matters because modern access decisions are rarely made in one place, and fragmentation across tools can turn governance into disconnected evidence.
  • Policy decision point: A policy decision point evaluates contextual rules and returns an access decision that enforcement points can act on. It separates authorization logic from application code, which helps teams manage tenant rules, resource ownership, and risk signals consistently.
  • Decision Explainability: Decision explainability is the ability to understand why a system reached a specific outcome. In fraud and identity workflows, it means the organisation can trace the signals, confidence, and decision path well enough to review false positives, tune policy, and defend the result internally and externally.
  • Control Portability: Control portability is the ability of a governance control to keep working when the application architecture changes. In clean core programmes, portable controls survive release cycles, integrations, and cleanup of custom code, which makes them more reliable than controls that only exist inside legacy extensions.

Deepen your knowledge

NHI governance, agentic AI identity, and machine identity lifecycle are core topics in our NHI Foundation Level course, the industry's only accredited NHI security programme. If you are responsible for identity security strategy or NHI governance in your organisation, it is worth exploring.
NHIMG Editorial Note
Published by the NHIMG editorial team on June 23, 2026.
Updated on October 6, 2026.
NHI Mgmt Group, the independent authority on Non-Human Identity, IAM, and Agentic AI security. nhimg.org