Multi-tenant isolation patterns are divided into three pattern families: pool (shared infrastructure), silo (isolated, dedicated per tenant) and bridge (a hybrid of pool/silo). Balancing tenant trust and risk against cost and ease-of-operation is the single deciding factor between them: highly trustworthy and/or low sensitivity tenants may take advantage of pooling, highly regulated or adversarial tenants require silos, and heterogeneous tenant portfolios require bridges. Regardless of family chosen, you must always have row-level security rules, identity-tier policies, and per-tenant resource limits configured.
TL;DR:
Use shared tables with database row policies for non-sensitive, high throughput data. Move regulated content into separate schemas/databases.
- Enable FORCE ROW LEVEL SECURITY on all tenant scoped tables. The table owner along with any roles with BYPASSRLS would otherwise be able to bypass tenant policies.
- Configure compute quotas on a per tenant basis. Sharded object storage. Limit signed URL access permission and duration. Prepend tenant id to cache keys for tenant scoped results.
- Enforce mutual TLS on all inter-service communication. Use mesh/gateway policies to deny cross tenant requests before they reach application logic.
- Execute boundary tests between two seeded tenants in CI. Ensure zero record leakage. Recheck auths on schema changes.
PODTECHBuild SaaS for Critical Infrastructure
PODTECH is a custom software development company that builds enterprise-grade software such as scalable SaaS applications for mission critical infrastructure and complicated operations.
podtech.comTable of Contents
- Isolation models: pool, silo and bridge, and their trade-offs
- Data-layer isolation patterns: shared tables, schema-per-tenant, database-per-tenant and hybrid choices
- Infrastructure and runtime isolation: compute, storage, cache and messaging boundaries
- Identity-driven isolation and zero trust: service identities, service mesh and identity-tier policies
- Testing and validation: cross-tenant boundary tests and continuous authorisation checks
- How to choose an isolation pattern: a decision checklist for architects
- PODTECH perspective and practical lessons from mission-critical deployments
- Author perspective: recommended default and next steps
- FAQ
- Sources
Isolation models: pool, silo and bridge, and their trade-offs
Pool (shared) isolation hosts every tenant in the same database, compute cluster and application instance, differentiated by logical boundaries like a tenant identifier. Silo (dedicated) isolation allocates a database, namespace or cluster per tenant, sometimes an entire deployment. Bridge, or hybrid, isolation straddles the line: sharing compute and having dedicated databases or sharing databases with dedicated schemas for some tenants.
They each have varying blast radii as well. A vulnerability in a pooled system's authorisation logic can compromise all tenants simultaneously since the attack surface is one shared codebase and schema. A silo model reduces that blast radius down to one tenant, with the tradeoff of replicating that infrastructure and patching effort n times for n tenants. Bridge models allow you to apply strict boundaries only where necessary, keeping the attack surface commensurate with actual sensitivity.
Administrative boundaries work the same way. Pooling creates a single pane of glass to patch and monitor, making things easier but if one permission is misconfigured it can impact everyone. Siloing mitigates admin risk, but multiplies the surface area of things that can become un-configured.
The operational consequences architects weigh most often:
- Cost and density: Pooling allows for the greatest density (resource utilisation) per tenant. Siloing is the most expensive per tenant but easiest to reason about.
Scaling behaviour: pooled systems horizontally scale as a single fleet, siloed horizontally as many small fleets making capacity planning difficult.
Tenant customisation: siloed and bridge models are much more tolerant of per-tenant schema changes/custom extensions than a shared pool model would be, where any schema change/customisation would affect every tenant at once.
Infrastructure and runtime isolation: compute, storage, cache and messaging boundaries
Database boundaries are not enough; your compute, storage and messaging are still subject to the same architecture trade-offs. Dedicated nodes or node pools per tenant tier isolates workloads so a noisy tenant's compute doesn't impact another tenant's requests. Container scheduling should isolate workloads by tenant too, so resource quotas and limits are enforced per tenant namespace, not just per workload. This stops a batch job from one tenant eating all of a cluster's shared capacity.
Storage deserves the same level of treatment. Object storage namespaces should be namespaced per tenant, and signed URLs should be as tightly-scoped as possible in terms of permission and lifetime. An excessively long-lived signed URL is essentially pushing part of your tenant boundary into storage outside your application's control. Storage misconfiguration has led to more cross tenant exposure for our datacentre telemetry and colocation teams than database bugs simply because storage permissions are harder to audit.
Cache and messaging layers are common oversights. The OWASP Multi-tenant Security Cheat Sheet suggests segmenting every cached value and queue item by three criteria: global, tenant-scoped or user-scoped. Additionally, the tenant identifier should be added to the cache key if a given query returns tenant-dependent results. Failure to do so is a common mistake that leads to one tenant's cached response bleeding into another tenant's session.
Practical controls worth setting early:
- Per-tenant compute quotas to prevent a single tenant degrading shared capacity.
- Tenant-aware cache keys for any cached value that is not genuinely global.
- Dedicated queues/topics per tenant tier, ensuring that one tenant's queue backing up doesn't block work from processing for other tenants.
Identity-driven isolation and zero trust: service identities, service mesh and identity-tier policies
Network segmentation is only a brittle boundary when services start to span clusters, regions, or cloud providers. NIST's zero-trust architecture guidance advises that identity-tier policies, backed by untamperable service identities, enable fine-grained authorisation that is agnostic of network location. This means that you can change the underlying infrastructure without having to re-write policies.
Applied pragmatically this means provisioning ephemeral certificates to all services, adopting SPIFFE-style identity provisioning vs hardcoded credentials, and mandating mutual TLS between services so identity, rather than network location, determines if a request is allowed. A service mesh / API gateway then becomes your control plane: it inspects the requesting service's identity+tenant context vs policy prior to hitting application logic, serving as a layer that compliments existing data-layer defenses.
- Issue short-lived service identities instead of long-lived API keys or static credentials.
- Enforce mutual TLS between every internal service call, not just at the edge.
Use mesh/gateway policy to deny cross-tenant calls prior to application logic.
Tip: Think of identity-tier policy as an additional layer of defense that works alongside RLS, not instead of it.
How to choose an isolation pattern: a decision checklist for architects
Tenant trust, compliance requirement, scale, customization need and cost are the five drivers of your decision. Iterate through each instead of simply going with whichever pattern your team is familiar with.
- Classify tenant data by sensitivity and regulatory scope before anything else.
- Don't oversell tenant trust: internal pilot tenants represent a different risk profile than paying enterprise customers with signed data commitments.
Beware the law of scalability. Judge your pattern size honestly. What works for ten users can collapse under ten thousand.
- Select pool, silo or bridge based on your highest sensitivity data, not just your average data.
Specify and capture the selected boundary and justification. Baseline minimum acceptance criteria of cross-tenant boundary test and an RLS configuration check prior to any tenant facing release.
Isolation decisions should be written down as an architecture decision record. Many teams who skip this step learn the trade-offs again when they experience an incident.
PODTECH perspective and practical lessons from mission-critical deployments
Especially in mission critical settings like datacentre monitoring, brokerage, and trading infrastructure, bridging tiers might be mandated by operational realities rather than theory: uptime SLAs, auditability concerns, and the necessity to patch without tenant-wide downtime windows all necessitate bridge models for these workloads. Most worrying regressions of isolation come not from the database layer alone. They're introduced when connection pooling strategies, cache keys, and storage permissions drift out of sync with the intended policy. Hence we argue the cross-tenant boundary test should be part of continuous integration, not a one-off audit.
FAQ
What does multi-tenant database mean?
Multi-tenant database describes a database that is used by multiple customers (tenants). Such a database runs from a common infrastructure and databases are logically separated, rather than physically. Tenants are often isolated by the presence of a column storing tenant identifier values, database-level row-level security policy or separate schemas in the same database.
What is data isolation and how does it work?
Data isolation refers to controls that are used to prevent one tenant from being able to read or modify another tenant's data. These controls include database policy (such as row-level security), infrastructure boundaries (such as dedicated namespaces for storage) and identity-tier enforcement at the service layer.
Is Kafka a multi-tenant?
Kafka can be used to service multi-tenant workloads, however multi-tenancy isolation is dependent on topic, partitions, and access control lists configurations rather than being provided out-of-the-box. Generally teams will isolate tenants by partitioning topics on a per-tenant tier basis and then quota managing to ensure one tenant's throughput doesn't impact another.
What is the difference between single tenant and multi-tenant architecture?
In single-tenant architecture, each customer gets their own dedicated instance of an application and database. This provides the strongest level of isolation but at greatest infrastructure cost. In multi-tenant architecture, customers share the same infrastructure using patterns like shared tables with row-level security, schema-per-tenant, or a hybrid approach. This trades off decreasing levels of isolation strength for lower infrastructure cost and simpler operations at scale.
