[FEAT] Modello Organizzativo SGSI (ISO 27001/27017/27018) + SoA pre-popolato da NIS2

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>
This commit is contained in:
DevEnv nis2-agile
2026-06-11 11:32:42 +02:00
parent 66d50cd2cf
commit 3f74165531
17 changed files with 2166 additions and 1 deletions
+70
View File
@@ -0,0 +1,70 @@
# Deploy — Modulo Modello Organizzativo SGSI (ISO 27001) — v1.14.0
> Implementazione completata 2026-06-11. Tutto il **codice** (backend, frontend, help, i18n, AI, KB) è scritto e committato. I passi seguenti richiedono privilegi **host** (DB + docker) e vanno eseguiti su Hetzner.
## Cosa è stato realizzato (già nel repo, files live via bind-mount)
| Area | File |
|---|---|
| Migration schema | `docs/sql/037_isms_model.sql` (4 tabelle SGSI), `docs/sql/038_iso27001_annex_controls.sql` (dataset 111 controlli: 93 Annex A:2022 + 7 CLD/27017 + 11 PII/27018) |
| Runner migrazioni | `scripts/migrate-isms.php` |
| Backend | `application/controllers/IsmsModelController.php` (16 endpoint) + registrazione in `public/index.php` |
| AI | `application/services/AIService.php::generateIsmsDocument()` + fonti ISO in `application/config/nis2_sources.php` |
| Frontend | `public/isms.html`, `public/js/isms.js`, metodi `isms*` in `public/js/api.js`, voce sidebar in `public/js/common.js` |
| Help + i18n | topic `isms` in `public/js/help.js`, stringhe `isms.*`/`nav.isms` IT/EN in `public/js/i18n.js` |
| KB / RAG | `scripts/ingest-iso-sources.php` (catalogo controlli + fonti ISO, scope SYSTEM) |
| Versione | `public/version.json` → 1.14.0 |
## Passi di deploy (HOST Hetzner)
### 1. Applicare le migrazioni al DB di produzione
Il DB servito dall'app è il MySQL **host** (via socket), NON il container `nis2-db`. Usare il runner con la connessione dell'app:
```bash
docker exec nis2-app php /var/www/nis2-agile/scripts/migrate-isms.php
```
Atteso: `iso27001_annex_controls: 111 controlli` (iso27001:93, iso27017:7, iso27018:11) + 4 tabelle SGSI create. Idempotente (CREATE TABLE IF NOT EXISTS + INSERT IGNORE).
Alternativa SQL diretta:
```bash
mysql -h localhost nis2_agile_db < /var/www/nis2-agile/docs/sql/037_isms_model.sql
mysql -h localhost nis2_agile_db < /var/www/nis2-agile/docs/sql/038_iso27001_annex_controls.sql
```
### 2. Hot-reload PHP-FPM (opcache)
Dopo ogni edit `.php` il bytecode in cache va ricaricato:
```bash
docker exec nis2-app kill -USR2 1
```
(HTML/JS sono già live via nginx, non serve reload.)
### 3. Smoke test
```bash
# con un JWT valido + X-Organization-Id:
curl -s https://nis2.agile.software/api/isms/model -H "Authorization: Bearer <JWT>" -H "X-Organization-Id: <ORG>"
curl -s https://nis2.agile.software/api/isms/annex-controls -H "Authorization: Bearer <JWT>" -H "X-Organization-Id: <ORG>"
# UI: aprire https://nis2.agile.software/isms.html → step 1, salvare, andare al SoA (auto-derive dal NIS2)
```
Verifica chiave: con un assessment NIS2 esistente, `GET /api/isms/soa` deve restituire controlli con `derived_from_nis2=1` e uno stato pre-compilato.
### 4. (Opzionale) Ingest KB ISO per il grounding AI
Richiede Qdrant + Voyage attivi e migration 038 applicata:
```bash
docker exec nis2-app php /var/www/nis2-agile/scripts/ingest-iso-sources.php
# anteprima senza scrivere: aggiungere --dry-run
```
### 5. Push del codice (se non già fatto dal container)
Il container NIS2 è legacy: dopo reboot la git credential-cache è vuota. Se il push da devenv non funziona, chiedere all'host (helper vault):
> "NIS2 ha N commit su main da pushare, fallo tu dall'host"
## Note / vincoli rispettati
- **Additivo**: nessuna tabella esistente modificata; nessun controller esistente alterato nella logica (solo registrazione del nuovo).
- **Copyright ISO**: indicizzati solo titoli/sintesi proprietari + riferimenti, mai il testo letterale delle norme.
- **Disclaimer**: il modulo è strumento di supporto/pre-audit, non certificazione ISO; l'UI e l'AI lo dichiarano. Gli obblighi normativi italiani restano NIS2 / D.Lgs. 138/2024 / ACN.
- **27017:2015 / 27018:2019**: versioni attuali (nessuna revisione più recente). 27017 numerata su 27002:2013 → `iso27002_ref` conserva il cross-reference.
## Rollback
```sql
DROP TABLE IF EXISTS isms_soa, isms_roles, isms_documents, isms_models, iso27001_annex_controls;
```
+ rimuovere la riga `'isms'` da controllerMap/actionMap in `public/index.php`, USR2. Il frontend `isms.html` resta inerte senza backend.
@@ -0,0 +1,248 @@
# 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)**:
> 1. Ambito = **SGSI completo** (clausole ISO/IEC 27001:2022 4–10 + Statement of Applicability)
> 2. Deliverable corrente = **questo documento di studio + piano** (niente migration/controller finché non approvato)
> 3. Percorso PMI = **stesso wizard completo, con più guida e supporto AI** (nessuna semplificazione dei contenuti normativi)
> 4. **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` (no `IF NOT EXISTS` su ADD COLUMN in MySQL 8.0). Niente `DELIMITER` via pipe.
- **`isms_models`** — un SGSI per organization
`id, 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.3
`id, 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 colonna `standard` distingue i 93 controlli Annex A:2022 dai controlli aggiuntivi cloud (27017) e privacy-cloud (27018); `condition_tag` segna 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 AI
`id, 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 (struttura `assessment.html`: `app-layout` → `sidebar` + `main-content`), stepper in alto, salvataggio per step.
- **`public/js/isms.js`** — handler wizard via client `api.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 cloud
- `CLD.8.1.5` — Rimozione degli asset del cliente cloud (a fine contratto)
- `CLD.9.5.1` — Segregazione negli ambienti di virtual computing
- `CLD.9.5.2` — Hardening delle virtual machine
- `CLD.12.1.5` — Sicurezza operativa dell'amministratore
- `CLD.12.4.5` — Monitoraggio dei servizi cloud
- `CLD.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 → resta `27017: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`):
1. Per ogni controllo Annex A si guarda quali domande NIS2 hanno quel `iso27001_control`.
2. Si aggrega lo stato delle risposte (`implemented`/`partial`/`not_implemented`/`not_applicable`).
3. Si imposta una **proposta** iniziale: `applicable=true`, `implementation_status` e `implementation_pct` derivati, `derived_from_nis2=true`, e una bozza di `justification_inclusion` citando l'articolo NIS2 di origine.
4. 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**:
1. **Sezione base** — 93 controlli Annex A:2022 (sempre).
2. **Sezione cloud (27017)** — i 7 `CLD.*` + i ~37 controlli 27002 con guida cloud, visibili solo se `uses_public_cloud` o `is_cloud_provider`. Per ogni controllo: lente "cosa cambia in cloud" e distinzione responsabilità cliente vs fornitore.
3. **Sezione PII-cloud (27018)** — controlli `PII.*` (principi 29100), visibili solo se `processes_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ì che `AIService::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).
- Ingest del testo ISO 27001/27002 in KB Qdrant `nis2_kb` scope SYSTEM (pipeline `scripts/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` + indici
- `038_iso27001_annex_controls.sql` — tabella di riferimento + **seed dei 93 controlli Annex A:2022** (4 temi) + **7 controlli `CLD.*` ISO 27017:2015** + **controlli `PII.*` ISO 27018:2019** (con `standard` e `condition_tag`); ALTER `isms_models` per i 3 flag `uses_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_controls` per linkare al SoA (valutare: forse non serve, si usa `isms_soa.linked_control_id`).
- Nessun controller esistente toccato nella logica (solo registrazione del nuovo in `index.php`).
- Nessun rebuild Docker.
**Rischi / attenzioni:**
1. **Copyright ISO** (vedi §5/§10) — non ingestare testo letterale.
2. **Volume dataset Annex A** (93 controlli × bilingue) — lavoro di data-entry/curatela contenuti.
3. **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).
4. **Topologia DB** — migration sull'host, non `docker exec nis2-db` (path secondario non-prod).
5. **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_roadmap` già 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
1. **Copyright ISO**: confermo l'approccio "sintesi/parafrasi proprietarie + riferimenti" per la KB e i titoli controlli? (necessario per non violare il copyright della norma)
2. **Versione Annex A**: confermato **2022 (93 controlli, 4 temi)**? (lo studio assume 2022; il questionario usa già codici `A.5.x`/`A.8.x` 2022)
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?
3. **Posizionamento**: il SGSI è un modulo **a sé** in sidebar, o un percorso che parte dalla pagina assessment esistente?
4. **Certificabilità**: il modulo è di **supporto/pre-audit** (bozze assistite con disclaimer) — confermi che NON deve presentarsi come certificazione automatica?
5. **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.
+118
View File
@@ -0,0 +1,118 @@
-- ============================================================================
-- Migration 037 - Modello Organizzativo SGSI (ISO/IEC 27001:2022)
-- ----------------------------------------------------------------------------
-- Introduce il modulo "Modello Organizzativo" per costruire un Sistema di
-- Gestione della Sicurezza delle Informazioni (SGSI/ISMS) secondo
-- ISO/IEC 27001:2022 (clausole 4-10) + Statement of Applicability (SoA) sui
-- controlli Annex A:2022, estendibile con le norme cloud ISO/IEC 27017:2015
-- e ISO/IEC 27018:2019 (controlli condizionali).
--
-- Tutte ADDITIVE: nessuna tabella esistente modificata. Il SoA tiene un
-- riferimento "morbido" ai compliance_controls via linked_control_id (INT, no
-- FK) per non vincolare lo schema esistente.
--
-- Dataset di riferimento dei controlli (93 Annex A + 7 CLD + PII): vedi
-- migration 038_iso27001_annex_controls.sql.
--
-- IDEMPOTENTE: CREATE TABLE IF NOT EXISTS. Applicare su host MySQL
-- mysql -h localhost nis2_agile_db < 037_isms_model.sql
-- oppure tramite il runner con la connessione corretta dell'app:
-- docker exec nis2-app php scripts/migrate-isms.php
-- NON usare `docker exec nis2-db` (DB secondario non-prod).
-- STATO: DA APPLICARE su host.
-- ============================================================================
-- Intestazione del SGSI: una riga per organization (un SGSI attivo per org).
CREATE TABLE IF NOT EXISTS isms_models (
id INT AUTO_INCREMENT PRIMARY KEY,
organization_id INT NOT NULL,
status ENUM('draft','active','under_review') DEFAULT 'draft',
-- Clausola 4 - Contesto dell'organizzazione
scope_statement TEXT NULL,
context_internal TEXT NULL,
context_external TEXT NULL,
interested_parties JSON NULL,
boundaries TEXT NULL,
exclusions TEXT NULL,
-- Clausola 6 - Pianificazione (metodologia + obiettivi)
risk_methodology TEXT NULL,
isms_objectives JSON NULL,
-- Flag estensioni cloud (attivano controlli condizionali nel SoA)
uses_public_cloud TINYINT(1) DEFAULT 0, -- abilita ISO 27017 (lato cliente)
is_cloud_provider TINYINT(1) DEFAULT 0, -- abilita ISO 27017 (lato fornitore)
processes_pii_in_cloud TINYINT(1) DEFAULT 0, -- abilita ISO 27018 (PII processor)
version VARCHAR(20) DEFAULT '1.0',
created_by INT NULL,
approved_by INT NULL,
approved_at DATETIME 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 (created_by) REFERENCES users(id) ON DELETE SET NULL,
FOREIGN KEY (approved_by) REFERENCES users(id) ON DELETE SET NULL,
UNIQUE KEY uk_isms_org (organization_id),
INDEX idx_isms_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Ruoli e responsabilita SGSI (RACI) - clausola 5.3.
CREATE TABLE IF NOT EXISTS isms_roles (
id INT AUTO_INCREMENT PRIMARY KEY,
isms_model_id INT NOT NULL,
organization_id INT NOT NULL,
role_name VARCHAR(150) NOT NULL,
user_id INT NULL,
responsibility TEXT NULL,
raci ENUM('R','A','C','I') NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (isms_model_id) REFERENCES isms_models(id) ON DELETE CASCADE,
FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL,
INDEX idx_isms_roles_model (isms_model_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Statement of Applicability: una riga per controllo applicabile/escluso.
CREATE TABLE IF NOT EXISTS isms_soa (
id INT AUTO_INCREMENT PRIMARY KEY,
isms_model_id INT NOT NULL,
organization_id INT NOT NULL,
control_code VARCHAR(20) NOT NULL, -- es. A.5.1, CLD.9.5.1, PII.1
standard ENUM('iso27001','iso27017','iso27018') DEFAULT 'iso27001',
applicable TINYINT(1) DEFAULT 1,
justification_inclusion TEXT NULL,
justification_exclusion TEXT NULL,
implementation_status ENUM('not_started','in_progress','implemented','verified') DEFAULT 'not_started',
implementation_pct INT DEFAULT 0,
-- true se lo stato iniziale e stato DERIVATO dalle risposte NIS2 (assessment Art.21)
derived_from_nis2 TINYINT(1) DEFAULT 0,
source_ref VARCHAR(255) NULL, -- es. "NIS2 Art.21.2.a (ART21A_001)"
linked_control_id INT NULL, -- soft-link a compliance_controls.id (no FK)
updated_by INT NULL,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (isms_model_id) REFERENCES isms_models(id) ON DELETE CASCADE,
FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE CASCADE,
FOREIGN KEY (updated_by) REFERENCES users(id) ON DELETE SET NULL,
UNIQUE KEY uk_isms_soa_ctrl (isms_model_id, control_code),
INDEX idx_isms_soa_model (isms_model_id),
INDEX idx_isms_soa_standard (standard)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Documented information minima (clausola 7.5): policy/procedure, bozze AI.
CREATE TABLE IF NOT EXISTS isms_documents (
id INT AUTO_INCREMENT PRIMARY KEY,
isms_model_id INT NOT NULL,
organization_id INT NOT NULL,
doc_type VARCHAR(60) NOT NULL, -- es. policy_sgsi, procedura_incident, soa_export
title VARCHAR(255) NOT NULL,
status ENUM('draft','review','approved') DEFAULT 'draft',
ai_generated TINYINT(1) DEFAULT 0,
body_html LONGTEXT NULL,
version VARCHAR(20) DEFAULT '1.0',
linked_policy_id INT NULL, -- soft-link a policies.id (no FK)
created_by INT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (isms_model_id) REFERENCES isms_models(id) ON DELETE CASCADE,
FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE CASCADE,
FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL,
INDEX idx_isms_docs_model (isms_model_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+163
View File
@@ -0,0 +1,163 @@
-- ============================================================================
-- Migration 038 - Dataset di riferimento controlli ISO 27000 (per il SoA)
-- ----------------------------------------------------------------------------
-- Tabella GLOBALE (non per-org) dei controlli citabili nello Statement of
-- Applicability del modulo Modello Organizzativo SGSI (vedi 037):
-- - 93 controlli ISO/IEC 27001:2022 Annex A (4 temi)
-- - 7 controlli aggiuntivi cloud ISO/IEC 27017:2015 (CLD.*) - condizionali
-- - 11 controlli privacy-cloud ISO/IEC 27018:2019 (PII.*) - condizionali
--
-- I titoli ISO sono RIFORMULAZIONI proprietarie (IT/EN) a scopo di indice; il
-- testo integrale delle norme e coperto da copyright e NON e riprodotto.
-- 27017:2015 e numerata sul 27002:2013: iso27002_ref conserva il riferimento.
--
-- IDEMPOTENTE: CREATE TABLE IF NOT EXISTS + INSERT IGNORE (control_code UNIQUE).
-- Applicare su host MySQL (mysql -h localhost) o via scripts/migrate-isms.php.
-- STATO: DA APPLICARE su host.
-- ============================================================================
CREATE TABLE IF NOT EXISTS iso27001_annex_controls (
id INT AUTO_INCREMENT PRIMARY KEY,
control_code VARCHAR(20) NOT NULL,
standard ENUM('iso27001','iso27017','iso27018') DEFAULT 'iso27001',
theme VARCHAR(30) NOT NULL, -- organizational/people/physical/technological/privacy
sort_order INT NOT NULL DEFAULT 0,
title_it VARCHAR(255) NOT NULL,
title_en VARCHAR(255) NOT NULL,
purpose_it TEXT NULL,
iso27002_ref VARCHAR(120) NULL, -- per CLD.*: riferimento 27002:2013
condition_tag VARCHAR(40) NULL, -- NULL=sempre; cloud / pii_processor = condizionale
UNIQUE KEY uk_annex_code (control_code),
INDEX idx_annex_standard (standard),
INDEX idx_annex_theme (theme)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ── ISO/IEC 27001:2022 Annex A — A.5 Controlli organizzativi (37) ──
INSERT IGNORE INTO iso27001_annex_controls (control_code, standard, theme, sort_order, title_it, title_en) VALUES
('A.5.1','iso27001','organizational',501,'Politiche per la sicurezza delle informazioni','Policies for information security'),
('A.5.2','iso27001','organizational',502,'Ruoli e responsabilita per la sicurezza delle informazioni','Information security roles and responsibilities'),
('A.5.3','iso27001','organizational',503,'Separazione dei compiti','Segregation of duties'),
('A.5.4','iso27001','organizational',504,'Responsabilita della direzione','Management responsibilities'),
('A.5.5','iso27001','organizational',505,'Contatti con le autorita','Contact with authorities'),
('A.5.6','iso27001','organizational',506,'Contatti con gruppi di interesse specialistici','Contact with special interest groups'),
('A.5.7','iso27001','organizational',507,'Threat intelligence','Threat intelligence'),
('A.5.8','iso27001','organizational',508,'Sicurezza delle informazioni nella gestione dei progetti','Information security in project management'),
('A.5.9','iso27001','organizational',509,'Inventario delle informazioni e degli altri asset associati','Inventory of information and other associated assets'),
('A.5.10','iso27001','organizational',510,'Uso accettabile delle informazioni e degli altri asset associati','Acceptable use of information and other associated assets'),
('A.5.11','iso27001','organizational',511,'Restituzione degli asset','Return of assets'),
('A.5.12','iso27001','organizational',512,'Classificazione delle informazioni','Classification of information'),
('A.5.13','iso27001','organizational',513,'Etichettatura delle informazioni','Labelling of information'),
('A.5.14','iso27001','organizational',514,'Trasferimento delle informazioni','Information transfer'),
('A.5.15','iso27001','organizational',515,'Controllo degli accessi','Access control'),
('A.5.16','iso27001','organizational',516,'Gestione delle identita','Identity management'),
('A.5.17','iso27001','organizational',517,'Informazioni di autenticazione','Authentication information'),
('A.5.18','iso27001','organizational',518,'Diritti di accesso','Access rights'),
('A.5.19','iso27001','organizational',519,'Sicurezza delle informazioni nelle relazioni con i fornitori','Information security in supplier relationships'),
('A.5.20','iso27001','organizational',520,'Gestione della sicurezza delle informazioni negli accordi con i fornitori','Addressing information security within supplier agreements'),
('A.5.21','iso27001','organizational',521,'Gestione della sicurezza nella catena di fornitura ICT','Managing information security in the ICT supply chain'),
('A.5.22','iso27001','organizational',522,'Monitoraggio, riesame e gestione del cambiamento dei servizi dei fornitori','Monitoring, review and change management of supplier services'),
('A.5.23','iso27001','organizational',523,'Sicurezza delle informazioni nell''uso di servizi cloud','Information security for use of cloud services'),
('A.5.24','iso27001','organizational',524,'Pianificazione e preparazione della gestione degli incidenti','Information security incident management planning and preparation'),
('A.5.25','iso27001','organizational',525,'Valutazione e decisione sugli eventi di sicurezza delle informazioni','Assessment and decision on information security events'),
('A.5.26','iso27001','organizational',526,'Risposta agli incidenti di sicurezza delle informazioni','Response to information security incidents'),
('A.5.27','iso27001','organizational',527,'Apprendimento dagli incidenti di sicurezza delle informazioni','Learning from information security incidents'),
('A.5.28','iso27001','organizational',528,'Raccolta delle evidenze','Collection of evidence'),
('A.5.29','iso27001','organizational',529,'Sicurezza delle informazioni durante le interruzioni','Information security during disruption'),
('A.5.30','iso27001','organizational',530,'Prontezza ICT per la continuita operativa','ICT readiness for business continuity'),
('A.5.31','iso27001','organizational',531,'Requisiti legali, statutari, regolamentari e contrattuali','Legal, statutory, regulatory and contractual requirements'),
('A.5.32','iso27001','organizational',532,'Diritti di proprieta intellettuale','Intellectual property rights'),
('A.5.33','iso27001','organizational',533,'Protezione delle registrazioni','Protection of records'),
('A.5.34','iso27001','organizational',534,'Privacy e protezione dei dati personali (PII)','Privacy and protection of PII'),
('A.5.35','iso27001','organizational',535,'Riesame indipendente della sicurezza delle informazioni','Independent review of information security'),
('A.5.36','iso27001','organizational',536,'Conformita a politiche, regole e standard di sicurezza','Compliance with policies, rules and standards for information security'),
('A.5.37','iso27001','organizational',537,'Procedure operative documentate','Documented operating procedures');
-- ── A.6 Controlli relativi alle persone (8) ──
INSERT IGNORE INTO iso27001_annex_controls (control_code, standard, theme, sort_order, title_it, title_en) VALUES
('A.6.1','iso27001','people',601,'Screening','Screening'),
('A.6.2','iso27001','people',602,'Termini e condizioni di impiego','Terms and conditions of employment'),
('A.6.3','iso27001','people',603,'Consapevolezza, istruzione e formazione sulla sicurezza','Information security awareness, education and training'),
('A.6.4','iso27001','people',604,'Processo disciplinare','Disciplinary process'),
('A.6.5','iso27001','people',605,'Responsabilita dopo la cessazione o il cambio di impiego','Responsibilities after termination or change of employment'),
('A.6.6','iso27001','people',606,'Accordi di riservatezza o di non divulgazione','Confidentiality or non-disclosure agreements'),
('A.6.7','iso27001','people',607,'Lavoro da remoto','Remote working'),
('A.6.8','iso27001','people',608,'Segnalazione di eventi di sicurezza delle informazioni','Information security event reporting');
-- ── A.7 Controlli fisici (14) ──
INSERT IGNORE INTO iso27001_annex_controls (control_code, standard, theme, sort_order, title_it, title_en) VALUES
('A.7.1','iso27001','physical',701,'Perimetri di sicurezza fisica','Physical security perimeters'),
('A.7.2','iso27001','physical',702,'Accesso fisico','Physical entry'),
('A.7.3','iso27001','physical',703,'Messa in sicurezza di uffici, locali e strutture','Securing offices, rooms and facilities'),
('A.7.4','iso27001','physical',704,'Monitoraggio della sicurezza fisica','Physical security monitoring'),
('A.7.5','iso27001','physical',705,'Protezione da minacce fisiche e ambientali','Protecting against physical and environmental threats'),
('A.7.6','iso27001','physical',706,'Lavoro in aree sicure','Working in secure areas'),
('A.7.7','iso27001','physical',707,'Scrivania pulita e schermo pulito','Clear desk and clear screen'),
('A.7.8','iso27001','physical',708,'Posizionamento e protezione delle apparecchiature','Equipment siting and protection'),
('A.7.9','iso27001','physical',709,'Sicurezza degli asset fuori sede','Security of assets off-premises'),
('A.7.10','iso27001','physical',710,'Supporti di memorizzazione','Storage media'),
('A.7.11','iso27001','physical',711,'Servizi di supporto (utilities)','Supporting utilities'),
('A.7.12','iso27001','physical',712,'Sicurezza del cablaggio','Cabling security'),
('A.7.13','iso27001','physical',713,'Manutenzione delle apparecchiature','Equipment maintenance'),
('A.7.14','iso27001','physical',714,'Smaltimento sicuro o riutilizzo delle apparecchiature','Secure disposal or re-use of equipment');
-- ── A.8 Controlli tecnologici (34) ──
INSERT IGNORE INTO iso27001_annex_controls (control_code, standard, theme, sort_order, title_it, title_en) VALUES
('A.8.1','iso27001','technological',801,'Dispositivi endpoint degli utenti','User endpoint devices'),
('A.8.2','iso27001','technological',802,'Diritti di accesso privilegiati','Privileged access rights'),
('A.8.3','iso27001','technological',803,'Restrizione dell''accesso alle informazioni','Information access restriction'),
('A.8.4','iso27001','technological',804,'Accesso al codice sorgente','Access to source code'),
('A.8.5','iso27001','technological',805,'Autenticazione sicura','Secure authentication'),
('A.8.6','iso27001','technological',806,'Gestione della capacita','Capacity management'),
('A.8.7','iso27001','technological',807,'Protezione dal malware','Protection against malware'),
('A.8.8','iso27001','technological',808,'Gestione delle vulnerabilita tecniche','Management of technical vulnerabilities'),
('A.8.9','iso27001','technological',809,'Gestione della configurazione','Configuration management'),
('A.8.10','iso27001','technological',810,'Cancellazione delle informazioni','Information deletion'),
('A.8.11','iso27001','technological',811,'Mascheramento dei dati','Data masking'),
('A.8.12','iso27001','technological',812,'Prevenzione della fuga di dati','Data leakage prevention'),
('A.8.13','iso27001','technological',813,'Backup delle informazioni','Information backup'),
('A.8.14','iso27001','technological',814,'Ridondanza delle strutture di elaborazione','Redundancy of information processing facilities'),
('A.8.15','iso27001','technological',815,'Logging','Logging'),
('A.8.16','iso27001','technological',816,'Attivita di monitoraggio','Monitoring activities'),
('A.8.17','iso27001','technological',817,'Sincronizzazione degli orologi','Clock synchronization'),
('A.8.18','iso27001','technological',818,'Uso di programmi di utilita privilegiati','Use of privileged utility programs'),
('A.8.19','iso27001','technological',819,'Installazione del software sui sistemi operativi','Installation of software on operational systems'),
('A.8.20','iso27001','technological',820,'Sicurezza delle reti','Networks security'),
('A.8.21','iso27001','technological',821,'Sicurezza dei servizi di rete','Security of network services'),
('A.8.22','iso27001','technological',822,'Segregazione delle reti','Segregation of networks'),
('A.8.23','iso27001','technological',823,'Filtraggio web','Web filtering'),
('A.8.24','iso27001','technological',824,'Uso della crittografia','Use of cryptography'),
('A.8.25','iso27001','technological',825,'Ciclo di vita di sviluppo sicuro','Secure development life cycle'),
('A.8.26','iso27001','technological',826,'Requisiti di sicurezza delle applicazioni','Application security requirements'),
('A.8.27','iso27001','technological',827,'Principi di architettura e ingegneria dei sistemi sicuri','Secure system architecture and engineering principles'),
('A.8.28','iso27001','technological',828,'Codifica sicura','Secure coding'),
('A.8.29','iso27001','technological',829,'Test di sicurezza nello sviluppo e nell''accettazione','Security testing in development and acceptance'),
('A.8.30','iso27001','technological',830,'Sviluppo affidato all''esterno','Outsourced development'),
('A.8.31','iso27001','technological',831,'Separazione degli ambienti di sviluppo, test e produzione','Separation of development, test and production environments'),
('A.8.32','iso27001','technological',832,'Gestione del cambiamento','Change management'),
('A.8.33','iso27001','technological',833,'Informazioni di test','Test information'),
('A.8.34','iso27001','technological',834,'Protezione dei sistemi informativi durante i test di audit','Protection of information systems during audit testing');
-- ── ISO/IEC 27017:2015 — controlli cloud aggiuntivi (CLD.*) — CONDIZIONALI ──
INSERT IGNORE INTO iso27001_annex_controls (control_code, standard, theme, sort_order, title_it, title_en, iso27002_ref, condition_tag) VALUES
('CLD.6.3.1','iso27017','organizational',1010,'Ruoli e responsabilita condivisi in un ambiente di cloud computing','Shared roles and responsibilities within a cloud computing environment','ISO 27002:2013 §6.1.1 (ext. cloud)','cloud'),
('CLD.8.1.5','iso27017','organizational',1020,'Rimozione degli asset del cliente del servizio cloud','Removal of cloud service customer assets','ISO 27002:2013 §8.1 (ext. cloud)','cloud'),
('CLD.9.5.1','iso27017','technological',1030,'Segregazione negli ambienti di virtual computing','Segregation in virtual computing environments','ISO 27002:2013 §9.5 (ext. cloud)','cloud'),
('CLD.9.5.2','iso27017','technological',1040,'Hardening delle macchine virtuali','Virtual machine hardening','ISO 27002:2013 §9.5 (ext. cloud)','cloud'),
('CLD.12.1.5','iso27017','technological',1050,'Sicurezza operativa dell''amministratore','Administrator''s operational security','ISO 27002:2013 §12.1 (ext. cloud)','cloud'),
('CLD.12.4.5','iso27017','technological',1060,'Monitoraggio dei servizi cloud','Monitoring of cloud services','ISO 27002:2013 §12.4 (ext. cloud)','cloud'),
('CLD.13.1.4','iso27017','technological',1070,'Allineamento della sicurezza tra reti virtuali e fisiche','Alignment of security management for virtual and physical networks','ISO 27002:2013 §13.1 (ext. cloud)','cloud');
-- ── ISO/IEC 27018:2019 — controlli PII in cloud pubblico (PII.*) — CONDIZIONALI ──
-- Organizzati sui principi privacy ISO/IEC 29100. Codici interni PII.n (indice).
INSERT IGNORE INTO iso27001_annex_controls (control_code, standard, theme, sort_order, title_it, title_en, iso27002_ref, condition_tag) VALUES
('PII.1','iso27018','privacy',2010,'Consenso e scelta: trattare i PII solo su istruzioni documentate del cliente','Consent and choice: process PII only on documented client instructions','ISO 27018:2019 Annex A','pii_processor'),
('PII.2','iso27018','privacy',2020,'Legittimita e specificazione delle finalita','Purpose legitimacy and specification','ISO 27018:2019 Annex A','pii_processor'),
('PII.3','iso27018','privacy',2030,'Limitazione della raccolta','Collection limitation','ISO 27018:2019 Annex A','pii_processor'),
('PII.4','iso27018','privacy',2040,'Minimizzazione dei dati','Data minimization','ISO 27018:2019 Annex A','pii_processor'),
('PII.5','iso27018','privacy',2050,'Limitazione di uso, conservazione e divulgazione','Use, retention and disclosure limitation','ISO 27018:2019 Annex A','pii_processor'),
('PII.6','iso27018','privacy',2060,'Accuratezza e qualita','Accuracy and quality','ISO 27018:2019 Annex A','pii_processor'),
('PII.7','iso27018','privacy',2070,'Apertura, trasparenza e notifica','Openness, transparency and notice','ISO 27018:2019 Annex A','pii_processor'),
('PII.8','iso27018','privacy',2080,'Partecipazione e accesso dell''interessato','Individual participation and access','ISO 27018:2019 Annex A','pii_processor'),
('PII.9','iso27018','privacy',2090,'Accountability: notifica di violazione e gestione delle richieste','Accountability: breach notification and request handling','ISO 27018:2019 Annex A','pii_processor'),
('PII.10','iso27018','privacy',2100,'Sicurezza delle informazioni applicata ai PII','Information security applied to PII','ISO 27018:2019 Annex A','pii_processor'),
('PII.11','iso27018','privacy',2110,'Conformita privacy: sub-responsabili e trasferimenti internazionali','Privacy compliance: sub-processors and international transfers','ISO 27018:2019 Annex A','pii_processor');