Più connettori per azienda; ogni connettore ha una api_key dedicata (scope ingest:assets)
che l'agente esterno usa per mappare e auto-popolare NIS2.
- mig 064: discovery_connectors (per-org, multi) + discovery_runs (storico) + network_flows (ID.AM-03).
- DiscoveryConnectorController (org_admin): CRUD connettori + emissione/rotazione api_key
(mostrata 1 volta) + dettaglio con ultimi run.
- ServicesController::ingestAssets esteso: accetta anche "flows" (upsert network_flows,
dedup external_ref) e, se la chiave appartiene a un connettore, registra discovery_run
+ aggiorna last_run del connettore. Auto-scoring rilevanza NIS2 già in bulkUpsert.
- AssetController::bulkUpsert: ora salva anche "dependencies" → popola la Mappa Dipendenze.
- Router: /api/discovery-connectors (list/create/{id}/update/delete/rotateKey).
Smoke E2E (HTTP 201): 2 asset scorati + 1 flusso + run tracciato + dipendenze persistite.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
58 lines
3.4 KiB
SQL
58 lines
3.4 KiB
SQL
-- 064_discovery_connectors.sql — Connettori di discovery (mappatura rete/cloud) per-org.
|
|
-- Più connettori per organizzazione; l'agente esterno autentica con una api_key dedicata
|
|
-- (scope ingest:assets) e auto-popola Inventario + dipendenze + flussi di rete (ID.AM-03).
|
|
-- Apply idempotente: application/cli/migrate_064_discovery_connectors.php
|
|
-- Additiva, non distruttiva.
|
|
|
|
CREATE TABLE IF NOT EXISTS discovery_connectors (
|
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
organization_id INT NOT NULL,
|
|
name VARCHAR(120) NOT NULL, -- es. "Rete sede Modena", "AWS prod"
|
|
connector_type ENUM('network','aws','azure','gcp','cmdb','agent','custom') NOT NULL DEFAULT 'network',
|
|
config JSON NULL, -- CIDR target, account/region cloud, opzioni
|
|
api_key_id INT UNSIGNED NULL, -- chiave usata dall'agente (api_keys.id)
|
|
status ENUM('active','paused','error') NOT NULL DEFAULT 'active',
|
|
schedule ENUM('manual','hourly','daily','weekly') NOT NULL DEFAULT 'manual',
|
|
last_run_at TIMESTAMP NULL,
|
|
last_status VARCHAR(20) NULL, -- ok|error|running
|
|
last_discovered INT NULL, -- n. asset scoperti all'ultimo run
|
|
last_message VARCHAR(255) NULL,
|
|
created_by INT NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
UNIQUE KEY uq_dc_org_name (organization_id, name),
|
|
INDEX idx_dc_org (organization_id),
|
|
INDEX idx_dc_key (api_key_id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS discovery_runs (
|
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
connector_id INT UNSIGNED NOT NULL,
|
|
organization_id INT NOT NULL,
|
|
started_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
finished_at TIMESTAMP NULL,
|
|
status ENUM('running','ok','error') NOT NULL DEFAULT 'ok',
|
|
discovered_assets INT NOT NULL DEFAULT 0,
|
|
discovered_flows INT NOT NULL DEFAULT 0,
|
|
message VARCHAR(255) NULL,
|
|
INDEX idx_dr_conn (connector_id),
|
|
INDEX idx_dr_org (organization_id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- Flussi di rete (ID.AM-03): inventario dei flussi tra sistemi e verso l'esterno.
|
|
CREATE TABLE IF NOT EXISTS network_flows (
|
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
organization_id INT NOT NULL,
|
|
src VARCHAR(190) NOT NULL, -- host/asset sorgente (ip o nome)
|
|
dst VARCHAR(190) NOT NULL, -- host/asset destinazione (ip o nome)
|
|
port INT NULL,
|
|
protocol VARCHAR(12) NULL, -- tcp|udp|icmp
|
|
direction ENUM('internal','inbound','outbound') NOT NULL DEFAULT 'internal',
|
|
discovery_source VARCHAR(40) NOT NULL DEFAULT 'manual', -- network/aws/...; manual
|
|
external_ref VARCHAR(190) NULL, -- chiave dedup dal sorgente
|
|
last_seen_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
UNIQUE KEY uq_flow (organization_id, external_ref),
|
|
INDEX idx_flow_org (organization_id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|