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>
957 lines
40 KiB
HTML
957 lines
40 KiB
HTML
<!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>
|