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>
52 lines
2.5 KiB
Markdown
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**.
|