K0NSULT // ai-truth/ipIII
k0nsult.cloud / ai-truth / ipIII / orchestrator / tenant-model

Multi-Tenant & Data Isolation — spec (ROADMAP)

Szkielet modelu wielodostępności ipIII: jak dane wielu banków, partnerów i urzędów miałyby być odseparowane na jednej instancji. Dziś ipIII działa w trybie single-org (LIVE MVP) — jedna organizacja, brak izolacji wielodostępnej. Pełny multi-tenant z Row-Level Security to ROADMAP P1: wymaga migracji schematu DB i ACK operatora. Zgodnie z doktryną claim ≤ proof — poniżej spec, nie deklaracja gotowej funkcji.

Stan faktyczny na 2026-07-05. ipIII przetwarza dziś dane jednej organizacji. Nie ma jeszcze rozdziału danych per klient, nie ma Row-Level Security w bazie, nie ma testów izolacji między tenantami. Ta strona jest specyfikacją projektową (szkielet) tego, co trzeba zbudować, aby bezpiecznie obsłużyć wielu klientów na wspólnej instancji. Każdy element opisany jako docelowy jest oznaczony ROADMAP. Wdrożenie wymaga migracji DB oraz ACK — nie nastąpi automatycznie.
Dziś: single-org MVP. Jutro: multi-tenant z RLS (po migracji + ACK).

Izolacja danych między klientami to warunek wejścia dla banku SIFI, partnera SaaS i urzędu. ipIII ma dziś działającą warstwę evidence (import → incydent → evidence-package → retest → close, z JWT/RBAC/audit na żywej PostgreSQL) — ale w jednym kontekście organizacyjnym. Model poniżej opisuje, jak dołożyć czterowarstwową hierarchię najmu i wymusić scoping w każdym zapytaniu, tak aby żaden tenant nie mógł zobaczyć danych innego.

OŚ DOJRZAŁOŚCI: single-org (dziś)kolumna tenant_id + scoping w queryPostgreSQL RLStesty izolacji + IDOR/BOLAaudit + lifecycle per tenant

Model hierarchii najmu

Czterowarstwowa struktura scopingu. Każdy rekord danych jest kotwiczony do tenant_id; niższe poziomy zawężają widoczność wewnątrz tenanta. Cała tabela = spec docelowa (ROADMAP).

PoziomEncjaRola w izolacjiPrzykładStatus
1 — Tenant tenant Najwyższa granica izolacji. Twarda separacja danych między klientami; brak jakiegokolwiek przecieku między tenantami. Klucz scopingu dla RLS. Bank A · Partner B · Urząd C ROADMAP P1
2 — Org org Jednostka organizacyjna wewnątrz tenanta (departament, spółka zależna). Zawęża widoczność, ale nie przekracza granicy tenanta. Bank A / Pion Cyber · Bank A / Compliance ROADMAP P1
3 — Project project Kontener pracy w ramach org (system, aplikacja, obszar audytu). Grupuje engagementy i evidence. Bankowość internetowa · Aplikacja mobilna ROADMAP P1
4 — Engagement engagement Pojedyncze zaangażowanie (pilot, PoC, cykl retestu) w granicach RoE. Najniższy scope, do którego wiążą się findings, incydenty i evidence-package. PoC purple-team Q3 · Retest po remediacji ROADMAP P1
Zasada scopingu. Docelowo każde zapytanie do danych niesie kontekst tenant_id (a niżej org_id / project_id / engagement_id). Scope pochodzi z tokenu sesji, nie z parametru żądania sterowanego przez klienta — to eliminuje klasę podatności, w której użytkownik podstawia cudzy identyfikator, żeby sięgnąć po nieswoje dane. Dziś (single-org) scopingu tenantowego nie ma, bo istnieje jeden kontekst.

PostgreSQL Row-Level Security (szkielet)

RLS to warstwa obrony w samej bazie: nawet gdy warstwa aplikacyjna pominie filtr, baza nie zwróci wierszy spoza aktywnego tenanta. Poniższy szkielet jest ilustracją docelowej polityki (ROADMAP), nie fragmentem wdrożonego kodu.

-- SPEC / ROADMAP (nie wdrożone) — szkic polityki RLS per tenant
ALTER TABLE evidence     ENABLE ROW LEVEL SECURITY;
ALTER TABLE incidents    ENABLE ROW LEVEL SECURITY;
ALTER TABLE findings     ENABLE ROW LEVEL SECURITY;

-- scope pochodzi z sesji (SET app.tenant_id = ... przy uwierzytelnieniu),
-- nie z parametru sterowanego przez klienta
CREATE POLICY tenant_isolation ON evidence
  USING (tenant_id = current_setting('app.tenant_id')::uuid);

CREATE POLICY tenant_isolation ON incidents
  USING (tenant_id = current_setting('app.tenant_id')::uuid);

-- FORCE RLS = polityka obowiązuje także właściciela tabeli
ALTER TABLE evidence  FORCE ROW LEVEL SECURITY;
ALTER TABLE incidents FORCE ROW LEVEL SECURITY;
Wymóg migracji. Włączenie RLS wymaga dodania kolumny tenant_id do istniejących tabel, backfillu danych, przepięcia ścieżki uwierzytelnienia na ustawianie app.tenant_id oraz zestawu testów regresji. To migracja schematu produkcyjnej bazy — nie zmiana kosmetyczna. Uruchamiana wyłącznie po ACK operatora i na planie z rollbackiem.

Testy izolacji — pozytywne i negatywne

Sama polityka nie wystarczy — trzeba udowodnić, że działa, także w scenariuszach nadużycia. Zestaw testów (spec) obejmuje przypadki pozytywne (tenant widzi swoje) i negatywne (tenant NIE widzi cudzego). Cały zestaw = ROADMAP.

Pozytywne

Tenant A odczytuje wyłącznie własne evidence/incydenty. Scope z sesji zwraca komplet swoich rekordów, żaden nie ginie.

ROADMAP

Negatywne — IDOR

Tenant A podstawia identyfikator rekordu należącego do Tenanta B (bezpośrednie odwołanie do obiektu). Oczekiwany wynik: brak dostępu (404/403), zero wierszy z RLS.

ROADMAP

Negatywne — BOLA

Autoryzowany użytkownik Tenanta A próbuje operacji na obiekcie poza swoim scope (broken object-level authorization). Oczekiwany wynik: odmowa na poziomie polityki, nie tylko UI.

ROADMAP

Cross-scope w dół

Użytkownik org/project próbuje sięgnąć do engagementu spoza swojego poddrzewa w tym samym tenancie. Oczekiwany wynik: zawężenie respektowane.

ROADMAP

Dlaczego testy negatywne są kluczowe. Izolacji nie dowodzi się pokazując, że własne dane są widoczne — dowodzi się pokazując, że cudze nie są, nawet gdy atakujący celowo manipuluje identyfikatorami. Testy IDOR/BOLA są wykonywane wyłącznie defensywnie, na danych syntetycznych, w granicach pisemnych Rules of Engagement — jako weryfikacja własnej izolacji, nie jako działanie wobec cudzych systemów.

Audit per tenant

Dziś audit-log jest wspólny (single-org). Docelowo (ROADMAP) każdy wpis audytu jest kotwiczony do tenant_id, a dostęp do logów jest scope'owany tak samo jak dane — administrator Tenanta A nie widzi zdarzeń Tenanta B.

Kotwica tenantowa

Każde zdarzenie (kto, co, kiedy, na jakim rekordzie) nosi tenant_id. Log jest niereużywalny między tenantami.

ROADMAP

Scoped odczyt

Widok audytu respektuje tę samą politykę RLS co dane. Brak globalnego „superwidoku" bez wyraźnej roli platformy i śladu.

ROADMAP

Append-only

Wpisy audytu tylko dopisywane, z chain-of-custody. Zachowanie integralności śladu (dziś: hash + chain w DB, LIVE MVP).

LIVE MVP / ROADMAP (per-tenant)

Data lifecycle — retencja / purge / eksport (DPA-aligned)

Cykl życia danych klienta zgodny z umową powierzenia (DPA) i zasadami RODO (minimalizacja, ograniczenie przechowywania, prawo do usunięcia/przenoszenia). Spec docelowa; realizacja per tenant = ROADMAP.

FazaCo obejmujeOdniesienieStatus
Retencja Okres przechowywania danych engagementu ustalany per tenant w DPA; po jego upływie dane kwalifikują się do usunięcia. Zasada ograniczenia przechowywania. RODO art. 5(1)(e); zapisy DPA ROADMAP P1
Purge Trwałe usunięcie danych tenanta na żądanie lub po terminie retencji, wraz z evidence i kopiami roboczymi; potwierdzenie usunięcia w audycie (scoped do tenanta). RODO art. 17 (prawo do usunięcia) ROADMAP P1
Eksport Przenoszalny pakiet danych tenanta (evidence-package, incydenty, audit) w formacie strukturalnym; do migracji, offboardingu lub realizacji prawa do przenoszenia. RODO art. 20 (przenoszalność) ROADMAP P1
DPA-aligned, nie porada prawna. Powyższe mapowanie na RODO/DPA to wsparcie decyzji (decision-support), nie porada prawna. Konkretne okresy retencji, zakres purge i format eksportu wymagają zapisania w umowie powierzenia przetwarzania i przeglądu przez radcę/kancelarię przed wdrożeniem.

Skrót stanu

1
Tryb dziś
single-org · LIVE MVP
4
Poziomy najmu (spec)
tenant · org · project · engagement
4
Klasy testów izolacji
pozytywne · IDOR · BOLA · cross-scope
P1
Priorytet multi-tenant
wymaga migracji DB + ACK

Czego ta strona NIE deklaruje

To nie jest ogłoszenie gotowej wielodostępności. Multi-tenant, RLS, testy izolacji, audit i lifecycle per tenant są tu opisane jako szkielet do zbudowania (ROADMAP P1), a nie funkcja dostępna dziś. To, co realnie działa (import parserów, evidence-package, close-with-evidence, JWT+RBAC+audit w jednym kontekście), jest oznaczone LIVE MVP i ma dowody na roadmapie dev.
„100%" u nas znaczy pokrycie dowodowe, nie nieprzenikalność. Skoro nie mamy dziś dowodu (kod+test+endpoint) na izolację wielodostępną, mówimy o niej jako ROADMAP, a nie jako o funkcji. Pełny rejestr granic dojrzałości: /known-limitations; przetwarzanie danych: /data-processing; gotowość enterprise: /enterprise-readiness.
Granica etyczna i prawna. ipIII jest narzędziem obrony i zgodności (GRC/blue). Testy izolacji (IDOR/BOLA) prowadzone są wyłącznie defensywnie, na danych syntetycznych i w granicach pisemnych Rules of Engagement — jako weryfikacja własnej separacji, nie działanie wobec cudzych systemów. Mapowania obowiązków (RODO/DPA) to wsparcie decyzji, nie porada prawna.

Powiązane: rejestr granic dojrzałości → /known-limitations · przetwarzanie danych → /data-processing · gotowość enterprise → /enterprise-readiness.