Nuovo modulo guidato in 6 step (cl. 4-10 + Statement of Applicability): - migration 037 (isms_models/roles/soa/documents) + 038 (dataset 111 controlli: 93 Annex A:2022 + 7 CLD/27017 + 11 PII/27018) + runner scripts/migrate-isms.php - IsmsModelController (16 endpoint) registrato in index.php - SoA pre-popolato dalle risposte Gap Analysis NIS2 (mapping iso27001_control) - estensioni cloud condizionali 27017/27018 via flag uses_public_cloud/ is_cloud_provider/processes_pii_in_cloud - AIService::generateIsmsDocument + fonti ISO in nis2_sources.php - frontend isms.html/isms.js + api client + sidebar + help + i18n IT/EN - ingest KB ISO (scope SYSTEM, solo titoli/sintesi: no testo coperto da copyright) - version.json 1.14.0; doc studio + deploy handoff Strumento di supporto/pre-audit (non certificazione). Migration DA APPLICARE su host. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
21 KiB
Studio — Modulo "Modello Organizzativo ISO 27000 (SGSI)" + Onboarding PMI
Tipo: documento di studio e piano di implementazione (NO codice applicato). Data: 2026-06-11 — Autore: sessione Claude (devapp3) Stato: bozza in attesa di revisione utente prima di toccare codice. Decisioni utente (2026-06-11):
- Ambito = SGSI completo (clausole ISO/IEC 27001:2022 4–10 + Statement of Applicability)
- Deliverable corrente = questo documento di studio + piano (niente migration/controller finché non approvato)
- Percorso PMI = stesso wizard completo, con più guida e supporto AI (nessuna semplificazione dei contenuti normativi)
- Aggiornamento 2026-06-11: includere le estensioni cloud della famiglia 27000 nelle versioni attuali — ISO/IEC 27017:2015 (controlli sicurezza servizi cloud) e ISO/IEC 27018:2019 (protezione PII in cloud pubblico per PII processor), come estensioni condizionali del SoA (vedi §3.3bis e §4.2).
1. Obiettivo
Estendere NIS2 Agile con una procedura guidata (wizard) che accompagni l'azienda nella costruzione del proprio Sistema di Gestione della Sicurezza delle Informazioni (SGSI / ISMS) secondo ISO/IEC 27001:2022, riusando il più possibile i dati e i moduli già presenti per la compliance NIS2.
Il wizard deve produrre, a fine percorso, gli artefatti minimi di un SGSI:
- Ambito e contesto del SGSI (cl. 4)
- Policy SGSI + ruoli/responsabilità (cl. 5)
- Metodologia di risk assessment + obiettivi (cl. 6)
- Statement of Applicability (SoA) sui 93 controlli Annex A:2022 (cl. 6.1.3 d), estendibile con i controlli cloud ISO 27017:2015 e i controlli privacy-cloud ISO 27018:2019 quando pertinenti (vedi §3.3bis / §4.2)
- Documented information minima obbligatoria (cl. 7–8)
- Piano di monitoraggio, audit interni e miglioramento (cl. 9–10)
Famiglia ISO 27000 coperta (versioni attuali):
- ISO/IEC 27001:2022 — requisiti SGSI (base del wizard)
- ISO/IEC 27002:2022 — guida implementativa Annex A
- ISO/IEC 27017:2015 — estensione condizionale: controlli di sicurezza per servizi cloud (cliente e/o fornitore cloud)
- ISO/IEC 27018:2019 — estensione condizionale: protezione dei PII in cloud pubblico per chi agisce da PII processor (ponte verso GDPR)
Per le PMI, lo stesso percorso resta integrale ma viene arricchito di guida contestuale, esempi e bozze AI dimensionate alla realtà di una piccola/media impresa (vedi §8).
2. Stato dell'arte — cosa esiste già (riuso, non riscrittura)
Il prodotto contiene già un ponte significativo NIS2 ↔ ISO 27001. Riuso previsto:
| Componente esistente | File / Tabella | Come lo riuso |
|---|---|---|
| ENUM framework controlli | compliance_controls.framework = nis2 | iso27001 | both |
La tabella regge nativamente i controlli ISO: i record SoA finiscono qui con framework='iso27001' |
| Mapping per-domanda | application/data/nis2_questionnaire.json → ogni domanda ha iso27001_control (es. A.5.1); ogni categoria ha iso27001_controls[] |
Pre-popolazione del SoA dalle risposte NIS2 già date |
| Matrice articoli→ISO | AuditController::iso27001Mapping (NIS2 Art.21.2.a–j → Annex A) |
Base per derivare lo stato iniziale dei controlli |
| Modulo Risk | RiskController, risk register, matrice 5×5, AI suggest |
Clausola 6 (risk assessment & treatment) — si aggancia, non si riscrive |
| Audit + NCR/CAPA | AuditController, non_conformities, corrective_actions |
Clausole 9–10 (audit interni, riesame, miglioramento) |
| AI | AIService (gap, policy gen) + vincolo fonti certe application/config/nis2_sources.php |
Bozze policy/SoA con citazione fonte (da estendere a ISO 27002) |
| KB / RAG | KnowledgeBaseController, RagService, Qdrant nis2_kb |
Ingest testo ISO 27001/27002 scope SYSTEM per la guida contestuale |
| Audit chain | AuditService hash-chain SHA-256 |
Tracciamento immutabile di ogni step del wizard SGSI |
| Multi-tenancy | organization_id su ogni tabella + requireOrgAccess() |
Stesso isolamento per i nuovi dati SGSI |
| Pattern onboarding | OnboardingController::initializeComplianceControls() (13 controlli NIS2 a setup org) |
Pattern speculare per inizializzare il SoA ISO |
Gap attuale: i 93 controlli Annex A:2022 non sono seedati (oggi a onboarding nascono solo i 13 control-code NIS2). Vanno introdotti come dataset di riferimento.
3. Architettura proposta (additiva, zero breaking change)
Stesso stack: PHP 8.4 vanilla, Front Controller, PDO singleton, JWT multi-tenant, frontend HTML/JS vanilla. Nessun rebuild Docker (edit live .php/.html + kill -USR2 1). Migration da eseguire sull'host MySQL (mysql -h localhost), coerente con la topologia DB documentata (l'app HTTP fpm parla con l'host via socket).
3.1 Nuove tabelle (migration 037_isms_model.sql → eventualmente 038)
Convenzioni del repo: ALTER/CREATE idempotenti via check su
information_schema(noIF NOT EXISTSsu ADD COLUMN in MySQL 8.0). NienteDELIMITERvia pipe.
-
isms_models— un SGSI per organizationid, organization_id, status (draft/active/under_review), scope_statement TEXT, context_internal TEXT, context_external TEXT, interested_parties JSON, boundaries TEXT, exclusions TEXT, risk_methodology TEXT, isms_objectives JSON, version, created_at, updated_at, approved_by, approved_at -
isms_roles— ruoli e responsabilità (RACI SGSI), cl. 5.3id, isms_model_id, role_name, user_id NULL, responsibility TEXT, raci ENUM(R,A,C,I), created_at -
iso27001_annex_controls— dataset di riferimento dei controlli (globale, non per-org)control_code (A.5.1…A.8.34, CLD.*, PII.*), standard ENUM(iso27001/iso27017/iso27018), theme, title_it, title_en, purpose_it, iso27002_ref, condition_tag NULL— seedato da migration. La colonnastandarddistingue i 93 controlli Annex A:2022 dai controlli aggiuntivi cloud (27017) e privacy-cloud (27018);condition_tagsegna se un controllo è condizionale (es.cloud_customer,cloud_provider,pii_processor). -
isms_soa— Statement of Applicability per org (il cuore)id, isms_model_id, control_code, applicable BOOL, justification_inclusion TEXT, justification_exclusion TEXT, implementation_status (not_started/in_progress/implemented/verified), implementation_pct, derived_from_nis2 BOOL, linked_control_id (→compliance_controls), updated_by, updated_at -
isms_documents— documented information minima (cl. 7.5), bozze AIid, isms_model_id, doc_type, title, status (draft/review/approved), ai_generated BOOL, body_html LONGTEXT, version, linked_policy_id NULL
(Il monitoraggio/audit interni cl. 9–10 non crea tabelle nuove: si appoggia ad AuditController + non_conformities/corrective_actions esistenti, con un isms_model_id opzionale come tag.)
3.2 Nuovo controller — IsmsModelController.php
Registrato in public/index.php (controllerMap + actionMap), pattern identico agli altri controller. Endpoint additivi:
| Metodo | Endpoint | Scopo |
|---|---|---|
| GET | /api/isms/model |
SGSI dell'org corrente (o 404 → wizard da iniziare) |
| POST | /api/isms/model |
Crea/inizializza SGSI (scope, contesto) — cl. 4 |
| PUT | /api/isms/model |
Salva step (leadership, risk methodology, objectives) |
| GET | /api/isms/annex-controls |
I 93 controlli di riferimento (per il SoA) |
| GET | /api/isms/soa |
SoA dell'org, pre-popolato dal NIS2 al primo accesso |
| PUT | /api/isms/soa/{code} |
Aggiorna applicabilità + motivazione + stato di un controllo |
| POST | /api/isms/soa/derive |
(Ri)deriva lo stato iniziale del SoA dalle risposte NIS2 |
| GET | /api/isms/documents / POST / PUT |
Documented information + bozze |
| POST | /api/isms/documents/ai-generate |
Genera bozza policy/procedura via AIService |
| GET | /api/isms/readiness |
% completamento SGSI + checklist clausole 4–10 |
| GET | /api/isms/export |
Export SGSI completo (HTML stampabile / SoA CSV) |
3.3 Frontend
public/isms.html— wizard a 6 step (strutturaassessment.html:app-layout→sidebar+main-content), stepper in alto, salvataggio per step.public/js/isms.js— handler wizard via clientapi.js, auto-detect ruolo/firm da/api/auth/me.- Voce sidebar "Modello Organizzativo (SGSI)" in sezione Gestione di
common.js(icona scudo/organigramma). - Aggiornare
help.js(help contestuale IT/EN) e KB AI come da regola progetto.
3.3bis Estensioni cloud — ISO 27017:2015 e ISO 27018:2019
Le due norme non sono SGSI a sé: sono code of practice che estendono i controlli 27002. Nel modulo diventano set di controlli aggiuntivi e condizionali dentro lo stesso SoA, attivati in base al profilo dell'org raccolto allo Step 1.
ISO/IEC 27017:2015 — servizi cloud. Fornisce guida cloud-specifica su ~37 controlli 27002 + 7 controlli aggiuntivi CLD.*:
CLD.6.3.1— Ruoli e responsabilità condivisi in ambiente cloudCLD.8.1.5— Rimozione degli asset del cliente cloud (a fine contratto)CLD.9.5.1— Segregazione negli ambienti di virtual computingCLD.9.5.2— Hardening delle virtual machineCLD.12.1.5— Sicurezza operativa dell'amministratoreCLD.12.4.5— Monitoraggio dei servizi cloudCLD.13.1.4— Allineamento sicurezza reti virtuali e fisiche
Si applicano sia al cliente cloud sia al fornitore cloud (alcuni hanno responsabilità diverse per ruolo → si usa raci/condition_tag).
⚠️ Numerazione: 27017:2015 è scritta sul 27002:2013 (vecchia numerazione, es.
CLD.9.5.x). Il modulo è su Annex A:2022. Va mantenuto un cross-reference 2013↔2022 nel dataset (iso27002_ref) per non confondere l'utente. Nessuna revisione 2022 di 27017 esiste a oggi → resta27017:2015.
ISO/IEC 27018:2019 — PII in cloud pubblico (PII processor). Aumenta i controlli 27002 con guida per la protezione dei dati personali e aggiunge un set di controlli (Annex A della 27018) organizzati sui principi privacy ISO 29100 (consenso/scelta, limitazione finalità, minimizzazione, limitazione uso/conservazione/divulgazione, trasparenza, partecipazione dell'interessato, accountability, sicurezza, conformità privacy). Mappabili come PII.* nel dataset.
Ponte GDPR/NIS2: 27018 copre obblighi del responsabile del trattamento in cloud → si collega ai riferimenti GDPR già citati nel prodotto (es. Art.17 erasure, codice etico persona digitale) e rafforza il dominio NIS2 supply chain/cloud. Da NON spacciare come conformità GDPR automatica (disclaimer, vedi §7).
Attivazione condizionale (Step 1 del wizard): tre flag sul profilo SGSI —
uses_public_cloud (→ abilita 27017 lato cliente), is_cloud_provider (→ 27017 lato fornitore), processes_pii_in_cloud (→ 27018). I controlli CLD.*/PII.* entrano nel SoA solo se il relativo flag è attivo; altrimenti restano fuori (con motivazione di esclusione precompilata "non applicabile: l'org non eroga/usa servizi cloud / non tratta PII in cloud"). Segnali utili già disponibili per proporre i flag: settore, assets (asset di tipo cloud), modulo suppliers (fornitori cloud).
4. Il wizard SGSI — 6 step mappati alle clausole 27001:2022
| Step | Clausola | Cosa raccoglie | Riuso |
|---|---|---|---|
| 1. Contesto & Ambito | 4 | Perimetro, sedi, asset coperti, parti interessate, confini, esclusioni motivate | Asset module per il perimetro |
| 2. Leadership | 5 | Policy SGSI, organigramma sicurezza, ruoli/responsabilità (RACI), comitato | Tabella isms_roles; PolicyController per la policy |
| 3. Risk | 6 | Metodologia (es. ISO 27005), criteri, obiettivi SGSI misurabili | Aggancia RiskController esistente (no doppione del risk register) |
| 4. Statement of Applicability | 6.1.3 | I 93 controlli Annex A: applicabile sì/no + motivazione, pre-spuntati dal NIS2; + estensioni condizionali 27017 (cloud) e 27018 (PII-cloud) | iso27001_control del questionario + iso27001Mapping; flag cloud/PII (§3.3bis, §4.2) |
| 5. Documented Information | 7–8 | Policy/procedure obbligatorie, bozze AI, versioning | AIService::generatePolicy, isms_documents |
| 6. Monitoraggio & Miglioramento | 9–10 | Piano audit interni, riesame direzione, gestione NC | Aggancia Audit + NCR/CAPA esistenti |
4.1 Logica di pre-popolazione del SoA (valore chiave)
Al primo accesso al SoA (o via POST /api/isms/soa/derive):
- Per ogni controllo Annex A si guarda quali domande NIS2 hanno quel
iso27001_control. - Si aggrega lo stato delle risposte (
implemented/partial/not_implemented/not_applicable). - Si imposta una proposta iniziale:
applicable=true,implementation_statuseimplementation_pctderivati,derived_from_nis2=true, e una bozza dijustification_inclusioncitando l'articolo NIS2 di origine. - L'utente conferma/modifica. I controlli ISO senza corrispondenza NIS2 (es. parte di A.7 fisici) restano da compilare manualmente, evidenziati come "non coperti dall'assessment NIS2".
Questo trasforma un assessment NIS2 già fatto in una prima bozza di SoA pronta all'80%, che è il principale argomento di vendita del modulo.
4.2 SoA esteso con 27017/27018 (condizionale)
Lo Step 4 mostra il SoA stratificato per standard:
- Sezione base — 93 controlli Annex A:2022 (sempre).
- Sezione cloud (27017) — i 7
CLD.*+ i ~37 controlli 27002 con guida cloud, visibili solo seuses_public_cloudois_cloud_provider. Per ogni controllo: lente "cosa cambia in cloud" e distinzione responsabilità cliente vs fornitore. - Sezione PII-cloud (27018) — controlli
PII.*(principi 29100), visibili solo seprocesses_pii_in_cloud, con tag del principio privacy e link al riferimento GDPR pertinente.
isms_soa distingue le righe via il standard del controllo collegato. La derivazione automatica dal NIS2 (§4.1) copre la sezione base; le sezioni cloud/PII partono da bozze di motivazione AI (non hanno corrispondenza diretta nel questionario NIS2) e sono evidenziate come "da compilare — estensione cloud/privacy".
5. Integrazione AI (fonti certe)
- Estendere
application/config/nis2_sources.php(registry fonti certe) con i riferimenti ISO/IEC 27001:2022, 27002:2022, 27017:2015 e 27018:2019 così cheAIService::authoritativeSourcesBlock()possa citarli e vietare riferimenti inventati. Marcare 27017/27018 come code of practice (guida, non requisiti certificabili a sé). - Nuovi prompt:
- Motivazione SoA: data una scelta di applicabilità, genera/propone la
justification_inclusion/exclusion. - Bozza documented information: policy/procedura per un controllo o gruppo di controlli (riusa il pattern
generatePolicy). - Spiegazione clausola (guida contestuale, soprattutto PMI).
- Motivazione SoA: data una scelta di applicabilità, genera/propone la
- Ingest del testo ISO 27001/27002 in KB Qdrant
nis2_kbscope SYSTEM (pipelinescripts/ingest-*esistente) →askWithRag()risponde alle domande dell'utente durante il wizard.
⚠️ Il testo integrale ISO è coperto da copyright: ingestare parafrasi/sintesi proprietarie + riferimenti, non il testo letterale della norma. Da chiarire con l'utente (vedi §10).
6. Schema migrazioni — punto di partenza
Ultima migration presente: 036_acn_gap_assessment.sql. Le nuove partono da:
037_isms_model.sql—isms_models,isms_roles,isms_soa,isms_documents+ indici038_iso27001_annex_controls.sql— tabella di riferimento + seed dei 93 controlli Annex A:2022 (4 temi) + 7 controlliCLD.*ISO 27017:2015 + controlliPII.*ISO 27018:2019 (constandardecondition_tag); ALTERisms_modelsper i 3 flaguses_public_cloud/is_cloud_provider/processes_pii_in_cloud
Tutte additive, idempotenti, da girare sull'host MySQL.
7. Impatto e rischi
Impatto basso / additivo:
- Nessuna modifica a schema esistente se non un eventuale ALTER
compliance_controlsper linkare al SoA (valutare: forse non serve, si usaisms_soa.linked_control_id). - Nessun controller esistente toccato nella logica (solo registrazione del nuovo in
index.php). - Nessun rebuild Docker.
Rischi / attenzioni:
- Copyright ISO (vedi §5/§10) — non ingestare testo letterale.
- Volume dataset Annex A (93 controlli × bilingue) — lavoro di data-entry/curatela contenuti.
- Disallineamento mapping — il mapping NIS2→ISO è una guida, non una corrispondenza 1:1 certificabile: il SoA derivato è una bozza assistita, va dichiarato chiaramente nell'UI (disclaimer, come già fatto per gauge/bozze AI).
- Topologia DB — migration sull'host, non
docker exec nis2-db(path secondario non-prod). - Governance: ogni step va proposto e confermato; commit immediato post-smoke; push via host se cache token vuota.
8. Modello onboarding PMI (decisione: stesso percorso + più AI)
employee_count e annual_turnover_eur sono già raccolti a onboarding → si può rilevare automaticamente che l'org è una PMI e attivare un layer di assistenza, senza ridurre i contenuti:
- Guida contestuale potenziata: ogni step del wizard mostra spiegazione "cosa significa per una PMI", esempi concreti dimensionati, stima di effort.
- Bozze AI dimensionate: prompt arricchiti col contesto PMI (settore, dimensione, range dipendenti — già anonimizzato in
AIService) → policy/procedure realistiche e snelle ma complete. - Co-pilota conversazionale:
askWithRag()disponibile nel wizard per domande libere ("devo davvero fare l'audit interno?"). - Roadmap a fasi suggerita: stesso SoA completo, ma con priorità/sequenza proposta per non sovraccaricare (quick win prima), riusando la logica
quick_wins/compliance_roadmapgià prodotta dall'AI gap analysis. - Estensioni cloud per PMI: molte PMI usano SaaS/cloud pubblico ma non se ne rendono conto → l'AI, dai segnali (suppliers, asset), propone di attivare 27017/27018 spiegando in linguaggio semplice perché ("usi Microsoft 365/AWS → questi 7 controlli cloud ti riguardano").
- Nessun contenuto rimosso: i 93 controlli e le 6 clausole restano tutti; cambia solo il supporto, coerente con la scelta utente.
9. Roadmap di implementazione proposta (a fasi)
| Fase | Contenuto | Output verificabile |
|---|---|---|
| F0 — Dataset | Curatela + seed 93 controlli Annex A:2022 + 7 CLD.* (27017) + PII.* (27018) con cross-ref numerazione (038) + estensione nis2_sources.php |
Tabella popolata (3 standard), fonti ISO citabili |
| F1 — Backend SGSI | Migration 037, IsmsModelController, endpoint model/SoA + derive, registrazione index.php |
curl: crea modello, deriva SoA dal NIS2, legge readiness |
| F2 — Wizard frontend | isms.html + isms.js 6 step, voce sidebar, help.js |
Wizard navigabile end-to-end su org demo |
| F3 — AI & docs | Prompt SoA/policy, ai-generate, ingest KB ISO |
Bozza policy generata + risposta RAG nel wizard |
| F4 — PMI layer | Guida contestuale, co-pilota, roadmap a fasi | Org PMI demo: percorso completo con assistenza |
| F5 — Export & polish | Export SGSI HTML stampabile + SoA CSV, audit-chain tag, version.json bump | Documento SGSI esportabile |
Ogni fase: edit → kill -USR2 1 → smoke curl → commit → push (via host se serve). Test su org demo (id≤4 / %.demo%), reset con reset-demo.sql.
10. Decisioni aperte da chiarire con l'utente
- Copyright ISO: confermo l'approccio "sintesi/parafrasi proprietarie + riferimenti" per la KB e i titoli controlli? (necessario per non violare il copyright della norma)
- Versione Annex A: confermato 2022 (93 controlli, 4 temi)? (lo studio assume 2022; il questionario usa già codici
A.5.x/A.8.x2022) 2bis. Estensioni cloud: confermo le versioni attuali 27017:2015 e 27018:2019 (non esistono revisioni più recenti) e l'approccio a sezioni condizionali del SoA attivate dai 3 flag cloud/PII? Includo anche il cross-reference numerazione 27017 (2013→2022) nel dataset? - Posizionamento: il SGSI è un modulo a sé in sidebar, o un percorso che parte dalla pagina assessment esistente?
- Certificabilità: il modulo è di supporto/pre-audit (bozze assistite con disclaimer) — confermi che NON deve presentarsi come certificazione automatica?
- Mobile/multi-superficie: rilevante il tag
data-app-version/surface(std feedback-version-provenance) anche per le nuove pagine? (di default sì, additivo)
11. Riepilogo
Il modulo è realizzabile in larga parte per riuso: il dato più prezioso (mapping NIS2→ISO per domanda) è già nel prodotto e abilita un SoA pre-popolato all'80% da un assessment NIS2 esistente — il vero differenziatore. L'implementazione è additiva, non breaking, su pattern noti. Il percorso PMI è un layer di assistenza AI sopra lo stesso wizard completo.
Prossimo passo: revisione di questo studio + risposte alle decisioni aperte (§10) → poi avvio Fase F0/F1 mostrando i diff prima di qualsiasi commit.