Skip to content

Guida Rapida ​

Prerequisiti ​

  • Docker Engine 24+ e Docker Compose v2
  • Git
  • Sistema operativo Linux o macOS. Windows è supportato tramite WSL2.

Per la produzione:

  • Un server con le porte 80 e 443 aperte
  • Un nome di dominio con un record A che punta all'indirizzo IP del server

Avvio in sviluppo ​

1. Clona il repository ​

bash
git clone https://github.com/fabriziosalmi/nis2-public.git
cd nis2-public

2. Crea il file di configurazione ​

bash
cp .env.example .env

Apri .env e imposta almeno questi due valori:

bash
JWT_SECRET=$(openssl rand -base64 32)
DATA_ENCRYPTION_KEY=$(openssl rand -base64 32)

Sostituisci i valori segnaposto nel file con l'output di questi comandi. Tutti gli altri valori predefiniti funzionano per lo sviluppo locale. Consulta la pagina Configurazione per il riferimento completo alle variabili.

3. Avvia la piattaforma ​

bash
make dev

Questo comando compila e avvia tutti i servizi: PostgreSQL, Redis, il backend FastAPI, un Celery worker, Celery Beat (schedulatore) e il frontend Next.js. Al primo avvio, Docker scarica le immagini base e costruisce i layer locali — prevedi qualche minuto.

4. Apri la dashboard ​

ServizioURL
Dashboard frontendhttp://localhost:8077
API (Swagger UI)http://localhost:8000/docs
API (ReDoc)http://localhost:8000/redoc

Primi passi ​

Registrazione ​

Apri http://localhost:8077 e clicca su Registrati. Inserisci nome, indirizzo email, password e nome dell'organizzazione. La registrazione crea l'organizzazione, assegna il ruolo admin e completa l'accesso automaticamente.

Non esiste un account amministratore preconfigurato — il primo utente registrato per un'organizzazione ne diventa automaticamente l'amministratore.

Aggiungere un asset ​

Vai ad Asset nella barra laterale e clicca su Aggiungi Asset. Compila:

  • Nome: un'etichetta leggibile (es. Sito principale)
  • Tipo di target: domain, ip, o cidr
  • Valore del target: il dominio o indirizzo effettivo (es. esempio.it, 192.168.1.0/24)

Gli asset sono i target delle scansioni. Aggiungi tutti i domini e gli intervalli IP nel perimetro NIS2 dell'organizzazione.

Dimostra di poterlo scansionare ​

Un asset nuovo nasce unverified e POST /scans rifiuta un target non verificato con un 403. Il blocco è voluto: senza, qualunque account potrebbe puntare lo scanner — scansione delle porte, tentativi di zone transfer, richieste a /.env — verso infrastrutture con cui non ha alcun rapporto, e a risponderne sarebbe chi gestisce l'istanza.

Apri l'asset e scegli il percorso adatto al target:

  • Dominio — emetti una sfida DNS TXT, pubblica il record indicato sotto _nis2-challenge.<dominio> e premi verifica. È una prova, lo stesso meccanismo del DNS-01 di Let's Encrypt.
  • Indirizzo IP o intervallo CIDR — non hanno un DNS con cui provare nulla, quindi un amministratore registra al loro posto una dichiarazione di autorità nominativa e datata, conservata nell'audit log e attribuita a chi l'ha fatta.

Gli asset creati prima dell'introduzione della verifica hanno stato legacy e continuano a funzionare.

Eseguire una scansione ​

Vai a Scansioni e clicca su Nuova Scansione. Seleziona uno o più asset e clicca su Avvia Scansione. La scansione viene messa in coda come task Celery ed eseguita in modo asincrono. Lo stato si aggiorna automaticamente: pending → running → completed.

Analizzare i finding ​

Apri Finding a scansione completata. Ogni finding è mappato a un sotto-paragrafo dell'Art. 21 NIS2, ha una gravità (critical / high / medium / low / info) e include una descrizione e indicazioni di remediation. Aggiorna lo stato del finding (acknowledged, in_progress, resolved, accepted_risk) per tracciare l'avanzamento della remediation.


Struttura del progetto ​

nis2-public/
  packages/
    scanner/    Scanner Python — aiohttp, asyncio, dnspython, playwright
    api/        Backend FastAPI — REST API, definizioni task Celery, migrazioni Alembic
    web/        Frontend Next.js 15 — shadcn/ui, Tailwind CSS
  infra/
    docker/     docker-compose.dev.yml, docker-compose.prod.yml, Caddyfile
  scripts/      Helper per seed e migrazioni database
  docs/         Sorgenti documentazione VitePress

Comandi Make ​

ComandoDescrizione
make devCompila e avvia tutti i servizi in modalità sviluppo
make dev-downFerma i servizi di sviluppo
make dev-logsMostra i log in streaming di tutti i servizi
make api-logsMostra i log solo del servizio API
make web-logsMostra i log solo del frontend
make db-migrate msg="descrizione"Genera una nuova migrazione Alembic
make db-upgradeApplica le migrazioni in sospeso
make db-seedPopola il database con dati di esempio
make testEsegue la suite di test completa (scanner + API)
make test-scannerEsegue solo i test dello scanner
make test-apiEsegue solo i test dell'API
make prodAvvia lo stack di produzione (Caddy con HTTPS automatico)
make prod-downFerma lo stack di produzione
make cleanRimuove container, volumi e cache di build

Risoluzione dei problemi comuni ​

Conflitto sulla porta 5432 (PostgreSQL) Se è in esecuzione un'istanza locale di PostgreSQL, fermala prima di avviare lo stack, oppure modifica la mappatura della porta nell'host in infra/docker/docker-compose.dev.yml.

make dev fallisce al primo avvio con errore database L'API si avvia prima che PostgreSQL sia pronto. Docker Compose gestisce questo tramite health check, ma su macchine lente potrebbe essere necessario attendere e rieseguire make dev, oppure monitorare i log con make dev-logs finché postgres non mostra database system is ready to accept connections.

Modifiche a .env non applicate Riavvia il servizio interessato:

bash
docker compose -f infra/docker/docker-compose.dev.yml restart api worker

Consulta Distribuzione per la configurazione in produzione e Configurazione per tutte le variabili d'ambiente.