Files
nis2-agile/scripts/README_discovery_agent.md
T
DevEnv nis2-agileandClaude Opus 4.8 3d0bec1f7f [FEAT] Discovery agent di riferimento (scan rete → auto-popola NIS2) — Fase 3
scripts/discovery-agent.mjs (Node 18+, zero dipendenze): scansiona CIDR/IP via
TCP-connect (no root), reverse-DNS, deduce tipo asset + criticità dalle porte aperte,
costruisce asset (external_ref=net:<ip>) + flussi di rete e li POSTa a
/api/services/assets-ingest col X-API-Key del connettore. Concorrenza, MAX_HOSTS,
DRY_RUN, isPrivate (RFC1918+loopback+link-local). + README_discovery_agent.md (uso,
variabili, cron, multi-connettore, estensione cloud, sicurezza).
Validato: node --check + DRY_RUN reale (listener temporaneo) → rileva porta aperta,
costruisce asset+flusso corretti.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 11:45:13 +02:00

52 lines
2.5 KiB
Markdown

# Agente di Discovery NIS2 (`discovery-agent.mjs`)
Mappa automaticamente la rete del cliente e **auto-popola** l'Inventario NIS2
(asset + scoring rilevanza NIS2 + Mappa Dipendenze + flussi di rete ID.AM-03).
Node 18+, **nessuna dipendenza** (usa `fetch`/`net`/`dns` nativi).
## Come funziona
1. In NIS2 (utente org_admin): **Connettori Discovery → Nuovo connettore** → copia l'**API key** (mostrata una sola volta).
2. Esegui l'agente **dentro la rete da mappare** (un host qualunque del cliente):
```bash
NIS2_API_KEY=nis2_xxxxxxxx TARGETS=192.168.1.0/24 node discovery-agent.mjs
```
3. L'agente scansiona i target (TCP-connect, no root), deduce host/porte/tipo asset e li
invia a `POST /api/services/assets-ingest`. NIS2 fa dedup (per IP), scoring e tracciamento
del run (visibile nel dettaglio del connettore).
## Variabili
| Var | Default | Note |
|---|---|---|
| `NIS2_API_KEY` | — (obbligatoria) | chiave del connettore |
| `NIS2_API_URL` | `https://nis2.agile.software` | |
| `TARGETS` | — (obbligatoria) | CIDR/IP separati da virgola: `192.168.1.0/24,10.0.0.5` |
| `PORTS` | `22,80,443,445,3306,3389,5432,8080,8443` | porte TCP da sondare |
| `SOURCE` | `network` | etichetta provenienza (`network`/`aws`/…) |
| `TIMEOUT_MS` | `400` | timeout per porta |
| `MAX_HOSTS` | `1024` | tetto host per esecuzione |
| `CONCURRENCY` | `64` | socket paralleli |
| `DRY_RUN` | — | `1` = non invia, stampa solo l'anteprima JSON |
## Esempi
```bash
# Anteprima senza inviare
DRY_RUN=1 TARGETS=10.0.0.0/28 node discovery-agent.mjs
# Scansione + invio, porte e timeout custom
NIS2_API_KEY=nis2_xxx TARGETS=192.168.10.0/24 PORTS=22,80,443 TIMEOUT_MS=600 node discovery-agent.mjs
# Pianificato (cron, ogni notte)
0 2 * * * NIS2_API_KEY=nis2_xxx TARGETS=192.168.0.0/23 node /opt/nis2/discovery-agent.mjs >> /var/log/nis2-discovery.log 2>&1
```
## Più connettori per azienda
Crea un connettore per ciascuna sorgente (es. *Rete sede Roma*, *Rete sede Modena*, *AWS prod*):
ognuno ha la sua API key e il suo storico run. L'agente di rete copre i CIDR; per il cloud
(`aws`/`azure`/`gcp`) si estende lo stesso schema elencando le istanze via SDK del provider e
inviandole con lo stesso formato `assets-ingest` (`source: "aws"`, `external_ref: "aws:i-..."`).
## Sicurezza
- L'API key ha **solo** scope `ingest:assets` (può solo aggiungere asset/flussi alla **sua** org).
- Esegui l'agente da un host fidato; ruota la chiave dal connettore se compromessa (**Rigenera chiave**).
- Scansiona **solo reti di tua proprietà / autorizzate**.