Container Registry and Software Supply Chain Platform  ·  View 32 of 33  ·  6 · Assurance

Tenant Isolation

Four layers that stop one tenant learning about another, and the one place content addressing leaks.

Editable source SVG draw.io All views
Layer 1 — namespace and quota Harbor projects Project per Tenant Quota: count and bytes Retention per Class Layer 2 — identity One identity per principal Robot per Repository push ≤ 60 min SPIFFE ID per Builder Pull Identity per Namespace pull only Layer 3 — data Scoped server side Tenant Filter in Evidence API Index Partition per Tenant Findings Scoped to Project Layer 4 — discovery Enumeration control Catalog API Filtered Referrers Scoped Digest Enumeration Blocked disclosure risk Cross-Tenant Layer Dedup existence oracle Dedup Scoped by Tenant Class storage cost accepted defeats layer 4 mitigates Tenant Isolation — Four Layers and One Leak Interface / broker Application we own Security / platform Data store Risk / gap failure / alternate synchronous Content-addressed storage deduplicates across tenants by design; where that leaks existence, dedup is scoped and the extra bytes are paid. v 1.0 · owner Security Architecture · date 2026-09

The four layers

  • Namespace and quota: a Harbor project per tenant with limits on artifact count and total bytes
  • Identity: a robot account per repository, a SPIFFE ID per builder, pull-only identities per namespace
  • Data: tenant filtering enforced server-side in the evidence API, with index partitions per tenant
  • Discovery: catalog and referrers responses are filtered; digest enumeration is treated as the disclosure risk it is

The leak

  • Content-addressed storage deduplicates layers across tenants, which makes a shared layer digest an existence oracle
  • A tenant that can time a push can learn whether another tenant already holds that exact layer
  • Mitigation: deduplication is scoped by tenant class, and the extra storage is paid deliberately

Assumption

  • Tenant classes are coarse — internal, regulated, third-party — rather than per-team, to keep the storage cost bounded
  • This should be confirmed against the actual tenancy model before build