[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>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
b8ac793c8f
commit
3d0bec1f7f
@@ -0,0 +1,51 @@
|
||||
# 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**.
|
||||
Reference in New Issue
Block a user