[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:
co-authored by
Claude Opus 4.8
parent
a7a21faa82
commit
5c545ea3d0
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user