Files
nis2-agile/application/cli/build_nuova_agile_p4.php
T
DevEnv nis2-agileandClaude Opus 4.8 1c2eced7a4 [CLIENT] Nuova Agile Technology srl (org 996003) — build completo SGSI/NIS2
Provisioning idempotente di un'azienda cliente cloud-only (Aruba/Hetzner/AI, no server in sede, PC portatili):
- Fase 1: org + classificazione NIS2 (important, sub_threshold_candidate/preliminary) + 3 membri esistenti collegati + organigramma 8 ruoli
- Fase 2: 12 asset (NIS2-rilevanti) + 4 fornitori + 10 rischi + gap analysis (80 risposte, 45%)
- Fase 3: ISMS model + SoA 111 controlli (27001/27017/27018) + 31 documenti (Manuale/10 politiche/13 procedure/7 istruzioni)
- Fase 4: 15 piani di controllo periodici + 5 corsi formazione
Documenti AI-redatti con regole fonti-certe (D.Lgs.138/2024 art.23/24/25; 24h/72h/1 mese). Sorgenti in _docs_na/.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 10:19:23 +02:00

76 lines
7.7 KiB
PHP

<?php
/**
* build_nuova_agile_p4.php — FASE 4: piani di controllo periodici + corsi di formazione. IDEMPOTENTE.
*/
if (PHP_SAPI !== 'cli') { http_response_code(403); exit("CLI only\n"); }
require_once __DIR__ . '/../config/env.php';
require_once __DIR__ . '/../config/database.php';
$pdo = Database::getInstance();
function ex(PDO $p, string $sql, array $a = []): void { $s=$p->prepare($sql); $s->execute($a); }
function one(PDO $p, string $sql, array $a = []) { $s=$p->prepare($sql); $s->execute($a); return $s->fetch(PDO::FETCH_ASSOC); }
$NOW='2026-06-20 10:55:00'; $RSGSI=326;
$org=one($pdo,"SELECT id FROM organizations WHERE name=?",['Nuova Agile Technology srl']);
if(!$org) exit("ORG mancante\n"); $orgId=(int)$org['id'];
// mappa ruoli organigramma -> id
function roleId(PDO $p,int $org,string $name){ $r=one($p,"SELECT id FROM org_roles WHERE organization_id=? AND role_name=?",[$org,$name]); return $r?(int)$r['id']:null; }
$RID_RSGSI=roleId($pdo,$orgId,'Responsabile del Sistema di Gestione (RSGSI)');
$RID_IT =roleId($pdo,$orgId,'Responsabile IT e Sicurezza Tecnica');
$RID_DIR =roleId($pdo,$orgId,'Direzione Generale');
$next=['settimanale'=>'2026-06-27','mensile'=>'2026-07-20','trimestrale'=>'2026-09-20','semestrale'=>'2026-12-20','annuale'=>'2027-06-20'];
/* ---- PIANI DI CONTROLLO (periodic_controls) -------------------------------- */
// code,title,desc,category,control_ref,owner,freq,method
$ctl=[
['CTL-001','Riesame degli accessi e dei privilegi','Verifica periodica di account, ruoli e privilegi su sistemi cloud, SaaS e repository; rimozione accessi non piu necessari.','Controllo accessi','A.5.18',$RID_IT,'trimestrale','Estrazione utenze da IdP/cloud/Git, confronto con organigramma e matrice accessi, revoca delle eccedenze. Registrazione esito nel modulo Controlli periodici.'],
['CTL-002','Verifica MFA su tutte le utenze','Controllo che l\'autenticazione a piu fattori sia attiva e obbligatoria su tutti gli accessi (cloud, SaaS, email, Git, AI).','Controllo accessi','A.8.5',$RID_IT,'trimestrale','Report MFA da IdP e servizi; rimedio immediato per le utenze non conformi.'],
['CTL-003','Test di ripristino dei backup','Esecuzione di un ripristino di prova dei backup (dati SaaS e di prodotto) per verificarne integrita e tempi.','Continuita','A.8.13',$RID_IT,'semestrale','Restore di prova in ambiente isolato, verifica integrita e RTO/RPO, verbale di test.'],
['CTL-004','Vulnerability scan infrastruttura e SaaS','Scansione delle vulnerabilita su risorse cloud (Aruba/Hetzner), piattaforma SaaS e dipendenze software.','Vulnerabilita','A.8.8',$RID_IT,'mensile','Scanner automatico + revisione SCA delle dipendenze; apertura azioni per le criticita.'],
['CTL-005','Revisione di log e accessi anomali','Analisi dei log di accesso e sicurezza per individuare anomalie o accessi non autorizzati.','Monitoraggio','A.8.16',$RID_IT,'mensile','Revisione log cloud/SaaS/IdP; eventi sospetti aperti come incidente.'],
['CTL-006','Applicazione patch critiche','Verifica e applicazione tempestiva delle patch di sicurezza critiche su endpoint e servizi cloud.','Vulnerabilita','A.8.8',$RID_IT,'settimanale','Controllo aggiornamenti critici (OS laptop, immagini, dipendenze) e applicazione entro gli SLA definiti.'],
['CTL-007','Riesame del registro dei rischi','Aggiornamento e riesame del registro dei rischi e dello stato dei trattamenti.','Rischio','A.5.1',$RID_RSGSI,'semestrale','Riesame rischi nel modulo Rischi, ricalcolo punteggi, aggiornamento piani di trattamento.'],
['CTL-008','Riesame dei fornitori e dei contratti/DPA','Valutazione periodica dei fornitori critici (Aruba, Hetzner, AI, collaboration) e dei DPA/clausole di sicurezza.','Fornitori','A.5.22',$RID_RSGSI,'annuale','Questionari/evidenze fornitori, verifica certificazioni e DPA, aggiornamento risk score nel modulo Supply Chain.'],
['CTL-009','Riesame della SoA e dei controlli ISO','Verifica di applicabilita e stato di attuazione dei controlli ISO 27001/27017/27018 nella SoA.','SGSI','A.5.1',$RID_RSGSI,'annuale','Riesame SoA nel modulo Modello SGSI; aggiornamento stato e motivazioni.'],
['CTL-010','Penetration test applicativo','Test di sicurezza applicativo su SaaS e prodotto in licenza, eseguito internamente o da terzi.','Vulnerabilita','A.8.29',$RID_IT,'annuale','Pentest applicativo, raccolta findings, apertura NC/azioni correttive.'],
['CTL-011','Formazione e awareness sicurezza','Erogazione e verifica del completamento della formazione obbligatoria su sicurezza e NIS2.','Formazione','A.6.3',$RID_RSGSI,'annuale','Assegnazione corsi nel modulo Formazione, verifica completamento e superamento quiz.'],
['CTL-012','Simulazione phishing','Campagna simulata di phishing verso il personale e analisi dei risultati.','Formazione','A.6.3',$RID_IT,'semestrale','Invio simulazione, misura del tasso di click/segnalazione, formazione mirata.'],
['CTL-013','Verifica cifratura degli endpoint','Controllo che tutti i PC portatili abbiano la cifratura del disco attiva e aggiornata.','Endpoint','A.8.24',$RID_IT,'semestrale','Report MDM/inventario, verifica BitLocker/FileVault/LUKS attivi, rimedio non conformita.'],
['CTL-014','Riesame della Direzione','Riesame periodico del SGSI da parte dell\'Alta Direzione (input/output ISO 27001 cl.9.3).','SGSI','A.5.1',$RID_DIR,'annuale','Riunione di riesame con input prestabiliti, decisioni e azioni verbalizzate nel modulo Riesame della Direzione.'],
['CTL-015','Audit interno del SGSI','Audit interno pianificato del SGSI sulle clausole ISO 27001 e sui controlli applicabili.','SGSI','A.5.35',$RID_RSGSI,'annuale','Programma di audit, conduzione, rilievi e NC nel modulo Audit interni.'],
];
$ci=0;
foreach($ctl as [$code,$t,$d,$cat,$ref,$owner,$freq,$method]){
$exc=one($pdo,"SELECT id FROM periodic_controls WHERE organization_id=? AND code=?",[$orgId,$code]);
if(!$exc){
ex($pdo,"INSERT INTO periodic_controls (organization_id,code,title,description,category,control_ref,owner_role_id,frequency,next_due_date,method,status,created_by,created_at,updated_at)
VALUES (?,?,?,?,?,?,?,?,?,?, 'active', ?,?,?)",
[$orgId,$code,$t,$d,$cat,$ref,$owner,$freq,$next[$freq],$method,$RSGSI,$NOW,$NOW]);
echo " ctl + $code ($freq)\n"; $ci++;
} else echo " ctl = $code\n";
}
echo "PIANI DI CONTROLLO: +$ci\n";
/* ---- CORSI DI FORMAZIONE --------------------------------------------------- */
// title,desc,target,nis2_article,mandatory,minutes
$courses=[
['Sicurezza delle informazioni e NIS2 - awareness','Corso base obbligatorio: principi di sicurezza, politiche aziendali, obblighi NIS2 (D.Lgs.138/2024) e ruolo di ciascuno.','all','24',1,45],
['Riconoscimento di phishing e social engineering','Come riconoscere e segnalare email sospette, truffe e tentativi di social engineering.','all',null,1,30],
['Protezione dei dati personali (GDPR e ISO 27018)','Trattamento sicuro dei dati personali dei clienti nel cloud; obblighi GDPR e controlli ISO 27018.','compliance_manager',null,1,40],
['Sviluppo software sicuro (Secure SDLC)','Pratiche di sviluppo sicuro, gestione delle dipendenze e dei segreti, code review per il team tecnico.','technical',null,1,60],
['Gestione degli incidenti e notifica NIS2','Procedura interna di gestione incidenti e tempistiche di notifica al CSIRT Italia (24h/72h/1 mese).','technical','25',1,30],
];
$cc=0;
foreach($courses as [$t,$d,$tr,$art,$mand,$min]){
$exco=one($pdo,"SELECT id FROM training_courses WHERE organization_id=? AND title=?",[$orgId,$t]);
if(!$exco){
ex($pdo,"INSERT INTO training_courses (organization_id,title,description,target_role,nis2_article,is_mandatory,duration_minutes,passing_score,is_active,created_at,updated_at)
VALUES (?,?,?,?,?,?,?,70,1,?,?)",
[$orgId,$t,$d,$tr,$art,$mand,$min,$NOW,$NOW]);
echo " corso + $t\n"; $cc++;
} else echo " corso = $t\n";
}
echo "CORSI: +$cc\n";
echo "\nFASE 4 OK\n";