Skip to content

Architettura

Panoramica

La NIS2 Platform è un monorepo contenente tre package, orchestrati da Docker Compose.

Utente (Browser)
  |
  v
Caddy (reverse proxy, auto-HTTPS)
  |
  +---> Next.js 15 (frontend, porta 8077)
  |
  +---> FastAPI (API, porta 8000)
          |
          +---> PostgreSQL (storage persistente)
          +---> Redis (cache, sessioni, broker Celery)
          +---> Celery Worker (esecuzione scansioni, generazione report)
          +---> Celery Beat (invio scansioni pianificate)
                  |
                  v
              Scanner (Python, aiohttp + asyncio)

Struttura del Monorepo

PercorsoTecnologiaScopo
packages/scannerPython (aiohttp, asyncio, dnspython, playwright)Scanner con i controlli di conformità NIS2
packages/apiFastAPI (Python)API REST, autenticazione, definizioni task Celery
packages/webNext.js 15, shadcn/uiDashboard frontend
infra/dockerDocker ComposeOrchestrazione per dev e prod, configurazione Caddy
scripts/PythonInserimento dati (seeding) del database, helper per migrazioni
docs/VitePressQuesta documentazione

Tech Stack

LivelloTecnologia
FrontendNext.js 15, React, shadcn/ui, Tailwind CSS
APIFastAPI, Pydantic, SQLAlchemy (async), Alembic
Code di TaskCelery, Celery Beat, Redis (broker + backend)
DatabasePostgreSQL
Cache/SessioniRedis
ScannerPython, aiohttp, asyncio, dnspython, playwright
Reverse ProxyCaddy (auto-HTTPS via Let's Encrypt)
AutenticazioneJWT (access + refresh token), NextAuth

Flusso dei Dati

Esecuzione della Scansione

  1. L'utente crea una scansione tramite la dashboard o l'API (POST /api/v1/scans).
  2. L'API convalida la richiesta, crea un record di scansione su PostgreSQL e invia un task Celery.
  3. Il worker Celery prende in carico il task e invoca lo scanner su ciascun asset di destinazione.
  4. Lo scanner esegue i controlli in parallelo utilizzando asyncio. Le richieste HTTP usano aiohttp. Le ricerche DNS utilizzano dnspython. L'analisi delle pagine legali sfrutta playwright per renderizzare la vista dal browser.
  5. I risultati passano attraverso il motore di conformità, che mappa i finding sui relativi articoli NIS2 e calcola la gravità.
  6. I risultati (finding) vengono salvati su PostgreSQL. Il campo compliance_matrix della scansione viene popolato.
  7. Lo stato della scansione si aggiorna in "completata".
  8. Il frontend interroga l'API e visualizza i risultati non appena sono pronti.

Scansioni Pianificate

  1. Un admin o auditor crea una pianificazione con un'espressione cron tramite la dashboard o l'API.
  2. Celery Beat valuta le espressioni cron e invia i task di scansione agli orari configurati.
  3. L'esecuzione segue lo stesso flusso delle scansioni manuali.

Generazione dei Report

  1. L'utente richiede un report tramite la dashboard o l'API (POST /api/v1/reports/generate).
  2. Un task Celery genera il report nel formato richiesto (PDF, JSON, CSV).
  3. Il risultato del task (che include il percorso del file) viene memorizzato su Redis come risultato del task Celery. Non esiste una tabella reports nel database.
  4. L'utente interroga lo stato tramite GET /api/v1/reports/status/{task_id} e scarica il file tramite GET /api/v1/reports/download/{task_id}.

Schema del Database (Tabelle)

TabellaDescrizione
usersAccount utente (email, password hashata, nome completo, flag attivo)
organizationsOrganizzazioni tenant (nome, slug)
membershipsAppartenenza utente-organizzazione con ruolo (admin, auditor, viewer)
assetsObiettivi di scansione (nome, tipo target, valore target, tag)
scansEsecuzioni di scansioni (stato, snapshot config, timestamp, matrice conformità, punteggi)
scan_resultsDati grezzi dei risultati di scansione per target per ogni scansione
findingsRisultati dei singoli controlli (gravità, articolo NIS2, categoria, stato, remediation)
scan_schedulesScansioni pianificate tramite cron (espressione cron, config, flag attivo)
api_keysChiavi API generate dagli utenti per accesso programmatico
notification_channelsConfigurazione dei canali di notifica per organizzazione
audit_logsRegistro di audit delle azioni degli utenti

Modello Multi-Tenant

L'isolamento dei dati è garantito a livello di organizzazione:

  • Ogni asset, scansione, finding e pianificazione appartiene a un'organizzazione.
  • Le query API vengono automaticamente delimitate (scoped) in base all'organizzazione attuale dell'utente.
  • Gli utenti possono appartenere a più organizzazioni con ruoli diversi.
  • Il controllo degli accessi basato sui ruoli (RBAC) restringe le azioni:
    • Admin: accesso completo, gestisce i membri e le impostazioni.
    • Auditor: esegue scansioni, visualizza tutti i dati, genera report, gestisce le pianificazioni.
    • Viewer: accesso in sola lettura.