Expert insight — Fine-grained, dynamic authorization

How do you spot an attacker reading too much data?

Least privilege is not always enough: sometimes you have to decide whether each access is still legitimate at the moment it happens.

An ordinary morning at CorgiBOX

CorgiBOX keeps its customer information in an in-house application: identity, contract, support history, but also detailed personal data and billing records. Alice works in support. Her role gives her read access to customer files, which is perfectly normal — that is her job.

That morning, her account is compromised. The attacker signs in, clears MFA with a stolen session, opens one file, then a second. Then twenty. Then a hundred. Then a thousand. Nothing is technically abnormal: the account is valid, the session is valid, the entitlement is genuinely granted, and the access path is the usual one.

So at what point does this behaviour become abnormal? The answer is neither "they should have enabled MFA" nor "they should have taken away Alice's right to read many records". An attacker does not always need to obtain a right they do not have: they can simply abuse a perfectly legitimate one, far faster and far more broadly than intended.

Authentication is not authorization

Authentication answers a trust question: who are you, and how much confidence do I have in this login? Authorization answers another one: what can you do? A modern architecture can go one step further and ask whether this identity should be able to perform this action, on this resource, in this context, right now.

Having correctly authenticated Alice at 8:40 am does not mean everything her session does at 9:15 am should remain allowed. MFA still matters; it simply does not address this problem.

Identity governance does not disappear either — quite the opposite. It governs identities, roles, entitlements, segregation of duties, movers, recertification and the full lifecycle. Does Alice really belong to the support team? Does her role cover this population of customers? Is that entitlement still justified? Those answers are essential, but a theoretical right is not enough to settle every decision at the moment of the action.

What can feed an access decision

A fine-grained decision does not only look at "role = support". It combines several dimensions, some of which change from one minute to the next.

  1. 01

    The entitlement itself

    Role, entitlement, authorised population, and above all the actual relationship between the user and the resource: does Alice handle this customer, or is she opening a file she has never interacted with?

  2. 02

    Access context

    Known device or not, origin, network, time of day, environment, and the authentication level obtained at login.

  3. 03

    Resource sensitivity

    A public FAQ and a detailed billing record do not call for the same access conditions. Data classification is part of the decision.

  4. 04

    Risk

    Flagged session, compromised device, anomaly raised by a security tool, SOC alert, recent significant change on the account.

  5. 05

    Behaviour

    Unusually fast navigation, a run of unrelated objects, an endpoint never used before, a clear break with the person's habits.

  6. 06

    Volume

    Number of objects read, number of distinct objects, calls per unit of time, exported volume. The most visible signal — and the most misleading in isolation.

Volume is a signal. On its own, it is not proof of an attack.

PDP, PEP, PIP, PAP — in one minute

Four acronyms show up as soon as externalised authorization is on the table. No need to memorise them: just look at who does what.

The PAP is where policies are administered: which rules do we want to apply? The PDP is the engine that makes the decision from policies, attributes and context. The PEP sits on the real path of the action — application, API, API gateway, access management component, bastion — it asks the PDP and applies the answer. The PIP supplies the information the decision needs: identity, role, organisation, resource characteristics, risk level, business attributes.

Where the decision happens
HumanServiceBatch
PEP — enforcement point

Application, API, API gateway, access management, bastion…

Application / API / data
Asks for a decision
PDP — authorization decision

Central policies, attributes, context

PIP — context sources
  • IGAIdentity · Role · Entitlements · SoD
  • Access managementSession · Authentication level · Login context
  • BusinessRecord owner · Relationship · Sensitivity · Classification
  • SecuritySession risk · SOC signals · Device posture
  • UsageFrequency · Volume · History · Recent behaviour

Back to Alice

Alice calls "GET /customers/12345". The enforcement point on that path can send the decision engine far more than her role.

Alice's role is still valid in the first six lines. It is the combination with the last three that changes how the call reads.

Illustrative representation
subject                  = alice
role                     = support
action                   = read
resource                 = customer/12345

customer.region          = FR-IDF
customer.classification  = personal-data

authentication.level     = strong
device.trust             = managed
session.risk             = high

customersViewedLast5Min  = 487
behaviourDeviation       = high

This block is an illustrative representation of information that may feed a decision, not the syntax of any particular product.

The authorization engine does not invent behaviour

An important point: deploying a PDP does not create a behavioural engine. For anyone to know that Alice opened 487 records in five minutes, something must have computed that number. Depending on the estate it comes from the application itself, the API gateway, a telemetry layer, the SOC, a detection engine, an anti-fraud platform or an internal scoring service.

The chain is straightforward: detection produces or enriches a signal, the PDP weighs that signal against policies and business context, the PEP applies the decision on the real action.

Detecting an anomaly and deciding what an identity may still do are two different functions. The point is being able to connect them.

A richer answer than a plain block

Reducing authorization to permit / deny closes a lot of useful doors. Depending on what the enforcement point can do, the same decision can be expressed in several ways.

  • Allow, deny, or allow with a narrower scope
  • Block export, mask certain fields
  • Ask a human for step-up authentication, require an approval
  • Apply rate limiting on the API
  • Raise an alert and trigger a SOC response

The PDP decides; the PEP still has to be able to apply that decision. That is a design criterion, not an integration detail.

Illustrative pseudo-policy
PERMIT read customer
IF
    subject.role == "support"
    AND customer.region IN subject.allowedRegions
    AND session.authenticationLevel >= requiredLevel
    AND session.risk < HIGH
    AND behaviour.customerViews5min < adaptiveThreshold

OTHERWISE
    restrict
    OR step-up
    OR deny

Illustrative pseudo-policy: this is no product's syntax. The point is to move away from "if (user.isAdmin)" scattered across business code.

Axiomatics, a concrete example of a PDP

Ariovis works with Axiomatics on fine-grained, dynamic authorization. In a target architecture, that kind of engine plays the PDP role: policies are centralized, decisions are made in real time, and identity governance becomes one of the information sources feeding the decision — identities, role model, rules, governance attributes.

The application no longer simply checks that Alice has the Support role: it delegates a sharper question, whether Alice may read this file, with this session, in this context. Legacy applications and SaaS that cannot adapt keep receiving classic entitlements; modern applications delegate progressively more. It is a trajectory, not a switch.

Our Axiomatics partnershipIdentity governance

Then the nightly batch shows up

Every night, CorgiBOX runs a financial reconciliation job, "corgibox-fiscal-reconciliation". To do its work it reads 100,000 invoices. If the rule had been "more than 1,000 reads = attack", CorgiBOX would raise a security incident every single night, and the finance team would quickly learn to ignore the alerts.

Massive access can be perfectly legitimate. Tiny access can be extremely suspicious. Context makes the difference.

The batch is an identity, not an exception

Service accounts are not estate anomalies you tolerate for lack of a better option. They are non-human identities, to be governed and controlled like the others — with different attributes.

In that context, 83,421 reads are perfectly normal. And nobody would think of asking this batch to approve a notification on its phone: trust factors for a non-human identity live elsewhere — workload identity, certificate or cryptographic mechanism, appropriate credential, origin, environment, scheduler, calling application, destination, usage pattern.

Decision for a technical identity
subject.type        = workload
subject.id          = fiscal-reconciliation
action              = read
resource.type       = invoice

environment         = production
scheduler           = nightly-finance
currentTime         = 02:17

destination         = finance-datalake
recordsRead         = 83421
behaviourDeviation  = normal

A technical identity may need an enormous volume of data without needing enormous rights on everything, everywhere, all the time.

The interesting scenario: the attacker compromises the batch

Now assume the attacker steals the service account credential. Technically, the account is still valid. They try to use it for something else: call another API, read another repository, reach HR data, change destination, run in the middle of the afternoon.

Here, 150 requests are enough to step outside the expected pattern. The PDP can check that this account calls the expected resources, from the expected context, inside the expected window, with the expected actions and destinations. Compromising the batch does not automatically give the attacker a free pass.

Same identity, different usage
subject.id          = fiscal-reconciliation
action              = read
resource.type       = employee-directory

currentTime         = 14:37
destination         = unknown
behaviourDeviation  = critical

The credential is valid; the usage no longer is.

Three situations, the same volume signal

Alice — compromised human account

487 records in 5 minutes

  • Legitimate role
  • Valid session
  • Unusual origin
  • High session risk
  • Unusual scope

Challenge, restrict or deny depending on policy

Finance batch — legitimate

100,000 invoices

  • Expected workload
  • Expected time window
  • Expected API
  • Expected destination
  • Normal behaviour

Allowed

Compromised batch

Only 150 requests

  • 2:37 pm
  • HR API
  • New destination
  • New usage
  • Critical behaviour deviation

Deny or trigger a security response

Volume is one signal among others.

What this changes for lateral movement

A compromised service account should not turn into a universal identity able to query everything technically reachable from the machine. When sensitive paths have enforcement points and rely on dynamic policy, this strongly reduces the opportunities for abuse and lateral movement across the resources actually covered by that policy.

The nuance matters. An authorization architecture does not protect a resource that bypasses the PDP, an unprotected API, direct database access or a technical path left open. That is precisely why, on a Zero Trust trajectory, an API gateway is often a relevant enforcement point for non-human identities: the batch calls the gateway, the gateway asks the PDP, and the question is no longer only "is the token valid?" but "may this technical identity perform this action on this API, in this context?". It is one pattern, not the only possible architecture.

IAM strategy and Zero TrustAccess management and CIAMPrivileged access management

Where to start, without a big bang

No organisation externalises 100% of its authorization overnight, and that is not a goal in itself. The existing foundation — identity governance and access management — already provides control over identities, roles, entitlements, authentication and sessions.

Fine-grained authorization then comes in on the few cases where it genuinely changes something: sensitive data access, a critical business API, a financial operation, a very powerful service account, an AI agent, an administrative action. Modern applications delegate progressively more decisions, and some organisations do aim for much broader externalisation over time. You start where the value justifies the complexity.

Security Meets Business

A security policy that blocked every identity reading a lot of data would stop CorgiBOX within one night. The business needs batches, integrations, migrations, backups and bulk processing. That is exactly why security has to understand the business precisely enough to tell expected mass usage from fraudulent usage.

The goal is not to arbitrarily constrain the business in order to secure it. The goal is to express legitimate usage precisely enough to recognise faster when it stops being legitimate.

The right question

Alice genuinely holds the Support entitlement. The batch genuinely holds massive rights on invoices. So the question is not who reads the most.

It is whether this access remains consistent with the identity, the resource, the action, the context, the behaviour and the level of risk we have decided to accept.

Design fine-grained, dynamic authorization

Your roles say who can access an application. We can help you decide what an identity may actually do at the moment of each action: priority use cases, policy model, enforcement points, signals to connect.