Roles as compression
A Socratic walk-through of roles as compression — reasoned out one step at a time, not lectured.
The question we started with
THE QUESTION #Why does a tidy set of roles turn, over years, into hundreds nobody can explain?
Every access-control design starts the same way. Someone draws eight roles on a whiteboard — clerk, supervisor, auditor, administrator — and everybody agrees this is obviously right. Five years later the same system has four hundred roles with names like FIN_AP_SUPERVISOR_EMEA_TEMP_2 and nobody can say who should have them.
The tempting reading is that discipline slipped. But the same outcome appears in well-run organisations with review boards and naming standards, which suggests something structural rather than cultural. So ask what a role actually is, and see whether the failure is written into the idea itself.
Reasoning it through
REASONING #Underneath any permission system there is a matrix: every person against every permission, with a mark where the two meet. Left alone that is unmanageable — thousands of rows, thousands of columns, and no way to see whether it says anything sensible.
A role is a compression of that matrix. Instead of storing every cell, you notice that many people have identical rows, name the repeated pattern, and store it once. People map to roles, roles map to permissions, and a matrix with millions of cells collapses to two small lists. That is a real and large gain, and it is the honest case for role-based access control.
But now ask the question that every compression scheme has to answer: what happens to the data that does not fit the pattern?
Here it is decisive. Suppose someone needs almost the clerk role plus one extra permission. There are two moves. You can widen the clerk role — which grants that permission to every clerk, quietly, forever. Or you can create a new role for this near-match. The first is a privilege escalation for a population; the second is safe, local, easy to justify, and takes a minute. Everyone chooses the second, and everyone is right to.
Follow that repeatedly. Every exception mints a role. Nothing about the mechanism resists it, and the incentive at each individual decision points the same way.
Now ask about the other direction. When is a role deleted? To delete one you have to know that nobody needs it, and that is not knowable from the role system, which records assignments rather than usage. Meanwhile deleting a role that somebody silently depends on breaks their work in a visible, blamed way, while keeping an unnecessary one costs nothing anybody can see. So creation is cheap and reversible-looking; deletion is expensive and risky. That is a ratchet, and ratchets have only one outcome.
Several other pressures push the same way. Provisioning by imitation — "give the new starter the same access as her predecessor" — copies accumulated exceptions into a fresh person. Reorganisations and migrations add a parallel vocabulary rather than replacing the old one. Temporary grants outlive their projects because nothing was set to expire them. And a person who changes jobs internally usually gains the new role without losing the old, which is entitlement creep at the level of the individual rather than the catalogue.
Now look at the endpoint, because it is the sharpest way to see the failure. When exceptions outnumber patterns, you approach one role per person. At that point the compression has fully decompressed: you are storing the original matrix again, and paying for an indirection layer on top of it, with role names that suggest a shared meaning they no longer carry. The scheme has not merely stopped helping. It is now worse than the thing it replaced, because it looks organised.
What would actually help? Two directions, and both should be stated with their costs. You can compute permissions from attributes — department, grade, project, location — so that the exceptions are expressed as policy rather than enumerated as new roles. That is attribute-based access control, and it does not abolish the problem; it relocates it into policy complexity, where growth is harder to see. Or you can attack the ratchet directly: expire grants by default, review entitlements periodically against actual usage logs, and periodically re-derive roles from what people really do rather than from what they were once given. That works, and it is unglamorous, continuous effort — which is why it is the part that gets dropped.
The analogy
THE ANALOGY #A wardrobe organised by outfit rather than by garment. At first a handful of named outfits covers most days. Then one occasion needs the work outfit with different shoes, so you hang a new complete outfit rather than disturb the old one, because changing the original would alter every day it is worn. Repeat for a few years and every hanger holds a near-duplicate of another, the labels have stopped meaning anything, and you cannot throw any of them out because you no longer remember which occasion each was for.
an overfull wardrobe is visibly full and its cost is felt daily by its owner, whereas an overgrown role catalogue is invisible to everyone except the auditor, and its cost lands on people who never see it — which is exactly why nothing forces the clear-out.
Clarifying the model
THE MODEL #Three refinements.
First, role explosion is not caused by bad naming or weak governance, though both make it worse. It is caused by an asymmetry: adding a role is locally safe and deleting one is locally risky. Any structure with that asymmetry accumulates, regardless of who is running it.
Second, the security harm is indirect and therefore easy to underrate. The danger is not that four hundred roles exist; it is that nobody can any longer answer "who can approve a payment?" or notice that a leaver kept access. Access control that cannot be reasoned about has stopped being a control, whatever it still enforces.
Third, resist the reflex to fix it by a one-off cleanup. A consolidation project without a change to the incentives simply resets the counter, and the same forces regrow the catalogue on the same curve. The durable fixes are the ones that make deletion automatic — expiry by default, recertification, grants tied to a project's lifetime — rather than the ones that make the catalogue briefly tidy.
A picture of it
THE PICTURE #How to readThe proportions are illustrative rather than measured — what matters is the shape. Requests that fit an existing role cost nothing. Requests that do not almost all take the upper branch, because editing a shared role changes it for everyone who already holds it, so minting a new one is the safe local choice. Everything flows into the catalogue and only a trickle leaves it; there is no return edge, and that missing edge is the entire phenomenon.
What became clearer
WHAT CLEARED #A role is a compression of the permission matrix, and it holds only while people genuinely cluster. Every exception is a value the encoding cannot represent, and because the cheap response to each one is a new symbol while the removal of stale symbols is nobody's safe move, the dictionary grows monotonically until it is as large as the data it was meant to summarise — with an extra layer of misleading names on top.
Where to go next
ONWARD #- Role mining: re-deriving a role set from observed access logs rather than from historical grants.
- Attribute-based access control, and whether policy complexity is a better problem to have than catalogue growth.
- Why time-boxed access by default is the single change with the largest effect on entitlement creep.
Key terms
TERMS #| Term | What it means |
|---|---|
| Role-based access control (RBAC) | granting permissions via named roles rather than assigning them to individuals directly. |
| Role explosion | the unchecked growth of a role catalogue toward one role per person, dissolving the benefit of grouping. |
| Entitlement creep | the accumulation of permissions by an individual as they move between jobs without losing former access. |
| Recertification | a periodic review in which each grant must be re-justified or is removed. |
| Attribute-based access control (ABAC) | deciding access by evaluating policy over attributes of the user, resource and context. |
Every term the collection defines is gathered in the glossary.