Skip to content
Back to skills

Multi Tenancy

ASecurity

Isolate tenants in data, code, and capacity, choosing the right isolation model per tier. Use when designing SaaS data models or containing noisy-neighbor and cross-tenant risks.

  • 7 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 5, 2026
ai-agentsgodatabasesecurity

Works with

  • cli

Security analysis

A100/100

Scanned September 5, 2026

npx -y skills add Amey-Thakur/AI-SKILLS --skill multi-tenancy --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Multi Tenancy?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Multi Tenancy
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/amey-thakur-multi-tenancy/badge)](https://www.skillsdirectory.com/skills/amey-thakur-multi-tenancy)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: multi-tenancy
description: Isolate tenants in data, code, and capacity, choosing the right isolation model per tier. Use when designing SaaS data models or containing noisy-neighbor and cross-tenant risks.
---

# Multi-tenancy

Two failure classes define the design: a tenant seeing another's data
(catastrophic, reputational) and a tenant consuming another's capacity
(gradual, contractual). Address both explicitly.

## Method

1. **Choose the isolation model per tier, not ideologically.** Shared
   tables with tenant_id: cheapest, scales to millions of tenants.
   Schema-per-tenant: middling isolation, migration fan-out pain beyond
   hundreds. Database-per-tenant: strongest isolation and per-tenant
   restore, real cost; sell it as the enterprise tier. Mixing models
   (shared for small, dedicated for large) is normal.
2. **Enforce tenancy below the application when possible.** Postgres
   row-level security with `tenant_id = current_setting(...)`, set per
   request from the authenticated context, turns a forgotten WHERE
   clause from a breach into a bug. Without RLS: repository-layer
   scoping that raw queries cannot bypass, and no ORM escape hatches in
   handlers.
3. **Carry tenant context, never accept it.** Tenant comes from the
   auth token/session, flows through request context to queries, jobs,
   and logs. Any endpoint taking tenant_id as a parameter from the
   client is an IDOR generator (see authz-design).
4. **Scope everything tenant-shaped.** Object storage prefixes,
   cache keys, search indexes, queue messages (tenant in payload,
   re-asserted at consumption), rate limits, encryption keys where
   contracts demand it. Cross-tenant leaks love the secondary stores
   everyone forgets.
5. **Contain noisy neighbors with per-tenant budgets.** Rate limits and
   concurrency caps per tenant at the edge; fair-share scheduling in job
   queues (round-robin across tenants, not FIFO); statement timeouts so
   one tenant's pathological query cannot hold the pool. Track cost per
   tenant; the top one is always a surprise.
6. **Test isolation adversarially.** A standing test suite that
   authenticates as tenant A and attempts every endpoint against tenant
   B's IDs; run it in CI. One passing cross-tenant read is a sev-1, not
   a ticket.

## Boundaries

- Per-tenant schema or database migration fan-out needs orchestration
  (batching, canary tenants, stragglers report); do not adopt those
  models without building it.
- Tenant deletion and export are legal obligations (GDPR); shared-table
  models must prove complete deletion across all stores, which is a
  feature you build, not a script you improvise.
- In-process caches shared across requests are where tenant bleed hides;
  key them by tenant or scope them per request.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…