Skip to main content
Back to Blog
SaaS Architecture

Multi-Tenant Isolation: Pool, Silo, or Bridge for SaaS Architects

October 202611 min read
Abstract visualization of pooled, siloed, and hybrid SaaS tenant isolation patterns

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.com

Table of Contents

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.

Cost / operational overhead →Isolation strength →Poollow costBridgemixed tiersSilohigh isolationShared infraHighest density, widest blast radiusHybrid boundariesDedicated only where sensitivity demandsDedicated stacksSmallest blast radius, highest overhead

Data-layer isolation patterns: shared tables, schema-per-tenant, database-per-tenant and hybrid choices

Shared-table isolation is by far the most popular pooled pattern: each table has a tenant_id column and every query is filtered by the current tenancy context through application code or database policy. Here is where row-level security shines. PostgreSQL’s docs call out enabling RLS with ALTER TABLE ... ENABLE ROW LEVEL SECURITY and recommend FORCE ROW LEVEL SECURITY especially when you want to ensure that table owners themselves can not bypass tenant policies, as owners and roles with the BYPASSRLS attribute will otherwise ignore the filter completely.

Schema-per-tenant gives each tenant their own schema within a single database instance. It supports per-tenant customization and simplifies certain compliance arguments, but backup and migration tooling must iterate across thousands of schemas, and connection pooling is harder to reason about since reusing a pooled connection across tenants without resetting its search path is a common leak vector.

Database-per-tenant is more isolated: a single database dedicated to a tenant, sometimes even on dedicated hardware. Backups, restores, migrations and point-in-time recovery operations are all per-tenant, which is more operational overhead but provides the strongest isolation for regulated data.

The practical answer for most portfolios is hybrid:

  • Segregate based on sensitivity: a billing record or PII/credit card data requires greater separation than feature usage data.
  • Apply shared tables with RLS for low-sensitivity, high-volume data where density matters.

Isolate regulated/high-risk tenant data into separate schemas or databases, even within a pooled platform.

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.

Testing and validation: cross-tenant boundary tests and continuous authorisation checks

Design-time isolation decisions are only valuable to the extent that they can be enforced at runtime through rigorous testing. The OWASP authorisation regression testing cheat sheet provides a concrete example of a cross-tenant boundary test: Create two separate tenants and populate them with data, then perform wide-reaching queries as one tenant against the other's data and verify that no records are exposed.

  1. Make the cross tenant boundary test a mandated check in CI instead of a manual audit performed intermittently.
  2. Gate schema changes in the same authorisation regression suite, because a new column or join could silently circumvent a policy.
  3. Check that FORCE ROW LEVEL SECURITY is enabled on each tenant-scoped table. (Not just ENABLE ROW LEVEL SECURITY.)
  4. Audit for roles carrying BYPASSRLS and confirm application connections never use them.
  5. Check connection pooling configuration for tenancy context leakage across reused connections.

OWASP’s more expansive recommendation characterizes isolation as the conjunction of policy, enforcement, and ongoing testing; an isolation design that appears well-conceived on paper but is not subject to CI-based regression testing is one of the most common contributors to cross-tenant data leakage in deployed applications.

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.

Sources