Ga naar inhoud

Auditor Workbench + MSP Cockpit

Auditor Workbench (/auditor)

POST /api/v1/auditor/bundle met body {period_start, period_end}. Owner / admin / auditor only. TOTP-gated in productie (purpose auditor_bundle); in dev geen TOTP.

Bundle-inhoud (ZIP):

manifest.json bundle metadata + pack list + key list
verify.py offline Ed25519-verifier (pynacl-based)
signing_keys.json public keys + rotation reasons in periode
compliance_summary.md markdown audit-rapport
evidence_packs/<id>.tar.gz elke pack uit de periode (alleen uit
allowlisted opslag-paden)

Path-traversal guard: evidence_packs.storage_uri MOET starten met één van:

  • /var/lib/monsys/ai-evidence-packs/
  • /var/lib/monsys/copilot-evidence-packs/
  • /var/lib/monsys/openai-evidence-packs/

Anders wordt de pack uit de bundle weggelaten (in manifest.json blijft een archive_path:"" rij staan voor traceability).

Download URL is one-shot, 24h expiry. De atomic claim zit in de UPDATE:

UPDATE auditor_bundle_tokens
SET downloaded_at = NOW(), downloaded_by = $3
WHERE token = $1 AND tenant_id = $2
AND downloaded_at IS NULL AND expires_at > NOW()
RETURNING file_path

Postgres MVCC + row-lock garandeert dat twee concurrent requests niet beide RETURNING krijgen.

Offline verify

Elke ontvanger draait python3 verify.py (pynacl) inside de uitgepakte bundle. Geen netwerk, geen monsys-credentials nodig — verifies elke pack’s signature tegen de bundled signing_keys.json. Output:

pack 1234: OK
pack 1235: BAD SIGNATURE
=== 12 OK, 1 BAD ===

Exit code 0 = alles OK, 1 = minstens één pack faalt.

MSP Cockpit (/msp/cockpit)

GET /api/v1/msp/overview. Strikt afgeschermd: role = msp_operator OF is_superadmin = true. Een normale owner/admin user krijgt 403 — deze endpoint walkt élke tenant in het platform.

Per tenant:

  • naam + plan
  • huidige Trust Score + Δ7d
  • open critical+warning alerts

  • failing compliance evidence rijen

  • last login activity

Default sortering = urgency-composite:

urgency = open_alerts*5 + failing_controls
+ (-Δ7d if Δ7d < 0)
+ 0.5 * (60 - score) if score < 60

Sorteer per kolom kan via dashboard (urgency / naam / score).

Nieuwe rollen

Migration 064 breidt users.role CHECK uit met:

RoleToegang
auditorread-only + bundle generate/download (TOTP-prod gated)
msp_operatorcross-tenant via /api/v1/msp/overview

Bestaande rollen (analyst, admin, owner) ongewijzigd.