Vulnerability Management

The MSSP Multi-Tenant Model vs Single-Tenant Tools

By PMAP Security Team 17 min read

If you run vulnerability management for more than one organization, you have already met the core problem. A managed security service provider serves dozens of unrelated clients. A holding group runs many subsidiaries under one security mandate. In both shapes, the question is the same. Do you stand up a separate tool for every client and keep them apart by hand, or do you run every client inside one platform that keeps them apart by design?

This article compares the two models honestly. Single-tenant tools are not wrong. They are simple, predictable, and easy to reason about when you serve exactly one organization. They start to hurt the moment you serve many. The multi-tenant model trades a little upfront architecture for isolation that holds at the database query level, scoped access per client, and one console that resolves ownership across an entire tenant tree.

This is a decision-framing piece, not a deep architecture tour. For the full category view, read the pillar on multi-tenant vulnerability management. Here we focus on the provider’s choice and what each model costs you in practice.

Two Ways to Serve Many Clients

A service provider has two structural options.

The first is the single-tenant stack per client. You give each client its own scanner console, its own tracking tool, its own credentials, its own reporting setup. Isolation is real because the systems are physically separate. Nothing in client A’s instance can ever read client B’s data, because there is no shared instance. The cost lands on operations. Every new client is a new deployment to provision, patch, back up, and monitor. Every cross-client question, like “how many critical findings are open across my whole book of business,” becomes a manual roll-up across many systems.

The second is the multi-tenant platform. One platform holds every client as a tenant. PMAP models this directly. Every tenant, whether a holding group or a subsidiary, is a row in the company table, and almost every other part of the platform treats company_id as its tenant key. A company with no parent is a holding company. A company with a parent_id is a subsidiary under that holding. This single graph lets one provider operate many clients, and it lets one holding group operate many subsidiaries, with the same model underneath.

The honest tradeoff is this. Single-tenant gives you isolation by separation and pays for it in duplicated operations. Multi-tenant gives you isolation by enforcement and pays for it in getting that enforcement right once. PMAP’s position is that the enforcement is worth getting right, because it scales while the duplicated-stack model does not.

Where Single-Tenant Tools Are Fine

It would be dishonest to claim single-tenant tools have no place. They do.

If you serve one client, a single-tenant tool is the simplest correct answer. There is no second tenant to leak into, so isolation by separation costs you nothing and you avoid all multi-tenant complexity.

If you run a short engagement, a single penetration test or a one-off assessment with a defined end date, spinning up a dedicated instance can be faster than onboarding a client into a shared platform. The engagement ends, the instance is torn down, and there is nothing to maintain.

If a client has a hard contractual requirement for physically separate infrastructure, separation is the requirement, not a design preference. Some regulated environments mandate it. In those cases the question is settled before it starts.

The pattern across all three is low tenant count and low longevity. When you serve few clients, briefly, the operational overhead of duplicated stacks stays small enough to absorb. The trouble begins when the client count climbs and the engagements become ongoing relationships rather than one-time projects.

Where Single-Tenant Tools Break for a Provider

The single-tenant model degrades along three predictable lines as you grow.

Operational multiplication. Every client is a full deployment. Ten clients is ten consoles to patch, ten credential sets to rotate, ten backup jobs to verify, ten upgrade windows to schedule. The work scales linearly with client count and most of it is undifferentiated toil. None of it makes any individual client more secure. It just keeps the lights on.

Manual isolation. When tools are separate, isolation depends on humans never making a mistake. An analyst working five clients in five browser tabs is one mispaste away from putting client A’s data into client B’s report. Separation protects the data at rest. It does nothing to protect against the operator who confuses two open windows. The bigger your team and your client list, the more surface there is for that error.

No cross-client view. A provider needs portfolio-level answers. Which clients have the worst open-critical backlog this month? Where is mean time to remediate slipping? With a stack per client, every one of these questions is a manual export-and-merge exercise. The data exists, but it lives in silos, and assembling it is slow enough that most teams simply stop asking.

These are not edge cases. They are the normal trajectory of a provider that succeeds and grows. The single-tenant model works until it quietly becomes the bottleneck.

The Multi-Tenant Comparison

The rest of this article walks the dimensions where the two models genuinely diverge. For each one, the multi-tenant claim is tied to a specific platform behavior rather than a slogan.

Dimension Single-tenant stack per client PMAP multi-tenant model
Tenant structure Independent instances, no shared model Holding and subsidiary graph via parent_id
Isolation mechanism Physical separation, manual discipline ScopeFilter on every query, default-deny
Access control Per-instance accounts, no cross-client roles Per-client RBAC grants with global / company / project scope
Ownership routing Manual per client 6-branch owner resolution per tenant
Scan intake Separate per instance Multi-tenant import routed by company_id
Reporting Manual roll-up across silos Per-client branding, portfolio views in one console
Cross-client leak risk Human-error dependent Cross-tenant IDs rejected at the query layer

Tenant Hierarchy: Holding and Subsidiaries

The foundation of the multi-tenant model is a tenant graph that the platform understands natively. In PMAP every tenant is a company record. A company can carry an optional parent_id that points at its holding company. A company with parent_id = NULL is a holding company, a root tenant. A company with a non-null parent_id is a subsidiary of that holding.

This is exactly the shape an MSSP needs and the shape a holding group needs. An MSSP can represent each client as a top-level company, and if a client itself has subsidiaries, those nest underneath. A holding group represents itself as the root and each operating company as a subsidiary below it. The GetSubsidiaries operation lists the direct children of any holding, so an operator can navigate the tree from a parent down to its companies without stitching anything together by hand.

The model has guardrails. A company cannot be its own parent. The service blocks any update that sets a company’s parent_id to its own ID. Subsidiary resolution checks that the parent actually exists before it queries for children, so a dangling reference returns a clear not-found rather than silent garbage. The parent name is resolved in the same query that returns the company, so the interface can show “subsidiary of X” without a second round-trip. None of this is dramatic. It is the quiet correctness that keeps a tenant tree trustworthy as it grows.

Isolation by Default: The Scope Filter Invariant

Tenant hierarchy describes the shape. The scope filter is what makes the shape safe.

PMAP’s authorization layer builds a ScopeFilter for every authenticated request. Its AllowedCompanyIDs set contains exactly the company UUIDs that the requesting user belongs to. Every other domain’s data access applies this filter as a WHERE company_id = ANY(...) predicate. The company row is therefore the effective tenant boundary across the entire platform, not a label that some screens happen to respect and others forget.

Two properties make this the right kind of isolation for a provider.

It is default-deny. A scope filter that is not unrestricted and carries an empty allowed set returns nothing. The absence of a grant is not treated as broad access that some later check might narrow. It is treated as no access at all. You have to be explicitly let in.

It rejects cross-tenant access at the query layer. A user who tries to address a company ID outside their allowed set does not get a filtered-but-partial result. The request is rejected. Isolation does not depend on the front end hiding a button or an analyst remembering which tab is which. It is enforced where the data is read, which is the only place enforcement actually counts.

The contrast with manual isolation is the whole argument. In a stack of separate tools, isolation is a property of the deployment topology and the operator’s attention. In PMAP, isolation is an invariant of every query. That is the difference between hoping a leak never happens and structuring the system so the leak path does not exist. The principle aligns with zero trust architecture as described by NIST, where access is verified per request rather than assumed from network position.

Per-Client RBAC and Scoped Grants

Isolation says which data a user can touch. RBAC says what they can do with it. A provider needs both, and needs them sliced per client.

PMAP expresses permissions as a matrix of entity type against action. There are ten entity types, including company, asset, project, finding, report, scan, and user, and six actions: view, create, update, delete, approve, and export. Any pairing can be assigned to a custom role, which gives sixty possible permission cells. A role is not a fixed tier. It is a precise statement of what its holders may do.

Roles are granted to users at a scope. The scope can be global, company, or project. This is the lever a provider uses to map access onto its client structure. A senior consultant who looks after one client gets a company-scoped grant on that client. They see that client and its projects, and nothing else. A specialist brought in for a single engagement gets a project-scoped grant, which is even tighter. A platform administrator who genuinely needs the whole book gets a global grant, and even that is a deliberate assignment rather than a default.

Grants can be time-bound. A grant can carry an expiry, and the platform stops honoring it the moment that expiry passes. For a provider this matters constantly. A contractor on a fixed engagement, an auditor with a defined review window, a temporary escalation during an incident, all of these are access that should end on a date rather than linger until someone remembers to revoke it. The expiry makes ending access the default rather than a cleanup chore. This time-bound, least-privilege posture matches the access control discipline expected by frameworks like ISO/IEC 27001:2022 and the role-based model formalized in the NIST RBAC standard.

The mechanics of the permission matrix and scope resolution are covered in their own depth in the cluster on the permission model. Here the point is the shape it gives a provider. Access is per client, per project, and per duration, expressed once and enforced everywhere.

Owner Resolution Across Tenants

Knowing who can see a client is one job. Knowing who owns a given asset inside that client is another, and at scale it cannot be manual.

PMAP resolves asset ownership through a six-branch priority chain. For any asset, it walks the branches in order and returns on the first match:

  1. Explicit ownership. The asset has an owner recorded directly, through the owner junction or legacy owner columns.
  2. Group default. An asset group the asset belongs to carries a default owner team.
  3. IP scope or CIDR. The asset has an address that falls inside a location’s CIDR scope, and the most specific matching prefix wins.
  4. Tag-based rule. A tag maps to a team. This branch is reserved in the model and not yet active.
  5. Company default. The asset’s company has a default owner team set.
  6. Fallback queue. Nothing above matched, so a per-company SecOps default queue catches the asset. This team is auto-created idempotently so no asset is ever ownerless.

For a provider, the value is that ownership resolves correctly without an operator hand-routing every asset for every client. A subsidiary can have its own IP-scope rules and its own default team. The fallback guarantees that even a brand-new, untagged, unscoped asset still lands in a real queue rather than vanishing into the gap between rules.

Teams themselves carry an enterprise scope mode that decides which companies a team can own assets across. The company mode keeps a team to its own company. The multi_company mode lets a team span an explicit list of subsidiaries. The all_subsidiaries mode lets a team operate across a holding’s entire recursive child tree. A holding-level SOC team can be set to cover every subsidiary at once, while a subsidiary-local team stays confined to its own company. The same resolution chain serves both shapes without special cases. The internal mechanics of these scope modes and the resolution chain are detailed in the dedicated cluster on tenant hierarchy and owner resolution.

Routing a Scan to the Right Client

Owner resolution decides who fixes a finding. Before that, the platform has to file each finding under the right client in the first place. For a provider importing scan data from many clients, getting this wrong is its own kind of leak.

PMAP routes scan intake by tenant. Imported scan data is associated with a company_id, so findings land under the correct client tenant rather than in a shared undifferentiated pool. A scan run can carry a company and project association on import, which keeps the multi-client intake organized at the point of entry instead of relying on a sorting pass afterward.

The practical effect is that a provider can pull scan output from many client environments into one platform and trust that each client’s findings stay under that client. The tenant key travels with the data from intake through to ownership and reporting. Nothing has to be re-segmented by hand once it is inside.

Branding and Reporting Per Client

A provider’s clients do not want to see the provider’s other clients, and they often do not want to see a generic console either. They want their own findings, on their own terms, with their own identity on the page.

PMAP supports per-company logo branding. Each company can carry its own uploaded logo, stored as a tenant-specific asset. That logo can front the client’s view and the reports they receive, so the same platform presents itself as each client’s own surface rather than a shared back office. For an MSSP this is the difference between a tool that feels like infrastructure and a service that feels like the client’s own program.

On the operator’s side, because every client is a tenant in one platform, the portfolio view comes for free relative to the single-tenant model. The provider can ask cross-client questions and get answers from one place, while the scope filter still keeps each client’s underlying data sealed from the others. One console for the operator, a branded private surface for each client, both backed by the same isolation invariant.

The Cross-Tenant Leak Risk You Cannot Afford

For a provider, the worst possible failure is showing one client another client’s data. It is a breach of contract, a breach of trust, and in many cases a breach of regulation. This single risk is the strongest reason to prefer enforced isolation over manual isolation.

PMAP closes the obvious leak paths structurally. A project-scoped grant does not implicitly open the owning company. A consultant assigned to one project sees that project and only that project, not the sibling projects at the same company. This is deliberate. If a project grant quietly widened to the whole company, a consultant brought in for one engagement could read every other engagement at that client. The narrow grant stays narrow.

The cross-tenant boundary holds at the data layer too. A request that addresses a company ID outside the user’s allowed set is rejected, not silently filtered into a partial answer. And the team domain refuses to link an asset to a team that belongs to a different company. A cross-tenant ownership link is rejected outright rather than created and hoped to be harmless.

The common thread is that the leak paths are closed where the system reads and writes data, not where it draws the screen. A user interface can hide things. Only the data layer can refuse them. Refusing them is what makes the multi-tenant model trustworthy for a provider in a way that manual discipline across separate tools cannot match.

What Multi-Tenancy Does Not Solve On Its Own

Multi-tenancy is an architecture, not a guarantee of good operations. It is worth being clear about its limits.

The platform enforces isolation. It does not write your grants for you. If an administrator gives a user a global-scoped role when a company-scoped one would do, the architecture faithfully honors the broad grant. Least privilege is a discipline the operator has to practice. The platform makes the narrow grant easy and the boundary enforceable. It does not decide on your behalf how wide each grant should be.

Multi-tenancy also does not replace the rest of the program. You still triage, still set remediation priorities, still hold the conversations with each client about their risk. The model removes the duplicated-stack overhead and the manual-isolation risk. It does not remove the security work itself.

And multi-tenancy does not override a genuine contractual mandate for physically separate infrastructure. Where separation is the explicit requirement, that requirement stands. The honest scope of the multi-tenant claim is that it serves the large and growing space of providers who need strong isolation and one operational surface, not the narrow case where separation is contractually fixed.

Stated plainly, isolation is given by the architecture. Discipline is supplied by the operator. The platform’s job is to make the disciplined choice the easy one and the boundary an invariant rather than a hope.

How PMAP Runs Every Client From One Console

Pulling the threads together, here is what the multi-tenant model gives a provider in PMAP.

Every client is a tenant in one platform, structured as a holding-and-subsidiary graph through parent_id, with subsidiary navigation and self-parent guards built in. Isolation is enforced by a scope filter on every query, default-deny, with cross-tenant IDs rejected at the data layer rather than hidden by the interface. Access is sliced per client through RBAC grants scoped to global, company, or project, with optional expiry so temporary access ends on schedule. Ownership resolves automatically through a six-branch chain per tenant, with team scope modes that let one team cover a holding’s whole subtree or stay confined to one company. Scan intake routes by company_id so each client’s findings land under that client. Reporting carries per-client branding while the operator keeps a single portfolio console.

The contrast with the single-tenant stack is not that single-tenant is wrong. It is that the single-tenant model pays for isolation with duplicated operations and manual discipline, and that bill grows with every client you add. The multi-tenant model pays for isolation once, in architecture, and then scales.

If you are weighing the two, the deeper category treatment lives in the pillar on multi-tenant vulnerability management, and the provider-specific operating model is covered in the ebook Multi-Tenant VM for MSSPs. For the identity and isolation mechanics in datasheet form, see the identity, RBAC, and multi-tenancy reference.

Stop duplicating tool stacks per client. Read the identity and multi-tenancy datasheet and run every client from one console.

author avatar
PMAP Security Team

Newsletter

Get the next writeup in your inbox

One short email when a new case writeup or detection deep dive ships. No marketing drip, no third-party tracking.