Enterprise Identity & Access Management Platform  ·  View 25 of 27  ·  Assurance

Multi-Tenant Isolation

Three layers, because each one alone has a known bypass.

Editable source SVG draw.io All views
Identity layer — separate directories, no shared principal
Identity layer — separate directories, no shared principal
Tenant A
Tenant A
Users
Users
Workload identities
Workload identities
Tenant B
Tenant B
Users
Users
Workload identities
Workload identities
Platform tenant
Platform tenant
Platform operators
PIM + customer approval
Platform operators...
Platform workload identity
no tenant data role
Platform workload identity...
Authorization layer — tid is a mandatory predicate, never an optional filter
Authorization layer — tid is a mandatory predicate, never an optional filter
Claims in the token
Claims in the token
tid
issuing tenant
tid...
oid / sub
subject
oid / sub...
roles / scp
roles / scp
Decisions made from them
Decisions made from them
Tenant predicate
fails closed
Tenant predicate...
App role check
App role check
ABAC condition on RBAC
scope + attribute
ABAC condition on RBAC...
Data layer — isolation proved by storage, not by code review
Data layer — isolation proved by storage, not by code review
Shared services, partitioned
Shared services, partitioned
Cosmos DB
partition key = tenant_id
Cosmos DB...
Azure SQL
row-level security
Azure SQL...
Storage
container per tenant
Storage...
Dedicated, on request
Dedicated, on request
Dedicated database
premium tier
Dedicated database...
Customer-managed key
tenant holds revocation
Customer-managed key...
Private endpoint per tenant
Private endpoint per tenant
Cross-tenant reporting
the one place tenants mix
Cross-tenant reporting...
Support engineer
Support engineer
read from token only
read from token only
session context per request
session context per request
revoke key
revoke key
aggregate only, no row export
aggregate only, no row export
elevation needs tenant approval
elevation needs tenant approval
Multi-Tenant Isolation — identity, authorization, data
Multi-Tenant Isolation — identity, authorization, data
Person or role
Person or role
Security / platform
Security / platform
Decision point
Decision point
Data store
Data store
Risk / gap
Risk / gap
synchronous
synchronous
batch
batch
failure / alternate
failure / alternate
Three layers, because any one of them alone has a known bypass. The honest weak point is drawn: cross-tenant reporting is the single component with a legitimate reason to read every tenant, and it is therefore the component with the smallest surface and the tightest review.
Three layers, because any one of them alone has a known bypass. The honest weak point is drawn: cross-tenant reporting is the single component with a legitimate reason to read every tenant, and it is therefore the component with the smallest surface and the tightest review.
v 1.0 · owner Data & AI Global Practice · date 2026-08
v 1.0 · owner Data & AI Global Practice · date 2026-08
Text is not SVG - cannot display

The three layers

  • Identity: separate directories, no shared principal. Authorization: tid is a mandatory predicate. Data: partition keys, row-level security and per-tenant containers.
  • Isolation is proved by storage rather than by code review. A partition key or an RLS predicate holds when a developer forgets a WHERE clause; a coding standard does not.
  • Dedicated resources are offered for tenants who require them, including customer-managed keys — which give a tenant the ability to revoke access to their own data unilaterally.

Operator access

  • Platform operators hold no standing role in any tenant's data plane. Elevation requires PIM plus tenant approval, in the shape of a Lockbox-style workflow.
  • The platform's own workload identity can manage tenant infrastructure and cannot read tenant data. That separation is enforced by role definition, not by convention.
  • Every operator action inside a tenant boundary is written to that tenant's own audit trail, so the tenant can see it without asking.

The honest weak point

  • Cross-tenant reporting is the single component with a legitimate reason to read every tenant. It is aggregate-only, has no row export path, and has the tightest review of anything in the platform.
  • A bug in the shared authorization library would affect every tenant at once. Mitigated by contract tests, fuzzing of the tenant predicate, and a canary tenant in the release path.
  • Noisy-neighbour effects are handled by per-tenant quotas at the gateway (view 14), which is a performance control rather than an isolation one — do not confuse the two.