[FEAT] Integrazione analisi docs/nis2 v1.7.0 — scoring asset, tassonomia incidenti, PIR, NIST CSF, fonti certe

Fase 1 - Asset Relevance Scoring NIS2 (GV.OC-04): metodologia 0-100 a 6 criteri,
  AssetScoringService + endpoint scoringGrid/score/relevantSystems + UI assets.html + registro stampabile.
Fase 2 - Tassonomia incidenti Determina ACN 164179/2025: IS-1..4 + regime essenziale/importante (Allegati 3/4).
Fase 3 - Post-Incident Review (5-Whys) + metriche TTD/TTC/TTR + timestamp di fase.
Fase 4 - Mapping NIST CSF 2.0 (43 controlli) reference-only.
Fonti certe: registry config/nis2_sources.php + grounding AI (vieta riferimenti inventati) +
  citazioni help.js + ingest PDF normativi nella KB RAG (scripts/ingest-nis2-sources.php).
Migrazioni 020/021/022 (additive idempotenti). Fix VectorService IP Qdrant (drift .5->.3).
Analisi concorrenza Evix (docs/EVIX_ANALISI_CONCORRENZA.html, gap-driven).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
DevEnv nis2-agile
2026-05-29 17:15:13 +02:00
co-authored by Claude Opus 4.8
parent a7a21faa82
commit 5c545ea3d0
41 changed files with 21078 additions and 24 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+353
View File
@@ -0,0 +1,353 @@
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Accesso Sistema Gestione Incidenti - NIS2</title>
<style>
:root {
--bg-primary: #0d1117;
--bg-secondary: #161b22;
--bg-tertiary: #1c2128;
--border-color: #30363d;
--text-primary: #c9d1d9;
--text-secondary: #8b949e;
--accent-primary: #58a6ff;
--accent-secondary: #1f6feb;
--success: #3fb950;
--warning: #d29922;
--danger: #f85149;
--essential-bg: #fef3c7;
--essential-text: #92400e;
--essential-border: #f59e0b;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;
background-color: var(--bg-primary);
color: var(--text-primary);
line-height: 1.6;
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
padding: 20px;
}
.gate-container {
max-width: 900px;
width: 100%;
}
.gate-header {
text-align: center;
margin-bottom: 48px;
}
.gate-header h1 {
font-size: 32px;
font-weight: 700;
color: var(--text-primary);
margin-bottom: 16px;
}
.gate-header p {
font-size: 16px;
color: var(--text-secondary);
line-height: 1.6;
}
.warning-box {
background-color: rgba(210, 153, 34, 0.1);
border: 2px solid var(--warning);
border-radius: 8px;
padding: 24px;
margin-bottom: 48px;
}
.warning-box-title {
display: flex;
align-items: center;
gap: 12px;
font-size: 18px;
font-weight: 600;
color: var(--warning);
margin-bottom: 16px;
}
.warning-icon {
font-size: 24px;
}
.warning-box-content {
font-size: 14px;
color: var(--text-primary);
line-height: 1.8;
}
.selection-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
gap: 24px;
margin-bottom: 32px;
}
.selection-card {
background-color: var(--bg-secondary);
border: 2px solid var(--border-color);
border-radius: 8px;
padding: 32px;
cursor: pointer;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
}
.selection-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 4px;
background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary));
transform: scaleX(0);
transition: transform 0.3s ease;
}
.selection-card:hover {
border-color: var(--accent-primary);
transform: translateY(-4px);
box-shadow: 0 8px 24px rgba(88, 166, 255, 0.2);
}
.selection-card:hover::before {
transform: scaleX(1);
}
.selection-card.essential {
border-color: var(--essential-border);
}
.selection-card.essential:hover {
border-color: var(--essential-border);
box-shadow: 0 8px 24px rgba(245, 158, 11, 0.2);
}
.selection-card.essential::before {
background: linear-gradient(90deg, var(--essential-border), var(--warning));
}
.card-badge {
display: inline-block;
padding: 6px 12px;
border-radius: 4px;
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.5px;
margin-bottom: 16px;
}
.badge-important {
background-color: rgba(88, 166, 255, 0.2);
color: var(--accent-primary);
border: 1px solid var(--accent-primary);
}
.badge-essential {
background-color: var(--essential-bg);
color: var(--essential-text);
border: 1px solid var(--essential-border);
}
.card-title {
font-size: 24px;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 16px;
}
.card-description {
font-size: 14px;
color: var(--text-secondary);
line-height: 1.6;
margin-bottom: 24px;
}
.card-features {
list-style: none;
margin-bottom: 24px;
}
.card-features li {
font-size: 13px;
color: var(--text-primary);
padding: 8px 0;
padding-left: 24px;
position: relative;
}
.card-features li::before {
content: '✓';
position: absolute;
left: 0;
color: var(--success);
font-weight: 700;
}
.card-button {
width: 100%;
padding: 14px 24px;
background-color: var(--bg-tertiary);
border: 2px solid var(--accent-primary);
border-radius: 6px;
color: var(--accent-primary);
font-size: 15px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s;
}
.card-button:hover {
background-color: var(--accent-primary);
color: var(--bg-primary);
}
.selection-card.essential .card-button {
border-color: var(--essential-border);
color: var(--essential-border);
}
.selection-card.essential .card-button:hover {
background-color: var(--essential-border);
color: var(--bg-primary);
}
.footer-note {
text-align: center;
font-size: 13px;
color: var(--text-secondary);
padding: 24px;
background-color: var(--bg-secondary);
border-radius: 6px;
border: 1px solid var(--border-color);
}
.footer-note strong {
color: var(--text-primary);
}
@media (max-width: 768px) {
.selection-grid {
grid-template-columns: 1fr;
}
.gate-header h1 {
font-size: 24px;
}
}
</style>
</head>
<body>
<div class="gate-container">
<div class="gate-header">
<h1>Sistema Gestione Incidenti NIS2</h1>
<p>Seleziona la tipologia del tuo soggetto per accedere alle funzionalità appropriate</p>
</div>
<div class="warning-box">
<div class="warning-box-title">
<span class="warning-icon">⚠️</span>
Accesso Obbligatorio
</div>
<div class="warning-box-content">
<strong>La conformità alla gestione incidenti è obbligatoria per TUTTI i soggetti NIS2</strong> (essenziali e importanti). La differenza sta nei tipi di incidenti da segnalare e nelle tempistiche, come definito negli Allegati 3 (soggetti essenziali) e 4 (soggetti importanti) della Determina 164179/2025.
<br><br>
Seleziona la categoria corretta per visualizzare solo i requisiti applicabili alla tua organizzazione.
</div>
</div>
<div class="selection-grid">
<div class="selection-card" onclick="selectType('important')">
<span class="card-badge badge-important">Soggetto Importante</span>
<h2 class="card-title">Soggetto Importante</h2>
<p class="card-description">
Organizzazioni che rientrano nella categoria "importanti" secondo il D.Lgs. 138/2024, con obblighi di notifica per incidenti significativi secondo Allegato 4.
</p>
<ul class="card-features">
<li>Notifica incidenti IS-1, IS-2, IS-3</li>
<li>Preallarme entro 24 ore</li>
<li>Notifica completa entro 72 ore</li>
<li>Relazione finale entro 1 mese</li>
<li>Gestione incidenti ricorrenti (IS-4) non obbligatoria</li>
</ul>
<button class="card-button">Accedi come Soggetto Importante</button>
</div>
<div class="selection-card essential" onclick="selectType('essential')">
<span class="card-badge badge-essential">Soggetto Essenziale</span>
<h2 class="card-title">Soggetto Essenziale</h2>
<p class="card-description">
Organizzazioni che rientrano nella categoria "essenziali" secondo il D.Lgs. 138/2024, con obblighi estesi di notifica per incidenti significativi secondo Allegato 3.
</p>
<ul class="card-features">
<li>Notifica incidenti IS-1, IS-2, IS-3, IS-4</li>
<li>Preallarme entro 24 ore</li>
<li>Notifica completa entro 72 ore</li>
<li>Relazione finale entro 1 mese</li>
<li>Gestione incidenti ricorrenti (IS-4) obbligatoria</li>
<li>Monitoraggio 24/7 richiesto</li>
</ul>
<button class="card-button">Accedi come Soggetto Essenziale</button>
</div>
</div>
<div class="footer-note">
<strong>Riferimenti normativi:</strong> D.Lgs. 138/2024 (Direttiva NIS2), Determina ACN 164179/2025 (Allegati 3 e 4)<br>
<strong>Requisiti NIS2 coperti:</strong> RS.MA-01 (Gestione Incidenti), RS.CO-02 (Notifiche), RC.RP-01 (Ripristino), RC.CO-03 (Comunicazioni)
</div>
</div>
<script>
function selectType(type) {
// Salva la selezione in sessionStorage
sessionStorage.setItem('nis2_subject_type', type);
// Reindirizza alla dashboard
window.location.href = 'incident-dashboard.html';
}
// Verifica se c'è già una selezione
window.addEventListener('DOMContentLoaded', function() {
const savedType = sessionStorage.getItem('nis2_subject_type');
if (savedType) {
// Mostra un messaggio che sta caricando
const container = document.querySelector('.gate-container');
container.innerHTML = `
<div style="text-align: center; padding: 60px 20px;">
<h2 style="font-size: 24px; margin-bottom: 16px;">Accesso già configurato</h2>
<p style="color: var(--text-secondary); margin-bottom: 24px;">
Sei configurato come: <strong style="color: var(--text-primary);">${savedType === 'essential' ? 'Soggetto Essenziale' : 'Soggetto Importante'}</strong>
</p>
<button onclick="window.location.href='incident-dashboard.html'"
style="padding: 12px 24px; background-color: var(--accent-primary); border: none; border-radius: 6px; color: white; font-weight: 600; cursor: pointer; margin-right: 12px;">
Vai alla Dashboard
</button>
<button onclick="sessionStorage.removeItem('nis2_subject_type'); location.reload();"
style="padding: 12px 24px; background-color: var(--bg-tertiary); border: 1px solid var(--border-color); border-radius: 6px; color: var(--text-primary); font-weight: 600; cursor: pointer;">
Cambia Selezione
</button>
</div>
`;
}
});
</script>
</body>
</html>
+956
View File
@@ -0,0 +1,956 @@
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Nuovo Incidente - NIS2 Management System</title>
<style>
:root {
--bg-primary: #0d1117;
--bg-secondary: #161b22;
--bg-tertiary: #1c2128;
--border-color: #30363d;
--text-primary: #c9d1d9;
--text-secondary: #8b949e;
--accent-primary: #58a6ff;
--accent-secondary: #1f6feb;
--success: #3fb950;
--warning: #d29922;
--danger: #f85149;
--essential-bg: #fef3c7;
--essential-text: #92400e;
--essential-border: #f59e0b;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;
background-color: var(--bg-primary);
color: var(--text-primary);
line-height: 1.6;
overflow-y: auto;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
.header {
background-color: var(--bg-secondary);
border-bottom: 1px solid var(--border-color);
padding: 24px 0;
margin-bottom: 32px;
position: sticky;
top: 0;
z-index: 100;
}
.header-content {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
display: flex;
justify-content: space-between;
align-items: center;
}
.header h1 {
font-size: 24px;
font-weight: 600;
color: var(--text-primary);
}
.breadcrumb {
font-size: 13px;
color: var(--text-secondary);
margin-top: 4px;
}
.breadcrumb a {
color: var(--accent-primary);
text-decoration: none;
}
.btn {
padding: 8px 16px;
background-color: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 6px;
color: var(--text-primary);
font-size: 13px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s;
text-decoration: none;
}
.btn:hover {
border-color: var(--accent-primary);
color: var(--accent-primary);
}
.form-section {
background-color: var(--bg-secondary);
border: 1px solid var(--border-color);
border-radius: 6px;
padding: 24px;
margin-bottom: 24px;
}
.form-section-title {
font-size: 18px;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 20px;
padding-bottom: 12px;
border-bottom: 1px solid var(--border-color);
display: flex;
align-items: center;
gap: 8px;
}
.help-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 22px;
height: 22px;
background-color: rgba(167, 139, 250, 0.2);
border: 2px solid #a78bfa;
border-radius: 50%;
font-size: 13px;
font-weight: 700;
color: #a78bfa;
cursor: help;
position: relative;
}
.help-icon:hover {
background-color: rgba(167, 139, 250, 0.3);
transform: scale(1.1);
}
.tooltip {
visibility: hidden;
position: absolute;
z-index: 1000;
background-color: var(--bg-tertiary);
color: var(--text-primary);
padding: 12px;
border-radius: 6px;
border: 1px solid var(--border-color);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
width: 320px;
top: 28px;
left: 50%;
transform: translateX(-50%);
font-size: 12px;
line-height: 1.5;
opacity: 0;
transition: opacity 0.2s;
white-space: normal;
}
.tooltip::before {
content: '';
position: absolute;
top: -6px;
left: 50%;
transform: translateX(-50%);
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid var(--border-color);
}
.tooltip-title {
color: var(--accent-primary);
font-weight: 600;
margin-bottom: 8px;
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.help-icon:hover .tooltip {
visibility: visible;
opacity: 1;
}
.form-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
}
.form-group {
margin-bottom: 20px;
}
.form-group.full-width {
grid-column: 1 / -1;
}
.form-label {
display: block;
font-size: 13px;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 8px;
}
.form-label .required {
color: var(--danger);
margin-left: 4px;
}
.form-input, .form-select, .form-textarea {
width: 100%;
padding: 10px 12px;
background-color: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 6px;
color: var(--text-primary);
font-size: 14px;
font-family: inherit;
}
.form-input:focus, .form-select:focus, .form-textarea:focus {
outline: none;
border-color: var(--accent-primary);
box-shadow: 0 0 0 3px rgba(88, 166, 255, 0.1);
}
.form-textarea {
resize: vertical;
min-height: 100px;
}
.form-help {
font-size: 12px;
color: var(--text-secondary);
margin-top: 6px;
line-height: 1.4;
}
.severity-selector {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
gap: 12px;
}
.severity-option {
padding: 16px;
background-color: var(--bg-tertiary);
border: 2px solid var(--border-color);
border-radius: 6px;
cursor: pointer;
text-align: center;
transition: all 0.2s;
}
.severity-option:hover {
border-color: var(--accent-primary);
}
.severity-option.selected {
border-color: var(--accent-primary);
background-color: rgba(88, 166, 255, 0.1);
}
.severity-option.sev-1 {
border-color: var(--danger);
}
.severity-option.sev-1.selected {
background-color: rgba(248, 81, 73, 0.1);
}
.severity-option.sev-2 {
border-color: var(--warning);
}
.severity-option.sev-2.selected {
background-color: rgba(210, 153, 34, 0.1);
}
.severity-label {
font-weight: 700;
font-size: 14px;
margin-bottom: 4px;
}
.severity-desc {
font-size: 11px;
color: var(--text-secondary);
}
.alert-box {
background-color: rgba(88, 166, 255, 0.1);
border: 1px solid var(--accent-primary);
border-left: 4px solid var(--accent-primary);
border-radius: 6px;
padding: 16px;
margin-bottom: 20px;
}
.alert-box.warning {
background-color: rgba(210, 153, 34, 0.1);
border-color: var(--warning);
border-left-color: var(--warning);
}
.alert-box.danger {
background-color: rgba(248, 81, 73, 0.1);
border-color: var(--danger);
border-left-color: var(--danger);
}
.alert-title {
font-weight: 600;
margin-bottom: 8px;
font-size: 14px;
}
.alert-content {
font-size: 13px;
color: var(--text-secondary);
line-height: 1.5;
}
.form-actions {
display: flex;
gap: 12px;
justify-content: flex-end;
padding-top: 24px;
border-top: 1px solid var(--border-color);
}
.btn-primary {
background-color: var(--accent-primary);
border-color: var(--accent-primary);
color: white;
}
.btn-primary:hover {
background-color: var(--accent-secondary);
border-color: var(--accent-secondary);
color: white;
}
.btn-danger {
background-color: var(--danger);
border-color: var(--danger);
color: white;
}
.btn-danger:hover {
background-color: #dc2626;
border-color: #dc2626;
}
.checklist {
list-style: none;
}
.checklist li {
padding: 10px;
background-color: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 4px;
margin-bottom: 8px;
display: flex;
align-items: center;
gap: 12px;
}
.checklist input[type="checkbox"] {
width: 18px;
height: 18px;
cursor: pointer;
}
.essential-badge {
display: inline-block;
background-color: var(--essential-bg);
color: var(--essential-text);
padding: 4px 8px;
border-radius: 3px;
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.5px;
border: 1px solid var(--essential-border);
margin-left: 8px;
}
@media (max-width: 768px) {
.form-grid {
grid-template-columns: 1fr;
}
.severity-selector {
grid-template-columns: 1fr 1fr;
}
}
</style>
</head>
<body>
<div class="header">
<div class="header-content">
<div>
<h1>🚨 Segnalazione Nuovo Incidente</h1>
<div class="breadcrumb">
<a href="dashboard.html">Dashboard NIS2</a> /
<a href="incident-dashboard.html">Gestione Incidenti</a> /
Nuovo Incidente
</div>
</div>
<a href="incident-dashboard.html" class="btn">← Annulla</a>
</div>
</div>
<div class="container">
<div class="alert-box danger">
<div class="alert-title">⚠️ Procedura di Emergenza</div>
<div class="alert-content">
Per incidenti <strong>SEV-1 (Critici)</strong>: attivare immediatamente il Crisis Team e il CISO.
La notifica al CSIRT Italia (preallarme) deve essere effettuata entro <strong>24 ore</strong> dalla conoscenza dell'incidente significativo.
</div>
</div>
<form id="incidentForm">
<!-- Sezione 1: Rilevazione -->
<div class="form-section">
<div class="form-section-title">
Fase 1: Rilevazione e Segnalazione
<span class="help-icon">?
<div class="tooltip">
<div class="tooltip-title">HELP DELLA SEZIONE</div>
Registrazione iniziale dell'incidente. Compilare entro 15 minuti dalla rilevazione per incidenti critici. Tutte le informazioni possono essere aggiornate durante la gestione.
</div>
</span>
</div>
<div class="form-grid">
<div class="form-group">
<label class="form-label">
Data/Ora Rilevazione <span class="required">*</span>
</label>
<input type="datetime-local" class="form-input" id="detectionTime" required>
<div class="form-help">Momento in cui l'incidente è stato rilevato</div>
</div>
<div class="form-group">
<label class="form-label">
Fonte di Rilevazione <span class="required">*</span>
</label>
<select class="form-select" id="detectionSource" required>
<option value="">Seleziona...</option>
<option value="siem">Alert SIEM/SOC</option>
<option value="edr">Alert EDR/Antimalware</option>
<option value="user">Segnalazione Utente</option>
<option value="supplier">Notifica Fornitore/Partner</option>
<option value="csirt">Notifica CSIRT Italia</option>
<option value="threat-intel">Threat Intelligence</option>
<option value="external">Segnalazione Esterna</option>
<option value="monitoring">Monitoraggio Infrastruttura</option>
</select>
</div>
<div class="form-group">
<label class="form-label">
Analista Assegnato <span class="required">*</span>
</label>
<select class="form-select" id="analyst" required>
<option value="">Seleziona...</option>
<option value="ciso">CISO</option>
<option value="soc-lead">SOC Lead</option>
<option value="analyst1">Analista Sicurezza 1</option>
<option value="analyst2">Analista Sicurezza 2</option>
<option value="sysadmin">System Administrator</option>
<option value="netadmin">Network Administrator</option>
</select>
</div>
<div class="form-group full-width">
<label class="form-label">
Descrizione Preliminare <span class="required">*</span>
</label>
<textarea class="form-textarea" id="description" required placeholder="Descrizione dettagliata dell'incidente rilevato..."></textarea>
<div class="form-help">Fornire tutti i dettagli disponibili: cosa è stato rilevato, su quali sistemi, sintomi osservati</div>
</div>
<div class="form-group full-width">
<label class="form-label">
Sistemi Potenzialmente Impattati
</label>
<input type="text" class="form-input" id="affectedSystems" placeholder="es. HW-SRV-001, SW-ERP-001, CLD-IAAS-001">
<div class="form-help">Codici asset da inventario (Org.01). Separare con virgola se multipli</div>
</div>
</div>
</div>
<!-- Sezione 2: Triage e Classificazione -->
<div class="form-section">
<div class="form-section-title">
Fase 2: Triage e Classificazione
<span class="help-icon">?
<div class="tooltip">
<div class="tooltip-title">HELP DELLA SEZIONE</div>
Determinazione della severità e classificazione secondo NIS2. Completare entro 1 ora per SEV-1/SEV-2. La classificazione determina gli obblighi di notifica al CSIRT.
</div>
</span>
</div>
<div class="form-group full-width">
<label class="form-label">
Severità Incidente <span class="required">*</span>
</label>
<div class="severity-selector">
<div class="severity-option sev-1" onclick="selectSeverity('sev-1')">
<div class="severity-label" style="color: var(--danger);">SEV-1</div>
<div class="severity-desc">CRITICO</div>
</div>
<div class="severity-option sev-2" onclick="selectSeverity('sev-2')">
<div class="severity-label" style="color: var(--warning);">SEV-2</div>
<div class="severity-desc">ALTO</div>
</div>
<div class="severity-option" onclick="selectSeverity('sev-3')">
<div class="severity-label" style="color: var(--accent-primary);">SEV-3</div>
<div class="severity-desc">MEDIO</div>
</div>
<div class="severity-option" onclick="selectSeverity('sev-4')">
<div class="severity-label" style="color: var(--text-secondary);">SEV-4</div>
<div class="severity-desc">BASSO</div>
</div>
</div>
<input type="hidden" id="severity" required>
<div class="form-help" id="severityHelp" style="margin-top: 12px;"></div>
</div>
<div class="alert-box warning" id="sev1Alert" style="display: none;">
<div class="alert-title">🚨 Incidente SEV-1 - Azioni Immediate Richieste</div>
<div class="alert-content">
<ul style="margin-left: 20px; margin-top: 8px;">
<li>Attivare immediatamente Crisis Team</li>
<li>Notificare CISO e Direzione</li>
<li>Contenimento entro 30 minuti</li>
<li>Preallarme CSIRT entro 24h (se significativo)</li>
</ul>
</div>
</div>
<div class="form-grid">
<div class="form-group">
<label class="form-label">
Classificazione NIS2 <span class="required">*</span>
</label>
<select class="form-select" id="classification" required onchange="updateClassificationHelp()">
<option value="">Seleziona...</option>
<option value="is-1">IS-1 - Impatto su servizi rilevanti</option>
<option value="is-2">IS-2 - Impatto su integrità/riservatezza dati</option>
<option value="is-3">IS-3 - Impatto su altri soggetti/supply chain</option>
<option value="is-4" id="is4ClassOption">IS-4 - Incidente ricorrente (SOLO ESSENZIALI)</option>
<option value="not-significant">Non Significativo</option>
</select>
<div class="form-help" id="classificationHelp"></div>
</div>
<div class="form-group">
<label class="form-label">
Impatto
</label>
<select class="form-select" id="impact" multiple size="4">
<option value="availability">Disponibilità</option>
<option value="integrity">Integrità</option>
<option value="confidentiality">Riservatezza</option>
<option value="authenticity">Autenticità</option>
</select>
<div class="form-help">Tenere premuto Ctrl/Cmd per selezione multipla</div>
</div>
<div class="form-group">
<label class="form-label">
Categoria MITRE ATT&CK
</label>
<select class="form-select" id="mitreCategory">
<option value="">Non determinata</option>
<option value="initial-access">Initial Access</option>
<option value="execution">Execution</option>
<option value="persistence">Persistence</option>
<option value="privilege-escalation">Privilege Escalation</option>
<option value="defense-evasion">Defense Evasion</option>
<option value="credential-access">Credential Access</option>
<option value="discovery">Discovery</option>
<option value="lateral-movement">Lateral Movement</option>
<option value="collection">Collection</option>
<option value="exfiltration">Exfiltration</option>
<option value="impact">Impact</option>
</select>
</div>
<div class="form-group">
<label class="form-label">
Vettore di Attacco
</label>
<select class="form-select" id="attackVector">
<option value="">Non determinato</option>
<option value="phishing">Phishing/Spear Phishing</option>
<option value="malware">Malware</option>
<option value="ransomware">Ransomware</option>
<option value="vulnerability">Exploit Vulnerabilità</option>
<option value="brute-force">Brute Force</option>
<option value="credential-stuffing">Credential Stuffing</option>
<option value="supply-chain">Supply Chain Attack</option>
<option value="ddos">DDoS</option>
<option value="insider">Insider Threat</option>
<option value="physical">Accesso Fisico</option>
<option value="social-engineering">Social Engineering</option>
</select>
</div>
</div>
<div class="alert-box" id="csirtAlert" style="display: none;">
<div class="alert-title">📡 Notifica CSIRT Obbligatoria</div>
<div class="alert-content">
Questo incidente rientra nella classificazione di incidente significativo secondo NIS2.
È obbligatorio inviare il <strong>preallarme al CSIRT Italia entro 24 ore</strong> dalla conoscenza dell'incidente.
<br><br>
Dopo la creazione dell'incidente, procedere alla sezione "Notifiche CSIRT" per gestire le comunicazioni obbligatorie.
</div>
</div>
</div>
<!-- Sezione 3: Dati Impattati -->
<div class="form-section">
<div class="form-section-title">
Dati e Servizi Impattati
<span class="help-icon">?
<div class="tooltip">
<div class="tooltip-title">HELP DELLA SEZIONE</div>
Identificazione dei dati e servizi coinvolti nell'incidente. Fondamentale per valutare obblighi GDPR e impatto operativo.
</div>
</span>
</div>
<div class="form-grid">
<div class="form-group">
<label class="form-label">
Dati Personali Coinvolti?
</label>
<select class="form-select" id="personalData" onchange="toggleGDPR()">
<option value="no">No</option>
<option value="yes">Sì</option>
<option value="unknown">Da verificare</option>
</select>
</div>
<div class="form-group" id="gdprGroup" style="display: none;">
<label class="form-label">
Notifica Garante Privacy
</label>
<select class="form-select" id="gdprNotification">
<option value="not-required">Non richiesta</option>
<option value="required">Richiesta (entro 72h)</option>
<option value="sent">Già inviata</option>
</select>
<div class="form-help">Art. 33 GDPR - coordinare con DPO</div>
</div>
<div class="form-group full-width">
<label class="form-label">
Servizi Rilevanti NIS2 Impattati
</label>
<input type="text" class="form-input" id="affectedServices" placeholder="Codici servizi da catalogo (ID.AM-04)">
<div class="form-help">Elencare i servizi rilevanti NIS2 che hanno subito interruzione o degrado</div>
</div>
<div class="form-group">
<label class="form-label">
Numero Utenti Impattati (stima)
</label>
<input type="number" class="form-input" id="usersImpacted" min="0">
</div>
<div class="form-group">
<label class="form-label">
Impatto Economico Stimato (€)
</label>
<input type="number" class="form-input" id="financialImpact" min="0" step="100">
<div class="form-help">Stima preliminare (diretto + indiretto)</div>
</div>
</div>
</div>
<!-- Sezione 4: Azioni Immediate -->
<div class="form-section">
<div class="form-section-title">
Azioni Immediate di Contenimento
<span class="help-icon">?
<div class="tooltip">
<div class="tooltip-title">HELP DELLA SEZIONE</div>
Checklist delle azioni di contenimento immediato. Per SEV-1: contenimento entro 30 minuti. Documentare ogni azione con timestamp.
</div>
</span>
</div>
<ul class="checklist">
<li>
<input type="checkbox" id="action1">
<label for="action1">Sistema compromesso isolato dalla rete</label>
</li>
<li>
<input type="checkbox" id="action2">
<label for="action2">Account compromessi bloccati</label>
</li>
<li>
<input type="checkbox" id="action3">
<label for="action3">IP/domini malevoli bloccati su firewall</label>
</li>
<li>
<input type="checkbox" id="action4">
<label for="action4">Evidenze preservate (snapshot, log, memoria)</label>
</li>
<li>
<input type="checkbox" id="action5">
<label for="action5">Monitoraggio intensivo attivato su sistemi correlati</label>
</li>
<li>
<input type="checkbox" id="action6">
<label for="action6">Crisis Team / IRT notificato</label>
</li>
<li>
<input type="checkbox" id="action7">
<label for="action7">Direzione informata (per SEV-1/SEV-2)</label>
</li>
</ul>
<div class="form-group" style="margin-top: 20px;">
<label class="form-label">
Note Azioni di Contenimento
</label>
<textarea class="form-textarea" id="containmentNotes" placeholder="Descrivere in dettaglio le azioni di contenimento effettuate con timestamp..."></textarea>
</div>
</div>
<!-- Sezione 5: Collegamento Risk -->
<div class="form-section">
<div class="form-section-title">
Collegamento Risk Assessment
<span class="help-icon">?
<div class="tooltip">
<div class="tooltip-title">HELP DELLA SEZIONE</div>
Collegare l'incidente a rischi già identificati nel risk assessment (Org.05). Se l'incidente evidenzia un nuovo rischio, verrà creato automaticamente.
</div>
</span>
</div>
<div class="form-group">
<label class="form-label">
Collegamento N°RISK
</label>
<input type="text" class="form-input" id="riskId" placeholder="es. RISK-2024-015">
<div class="form-help">Codice rischio da Org.05 - Risk Assessment. Lasciare vuoto se nuovo rischio</div>
</div>
<div class="form-group">
<label class="form-label">
Root Cause Preliminare
</label>
<select class="form-select" id="rootCause">
<option value="">Da determinare</option>
<option value="vulnerability">Vulnerabilità non patchata</option>
<option value="misconfiguration">Errore di configurazione</option>
<option value="weak-credentials">Credenziali deboli/compromesse</option>
<option value="missing-controls">Controlli di sicurezza mancanti</option>
<option value="human-error">Errore umano</option>
<option value="third-party">Compromissione terza parte</option>
<option value="zero-day">Zero-day exploit</option>
<option value="insider">Insider threat</option>
</select>
</div>
</div>
<!-- Form Actions -->
<div class="form-section">
<div class="form-actions">
<a href="incident-dashboard.html" class="btn">Annulla</a>
<button type="button" class="btn" onclick="saveDraft()">Salva Bozza</button>
<button type="submit" class="btn btn-danger">🚨 Crea Incidente e Attiva Gestione</button>
</div>
</div>
</form>
</div>
<script>
// Verifica tipo soggetto
function checkSubjectType() {
const subjectType = sessionStorage.getItem('nis2_subject_type');
if (!subjectType) {
window.location.href = 'incident-gate.html';
return;
}
// Nascondi IS-4 per soggetti importanti
if (subjectType === 'important') {
const is4Option = document.getElementById('is4ClassOption');
if (is4Option) is4Option.style.display = 'none';
}
}
// Imposta data/ora corrente
function setCurrentDateTime() {
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
document.getElementById('detectionTime').value = `${year}-${month}-${day}T${hours}:${minutes}`;
}
// Selezione severità
function selectSeverity(severity) {
// Rimuovi selezione precedente
document.querySelectorAll('.severity-option').forEach(opt => {
opt.classList.remove('selected');
});
// Seleziona nuovo
event.target.closest('.severity-option').classList.add('selected');
document.getElementById('severity').value = severity;
// Mostra help specifico
const helpTexts = {
'sev-1': '🚨 <strong>CRITICO:</strong> Interruzione totale servizio critico, ransomware attivo, esfiltrazione massiva dati, compromissione infrastruttura core. <strong>Attivazione immediata Crisis Team.</strong>',
'sev-2': '⚠️ <strong>ALTO:</strong> Interruzione parziale servizio rilevante, compromissione account privilegiato, malware attivo non contenuto, accesso non autorizzato a dati riservati.',
'sev-3': 'ℹ️ <strong>MEDIO:</strong> Degrado prestazioni servizio rilevante, malware contenuto automaticamente, tentativo intrusione bloccato ma significativo.',
'sev-4': '📝 <strong>BASSO:</strong> Anomalia senza impatto operativo, tentativo attacco bloccato (routine), violazione policy minore.'
};
document.getElementById('severityHelp').innerHTML = helpTexts[severity];
// Mostra alert per SEV-1
const sev1Alert = document.getElementById('sev1Alert');
if (severity === 'sev-1') {
sev1Alert.style.display = 'block';
} else {
sev1Alert.style.display = 'none';
}
}
// Aggiorna help classificazione
function updateClassificationHelp() {
const classification = document.getElementById('classification').value;
const helpTexts = {
'is-1': 'Interruzione operativa o degrado significativo di un servizio rilevante NIS2. <strong>Notifica CSIRT obbligatoria.</strong>',
'is-2': 'Accesso non autorizzato, modifica, esfiltrazione o violazione riservatezza dati. <strong>Notifica CSIRT obbligatoria.</strong> Verificare anche obbligo GDPR.',
'is-3': 'Incidente che si propaga a soggetti terzi o impatta la catena di fornitura. <strong>Notifica CSIRT obbligatoria.</strong>',
'is-4': 'Serie di incidenti correlati con impatto cumulativo significativo. <strong>Notifica CSIRT obbligatoria SOLO per soggetti ESSENZIALI.</strong>',
'not-significant': 'Incidente gestito internamente, senza obbligo di notifica CSIRT. Documentare comunque nel registro incidenti.'
};
const helpElement = document.getElementById('classificationHelp');
helpElement.innerHTML = helpTexts[classification] || '';
// Mostra/nascondi alert CSIRT
const csirtAlert = document.getElementById('csirtAlert');
if (['is-1', 'is-2', 'is-3', 'is-4'].includes(classification)) {
csirtAlert.style.display = 'block';
} else {
csirtAlert.style.display = 'none';
}
}
// Toggle GDPR
function toggleGDPR() {
const personalData = document.getElementById('personalData').value;
const gdprGroup = document.getElementById('gdprGroup');
if (personalData === 'yes') {
gdprGroup.style.display = 'block';
} else {
gdprGroup.style.display = 'none';
}
}
// Salva bozza
function saveDraft() {
alert('Bozza salvata con successo. Puoi continuare la compilazione in seguito.');
}
// Submit form
document.getElementById('incidentForm').addEventListener('submit', function(e) {
e.preventDefault();
// Validazione
const severity = document.getElementById('severity').value;
if (!severity) {
alert('Seleziona la severità dell\'incidente');
return;
}
// Genera codice incidente
const year = new Date().getFullYear();
const progressive = Math.floor(Math.random() * 900) + 100; // Simulato
const incidentCode = `INC-${year}-${progressive}`;
// Simula creazione incidente
const tooltip = document.createElement('div');
tooltip.style.cssText = `
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: var(--bg-secondary);
border: 2px solid var(--success);
border-radius: 8px;
padding: 32px;
box-shadow: 0 8px 24px rgba(0,0,0,0.5);
z-index: 10000;
max-width: 500px;
text-align: center;
`;
tooltip.innerHTML = `
<div style="font-size: 48px; margin-bottom: 16px;">✅</div>
<h2 style="color: var(--success); margin-bottom: 16px;">Incidente Creato con Successo</h2>
<p style="color: var(--text-secondary); margin-bottom: 8px;">Codice incidente:</p>
<p style="font-size: 24px; font-weight: 700; color: var(--text-primary); margin-bottom: 24px; font-family: monospace;">${incidentCode}</p>
<div style="background: var(--bg-tertiary); padding: 16px; border-radius: 6px; margin-bottom: 24px; text-align: left;">
<p style="font-size: 13px; color: var(--text-secondary); margin-bottom: 12px;"><strong>Prossime azioni:</strong></p>
<ul style="font-size: 13px; color: var(--text-secondary); margin-left: 20px;">
<li>Incident Response Team notificato</li>
<li>Timeline di gestione avviata</li>
${severity === 'sev-1' ? '<li style="color: var(--danger); font-weight: 600;">Crisis Team attivato</li>' : ''}
${['is-1', 'is-2', 'is-3'].includes(document.getElementById('classification').value) ? '<li style="color: var(--warning); font-weight: 600;">Preallarme CSIRT da inviare entro 24h</li>' : ''}
</ul>
</div>
<button onclick="window.location.href='incident-detail.html?id=${incidentCode}'"
style="padding: 12px 24px; background: var(--accent-primary); border: none; border-radius: 6px; color: white; font-weight: 600; cursor: pointer; margin-right: 12px;">
Vai all'Incidente
</button>
<button onclick="window.location.href='incident-dashboard.html'"
style="padding: 12px 24px; background: var(--bg-tertiary); border: 1px solid var(--border-color); border-radius: 6px; color: var(--text-primary); font-weight: 600; cursor: pointer;">
Torna alla Dashboard
</button>
`;
document.body.appendChild(tooltip);
});
// Inizializza
window.addEventListener('DOMContentLoaded', function() {
checkSubjectType();
setCurrentDateTime();
});
</script>
</body>
</html>
@@ -0,0 +1,758 @@
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Notifiche CSIRT - INC-2024-047</title>
<style>
:root {
--bg-primary: #0d1117;
--bg-secondary: #161b22;
--bg-tertiary: #1c2128;
--border-color: #30363d;
--text-primary: #c9d1d9;
--text-secondary: #8b949e;
--accent-primary: #58a6ff;
--accent-secondary: #1f6feb;
--success: #3fb950;
--warning: #d29922;
--danger: #f85149;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;
background-color: var(--bg-primary);
color: var(--text-primary);
line-height: 1.6;
overflow-y: auto;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
.header {
background-color: var(--bg-secondary);
border-bottom: 1px solid var(--border-color);
padding: 24px 0;
margin-bottom: 32px;
position: sticky;
top: 0;
z-index: 100;
}
.header-content {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
display: flex;
justify-content: space-between;
align-items: center;
}
.header h1 {
font-size: 24px;
font-weight: 600;
color: var(--text-primary);
}
.breadcrumb {
font-size: 13px;
color: var(--text-secondary);
margin-top: 4px;
}
.breadcrumb a {
color: var(--accent-primary);
text-decoration: none;
}
.btn {
padding: 8px 16px;
background-color: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 6px;
color: var(--text-primary);
font-size: 13px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s;
text-decoration: none;
}
.btn:hover {
border-color: var(--accent-primary);
color: var(--accent-primary);
}
.btn-primary {
background-color: var(--accent-primary);
border-color: var(--accent-primary);
color: white;
}
.btn-primary:hover {
background-color: var(--accent-secondary);
color: white;
}
.btn-danger {
background-color: var(--danger);
border-color: var(--danger);
color: white;
}
.btn-danger:hover {
background-color: #dc2626;
}
.alert-box {
background-color: rgba(210, 153, 34, 0.1);
border: 1px solid var(--warning);
border-left: 4px solid var(--warning);
border-radius: 6px;
padding: 20px;
margin-bottom: 24px;
}
.alert-box.danger {
background-color: rgba(248, 81, 73, 0.1);
border-color: var(--danger);
border-left-color: var(--danger);
}
.alert-box.success {
background-color: rgba(63, 185, 80, 0.1);
border-color: var(--success);
border-left-color: var(--success);
}
.alert-title {
font-weight: 600;
margin-bottom: 8px;
font-size: 15px;
display: flex;
align-items: center;
gap: 8px;
}
.alert-content {
font-size: 13px;
color: var(--text-secondary);
line-height: 1.6;
}
.section {
background-color: var(--bg-secondary);
border: 1px solid var(--border-color);
border-radius: 6px;
padding: 24px;
margin-bottom: 24px;
}
.section-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24px;
padding-bottom: 16px;
border-bottom: 1px solid var(--border-color);
}
.section-title {
font-size: 18px;
font-weight: 600;
color: var(--text-primary);
}
.timeline-horizontal {
display: flex;
justify-content: space-between;
margin-bottom: 32px;
position: relative;
}
.timeline-horizontal::before {
content: '';
position: absolute;
top: 20px;
left: 0;
right: 0;
height: 2px;
background: var(--border-color);
z-index: 0;
}
.timeline-step {
flex: 1;
text-align: center;
position: relative;
z-index: 1;
}
.timeline-circle {
width: 40px;
height: 40px;
border-radius: 50%;
background: var(--bg-tertiary);
border: 2px solid var(--border-color);
margin: 0 auto 12px;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 14px;
}
.timeline-step.completed .timeline-circle {
background: var(--success);
border-color: var(--success);
color: white;
}
.timeline-step.active .timeline-circle {
background: var(--warning);
border-color: var(--warning);
color: white;
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% { box-shadow: 0 0 0 0 rgba(210, 153, 34, 0.7); }
50% { box-shadow: 0 0 0 10px rgba(210, 153, 34, 0); }
}
.timeline-label {
font-size: 12px;
color: var(--text-secondary);
font-weight: 600;
margin-bottom: 4px;
}
.timeline-deadline {
font-size: 11px;
color: var(--text-secondary);
}
.timeline-step.completed .timeline-label,
.timeline-step.active .timeline-label {
color: var(--text-primary);
}
.form-section {
background-color: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 6px;
padding: 20px;
margin-bottom: 20px;
}
.form-group {
margin-bottom: 20px;
}
.form-label {
display: block;
font-size: 13px;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 8px;
}
.form-input, .form-select, .form-textarea {
width: 100%;
padding: 10px 12px;
background-color: var(--bg-primary);
border: 1px solid var(--border-color);
border-radius: 6px;
color: var(--text-primary);
font-size: 14px;
font-family: inherit;
}
.form-input:focus, .form-select:focus, .form-textarea:focus {
outline: none;
border-color: var(--accent-primary);
}
.form-textarea {
resize: vertical;
min-height: 120px;
}
.form-help {
font-size: 12px;
color: var(--text-secondary);
margin-top: 6px;
}
.info-box {
background-color: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 6px;
padding: 16px;
margin-bottom: 16px;
}
.info-box-title {
font-weight: 600;
color: var(--accent-primary);
margin-bottom: 8px;
font-size: 13px;
}
.info-box-content {
font-size: 13px;
color: var(--text-secondary);
line-height: 1.6;
}
.data-table {
width: 100%;
border-collapse: collapse;
font-size: 13px;
}
.data-table th {
background-color: var(--bg-primary);
color: var(--text-secondary);
font-weight: 600;
text-align: left;
padding: 10px 12px;
border: 1px solid var(--border-color);
font-size: 11px;
text-transform: uppercase;
}
.data-table td {
padding: 10px 12px;
border: 1px solid var(--border-color);
color: var(--text-primary);
}
@media (max-width: 768px) {
.timeline-horizontal {
flex-direction: column;
}
.timeline-horizontal::before {
display: none;
}
.timeline-step {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 16px;
text-align: left;
}
.timeline-circle {
margin: 0;
}
}
</style>
</head>
<body>
<div class="header">
<div class="header-content">
<div>
<h1>📡 Notifiche CSIRT Italia - INC-2024-047</h1>
<div class="breadcrumb">
<a href="dashboard.html">Dashboard NIS2</a> /
<a href="incident-dashboard.html">Gestione Incidenti</a> /
<a href="incident-detail.html?id=INC-2024-047">INC-2024-047</a> /
Notifiche CSIRT
</div>
</div>
<a href="incident-detail.html?id=INC-2024-047" class="btn">← Torna all'Incidente</a>
</div>
</div>
<div class="container">
<!-- Alert Scadenza -->
<div class="alert-box danger">
<div class="alert-title">
⏰ Scadenza Imminente - Preallarme CSIRT
</div>
<div class="alert-content">
Il <strong>preallarme</strong> deve essere inviato al CSIRT Italia entro <strong>24 ore</strong> dalla conoscenza dell'incidente significativo.<br>
<strong>Scadenza:</strong> 2024-03-07 08:15 (rimangono <span style="color: var(--danger); font-weight: 700;">18 ore</span>)<br>
<strong>Canale:</strong> Portale CSIRT Italia (https://www.csirt.gov.it) o PEC dedicata
</div>
</div>
<!-- Timeline Notifiche -->
<div class="timeline-horizontal">
<div class="timeline-step active">
<div class="timeline-circle">1</div>
<div class="timeline-label">Preallarme</div>
<div class="timeline-deadline">Entro 24h</div>
</div>
<div class="timeline-step">
<div class="timeline-circle">2</div>
<div class="timeline-label">Notifica Completa</div>
<div class="timeline-deadline">Entro 72h</div>
</div>
<div class="timeline-step">
<div class="timeline-circle">3</div>
<div class="timeline-label">Relazioni Intermedie</div>
<div class="timeline-deadline">Su richiesta</div>
</div>
<div class="timeline-step">
<div class="timeline-circle">4</div>
<div class="timeline-label">Relazione Finale</div>
<div class="timeline-deadline">Entro 1 mese</div>
</div>
</div>
<!-- Sezione Preallarme -->
<div class="section">
<div class="section-header">
<div class="section-title">1. Preallarme (Entro 24 ore)</div>
</div>
<div class="info-box">
<div class="info-box-title">📋 Contenuto Minimo Preallarme</div>
<div class="info-box-content">
<ul style="margin-left: 20px; margin-top: 8px;">
<li>Se l'incidente è presumibilmente causato da atti illegittimi o malevoli</li>
<li>Se può avere impatto transfrontaliero</li>
<li>Descrizione preliminare dell'incidente</li>
</ul>
</div>
</div>
<form id="prealertForm">
<div class="form-section">
<h3 style="font-size: 16px; font-weight: 600; margin-bottom: 16px;">Dati Incidente</h3>
<div class="form-group">
<label class="form-label">Codice Incidente</label>
<input type="text" class="form-input" value="INC-2024-047" readonly>
</div>
<div class="form-group">
<label class="form-label">Data/Ora Rilevazione</label>
<input type="text" class="form-input" value="2024-03-06 08:15" readonly>
</div>
<div class="form-group">
<label class="form-label">Classificazione NIS2</label>
<input type="text" class="form-input" value="IS-2 - Impatto su integrità/riservatezza dati" readonly>
</div>
</div>
<div class="form-section">
<h3 style="font-size: 16px; font-weight: 600; margin-bottom: 16px;">Informazioni Preallarme</h3>
<div class="form-group">
<label class="form-label">Atti Illegittimi o Malevoli?</label>
<select class="form-select" required>
<option value="yes" selected>Sì - Attacco ransomware</option>
<option value="no">No</option>
<option value="unknown">Da determinare</option>
</select>
</div>
<div class="form-group">
<label class="form-label">Impatto Transfrontaliero?</label>
<select class="form-select" required>
<option value="no" selected>No</option>
<option value="yes">Sì</option>
<option value="possible">Possibile</option>
</select>
</div>
<div class="form-group">
<label class="form-label">Descrizione Preliminare Incidente</label>
<textarea class="form-textarea" required>Tentativo di attacco ransomware (famiglia BlackCat/ALPHV) rilevato su server ERP di produzione. L'EDR ha bloccato l'esecuzione del malware in fase iniziale. Il vettore di attacco è stato identificato come email phishing con allegato malevolo, sfruttando credenziali utente precedentemente compromesse. Il sistema è stato immediatamente isolato. Nessuna crittografia dati avvenuta. Nessuna esfiltrazione rilevata. Incidente contenuto con successo.</textarea>
<div class="form-help">Fornire una descrizione sintetica ma completa dell'incidente</div>
</div>
<div class="form-group">
<label class="form-label">Sistemi/Servizi Impattati</label>
<textarea class="form-textarea">- Server ERP-PROD-01 (HW-SRV-001)
- Applicazione SAP ERP (SW-ERP-001)
- Servizio gestionale aziendale (SRV-ERP-001)
- 45 utenti interni impattati da interruzione servizio</textarea>
</div>
<div class="form-group">
<label class="form-label">Azioni di Contenimento Adottate</label>
<textarea class="form-textarea">- Isolamento immediato server dalla rete (08:22)
- Blocco account utente compromesso (09:30)
- Blocco IP C2 su firewall (09:45)
- Preservazione evidenze forensi (08:35)
- Attivazione Crisis Team e CISO (08:25)
- Contenimento confermato entro 2.2 ore dalla rilevazione</textarea>
</div>
</div>
<div class="form-section">
<h3 style="font-size: 16px; font-weight: 600; margin-bottom: 16px;">Dati Organizzazione</h3>
<div class="form-group">
<label class="form-label">Nome Organizzazione</label>
<input type="text" class="form-input" value="[Nome Azienda]" required>
</div>
<div class="form-group">
<label class="form-label">Settore NIS2</label>
<select class="form-select" required>
<option value="">Seleziona settore...</option>
<option value="energia">Energia</option>
<option value="trasporti">Trasporti</option>
<option value="bancario">Bancario</option>
<option value="sanitario">Sanitario</option>
<option value="digitale" selected>Infrastrutture Digitali</option>
<option value="acqua">Acqua Potabile</option>
<option value="altro">Altro</option>
</select>
</div>
<div class="form-group">
<label class="form-label">Referente Tecnico</label>
<input type="text" class="form-input" value="CISO - P. Lombardi" required>
</div>
<div class="form-group">
<label class="form-label">Email Contatto</label>
<input type="email" class="form-input" value="ciso@azienda.it" required>
</div>
<div class="form-group">
<label class="form-label">Telefono Contatto</label>
<input type="tel" class="form-input" value="+39 02 1234567" required>
</div>
</div>
<div style="display: flex; gap: 12px; justify-content: flex-end; padding-top: 24px; border-top: 1px solid var(--border-color);">
<button type="button" class="btn" onclick="savePrealertDraft()">Salva Bozza</button>
<button type="button" class="btn btn-primary" onclick="previewPrealert()">Anteprima</button>
<button type="submit" class="btn btn-danger">📡 Invia Preallarme CSIRT</button>
</div>
</form>
</div>
<!-- Sezione Notifica Completa -->
<div class="section">
<div class="section-header">
<div class="section-title">2. Notifica Completa (Entro 72 ore)</div>
</div>
<div class="alert-box">
<div class="alert-title">⏸️ In Attesa Invio Preallarme</div>
<div class="alert-content">
La notifica completa può essere compilata dopo l'invio del preallarme.<br>
<strong>Scadenza:</strong> 2024-03-09 08:15 (72 ore dalla rilevazione)
</div>
</div>
<div class="info-box">
<div class="info-box-title">📋 Contenuto Notifica Completa</div>
<div class="info-box-content">
<ul style="margin-left: 20px; margin-top: 8px;">
<li>Aggiornamento informazioni del preallarme</li>
<li>Valutazione iniziale dell'incidente</li>
<li>Gravità e impatto dettagliato</li>
<li>Indicatori di compromissione (IoC) se disponibili</li>
<li>Misure di contenimento adottate</li>
<li>Stato corrente della gestione</li>
</ul>
</div>
</div>
<button class="btn" disabled style="opacity: 0.5;">Compila Notifica Completa (disponibile dopo preallarme)</button>
</div>
<!-- Sezione Relazione Finale -->
<div class="section">
<div class="section-header">
<div class="section-title">4. Relazione Finale (Entro 1 mese)</div>
</div>
<div class="alert-box">
<div class="alert-title">⏸️ In Attesa Chiusura Incidente</div>
<div class="alert-content">
La relazione finale deve essere inviata entro 1 mese dalla notifica completa,
o entro 1 mese dalla gestione completa dell'incidente se ancora in corso.<br>
<strong>Scadenza stimata:</strong> 2024-04-09
</div>
</div>
<div class="info-box">
<div class="info-box-title">📋 Contenuto Relazione Finale</div>
<div class="info-box-content">
<ul style="margin-left: 20px; margin-top: 8px;">
<li>Descrizione dettagliata dell'incidente</li>
<li>Causa radice (root cause) identificata o probabile</li>
<li>Misure di mitigazione applicate</li>
<li>Impatto transfrontaliero (se applicabile)</li>
<li>Tipo di minaccia o causa radice</li>
<li>Misure correttive in corso e pianificate</li>
<li>Lesson learned e raccomandazioni</li>
</ul>
</div>
</div>
<button class="btn" disabled style="opacity: 0.5;">Compila Relazione Finale (disponibile dopo chiusura incidente)</button>
</div>
<!-- Storico Comunicazioni -->
<div class="section">
<div class="section-header">
<div class="section-title">Storico Comunicazioni CSIRT</div>
</div>
<table class="data-table">
<thead>
<tr>
<th>Data/Ora</th>
<th>Tipo Comunicazione</th>
<th>Canale</th>
<th>Protocollo/Riferimento</th>
<th>Stato</th>
<th>Azioni</th>
</tr>
</thead>
<tbody>
<tr>
<td colspan="6" style="text-align: center; color: var(--text-secondary); padding: 24px;">
Nessuna comunicazione inviata ancora
</td>
</tr>
</tbody>
</table>
</div>
</div>
<script>
function savePrealertDraft() {
alert('Bozza preallarme salvata con successo. Puoi continuare la compilazione in seguito.');
}
function previewPrealert() {
const tooltip = document.createElement('div');
tooltip.style.cssText = `
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: var(--bg-secondary);
border: 1px solid var(--border-color);
border-radius: 8px;
padding: 24px;
box-shadow: 0 8px 24px rgba(0,0,0,0.5);
z-index: 10000;
max-width: 700px;
width: 90%;
max-height: 80vh;
overflow-y: auto;
`;
tooltip.innerHTML = `
<h3 style="margin-bottom: 16px; color: var(--text-primary);">📄 Anteprima Preallarme CSIRT Italia</h3>
<div style="background: var(--bg-tertiary); padding: 20px; border-radius: 6px; margin-bottom: 16px; font-size: 13px; line-height: 1.8; font-family: monospace;">
<strong>PREALLARME INCIDENTE SIGNIFICATIVO NIS2</strong><br>
<strong>Protocollo:</strong> [Generato automaticamente]<br>
<strong>Data invio:</strong> ${new Date().toLocaleString('it-IT')}<br>
<br>
<strong>ORGANIZZAZIONE:</strong> [Nome Azienda]<br>
<strong>Settore:</strong> Infrastrutture Digitali<br>
<strong>Tipologia soggetto:</strong> ${sessionStorage.getItem('nis2_subject_type') === 'essential' ? 'Essenziale' : 'Importante'}<br>
<br>
<strong>CODICE INCIDENTE:</strong> INC-2024-047<br>
<strong>Data/Ora rilevazione:</strong> 2024-03-06 08:15<br>
<strong>Classificazione:</strong> IS-2 (Impatto integrità/riservatezza dati)<br>
<br>
<strong>NATURA INCIDENTE:</strong><br>
☑ Atti illegittimi o malevoli: SÌ (Attacco ransomware)<br>
☐ Impatto transfrontaliero: NO<br>
<br>
<strong>DESCRIZIONE PRELIMINARE:</strong><br>
Tentativo di attacco ransomware (famiglia BlackCat/ALPHV) rilevato su server ERP di produzione.
L'EDR ha bloccato l'esecuzione del malware in fase iniziale. Il vettore di attacco è stato identificato
come email phishing con allegato malevolo, sfruttando credenziali utente precedentemente compromesse.
Il sistema è stato immediatamente isolato. Nessuna crittografia dati avvenuta. Nessuna esfiltrazione rilevata.
Incidente contenuto con successo.<br>
<br>
<strong>SISTEMI IMPATTATI:</strong><br>
- Server ERP-PROD-01<br>
- Applicazione SAP ERP<br>
- 45 utenti interni<br>
<br>
<strong>AZIONI CONTENIMENTO:</strong><br>
- Isolamento server (2.2h)<br>
- Blocco account compromesso<br>
- Blocco IP C2<br>
- Evidenze preservate<br>
<br>
<strong>REFERENTE:</strong> CISO - P. Lombardi<br>
<strong>Contatto:</strong> ciso@azienda.it / +39 02 1234567<br>
<br>
<em>Notifica completa seguirà entro 72 ore.</em>
</div>
<div style="display: flex; gap: 12px;">
<button onclick="this.parentElement.parentElement.remove()" style="flex: 1; padding: 10px; background: var(--bg-tertiary); border: 1px solid var(--border-color); border-radius: 6px; color: var(--text-primary); font-weight: 600; cursor: pointer;">
Chiudi
</button>
<button onclick="this.parentElement.parentElement.remove(); document.getElementById('prealertForm').dispatchEvent(new Event('submit'));" style="flex: 1; padding: 10px; background: var(--danger); border: none; border-radius: 6px; color: white; font-weight: 600; cursor: pointer;">
Conferma e Invia
</button>
</div>
`;
document.body.appendChild(tooltip);
}
document.getElementById('prealertForm').addEventListener('submit', function(e) {
e.preventDefault();
const tooltip = document.createElement('div');
tooltip.style.cssText = `
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: var(--bg-secondary);
border: 2px solid var(--success);
border-radius: 8px;
padding: 32px;
box-shadow: 0 8px 24px rgba(0,0,0,0.5);
z-index: 10000;
max-width: 500px;
text-align: center;
`;
tooltip.innerHTML = `
<div style="font-size: 48px; margin-bottom: 16px;">✅</div>
<h2 style="color: var(--success); margin-bottom: 16px;">Preallarme Inviato con Successo</h2>
<p style="color: var(--text-secondary); margin-bottom: 8px;">Protocollo CSIRT:</p>
<p style="font-size: 20px; font-weight: 700; color: var(--text-primary); margin-bottom: 24px; font-family: monospace;">CSIRT-2024-03-06-${Math.floor(Math.random() * 10000)}</p>
<div style="background: var(--bg-tertiary); padding: 16px; border-radius: 6px; margin-bottom: 24px; text-align: left;">
<p style="font-size: 13px; color: var(--text-secondary); margin-bottom: 12px;"><strong>Dettagli invio:</strong></p>
<ul style="font-size: 13px; color: var(--text-secondary); margin-left: 20px;">
<li>Data/Ora invio: ${new Date().toLocaleString('it-IT')}</li>
<li>Canale: Portale CSIRT Italia</li>
<li>Ricevuta PEC: Confermata</li>
<li>Scadenza rispettata: ✅ SÌ (entro 24h)</li>
</ul>
<p style="font-size: 13px; color: var(--text-secondary); margin-top: 12px;">
<strong>Prossimo step:</strong> Notifica completa entro 2024-03-09 08:15 (72h)
</p>
</div>
<button onclick="window.location.href='incident-detail.html?id=INC-2024-047'" style="padding: 12px 24px; background: var(--accent-primary); border: none; border-radius: 6px; color: white; font-weight: 600; cursor: pointer;">
Torna all'Incidente
</button>
`;
document.body.appendChild(tooltip);
});
</script>
</body>
</html>
+803
View File
@@ -0,0 +1,803 @@
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Post-Incident Review - INC-2024-047</title>
<style>
:root {
--bg-primary: #0d1117;
--bg-secondary: #161b22;
--bg-tertiary: #1c2128;
--border-color: #30363d;
--text-primary: #c9d1d9;
--text-secondary: #8b949e;
--accent-primary: #58a6ff;
--success: #3fb950;
--warning: #d29922;
--danger: #f85149;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;
background-color: var(--bg-primary);
color: var(--text-primary);
line-height: 1.6;
overflow-y: auto;
}
.container {
max-width: 1400px;
margin: 0 auto;
padding: 20px;
}
.header {
background-color: var(--bg-secondary);
border-bottom: 1px solid var(--border-color);
padding: 24px 0;
margin-bottom: 32px;
position: sticky;
top: 0;
z-index: 100;
}
.header-content {
max-width: 1400px;
margin: 0 auto;
padding: 0 20px;
display: flex;
justify-content: space-between;
align-items: center;
}
.header h1 {
font-size: 24px;
font-weight: 600;
color: var(--text-primary);
}
.breadcrumb {
font-size: 13px;
color: var(--text-secondary);
margin-top: 4px;
}
.breadcrumb a {
color: var(--accent-primary);
text-decoration: none;
}
.btn {
padding: 8px 16px;
background-color: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 6px;
color: var(--text-primary);
font-size: 13px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s;
text-decoration: none;
}
.btn:hover {
border-color: var(--accent-primary);
}
.btn-primary {
background-color: var(--accent-primary);
border-color: var(--accent-primary);
color: white;
}
.btn-primary:hover {
background-color: #1f6feb;
}
.alert-box {
background-color: rgba(88, 166, 255, 0.1);
border: 1px solid var(--accent-primary);
border-left: 4px solid var(--accent-primary);
border-radius: 6px;
padding: 20px;
margin-bottom: 24px;
}
.alert-title {
font-weight: 600;
margin-bottom: 8px;
font-size: 15px;
}
.alert-content {
font-size: 13px;
color: var(--text-secondary);
line-height: 1.6;
}
.section {
background-color: var(--bg-secondary);
border: 1px solid var(--border-color);
border-radius: 6px;
padding: 24px;
margin-bottom: 24px;
}
.section-title {
font-size: 18px;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 20px;
padding-bottom: 12px;
border-bottom: 1px solid var(--border-color);
}
.metrics-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 16px;
margin-bottom: 24px;
}
.metric-card {
background-color: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 6px;
padding: 16px;
text-align: center;
}
.metric-label {
font-size: 11px;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
margin-bottom: 8px;
}
.metric-value {
font-size: 28px;
font-weight: 700;
color: var(--text-primary);
}
.metric-value.success {
color: var(--success);
}
.metric-value.warning {
color: var(--warning);
}
.form-group {
margin-bottom: 20px;
}
.form-label {
display: block;
font-size: 13px;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 8px;
}
.form-textarea {
width: 100%;
padding: 12px;
background-color: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 6px;
color: var(--text-primary);
font-size: 14px;
font-family: inherit;
resize: vertical;
min-height: 100px;
}
.form-textarea:focus {
outline: none;
border-color: var(--accent-primary);
}
.data-table {
width: 100%;
border-collapse: collapse;
font-size: 13px;
}
.data-table th {
background-color: var(--bg-tertiary);
color: var(--text-secondary);
font-weight: 600;
text-align: left;
padding: 10px 12px;
border: 1px solid var(--border-color);
font-size: 11px;
text-transform: uppercase;
}
.data-table td {
padding: 10px 12px;
border: 1px solid var(--border-color);
color: var(--text-primary);
}
.priority-high {
color: var(--danger);
font-weight: 700;
}
.priority-medium {
color: var(--warning);
font-weight: 600;
}
.priority-low {
color: var(--text-secondary);
}
.status-badge {
display: inline-block;
padding: 4px 8px;
border-radius: 3px;
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
}
.status-planned {
background-color: rgba(88, 166, 255, 0.2);
color: var(--accent-primary);
border: 1px solid var(--accent-primary);
}
.status-progress {
background-color: rgba(210, 153, 34, 0.2);
color: var(--warning);
border: 1px solid var(--warning);
}
.status-completed {
background-color: rgba(63, 185, 80, 0.2);
color: var(--success);
border: 1px solid var(--success);
}
</style>
</head>
<body>
<div class="header">
<div class="header-content">
<div>
<h1>📊 Post-Incident Review - INC-2024-047</h1>
<div class="breadcrumb">
<a href="dashboard.html">Dashboard NIS2</a> /
<a href="incident-dashboard.html">Gestione Incidenti</a> /
<a href="incident-detail.html?id=INC-2024-047">INC-2024-047</a> /
Post-Incident Review
</div>
</div>
<div style="display: flex; gap: 8px;">
<button class="btn" onclick="exportPIR()">📄 Esporta Report</button>
<a href="incident-detail.html?id=INC-2024-047" class="btn">← Torna all'Incidente</a>
</div>
</div>
</div>
<div class="container">
<div class="alert-box">
<div class="alert-title">ℹ️ Post-Incident Review (RC.CO-03)</div>
<div class="alert-content">
Analisi completa dell'incidente per identificare lesson learned e azioni di miglioramento.
Da completare entro <strong>2 settimane dalla chiusura</strong> per incidenti SEV-1/SEV-2.
<br><br>
<strong>Partecipanti richiesti:</strong> Incident Response Team, CISO, Responsabili Divisione impattate, Direzione (per SEV-1)
</div>
</div>
<!-- Metriche Incidente -->
<div class="section">
<div class="section-title">Metriche Incidente</div>
<div class="metrics-grid">
<div class="metric-card">
<div class="metric-label">TTD (Time to Detect)</div>
<div class="metric-value success">0.5h</div>
<div style="font-size: 11px; color: var(--text-secondary); margin-top: 4px;">Target: <2h ✅</div>
</div>
<div class="metric-card">
<div class="metric-label">TTC (Time to Contain)</div>
<div class="metric-value success">2.2h</div>
<div style="font-size: 11px; color: var(--text-secondary); margin-top: 4px;">Target SEV-1: <1h ⚠️</div>
</div>
<div class="metric-card">
<div class="metric-label">TTR (Time to Recover)</div>
<div class="metric-value success">30.25h</div>
<div style="font-size: 11px; color: var(--text-secondary); margin-top: 4px;">RTO: ≤48h ✅</div>
</div>
<div class="metric-card">
<div class="metric-label">Downtime Totale</div>
<div class="metric-value warning">30h 15m</div>
<div style="font-size: 11px; color: var(--text-secondary); margin-top: 4px;">45 utenti impattati</div>
</div>
<div class="metric-card">
<div class="metric-label">Costo Stimato</div>
<div class="metric-value">€12.5K</div>
<div style="font-size: 11px; color: var(--text-secondary); margin-top: 4px;">Diretto + indiretto</div>
</div>
<div class="metric-card">
<div class="metric-label">Conformità Notifiche</div>
<div class="metric-value success">100%</div>
<div style="font-size: 11px; color: var(--text-secondary); margin-top: 4px;">CSIRT entro 24h ✅</div>
</div>
</div>
</div>
<!-- Root Cause Analysis -->
<div class="section">
<div class="section-title">Root Cause Analysis (5 Whys)</div>
<div style="background: var(--bg-tertiary); padding: 20px; border-radius: 6px; margin-bottom: 20px;">
<div style="margin-bottom: 16px;">
<strong style="color: var(--accent-primary);">Problema:</strong> Tentativo di attacco ransomware su server ERP
</div>
<div style="margin-bottom: 12px;">
<strong style="color: var(--text-primary);">1. Perché è successo?</strong><br>
<span style="color: var(--text-secondary);">→ Perché un utente ha aperto un allegato malevolo da email phishing</span>
</div>
<div style="margin-bottom: 12px;">
<strong style="color: var(--text-primary);">2. Perché l'utente ha aperto l'allegato?</strong><br>
<span style="color: var(--text-secondary);">→ Perché l'email sembrava legittima (spoofing fornitore) e l'utente non ha riconosciuto i segnali di phishing</span>
</div>
<div style="margin-bottom: 12px;">
<strong style="color: var(--text-primary);">3. Perché l'utente non ha riconosciuto il phishing?</strong><br>
<span style="color: var(--text-secondary);">→ Perché la formazione awareness sulla sicurezza non era sufficientemente frequente e pratica</span>
</div>
<div style="margin-bottom: 12px;">
<strong style="color: var(--text-primary);">4. Perché le credenziali dell'utente erano già compromesse?</strong><br>
<span style="color: var(--text-secondary);">→ Perché l'utente utilizzava la stessa password su servizi esterni (credential stuffing attack non rilevato)</span>
</div>
<div>
<strong style="color: var(--text-primary);">5. Perché non c'era MFA obbligatoria su account amministrativi?</strong><br>
<span style="color: var(--text-secondary);">→ Perché la policy MFA era in fase di rollout graduale e non ancora applicata a tutti gli account admin</span>
</div>
</div>
<div style="background: var(--bg-tertiary); padding: 16px; border-radius: 6px; border-left: 4px solid var(--danger);">
<strong style="color: var(--danger);">ROOT CAUSE IDENTIFICATA:</strong><br>
<span style="color: var(--text-secondary); font-size: 13px;">
1. MFA non obbligatoria su tutti gli account amministrativi<br>
2. Formazione awareness non sufficientemente efficace<br>
3. Monitoraggio credential stuffing non attivo<br>
4. Policy password debole (riutilizzo su servizi esterni)
</span>
</div>
</div>
<!-- Valutazione Efficacia -->
<div class="section">
<div class="section-title">Valutazione Efficacia Risposta</div>
<table class="data-table">
<thead>
<tr>
<th>Fase</th>
<th>Valutazione</th>
<th>Punti di Forza</th>
<th>Aree di Miglioramento</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Rilevazione</strong></td>
<td><span style="color: var(--success); font-weight: 600;">✅ Eccellente</span></td>
<td>EDR ha bloccato immediatamente il malware. TTD: 0.5h</td>
<td>Nessuna - detection efficace</td>
</tr>
<tr>
<td><strong>Triage</strong></td>
<td><span style="color: var(--success); font-weight: 600;">✅ Buono</span></td>
<td>Classificazione corretta entro 1h. Crisis Team attivato tempestivamente</td>
<td>Processo decisionale può essere ulteriormente accelerato</td>
</tr>
<tr>
<td><strong>Contenimento</strong></td>
<td><span style="color: var(--warning); font-weight: 600;">⚠️ Sufficiente</span></td>
<td>Isolamento rapido. Nessuna propagazione</td>
<td>TTC 2.2h > target 1h per SEV-1. Procedure di isolamento da ottimizzare</td>
</tr>
<tr>
<td><strong>Eradicazione</strong></td>
<td><span style="color: var(--success); font-weight: 600;">✅ Buono</span></td>
<td>Rimozione completa minaccia. Hardening applicato</td>
<td>Analisi forense richiede più tempo del previsto</td>
</tr>
<tr>
<td><strong>Ripristino</strong></td>
<td><span style="color: var(--success); font-weight: 600;">✅ Buono</span></td>
<td>TTR 30.25h < RTO 48h. Backup immutabile efficace</td>
<td>Processo di verifica post-ripristino può essere standardizzato</td>
</tr>
<tr>
<td><strong>Comunicazioni</strong></td>
<td><span style="color: var(--success); font-weight: 600;">✅ Eccellente</span></td>
<td>Preallarme CSIRT entro 24h. Comunicazioni interne tempestive</td>
<td>Template comunicazioni possono essere pre-compilati</td>
</tr>
</tbody>
</table>
</div>
<!-- Gap Identificati -->
<div class="section">
<div class="section-title">Gap Identificati</div>
<div class="form-group">
<label class="form-label">1. GAP TECNICI</label>
<textarea class="form-textarea" readonly>• MFA non obbligatoria su tutti gli account amministrativi
• Monitoraggio credential stuffing assente
• Filtri email anti-phishing non sufficientemente efficaci
• Procedure di isolamento automatico non implementate
• Tempo di contenimento superiore al target per SEV-1</textarea>
</div>
<div class="form-group">
<label class="form-label">2. GAP PROCEDURALI</label>
<textarea class="form-textarea" readonly>• Policy MFA in rollout graduale (non completata)
• Procedura di isolamento rapido non documentata
• Checklist contenimento SEV-1 non disponibile in formato rapido
• Processo di escalation Crisis Team può essere ottimizzato
• Template comunicazioni non pre-compilati</textarea>
</div>
<div class="form-group">
<label class="form-label">3. GAP ORGANIZZATIVI</label>
<textarea class="form-textarea" readonly>• Formazione awareness non sufficientemente frequente
• Simulazioni phishing non regolari
• Policy password debole (riutilizzo su servizi esterni non vietato esplicitamente)
• Competenze forensics interne limitate (dipendenza da consulenti esterni)</textarea>
</div>
<div class="form-group">
<label class="form-label">4. GAP FORMATIVI</label>
<textarea class="form-textarea" readonly>• Utenti non addestrati a riconoscere phishing avanzato
• Account amministrativi senza formazione specifica su minacce mirate
• Awareness su riutilizzo password insufficiente
• Esercitazioni tabletop incident response non regolari</textarea>
</div>
</div>
<!-- Azioni Correttive -->
<div class="section">
<div class="section-title">Piano Azioni Correttive</div>
<table class="data-table">
<thead>
<tr>
<th>ID</th>
<th>Azione Correttiva</th>
<th>Categoria</th>
<th>Priorità</th>
<th>Responsabile</th>
<th>Scadenza</th>
<th>Org. Rif.</th>
<th>Stato</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>AC-001</strong></td>
<td>Implementare MFA obbligatoria su TUTTI gli account amministrativi</td>
<td>Tecnica</td>
<td><span class="priority-high">ALTA</span></td>
<td>IT Manager</td>
<td>2024-03-20</td>
<td>Org.03</td>
<td><span class="status-badge status-progress">In corso</span></td>
</tr>
<tr>
<td><strong>AC-002</strong></td>
<td>Implementare monitoraggio credential stuffing su SIEM</td>
<td>Tecnica</td>
<td><span class="priority-high">ALTA</span></td>
<td>SOC Lead</td>
<td>2024-03-25</td>
<td>Org.09</td>
<td><span class="status-badge status-planned">Pianificata</span></td>
</tr>
<tr>
<td><strong>AC-003</strong></td>
<td>Rafforzare filtri anti-phishing email gateway</td>
<td>Tecnica</td>
<td><span class="priority-high">ALTA</span></td>
<td>IT Security</td>
<td>2024-03-15</td>
<td>Org.08</td>
<td><span class="status-badge status-progress">In corso</span></td>
</tr>
<tr>
<td><strong>AC-004</strong></td>
<td>Implementare isolamento automatico endpoint compromessi</td>
<td>Tecnica</td>
<td><span class="priority-medium">MEDIA</span></td>
<td>IT Security</td>
<td>2024-04-15</td>
<td>Org.08</td>
<td><span class="status-badge status-planned">Pianificata</span></td>
</tr>
<tr>
<td><strong>AC-005</strong></td>
<td>Aggiornare policy password (vietare riutilizzo su servizi esterni)</td>
<td>Procedurale</td>
<td><span class="priority-high">ALTA</span></td>
<td>CISO</td>
<td>2024-03-10</td>
<td>Org.03</td>
<td><span class="status-badge status-progress">In corso</span></td>
</tr>
<tr>
<td><strong>AC-006</strong></td>
<td>Creare checklist rapida contenimento SEV-1</td>
<td>Procedurale</td>
<td><span class="priority-medium">MEDIA</span></td>
<td>CISO</td>
<td>2024-03-15</td>
<td>Org.10</td>
<td><span class="status-badge status-planned">Pianificata</span></td>
</tr>
<tr>
<td><strong>AC-007</strong></td>
<td>Preparare template comunicazioni pre-compilati</td>
<td>Procedurale</td>
<td><span class="priority-low">BASSA</span></td>
<td>CISO</td>
<td>2024-04-30</td>
<td>Org.10</td>
<td><span class="status-badge status-planned">Pianificata</span></td>
</tr>
<tr>
<td><strong>AC-008</strong></td>
<td>Aumentare frequenza formazione awareness (mensile)</td>
<td>Formativa</td>
<td><span class="priority-high">ALTA</span></td>
<td>HR + CISO</td>
<td>2024-04-01</td>
<td>Org.04</td>
<td><span class="status-badge status-planned">Pianificata</span></td>
</tr>
<tr>
<td><strong>AC-009</strong></td>
<td>Implementare simulazioni phishing trimestrali</td>
<td>Formativa</td>
<td><span class="priority-medium">MEDIA</span></td>
<td>CISO</td>
<td>2024-04-15</td>
<td>Org.04</td>
<td><span class="status-badge status-planned">Pianificata</span></td>
</tr>
<tr>
<td><strong>AC-010</strong></td>
<td>Formazione specifica account amministrativi su minacce mirate</td>
<td>Formativa</td>
<td><span class="priority-medium">MEDIA</span></td>
<td>CISO</td>
<td>2024-03-30</td>
<td>Org.04</td>
<td><span class="status-badge status-planned">Pianificata</span></td>
</tr>
<tr>
<td><strong>AC-011</strong></td>
<td>Aggiornare risk assessment con nuovo scenario ransomware</td>
<td>Organizzativa</td>
<td><span class="priority-high">ALTA</span></td>
<td>CISO</td>
<td>2024-03-20</td>
<td>Org.05</td>
<td><span class="status-badge status-planned">Pianificata</span></td>
</tr>
<tr>
<td><strong>AC-012</strong></td>
<td>Pianificare esercitazione tabletop ransomware</td>
<td>Organizzativa</td>
<td><span class="priority-medium">MEDIA</span></td>
<td>CISO</td>
<td>2024-05-31</td>
<td>Org.08</td>
<td><span class="status-badge status-planned">Pianificata</span></td>
</tr>
</tbody>
</table>
<div style="margin-top: 24px; padding: 16px; background: var(--bg-tertiary); border-radius: 6px;">
<strong style="color: var(--text-primary);">Riepilogo Azioni:</strong><br>
<div style="display: flex; gap: 24px; margin-top: 12px; font-size: 13px;">
<div>
<span style="color: var(--text-secondary);">Totali:</span>
<strong style="color: var(--text-primary);"> 12</strong>
</div>
<div>
<span style="color: var(--text-secondary);">Alta priorità:</span>
<strong style="color: var(--danger);"> 6</strong>
</div>
<div>
<span style="color: var(--text-secondary);">Media priorità:</span>
<strong style="color: var(--warning);"> 5</strong>
</div>
<div>
<span style="color: var(--text-secondary);">Bassa priorità:</span>
<strong style="color: var(--text-secondary);"> 1</strong>
</div>
</div>
</div>
</div>
<!-- Raccomandazioni -->
<div class="section">
<div class="section-title">Raccomandazioni e Lesson Learned</div>
<div style="background: var(--bg-tertiary); padding: 20px; border-radius: 6px; margin-bottom: 16px;">
<h4 style="font-size: 14px; font-weight: 600; color: var(--success); margin-bottom: 12px;">
✅ COSA HA FUNZIONATO BENE
</h4>
<ul style="font-size: 13px; color: var(--text-secondary); line-height: 1.8; margin-left: 20px;">
<li>EDR ha bloccato immediatamente il ransomware prima della crittografia</li>
<li>Backup immutabile ha permesso ripristino rapido e sicuro</li>
<li>Crisis Team ha risposto prontamente e in modo coordinato</li>
<li>Comunicazioni CSIRT rispettate nei tempi (preallarme entro 24h)</li>
<li>Nessuna propagazione dell'attacco ad altri sistemi</li>
<li>Preservazione evidenze forensi efficace</li>
</ul>
</div>
<div style="background: var(--bg-tertiary); padding: 20px; border-radius: 6px; margin-bottom: 16px;">
<h4 style="font-size: 14px; font-weight: 600; color: var(--warning); margin-bottom: 12px;">
⚠️ COSA MIGLIORARE
</h4>
<ul style="font-size: 13px; color: var(--text-secondary); line-height: 1.8; margin-left: 20px;">
<li>Tempo di contenimento (2.2h) superiore al target per SEV-1 (<1h)</li>
<li>MFA non era obbligatoria su account amministrativi</li>
<li>Formazione awareness non sufficientemente efficace</li>
<li>Monitoraggio credential stuffing assente</li>
<li>Procedure di isolamento rapido non documentate</li>
</ul>
</div>
<div style="background: var(--bg-tertiary); padding: 20px; border-radius: 6px;">
<h4 style="font-size: 14px; font-weight: 600; color: var(--accent-primary); margin-bottom: 12px;">
💡 LESSON LEARNED CHIAVE
</h4>
<ol style="font-size: 13px; color: var(--text-secondary); line-height: 1.8; margin-left: 20px;">
<li><strong>MFA è fondamentale:</strong> L'assenza di MFA su account amministrativi è stata la vulnerabilità critica. Implementazione immediata obbligatoria.</li>
<li><strong>Backup immutabile salva:</strong> Il backup immutabile ha evitato perdita dati e permesso ripristino rapido. Investimento essenziale.</li>
<li><strong>EDR efficace ma non sufficiente:</strong> EDR ha bloccato il malware ma non ha prevenuto il phishing. Serve approccio multi-layer.</li>
<li><strong>Formazione continua necessaria:</strong> Awareness sporadica non è efficace. Serve formazione continua e simulazioni pratiche.</li>
<li><strong>Procedure automatiche riducono TTC:</strong> Isolamento manuale ha richiesto tempo. Automazione può ridurre significativamente TTC.</li>
<li><strong>Comunicazioni tempestive cruciali:</strong> Rispetto scadenze CSIRT e comunicazioni interne hanno evitato complicazioni legali/reputazionali.</li>
</ol>
</div>
</div>
<!-- Finalizzazione -->
<div class="section">
<div class="section-title">Finalizzazione Post-Incident Review</div>
<div style="background: var(--bg-tertiary); padding: 16px; border-radius: 6px; margin-bottom: 20px;">
<strong style="color: var(--text-primary);">Partecipanti PIR:</strong><br>
<ul style="font-size: 13px; color: var(--text-secondary); margin-top: 8px; margin-left: 20px;">
<li>CISO - P. Lombardi (coordinatore)</li>
<li>SOC Lead - L. Verdi</li>
<li>System Admin - G. Rossi</li>
<li>Forensics Team - A. Neri</li>
<li>IT Manager - M. Bianchi</li>
<li>Responsabile Divisione Finance - S. Neri</li>
<li>Direzione - CdA Representative</li>
</ul>
</div>
<div style="display: flex; gap: 12px; justify-content: flex-end; padding-top: 24px; border-top: 1px solid var(--border-color);">
<button class="btn" onclick="savePIRDraft()">Salva Bozza</button>
<button class="btn" onclick="exportPIR()">📄 Esporta Report</button>
<button class="btn btn-primary" onclick="completePIR()">✅ Finalizza PIR e Chiudi Incidente</button>
</div>
</div>
</div>
<script>
function savePIRDraft() {
alert('Bozza Post-Incident Review salvata con successo.');
}
function exportPIR() {
const tooltip = document.createElement('div');
tooltip.style.cssText = `
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: var(--bg-secondary);
border: 1px solid var(--border-color);
border-radius: 8px;
padding: 24px;
box-shadow: 0 8px 24px rgba(0,0,0,0.5);
z-index: 10000;
max-width: 500px;
`;
tooltip.innerHTML = `
<h3 style="margin-bottom: 16px; color: var(--text-primary);">📄 Export Report Post-Incident Review</h3>
<p style="color: var(--text-secondary); margin-bottom: 16px; font-size: 13px;">
Report completo PIR per incidente INC-2024-047
</p>
<div style="background: var(--bg-tertiary); padding: 16px; border-radius: 4px; margin-bottom: 16px; font-family: monospace; font-size: 12px;">
📄 PIR_INC-2024-047_Report_Completo.pdf<br>
📄 PIR_INC-2024-047_Azioni_Correttive.xlsx<br>
📄 PIR_INC-2024-047_Executive_Summary.pdf<br>
📄 PIR_INC-2024-047_Lesson_Learned.docx
</div>
<button onclick="this.parentElement.remove()" style="width: 100%; padding: 10px; background: var(--accent-primary); border: none; border-radius: 6px; color: white; font-weight: 600; cursor: pointer;">
Chiudi
</button>
`;
document.body.appendChild(tooltip);
}
function completePIR() {
const tooltip = document.createElement('div');
tooltip.style.cssText = `
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: var(--bg-secondary);
border: 2px solid var(--success);
border-radius: 8px;
padding: 32px;
box-shadow: 0 8px 24px rgba(0,0,0,0.5);
z-index: 10000;
max-width: 600px;
text-align: center;
`;
tooltip.innerHTML = `
<div style="font-size: 48px; margin-bottom: 16px;">✅</div>
<h2 style="color: var(--success); margin-bottom: 16px;">Post-Incident Review Completata</h2>
<p style="color: var(--text-secondary); margin-bottom: 24px; font-size: 14px;">
Incidente INC-2024-047 ufficialmente chiuso
</p>
<div style="background: var(--bg-tertiary); padding: 20px; border-radius: 6px; margin-bottom: 24px; text-align: left;">
<p style="font-size: 13px; color: var(--text-secondary); margin-bottom: 12px;"><strong>Riepilogo Finale:</strong></p>
<ul style="font-size: 13px; color: var(--text-secondary); margin-left: 20px;">
<li>12 azioni correttive identificate e assegnate</li>
<li>6 azioni ad alta priorità in tracking</li>
<li>Risk assessment aggiornato (Org.05)</li>
<li>Lesson learned condivise con team</li>
<li>Report PIR distribuito a stakeholder</li>
<li>Relazione finale CSIRT da completare</li>
</ul>
<p style="font-size: 13px; color: var(--text-secondary); margin-top: 16px;">
<strong>Prossimi step:</strong> Monitoraggio azioni correttive tramite sistema non conformità (ID.IM-01)
</p>
</div>
<div style="display: flex; gap: 12px;">
<button onclick="window.location.href='incident-dashboard.html'" style="flex: 1; padding: 12px; background: var(--bg-tertiary); border: 1px solid var(--border-color); border-radius: 6px; color: var(--text-primary); font-weight: 600; cursor: pointer;">
Dashboard Incidenti
</button>
<button onclick="window.location.href='incident-notification.html?id=INC-2024-047&action=final'" style="flex: 1; padding: 12px; background: var(--accent-primary); border: none; border-radius: 6px; color: white; font-weight: 600; cursor: pointer;">
Completa Relazione Finale CSIRT
</button>
</div>
`;
document.body.appendChild(tooltip);
}
</script>
</body>
</html>
@@ -0,0 +1,660 @@
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ripristino Servizi - INC-2024-047</title>
<style>
:root {
--bg-primary: #0d1117;
--bg-secondary: #161b22;
--bg-tertiary: #1c2128;
--border-color: #30363d;
--text-primary: #c9d1d9;
--text-secondary: #8b949e;
--accent-primary: #58a6ff;
--success: #3fb950;
--warning: #d29922;
--danger: #f85149;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;
background-color: var(--bg-primary);
color: var(--text-primary);
line-height: 1.6;
overflow-y: auto;
}
.container {
max-width: 1400px;
margin: 0 auto;
padding: 20px;
}
.header {
background-color: var(--bg-secondary);
border-bottom: 1px solid var(--border-color);
padding: 24px 0;
margin-bottom: 32px;
position: sticky;
top: 0;
z-index: 100;
}
.header-content {
max-width: 1400px;
margin: 0 auto;
padding: 0 20px;
display: flex;
justify-content: space-between;
align-items: center;
}
.header h1 {
font-size: 24px;
font-weight: 600;
color: var(--text-primary);
}
.breadcrumb {
font-size: 13px;
color: var(--text-secondary);
margin-top: 4px;
}
.breadcrumb a {
color: var(--accent-primary);
text-decoration: none;
}
.btn {
padding: 8px 16px;
background-color: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 6px;
color: var(--text-primary);
font-size: 13px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s;
text-decoration: none;
}
.btn:hover {
border-color: var(--accent-primary);
}
.btn-success {
background-color: var(--success);
border-color: var(--success);
color: white;
}
.btn-success:hover {
background-color: #2ea043;
}
.alert-box {
background-color: rgba(88, 166, 255, 0.1);
border: 1px solid var(--accent-primary);
border-left: 4px solid var(--accent-primary);
border-radius: 6px;
padding: 20px;
margin-bottom: 24px;
}
.alert-title {
font-weight: 600;
margin-bottom: 8px;
font-size: 15px;
}
.alert-content {
font-size: 13px;
color: var(--text-secondary);
line-height: 1.6;
}
.section {
background-color: var(--bg-secondary);
border: 1px solid var(--border-color);
border-radius: 6px;
padding: 24px;
margin-bottom: 24px;
}
.section-title {
font-size: 18px;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 20px;
padding-bottom: 12px;
border-bottom: 1px solid var(--border-color);
}
.checklist {
list-style: none;
}
.checklist li {
padding: 12px;
background-color: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 4px;
margin-bottom: 8px;
display: flex;
align-items: center;
gap: 12px;
}
.checklist input[type="checkbox"] {
width: 20px;
height: 20px;
cursor: pointer;
}
.checklist li.completed {
background-color: rgba(63, 185, 80, 0.1);
border-color: var(--success);
}
.priority-badge {
display: inline-block;
padding: 4px 8px;
border-radius: 3px;
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
}
.priority-1 {
background-color: rgba(248, 81, 73, 0.2);
color: var(--danger);
border: 1px solid var(--danger);
}
.priority-2 {
background-color: rgba(210, 153, 34, 0.2);
color: var(--warning);
border: 1px solid var(--warning);
}
.data-table {
width: 100%;
border-collapse: collapse;
font-size: 13px;
}
.data-table th {
background-color: var(--bg-tertiary);
color: var(--text-secondary);
font-weight: 600;
text-align: left;
padding: 10px 12px;
border: 1px solid var(--border-color);
font-size: 11px;
text-transform: uppercase;
}
.data-table td {
padding: 10px 12px;
border: 1px solid var(--border-color);
color: var(--text-primary);
}
.data-table tr:hover {
background-color: var(--bg-tertiary);
}
</style>
</head>
<body>
<div class="header">
<div class="header-content">
<div>
<h1>🔄 Ripristino Servizi - INC-2024-047</h1>
<div class="breadcrumb">
<a href="dashboard.html">Dashboard NIS2</a> /
<a href="incident-dashboard.html">Gestione Incidenti</a> /
<a href="incident-detail.html?id=INC-2024-047">INC-2024-047</a> /
Ripristino
</div>
</div>
<a href="incident-detail.html?id=INC-2024-047" class="btn">← Torna all'Incidente</a>
</div>
</div>
<div class="container">
<div class="alert-box">
<div class="alert-title">ℹ️ Processo di Ripristino (RC.RP-01)</div>
<div class="alert-content">
Ripristino graduale dei servizi secondo priorità BIA. Ogni sistema deve essere verificato per integrità,
funzionalità e sicurezza prima del ripristino in produzione. Monitoraggio intensivo post-ripristino per 72 ore.
</div>
</div>
<!-- Priorità Ripristino -->
<div class="section">
<div class="section-title">Priorità Ripristino (secondo BIA Org.08)</div>
<table class="data-table">
<thead>
<tr>
<th>Priorità</th>
<th>Sistema/Servizio</th>
<th>RTO Dichiarato</th>
<th>Stato</th>
<th>ETA Ripristino</th>
<th>Azioni</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="priority-badge priority-1">P1 - Critico</span></td>
<td><strong>Server ERP-PROD-01</strong><br>Sistema gestionale principale</td>
<td>≤4h</td>
<td><span style="color: var(--warning);">🔄 In ripristino</span></td>
<td>2024-03-08 14:00</td>
<td><button class="btn" onclick="viewRecoveryDetails('erp')">Dettagli</button></td>
</tr>
<tr>
<td><span class="priority-badge priority-1">P1 - Critico</span></td>
<td><strong>Applicazione SAP ERP</strong><br>Software gestionale</td>
<td>≤4h</td>
<td><span style="color: var(--text-secondary);">⏸️ In attesa server</span></td>
<td>2024-03-08 16:00</td>
<td><button class="btn" disabled>In attesa</button></td>
</tr>
</tbody>
</table>
</div>
<!-- Checklist Ripristino -->
<div class="section">
<div class="section-title">Checklist Ripristino Server ERP-PROD-01</div>
<h3 style="font-size: 16px; font-weight: 600; margin-bottom: 16px; color: var(--text-primary);">1. Valutazione Pre-Ripristino</h3>
<ul class="checklist">
<li class="completed">
<input type="checkbox" checked disabled>
<span>Minaccia completamente rimossa ed eradicata</span>
</li>
<li class="completed">
<input type="checkbox" checked disabled>
<span>Nessun indicatore di compromissione residuo</span>
</li>
<li class="completed">
<input type="checkbox" checked disabled>
<span>Backup verificato e integro (hash matching)</span>
</li>
<li class="completed">
<input type="checkbox" checked disabled>
<span>Strategia di ripristino definita: Ripristino da backup immutabile</span>
</li>
</ul>
<h3 style="font-size: 16px; font-weight: 600; margin: 24px 0 16px; color: var(--text-primary);">2. Ripristino Sistema</h3>
<ul class="checklist">
<li class="completed">
<input type="checkbox" checked disabled>
<span>Ripristino da backup immutabile avviato (2024-03-07 10:00)</span>
</li>
<li class="completed">
<input type="checkbox" checked disabled>
<span>Sistema operativo ripristinato e verificato</span>
</li>
<li>
<input type="checkbox" id="check1" onchange="updateProgress()">
<span>Applicazione ERP ripristinata e configurata</span>
</li>
<li>
<input type="checkbox" id="check2" onchange="updateProgress()">
<span>Database ripristinato e verificato integrità</span>
</li>
<li>
<input type="checkbox" id="check3" onchange="updateProgress()">
<span>Patch di sicurezza applicati (ultimi aggiornamenti)</span>
</li>
<li>
<input type="checkbox" id="check4" onchange="updateProgress()">
<span>Configurazione hardening applicata (baseline CIS)</span>
</li>
</ul>
<h3 style="font-size: 16px; font-weight: 600; margin: 24px 0 16px; color: var(--text-primary);">3. Verifica Integrità e Sicurezza</h3>
<ul class="checklist">
<li>
<input type="checkbox" id="check5" onchange="updateProgress()">
<span>Integrità dati verificata (confronto checksum con backup)</span>
</li>
<li>
<input type="checkbox" id="check6" onchange="updateProgress()">
<span>Test funzionali applicativi completati con successo</span>
</li>
<li>
<input type="checkbox" id="check7" onchange="updateProgress()">
<span>Scansione antimalware completa (nessuna minaccia rilevata)</span>
</li>
<li>
<input type="checkbox" id="check8" onchange="updateProgress()">
<span>Verifica assenza IoC residui</span>
</li>
<li>
<input type="checkbox" id="check9" onchange="updateProgress()">
<span>Configurazione EDR verificata e attiva</span>
</li>
<li>
<input type="checkbox" id="check10" onchange="updateProgress()">
<span>Log attivi e integrati nel SIEM</span>
</li>
</ul>
<h3 style="font-size: 16px; font-weight: 600; margin: 24px 0 16px; color: var(--text-primary);">4. Ripristino Accessi</h3>
<ul class="checklist">
<li>
<input type="checkbox" id="check11" onchange="updateProgress()">
<span>Reset credenziali per tutti gli account potenzialmente compromessi</span>
</li>
<li>
<input type="checkbox" id="check12" onchange="updateProgress()">
<span>MFA verificata e funzionante per tutti gli account admin</span>
</li>
<li>
<input type="checkbox" id="check13" onchange="updateProgress()">
<span>Riattivazione accessi graduale per ruolo (admin → power user → user)</span>
</li>
<li>
<input type="checkbox" id="check14" onchange="updateProgress()">
<span>Monitoraggio accessi post-ripristino attivato</span>
</li>
</ul>
<h3 style="font-size: 16px; font-weight: 600; margin: 24px 0 16px; color: var(--text-primary);">5. Ripristino Connettività</h3>
<ul class="checklist">
<li>
<input type="checkbox" id="check15" onchange="updateProgress()">
<span>Regole firewall aggiornate (IP C2 bloccati permanentemente)</span>
</li>
<li>
<input type="checkbox" id="check16" onchange="updateProgress()">
<span>Segmentazione rete verificata</span>
</li>
<li>
<input type="checkbox" id="check17" onchange="updateProgress()">
<span>Test connettività end-to-end completati</span>
</li>
<li>
<input type="checkbox" id="check18" onchange="updateProgress()">
<span>Monitoraggio traffico anomalo attivo</span>
</li>
</ul>
<h3 style="font-size: 16px; font-weight: 600; margin: 24px 0 16px; color: var(--text-primary);">6. Validazione Finale</h3>
<ul class="checklist">
<li>
<input type="checkbox" id="check19" onchange="updateProgress()">
<span>Sign-off tecnico: Team Incident Response</span>
</li>
<li>
<input type="checkbox" id="check20" onchange="updateProgress()">
<span>Sign-off business: Responsabile Divisione</span>
</li>
<li>
<input type="checkbox" id="check21" onchange="updateProgress()">
<span>Sign-off sicurezza: CISO</span>
</li>
<li>
<input type="checkbox" id="check22" onchange="updateProgress()">
<span>Dichiarazione di ripristino completato</span>
</li>
</ul>
<div style="margin-top: 24px; padding: 20px; background: var(--bg-tertiary); border-radius: 6px; display: flex; justify-content: space-between; align-items: center;">
<div>
<div style="font-size: 13px; color: var(--text-secondary); margin-bottom: 8px;">Progresso Ripristino</div>
<div style="font-size: 24px; font-weight: 700; color: var(--text-primary);" id="progressText">9%</div>
</div>
<button class="btn btn-success" onclick="completeRecovery()" id="completeBtn" disabled style="opacity: 0.5;">
✅ Completa Ripristino
</button>
</div>
</div>
<!-- Monitoraggio Post-Ripristino -->
<div class="section">
<div class="section-title">Piano Monitoraggio Post-Ripristino</div>
<div style="background: var(--bg-tertiary); padding: 16px; border-radius: 6px; margin-bottom: 16px;">
<h4 style="font-size: 14px; font-weight: 600; color: var(--text-primary); margin-bottom: 12px;">
📊 Monitoraggio Intensivo (72 ore)
</h4>
<ul style="font-size: 13px; color: var(--text-secondary); line-height: 1.8; margin-left: 20px;">
<li>Monitoraggio continuo 24/7 da SOC</li>
<li>Soglie di alerting ridotte (maggiore sensibilità)</li>
<li>Threat hunting mirato ogni 8 ore</li>
<li>Report giornaliero stato sistema</li>
<li>Verifica integrità file system ogni 12 ore</li>
</ul>
</div>
<div style="background: var(--bg-tertiary); padding: 16px; border-radius: 6px; margin-bottom: 16px;">
<h4 style="font-size: 14px; font-weight: 600; color: var(--text-primary); margin-bottom: 12px;">
📈 Monitoraggio Elevato (30 giorni)
</h4>
<ul style="font-size: 13px; color: var(--text-secondary); line-height: 1.8; margin-left: 20px;">
<li>Monitoraggio continuo con priorità alta</li>
<li>Threat hunting settimanale</li>
<li>Report settimanale a CISO</li>
<li>Verifica periodica IoC</li>
<li>Analisi comportamentale utenti e processi</li>
</ul>
</div>
<table class="data-table">
<thead>
<tr>
<th>Metrica</th>
<th>Baseline Pre-Incidente</th>
<th>Target Post-Ripristino</th>
<th>Frequenza Check</th>
</tr>
</thead>
<tbody>
<tr>
<td>CPU Usage</td>
<td>45-60%</td>
<td>45-60% (±5%)</td>
<td>Ogni 5 minuti</td>
</tr>
<tr>
<td>Memory Usage</td>
<td>70-75%</td>
<td>70-75% (±5%)</td>
<td>Ogni 5 minuti</td>
</tr>
<tr>
<td>Network Traffic</td>
<td>2-5 Gbps</td>
<td>2-5 Gbps</td>
<td>Continuo</td>
</tr>
<tr>
<td>Failed Login Attempts</td>
<td><5/ora</td>
<td><3/ora</td>
<td>Real-time</td>
</tr>
<tr>
<td>Processi Anomali</td>
<td>0</td>
<td>0</td>
<td>Ogni 15 minuti</td>
</tr>
<tr>
<td>Connessioni Esterne Sospette</td>
<td>0</td>
<td>0</td>
<td>Real-time</td>
</tr>
</tbody>
</table>
</div>
<!-- Comunicazioni Ripristino -->
<div class="section">
<div class="section-title">Comunicazioni Ripristino Completato</div>
<div style="background: var(--bg-tertiary); padding: 16px; border-radius: 6px; margin-bottom: 16px;">
<h4 style="font-size: 14px; font-weight: 600; color: var(--text-primary); margin-bottom: 12px;">
📧 Template Comunicazione Interna
</h4>
<div style="font-size: 13px; color: var(--text-secondary); line-height: 1.8; font-family: monospace; background: var(--bg-primary); padding: 12px; border-radius: 4px;">
<strong>Oggetto:</strong> Ripristino Servizio ERP Completato<br><br>
Gentili colleghi,<br><br>
Vi informiamo che il servizio ERP è stato completamente ripristinato e
risulta nuovamente operativo a partire dalle ore [DATA/ORA].<br><br>
<strong>Azioni richieste agli utenti:</strong><br>
• Effettuare reset password al primo accesso<br>
• Verificare che MFA sia attiva<br>
• Segnalare immediatamente qualsiasi comportamento anomalo<br><br>
Il sistema è sotto monitoraggio intensivo per le prossime 72 ore.<br><br>
Per qualsiasi problema contattare l'helpdesk.<br><br>
Grazie per la collaborazione.<br>
IT Security Team
</div>
</div>
<div style="background: var(--bg-tertiary); padding: 16px; border-radius: 6px;">
<h4 style="font-size: 14px; font-weight: 600; color: var(--text-primary); margin-bottom: 12px;">
📡 Aggiornamento CSIRT Italia
</h4>
<div style="font-size: 13px; color: var(--text-secondary); line-height: 1.8;">
Aggiornare la notifica CSIRT con informazioni sul ripristino completato:
<ul style="margin-left: 20px; margin-top: 8px;">
<li>Data/ora ripristino completato</li>
<li>Servizi ripristinati</li>
<li>Downtime totale effettivo vs RTO</li>
<li>Misure di hardening applicate</li>
<li>Piano di monitoraggio post-ripristino</li>
</ul>
</div>
</div>
</div>
</div>
<script>
function updateProgress() {
const total = 22;
let checked = 2; // I primi 2 sono già checked
for (let i = 1; i <= 22; i++) {
const checkbox = document.getElementById('check' + i);
if (checkbox && checkbox.checked) {
checked++;
checkbox.parentElement.classList.add('completed');
} else if (checkbox) {
checkbox.parentElement.classList.remove('completed');
}
}
const percentage = Math.round((checked / total) * 100);
document.getElementById('progressText').textContent = percentage + '%';
const completeBtn = document.getElementById('completeBtn');
if (percentage === 100) {
completeBtn.disabled = false;
completeBtn.style.opacity = '1';
} else {
completeBtn.disabled = true;
completeBtn.style.opacity = '0.5';
}
}
function completeRecovery() {
const tooltip = document.createElement('div');
tooltip.style.cssText = `
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: var(--bg-secondary);
border: 2px solid var(--success);
border-radius: 8px;
padding: 32px;
box-shadow: 0 8px 24px rgba(0,0,0,0.5);
z-index: 10000;
max-width: 600px;
text-align: center;
`;
tooltip.innerHTML = `
<div style="font-size: 48px; margin-bottom: 16px;">✅</div>
<h2 style="color: var(--success); margin-bottom: 16px;">Ripristino Completato con Successo</h2>
<div style="background: var(--bg-tertiary); padding: 20px; border-radius: 6px; margin-bottom: 24px; text-align: left;">
<p style="font-size: 13px; color: var(--text-secondary); margin-bottom: 12px;"><strong>Riepilogo Ripristino:</strong></p>
<table style="width: 100%; font-size: 13px; color: var(--text-secondary);">
<tr>
<td><strong>Sistema:</strong></td>
<td>ERP-PROD-01</td>
</tr>
<tr>
<td><strong>Data ripristino:</strong></td>
<td>${new Date().toLocaleString('it-IT')}</td>
</tr>
<tr>
<td><strong>Downtime totale:</strong></td>
<td>30h 15m</td>
</tr>
<tr>
<td><strong>RTO dichiarato:</strong></td>
<td>≤48h</td>
</tr>
<tr>
<td><strong>Conformità RTO:</strong></td>
<td style="color: var(--success); font-weight: 600;">✅ Rispettato</td>
</tr>
<tr>
<td><strong>TTR (Time to Recover):</strong></td>
<td>30.25h</td>
</tr>
</table>
<p style="font-size: 13px; color: var(--text-secondary); margin-top: 16px;">
<strong>Stato:</strong> Sistema operativo, monitoraggio intensivo attivo per 72 ore.
</p>
</div>
<div style="background: var(--bg-tertiary); padding: 16px; border-radius: 6px; margin-bottom: 24px; text-align: left;">
<p style="font-size: 13px; color: var(--text-secondary); margin-bottom: 12px;"><strong>Prossime azioni:</strong></p>
<ul style="font-size: 13px; color: var(--text-secondary); margin-left: 20px;">
<li>Comunicazione utenti inviata</li>
<li>Aggiornamento notifica CSIRT</li>
<li>Monitoraggio intensivo 72h avviato</li>
<li>Pianificazione Post-Incident Review</li>
</ul>
</div>
<div style="display: flex; gap: 12px;">
<button onclick="window.location.href='incident-detail.html?id=INC-2024-047'" style="flex: 1; padding: 12px; background: var(--bg-tertiary); border: 1px solid var(--border-color); border-radius: 6px; color: var(--text-primary); font-weight: 600; cursor: pointer;">
Torna all'Incidente
</button>
<button onclick="window.location.href='incident-pir.html?id=INC-2024-047'" style="flex: 1; padding: 12px; background: var(--accent-primary); border: none; border-radius: 6px; color: white; font-weight: 600; cursor: pointer;">
Avvia Post-Incident Review
</button>
</div>
`;
document.body.appendChild(tooltip);
}
function viewRecoveryDetails(system) {
alert('Dettagli processo di ripristino per: ' + system);
}
// Inizializza progresso
window.addEventListener('DOMContentLoaded', updateProgress);
</script>
</body>
</html>