ids.alfacom.it/generate_iso27001_doc.py
marco370 66e110ce4c Generate comprehensive ISO 27001 compliance documentation in Word format
Add python-docx dependency and a new script to generate a Word document detailing the IDS features and mapping them to ISO 27001 Annex A controls.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 7a657272-55ba-4a79-9a2e-f1ed9bc7a528
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 2744be16-afcd-406e-ae68-fcf62f19bcc3
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/449cf7c4-c97a-45ae-8234-e5c5b8d6a84f/7a657272-55ba-4a79-9a2e-f1ed9bc7a528/RyXWGQA
2026-02-14 10:53:03 +00:00

623 lines
28 KiB
Python

#!/usr/bin/env python3
"""Genera documento Word IDS - Conformità ISO 27001"""
from docx import Document
from docx.shared import Inches, Pt, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from datetime import datetime
doc = Document()
style = doc.styles['Normal']
font = style.font
font.name = 'Calibri'
font.size = Pt(11)
sections = doc.sections
for section in sections:
section.top_margin = Cm(2.5)
section.bottom_margin = Cm(2.5)
section.left_margin = Cm(2.5)
section.right_margin = Cm(2.5)
# --- COVER PAGE ---
for _ in range(6):
doc.add_paragraph("")
title = doc.add_paragraph()
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = title.add_run("INTRUSION DETECTION SYSTEM (IDS)")
run.bold = True
run.font.size = Pt(28)
run.font.color.rgb = RGBColor(0, 51, 102)
subtitle = doc.add_paragraph()
subtitle.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = subtitle.add_run("Documentazione Funzionale e Conformità ISO/IEC 27001:2022")
run.font.size = Pt(16)
run.font.color.rgb = RGBColor(51, 51, 51)
doc.add_paragraph("")
info = doc.add_paragraph()
info.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = info.add_run("Sistema di Rilevamento Intrusioni per Router MikroTik\ncon Machine Learning e Blocco Automatico")
run.font.size = Pt(12)
run.font.color.rgb = RGBColor(100, 100, 100)
doc.add_paragraph("")
doc.add_paragraph("")
meta = doc.add_paragraph()
meta.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = meta.add_run(f"Versione: 2.0.0\nData: {datetime.now().strftime('%d/%m/%Y')}\nClassificazione: Riservato")
run.font.size = Pt(11)
run.font.color.rgb = RGBColor(100, 100, 100)
doc.add_page_break()
# --- TABLE OF CONTENTS ---
doc.add_heading('Indice', level=1)
toc_items = [
"1. Introduzione e Scopo del Documento",
"2. Panoramica del Sistema IDS",
"3. Architettura del Sistema",
"4. Funzionalità del Sistema",
" 4.1 Raccolta e Analisi Log (Syslog)",
" 4.2 Rilevamento Anomalie con Machine Learning",
" 4.3 Blocco Automatico degli IP Malevoli",
" 4.4 Gestione Whitelist e Blacklist",
" 4.5 Liste Pubbliche e Threat Intelligence",
" 4.6 Dashboard e Monitoraggio in Tempo Reale",
" 4.7 Geolocalizzazione IP",
" 4.8 Gestione Router MikroTik",
" 4.9 Pulizia Automatica dei Dati",
" 4.10 Monitoraggio Servizi",
"5. Mappatura Controlli ISO/IEC 27001:2022",
"6. Controlli Annex A Coperti",
"7. Politiche di Sicurezza Implementate",
"8. Gestione degli Incidenti",
"9. Continuità Operativa e Disponibilità",
"10. Audit e Tracciabilità",
"11. Conclusioni",
]
for item in toc_items:
p = doc.add_paragraph(item)
p.paragraph_format.space_after = Pt(2)
doc.add_page_break()
# --- 1. INTRODUZIONE ---
doc.add_heading('1. Introduzione e Scopo del Documento', level=1)
doc.add_paragraph(
"Il presente documento descrive le funzionalità, l'architettura e le misure di sicurezza "
"implementate nel Sistema di Rilevamento Intrusioni (IDS) progettato per ambienti di rete "
"basati su router MikroTik. Lo scopo principale è fornire evidenza documentale della conformità "
"del sistema ai requisiti dello standard ISO/IEC 27001:2022, con particolare riferimento ai "
"controlli dell'Annex A relativi alla sicurezza delle reti, al monitoraggio, alla gestione "
"degli incidenti e alla protezione delle informazioni."
)
doc.add_paragraph(
"Questo documento è destinato a responsabili della sicurezza informatica, auditor interni "
"ed esterni, e al management aziendale coinvolto nel Sistema di Gestione della Sicurezza "
"delle Informazioni (SGSI/ISMS)."
)
# --- 2. PANORAMICA ---
doc.add_heading('2. Panoramica del Sistema IDS', level=1)
doc.add_paragraph(
"L'IDS è un sistema completo di sicurezza di rete che integra raccolta log in tempo reale, "
"analisi basata su Machine Learning, blocco automatico degli IP malevoli e monitoraggio "
"continuo dello stato della rete. Il sistema è progettato per operare in ambienti con "
"10+ router MikroTik e gestire volumi elevati di traffico (186M+ record di log di rete)."
)
doc.add_heading('Caratteristiche Principali', level=2)
features_main = [
"Rilevamento anomalie in tempo reale tramite Isolation Forest e classificatore ensemble",
"Blocco automatico degli IP con risk score >= 80 sui router MikroTik via REST API",
"Integrazione con feed di threat intelligence pubblici (Spamhaus, Talos, AWS, GCP, Microsoft Azure, Meta/Facebook, Cloudflare)",
"Dashboard web interattiva con visualizzazioni in tempo reale",
"Gestione whitelist/blacklist con supporto completo CIDR",
"Geolocalizzazione automatica degli IP rilevati",
"Sistema di pulizia automatica dei dati obsoleti",
"Monitoraggio continuo dei servizi di sistema",
]
for f in features_main:
doc.add_paragraph(f, style='List Bullet')
# --- 3. ARCHITETTURA ---
doc.add_heading('3. Architettura del Sistema', level=1)
doc.add_paragraph(
"Il sistema adotta un'architettura a microservizi composta da tre componenti principali:"
)
arch_table = doc.add_table(rows=5, cols=3)
arch_table.style = 'Light Grid Accent 1'
arch_table.alignment = WD_TABLE_ALIGNMENT.CENTER
headers = ['Componente', 'Tecnologia', 'Funzione']
for i, h in enumerate(headers):
arch_table.rows[0].cells[i].text = h
for paragraph in arch_table.rows[0].cells[i].paragraphs:
for run in paragraph.runs:
run.bold = True
arch_data = [
['Frontend Web', 'React, ShadCN UI, TanStack Query', 'Dashboard di monitoraggio, gestione whitelist/blacklist, visualizzazione rilevamenti'],
['Backend API', 'Node.js, Express, Drizzle ORM', 'API REST, gestione database PostgreSQL, coordinamento servizi'],
['Backend ML', 'Python, FastAPI, scikit-learn, XGBoost', 'Analisi anomalie con Isolation Forest e classificatore ensemble, blocco automatico IP'],
['Database', 'PostgreSQL', 'Persistenza dati: log di rete, rilevamenti, whitelist, blacklist, configurazione router'],
]
for i, row_data in enumerate(arch_data):
for j, cell_text in enumerate(row_data):
arch_table.rows[i+1].cells[j].text = cell_text
doc.add_paragraph("")
doc.add_paragraph(
"La comunicazione tra i componenti avviene tramite API REST protette da autenticazione "
"mediante API Key (header X-API-Key). Il database PostgreSQL è accessibile solo dai "
"backend tramite connessione autenticata."
)
# --- 4. FUNZIONALITÀ ---
doc.add_heading('4. Funzionalità del Sistema', level=1)
# 4.1
doc.add_heading('4.1 Raccolta e Analisi Log (Syslog)', level=2)
doc.add_paragraph(
"Il componente syslog_parser.py riceve i log syslog via protocollo UDP sulla porta 514 "
"da tutti i router MikroTik configurati. I log vengono analizzati, normalizzati e "
"memorizzati nel database PostgreSQL nella tabella network_logs."
)
doc.add_heading('Caratteristiche:', level=3)
syslog_features = [
"Ricezione syslog UDP sulla porta 514 (standard RFC 5424)",
"Parsing automatico dei messaggi syslog con estrazione di IP sorgente, destinazione, porte, protocollo",
"Auto-reconnect e recovery in caso di errori di connessione al database",
"Politica di retention dei dati: 3 giorni di conservazione dei log grezzi",
"Gestione di volumi elevati: oltre 186 milioni di record processati",
]
for f in syslog_features:
doc.add_paragraph(f, style='List Bullet')
# 4.2
doc.add_heading('4.2 Rilevamento Anomalie con Machine Learning', level=2)
doc.add_paragraph(
"Il cuore del sistema è il motore di Machine Learning che utilizza un approccio ibrido "
"per il rilevamento delle anomalie, combinando due algoritmi complementari per ridurre "
"i falsi positivi e migliorare l'accuratezza del rilevamento."
)
doc.add_heading('Algoritmi Utilizzati:', level=3)
ml_features = [
"Extended Isolation Forest (EIF): algoritmo non supervisionato per il rilevamento di anomalie basato sull'isolamento dei punti dati anomali. Analizza 25 feature di rete estratte dai log.",
"Classificatore Ensemble con Voting Pesato: combina XGBoost e altri classificatori per una classificazione più precisa delle anomalie rilevate.",
"Risk Score (0-100): ogni IP riceve un punteggio di rischio su scala 0-100 distribuito su 5 livelli (Normale <40, Basso 40-59, Medio 60-69, Alto 70-84, Critico >=85).",
"Retraining automatico settimanale del modello ML per adattarsi ai nuovi pattern di traffico.",
"Analisi ogni 2 minuti dei log dell'ultima ora per rilevamento near-real-time.",
]
for f in ml_features:
doc.add_paragraph(f, style='List Bullet')
doc.add_heading('Feature di Rete Analizzate (25 feature):', level=3)
doc.add_paragraph(
"Il modello analizza feature quali: frequenza delle connessioni per IP, distribuzione delle porte "
"di destinazione, rapporto pacchetti in/out, diversità dei protocolli, pattern temporali, "
"entropia delle connessioni, velocità di scansione porte, distribuzione geografica delle "
"connessioni, e altre metriche statistiche derivate dal traffico di rete."
)
# 4.3
doc.add_heading('4.3 Blocco Automatico degli IP Malevoli', level=2)
doc.add_paragraph(
"Gli IP identificati come critici (risk score >= 80) vengono automaticamente bloccati "
"su tutti i router MikroTik configurati tramite la REST API di RouterOS."
)
block_features = [
"Blocco automatico ogni 2 minuti per IP con risk score >= 80",
"Comunicazione con router MikroTik tramite REST API (HTTP/HTTPS)",
"Blocco parallelo su tutti i router abilitati contemporaneamente",
"Verifica whitelist prima del blocco (gli IP in whitelist non vengono mai bloccati)",
"Blocco massivo retroattivo: endpoint /block-all-critical per bloccare tutti gli IP critici storici non ancora bloccati",
"Sblocco manuale disponibile dalla dashboard web (pulsante 'Sblocca Router')",
"Auto-sblocco quando un IP viene aggiunto alla whitelist",
"Timeout configurabile per le regole di blocco sul router",
"Tracciamento dello stato di blocco nel database (campo blocked e blocked_at)",
]
for f in block_features:
doc.add_paragraph(f, style='List Bullet')
# 4.4
doc.add_heading('4.4 Gestione Whitelist e Blacklist', level=2)
doc.add_paragraph(
"Il sistema gestisce whitelist e blacklist con supporto completo per singoli IP e "
"range CIDR, utilizzando i tipi nativi INET/CIDR di PostgreSQL per un matching efficiente."
)
wl_features = [
"Whitelist manuale: aggiunta/rimozione IP dalla dashboard web con motivo e note",
"Blacklist automatica: alimentata da feed di threat intelligence pubblici",
"Supporto completo CIDR: matching di range di rete (es. 192.168.0.0/16) con operatori PostgreSQL <<=",
"Logica di priorità: Whitelist manuale > Whitelist pubblica > Blacklist",
"Auto-sblocco dai router quando un IP viene aggiunto alla whitelist",
"Paginazione server-side (50 record/pagina) e ricerca con debounce per performance",
"Campo source per tracciare l'origine di ogni entry (manuale, Spamhaus, AWS, ecc.)",
]
for f in wl_features:
doc.add_paragraph(f, style='List Bullet')
# 4.5
doc.add_heading('4.5 Liste Pubbliche e Threat Intelligence', level=2)
doc.add_paragraph(
"Il sistema integra automaticamente feed di threat intelligence da fonti pubbliche riconosciute, "
"sincronizzandoli ogni 10 minuti per mantenere aggiornate le liste di IP noti come malevoli "
"o appartenenti a provider cloud legittimi."
)
lists_table = doc.add_table(rows=8, cols=3)
lists_table.style = 'Light Grid Accent 1'
lists_table.alignment = WD_TABLE_ALIGNMENT.CENTER
list_headers = ['Feed', 'Tipo', 'Descrizione']
for i, h in enumerate(list_headers):
lists_table.rows[0].cells[i].text = h
for paragraph in lists_table.rows[0].cells[i].paragraphs:
for run in paragraph.runs:
run.bold = True
list_data = [
['Spamhaus DROP', 'Blacklist', "Lista di IP/CIDR noti per attività malevole (spam, botnet, C&C)"],
['Talos Intelligence', 'Blacklist', 'Feed di threat intelligence di Cisco Talos'],
['Amazon AWS', 'Whitelist', 'Range IP ufficiali dei servizi cloud AWS'],
['Google Cloud/GCP', 'Whitelist', 'Range IP ufficiali dei servizi Google Cloud'],
['Microsoft Azure', 'Whitelist', 'Range IP ufficiali dei servizi cloud Microsoft Azure'],
['Meta (Facebook)', 'Whitelist', 'Range IP di Meta (Facebook, Instagram, WhatsApp)'],
['Cloudflare', 'Whitelist', 'Range IP della CDN Cloudflare'],
]
for i, row_data in enumerate(list_data):
for j, cell_text in enumerate(row_data):
lists_table.rows[i+1].cells[j].text = cell_text
doc.add_paragraph("")
doc.add_paragraph(
"La merge logic applica una priorità basata sul tipo: gli IP in whitelist manuale hanno "
"sempre la precedenza, seguiti dalla whitelist pubblica e infine dalla blacklist. Questo "
"previene il blocco accidentale di servizi cloud legittimi."
)
# 4.6
doc.add_heading('4.6 Dashboard e Monitoraggio in Tempo Reale', level=2)
doc.add_paragraph(
"La dashboard web fornisce una visione completa e in tempo reale dello stato della "
"sicurezza di rete, con aggiornamento automatico ogni 10 secondi."
)
dash_features = [
"Panoramica generale: contatori di router attivi, rilevamenti totali, IP bloccati, IP critici",
"Pagina Rilevamenti: elenco paginato (50/pagina) con ricerca server-side su IP, paese, organizzazione",
"Pagina Whitelist: gestione paginata con ricerca e operazioni CRUD",
"Pagina Analytics: grafici e visualizzazioni del traffico normale vs attacco",
"Filtri avanzati: per tipo di anomalia (DDoS, Port Scan, Brute Force, Botnet), range di risk score",
"Indicatori visivi: badge colorati per livelli di rischio, stato di blocco, flag paese",
"Monitoraggio servizi: stato in tempo reale di ML Backend, Database, Syslog Parser",
"Operazioni dirette: pulsanti per aggiungere a whitelist, sbloccare router, avviare training ML",
]
for f in dash_features:
doc.add_paragraph(f, style='List Bullet')
# 4.7
doc.add_heading('4.7 Geolocalizzazione IP', level=2)
doc.add_paragraph(
"Integrazione con il servizio ip-api.com per arricchire ogni rilevamento con informazioni "
"geografiche e di rete, inclusi paese, città, ISP, numero AS e organizzazione. "
"Il sistema implementa caching intelligente per ridurre le chiamate API e rispettare i "
"rate limit del servizio."
)
# 4.8
doc.add_heading('4.8 Gestione Router MikroTik', level=2)
doc.add_paragraph(
"Il sistema comunica con i router MikroTik tramite la REST API di RouterOS, "
"supportando operazioni parallele su multipli router contemporaneamente."
)
router_features = [
"Configurazione router: IP, porta API, credenziali, abilitazione/disabilitazione",
"Test di connettività automatico",
"Supporto HTTP (porta 80) e HTTPS (porta 443) con gestione certificati SSL/TLS",
"Operazioni parallele su tutti i router (blocco/sblocco simultaneo)",
"Gestione address-list di firewall (aggiunta, rimozione, lettura)",
"Compatibilità con RouterOS 7.x e versioni successive",
]
for f in router_features:
doc.add_paragraph(f, style='List Bullet')
# 4.9
doc.add_heading('4.9 Pulizia Automatica dei Dati', level=2)
doc.add_paragraph(
"Un timer systemd orario esegue lo script cleanup_detections.py che:"
)
cleanup_features = [
"Rimuove rilevamenti più vecchi di 48 ore",
"Sblocca automaticamente gli IP bloccati da più di 2 ore",
"Mantiene la retention dei log di rete a 3 giorni",
"Registra statistiche di pulizia nei log di sistema",
]
for f in cleanup_features:
doc.add_paragraph(f, style='List Bullet')
# 4.10
doc.add_heading('4.10 Monitoraggio Servizi', level=2)
doc.add_paragraph(
"La dashboard fornisce monitoraggio in tempo reale dello stato dei servizi critici "
"con possibilità di riavvio tramite API protette."
)
service_features = [
"Monitoraggio stato: ML Backend, Database PostgreSQL, Syslog Parser",
"API per gestione servizi (start/stop/restart) protette da API Key",
"Integrazione con systemd per il controllo dei servizi Python",
"Health check endpoint (/health) per verifica rapida dello stato del sistema",
]
for f in service_features:
doc.add_paragraph(f, style='List Bullet')
# --- 5. MAPPATURA ISO 27001 ---
doc.add_heading('5. Mappatura Controlli ISO/IEC 27001:2022', level=1)
doc.add_paragraph(
"La seguente tabella mappa le funzionalità dell'IDS ai controlli dell'Annex A dello "
"standard ISO/IEC 27001:2022, evidenziando come il sistema contribuisce alla conformità."
)
iso_table = doc.add_table(rows=1, cols=4)
iso_table.style = 'Light Grid Accent 1'
iso_table.alignment = WD_TABLE_ALIGNMENT.CENTER
iso_headers = ['Controllo', 'Titolo', 'Funzionalità IDS', 'Copertura']
for i, h in enumerate(iso_headers):
iso_table.rows[0].cells[i].text = h
for paragraph in iso_table.rows[0].cells[i].paragraphs:
for run in paragraph.runs:
run.bold = True
iso_mappings = [
['A.5.1', 'Politiche per la sicurezza delle informazioni',
'Politiche di blocco automatico, soglie di rischio configurabili, logica di priorità whitelist/blacklist',
'Parziale'],
['A.5.7', 'Threat intelligence',
'Integrazione automatica con 7+ feed di threat intelligence (Spamhaus, Talos, AWS, GCP, Azure, Meta, Cloudflare)',
'Completa'],
['A.5.24', 'Pianificazione e preparazione della gestione degli incidenti',
'Rilevamento automatico anomalie, classificazione per livello di rischio, workflow di risposta automatizzato',
'Completa'],
['A.5.25', 'Valutazione e decisione sugli eventi di sicurezza',
'Risk scoring ML (0-100), classificazione automatica in 5 livelli, soglie configurabili',
'Completa'],
['A.5.26', 'Risposta agli incidenti di sicurezza',
'Blocco automatico IP critici sui router, sblocco manuale, gestione whitelist',
'Completa'],
['A.5.28', 'Raccolta delle evidenze',
'Log completi di tutte le operazioni, timestamp di rilevamento e blocco, geolocalizzazione',
'Completa'],
['A.8.1', 'Dispositivi endpoint utente',
'Protezione della rete tramite blocco IP malevoli a livello router (perimetrale)',
'Parziale'],
['A.8.9', 'Gestione della configurazione',
'Gestione centralizzata della configurazione dei router, migrazioni database versionante',
'Parziale'],
['A.8.15', 'Logging',
'Raccolta syslog centralizzata da tutti i router, retention 3 giorni, 186M+ record',
'Completa'],
['A.8.16', 'Attività di monitoraggio',
'Dashboard real-time, auto-refresh 10s, monitoraggio servizi, alert visivi per livelli di rischio',
'Completa'],
['A.8.20', 'Sicurezza delle reti',
'Firewall automatico via address-list MikroTik, blocco parallelo su tutti i router',
'Completa'],
['A.8.21', 'Sicurezza dei servizi di rete',
'Protezione contro DDoS, port scanning, brute force, botnet tramite rilevamento ML',
'Completa'],
['A.8.22', 'Segregazione delle reti',
'Supporto multi-router con configurazioni indipendenti, blocco selettivo per router',
'Parziale'],
['A.8.23', 'Filtraggio web',
'Blocco IP malevoli a livello di rete, integrazione blacklist/whitelist',
'Parziale'],
]
for mapping in iso_mappings:
row = iso_table.add_row()
for i, cell_text in enumerate(mapping):
row.cells[i].text = cell_text
# --- 6. CONTROLLI ANNEX A ---
doc.add_heading('6. Controlli Annex A Coperti - Dettaglio', level=1)
doc.add_heading('A.5.7 - Threat Intelligence', level=2)
doc.add_paragraph(
"Il sistema implementa un processo automatizzato di raccolta e integrazione di threat intelligence "
"da fonti pubbliche riconosciute a livello internazionale. La sincronizzazione avviene ogni 10 minuti "
"tramite il servizio ids-list-fetcher, che scarica, analizza e aggiorna le liste nel database. "
"La merge logic applica una gerarchia di priorità per evitare conflitti tra liste diverse."
)
doc.add_heading('A.5.24/25/26 - Gestione Incidenti', level=2)
doc.add_paragraph(
"Il ciclo di vita degli incidenti di sicurezza è gestito automaticamente:\n"
"1. RILEVAMENTO: Il modello ML analizza i log ogni 2 minuti e identifica anomalie\n"
"2. CLASSIFICAZIONE: Ogni anomalia riceve un risk score e viene categorizzata (DDoS, Port Scan, Brute Force, Botnet)\n"
"3. RISPOSTA: Gli IP con score >= 80 vengono bloccati automaticamente sui router\n"
"4. DOCUMENTAZIONE: Ogni evento viene registrato con timestamp, geolocalizzazione, score e stato di blocco\n"
"5. RISOLUZIONE: Pulizia automatica dopo 48 ore, sblocco dopo 2 ore, possibilità di whitelist manuale"
)
doc.add_heading('A.8.15/16 - Logging e Monitoraggio', level=2)
doc.add_paragraph(
"Il sistema fornisce capacità complete di logging e monitoraggio:\n"
"- Raccolta centralizzata dei log syslog da tutti i router via UDP:514\n"
"- Conservazione dei log per 3 giorni con retention policy automatica\n"
"- Dashboard di monitoraggio con aggiornamento ogni 10 secondi\n"
"- Monitoraggio dello stato dei servizi (ML Backend, Database, Syslog Parser)\n"
"- Visualizzazioni analitiche del traffico normale vs attacco\n"
"- Paginazione e ricerca server-side per gestire grandi volumi di dati"
)
# --- 7. POLITICHE DI SICUREZZA ---
doc.add_heading('7. Politiche di Sicurezza Implementate', level=1)
doc.add_heading('7.1 Autenticazione e Controllo Accessi', level=2)
sec_features = [
"API Key authentication (header X-API-Key) per tutti gli endpoint del backend ML",
"Credenziali router cifrate nel database",
"Connessioni database autenticate con credenziali separate",
"Supporto HTTPS/TLS per la comunicazione con i router MikroTik",
]
for f in sec_features:
doc.add_paragraph(f, style='List Bullet')
doc.add_heading('7.2 Protezione dei Dati', level=2)
data_features = [
"Database PostgreSQL con accesso autenticato",
"Retention policy automatica: 3 giorni per log, 48 ore per rilevamenti",
"Nessun dato sensibile esposto tramite API pubblica",
"Validazione input con schema Zod per prevenire injection",
"Query parametrizzate per prevenire SQL injection",
]
for f in data_features:
doc.add_paragraph(f, style='List Bullet')
doc.add_heading('7.3 Disponibilità e Resilienza', level=2)
avail_features = [
"Auto-reconnect del parser syslog in caso di disconnessione dal database",
"Timer systemd con restart automatico dei servizi in caso di failure",
"Health check endpoint per monitoraggio esterno",
"Architettura a microservizi: il failure di un componente non blocca gli altri",
]
for f in avail_features:
doc.add_paragraph(f, style='List Bullet')
# --- 8. GESTIONE INCIDENTI ---
doc.add_heading('8. Gestione degli Incidenti', level=1)
doc.add_heading('8.1 Workflow di Risposta Automatica', level=2)
doc.add_paragraph(
"Il sistema implementa un workflow di risposta automatica agli incidenti di sicurezza:"
)
incident_table = doc.add_table(rows=6, cols=3)
incident_table.style = 'Light Grid Accent 1'
incident_table.alignment = WD_TABLE_ALIGNMENT.CENTER
inc_headers = ['Fase', 'Azione', 'Tempistica']
for i, h in enumerate(inc_headers):
incident_table.rows[0].cells[i].text = h
for paragraph in incident_table.rows[0].cells[i].paragraphs:
for run in paragraph.runs:
run.bold = True
inc_data = [
['1. Raccolta', 'Ricezione log syslog da router MikroTik', 'Tempo reale (UDP)'],
['2. Analisi', 'Analisi ML con Isolation Forest + Ensemble', 'Ogni 2 minuti'],
['3. Classificazione', 'Assegnazione risk score e tipo anomalia', 'Automatica'],
['4. Risposta', 'Blocco automatico IP su tutti i router (score >= 80)', 'Immediato dopo analisi'],
['5. Documentazione', 'Registrazione con geolocalizzazione e timestamp', 'Automatica'],
]
for i, row_data in enumerate(inc_data):
for j, cell_text in enumerate(row_data):
incident_table.rows[i+1].cells[j].text = cell_text
doc.add_paragraph("")
doc.add_heading('8.2 Tipi di Anomalie Rilevate', level=2)
anomaly_table = doc.add_table(rows=6, cols=2)
anomaly_table.style = 'Light Grid Accent 1'
anomaly_table.alignment = WD_TABLE_ALIGNMENT.CENTER
anom_headers = ['Tipo', 'Descrizione']
for i, h in enumerate(anom_headers):
anomaly_table.rows[0].cells[i].text = h
for paragraph in anomaly_table.rows[0].cells[i].paragraphs:
for run in paragraph.runs:
run.bold = True
anom_data = [
['DDoS Attack', 'Attacco Distributed Denial of Service - elevato volume di traffico da singola sorgente'],
['Port Scanning', "Scansione sistematica delle porte per identificare servizi vulnerabili"],
['Brute Force', 'Tentativi ripetuti di autenticazione con credenziali diverse'],
['Botnet Activity', 'Traffico riconducibile a reti di dispositivi compromessi (C&C)'],
['Suspicious Activity', 'Comportamento anomalo non classificabile nelle categorie precedenti'],
]
for i, row_data in enumerate(anom_data):
for j, cell_text in enumerate(row_data):
anomaly_table.rows[i+1].cells[j].text = cell_text
# --- 9. CONTINUITÀ ---
doc.add_heading('9. Continuità Operativa e Disponibilità', level=1)
doc.add_paragraph(
"Il sistema è progettato per operare in modo continuo e autonomo, minimizzando "
"l'intervento manuale e garantendo la disponibilità del servizio di monitoraggio."
)
continuity_features = [
"Servizi gestiti da systemd con restart automatico in caso di failure (Restart=always)",
"Timer systemd per operazioni periodiche (analisi ML ogni 2 min, pulizia oraria, sync liste ogni 10 min)",
"Auto-reconnect del parser syslog in caso di perdita connessione al database",
"Architettura a microservizi: il failure del backend ML non blocca la raccolta log",
"Health check endpoint per integrazione con sistemi di monitoraggio esterni (Nagios, Zabbix, ecc.)",
"Database PostgreSQL con supporto a backup e recovery point-in-time",
"Migrazioni database versionante per aggiornamenti sicuri dello schema",
]
for f in continuity_features:
doc.add_paragraph(f, style='List Bullet')
# --- 10. AUDIT ---
doc.add_heading('10. Audit e Tracciabilità', level=1)
doc.add_paragraph(
"Il sistema mantiene traccia completa di tutte le operazioni per supportare attività "
"di audit e conformità:"
)
audit_features = [
"Log di tutti i rilevamenti con timestamp, risk score, tipo anomalia, geolocalizzazione",
"Registrazione delle operazioni di blocco/sblocco con timestamp (blocked_at)",
"Storico delle entry di whitelist con data di creazione e motivo",
"Log delle sincronizzazioni delle liste pubbliche con conteggio IP aggiunti/rimossi",
"Storico dei training del modello ML con parametri e risultati",
"Log di sistema via journald per tutti i servizi (accessibili con journalctl)",
"Database delle migrazioni con versioning per tracciare le modifiche allo schema",
]
for f in audit_features:
doc.add_paragraph(f, style='List Bullet')
# --- 11. CONCLUSIONI ---
doc.add_heading('11. Conclusioni', level=1)
doc.add_paragraph(
"Il Sistema di Rilevamento Intrusioni (IDS) implementa un insieme completo di controlli "
"di sicurezza che contribuiscono significativamente alla conformità con lo standard "
"ISO/IEC 27001:2022. In particolare, il sistema copre in modo completo i controlli "
"relativi a:"
)
conclusions = [
"Threat intelligence (A.5.7): integrazione automatica con 7+ feed pubblici",
"Gestione degli incidenti (A.5.24-A.5.28): workflow completo dalla rilevazione alla risoluzione",
"Logging e monitoraggio (A.8.15-A.8.16): raccolta centralizzata e dashboard real-time",
"Sicurezza delle reti (A.8.20-A.8.21): protezione attiva tramite blocco automatico",
]
for c in conclusions:
doc.add_paragraph(c, style='List Bullet')
doc.add_paragraph("")
doc.add_paragraph(
"Il sistema richiede integrazione con ulteriori controlli organizzativi, procedurali e "
"tecnici per una conformità completa allo standard ISO 27001, tra cui: politiche formali "
"documentate, formazione del personale, gestione degli asset, controllo degli accessi "
"fisici e logici, e processi di audit interno periodico."
)
doc.add_paragraph("")
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("--- Fine del Documento ---")
run.font.color.rgb = RGBColor(128, 128, 128)
run.font.size = Pt(10)
# Save
output_path = "IDS_Conformita_ISO27001.docx"
doc.save(output_path)
print(f"Documento generato: {output_path}")