From ea2a291325721fb72d4cc4dd6d224cf77afb542c Mon Sep 17 00:00:00 2001 From: DevEnv nis2-agile Date: Mon, 1 Jun 2026 08:02:59 +0200 Subject: [PATCH] [FEAT] Gap Analysis ACN: assessment misure/requisiti Det. 164179/2025 (backend) Assessment di SECONDO LIVELLO sulla Determinazione ACN 164179/2025 (non le 10 lettere generiche Art.21, gia coperte). Distingue soggetti importanti/essenziali: - IMPORTANTI (All.1): 37 misure, 87 requisiti - ESSENZIALI (All.2): 43 misure, 116 requisiti - application/data/acn_measures.json: dataset canonico estratto dai testi UFFICIALI ACN (Allegati 1+2), testi requisiti INTEGRALI (no troncamenti), flag per-requisito importante/essenziale. Validato 37/87 + 43/116, zero discrepanze vs codici di riferimento. - AcnAssessmentController: catalog/list/create/get/requirements/respond/complete/ report/aiAnalyze. Pre-popola requisiti applicabili per entity_level, scoring per funzione FW (GOVERN/IDENTIFY/PROTECT/DETECT/RESPOND/RECOVER), grounding AI sui 203 requisiti ACN gia in KB. Anti-IDOR, snapshot testo immutabile. - Migrazione 036: acn_assessments + acn_assessment_responses (APPLICATA su host). - Router: acn-gap controllerMap + actionMap. Origine: finding revisore (la Gap Analysis Art.21 non e l'autovalutazione ACN). Co-Authored-By: Claude Opus 4.8 --- .../controllers/AcnAssessmentController.php | 591 ++++++++ application/data/acn_measures.json | 1225 +++++++++++++++++ docs/sql/036_acn_gap_assessment.sql | 76 + public/index.php | 14 + 4 files changed, 1906 insertions(+) create mode 100644 application/controllers/AcnAssessmentController.php create mode 100644 application/data/acn_measures.json create mode 100644 docs/sql/036_acn_gap_assessment.sql diff --git a/application/controllers/AcnAssessmentController.php b/application/controllers/AcnAssessmentController.php new file mode 100644 index 0000000..ad577ab --- /dev/null +++ b/application/controllers/AcnAssessmentController.php @@ -0,0 +1,591 @@ +requireOrgAccess(); + $level = $this->resolveEntityLevel(); + $grouped = $this->groupedRequirements($level, []); + + $totals = $this->datasetTotals(); + $this->jsonSuccess([ + 'entity_level' => $level, + 'totals' => $totals[$level], + 'functions' => $grouped, + 'source' => $this->measures()['source'] ?? null, + ]); + } + + // ════════════════════════ LISTA / CREATE ════════════════════════ + + /** GET /api/acn-gap/list */ + public function list(): void + { + $this->requireOrgAccess(); + $orgId = $this->getCurrentOrgId(); + $rows = Database::fetchAll( + 'SELECT id, title, entity_level, status, overall_score, completed_at, created_at + FROM acn_assessments + WHERE organization_id = ? + ORDER BY created_at DESC', + [$orgId] + ); + $this->jsonSuccess(['assessments' => $rows]); + } + + /** + * POST /api/acn-gap/create Body: { title? } + * Crea un assessment ACN e pre-popola TUTTI i requisiti applicabili al + * livello del soggetto (snapshot del testo congelato). + */ + public function create(): void + { + $this->requireOrgRole(['org_admin', 'compliance_manager']); + $orgId = $this->getCurrentOrgId(); + $userId = $this->getCurrentUserId(); + $level = $this->resolveEntityLevel(); + + if ($level === null) { + $this->jsonError( + 'Il soggetto non e classificato come importante o essenziale. Completa prima la classificazione NIS2 dell\'organizzazione.', + 422, + 'ENTITY_LEVEL_REQUIRED' + ); + } + + $title = trim((string) $this->getParam('title', '')); + if ($title === '') { + $title = 'Gap Analysis ACN ' . date('Y-m-d'); + } + + Database::beginTransaction(); + try { + $assessmentId = Database::insert('acn_assessments', [ + 'organization_id' => $orgId, + 'title' => $title, + 'entity_level' => $level, + 'status' => 'draft', + 'created_by' => $userId, + ]); + + $applicable = $this->applicableRequirements($level); + foreach ($applicable as $r) { + Database::insert('acn_assessment_responses', [ + 'assessment_id' => $assessmentId, + 'organization_id' => $orgId, + 'requirement_key' => $r['key'], + 'measure_code' => $r['measure_code'], + 'requirement_index' => $r['index'], + 'function_code' => $r['function_code'], + 'category_code' => $r['category_code'], + 'requirement_text' => $r['text'], + 'response_value' => null, + ]); + } + Database::commit(); + } catch (Throwable $e) { + if (Database::getInstance()->inTransaction()) { + Database::rollback(); + } + throw $e; + } + + $this->logAudit('acn_assessment_created', 'acn_assessment', $assessmentId, [ + 'entity_level' => $level, + 'requirements' => count($applicable), + ]); + + $this->jsonSuccess([ + 'id' => $assessmentId, + 'entity_level' => $level, + 'requirements' => count($applicable), + ], 'Assessment ACN creato', 201); + } + + // ════════════════════════ DETTAGLIO ════════════════════════ + + /** GET /api/acn-gap/{id} */ + public function get(int $id): void + { + $this->requireOrgAccess(); + $a = $this->loadOwned($id); + $a['stats'] = $this->computeStats($id); + $this->jsonSuccess($a); + } + + /** + * GET /api/acn-gap/{id}/requirements + * Requisiti raggruppati per funzione -> categoria -> misura, con la risposta + * salvata. Struttura pensata per il rendering a wizard/accordion. + */ + public function getRequirements(int $id): void + { + $this->requireOrgAccess(); + $a = $this->loadOwned($id); + + $rows = Database::fetchAll( + 'SELECT requirement_key, measure_code, requirement_index, function_code, + category_code, requirement_text, response_value, evidence_description, notes, answered_at + FROM acn_assessment_responses + WHERE assessment_id = ? + ORDER BY id', + [$id] + ); + + // arricchimento da dataset: titoli misura/categoria/funzione + $meta = $this->measureMeta(); + $byFunc = []; + foreach ($rows as $r) { + $fc = $r['function_code']; + $cc = $r['category_code']; + $mc = $r['measure_code']; + $byFunc[$fc] ??= [ + 'function_code' => $fc, + 'function_name' => $meta['functions'][$fc] ?? $fc, + 'categories' => [], + ]; + $byFunc[$fc]['categories'][$cc] ??= [ + 'category_code' => $cc, + 'category_title' => $meta['categories'][$cc] ?? $cc, + 'measures' => [], + ]; + $byFunc[$fc]['categories'][$cc]['measures'][$mc] ??= [ + 'measure_code' => $mc, + 'measure_title' => $meta['measures'][$mc] ?? $mc, + 'requirements' => [], + ]; + $byFunc[$fc]['categories'][$cc]['measures'][$mc]['requirements'][] = [ + 'key' => $r['requirement_key'], + 'index' => (int) $r['requirement_index'], + 'text' => $r['requirement_text'], + 'response' => $r['response_value'], + 'evidence' => $r['evidence_description'], + 'notes' => $r['notes'], + 'answered_at' => $r['answered_at'], + ]; + } + + // converti mappe associative in liste ordinate + $functions = []; + foreach ($byFunc as $f) { + $cats = []; + foreach ($f['categories'] as $c) { + $c['measures'] = array_values($c['measures']); + $cats[] = $c; + } + $f['categories'] = $cats; + $functions[] = $f; + } + + $this->jsonSuccess([ + 'assessment' => ['id' => $id, 'entity_level' => $a['entity_level'], 'status' => $a['status']], + 'functions' => $functions, + 'stats' => $this->computeStats($id), + ]); + } + + /** + * POST /api/acn-gap/{id}/respond + * Body: { requirement_key, response_value, evidence?, notes? } + * oppure { responses: [ {requirement_key, response_value, ...}, ... ] } + */ + public function saveResponse(int $id): void + { + $this->requireOrgRole(['org_admin', 'compliance_manager', 'auditor']); + $a = $this->loadOwned($id); + if ($a['status'] === 'completed') { + $this->jsonError('Assessment gia completato: non modificabile.', 409, 'ALREADY_COMPLETED'); + } + $userId = $this->getCurrentUserId(); + $orgId = $this->getCurrentOrgId(); + + $body = $this->getJsonBody(); + $batch = is_array($body['responses'] ?? null) ? $body['responses'] : [$body]; + + $valid = ['not_implemented', 'partial', 'implemented', 'not_applicable']; + $saved = 0; + foreach ($batch as $item) { + if (!is_array($item)) { + continue; + } + $key = trim((string) ($item['requirement_key'] ?? '')); + $val = (string) ($item['response_value'] ?? ''); + if ($key === '' || !in_array($val, $valid, true)) { + continue; + } + $updated = Database::update('acn_assessment_responses', [ + 'response_value' => $val, + 'evidence_description' => isset($item['evidence']) ? (string) $item['evidence'] : null, + 'notes' => isset($item['notes']) ? (string) $item['notes'] : null, + 'answered_by' => $userId, + 'answered_at' => date('Y-m-d H:i:s'), + ], 'assessment_id = ? AND requirement_key = ? AND organization_id = ?', [$id, $key, $orgId]); + $saved += $updated > 0 ? 1 : 0; + } + + // porta a in_progress se era draft + if ($a['status'] === 'draft' && $saved > 0) { + Database::update('acn_assessments', ['status' => 'in_progress'], 'id = ?', [$id]); + } + + $this->jsonSuccess(['saved' => $saved, 'stats' => $this->computeStats($id)], 'Risposte salvate'); + } + + /** + * POST /api/acn-gap/{id}/complete + * Calcola overall_score + function_scores + stats e marca completed. + * Richiede che tutti i requisiti applicabili abbiano una risposta. + */ + public function complete(int $id): void + { + $this->requireOrgRole(['org_admin', 'compliance_manager']); + $a = $this->loadOwned($id); + if ($a['status'] === 'completed') { + $this->jsonError('Assessment gia completato.', 409, 'ALREADY_COMPLETED'); + } + + $unanswered = (int) (Database::fetchOne( + 'SELECT COUNT(*) AS n FROM acn_assessment_responses WHERE assessment_id = ? AND response_value IS NULL', + [$id] + )['n'] ?? 0); + if ($unanswered > 0) { + $this->jsonError( + "Mancano $unanswered requisiti senza risposta. Completa tutte le risposte prima di chiudere.", + 422, + 'INCOMPLETE', + ['unanswered' => $unanswered] + ); + } + + [$overall, $funcScores, $stats] = $this->calculateScores($id); + + Database::update('acn_assessments', [ + 'status' => 'completed', + 'overall_score' => $overall, + 'function_scores' => json_encode($funcScores, JSON_UNESCAPED_UNICODE), + 'stats' => json_encode($stats, JSON_UNESCAPED_UNICODE), + 'completed_by' => $this->getCurrentUserId(), + 'completed_at' => date('Y-m-d H:i:s'), + ], 'id = ?', [$id]); + + $this->logAudit('acn_assessment_completed', 'acn_assessment', $id, [ + 'overall_score' => $overall, + 'entity_level' => $a['entity_level'], + ]); + + $this->jsonSuccess([ + 'overall_score' => $overall, + 'function_scores' => $funcScores, + 'stats' => $stats, + ], 'Assessment ACN completato'); + } + + /** GET /api/acn-gap/{id}/report */ + public function getReport(int $id): void + { + $this->requireOrgAccess(); + $a = $this->loadOwned($id); + + // requisiti non conformi (priorita per il piano d'azione) + $gaps = Database::fetchAll( + "SELECT requirement_key, measure_code, function_code, category_code, requirement_text, + response_value, notes + FROM acn_assessment_responses + WHERE assessment_id = ? AND response_value IN ('not_implemented','partial') + ORDER BY FIELD(response_value,'not_implemented','partial'), function_code, measure_code, requirement_index", + [$id] + ); + + $a['function_scores'] = $a['function_scores'] ? json_decode($a['function_scores'], true) : null; + $a['stats'] = $a['stats'] ? json_decode($a['stats'], true) : $this->computeStats($id); + $a['ai_recommendations'] = $a['ai_recommendations'] ? json_decode($a['ai_recommendations'], true) : null; + + $this->jsonSuccess(['assessment' => $a, 'gaps' => $gaps]); + } + + /** + * POST /api/acn-gap/{id}/aiAnalyze + * Analisi AI dei gap con grounding sui requisiti ACN (la KB contiene gia i + * 203 requisiti, scope SYSTEM). Salva sintesi e raccomandazioni. + */ + public function aiAnalyze(int $id): void + { + $this->requireOrgRole(['org_admin', 'compliance_manager']); + $a = $this->loadOwned($id); + + $gaps = Database::fetchAll( + "SELECT measure_code, requirement_index, requirement_text, response_value + FROM acn_assessment_responses + WHERE assessment_id = ? AND response_value IN ('not_implemented','partial') + ORDER BY function_code, measure_code, requirement_index + LIMIT 60", + [$id] + ); + + if (empty($gaps)) { + $this->jsonSuccess(['ai_summary' => 'Nessun gap rilevato: tutti i requisiti applicabili risultano conformi.'], 'Analisi completata'); + } + + require_once APP_PATH . '/services/AIService.php'; + $ai = new AIService(); + + $lines = array_map( + fn($g) => "- {$g['measure_code']} punto {$g['requirement_index']} [{$g['response_value']}]: {$g['requirement_text']}", + $gaps + ); + $question = "Analizza i seguenti gap di conformita rispetto alle misure di sicurezza di base ACN " + . "(Determinazione 164179/2025) per un soggetto " . ($a['entity_level'] === 'essential' ? 'ESSENZIALE' : 'IMPORTANTE') . ". " + . "Per ciascun gap suggerisci un'azione concreta e prioritizza. Cita SOLO requisiti ACN reali.\n\n" + . implode("\n", $lines); + + try { + $userContext = [ + 'organization_id' => $this->getCurrentOrgId(), + 'consulting_firm_id' => $this->currentUser['consulting_firm_id'] ?? null, + ]; + $answer = $ai->askWithRag($question, $userContext); + } catch (Throwable $e) { + error_log('[AcnAssessment] aiAnalyze fallita: ' . $e->getMessage()); + $this->jsonError('Analisi AI temporaneamente non disponibile. Riprova piu tardi.', 503, 'AI_UNAVAILABLE'); + } + + Database::update('acn_assessments', [ + 'ai_summary' => is_string($answer) ? $answer : json_encode($answer, JSON_UNESCAPED_UNICODE), + ], 'id = ?', [$id]); + + $this->logAudit('acn_assessment_ai_analyzed', 'acn_assessment', $id, ['gaps' => count($gaps)]); + $this->jsonSuccess(['ai_summary' => $answer], 'Analisi AI completata'); + } + + // ════════════════════════ HELPER ════════════════════════ + + /** Carica l'assessment verificando ownership org (anti-IDOR). */ + private function loadOwned(int $id): array + { + $a = Database::fetchOne( + 'SELECT * FROM acn_assessments WHERE id = ? AND organization_id = ?', + [$id, $this->getCurrentOrgId()] + ); + if (!$a) { + $this->jsonError('Assessment non trovato', 404, 'NOT_FOUND'); + } + return $a; + } + + /** + * Determina il livello del soggetto dall'organization corrente. + * organizations.entity_type: 'essential'|'important'|'not_applicable'. + * Ritorna 'essential'|'important', oppure null se non classificato. + */ + private function resolveEntityLevel(): ?string + { + $org = Database::fetchOne('SELECT entity_type FROM organizations WHERE id = ?', [$this->getCurrentOrgId()]); + $t = $org['entity_type'] ?? null; + if ($t === 'essential' || $t === 'important') { + return $t; + } + return null; + } + + /** Carica e cache il dataset misure ACN. */ + private function measures(): array + { + if ($this->measuresCache === null) { + $path = APP_PATH . '/data/acn_measures.json'; + $json = is_readable($path) ? json_decode((string) file_get_contents($path), true) : null; + $this->measuresCache = is_array($json) ? $json : ['measures' => []]; + } + return $this->measuresCache; + } + + /** Totali requisiti per livello (da dataset). */ + private function datasetTotals(): array + { + $t = $this->measures()['totals'] ?? []; + return [ + 'important' => [ + 'measures' => $t['measures_importante'] ?? 37, + 'requirements' => $t['requirements_importante'] ?? 87, + ], + 'essential' => [ + 'measures' => $t['measures_essenziale'] ?? 43, + 'requirements' => $t['requirements_essenziale'] ?? 116, + ], + ]; + } + + /** + * Lista piatta dei requisiti applicabili a un livello. + * @return array + */ + private function applicableRequirements(string $level): array + { + $flag = $level === 'essential' ? 'essenziale' : 'importante'; + $out = []; + foreach ($this->measures()['measures'] ?? [] as $m) { + $applies = $level === 'essential' ? ($m['applies_essenziale'] ?? false) : ($m['applies_importante'] ?? false); + if (!$applies) { + continue; + } + foreach ($m['requirements'] ?? [] as $r) { + if (empty($r[$flag])) { + continue; // punto non applicabile a questo livello + } + $out[] = [ + 'key' => $m['code'] . '#' . $r['index'], + 'measure_code' => $m['code'], + 'index' => (int) $r['index'], + 'function_code' => $m['function_code'], + 'category_code' => $m['category_code'], + 'text' => $r['text'], + ]; + } + } + return $out; + } + + /** Requisiti raggruppati per funzione (per il catalogo). */ + private function groupedRequirements(?string $level, array $responses): array + { + if ($level === null) { + return []; + } + $reqs = $this->applicableRequirements($level); + $meta = $this->measureMeta(); + $byFunc = []; + foreach ($reqs as $r) { + $fc = $r['function_code']; + $byFunc[$fc] ??= ['function_code' => $fc, 'function_name' => $meta['functions'][$fc] ?? $fc, 'measures' => []]; + $mc = $r['measure_code']; + $byFunc[$fc]['measures'][$mc] ??= ['measure_code' => $mc, 'measure_title' => $meta['measures'][$mc] ?? $mc, 'requirements' => []]; + $byFunc[$fc]['measures'][$mc]['requirements'][] = ['index' => $r['index'], 'text' => $r['text']]; + } + $out = []; + foreach ($byFunc as $f) { + $f['measures'] = array_values($f['measures']); + $out[] = $f; + } + return $out; + } + + /** Mappe codice->titolo per funzioni/categorie/misure (dal dataset). */ + private function measureMeta(): array + { + static $meta = null; + if ($meta !== null) { + return $meta; + } + $functions = []; + $categories = []; + $measures = []; + foreach ($this->measures()['measures'] ?? [] as $m) { + $functions[$m['function_code']] = $m['function_name'] ?? $m['function_code']; + $categories[$m['category_code']] = $m['category_title'] ?? $m['category_code']; + $measures[$m['code']] = $m['title'] ?? $m['code']; + } + $meta = ['functions' => $functions, 'categories' => $categories, 'measures' => $measures]; + return $meta; + } + + /** Conteggi rapidi per stato risposta. */ + private function computeStats(int $id): array + { + $rows = Database::fetchAll( + 'SELECT response_value, COUNT(*) AS n FROM acn_assessment_responses WHERE assessment_id = ? GROUP BY response_value', + [$id] + ); + $stats = ['applicable' => 0, 'implemented' => 0, 'partial' => 0, 'not_implemented' => 0, 'not_applicable' => 0, 'unanswered' => 0]; + foreach ($rows as $r) { + $n = (int) $r['n']; + $stats['applicable'] += $n; + $v = $r['response_value']; + if ($v === null) { + $stats['unanswered'] += $n; + } elseif (isset($stats[$v])) { + $stats[$v] += $n; + } + } + return $stats; + } + + /** + * Calcolo punteggi: overall + per funzione. + * Scoring per requisito: implemented=100, partial=50, not_implemented=0. + * not_applicable e unanswered ESCLUSI dal denominatore (coerente con + * l'assessment Art.21 esistente). + * @return array{0:float,1:array,2:array} + */ + private function calculateScores(int $id): array + { + $rows = Database::fetchAll( + 'SELECT function_code, response_value FROM acn_assessment_responses WHERE assessment_id = ?', + [$id] + ); + $val = ['implemented' => 100.0, 'partial' => 50.0, 'not_implemented' => 0.0]; + + $sum = 0.0; $cnt = 0; + $byFunc = []; + foreach ($rows as $r) { + $v = $r['response_value']; + if ($v === 'not_applicable' || $v === null || !isset($val[$v])) { + continue; + } + $fc = $r['function_code']; + $byFunc[$fc] ??= ['sum' => 0.0, 'cnt' => 0]; + $byFunc[$fc]['sum'] += $val[$v]; + $byFunc[$fc]['cnt']++; + $sum += $val[$v]; + $cnt++; + } + + $overall = $cnt > 0 ? round($sum / $cnt, 2) : 0.0; + $funcScores = []; + foreach ($byFunc as $fc => $d) { + $funcScores[$fc] = $d['cnt'] > 0 ? round($d['sum'] / $d['cnt'], 2) : 0.0; + } + + return [$overall, $funcScores, $this->computeStats($id)]; + } +} diff --git a/application/data/acn_measures.json b/application/data/acn_measures.json new file mode 100644 index 0000000..28a29ed --- /dev/null +++ b/application/data/acn_measures.json @@ -0,0 +1,1225 @@ +{ + "source": "ACN, Determinazione n. 164179/2025 del 14/04/2025 — Allegati 1 (importanti) e 2 (essenziali)", + "source_url": "https://www.acn.gov.it/portale/en/nis/modalita-specifiche-base", + "generated_note": "Dataset canonico estratto dai testi ufficiali ACN (testi requisiti integrali). Flag per-requisito importante/essenziale.", + "totals": { + "measures_importante": 37, + "measures_essenziale": 43, + "requirements_importante": 87, + "requirements_essenziale": 116 + }, + "measures": [ + { + "code": "GV.OC-04", + "function_code": "GOVERN", + "function_name": "Governo", + "category_code": "GV.OC", + "category_title": "Contesto organizzativo", + "title": "Gli obiettivi, le capacità e i servizi critici dai quali gli stakeholder dipendono o che si aspettano dall'organizzazione sono compresi e comunicati.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "È mantenuto un elenco aggiornato dei sistemi informativi e di rete rilevanti.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "GV.PO-01", + "function_code": "GOVERN", + "function_name": "Governo", + "category_code": "GV.PO", + "category_title": "Politica", + "title": "La politica per la gestione del rischio di cybersecurity è stabilita in base al contesto organizzativo, alla strategia di cybersecurity e alle priorità, ed è comunicata e applicata.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Sono adottate e documentate politiche di sicurezza informatica per almeno i seguenti ambiti: a) gestione del rischio; b) ruoli e responsabilità; c) affidabilità delle risorse umane; d) conformità e audit di sicurezza; e) gestione dei rischi per la sicurezza informatica della catena di approvvigionamento; f) gestione degli asset; g) gestione delle vulnerabilità; h) continuità operativa, ripristino in caso di disastro e gestione delle crisi; i) gestione dell'autenticazione, delle identità digitali e del controllo accessi; j) sicurezza fisica; k) formazione del personale e consapevolezza; l) sicurezza dei dati; m) sviluppo, configurazione, manutenzione e dismissione dei sistemi informativi e di rete; n) protezione delle reti e delle comunicazioni; o) monitoraggio degli eventi di sicurezza; p) risposta agli incidenti e ripristino.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Per gli ambiti di cui al punto 1 sono incluse almeno le politiche in relazione ai requisiti indicati nella tabella 1 in appendice al presente allegato.", + "importante": true, + "essenziale": true + }, + { + "index": "3", + "text": "Le politiche di cui al punto 1 sono approvate dagli organi di amministrazione e direttivi.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "GV.PO-02", + "function_code": "GOVERN", + "function_name": "Governo", + "category_code": "GV.PO", + "category_title": "Politica", + "title": "La politica per la gestione del rischio di cybersecurity è revisionata, aggiornata, comunicata e applicata per riflettere i cambiamenti nei requisiti, nelle minacce, nella tecnologia e nella missione dell'organizzazione.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Le politiche di cui alla misura GV.PO-01 sono riesaminate e, se opportuno, aggiornate periodicamente e comunque almeno con cadenza annuale, nonché qualora si verifichino evoluzioni del contesto normativo in materia di sicurezza informatica, incidenti significativi, variazioni organizzative o mutamenti dell’esposizione alle minacce e ai relativi rischi.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Ai fini del riesame di cui al punto 1, è verificata almeno la conformità delle politiche di cui alla misura GV.PO-01 alla normativa in materia di sicurezza informatica.", + "importante": true, + "essenziale": true + }, + { + "index": "3", + "text": "È mantenuto un registro aggiornato contenente gli esiti del riesame di cui al punto 1.", + "importante": false, + "essenziale": true + } + ] + }, + { + "code": "GV.RM-03", + "function_code": "GOVERN", + "function_name": "Governo", + "category_code": "GV.RM", + "category_title": "Strategia di gestione del rischio", + "title": "Le attività e gli esiti della gestione del rischio di cybersecurity sono parte integrante dei processi di gestione del rischio dell'organizzazione.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Nell'ambito dei processi di gestione del rischio del soggetto NIS e nel rispetto delle politiche di cui alla misura GV.PO-01, è definito, attuato, aggiornato e documentato un piano di gestione dei rischi per la sicurezza informatica per identificare, analizzare, valutare, trattare e monitorare i rischi.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "GV.RR-02", + "function_code": "GOVERN", + "function_name": "Governo", + "category_code": "GV.RR", + "category_title": "Ruoli, responsabilità e correlati poteri", + "title": "I ruoli, le responsabilità e i correlati poteri relativi alla gestione del rischio di cybersecurity sono stabiliti, comunicati, compresi e applicati.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "È definita, approvata dagli organi di amministrazione e direttivi, e resa nota alle articolazioni competenti del soggetto NIS, l'organizzazione per la sicurezza informatica e ne sono stabiliti ruoli e responsabilità.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "È mantenuto un elenco aggiornato del personale dell'organizzazione di cui al punto 1 avente specifici ruoli e responsabilità ed è reso noto alle articolazioni competenti del soggetto NIS.", + "importante": true, + "essenziale": true + }, + { + "index": "3", + "text": "All’interno dell’organizzazione per la sicurezza informatica di cui al punto 1, sono inclusi il punto di contatto, e almeno un suo sostituto, di cui alla determina adottata ai sensi dell’articolo 7, comma 6 del decreto NIS.", + "importante": true, + "essenziale": true + }, + { + "index": "4", + "text": "I ruoli e le responsabilità di cui al punto 1 sono riesaminati e, se opportuno, aggiornati periodicamente e comunque almeno ogni due anni, nonché qualora si verifichino incidenti significativi, variazioni organizzative o mutamenti dell’esposizione alle minacce e ai relativi rischi.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "GV.RR-04", + "function_code": "GOVERN", + "function_name": "Governo", + "category_code": "GV.RR", + "category_title": "Ruoli, responsabilità e correlati poteri", + "title": "La cybersecurity è inclusa nelle pratiche delle risorse umane.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Per almeno i sistemi informativi e di rete rilevanti, il personale autorizzato ad accedervi è individuato previa valutazione dell’esperienza, capacità e affidabilità e deve fornire idonea garanzia del pieno rispetto della normativa in materia di sicurezza informatica.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Gli amministratori di sistema dei sistemi informativi e di rete sono individuati previa valutazione dell’esperienza, capacità e affidabilità e devono fornire idonea garanzia del pieno rispetto della normativa in materia di sicurezza informatica.", + "importante": true, + "essenziale": true + }, + { + "index": "3", + "text": "Nel rispetto delle politiche di cui alla misura GV.PO-01, sono adottate e documentate le procedure in relazione ai punti 1 e 2.", + "importante": true, + "essenziale": true + }, + { + "index": "4", + "text": "In accordo agli esiti della valutazione del rischio di cui alla misura ID.RA-05, sono definiti a livello contrattuale gli eventuali obblighi, in materia di sicurezza informatica, che rimangono validi dopo la cessazione o la modifica del rapporto di lavoro dei dipendenti del soggetto NIS (ad esempio prevedendo clausole in materia di riservatezza).", + "importante": false, + "essenziale": true + }, + { + "index": "5", + "text": "Nel rispetto delle politiche di cui alla misura GV.PO-01, sono adottate e documentate le procedure in relazione al punto 4.", + "importante": false, + "essenziale": true + } + ] + }, + { + "code": "GV.SC-01", + "function_code": "GOVERN", + "function_name": "Governo", + "category_code": "GV.SC", + "category_title": "Gestione del rischio di cybersecurity della catena di approvvigionamento", + "title": "Sono stabiliti e accettati dagli stakeholder dell'organizzazione il programma, la strategia, obiettivi, politiche e processi di gestione del rischio di cybersecurity della catena di approvvigionamento.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "In merito all’affidamento di forniture con potenziali impatti sulla sicurezza dei sistemi informativi e di rete, anche mediante ricorso agli strumenti delle centrali di committenza di cui all’allegato I.1, articolo 1, comma 1, lettera i), del decreto legislativo 31 marzo 2023, n. 36, sono previsti: a) il coinvolgimento dell’organizzazione per la sicurezza informatica di cui alla misura GV.RR-02 nella definizione ed esecuzione dei processi di approvvigionamento a partire dalla fase di identificazione e progettazione della fornitura; b) in accordo agli esiti della valutazione del rischio associato alla fornitura di cui alla misura GV.SC-07, la definizione di requisiti di sicurezza sulla fornitura coerenti con le misure di sicurezza applicate dal soggetto NIS ai sistemi informativi e di rete.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Per i requisiti di sicurezza di cui al punto 1, lettera b), sono considerati, ove applicabile, almeno i seguenti ambiti: a) affidabilità dei fornitori, tenendo conto almeno delle loro eventuali vulnerabilità specifiche, della qualità complessiva dei loro prodotti e delle pratiche di sicurezza informatica, specie con riguardo all’oggetto della fornitura, della capacità di garantire l’approvvigionamento, l’assistenza e la manutenzione nel tempo, nonché, ove applicabile, dei risultati delle valutazioni coordinate dei rischi per la sicurezza delle catene di approvvigionamento critiche effettuate dal Gruppo di cooperazione NIS; b) ruoli e responsabilità nell'ambito della fornitura; c) affidabilità delle risorse umane; d) conformità e audit di sicurezza; e) gestione delle vulnerabilità; f) continuità operativa e ripristino in caso di disastro; g) gestione dell'autenticazione, delle identità digitali e del controllo accessi; h) sicurezza fisica; i) formazione del personale e consapevolezza; j) sicurezza dei dati; k) protezione delle reti e delle comunicazioni; l) monitoraggio degli eventi di sicurezza ivi inclusi gli accessi e le attività effettuate; m) gestione e segnalazione degli incidenti; n) sviluppo sicuro del codice e sicurezza fin dalla progettazione e per impostazione predefinita; o) manutenzione ordinaria ed evolutiva ivi inclusi gli aggiornamenti di sicurezza; p) dismissione della fornitura ivi compresa la restituzione e la cancellazione dei dati; q) subappalto, subfornitura o relativi potenziali requisiti di sicurezza lungo la catena di fornitura.", + "importante": false, + "essenziale": true + } + ] + }, + { + "code": "GV.SC-02", + "function_code": "GOVERN", + "function_name": "Governo", + "category_code": "GV.SC", + "category_title": "Gestione del rischio di cybersecurity della catena di approvvigionamento", + "title": "I ruoli e le responsabilità in materia di cybersecurity per fornitori, clienti e partner sono stabiliti, comunicati e coordinati internamente ed esternamente.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Nell'ambito dell'organizzazione per la sicurezza informatica di cui alla misura GV.RR-02, sono definiti e resi noti alle articolazioni competenti del soggetto NIS gli eventuali ruoli e responsabilità in materia di sicurezza informatica assegnati al personale delle terze parti.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Il personale di cui al punto 1 avente specifici ruoli e responsabilità è incluso nell’elenco di cui al punto 2 della misura GV.RR-02.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "GV.SC-04", + "function_code": "GOVERN", + "function_name": "Governo", + "category_code": "GV.SC", + "category_title": "Gestione del rischio di cybersecurity della catena di approvvigionamento", + "title": "I fornitori sono noti e prioritizzati in base alla criticità.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "È mantenuto un inventario aggiornato dei fornitori, le cui forniture hanno un potenziale impatto sulla sicurezza dei sistemi informativi e di rete, che comprende almeno: a) gli estremi di contatto del referente della fornitura; b) la tipologia di fornitura.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "GV.SC-05", + "function_code": "GOVERN", + "function_name": "Governo", + "category_code": "GV.SC", + "category_title": "Gestione del rischio di cybersecurity della catena di approvvigionamento", + "title": "I requisiti per affrontare i rischi di cybersecurity nella catena di approvvigionamento sono stabiliti, prioritizzati e integrati nei contratti e in altri tipi di accordi con i fornitori e altre terze parti rilevanti.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Fatte salve motivate e documentate ragioni normative o tecniche, i requisiti di sicurezza di cui alla misura GV.SC-01, punto 1, lettera b) sono inseriti nelle richieste di offerta, bandi di gara, contratti, accordi e convenzioni relativi alle forniture con potenziali impatto sulla sicurezza dei sistemi informativi e di rete.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "GV.SC-07", + "function_code": "GOVERN", + "function_name": "Governo", + "category_code": "GV.SC", + "category_title": "Gestione del rischio di cybersecurity della catena di approvvigionamento", + "title": "I rischi posti da un fornitore, dai suoi prodotti e servizi e da altre terze parti sono compresi, registrati, prioritizzati, valutati, trattati e monitorati nel corso della relazione.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Nell’ambito della valutazione del rischio di cui alla misura ID.RA-05, è valutato e documentato il rischio associato alle forniture. A tal fine, sono valutati almeno: a) il livello di accesso del fornitore ai sistemi informativi e di rete del soggetto NIS; b) l'accesso del fornitore alla proprietà intellettuale e ai dati anche sulla base della loro criticità; c) l'impatto di una grave interruzione della fornitura; d) i tempi e i costi di ripristino in caso di indisponibilità dei servizi; e) i ruoli e le responsabilità del fornitore nel governo dei sistemi informativi e di rete.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "È verificata periodicamente e documentata la conformità delle forniture ai requisiti di cui alla misura GV.SC-05.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "ID.AM-01", + "function_code": "IDENTIFY", + "function_name": "Identificazione", + "category_code": "ID.AM", + "category_title": "Gestione degli asset", + "title": "Sono mantenuti gli inventari dell'hardware gestito dall'organizzazione.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "È mantenuto un inventario aggiornato degli apparati fisici (hardware) che compongono i sistemi informativi e di rete, ivi inclusi i dispositivi IT, IoT, OT e mobili, approvati da attori interni al soggetto NIS.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "ID.AM-02", + "function_code": "IDENTIFY", + "function_name": "Identificazione", + "category_code": "ID.AM", + "category_title": "Gestione degli asset", + "title": "Sono mantenuti gli inventari del software, dei servizi e dei sistemi gestiti dall'organizzazione.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "È mantenuto un inventario aggiornato dei servizi, dei sistemi e delle applicazioni software che compongono i sistemi informativi e di rete, ivi incluse le applicazioni commerciali, open-source e custom, anche accessibili tramite API, approvati da attori interni al soggetto NIS.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "ID.AM-03", + "function_code": "IDENTIFY", + "function_name": "Identificazione", + "category_code": "ID.AM", + "category_title": "Gestione degli asset", + "title": "Sono mantenute le rappresentazioni delle comunicazioni di rete, dei flussi di dati di rete interni ed esterni, autorizzati dall'organizzazione.", + "applies_importante": false, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "È mantenuto un inventario aggiornato dei flussi di rete tra i sistemi informativi e di rete del soggetto NIS e l’esterno, approvati da attori interni al soggetto NIS.", + "importante": false, + "essenziale": true + } + ] + }, + { + "code": "ID.AM-04", + "function_code": "IDENTIFY", + "function_name": "Identificazione", + "category_code": "ID.AM", + "category_title": "Gestione degli asset", + "title": "Sono mantenuti gli inventari dei servizi erogati dai fornitori.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "È mantenuto un inventario aggiornato dei servizi informatici erogati dai fornitori, ivi inclusi i servizi cloud.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "ID.IM-01", + "function_code": "IDENTIFY", + "function_name": "Identificazione", + "category_code": "ID.IM", + "category_title": "Miglioramento", + "title": "Sono identificati miglioramenti in esito alle valutazioni.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "In accordo agli esiti del riesame di cui al punto 1 della misura GV.PO-02, è definito, attuato, documentato e approvato dagli organi di amministrazioni e direttivi un piano di adeguamento che identifichi gli interventi necessari ad assicurare l’attuazione delle politiche di sicurezza.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Gli organi di amministrazione e direttivi sono informati mediante apposite relazioni periodiche sugli esiti dei piani di cui al punto 1.", + "importante": true, + "essenziale": true + }, + { + "index": "3", + "text": "È definito, attuato, aggiornato e documentato un piano per la valutazione dell'efficacia delle misure di gestione del rischio per la sicurezza informatica che comprenda l'indicazione delle misure da valutare e i relativi metodi di valutazione.", + "importante": false, + "essenziale": true + }, + { + "index": "4", + "text": "Gli organi di amministrazione e direttivi sono informati mediante apposite relazioni periodiche sul piano di valutazione dell’efficacia di cui al punto 3.", + "importante": false, + "essenziale": true + } + ] + }, + { + "code": "ID.IM-04", + "function_code": "IDENTIFY", + "function_name": "Identificazione", + "category_code": "ID.IM", + "category_title": "Miglioramento", + "title": "I piani di risposta agli incidenti e gli altri piani di cybersecurity che impattano le operazioni sono stabiliti, comunicati, mantenuti e migliorati.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Per almeno i sistemi informativi e di rete rilevanti è definito, attuato, aggiornato e documentato un piano di continuità operativa, che comprende almeno: a) le finalità e l'ambito di applicazione; b) i ruoli e le responsabilità; c) i contatti principali e i canali di comunicazione (interni ed esterni); d) le condizioni per l'attivazione e la disattivazione del piano; e) le risorse necessarie, ivi compresi i backup e le ridondanze.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Per almeno i sistemi informativi e di rete rilevanti è definito, attuato, aggiornato e documentato un piano di ripristino in caso di disastro, che comprende almeno: a) le finalità e l'ambito di applicazione; b) i ruoli e le responsabilità; c) i contatti principali e i canali di comunicazione (interni ed esterni); d) le condizioni per l'attivazione e la disattivazione del piano; e) le risorse necessarie, ivi compresi i backup e le ridondanze; f) l'ordine di ripristino delle operazioni; g) le procedure di ripristino per operazioni specifiche, compresi gli obiettivi di ripristino.", + "importante": true, + "essenziale": true + }, + { + "index": "3", + "text": "Per almeno i sistemi informativi e di rete rilevanti è definito, attuato, aggiornato e documentato un piano per la gestione delle crisi che comprende almeno: a) i ruoli e responsabilità del personale e, se opportuno, dei fornitori, specificando l'assegnazione dei ruoli in situazioni di crisi, comprese le procedure specifiche da seguire; b) le modalità di comunicazione tra i soggetti e le autorità competenti.", + "importante": true, + "essenziale": true + }, + { + "index": "4", + "text": "I piani di cui ai punti 1, 2 e 3 sono approvati dagli organi di amministrazione e direttivi.", + "importante": true, + "essenziale": true + }, + { + "index": "5", + "text": "I piani di cui ai punti 1, 2 e 3 sono riesaminati e, se opportuno, aggiornati periodicamente e comunque almeno ogni due anni, nonché qualora si verifichino incidenti significativi o mutamenti dell’esposizione alle minacce e ai relativi rischi.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "ID.RA-01", + "function_code": "IDENTIFY", + "function_name": "Identificazione", + "category_code": "ID.RA", + "category_title": "Valutazione del rischio (Risk Assessment)", + "title": "Le vulnerabilità negli asset sono identificate, confermate e registrate.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Le informazioni di cui al punto 1 della misura ID.RA-08 sono utilizzate per identificare eventuali vulnerabilità sui i sistemi informativi e di rete.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Per almeno i sistemi informativi e di rete rilevanti, in accordo al piano di gestione delle vulnerabilità di cui alla misura ID.RA-08, fatte salve motivate e documentate ragioni normative o tecniche, sono eseguite periodicamente e comunque prima della loro messa in esercizio, attività per l’identificazione delle vulnerabilità che comprendano almeno vulnerability assessment e/o penetration test.", + "importante": false, + "essenziale": true + }, + { + "index": "3", + "text": "Le attività di cui al punto 2 sono documentate tramite apposite relazioni che contengono almeno: a) la descrizione generale delle attività effettuate e gli esiti delle stesse; b) la descrizione delle vulnerabilità rilevate e il relativo livello di impatto sulla sicurezza.", + "importante": false, + "essenziale": true + } + ] + }, + { + "code": "ID.RA-05", + "function_code": "IDENTIFY", + "function_name": "Identificazione", + "category_code": "ID.RA", + "category_title": "Valutazione del rischio (Risk Assessment)", + "title": "Minacce, vulnerabilità, probabilità e impatti sono utilizzati per comprendere il rischio inerente e per informare la prioritizzazione della risposta al rischio.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "In accordo al piano di gestione dei rischi per la sicurezza informatica di cui alla misura GV.RM-03, è eseguita e documentata la valutazione del rischio posto alla sicurezza dei sistemi informativi e di rete, anche con riferimento alle eventuali dipendenze da fornitori e partner terzi, che comprende almeno: a) l’identificazione del rischio; b) l’analisi del rischio; c) la ponderazione del rischio.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "La valutazione del rischio di cui al punto 1 è eseguita a intervalli pianificati e comunque almeno ogni due anni, nonché qualora si verifichino incidenti significativi, variazioni organizzative o mutamenti dell’esposizione alle minacce e ai relativi rischi.", + "importante": true, + "essenziale": true + }, + { + "index": "3", + "text": "La valutazione del rischio cui al punto 1 è approvata dagli organi di amministrazione e direttivi.", + "importante": true, + "essenziale": true + }, + { + "index": "4", + "text": "La valutazione del rischio di cui al punto 1 è effettuata considerando almeno le minacce interne ed esterne, le vulnerabilità non risolte e gli impatti conseguenti ad eventuali incidenti.", + "importante": false, + "essenziale": true + } + ] + }, + { + "code": "ID.RA-06", + "function_code": "IDENTIFY", + "function_name": "Identificazione", + "category_code": "ID.RA", + "category_title": "Valutazione del rischio (Risk Assessment)", + "title": "Le risposte al rischio sono scelte, prioritizzate, pianificate, monitorate e comunicate.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "È definito, documentato, eseguito e monitorato un piano di trattamento del rischio che comprende almeno: a) le opzioni di trattamento e le misure da attuare in merito al trattamento di ciascun rischio individuato e le relative priorità; b) le articolazioni competenti per l'attuazione delle misure di trattamento dei rischi e le tempistiche per tale attuazione; c) la descrizione e le ragioni che giustificano l'accettazione di eventuali rischi residui al trattamento.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Qualora per motivate e documentate ragioni normative o tecniche non siano attuati i requisiti di cui alla tabella 2 in appendice al presente allegato, sono adottate, ove applicabile, misure di mitigazione compensative e il piano di cui al punto 1 include la descrizione di tali misure e dell’eventuale rischio residuo.", + "importante": true, + "essenziale": true + }, + { + "index": "3", + "text": "Il piano di cui al punto 1, ivi compresa l’accettazione di eventuali rischi residui, è approvato dagli organi di amministrazione e direttivi.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "ID.RA-08", + "function_code": "IDENTIFY", + "function_name": "Identificazione", + "category_code": "ID.RA", + "category_title": "Valutazione del rischio (Risk Assessment)", + "title": "Sono stabiliti processi per la ricezione, l'analisi e la risposta alle divulgazioni di vulnerabilità.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Sono monitorati almeno i canali di comunicazione del CSIRT Italia, nonché di eventuali CERT e Information Sharing & Analysis Centre (ISAC) settoriali, al fine di acquisire, analizzare e rispondere alle informazioni sulle vulnerabilità.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Le vulnerabilità, ivi comprese quelle identificate ai sensi della misura ID.RA-01, sono prontamente risolte attraverso aggiornamenti di sicurezza o misure di mitigazione, ove disponibili, ovvero accettando e documentando il rischio in accordo al piano di trattamento del rischio informatico di cui alla misura ID.RA-06.", + "importante": true, + "essenziale": true + }, + { + "index": "3", + "text": "È definito, attuato, aggiornato e documentato un piano di gestione delle vulnerabilità che comprende almeno: a) le modalità per l'identificazione delle vulnerabilità di cui alla misura ID.RA-01 e la relativa pianificazione delle attività; b) le modalità per monitorare, ricevere, analizzare e rispondere alle informazioni sulle vulnerabilità; c) le procedure, i ruoli, le responsabilità per lo svolgimento delle attività di cui alle lettere a) e b).", + "importante": true, + "essenziale": true + }, + { + "index": "4", + "text": "Il piano di cui al punto 3 è approvato dagli organi di amministrazione e direttivi.", + "importante": true, + "essenziale": true + }, + { + "index": "5", + "text": "Ai fini di cui al punto 1, sono monitorati anche i canali dei fornitori del software ritenuto critico.", + "importante": false, + "essenziale": true + } + ] + }, + { + "code": "PR.AA-01", + "function_code": "PROTECT", + "function_name": "Protezione", + "category_code": "PR.AA", + "category_title": "Gestione delle identità, autenticazione e controllo degli accessi", + "title": "Le identità e le credenziali degli utenti, dei servizi e dell'hardware autorizzati sono gestite dall'organizzazione.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Tutte le utenze, ivi incluse quelle con privilegi amministrativi e quelle utilizzate per l’accesso remoto, sono censite, approvate da attori interni al soggetto NIS e, fatte salve motivate e documentate ragioni tecniche, in accordo agli esiti della valutazione del rischio di cui alla misura ID.RA-05, sono individuali per gli utenti.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Le credenziali (ad esempio nome utente e password) relative alle utenze sono robuste e aggiornate in accordo agli esiti della valutazione del rischio di cui alla misura ID.RA-05.", + "importante": true, + "essenziale": true + }, + { + "index": "3", + "text": "Per almeno i sistemi informativi e di rete rilevanti, sono verificate periodicamente le utenze e le relative autorizzazioni, aggiornandole/revocandole in caso di variazioni (ad esempio trasferimento o cessazione di personale).", + "importante": true, + "essenziale": true + }, + { + "index": "4", + "text": "Nel rispetto delle politiche di cui alla misura GV.PO-01, sono adottate e documentate le procedure in relazione ai punti 1, 2 e 3.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "PR.AA-03", + "function_code": "PROTECT", + "function_name": "Protezione", + "category_code": "PR.AA", + "category_title": "Gestione delle identità, autenticazione e controllo degli accessi", + "title": "Utenti, servizi e hardware sono autenticati.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Le modalità di autenticazione delle utenze per accedere ai sistemi informativi e di rete sono commisurate al rischio. A tal fine sono valutati almeno i rischi connessi: a) ai privilegi delle utenze; b) alla criticità dei sistemi informativi e di rete; c) alla tipologia di operazioni che le utenze possono effettuare sui sistemi informativi e di rete.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Per almeno i sistemi informativi e di rete rilevanti e in accordo agli esiti della valutazione del rischio di cui alla misura ID.RA-05, sono impiegate modalità di autenticazione multifattore.", + "importante": true, + "essenziale": true + }, + { + "index": "3", + "text": "Nel rispetto delle politiche di cui alla misura GV.PO-01, sono adottate e documentate le procedure in relazione ai punti 1 e 2.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "PR.AA-05", + "function_code": "PROTECT", + "function_name": "Protezione", + "category_code": "PR.AA", + "category_title": "Gestione delle identità, autenticazione e controllo degli accessi", + "title": "I permessi, i diritti e le autorizzazioni di accesso sono definiti in una politica, gestiti, applicati e rivisti e incorporano i principi del minimo privilegio e della separazione dei compiti.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "I permessi sono assegnati alle utenze in accordo ai principi del minimo privilegio e della separazione delle funzioni, tenuto anche conto della necessità di conoscere (need to know).", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "È assicurata la completa distinzione tra utenze con e senza privilegi amministrativi degli amministratori di sistema alle quali debbono corrispondere credenziali diverse.", + "importante": true, + "essenziale": true + }, + { + "index": "3", + "text": "Nel rispetto delle politiche di cui alla misura GV.PO-01, sono adottate e documentate le procedure in relazione ai punti 1e 2.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "PR.AA-06", + "function_code": "PROTECT", + "function_name": "Protezione", + "category_code": "PR.AA", + "category_title": "Gestione delle identità, autenticazione e controllo degli accessi", + "title": "L'accesso fisico agli asset è gestito, monitorato e applicato in misura appropriata al rischio.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Per almeno i sistemi informativi e di rete rilevanti, l’accesso fisico è protetto.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Nel rispetto delle politiche di cui alla misura GV.PO-01, sono adottate e documentate le procedure in relazione al punto 1.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "PR.AT-01", + "function_code": "PROTECT", + "function_name": "Protezione", + "category_code": "PR.AT", + "category_title": "Consapevolezza e formazione", + "title": "Il personale è sensibilizzato e formato in modo da possedere le conoscenze e le competenze per svolgere compiti di carattere generale tenendo conto dei rischi di cybersecurity.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "È definito, attuato, aggiornato e documentato un piano di formazione in materia di sicurezza informatica del personale, ivi inclusi gli organi di amministrazione e direttivi, che comprende almeno: a) la pianificazione delle attività di formazione previste con l’indicazione dei contenuti della formazione fornita; b) le eventuali modalità di verifica dell'acquisizione dei contenuti.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Il piano di formazione di cui al punto 1 è approvato dagli organi di amministrazione e direttivi.", + "importante": true, + "essenziale": true + }, + { + "index": "3", + "text": "È mantenuto un registro aggiornato recante l'elenco dei dipendenti che hanno ricevuto la formazione di cui al punto 1, i relativi contenuti e l'elenco delle verifiche svolte laddove previste.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "PR.AT-02", + "function_code": "PROTECT", + "function_name": "Protezione", + "category_code": "PR.AT", + "category_title": "Consapevolezza e formazione", + "title": "Gli individui che ricoprono ruoli specializzati sono sensibilizzati e formati in modo da possedere le conoscenze e le competenze per svolgere i pertinenti compiti tenendo conto dei rischi di cybersecurity.", + "applies_importante": false, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Il piano di cui alla misura PR.AT-01 prevede una formazione dedicata al personale con ruoli specializzati, ossia che richiedono una serie di capacità e competenze attinenti alla sicurezza, ivi compresi gli amministratori di sistema, che comprende almeno: a) le istruzioni relative alla configurazione e al funzionamento sicuri dei sistemi informativi e di rete; b) le informazioni sulle minacce informatiche note; c) le istruzioni sul comportamento da tenere in caso di eventi rilevanti per la sicurezza.", + "importante": false, + "essenziale": true + }, + { + "index": "2", + "text": "È mantenuto un registro aggiornato recante l'elenco dei dipendenti che hanno ricevuto la formazione di cui al punto 1, i relativi contenuti e l'elenco delle verifiche svolte laddove previste.", + "importante": false, + "essenziale": true + } + ] + }, + { + "code": "PR.DS-01", + "function_code": "PROTECT", + "function_name": "Protezione", + "category_code": "PR.DS", + "category_title": "Sicurezza dei dati", + "title": "La riservatezza, l'integrità e la disponibilità dei dati a riposo (data-at-rest) sono protette.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Per almeno i sistemi informativi e di rete rilevanti e in accordo agli esiti della valutazione del rischio di cui alla misura ID.RA-05, fatte salve motivate e documentate ragioni normative o tecniche, i dati memorizzati sui dispositivi portatili, ivi inclusi laptop, smartphone e tablet, e sui supporti removibili, sono cifrati con protocolli e algoritmi allo stato dell’arte e considerati sicuri.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Fatte salve e documentate ragioni normative o tecniche, è disabilitata l'auto esecuzione dei supporti rimovibili ed è effettuata la loro scansione al fine di rilevare codici malevoli prima che siano utilizzati nei sistemi informativi e di rete.", + "importante": true, + "essenziale": true + }, + { + "index": "3", + "text": "Nel rispetto delle politiche di cui alla misura GV.PO-01, sono adottate e documentate le procedure in relazione ai punti 1 e 2.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "PR.DS-02", + "function_code": "PROTECT", + "function_name": "Protezione", + "category_code": "PR.DS", + "category_title": "Sicurezza dei dati", + "title": "La riservatezza, l'integrità e la disponibilità dei dati in transito (data-in-transit) sono protette.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Per almeno i sistemi informativi e di rete rilevanti, ivi inclusi quelli di comunicazione vocale, video e testuale, e in accordo agli esiti della valutazione del rischio di cui alla misura ID.RA-05 fatte salve motivate e documentate ragioni normative o tecniche, sono utilizzati, per la trasmissione dei dati da e verso l’esterno del soggetto NIS, protocolli e algoritmi di cifratura allo stato dell’arte e considerati sicuri.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Nel rispetto delle politiche di cui alla misura GV.PO-01, sono adottate e documentate le procedure in relazione al punto 1.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "PR.DS-11", + "function_code": "PROTECT", + "function_name": "Protezione", + "category_code": "PR.DS", + "category_title": "Sicurezza dei dati", + "title": "I backup dei dati sono creati, protetti, mantenuti e verificati.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "In accordo alle esigenze di continuità operativa e di ripristino in caso di disastro individuate nei piani di cui alla misura ID.IM-04, sono effettuati periodicamente i backup dei dati e delle configurazioni e, per almeno i sistemi informativi e di rete rilevanti, sono anche conservate copie di backup offline.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Nel rispetto delle politiche di cui alla misura GV.PO-01, sono adottate e documentate le procedure in relazione al punto 1.", + "importante": true, + "essenziale": true + }, + { + "index": "3", + "text": "Per almeno i sistemi informativi e di rete rilevanti, è assicurata la riservatezza e l’integrità delle informazioni contenute nei backup mediante adeguata protezione fisica dei supporti ovvero mediante cifratura.", + "importante": false, + "essenziale": true + }, + { + "index": "4", + "text": "Per almeno i sistemi informativi e di rete rilevanti, è verificata periodicamente l'utilizzabilità dei backup effettuati mediante test di ripristino.", + "importante": false, + "essenziale": true + }, + { + "index": "5", + "text": "Nel rispetto delle politiche di cui alla misura GV.PO-01, sono adottate e documentate le procedure in relazione ai punti 3 e 4.", + "importante": false, + "essenziale": true + } + ] + }, + { + "code": "PR.IR-01", + "function_code": "PROTECT", + "function_name": "Protezione", + "category_code": "PR.IR", + "category_title": "Resilienza dell'infrastruttura tecnologica", + "title": "Le reti e gli ambienti sono protetti dall'accesso logico e dall'uso non autorizzati.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Per almeno i sistemi informativi e di rete rilevanti, sono definite e documentate le eventuali attività consentite da remoto e implementate adeguate misure di sicurezza per l’accesso.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "È mantenuto un elenco aggiornato dei sistemi informativi e di rete ai quali è possibile accedere da remoto con la descrizione delle relative modalità di accesso.", + "importante": true, + "essenziale": true + }, + { + "index": "3", + "text": "Sono presenti, aggiornati, mantenuti e configurati i sistemi perimetrali, quali firewall.", + "importante": true, + "essenziale": true + }, + { + "index": "4", + "text": "Nel rispetto delle politiche di cui alla misura GV.PO-01, sono adottate e documentate le procedure in relazione ai punti 1, 2 e 3.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "PR.IR-03", + "function_code": "PROTECT", + "function_name": "Protezione", + "category_code": "PR.IR", + "category_title": "Resilienza dell'infrastruttura tecnologica", + "title": "Sono implementati meccanismi per soddisfare i requisiti di resilienza in situazioni normali e avverse.", + "applies_importante": false, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "In accordo agli esiti della valutazione del rischio di cui alla misura ID.RA-05, sono utilizzati sistemi di comunicazione di emergenza protetti.", + "importante": false, + "essenziale": true + }, + { + "index": "2", + "text": "Nel rispetto delle politiche di cui alla misura GV.PO-01, sono adottate e documentate le procedure in relazione al punto 1.", + "importante": false, + "essenziale": true + } + ] + }, + { + "code": "PR.PS-01", + "function_code": "PROTECT", + "function_name": "Protezione", + "category_code": "PR.PS", + "category_title": "Sicurezza delle piattaforme", + "title": "Sono stabilite e applicate pratiche di gestione della configurazione.", + "applies_importante": false, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Per almeno i sistemi informativi e di rete rilevanti, sono definite, e documentate in un elenco aggiornato, le loro configurazioni di riferimento sicure (hardened).", + "importante": false, + "essenziale": true + }, + { + "index": "2", + "text": "Nel rispetto delle politiche di cui alla misura GV.PO-01, sono adottate e documentate le procedure in relazione al punto 1.", + "importante": false, + "essenziale": true + } + ] + }, + { + "code": "PR.PS-02", + "function_code": "PROTECT", + "function_name": "Protezione", + "category_code": "PR.PS", + "category_title": "Sicurezza delle piattaforme", + "title": "Il software è mantenuto, sostituito e rimosso in base al rischio.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Fatte salve motivate e documentate ragioni normative o tecniche, è installato esclusivamente software, ivi compresi i sistemi operativi, per il quale è garantita la disponibilità di aggiornamenti di sicurezza.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Fatte salve motivate e documentate ragioni normative o tecniche, sono installati, senza ingiustificato ritardo, gli ultimi aggiornamenti di sicurezza rilasciati dal produttore in coerenza con il piano di gestione delle vulnerabilità di cui alla misura ID.RA-08.", + "importante": true, + "essenziale": true + }, + { + "index": "3", + "text": "Nel rispetto delle politiche di cui alla misura GV.PO-01, sono adottate e documentate le procedure in relazione ai punti 1e 2.", + "importante": true, + "essenziale": true + }, + { + "index": "4", + "text": "Fatte salve motivate e documentate ragioni normative o tecniche e in accordo agli esiti della valutazione del rischio di cui alla misura ID.RA-05, l’aggiornamento del software ritenuto critico è verificato in ambiente di test prima dell’effettivo impiego in ambiente operativo.", + "importante": false, + "essenziale": true + }, + { + "index": "5", + "text": "Nel rispetto delle politiche di cui alla misura GV.PO-01, sono adottate e documentate le procedure in relazione al punto 4.", + "importante": false, + "essenziale": true + } + ] + }, + { + "code": "PR.PS-03", + "function_code": "PROTECT", + "function_name": "Protezione", + "category_code": "PR.PS", + "category_title": "Sicurezza delle piattaforme", + "title": "L'hardware è mantenuto, sostituito e rimosso in base al rischio.", + "applies_importante": false, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Per almeno i sistemi informativi e di rete rilevanti, sono adottate e documentate procedure per il trasferimento fisico e la dismissione di dispositivi atti alla memorizzazione di dati in modo sicuro.", + "importante": false, + "essenziale": true + }, + { + "index": "2", + "text": "Per almeno i sistemi informativi e di rete rilevanti, sono mantenuti uno o più registri delle manutenzioni effettuate sull'hardware.", + "importante": false, + "essenziale": true + } + ] + }, + { + "code": "PR.PS-04", + "function_code": "PROTECT", + "function_name": "Protezione", + "category_code": "PR.PS", + "category_title": "Sicurezza delle piattaforme", + "title": "I registri di log sono generati e resi disponibili per il monitoraggio continuo.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Tutti gli accessi eseguiti da remoto e quelli effettuati con utenze con privilegi amministrativi sono registrati.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Per almeno i sistemi informativi e di rete rilevanti, sono conservati in modo sicuro, e possibilmente centralizzato, almeno i log necessari ai fini del monitoraggio degli eventi di sicurezza, ivi compresi quelli relativi agli accessi di cui al punto 1.", + "importante": true, + "essenziale": true + }, + { + "index": "3", + "text": "In accordo agli esiti della valutazione rischio di cui alla misura ID.RA-05, sono definite e documentate le tempistiche di conservazione dei log di cui al punto 2.", + "importante": true, + "essenziale": true + }, + { + "index": "4", + "text": "Nel rispetto delle politiche di cui alla misura GV.PO-01, sono adottate e documentate le procedure in relazione ai punti 1 e 2.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "PR.PS-06", + "function_code": "PROTECT", + "function_name": "Protezione", + "category_code": "PR.PS", + "category_title": "Sicurezza delle piattaforme", + "title": "Le pratiche di sviluppo sicuro del software sono integrate e le loro prestazioni sono monitorate durante l'intero ciclo di vita del software.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Sono adottate e documentate pratiche di sviluppo sicuro del codice nello sviluppo del software.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "DE.CM-01", + "function_code": "DETECT", + "function_name": "Rilevamento", + "category_code": "DE.CM", + "category_title": "Monitoraggio continuo", + "title": "Le reti e i servizi di rete sono monitorati per individuare eventi potenzialmente avversi.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Per almeno i sistemi informativi e di rete rilevanti, sono presenti, aggiornati, mantenuti e configurati in modo adeguato strumenti tecnici per rilevare tempestivamente gli incidenti significativi.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Sono definiti e documentati i livelli di servizio attesi (SL) dei servizi e delle attività del soggetto NIS anche ai fini di rilevare tempestivamente gli incidenti significativi.", + "importante": true, + "essenziale": true + }, + { + "index": "3", + "text": "Nel rispetto delle politiche di cui alla misura GV.PO-01, sono adottate e documentate le procedure in relazione ai punti 1 e 2.", + "importante": true, + "essenziale": true + }, + { + "index": "4", + "text": "Per almeno i sistemi informativi e di rete rilevanti, sono utilizzati strumenti di analisi e filtraggio sul flusso di traffico in ingresso (ivi inclusa la posta elettronica).", + "importante": false, + "essenziale": true + }, + { + "index": "5", + "text": "Per almeno i sistemi informativi e di rete rilevanti, ai fini di cui al punto 1, sono monitorati gli accessi da remoto, le attività dei sistemi perimetrali (ad esempio router e firewall), gli eventi amministrativi di rilievo, nonché gli accessi eseguiti o falliti alle risorse di rete, alle postazioni terminali e agli applicativi al fine di rilevare gli eventi di sicurezza informatica.", + "importante": false, + "essenziale": true + }, + { + "index": "6", + "text": "Per almeno i sistemi informativi e di rete rilevanti, ai fini di cui al punto 1, sono definiti, monitorati e documentati parametri quali-quantitativi per rilevare gli accessi non autorizzati o con abuso dei privilegi concessi.", + "importante": false, + "essenziale": true + }, + { + "index": "7", + "text": "Nel rispetto delle politiche di cui alla misura GV.PO-01, sono adottate e documentate le procedure in relazione ai punti 4, 5 e 6.", + "importante": false, + "essenziale": true + } + ] + }, + { + "code": "DE.CM-09", + "function_code": "DETECT", + "function_name": "Rilevamento", + "category_code": "DE.CM", + "category_title": "Monitoraggio continuo", + "title": "L'hardware e il software di elaborazione, gli ambienti di runtime e i loro dati sono monitorati per individuare eventi potenzialmente avversi.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Fatte salve motivate e documentate ragioni normative o tecniche, sono presenti, aggiornati, mantenuti e configurati in modo adeguato, sistemi di protezione delle postazioni terminali per il rilevamento del codice malevolo.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Nel rispetto delle politiche di cui alla misura GV.PO-01, sono adottate e documentate le procedure in relazione al punto 1.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "RS.CO-02", + "function_code": "RESPOND", + "function_name": "Risposta", + "category_code": "RS.CO", + "category_title": "Segnalazione e comunicazione della risposta agli incidenti", + "title": "Gli stakeholder interni ed esterni sono informati degli incidenti.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "In accordo al piano per la gestione degli incidenti di cui alla misura RS.MA-01, sono documentate e adottate procedure per comunicare senza ingiustificato ritardo, se ritenuto opportuno e qualora possibile, sentito il CSIRT Italia, ovvero qualora intimato dall’Agenzia per la cybersicurezza nazionale ai sensi dell’articolo 37, comma 3, lettere g) e h), del decreto NIS: a) ai destinatari dei loro servizi, gli incidenti significativi che possono ripercuotersi negativamente sulla fornitura di tali servizi; b) ai destinatari dei servizi che sono potenzialmente interessati da una minaccia informatica significativa, le misure o azioni correttive o di mitigazione che tali destinatari possono adottare in risposta a tale minaccia e la natura di tale minaccia.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Sono documentate e adottate procedure per informare il pubblico sugli incidenti occorsi, qualora intimato dall’Agenzia per la cybersicurezza nazionale ai sensi dell’art. 37, comma 3, lettera i) del decreto NIS.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "RS.MA-01", + "function_code": "RESPOND", + "function_name": "Risposta", + "category_code": "RS.MA", + "category_title": "Gestione degli incidenti", + "title": "Il piano di risposta agli incidenti è eseguito in coordinamento con le terze parti interessate una volta dichiarato un incidente.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "È definito, attuato, aggiornato e documentato un piano per la gestione degli incidenti di sicurezza informatica e la notifica al CSIRT Italia, in accordo a quanto previsto dall’articolo 25 del decreto NIS, che comprende almeno: a) le fasi e le procedure di gestione e notifica degli incidenti con l’indicazione dei relativi ruoli e delle responsabilità; b) le procedure per la predisposizione e la trasmissione delle relazioni di cui all’articolo 25, comma 5, lettere c), d) ed e) del decreto NIS; c) le informazioni di contatto per la segnalazione degli incidenti; d) le modalità di comunicazione interna, anche con riguardo al coinvolgimento degli organi di amministrazione e direttivi, ed esterna; e) la reportistica da utilizzare per la documentazione dell’incidente.", + "importante": true, + "essenziale": true + }, + { + "index": "2", + "text": "Il piano di cui al punto 1 è approvato dagli organi di amministrazione e direttivi.", + "importante": true, + "essenziale": true + }, + { + "index": "3", + "text": "Il piano di cui al punto 1 è riesaminato e, se opportuno, aggiornato periodicamente e comunque almeno ogni due anni, nonché qualora si verifichino incidenti significativi, integrando le relative lezioni apprese, o mutamenti dell’esposizione alle minacce e ai relativi rischi.", + "importante": true, + "essenziale": true + } + ] + }, + { + "code": "RC.CO-03", + "function_code": "RECOVER", + "function_name": "Ripristino", + "category_code": "RC.CO", + "category_title": "Comunicazione sul ripristino dagli incidenti", + "title": "Le attività di ripristino e i progressi nel ripristino delle capacità operative sono comunicati agli stakeholder interni ed esterni designati.", + "applies_importante": false, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Sono adottate e documentate procedure per comunicare alle parti interne interessate, ivi incluse le articolazioni competenti del soggetto NIS, le attività di ripristino a seguito di un incidente.", + "importante": false, + "essenziale": true + } + ] + }, + { + "code": "RC.RP-01", + "function_code": "RECOVER", + "function_name": "Ripristino", + "category_code": "RC.RP", + "category_title": "Esecuzione del piano di ripristino dagli incidenti", + "title": "La parte del piano di risposta agli incidenti relativa al rispristino viene eseguita una volta avviata dal processo di risposta agli incidenti.", + "applies_importante": true, + "applies_essenziale": true, + "requirements": [ + { + "index": "1", + "text": "Nell'ambito del piano per la gestione degli incidenti di cui alla misura RS.MA-01, sono adottate e documentate procedure per il ripristino con riguardo almeno al ripristino del normale funzionamento dei sistemi informativi e di rete coinvolti da incidenti di sicurezza informatica, ivi compresi quelli di cui all’articolo 25 del decreto NIS.", + "importante": true, + "essenziale": true + } + ] + } + ] +} \ No newline at end of file diff --git a/docs/sql/036_acn_gap_assessment.sql b/docs/sql/036_acn_gap_assessment.sql new file mode 100644 index 0000000..00ab9f0 --- /dev/null +++ b/docs/sql/036_acn_gap_assessment.sql @@ -0,0 +1,76 @@ +-- ============================================================================ +-- Migration 036 - Gap Analysis ACN (Determinazione 164179/2025, Allegati 1 e 2) +-- ---------------------------------------------------------------------------- +-- Aggiunge l'assessment di conformita di SECONDO LIVELLO: non le 10 lettere +-- generiche dell'Art. 21 NIS2 (gia coperte da assessments/assessment_responses), +-- ma le MISURE e i REQUISITI puntuali della Determinazione ACN n. 164179/2025: +-- - soggetti IMPORTANTI (Allegato 1): 37 misure, 87 requisiti +-- - soggetti ESSENZIALI (Allegato 2): 43 misure, 116 requisiti (= 87 + 29) +-- +-- La codifica dei requisiti e IDENTICA per importanti ed essenziali (stessi +-- codici GV/ID/PR/DE/RS/RC); agli essenziali si aggiungono misure e punti. +-- L'app filtra i requisiti applicabili in base a organizations.entity_type. +-- +-- Fonte testi: application/data/acn_measures.json (estratto integrale dagli +-- Allegati ufficiali ACN). Nessuna tabella esistente modificata. +-- +-- IDEMPOTENTE: CREATE TABLE IF NOT EXISTS. Applicare su host MySQL +-- (mysql -h localhost nis2_agile_db), NON docker exec nis2-db. +-- STATO: APPLICATA su host 2026-06-01 (entrambe le tabelle verificate). +-- ============================================================================ + +-- Intestazione assessment ACN (una riga per ciclo di valutazione). +CREATE TABLE IF NOT EXISTS acn_assessments ( + id INT AUTO_INCREMENT PRIMARY KEY, + organization_id INT NOT NULL, + title VARCHAR(255) NOT NULL, + -- livello soggetto al momento della creazione: determina il perimetro + -- dei requisiti applicabili (importante=87, essenziale=116). + entity_level ENUM('important','essential') NOT NULL, + status ENUM('draft','in_progress','completed') DEFAULT 'draft', + -- punteggio complessivo 0-100 (media pesata requisiti applicabili) + overall_score DECIMAL(5,2) NULL, + -- punteggi per funzione FW (GOVERN/IDENTIFY/PROTECT/DETECT/RESPOND/RECOVER) JSON + function_scores JSON NULL, + -- conteggi sintetici: applicabili / conformi / parziali / non conformi / n.a. + stats JSON NULL, + ai_summary TEXT NULL, + ai_recommendations JSON NULL, + completed_by INT NULL, + completed_at DATETIME NULL, + created_by INT NULL, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE CASCADE, + FOREIGN KEY (completed_by) REFERENCES users(id) ON DELETE SET NULL, + FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL, + INDEX idx_acn_org (organization_id), + INDEX idx_acn_status (status) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- Risposta per singolo REQUISITO ACN (granularita: misura.punto). +CREATE TABLE IF NOT EXISTS acn_assessment_responses ( + id INT AUTO_INCREMENT PRIMARY KEY, + assessment_id INT NOT NULL, + organization_id INT NOT NULL, + -- chiave requisito: codice misura + indice punto, es. "GV.RR-04#4" + requirement_key VARCHAR(40) NOT NULL, + measure_code VARCHAR(20) NOT NULL, -- es. GV.RR-04 + requirement_index INT NOT NULL, -- es. 4 + function_code VARCHAR(12) NOT NULL, -- GOVERN/IDENTIFY/PROTECT/DETECT/RESPOND/RECOVER + category_code VARCHAR(12) NOT NULL, -- es. GV.RR + -- snapshot del testo requisito al momento della compilazione (immutabilita) + requirement_text TEXT NULL, + response_value ENUM('not_implemented','partial','implemented','not_applicable') NULL, + evidence_description TEXT NULL, + notes TEXT NULL, + answered_by INT NULL, + answered_at DATETIME NULL, + FOREIGN KEY (assessment_id) REFERENCES acn_assessments(id) ON DELETE CASCADE, + FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE CASCADE, + FOREIGN KEY (answered_by) REFERENCES users(id) ON DELETE SET NULL, + UNIQUE KEY uk_acn_assessment_req (assessment_id, requirement_key), + INDEX idx_acn_resp_assessment (assessment_id), + INDEX idx_acn_resp_measure (measure_code), + INDEX idx_acn_resp_function (function_code) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/public/index.php b/public/index.php index 9b17708..b03e140 100644 --- a/public/index.php +++ b/public/index.php @@ -87,6 +87,7 @@ $controllerMap = [ 'auth' => 'AuthController', 'organizations' => 'OrganizationController', 'assessments' => 'AssessmentController', + 'acn-gap' => 'AcnAssessmentController', // Gap Analysis ACN (Det. 164179/2025, misure/requisiti) 'dashboard' => 'DashboardController', 'risks' => 'RiskController', 'incidents' => 'IncidentController', @@ -203,6 +204,19 @@ $actionMap = [ 'POST:{id}/aiAnalyze' => 'aiAnalyze', ], + // ── AcnAssessmentController — Gap Analysis ACN (Determinazione 164179/2025) ── + 'acn-gap' => [ + 'GET:catalog' => 'catalog', + 'GET:list' => 'list', + 'POST:create' => 'create', + 'GET:{id}' => 'get', + 'GET:{id}/requirements' => 'getRequirements', + 'POST:{id}/respond' => 'saveResponse', + 'POST:{id}/complete' => 'complete', + 'GET:{id}/report' => 'getReport', + 'POST:{id}/aiAnalyze' => 'aiAnalyze', + ], + // ── DashboardController ───────────────────────── 'dashboard' => [ 'GET:overview' => 'overview',