Fundamentem izolacji jest FORCE ROW LEVEL SECURITY w PostgreSQL 16. Każda tabela zawierająca dane Dzierżawcy posiada kolumny tenant_id i (opcjonalnie) org_unit_id. Middleware Django ustawia zmienne sesji GUC przed każdym zapytaniem:
-- Middleware ustawia parę GUC przy każdym żądaniu:
SET LOCAL app.current_tenant_id = '<uuid>';
SET LOCAL app.current_org_unit_id = '<uuid>';
SET LOCAL ROLE app; -- rola bez uprawnień superuser
-- Przykładowa polityka RLS:
CREATE POLICY tenant_isolation ON audit_log
USING (tenant_id = current_setting('app.current_tenant_id')::uuid);
ALTER TABLE audit_log ENABLE ROW LEVEL SECURITY;
ALTER TABLE audit_log FORCE ROW LEVEL SECURITY;
Rola app ma uprawnienia INSERT/SELECT/UPDATE na tabelach biznesowych. Rola audit_writer ma wyłącznie INSERT na dzienniku audytu (append-only). Migracje wykonuje oddzielna rola superuser migrator — nigdy w trakcie obsługi żądania.
Każdy wpis dziennika audytu jest powiązany z poprzednim przez kryptograficzny łańcuch skrótów SHA-256:
# Obliczanie skrótu wiersza (Python):
import hashlib, json
def compute_row_hash(prev_hash: str, row_data: dict) -> str:
canonical = json.dumps(row_data, sort_keys=True, ensure_ascii=False)
payload = prev_hash + canonical
return hashlib.sha256(payload.encode()).hexdigest()
# Weryfikacja całego łańcucha:
# GET /api/audit/verify --> zwraca {valid: true, chain_length: N}
# lub wskazuje pierwszy uszkodzony wiersz
Rola audit_writer ma wyłącznie INSERT — brak UPDATE ani DELETE. FORCE ROW LEVEL SECURITY obowiązuje również na dzienniku. Przerwanie łańcucha (np. przywracanie po awarii) tworzy „kotwicę nieciągłości” z dokumentacją zdarzenia — jest to celowa funkcja, nie błąd.
Hasła są szyfrowane Argon2id z parametrami broniącymi przed atakami brute-force nawet przy użyciu GPU:
Nigdy nie przechowujemy hasła w postaci jawnej ani zaszyfrowanej odwracalnie. Skrót jest przechowywany w kolumnie z ograniczeniami RLS — niedostępny dla roli app przez SELECT.
MFA jest obowiązkowe dla wszystkich kont bez wyjątku. Dostępne metody:
Vault obsługuje envelope encryption per dzierżawca:
Cała komunikacja sieciowa odbywa się przez TLS 1.3 (wymuszane przez Cloudflare). VPS nie ma otwartych portów na zewnątrz — cały ruch HTTP/HTTPS trafia przez Cloudflare Tunnel (mTLS wewnętrznie). Nagłówki HSTS z preloadingiem.
| Kopia | Lokalizacja | Szyfrowanie | Częstotliwość |
|---|---|---|---|
| Podstawowa | Cloudflare R2 (EU) | AES-256-GCM; klucz w Vault | Codzienna |
| Drugorzędna | Backblaze B2 (Amsterdam, EU) | AES-256-GCM; klucz w Vault | Codzienna |
| Lokalny snapshot | VPS (inny wolumin) | LUKS2 | Godzinowa |
Testy przywracania są wykonywane automatycznie co 90 dni i rejestrowane w dzienniku audytu z kodem backup.restore_drill.complete.
Dostęp do infrastruktury produkcyjnej jest ograniczony do minimum niezbędnych osób. Każde połączenie z VPS odbywa się przez Cloudflare Access (SSO + MFA), a SSH przez Cloudflare Tunnel — nie przez otwarty port 22.
| Rola PostgreSQL | Uprawnienia | Używana przez |
|---|---|---|
app | SELECT, INSERT, UPDATE na tabelach biznesowych (z RLS) | Django runtime (każde żądanie HTTP) |
audit_writer | INSERT na audit_log (tylko) | Celery worker (zdarzenia asynchroniczne) |
audit_reader | SELECT na audit_log (z RLS) | Endpoint weryfikacji łańcucha |
migrator | Superuser (bez RLS) | Migracje Django — tylko w oknie deploy |
Platforma obsługuje federację tożsamości per Dzierżawca:
Konfiguracja IdP jest per Dzierżawca — jeden Dzierżawca nie może wpłynąć na konfigurację innego.
VPS jest hostowany w centrum danych OVHcloud (Warszawa, Polska) posiadającym certyfikat ISO/IEC 27001. Dane nie opuszczają UE i pozostają w Polsce. Operator nie posiada własnej infrastruktury fizycznej. Fizyczny dostęp do serwerów jest wyłączną kompetencją OVHcloud.
Architektura bezpieczeństwa platformy jest zaprojektowana tak, aby same środki techniczne spełniały wymagania art. 21 §2 NIS2 (szyfrowanie, MFA, kontrola dostępu, ciągłość działania, zarządzanie incydentami, bezpieczeństwo łańcucha dostaw). Szczegółowe mapowanie: Nota zgodności z NIS2/KSC.
Uczciwa lista ograniczeń (stan na 2026-05-15):
| Obszar | Status | Plan |
|---|---|---|
| Certyfikacja ISO 27001 platformy | Brak — architektura jest zgodna z wymaganiami | Ocena po 12 miesiącach produkcji |
| Niezależny audyt penetracyjny | Brak (planowany Q4 2026) | Wyniki zostaną opublikowane (streszczenie) |
| SOC 2 Type II | Brak — roadmap po skalowaniu | 2027+ |
| SIEM / SOC dla infrastruktury Dzierżawcy | Poza zakresem platformy | Integracja przez API (planowana) |
| Redundancja multi-region | Single-VPS; backup w 2 lokalizacjach | Drugi region UE przy większej skali |