Progettazione e sviluppo di un sistema integrato per la rilevazione di

Transcript

Progettazione e sviluppo di un sistema integrato per la rilevazione di
Facoltà di Ingegneria
Corso di Studi in Ingegneria Informatica
tesi di laurea magistrale
Progettazione e sviluppo di un sistema
integrato per la rilevazione di eventi
anomali in scenari di sicurezza
Anno Accademico 2011/12
relatore
Ch.mo prof. Stefano Russo
correlatori
Ch.mo prof. Marcello Cinque
Ch.mo ing. Fabio Cornevilli
candidato
Raffaele Della Corte
matr. M63/237
Alla mia principessa e a tutta la mia famiglia
Ringraziamenti
Giunto a questo secondo, e più importante, traguardo della mia carriera universitaria, vorrei
ringraziare tutti coloro che, in qualsiasi modo, mi hanno aiutato in questi anni.
Innanzitutto vorrei ringraziare il professore Stefano Russo che mi ha dato una grande
opportunità, concedendomi la possibilità di realizzare un’attività di tesi davvero molto
interessante.
Un ringraziamento va anche al mio correlatore, il professore Marcello Cinque che mi ha
guidato in questo percorso, dedicandosi con santa pazienza a rispondere alle mie
innumerevoli e-mail, nonché all’ingegner Antonio Pecchia, che, insieme a lui, mi ha aiutato
a tirar su questo lavoro di tesi.
Un altro ringraziamento va anche al mio secondo correlatore, nonché tutor aziendale,
l’ingegner Fabio Cornevilli il quale, nonostante gli innumerevoli impegni, è stato sempre
disponibile quando necessario.
Voglio poi ringraziare colei che poco più di tre anni fa è entrata a far parte della mia vita,
trasformandola giorno dopo giorno nello splendore che è oggi, insegnandomi cosa significa
realmente amare ed essere amati con tutte le proprie forze, e condividendo insieme a me
tutto sempre, parlo della mia principessa, Emilia, che in questi anni è sempre stata al mio
fianco e non ha mai smesso di sostenermi ed aiutarmi, nello studio e nella vita, riuscendo
come nessuno a darmi forza e consigli per affrontare e superare ogni ostacolo. Sei il mio
punto di riferimento, il centro di tutto il mio mondo…TI AMO!!!
Un grazie anche ai miei genitori e a mia sorella, per avermi dato la possibilità di
intraprendere questo cammino, ma soprattutto per il loro enorme affetto e per la costanza
con cui mi hanno sempre spronato al raggiungimento di questo traguardo, in primis mia
mamma che si è sempre impegnata ad evitare qualsiasi fonte di disturbo durante lo studio ed
ha avuto la fermezza di svegliarmi ogni mattina alle 7:30.
Un grazie anche ai miei nonni, in particolare a nonna Rosa per le risate che mi fa fare, lei e
il “vecchio”, ogniqualvolta passa a salutarmi e per aver continuato a riempire la mia stanza
di nuovi amichetti.
Un caloroso grazie anche ai miei suoceri, la signora Tina e il signor Pasquale, e a Enzo per
la grande disponibilità dimostrata sempre, in ogni situazione, soprattutto quando si trattava
di ospitarmi per facilitare il raggiungimento della sede del tirocinio, per aver fatto di tutto
per permettermi di studiare al meglio quando ero da voi (anche con fiumi di panna), e per
avermi fatto sentire sempre parte della famiglia.
Un grazie anche a Marco per avermi gentilmente donato negli ultimi mesi un suo
smartphone…anche se l’ho sfortunatamente già distrutto.
Non può mancare anche un grazie a Luigi, Fulvia, Salvatore, Mario, Teresa, il piccolo Ciro,
Davide, Miriam, Giovanni, Paola, Fabio e Giovanna per esserci sempre e comunque anche
se non ci vediamo spesso, ma anche a Raffaella, Maria, Manuela, Emanuele, Anna e
Salvatore per i momenti trascorsi insieme.
Un sentito grazie anche a Luigi e Vincenzo, compagni di mille avventure universitarie, con
cui ho condiviso gioie e dolori di questa vita.
Un grazie anche a Giovanni, Giuseppe e Ciccio, che, nonostante le nostre strade si siano
divise, continuano…ad organizzare i Panuozzo Day.
In ambito aziendale, un grazie va a Vincenzo, Emanuela, Giancarlo e Nicola per tutto l’aiuto
che mi hanno offerto durante l’intero percorso di tirocinio.
Infine, un grazie va anche a colui che da lassù ha sempre fatto si che le cose andassero per il
verso giusto, facendo avvertire la sua mano sempre, esame dopo esame.
A voi tutti, e anche a coloro che avrò sicuramente dimenticato di citare,…
GRAZIE DI VERO CUORE!!
Indice
Introduzione
8
Capitolo 1. Il Complex Event Processing
1.1
1.2
1.3
1.4
1.5
1.6
11
Le origini
Event ed Event Processing
1.2.1
Event Processing e programmazione Event-Based
Architettura di Event Processing
CEP ed Event Stream Processing
1.4.1
Regole alla base dell’ESP
CEP Engine
1.5.1
Tecniche di correlazione
1.5.1.1
Correlazione basata su macchine a stati finiti
1.5.1.2
Correlazione Rule-Based
1.5.1.3
Correlazione Case-Based
1.5.2
Proprietà di un CEP Engine
Il CEP nelle infrastrutture IT di sicurezza
11
16
20
21
22
24
27
32
33
35
37
38
40
Capitolo 2. Un sistema CEP in scenari di sicurezza
2.1
2.2
2.3
2.4
44
Introduzione
Requisiti di alto livello
2.2.1
Requisiti funzionali
2.2.2
Requisiti non funzionali
Scenari applicativi: Building Security
2.3.1
Casi d’uso: Rilevamento di un falso positivo per Camera Tampering
2.3.2
Casi d’uso: Rilevamento di un accesso non autorizzato
Scenari applicativi: Network Security
2.4.1
Casi d’uso: Rilevamento di una intrusione con credenziali rubate
2.4.2
Casi d’uso: Rilevamento di un attacco TCP Gender Changer
44
48
51
52
53
56
58
60
63
65
Capitolo 3. Il CEP Engine Esper
3.1
3.2
68
Introduzione
Rappresentazione degli eventi
3.2.1
Plain-Old Java Object
3.2.2
Map Event
68
70
71
72
V
3.3
3.4
3.5
3.6
3.7
3.2.3
Object-array Event
3.2.4
XML Event
3.2.5
Confronto tra i tipi
Modello di elaborazione
3.3.1
Insert Stream
3.3.2
Remove Stream e Length Window
3.3.3
Time Window
3.3.4
Batch Window
Il linguaggio EPL
3.4.1
Sintassi
3.4.2
Accesso ad un database e supporto ai linguaggi di script
3.4.3
Event Pattern
Esper API
3.5.1
Service Provider Interface
3.5.2
Administrative Interface
3.5.3
Runtime Interface
Configurazione
Integrazione ed Estensione
3.7.1
Derived-Value and Data Window View
3.7.1.1
Implementazione della classe View Factory
3.7.1.2
Implementazione della classe View
3.7.1.3
Configurazione della View
Capitolo 4. Architettura e mapping tecnologico del sistema CEP
4.1
4.2
4.3
Event Driven Architecture
Componenti logici
Architettura
4.3.1
Dispositivi sorgenti
4.3.1.1
L’IDS: Snort
4.3.1.2
Rsyslog
4.3.1.3
Sensori BACnet
4.3.1.3.1
BACnet e BACnet4J
4.3.1.3.2
Struttura e logica applicativa
4.3.2
L’Enterprise Service Bus
4.3.2.1
Java Message Service
4.3.2.2
Apache ActiveMQ
4.3.2.3
Logica applicativa
4.3.3
Mediator
4.3.3.1
Struttura e logica applicativa
4.3.4
Prefiltering-Aggregation
4.3.4.1
Struttura e logica applicativa
4.3.5
CEP Engine
4.3.5.1
Struttura
4.3.5.2
Logica applicativa
4.3.5.3
Regole EPL
Capitolo 5. Verifica del funzionamento del sistema CEP
5.1
Introduzione
73
73
75
75
76
78
79
80
82
82
89
91
93
94
94
95
96
97
102
103
105
107
108
108
111
113
117
118
120
121
122
127
130
131
137
140
142
143
155
156
159
160
166
171
177
177
VI
5.2
5.3
5.4
5.5
Sistema di riferimento
Casi d’uso simulati: Rilevamento di una intrusione con credenziali rubate
5.3.1
Comportamento del sistema
5.3.1.1
Wrapper Syslog
5.3.1.2
Wrapper IDS
5.3.1.3
Enterprise Service Bus
5.3.1.4
Prefiltering-Aggregation
5.3.1.5
CEP Engine
Casi d’uso simulati: Rilevamento di un accesso non autorizzato
5.4.1
Comportamento del sistema
5.4.1.1
BACnet Device
5.4.1.2
Wrapper BACnet
5.4.1.3
Enterprise Service Bus
5.4.1.4
CEP Engine
Considerazioni
Capitolo 6. Risultati sperimentali
6.1
6.2
6.3
Introduzione
Valutazione del sistema con una distribuzione reale di traffico
6.2.1
Descrizione
6.2.2
Risultati ottenuti
Valutazione al variare del traffico
6.3.1
Descrizione
6.3.2
Risultati ottenuti
Conclusioni e Sviluppi futuri
Bibliografia
178
180
181
181
184
187
189
192
200
201
202
203
209
210
215
217
217
218
218
222
224
225
226
231
234
VII
Introduzione
La sicurezza è un problema che assume grande rilevanza in un ampio spettro di contesti
applicativi. Basti pensare ad esempio alla necessità di monitorare una rete informatica al
fine di rilevare/evitare attacchi, ma anche la necessità di controllare e supervisionare
ambienti, pubblici o privati, al fine di garantire la sicurezza di cose e/o persone presenti in
essi. L’importanza di tale problema ha portato negli ultimi anni ad un considerevole
aumento delle componenti dei centri servizi di controllo, sia interni a realtà aziendali che
non, i quali sono diventati negli anni sempre più sofisticati. Proprio l’incremento di queste
componenti, unito anche alla loro elevata eterogeneità, ha portato da un lato ad un
potenziamento dei sistemi di sicurezza, ma dall’altro alla necessità di gestire ed elaborare
grandi quantità di dati in real-time o near real-time. Tale onere ricade ovviamente su un
operatore umano, in quanto i molteplici sistemi di controllo e gestione sono caratterizzati,
molto spesso, da scarsa integrazione e ridotta capacità di correlazione ed analisi degli
eventi rilevati dalle varie fonti. Da quì la necessità di dotare tali sistemi di soluzioni che
consentano l’interoperabilità tra i vari sottosistemi, così da alleggerire il carico di lavoro
adibito ad uno o più operatori umani, ed ottenere da un lato una netta riduzione dei tempi
di risposta, e dall’altro una maggiore consapevolezza delle attività in atto nell’ambiente
monitorato.
A tal proposito, l'integrazione di soluzioni di Complex Event Processing rappresenta
un'ottima base sulla quale costruire proprio questa interoperabilità tra i sottosistemi
8
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
coinvolti. Tale tecnologia, infatti, prevede l'elaborazione e combinazione di eventi
provenienti da più fonti per dedurre eventi o modelli che suggeriscono circostanze più
complicate. Essa è alla base di molti motori di regole che consentono di effettuare
operazioni di filtraggio, aggregazione e correlazione di eventi generati da applicazioni,
database, sistemi di building e network security, in tempo reale, al fine di ottenere
informazioni più dettagliate, definite come eventi complessi, che aiutino a comprendere al
meglio ciò che sta accadendo, così da poter prendere decisioni nel miglior modo possibile,
ma soprattutto nel minor tempo possibile.
Proprio l’adozione del Complex Event Processing nell’ambito della sicurezza è una delle
tematiche alla base di questo lavoro di tesi, il cui obiettivo è quello di progettare e
implementare un sistema integrato per la rilevazione di eventi anomali in scenari di
sicurezza. Tale lavoro è stato svolto nell’ambito di un progetto di ricerca avviato dalla
System Management s.r.l. [1], azienda presso la quale ho svolto la mia attività di tirocinio,
in collaborazione con il Laboratorio Nazionale CINI ITEM “C. Savy” [2].
Il progetto su menzionato è denominato CEvOS (Complex Event processing &
management for security & Operation Support) ed è stato avviato con lo scopo di
realizzare una piattaforma sperimentale di operational intelligence dove l'analisi, la
correlazione e la fusione di eventi provenienti da sistemi tradizionali di sicurezza logica e
fisica vengono utilizzati per generare allarmi e stimolare interventi, con tecniche di
intelligenza artificiale, in situazioni di emergenza che derivano sia da scenari previsti, che
da scenari non previsti e non convenzionali.
Nell’ambito di questo progetto, il mio lavoro si è incentrato principalmente sulla
progettazione, e successiva implementazione, di una prima versione di CEvOS, dotata
delle principali componenti alla base della piattaforma, e la quale fosse in grado di
soddisfare parte dei requisiti previsti all’avvio del progetto. In particolare, il sistema
progettato è basato su un’architettura a componenti che rispecchia il pattern Event Driven
Architecture, in cui la comunicazione tra le varie parti è realizzata attraverso un apposito
9
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
bus, che sfrutta il paradigma publish/subscribe. Le componenti implementate, come
vedremo, sono cinque, e sono:
• Simulatori di sensori di Building Security: atti a generare gli eventi di alcuni sensori
hardware come telecamere e badge reader
• Mediator: si preoccupa di trasformare gli eventi provenienti dai sensori in un
formato intermedio, da poter immettere sul bus
• Enterprise Service Bus: rappresenta il bus di comunicazione tra i vari componenti
• Prefiltering-Aggregation: realizza un’operazione di filtraggio sugli eventi
• CEP Engine: si preoccupa di correlare gli eventi ricevuti attraverso il bus, al fine di
generati eventi complessi utilizzando la tecnologia CEP.
Proprio i CEP saranno l’argomento discusso nel Capitolo 1, nel quale si fornirà una
panoramica su tali sistemi e su tutti i concetti ad essi correlati.
Il Capitolo 2, invece, è dedicato alla descrizione dei requisiti che il sistema da sviluppare
dovrà soddisfare, nonché degli scenari applicativi, e dei relativi casi d’uso, nell’abito dei
quali sarà utilizzato.
Argomento principale del Capitolo 3 sarà la descrizione dettagliata del CEP Engine Esper,
utilizzato nell’abito di questo lavoro di tesi, e delle sue funzionalità, mentre nel Capitolo 4
si approfondirà l’architettura, sia generale che in dettaglio, del sistema CEP implementato
e delle scelte tecnologiche effettuate per i singoli componenti che lo costituiscono.
Nel Capitolo 5 è proposta, invece, una descrizione del funzionamento della piattaforma,
nonché una sua valutazione al fine di verificare il soddisfacimento dei requisiti previsti.
Infine, nel Capitolo 6 si discuteranno i risultati sperimentali ottenuti.
10
Capitolo 1
Il Complex Event Processing
1.1 Le origini
Il concetto di event processing nasce negli anni Cinquanta con la simulazione ad eventi
discreti. L'idea principale era che il comportamento di un sistema, sia esso un dispositivo
hardware, un sistema di controllo, una catena di produzione di una fabbrica o un
fenomeno naturale come il meteo, potesse essere studiato tramite un programma per
computer scritto in un “linguaggio di simulazione”. Presi dei dati in input, il programma
avrebbe dovuto generare eventi che riproducevano le interazioni tra i componenti del
sistema. Ogni evento doveva registrarsi in un preciso istante temporale fissato da un timer,
e, ovviamente, alcuni eventi potevano verificarsi nello stesso istante. Il simulatore, quindi,
doveva registrare il flusso di eventi generati dai vari componenti, la loro esecuzione e lo
scorrere del tempo, simulato dal timer attraverso “ticks” discreti. Le simulazioni ad eventi
discreti rappresenta certamente il primo esempio di event processing e i modelli, infatti,
erano architetture event-driven.
Oltre alla simulazione ad eventi discreti, l’event processing ha interessato anche lo
sviluppo delle reti di computer, come mostrato in figura 1.1 [3], dove sono definite le
quattro principali aree da esso interessate. Tale sviluppo ha avuto inizio verso la fine degli
anni Sessanta, con la rete ARPANET. L'obiettivo era realizzare una comunicazione
affidabile tra computer attraverso reti, tramite l'uso di eventi contenenti sequenze di dati
11
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
binari, i cosiddetti pacchetti. Trasmettere o ricevere un pacchetto corrispondeva ad un
evento.
Figura 1.1: Le quattro maggiori aree interessate dall'Event Processing negli ultimi cinquant'anni
Verso la fine degli anni Ottanta, invece, ebbe inizio lo sviluppo della tecnologia inerente ai
cosiddetti “active database”, i quali rappresentavano un miglioramento dei database
tradizionali al fine di soddisfare le esigenze di elaborazione in real time. Essi furono estesi
con capacità di event processing che permettevano loro di invocare applicazioni in risposta
ad eventi. Per fare ciò, un livello di event processing fu implementato al di sopra di ogni
database tradizionale: questo permetteva la definizione di eventi e di semplici tipi di
schemi di eventi che potevano essere utilizzati come trigger per le regole reattive, anche
chiamate regole ECA (Event - Condition - Action).
Il Complex Event Processing è il passo logico successivo nello sviluppo relativo
all’elaborazione degli eventi. Causa principale di questo passaggio è stato l’incremento del
12
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
traffico basato su eventi manifestatosi nel corso degli ultimi quarant’anni. Basti pensare
all’esplosione del networking negli anni Settanta, nonché all’aumento esponenziale
dell'uso del messagging a livello di gestione nelle attività quotidiane delle imprese,
avvenuto agli inizi degli Ottanta. Ciò ha creato una nuova serie di richieste, in quanto a
quei tempi l'unica analisi del traffico era in termini di carichi di rete e flussi.
Verso la fine degli anni Ottanta, infatti, ogni grande azienda aveva messo in
comunicazione le sue applicazioni attraverso l’utilizzo delle reti, ogni ufficio era collegato
a tutti gli altri, anche se dislocati in nazioni differenti. Così facendo, il livello IT aziendale
si trovò ben presto ad essere sommerso da eventi di ogni genere, da quelli di livello
commerciale a quelli di gestione (ad es. proposte di negoziazione, programmi di
pianificazione, semplici e-mail, etc.), provenienti da tutti gli angoli del globo, sia da fonti
esterne che dai propri uffici interni. A ciò si aggiunse anche la grande quantità di formati
differenti utilizzati dalle varie applicazioni [4].
Di conseguenza, ora non c’era più la sola necessità di garantire il corretto funzionamento
dell’IT layer aziendale, ma anche quella di capire cosa stesse accadendo in esso. Gli eventi
ricevuti, infatti, contenevano una gran quantità di informazioni (denominate business
intelligence) che sono di grande utilità nella gestione dell'impresa. Era necessario quindi
riuscire ad estrarre quante più informazioni possibili dall’insieme di eventi ricevuti, molto
spesso definitivo anche come “Event Cloud”, e farlo nel più breve tempo possibile.
Tali necessità hanno portato alla nascita del Complex Event Processing.
Precisamente, la nascita di tale tecnologia si deve a David Luckham, research professor in
Ingegneria Elettronica presso la Stanford University, il quale ha esteso il modello
“Complex Adaptive Systems” (CAS) sviluppato da John Holland nel 1976 per la
modellazione dell’adattamento della conoscenza all’ambiente organizzativo.
In particolare tale modello stabilisce che una organizzazione è un sistema complesso
avente la capacità di cambiare le proprie regole in relazione all’esperienza maturata. Il
termine adaptive, infatti, si riferisce alla necessità da parte di un sistema di evolvere
facilmente il proprio stato determinando, come conseguenza, continui cambiamenti,
13
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
modifiche, aggiunte e non ultimo il riordino dei propri componenti. Il sistema è quindi
migliorato se è in grado di imparare dall’esperienza e di adattare il proprio comportamento
dinamicamente [5].
Precisamente, la definizione data da Holland relativamente al modello CAS è la seguente:
“Un complex adaptive system non ha alla base un’unica equazione o regola che lo
controlla. Esso ha, al contrario, molte parti interagenti, distribuite, con poche o
nessuna che effettuano un controllo centrale. Tuttavia ciascuna delle parti è
disciplinata da proprie regole. A sua volta, ognuna di queste regole potrebbe
partecipare al conseguimento di un risultato, e ciascuna potrebbe influenzare le
azioni di altre parti del sistema” [6].
Le proprietà principali di cui gode un sistema basato sul modello CAS sono le seguenti:
• Complessità
• Eterogeneità
• Comportamento aggregato
• Anticipazione
• Evoluzione
• Non linearità
Tra queste, Holland pone maggiormente l’attenzione sulla non linearità dei sistemi, ossia
l’imprevedibilità del loro comportamento, in quanto rappresentano la maggior parte degli
scenari reali. Infatti, ad esempio, il flusso di traffico malevolo (ad es. virus, trojan, etc.) in
Internet è senza dubbio un fenomeno non lineare e non predicibile, così come anche il
fenomeno della “previsione delle entrate” in un sistema finanziario.
Un sistema basato sul un modello CAS riceve in ingresso degli input e, attraverso la
definizione di opportune regole che ne determinano il comportamento, presenta in uscita
degli output. L’adattamento della conoscenza viene opportunamente realizzato attraverso
14
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
un controllo sia degli ingressi, attraverso operazioni di feedback, sia dello stato interno del
sistema stesso. Adoperando un tale approccio, è possibile tener conto anche dei possibili
cambiamenti non solo degli input del sistema, ma anche dell’eventuale cambiamento
dell’ambiente esterno, al fine di garantire al sistema stesso l’insieme di tutte le proprietà
precedentemente definite.
Una caratteristica fondamentale per un CAS è quella, dunque, di poter essere usato per
stimare “conseguenze future di azioni correnti” [6], avendo anche la possibilità di
modificare il modello dinamicamente, durante il ciclo di vita del sistema, a seconda dei
risultati ottenuti con le regole inizialmente definite.
Figura 1.2: Complex Adaptive System Model
L’insieme dei concetti discussi intorno alla teoria del Complex Adaptive Systems
consentono di approcciare al problema, in generale, del Complex Event Processing come
componente per la realizzazione dei sistemi distribuiti IT, event driven, i quali possono
essere modellati in base a tali concetti.
In particolare, la tecnologia CEP applica la teoria del CAS allo studio dei processi di
business definendo metodi e regole per interpretare gli eventi, al fine di risolvere problemi
15
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
di business, ma non solo. Essa infatti col passare del tempo ha trovato utilizzo negli ambiti
più disparati, tra cui, come vedremo, quello della sicurezza.
Tale tecnologia è alla base di molti motori di regole che consentono di effettuare
operazioni di filtraggio, aggregazione e correlazione di eventi generati da applicazioni,
database e sistemi di messaging, in tempo reale.
Precisamente un'applicazione CEP opera in genere su più eventi osservati in arrivo, spesso
anche migliaia al secondo, per ricavare un numero molto inferiore di eventi più
significativi, che riassumono i dati presenti in quelli di livello inferiore. Tali eventi
prendono il nome di “eventi complessi”. Ciò consente di comprendere al meglio le
condizioni attuali dell’ambiente osservato e prendere decisioni relativamente alle azioni da
intraprendere in pochi millisecondi, secondi o minuti dalla ricezione degli eventi.
Pertanto spesso si definisce il CEP come un supporto al miglioramento della cosiddetta
“situation (o situational) awareness”, che è definita come "sapere ciò che sta accadendo in
modo da poter decidere cosa fare".
Il CEP si basa su due concetti fondamentali:
• Evento
• Event Processing
La loro descrizione sarà oggetto del prossimo paragrafo.
1.2 Event ed Event Processing
Luckham definisce un evento come un oggetto che rappresenta un’occorrenza di
un'attività in un sistema o dominio: esso è qualcosa che è avvenuto, o che si prevede che
possa avvenire in quel dominio. La parola evento, inoltre, è usata per rappresentare in un
sistema computazionale l'occorrenza di una specifica entità di programmazione, come, ad
esempio, la pressione di un pulsante all'interno di un'applicazione può portare allo
16
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
scatenarsi dell'evento “mouse clicked”.
Gli eventi sono legati, molto spesso, ad altri eventi dal tempo, causalità e/o aggregazione.
Il tempo è una proprietà di un evento, ed è di solito indicata sotto forma di un timestamp.
Molto utilizzata è la notazione A → B, attraverso la quale si è soliti indicare che l'evento
A ha causato B, vale a dire, A doveva accadere prima di B, o B dipende da A.
L’assioma Causa-Tempo di Luckham lega il concetto di causalità a quello di timestamp,
infatti afferma che se l'evento A ha causato l’evento B nel sistema S, allora nessun clock in
S darà a B un timestamp precedente a quello dato ad A. [7]
Ad un livello superiore un evento può essere visto come una astrazione costituita da un
insieme di più eventi semplici che sono suoi membri. Tale astrazione prende il nome di
evento complesso (Complex Event).
Figura 1.3: Complex Event [5]
Nella figura 1.3 è mostrato un esempio di evento complesso ottenuto a partire da un
insieme finito di eventi atomici, in cui si evince in maniera precisa che un evento
complesso contiene un riferimento a tutti gli eventi dai quali è possibile astrarre un
determinato pattern. Esempi potrebbero essere:
• L’acquisto di un prodotto effettuato con successo, ossia l’astrazione di eventi in una
transazione
17
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
• Rilevamento di una situazione anomala in un certo contesto: ad esempio fraud
detection
Oltre ai Complex Event, alti eventi di particolare importanza sono gli event stream ed
event cloud.
Un event stream è una sequenza di eventi (potenzialmente infinita) ordinati in base ad un
certo criterio, solitamente di tipo temporale. In questo caso, l’ordinamento può essere
realizzato o in base all’istante di tempo in cui essi si verificano, oppure in base all’istante
di tempo in cui sono ricevuti. Formalmente, potremmo dire che un flusso di eventi è
costituito da una coppia ordinata (S,∆), dove:
• S: sequenza di eventi
• ∆: sequenza degli intervalli di tempo relativi agli eventi; è un numero razionale o
reale strettamente positivo, cioè ∆i>0 ∀i
Per quanto riguarda un event cloud invece, esso è un insieme parzialmente ordinato di
eventi. L’ordinamento parziale degli eventi è imposto principalmente da relazioni causali e
da altre relazioni tra gli eventi stessi. Un event cloud, tipicamente, è costituito da un
insieme di eventi prodotti da uno o più sistemi distribuiti.
Si comprende che un flusso di eventi è un caso particolare di event cloud, in cui gli eventi
sono necessariamente ordinati in base ad un criterio. Quindi un event cloud potrebbe
contenere uno o più event stream, ma non vale il contrario.
Un altro concetto fondamentale relativo agli eventi è sicuramente quello di tipo. Gli eventi
infatti, al variare del contesto o anche al variare della sorgente che li ha generati, possono
contenere informazioni totalmente differenti l’uno dall’altro, pertanto è necessario definire
un concetto di event type. Definiamo innanzitutto come insieme di tipi di eventi l’insieme
∑E ={E1,E2,…,En}, n≥0 costituito da tutti i tipi di eventi ammissibili per un certo dominio.
Un event type è, dunque, una coppia E= (id,a) in cui:
• id: identifica univocamente un evento
18
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
• a = {a1,a2,…,an}, n≥0: è un vettore costituito da un insieme finito di attributi che
caratterizzano un evento
Dall’univocità dell’identificativo si deduce che ∀Ei, Ej∈∑E, i≠j : Ei.id ≠ Ej.id, e cioè che
non possono esistere due eventi che presentino lo stesso id.
Esistono eventi che si potrebbero definire come rumore di fondo e che, quindi, non
richiedono alcuna reazione. Gli eventi che, invece, ne richiedono vengono spesso chiamati
situazioni. Si definisce quindi una situazione come l'occorrenza di un evento che potrebbe
richiedere una reazione.
Una delle tematiche principali legate all'event processing è l'identificazione e il riscontro
di situazioni, a seguito delle quali possano essere stabilite, se necessario, le opportune
azioni da intraprendere. Un’azione potrebbe essere, semplicemente, rispondere al telefono
o aggiungere un oggetto alla lista della spesa, oppure potrebbe consistere in qualcosa di
più complesso: nel caso in cui una persona perda l'aereo, ad esempio, esistono svariate
alternative di azione a seconda dell'ora e del giorno, dell'aeroporto in cui si trova, delle
regole della compagnia e del numero di altri passeggeri nelle sue stesse condizioni.
L'event processing è un processo computazionale che compie operazioni su eventi. Le più
comuni sono l'analisi, la creazione, la trasformazione e la cancellazione. Esistono due
tematiche principali all'interno di quest'area:
• Il design, cioè la struttura del codice e il funzionamento delle applicazioni che
utilizzano gli eventi, sia direttamente che indirettamente. Ci si riferisce a ciò come
programmazione event-based, sebbene più spesso viene utilizzata la dicitura
architettura event-driven.
• Le operazioni di elaborazione che è possibile eseguire su eventi come parti di una
certa applicazione. Questo include il filtraggio di certi tipi di eventi, il cambiare
l'istanza di un evento da un tipo ad un altro ed esaminare un insieme di eventi al
fine di riscontrare un modello specifico. Queste operazioni spesso fanno sì che
nuove istanze di eventi vengano generate.
19
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
1.2.1 Event Processing e programmazione Event-Based
È possibile, ovviamente, scrivere programmi event-based senza ricorrere esplicitamente ad
operazioni di event processing. Le tre principali differenze che distinguono l'event
processing dalla semplice programmazione event-based, e che aprono ad un ricco insieme
di possibilità, sono:
• Astrazione: Le operazioni che compongono la logica dell'event processing possono
essere separate dalla logica applicativa, permettendone così la modifica senza
toccare le applicazioni che producono e consumano gli eventi.
• Disaccoppiamento: Gli eventi riscontrati e prodotti da una specifica applicazione
possono essere utilizzati e consumati da applicazioni totalmente differenti. Non c'è
alcun bisogno per le applicazioni che producono e quelle che consumano eventi di
essere a conoscenza ognuna dell'esistenza dell'altra; non a caso esse possono essere
dislocate in qualunque parte del mondo. Un evento emesso da una singola
applicazione produttrice può essere utilizzato da più macchine consumatrici di
eventi e, viceversa, si può far sì che una applicazione consumi eventi prodotti da
più applicazioni generatrici di eventi.
• Obiettivo incentrato sul mondo reale: L'event processing ha spesso a che fare con
eventi che si verificano, o che dovrebbero verificarsi, nel mondo reale. La
relazione dell'event processing con il mondo può avvenire in due modi: in maniera
deterministica, ovvero tramite un perfetto mapping tra la situazione del mondo
reale e la sua implementazione nel sistema di event processing, considerando
quindi tutte gli aspetti e le variabili in gioco di quella determinata situazione,
oppure
in
maniera
approssimata,
dove,
appunto,
viene
considerata
un’approssimazione della situazione reale, contenete le sole variabili rilevanti.
20
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
1.3 Architettura di Event Processing
Non tutte le applicazioni di event processing sono uguali tra di loro, ovviamente, ma la
maggior parte di queste hanno una struttura riconducibile alla figura sottostante.
Figura 1.4: Architettura generale di event processing
Un'applicazione può contenere uno o più generatori di eventi, anche chiamati event
producer. Essi possono apparire in una vasta gamma di forme e dimensioni: per esempio,
possono essere sensori hardware che producono eventi quando rilevano un certo tipo di
occorrenza, ma anche semplici bit di strumentazione software che produce eventi quando
alcune condizioni di errore vengono segnalate o, ancora, bit di controllo di una
applicazione.
La controparte degli event producer sono gli event consumer. Questi componenti sono
coloro che ricevono gli eventi e, tipicamente, agiscono su di essi. Le loro funzionalità
possono variare: essi sono in grado, ad esempio, di immagazzinare gli eventi per un uso
futuro, mostrarli in una interfaccia utente, o decidere eventuali comportamenti reattivi
dopo averli ricevuti.
Gli event producer e gli event consumer sono collegati a meccanismi di distribuzione degli
eventi e, solitamente, qualche meccanismo di event processing intermedio viene posto tra i
suddetti. La distribuzione è garantita mediante l'uso di una tecnologia di instradamento dei
messaggi asincrona; per questo motivo, spesso con un leggero abuso di notazione, si parla
21
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
di un producer che invia un evento o di un consumer che riceve un evento.
Il meccanismo di distribuzione degli eventi è solitamente one-to-many per far sì che ogni
evento, dopo essere stato inviato, possa essere ricevuto da più event consumer.
Per quel che riguarda i sistemi di event processing intermedi, nei casi più semplici il
processing può semplicemente essere ricondotto ad una attività di routing con o senza
filtraggio, ma in realtà essi sono solitamente in grado di generare eventi addizionali. Tali
eventi possono essere distribuiti ai vari event consumer, ma possono anche essere anche
soggetti ad ulteriori sistemi di event processing.
È importante notare il disaccoppiamento tra gli event producer e gli event consumer. Gli
eventi sono il centro dell'attenzione di tutto il sistema. L'event producer ha una relazione
con ogni evento che produce, invece di una relazione con gli event consumer. Non è
importante per esso sapere quanti event consumer ci sono per i suoi eventi, e non gli
interessano nemmeno le azioni che questi ultimi potrebbero prendere una volta ricevuti gli
eventi. Allo stesso modo gli event consumer reagiscono all'evento in sé, e non all'atto della
ricezione di un evento da uno specifico event producer, anche se in alcuni casi tale
informazione può rivelarsi fondamentale per la corretta reazione del componente.
Per quanto riguarda, invece, l’event processing agent, invece, essi si possono definire
come un modulo software che compie operazioni sugli eventi. Esso riceve e invia eventi, o
può generarne degli altri, perciò, ad un certo modo, si può dire che produce e consuma
eventi [8].
1.4 CEP ed Event Stream Processing
Mentre il CEP era in fase di sviluppo era in corso una ricerca parallela che aveva come
obbiettivo principale quello di realizzare l’analisi degli eventi in tempo reale. Tale ricerca
ebbe inizio a metà degli anni Novanta, quando ci si rese conto che i database erano troppo
lenti per fare analisi di questo tipo.
22
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
L’idea di partenza era quella di eseguire query continue su flussi di dati, e sfruttare il
concetto delle finestre temporali al fine di velocizzarne l’esecuzione. Tale concetto, infatti,
prevede che una risposta ad una determinata query sia ritenuta valida solo nel corso della
finestra temporale corrente, cioè quella in cui si sono verificati gli eventi a partire dai quali
è stata determinata tale risposta. Ovviamente all’avanzare della finestra temporale, anche
la risposta dovrà essere aggiornata così da includere i nuovi eventi ed escludere quelli
fuori finestra. Questa ricerca fu denominata Data Streams Management (DSM) e ha
portato alla nascita di quello che oggi prende il nome di Event Stream Processing.
Nel caso della tecnologia CEP, invece, non ci si riferisce ad uno stream, bensì ad un event
cloud (§ 1.2), in cui gli eventi che lo compongono sono legati da relazioni complesse,
attraverso le quali è possibile rilevare situazioni significative in un certo contesto.
Si può comprendere quindi che c’è una differenza fondamentale tra CEP ed ESP, la quale
può tradursi nella differenza esistente tra un event stream e un event cloud, già
parzialmente affrontata nel paragrafo precedente.
Un flusso di eventi è una sequenza di eventi ordinata cronologicamente, come ad esempio
l’andamento della borsa; un event cloud, invece, può essere visto come un insieme
di eventi generati dalle varie attività/applicazioni che sono in esecuzione all’interno di un
sistema IT. È facile intuire che all’interno di un event cloud possano esserci uno o più
event stream, il che porta alla conclusione che questi ultimi rappresentino un caso
particolare dei primi.
Nell’ambito dell’ESP, l'ipotesi che si sta elaborando un flusso di eventi nel loro ordine di
arrivo ha i suoi vantaggi. Essa infatti consente di progettare algoritmi per l'elaborazione di
eventi che richiedano poca memoria, in quanto non vi è la necessità di ricordare molti
eventi, e che possano essere molto veloci. Tali algoritmi infatti non devono fare altro che
elaborare gli eventi dello stream al loro arrivo, trasmettere i risultati ottenuti
all’elaborazione successiva e poi dimenticare quegli eventi.
Nell’ambito invece del CEP, dato che si sta elaborando un event cloud, non si può
assumere che gli eventi arrivano in ordine cronologico. Di conseguenza, ci si concentra di
23
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
solito sulla ricerca di serie di eventi che hanno una qualche relazione complessa, per
esempio, il riconoscimento di un attacco informatico a partire dagli eventi che lo hanno
preceduto. Si comprende che potrebbe essere necessario memorizzare una grande quantità
di eventi prima di trovare quelli che si sta cercando. In questo caso è fondamentale
conoscere quali eventi causano altri eventi, il che richiede più memoria, e ovviamente più
tempo. Nonostante questo però, questo tipo di elaborazione ha l’indubbio vantaggio di
poter essere utilizzata in un insieme più ricco di problemi e scenari, non solo
nell'elaborazione di eventi, ma anche ad esempio nella gestione di processi aziendali.
In definitiva, mentre l’ESP consiste in una elaborazione di basso livello di flussi di eventi,
il CEP include invece da un lato anche l’analisi di eventi, ma pone maggiormente l’enfasi
sul riconoscimento di pattern di eventi dedotti da relazioni di causalità fra essi, in modo da
consentire una elaborazione di più alto livello, utile ad esempio per quanto concerne il
Business Process Management (BPM).
Ciò porta alla conclusione che, pur essendo entrambi due approcci differenti alla
elaborazione degli eventi, l'ESP può essere visto come un sottoinsieme della tecnologia
CEP. Pertanto, vediamo alcune delle regole alla base dell’Event Stream Processing.
1.4.1 Regole alla base dell’ESP
Come già accennato nel paragrafo precedente, il concetto di CEP vede nell’Event Stream
Processing un suo sottoinsieme. Tale tecnologia rappresenta un approccio evolutivo, in
una nuova classe di infrastrutture software, che risponde alle richieste sempre più
stringenti di elaborazioni di flussi di eventi in tempo reale e con bassa latenza, come ad
esempio accade nell’ambito del commercio elettronico, del monitoraggio di reti per la
prevenzione da attacchi di tipo DoS (denial of service) o altri tipi di attacchi, etc.
Le regole fondamentali per realizzare in maniera efficiente ed efficace il processing di
flussi di dati sono le seguenti:
24
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
• Intercettare i dati nei flussi
• Interrogare lo stream utilizzando appositi linguaggi SQL like
• Integrare dati memorizzati e flussi di dati
• Garantire la sicurezza e la disponibilità dei dati
• Dividere e scalare le applicazioni
Vediamole più nel dettaglio.
Intercettare i dati nei flussi
Riuscire ad analizzare i dati presenti all’interno degli event stream in ingresso, è una delle
caratteristiche principali di cui deve essere dotato un buon sistema ESP. Infatti, solo in
questo modo si è grado di garantire una bassa latenza, in quanto non è possibile procedere
prima alla memorizzazione dei dati e successivamente al loro recupero. Un approccio di
questo tipo comporterebbe un overhead inaccettabile per molte applicazioni stream-based
che devono rispondere in real-time allo stream di dati in input.
Interrogare lo stream utilizzando linguaggi SQL like
Questa regola è strettamente legata alla precedente, infatti la necessità di dover analizzare
il flusso di eventi direttamente dagli stream in ingresso porta all’ulteriore necessità di
dover elaborare questi stream in tempo reale, al fine di individuare eventi significativi.
Un’idea potrebbe essere quella di utilizzare applicazioni e/o tool realizzati ad hoc con un
comune linguaggio di programmazione di alto livello (C++, Java, etc), ma una tale
soluzione risulterebbe poco performante e richiederebbe costi molto elevati sia di sviluppo
che di manutenzione.
Per elaborare dati in tempo reale, invece, risulta essere molto più efficiente utilizzare un
linguaggio, anch’esso di alto livello, simile all’SQL. Quest’ultimo infatti è caratterizzato
da una grande espressività, ed è basato su potenti primitive per l’elaborazione dei dati che
consentono di effettuare filtraggio, fusione, correlazione ed aggregazione.
25
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
È necessario, dunque, un linguaggio che si potrebbe definire “SQL like”, inteso come
estensione semantica dello standard SQL, che lavora su flussi continui di dati.
Il linguaggio cosi definito da un lato conserva tutte le capacità dell’SQL, dall’altro ne
aggiunge di nuove come la possibilità di definire finestre temporali, memorizzare dati e
flussi di dati e di estendere le primitive già esistenti per includere funzioni logiche ed
aritmetiche. Un linguaggio così definito rappresenta il punto logico di partenza per la
realizzazione di uno stream processing engine.
Integrare dati memorizzati e flussi di dati
Molto spesso accade che in alcuni contesti gli eventi di particolare interesse dipendono in
parte da informazioni correnti e in parte da informazioni precedenti, le quali rientrano nei
cosiddetti dati storici. Di conseguenza si comprende che un’altra regola fondamentale per
le applicazioni ESP è sicuramente quella relativa alla capacità di memorizzare le
informazioni correnti. Così facendo, infatti, si ha la possibilità di renderle nuovamente
disponibili per le successive elaborazioni, realizzando di fatto un’integrazione di
informazioni legate sia ai dati provenienti da flussi continui sia ai dati memorizzati
persistentemente. Ovviamente bisognerà garantire che l’accesso a tali dati possa avvenire
sempre attraverso lo stesso linguaggio “SQL like”.
Per applicazioni con requisiti di bassa latenza ed overhead, l’approccio più corretto per
soddisfare la regola enunciata è di avere un’infrastruttura per lo stream processing che
disponga di un DBMS embedded.
Garantire la sicurezza e la disponibilità dei dati
Altri requisiti fondamentali per le applicazioni stream-based sono sicuramente la sicurezza
e la disponibilità dei dati. Infatti la consistenza dell’informazione trasportata da uno
stream è tale se legata in maniera indissolubile all’istante di tempo in cui quest’ultimo è
ricevuto. Il verificarsi di un malfunzionamento in un’applicazione potrebbe comportare
l’interruzione di un eventuale flusso di dati che necessita di essere elaborato o, più
26
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
semplicemente, l’impossibilità a reagire sebbene siano state individuate situazioni per cui
è necessario produrre in uscita un allarme o compiere una particolare azione.
Il ripristino da un malfunzionamento precluderebbe la possibilità di elaborare in real-time
i dati, oltre a comportare un ritardo inaccettabile nell’attesa del riavvio dell’applicazione
per la quale è occorso un guasto.
Dividere e scalare le applicazioni
In un contesto distribuito, le applicazioni stream-based elaborano grandi quantità di flussi
provenienti da sorgenti diverse e in formati diversi. All’aumentare del volume di questi
flussi di dati, nonché della complessità della singola elaborazione, è opportuno dividere
su più macchine l’insieme delle operazioni svolte da un’applicazione.
Quindi un requisito fondamentale è senza dubbio la scalabilità. Per quanto riguarda il
processo di elaborazione di uno stream, l’applicazione deve anche supportare il multithreaded, in modo tale da sfruttare i vantaggi derivanti dalle moderne macchine multiprocessore (e multi-core) [9].
1.5 CEP Engine
L’elemento centrale di un’architettura basata sul Complex Event Processing è il motore,
ossia l’entità che effettua sugli event object l’insieme delle operazioni necessarie ad
elaborarli: creazione, lettura, trasformazione, aggregazione, correlazione, pattern detection
e rimozione.
Precisamente il suo ruolo è quello di interpretare, filtrare, combinare eventi primitivi ed
individuare gli eventi compositi sulla base di regole specifiche, al fine di notificarne
l'occorrenza ai componenti "reattivi", cioè quei componenti il cui compito è quello di
attuare determinate operazioni in risposta a determinate situazioni rilevate.
27
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Figura 1.5: Modello di riferimento per il CEP Engine [5]
Il modello di riferimento per il CEP engine è mostrato nella figura 1.5. Come si può
notare, il motore riceve in ingresso tutte le informazioni necessarie ad elaborare il flusso,
quali eventi dati, eventi di controllo e in generale tutti i tipi di eventi significativi nel
particolare contesto preso in considerazione.
La prima operazione che effettua un motore CEP è il filtraggio, ossia la rimozione degli
eventi da uno stream in base alle loro proprietà (o attributi).
Esempi di filtraggio possono essere i seguenti:
• Prendere in considerazione tutto il traffico relativo ad un determinato protocollo, ad
es. SSH, HTTP, etc
• Considerare tutti e soli i dati forniti dai sensori i cui valori sono compresi in un
range prefissato
Attraverso tale fase, il CEP engine è in grado di effettuare una selezione degli eventi di
interesse, tagliando fuori tutti quelli privi di significato e non appartenenti dunque al
dominio del problema.
La scelta dell'algoritmo di filtering deve essere operata in base ai requisiti specifici della
particolare applicazione e contesto nel quale si opera. Tali requisiti sono determinati,
principalmente, dai due seguenti fattori:
28
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
• Velocità di filtering e di riconoscimento della singola sequenza di eventi:
In quanto nella maggior parte degli scenari di lavoro di un CEP, si prevede la
generazione di una ingente quantità di notifiche che, per essere utili al fine ad
esempio di generare un alert, devono essere elaborate in tempi congrui
• Quantità di memoria adoperata per tener traccia degli eventi primitivi:
In quanto un evento complesso è una combinazione di eventi primitivi, generati
anche molti istanti prima. Di conseguenza è necessario tener traccia di tali eventi,
ma allo stesso tempo è necessario anche non saturare le risorse disponibili in
termini di memoria.
Un concetto molto importante su cui i CEP engine basano l’event processing è quello di
sliding window. Una finestra è un oggetto che mantiene in memoria, in un certo istante di
tempo, un insieme finito di eventi appartenenti ad uno stream.
In generale, è possibile distinguere tra due tipi di finestre:
• Time-based window: contengono tutti gli eventi che si verificano in un determinato
intervallo temporale
• Count-based window: contengono una fissata cardinalità di eventi
L’utilizzo delle finestre consente al motore di effettuare operazioni fondamentali per
l’elaborazione degli eventi, quali ad esempio l’aggregazione.
Questa operazione consiste nell’aggregare molteplici eventi in un singolo evento,
attraverso l’applicazione, allo stream di eventi ricevuto in input, di funzioni aritmetiche
sui loro attributi (somma, conteggio occorrenze, etc.), statistiche (valor minimo, massimo,
medio, deviazione standard, etc.), estraendo in tal modo informazioni “aggregate” atte a
rilevare eventuali “scenari” significativi.
Riprendendo gli esempi proposti nel caso del filtraggio, è semplice comprendere l’utilità
di tale funzione. Ad esempio, nel caso del monitoraggio in rete, potrebbe essere utile
catturare, in un intervallo di tempo prefissato, tutto il traffico generato con un certo
29
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
protocollo, ricavando informazioni quali il traffico medio in quell’intervallo, il valore
massimo del rate di un particolare router, etc.
L’operazione più importante per un CEP engine, oltre a quelle finora presentate, è
sicuramente la correlazione. L’elaborazione contemporanea di flussi multipli di eventi
consente al motore di correlare dati appartenenti a flussi diversi e “apparentemente”
indipendenti tra loro.
La possibilità di trovare relazioni temporali, causali, topologiche tra eventi non solo dello
stesso tipo, ma soprattutto di natura diversa, rappresenta il punto di forza di un CEP
engine. Infatti riuscire a correlare informazioni semplici ed aggregate in un event cloud
vuol dire poter rilevare situazioni significative all’interno di un determinato contesto.
Riprendendo ancora una volta l’esempio precedente relativo al monitoraggio di una rete,
l’event correlation permette di rilevare efficacemente comportamenti anomali quali un
attacco di tipo TCP Gender Changer (che come vedremo sarà uno dei casi d’uso presi in
considerazione nell’ambito di questo lavoro di tesi) oppure un malfunzionamento di uno o
più dispositivi di rete (router, switch, etc.).
Nel caso, invece, di una rete di sensori predisposta per controllare e monitorare, ad
esempio, un ambiente critico da un punto di vista della sicurezza, grazie alla correlazione
di dati letti dai sensori e inviati al motore, è possibile identificare situazioni di pericolo
quali intrusioni non autorizzate.
La fase di event correlation è dunque indispensabile, e permette inoltre di evitare il rischio
di sottoporre all’applicazione eventuali informazioni irrilevanti (es. malfunzionamento di
un dispositivo di rete che invia sempre gli stessi pacchetti) o, al contrario, di trascurare
importanti segnali di pericolo (es. sensori di una stessa zona che forniscono valori critici di
temperatura).
Sebbene la correlazione sia fondamentale nell’individuare scenari significativi per il
dominio del problema, essa non consente però facilmente di stabilire relazioni temporali e
causali tra eventi. Si rende necessario, quindi, la capacità da parte di un CEP engine di
legare gli eventi da un punto di vista logico, causale e temporale, al fine di poter realizzare
30
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
la cosiddetta pattern detection.
A tale fine, i CEP engine si affidano di solito ad un linguaggio “SQL-like” (a cui si è già
accennato nell’ambito dell’ESP), il quale consente di esprimere facilmente tutte le
relazioni necessarie all’individuazione di eventi complessi.
In particolare, è possibile esprimere in maniera molto compatta ed efficiente sia relazioni
logiche tra eventi (AND, OR, NOT, etc.), sia relazioni causali (un evento ne precede un
altro, etc.).
Questa fase può essere vista in realtà come l’applicazione di tutte le altre fasi finora
descritte (filtering, aggregation e correlation), e permette di effettuare un’elaborazione di
più alto livello dell’insieme di tutti gli stream in ingresso al motore, riconoscendo
pattern complessi nel dominio di interesse [9].
Un CEP engine, come già più volte detto, utilizza un linguaggio molto simile all’SQL, che
consente di elaborare efficacemente ed efficientemente molteplici flussi di eventi.
Il filtraggio e la correlazione vengono realizzati infatti adoperando le stesse primitive
utilizzate per l’interrogazione di un database (clausole where, join, etc.), con l’aggiunta di
costrutti specifici per l’event processing (sliding windows, etc.). Tuttavia, un motore per il
complex event processing presenta alcune differenze sostanziali rispetto ad un DBMS
relazionale.
Figura 1.6: Relazione tra CEP engine e RDBMS
La figura 1.6 mostra in maniera grafica una prima differenza, la quale è relativa alla
31
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
modalità di analisi dei dati. Infatti è possibile vedere un CEP Engine come un database
“capovolto”, in quanto anziché memorizzare i dati ed effettuare query su di essi, prevede
che siano le regole ad essere memorizzate, sottoforma di query, alle quali poi saranno
sottoposti continuamente dati, ossia gli stream sottoposti ad elaborazione.
Un’altra differenza risiede nel paradigma di comunicazione. Infatti, mentre alla base di un
DBMS vi è un paradigma di tipo request/response, in cui si prevede la realizzazione di una
interrogazione al fine di ricevere un risultato, nel caso del CEP engine, invece, è di tipo
publish/subscribe, in quanto si prevede la memorizzazione di regole che definiscono il
comportamento del sistema e vengono notificati eventi complessi quando essi si
verificano.
1.5.1 Tecniche di correlazione
Come abbiamo già definito nel paragrafo precedente, lo scopo principale di un CEP
engine è quello di identificare eventi che corrispondono a pattern noti, a valle di
un’operazione di filtering, correlarli e generare un conseguente evento complesso che
descriva al meglio quanto sta accadendo nell’ambiente analizzato.
In tal modo, l'avvicendarsi degli eventi sarà più chiaro e leggibile, migliorando la
cosiddetta Situation Awareness e dando un supporto significativo al lavoro degli operatori
umani.
Il senso più profondo del concetto di correlazione risiede nell'approfondimento della
conoscenza del sistema, conseguente alla valutazione degli eventi che si verificano.
Pertanto, un motore di correlazione è uno strumento molto potente che, a seconda del
contesto in cui viene calato e del livello di astrazione delle informazioni che deve trattare,
è in grado di:
• Identificare situazioni straordinarie
• Identificare la causa che ha originato un problema
32
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
• Fare prediction sui possibili eventi futuri e scoprire trend
Oggigiorno esiste una grande varietà di soluzioni di correlazione, molte delle quali anche
estremamente differenti l’una dall’altra. Tale varietà è giustificata dalla moltitudine di
settori differenti nelle quali possono essere applicate, e per le quali costituiscono, nella
maggior parte dei casi, un valore aggiunto.
Nei prossimi paragrafi saranno descritte alcune di queste tecniche, ed in particolare le
seguenti:
• Correlazione basata su macchine a stati finiti
• Correlazione Rule-Based
• Correlazione Case-Based
1.5.1.1 Correlazione basata su macchine a stati finiti
Una delle tecniche di Event Correlation più adoperate è quella basata su macchine a stati
finiti. Un esempio del suo utilizzo è mostrato in [10]. Essa prevede l’individuazione e
successiva segnalazione di un evento considerato critico mediante due passi fondamentali:
• Costruzione del modello di sistema ad eventi
• Costruzione del protocollo diagnostico, cioè dell'insieme delle regole impiegate per
scoprire e localizzare l’evento critico
Il modello di sistemi ad eventi, strutturato come un automa a stati finiti, è costituito da un
insieme di stati, le cui transizioni sono valutate su occorrenze di eventi osservabili.
Il protocollo diagnostico riveste due specifiche funzionalità, cioè:
• La fault detection, cioè la comprensione dell'occorrenza di un evento che può
comportare la compromissione del sistema
33
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
• La localizzazione dell’evento, cioè l’individuazione del punto del sistema in cui lo
stesso è stato sollevato
In effetti, una volta modellato il sistema come una macchina a stati finiti, il correlation
engine opererà su tale formalismo, mediante un filtro, definito come un parametro
progettuale, che indicherà quali siano gli eventi da osservare e catturare.
Talvolta è auspicabile che a valle delle operazioni svolte sugli eventi, un correlation
engine restituisca più output differenti, ciascuno relativo ad uno specifico aspetto
dell’evento occorso. Per giungere a questo risultato si potrebbe, ad esempio, adoperare una
versione estesa di macchina a stati finiti, cioè una Finite State Trasducer, che consente ad
un correlatore di eventi di eseguire operazioni più complesse, senza che venga persa la
semplicità del modello sul quale si opera.
Nell'ambito della correlazione, un FTS può essere definito come una quintupla che
consiste di [11]:
• Un set di possibili input event I
• Un set di possibili output event O
• Un set di possibili stati S
• Uno stato iniziale S0 Є S;
• Una funzione di transizione di stato:
f : I x S --> S x O
che definisce lo stato successivo e il possibile output event.
Il modello prevede la possibile costruzione di un FTS per ciascuna categoria di event
pattern definita, ciascuno dei quali si riferisce ad una specifica classe di problemi
riscontrabili nell'ambito applicativo. Naturalmente, l'insieme di tutti gli FTS definiti
racchiude in sé la conoscenza del sistema complessivo.
34
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
1.5.1.2 Correlazione Rule-Based
La tecnica di correlazione rule-based, di cui un esempio di utilizzo è definito in [12], è
basato su tre elementi fondamentali:
• Data repository: repository dei dati relative ai problemi riscontrati nel sistema
• Knowledge base: repository delle regole specifiche del dominio
• Engine di inferenza: che indica in corrispondenza di quali eventi (o di quali
combinazioni di questi) debbano essere applicate le regole.
Si può comprendere che la correlazione viene effettuata in maniera molto semplice, infatti
l’engine non fa altro che valutare una regola dopo l’altra, fino a quando non viene trovata
una regola che realizzi il matching con gli eventi che sono stati osservati.
Differentemente da altre tecniche, nella correlazione rule-based il controllo e la
conoscenza sono separate. Ciò comporta un enorme vantaggio, e cioè la possibilità di
poter ampliare la knowledge base senza inficiare la struttura dell'engine, se non per
l'introduzione di nuove regole e, quindi, per la capacità di fare inferenza con un numero
più elevato di rule.
Queste regole generalmente definiscono relazioni di tipo condizione-azione, cioè essa
specifica sia una condizione (ad esempio “l’evento A si verifica almeno dieci volte in
cinque minuti”) che la relativa azione (ad esempio “invia una mail di allerta
all’operatore”).
Elemento cruciale per un corretto funzionamento di questa tecnica di correlazione è
sicuramente il linguaggio utilizzato per definire tali regole. Ad oggi esistono molti
linguaggi definiti per tale scopo e vanno da quelli proprietari, realizzati ad hoc dalle
aziende produttrici di sistemi CEP, a quelli XML based, SQL-like, etc.
Il limite principale di una correlazione rule-based è dovuto alla mancata capacità di
apprendimento dall'esperienza pregressa; pertanto, uno stesso calcolo potrà essere ripetuto
tanto frequentemente quanto frequente è l'occorrenza di uno stesso evento.
35
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Per ovviare a questo inconveniente l'unica possibilità resta l'intervento dell'operatore
umano, che dovrà inserire la nuova conoscenza acquisita nell'engine.
Questa soluzione, però, desta alcune perplessità in merito a determinati aspetti.
Un correlation engine viene applicato in contesti di diversa dimensione e complessità, ma
negli ultimi anni ci si sta spingendo maggiormente verso gli ambienti distribuiti, altamente
specializzati ed eventualmente IP-based, che mostrano più di altri caratteristiche di forte
variabilità nel tempo.
In uno scenario siffatto, un correlation engine rule-based espleterebbe i suoi compiti
richiedendo, però, un massiccio coinvolgimento da parte del personale umano.
A quest'ultimo, infatti, sarebbero richieste specifiche expertise rispetto al contesto
applicativo, in particolare: la conoscenza dello spazio degli eventi, delle loro possibili
combinazioni (che possono dar luogo ad ulteriori eventi significativi) e, naturalmente,
delle azioni da intraprendere in risposta a questi ultimi. Pertanto, in un ambiente che
coinvolge un gran numero di dispositivi, ciascuno dei quali possibile source di eventi,
dislocati in ambiente distribuito, si può facilmente intuire l'onere di conoscenza e capacità
a carico dell'esperto umano. Ancora, quando l'ambiente cambia velocemente, l'expertise
accumulata in un momento del ciclo di vita del sistema potrebbe non essere più sufficiente
per momenti successivi. Pertanto, l'evoluzione del sistema dovrebbe andare di pari passo
con l'approfondimento della competenza e della conoscenza degli operatori umani,
comportando un notevole sforzo in termini di tempo e di capacità cognitiva da parte di
questi ultimi. Tali considerazioni smantellerebbero, in ultima analisi, lo scopo principale
di un correlation engine, cioè dare supporto valido, minimizzando il lavoro ed il tempo
impiegato, al personale esperto.
Tuttavia, il principale vantaggio dell'approccio rule-based è mitigare il problema dei falsi
negativi (e non dei falsi positivi), che rappresentano una delle maggiori criticità in taluni
contesti applicativi (come quelli della sicurezza). Un ulteriore punto di forza è dato dalla
modularità dei rule pattern relativi ai vari sottosistemi, cosa che consentente agli operatori
dei singoli sottosistemi coinvolti di ottenere e concentrare la propria attenzione alle sole
36
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
informazioni a cui sono interessati.
1.5.1.3 Correlazione Case-Based
L'approccio Case Based, di cui un esempio d’uso è mostrato in [13], differisce in ampia
misura da quelli visti sino ad ora, poiché si basa sul concetto di "case".
Un case è l'insieme della definizione di un problema e della sua risoluzione, mentre si
definisce case library l'insieme di tutti i case riscontrabili in un determinato sistema. Si
comprende facilmente che quest’ultima rappresenta la base di conoscenza relativa al
dominio considerato.
Tipicamente, la case-based correlation prevede di risolvere un problema eseguendo una
determinata sequenza di operazioni, e precisamente:
• Registrazione dei dettagli dell’evento corrente
• Confronto tra i dettagli dell’evento corrente con dettagli quelli dei casi memorizzati,
al fine di identificare soluzioni adattabili all’evento problema corrente
• Selezione dei casi più simili all’evento corrente
• Applicazione della soluzione memorizzata all’evento corrente
• Se necessario, adattamento della soluzione memorizzata all’evento corrente, così da
ottenere una nuova soluzione
• Applicazione della soluzione adattata all’evento corrente e verifica del risultato
• Se la soluzione è soddisfacente, memorizzazione del nuovo caso in memoria
• Se la soluzione all’evento non è soddisfacente, esprimere la situazione di failure di
tale soluzione e proposta di una soluzione migliore.
I vantaggi più intuibili di questo approccio si intravedono principalmente nella possibilità
di riutilizzare la conoscenza di base acquisita e nella possibilità di ampliarla. Pertanto,
questo modello costituisce un supporto molto valido al lavoro degli operatori umani
addetti al controllo dello stato di sicurezza di un sistema e all’esecuzione delle
37
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
contromisure da intraprendere a fronte di eventi critici.
La pianificazione delle azioni da intraprendere per conservare lo stato corretto di un
sistema, parte dall’identificazione, laddove possibile, delle potenziali minacce a cui questo
è esposto. L’adozione del modello case-based, consente di ampliare mano a mano la
conoscenza degli eventi verificabili nel sistema e, di conseguenza, di (ri)definire le
relative contromisure. Pertanto, il processo di protezione può essere indirizzato in modo
puntuale verso la soluzione più adeguata, rispetto alla situation awareness acquisita.
1.5.2 Proprietà di un CEP Engine
Le proprietà fondamentali che caratterizzano un CEP Engine sono stette, e sono:
• Statefulness: definisce se il motore è in grado o meno di mantenere la storia degli
eventi. Di solito si preferisce utilizzare un motore che abbia questa capacità, cioè
stateful. Infatti un motore stateless, cioè che non ha memoria della storia degli
eventi, avrebbe capacità molto limitate di elaborazione di eventi complessi. In esso
infatti verrebbero a mancare concetti importanti come le sliding windows e
l’operazione di join tra stream di eventi. In tal caso sarebbe molto difficile
realizzare le operazioni di correlation e pattern detection di eventi complessi.
Gli unici vantaggi che si otterrebbe nell’utilizzare un CEP Engine stateless sono
esclusivamente la maggiore semplicità e velocità con cui è possibile realizzare le
varie operazioni. In realtà, però, tali vantaggi da soli non bastano a far preferire un
engine di questo tipo, in quanto anche un engine stateful è in grado di lavorare in
modalità stateless, così da non perdere il vantaggio di quest’ultima soluzione.
• Scalability: definisce la capacità dell’engine di essere o meno scalabile. Ovviamente
si preferisce adoperare un motore scalabile. I flussi di eventi, infatti, sono
generati, tipicamente, da applicazioni distribuite. Quindi risulta evidente il
vantaggio che si ottiene nel dividere il carico di elaborazione degli stream su più
38
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
motori. L’utilizzo di più motori riduce, però, la possibilità di sfruttare appieno le
potenzialità della correlazione, in quanto flussi multipli di eventi vengono inviati a
motori presenti su nodi diversi di elaborazione, per cui non è possibile correlarli
per rilevare eventi complessi (eccetto l’ipotesi di duplicare lo stream al fine di
inviarlo a più di un motore).
• Deployment: definisce se l’elaborazione del CEP engine è realizzata attraverso
l’ausilio di un unico motore (deployment centralizzato) o di più motori
(deployment distribuito).
• Information loss: cioè la perdita di informazioni da parte del motore. Un’operazione
di filtraggio, aggregazione o correlazione si definisce lossless se nessun evento o
informazione vengono persi durante l’operazione stessa. Un CEP engine è lossless
(senza perdita) se tutte le operazioni che effettua sono lossless. Un tale requisito
potrebbe essere richiesto nel caso in cui si debba effettuare un logging di tutti gli
eventi rilevati o, al contrario, potrebbe non essere affatto specificato, in modo tale
da consentire di preservare le risorse del sistema (memoria, CPU, etc.) su cui
risiede l’applicazione di Complex Event Processing.
• Trasparency: caratteristica fondamentale di un engine, la quale impone che siano
verificate le seguenti condizioni:
o Tutte le operazioni effettuate devono essere deterministiche
o Lo stato interno del motore e gli eventi in ingresso ad esso devono essere
noti
In questo modo il comportamento del motore, che può essere rappresentato da un
insieme di regole, risulta essere noto. In particolare, nel caso di un engine rulebased, si ha che le regole sono sempre note e lo stato interno dipende soltanto da
un insieme limitato (temporalmente) di eventi, per cui le decisioni prese sono
deterministiche.
In
altri
casi,
invece,
in
cui
il
motore
effettua
un
autoapprendimento della realtà, prendere decisioni è più complesso, in quanto il
39
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
comportamento
potrebbe
dipendere
da
un
insieme
molto
più
ampio,
temporalmente, di eventi.
• Robustness: cioè la capacità di far fronte a situazioni impreviste, ossia non
contemplate dalle specifiche.
• Maintainability: cioè la capacità di apportare facilmente modifiche al motore.
Quest’ultima è una proprietà fondamentale per un CEP engine, in quanto
l’esigenza di elaborare eventi complessi si ha molto spesso in contesti in cui è
richiesta una conoscenza approfondita della realtà di interesse ed in cui l’ambiente
esterno cambia frequentemente.
1.6 Il CEP nelle infrastrutture IT di sicurezza
Il problema della sicurezza assume grande rilevanza in un ampio spettro di contesti
applicativi, dalla gestione dei processi aziendali al monitoraggio di reti; dal controllo e
supervisione di ambienti (pubblici e privati), al supporto di applicazioni per servizi
finanziari e bancari. Si effettua una breve sintesi delle varie aree:
• Business Process Management (BPM) and automation: process monitoring,
business activity monitoring (BAM), report exceptions, operational intelligence
• Finance: algorithmic trading, fraud detection, risk management
• Network monitoring: intrusion detection, SLA(service level agreement) monitoring
• Sensor network applications: RFID (radio frequency identification) reading, air
traffic control
La tecnologia CEP è in grado di fornire, per ciascuna delle aree sopra indicate, un valido
strumento di approccio al problema fondamentale che rappresenta il minimo comun
denominatore di tutte: l’elaborazione di grandi volumi di dati in real-time al fine di
rilevare eventi complessi.
40
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Le moderne infrastrutture IT, infatti, hanno la necessità di gestire grandi volumi di dati e
garantire la sicurezza, diventa ancor più un problema complesso da affrontare.
Nel corso degli ultimi anni, lo sviluppo tecnologico ha consentito l’introduzione sul
mercato di un numero elevato di dispositivi utili nell’ambito della sicurezza, come ad
esempio sensori ambientali, telecamere intelligenti, sonde per il controllo degli accessi nei
sistemi informatici, sonde per il traffico di rete, Intrusion Detection System, etc.
Tali strumenti hanno aperto nuovi scenari relativamente alla sicurezza, sia ambientale
(come ad esempio la Building Security), sia informatica.
La possibilità di monitorare un ambiente o una rete con un numero elevato di dispositivi
permette da un lato di avere una grande quantità di informazioni per poter valutare le
condizioni in cui versa attualmente il sistema monitorato, ma dall’altro pone un problema
di non poca rilevanza, e cioè gestire opportunamente tutte le informazioni di cui si
dispone, in tempo reale.
Gli scenari odierni prevedono la presenza di numerosi e spesso eterogenei sistemi di
controllo e di gestione, tutti caratterizzati da scarsa integrazione e ridotta capacità di
analisi e correlazione di eventi.
Un modello di processo valido, in linea di principio, per l’approccio ai problemi di analisi
e correlazione di eventi in ambienti complessi dovrebbe essere fondato essenzialmente su
tre fasi fondamentali, rappresentate nella figura 1.7:
• Ricezione degli eventi semplici (definiti spesso anche come Raw Event o eventi
grezzi), provenienti dalle varie sorgenti
• Analisi di tali eventi in tempo reale, attraverso l’ausilio di un CEP Engine, al fine di
identificare degli eventi complessi/situazioni, nella realtà di interesse, basandosi
sulle regole e/o pattern noti a priori
• Avvio delle azioni necessarie previste per la determinata situazione rilevata
41
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Figura 1.7: Flusso di Complex Event Processing
Gli ingressi del sistema da controllare e gestire sono rappresentati dalle sorgenti hardware
(sonde, sensori, telecamere, etc.) e software (Intrusion Detection System, aggregatore di
log di sistema) che generano informazioni significative nel dominio di interesse (già
definite precedentemente come eventi).
Una volta ricevuti gli eventi, la fase successiva è quella relativa all’analisi di questi ultimi.
In realtà essa può essere divisa in due sottofasi. La prima, in cui si identificano, a partire
dagli eventi semplici ricevuti, gli eventi di tipo complesso. In questa fase, dunque, viene
realizzato l’event stream processing, ossia l’elaborazione di flussi, che porta alla
generazione di eventi complessi. La seconda, invece, prevede che a partire dagli eventi
complessi, generati dalla prima fase, si individuino, in tempo reale, i pattern in base alle
regole definite. Si comprende facilmente che in tale fase viene realizzato il vero e proprio
complex event processing.
Nel passaggio dalla prima alla seconda sottofase (che sono concettualmente distinte, ma
che di solito sono realizzate insieme), si è passati dall’event stream all’event cloud, ossia
dagli eventi appartenenti a flussi diversi e quindi di natura diversa, ad un insieme compatto
(nel senso matematico del termine, ossia chiuso e limitato) di eventi più significativi, a
seguito di operazioni fondamentali quali il filtraggio, l’aggregazione e la correlazione.
42
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
La terza ed ultima fase è quella in cui, partendo dai pattern opportunamente rilevati, si
effettuano azioni di risposta, atte a risolvere la situazione rilevata. In quest’ultima fase,
dunque, si definisce il processo decisionale in base al quale il sistema adotterà precise
politiche.
Le azioni da compiere, quando si verifica un evento complesso significativo per il dominio
del problema, variano a seconda del tipo di obiettivo da perseguire e possono essere cosi
sintetizzate:
• Gli eventi vengono notificati al fine di realizzare un monitoraggio (Business Activity
Monitoring, BAM) per fare reportistica e produzione di statistiche (dashboard), file
di log, etc.
• Al verificarsi di un evento possono scattare precise attività o processi
L’elaborazione corretta dell’insieme degli eventi prodotti, ossia la loro aggregazione,
correlazione logica, temporale e topologica, consente di rilevare, in tempo reale, situazioni
di pericolo per le quali può risultare fondamentale agire in maniera tempestiva [9].
La tecnologia CEP può rappresentare quindi un elemento fondamentale nella realizzazione
di sistemi per la gestione di eventi complessi, soprattutto per quelli in cui è molto forte
l’esigenza di elaborare in tempo reale un enorme volume di informazioni, proprio come
quelli relativi alla building e network security.
43
Capitolo 2
Un sistema CEP in scenari di sicurezza
2.1 Introduzione
La crescente complessità ed eterogeneità delle moderne infrastrutture dei sistemi di
controllo
porta
ad
una
crescita
esponenziale
della
complessità
di
gestione
dell’infrastruttura e delle attività di analisi relative a situazioni di anomalia o pericolo
rilevate da tali sistemi.
Gli scenari odierni prevedono la presenza, all’interno dei centri servizi di controllo, di
numerosi, e spesso eterogenei, componenti come sistemi per la visualizzazione delle
immagini rilevate dall’infrastruttura di videosorveglianza, quadri sinottici e/o riepilogativi
utilizzati per rilevare il funzionamento e le segnalazioni dei sensori ambientali, sistemi per
il controllo degli accessi fisici, sistemi di controllo delle piattaforme IT, etc; tali scenari, se
da un lato portano al potenziamento delle funzionalità complessive del sistema, dall’altro
portano un incremento della complessità e del volume del flusso dati prodotto dai sistemi
ed un accrescimento esponenziale nelle richieste di elaborazione di tali informazioni.
Tale accrescimento della complessità e del volume dati ricade in modo diretto sulla
capacità di analisi degli scenari e sintesi degli interventi da parte del personale addetto alla
gestione e supporto delle operazioni di controllo: ogni operatore è chiamato ad analizzare,
in tempi brevi, un numero sempre crescente di eventi e/o anomalie, provenienti da un
numero
sempre
crescente
di
sistemi,
dovendo
correlare,
filtrare
ed
44
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
analizzare tali scenari al fine di rispondere in modo adeguato alle situazioni che richiedono
attenzione e risposte adeguate.
Le attuali tecnologie impiegate prevedono la presenza di molteplici sistemi di controllo e
gestione, caratterizzati da scarsa integrazione e ridotta capacità di correlazione ed analisi
degli eventi rilevati nel complesso di tali sistemi.
L’onere dell’analisi di tali eventi (spesso molto semplici e “primitivi”), al fine di ricavare
un quadro d’insieme, è demandata in modo quasi totale alla capacità ed alla preparazione
dei singoli operatori: essi devono interagire con le piattaforme di controllo in modo da
sintetizzare in maniera corretta le informazioni raccolte in tale ambiente eterogeneo, e
devono conoscere a fondo l'ambito applicativo ed ogni singolo componente del sistema.
Inoltre dovranno essere a conoscenza delle caratteristiche dell'ambiente in cui operano,
degli eventi che possono essere generati da ciascun sotto-sistema, delle conseguenze che
possono essere prodotte sul sistema e di quali siano le azioni da intraprendere a fronte di
particolari situazioni. In alcuni casi, l’elevata eterogeneità dell’ambiente, può ridurre
all’impossibilità la capacità di effettuare un’analisi accurata in tempi brevi e, di
conseguenza, fornire una risposta adeguata a tali situazioni.
In tale quadro si evidenziano in modo sintetico i principali problemi rilevati:
• Crescente volume di informazioni da analizzare e riduzione dei tempi di risposta
attesi
• Richieste crescenti di capacità di analisi e gestione da parte degli operatori in
ambienti di controllo dalla elevata complessità
• Richiesta capacità di interazione con più sistemi anche molto diversi
• Accoppiamento marcato tra la capacità di analisi e correlazione degli operatori ed il
volume di dati elaborati per supportare il processo decisionale di intervento
• Mancanza di correlazione tra le informazioni e gli eventi raccolti nel complesso dei
sistemi in campo
• Ampi margini discrezionali e di interpretazione nel processo decisionale per
intraprendere le opportune azioni correttive al verificarsi di eventi diffusi nel
45
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
complesso dei sistemi in campo
Tali problematiche rendono necessario l’utilizzo di un sistema che sia in grado di
supportare, in modo efficace, gli operatori nel processo decisionale degli interventi da
porre in essere in risposta alle sollecitazioni provenienti dall’ambiente sotto controllo.
A tal proposito, l'integrazione all'interno di tali sistemi di soluzioni di Complex Event
Processing rappresenterà un'ottima base sulla quale costruire l'interoperabilità tra i
sottosistemi coinvolti [14].
L'adozione della tecnologia CEP consentirebbe di automatizzare la maggior parte del
lavoro richiesto agli operatori umani, fornendo grossi benefici in termini di tempi, costi
ed, in definitiva, di opportunità di business [15].
Un CEP è in grado, infatti, di fornire in near real-time informazioni significative sulla
sicurezza, mostrando un quadro realistico dello stato di protezione dell'ambiente
sorvegliato. Dunque, a garanzia della situation awareness, in un CEP è possibile
esplicitare le relazioni tra i sotto-sistemi dai quali sono ricevuti i flussi di eventi,
individuando le informazioni rilevanti e trascurando quelle irrilevanti (come i falsi
positivi).
Come già accennato all’inizio di questa trattazione, la realizzazione di un tale sistema è
proprio l’obbiettivo del progetto CEvOS, nonché l’oggetto di questo lavoro di tesi.
Pertanto saranno fornite, nei paragrafi seguenti, una descrizione dei principali requisiti che
la piattaforma implementata deve necessariamente soddisfare, nonché gli scenari
applicativi, e i relativi casi d’uso, nei quali essa sarà adoperata.
Prima però è presentata una tabella comparativa, in relazione ai principali aspetti legati
alle problematiche presentate, tra le tecnologie attualmente impiegate e quella oggetto di
studio di questo lavoro di tesi:
46
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Tabella 2.1: Tabella comparativa tra le tecnologie esistenti e la proposta innovativa
Aspetto
Con tecnologie esistenti
Struttura del sistema di Eterogenea e legata alle singole
piattaforme di controllo
gestione eventi
Eventi generati dai
sistemi
Capacità di analisi
degli operatori
Processo di analisi
Eventi elaborati per essere più
“significativi” e che consentono di
valutare in modo più efficace le
situazioni in corso
Elevata con presenza di operatori
particolarmente preparati sugli
strumenti e sulle piattaforme impiegate
ed in grado di effettuare anche la
correlazione di eventi provenienti da
ambienti eterogenei
Focalizzata sull’analisi degli eventi
“significativi”e non sulla classificazione
degli eventi “primitivi”. La correlazione
degli eventi è supportata in modo
diretto dalla piattaforma.
Richiede lo studio degli eventi
verificatisi sulle diverse piattaforme e la
loro correlazione attraverso valutazioni
fortemente orientate al supporto ed alla
competenza degli operatori
L’analisi avviene in modo centralizzato
attraverso un singolo strumento che
elimina il processo di correlazione,
filtraggio e classificazione degli eventi,
lasciando agli operatori il compito di
interpretare ad alto livello le
informazioni generate
Assenti o limitati alla singola
piattaforma
Report ed informazioni Assenti o limitati alla singola
piattaforma
aggregate
Adattabilità e
configurazione
dell’ambiente
Scalabilità sistemi ed
eventi
Unificata nella singola piattaforma di
raccolta, analisi e gestione degli eventi
Semplici, non correlati e dalle
caratteristiche eterogenee
Assente o limitato alla singola
Supporto alle decisioni piattaforma
Interventi automatici
Con proposta innovativa
Integrato nella singola piattaforma di
analisi e gestione degli eventi
Integrati e capaci di interagire con il
complesso dei sistemi in campo
attraverso i componenti di gestione
degli eventi rilevati
Contenenti informazioni aggregate
ricavate dall’analisi degli eventi
dell’intero sistema di controllo
Complessa, può richiedere interventi di
configurazione su tutti i sistemi e, di
conseguenza, sull’addestramento del
personale per i sistemi oggetto
dell’adattamento
Interventi sulla singola piattaforma di
gestione utilizzando un ambiente unico
di configurazione e predisposizione
Limitata dal volume e numero di
informazioni prodotte e sottoposte ad
analisi da parte degli operatori
Gestita direttamente dalla piattaforma
con supporto al filtraggio ed
aggregazione delle informazioni
prodotte attraverso un processo
automatizzato ed efficiente
47
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
2.2 Requisiti di alto livello
Come già accennato nel paragrafo precedente, l’obiettivo principale del progetto è quello
di realizzare una piattaforma che consenta di supportare in modo adeguato gli operatori nel
processo di analisi degli eventi e di definizione delle decisioni da selezionare in risposta a
tali eventi.
Tale obiettivo è perseguito costruendo la piattaforma in base ad una serie di linee guida
ritenute primarie ed essenziali al fine di conseguire in modo corretto le finalità del
software oggetto di questo lavoro di tesi. Tali linee guida possono essere considerate come
veri e propri requisiti funzionali di alto livello che il software da sviluppare deve
soddisfare, e sono indicati di seguito:
• La piattaforma deve essere in grado di elaborare in modo autonomo grandi quantità
di dati (eventi) generati dai sistemi presenti sul campo; l’elaborazione ha i seguenti
obiettivi:
o Rilevare e rimuovere informazioni accessorie, non significative, replicate o
deducibili da altre informazioni già in elaborazione; tale elaborazione
riduce il carico elaborativo dell’analisi e rende maggiormente focalizzata
l’attività di sintesi degli operatori
o Condensare e sintetizzare gli eventi riportando le informazioni essenziali;
tale elaborazione aiuta il processo di interpretazione degli scenari in corso
di analisi
o Aggregare e correlare informazioni ed eventi in base ad una affinità di
carattere topologico oppure in base a precisi schemi di elaborazione; tale
elaborazione effettua in modo automatico la correlazione degli eventi
sollevando l’operatore dall’onere di effettuare la correlazione in base
unicamente alla sua preparazione, esperienza ed attenzione sull’attuale
scenario in corso di valutazione
o Riportare eventi generali e maggiormente significativi creati appositamente
48
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
dal sistema di analisi a descrizione di una serie di eventi “primitivi”
elaborati in ingresso; tale elaborazione fornisce eventi artificialmente creati
dal sistema di elaborazione, partendo dagli eventi “primitivi”, che sono
maggiormente significativi per gli operatori a cui non è demandato
completamente l’onere di interpretare le informazioni
o Assorbire eventi ricavabili direttamente dall’elaborazione; tale elaborazione
evita di fornire informazioni non essenziali e ricavabili in modo automatico
o semiautomatico al fine di ridurre il carico di elaborazione delle
informazioni demandato all’operatore
• La piattaforma deve fornire strumenti per la formalizzazione, memorizzazione ed
utilizzo delle regole e degli schemi adoperati dal motore di analisi degli eventi in
modo da poter gestire in modo strutturato e deterministico il processo di
elaborazione; tale caratteristica rende affidabile il processo di elaborazione
slegandolo dalle interpretazioni e dal grado di preparazione e capacità degli
operatori
• La piattaforma deve essere in grado fornire un processo decisionale autonomo
attivato in tempi rapidi che possa rispondere in modo adeguato alle configurazioni
di eventi “significativi” forniti dal motore di elaborazione degli eventi; questo
componente ha l’obiettivo di fornire supporto al processo decisionale affidato agli
operatori che dovranno finalizzare le decisioni automatiche intraprese oppure
decidere in piena autonomia (ma correttamente supportati) le azioni da
intraprendere.
In sintesi, fornendo una piattaforma integrata dotata di strumenti avanzati, a supporto
dell’analisi
degli
eventi
ed
a
supporto
del
processo
decisionale
innescato
conseguentemente, si intende ridurre e, laddove possibile, eliminare, la complessità di
analisi e correlazione degli eventi, nei complessi scenari presentati, a beneficio della
capacità di valutazione e risposta degli operatori alle situazioni che richiedono particolare
49
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
attenzione.
In raccordo con le linee guida fornite, elenchiamo la sintesi delle caratteristiche chiave
della piattaforma:
• Fornire un ambiente unico ed integrato a supporto del processo di analisi e del
processo decisionale degli operatori
• Elaborare in tempo reale gli eventi provenienti dal complesso dei sistemi in campo
in modo da fornire una sintesi di alto livello a beneficio degli operatori e del
sistema di supporto decisionale
• Capacità di sintetizzare eventi eterogenei in eventi “significativi” e maggiormente
descrittivi degli accadimenti in corso sul campo operativo oggetto del controllo da
parte dei sistemi
• Gestire un processo decisionale automatizzato con due finalità principali:
o Rispondere in modo diretto ed in tempi rapidi alle sollecitazioni provenienti
dai sistemi negli scenari gestibili in modo automatico
o Fornire un supporto agli operatori nella gestione di situazioni complesse
fornendo elaborazioni decisionali preliminari e demandando l’intervento
finale alle decisioni degli operatori
• Predisporre la piattaforma in modo che possa raccogliere le informazioni
provenienti da sistemi sul campo anche notevolmente diversi, ad esempio:
o Telecamere intelligenti
o Sistemi di rilevazione degli accessi
o Sonde per il traffico di rete
o Sonde per il controllo accessi nei sistemi informatici
• Dotare la piattaforma della capacità di interagire con i sistemi sul campo oppure con
sistemi orientati al controllo ed intervento in risposta agli scenari in corso di
valutazione; tale caratteristica permette di incrementare la quantità e qualità delle
informazioni visualizzate dagli operatori intervenendo direttamente sulla
presentazione dei dati attraverso le piattaforme di controllo pre-esistenti; in
50
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
particolare tale caratteristica consentirà di fruire di una visualizzazione in “realtà
aumentata”
inserita
direttamente
nei
sistemi
di
controllo
basati
su
videosorveglianza.
Definiamo ora in maniera più formale i requisiti della piattaforma implementata,
considerando separatamente i requisiti funzionali e quelli non funzionali.
2.2.1 Requisiti funzionali
Per quanto riguarda i requisiti funzionali, che ricordiamo sono quei requisiti che
descrivono le funzionalità del sistema, la nostra piattaforma prevede:
• Events Receiving: il sistema deve essere in grado di comunicare con più
sottosistemi, ad esempio sensori, anche molto eterogenei tra loro, al fine di ricevere
gli eventi da essi generati
• Events Filtering and Aggregation: il sistema deve essere in grado di realizzare
operazioni di filtraggio e aggregazione di eventi alla loro ricezione, al fine di
rimuove eventi non significativi e/o aggregare eventi simili
• Events Correlation: il sistema deve essere in grado di correlare eventi,
filtrati/aggregati e non, al fine di rilevare particolari situazioni di interesse
• Complex Events Generation: il sistema deve essere in grado di generare eventi
complessi che descrivano la particolare situazione di interesse rilevata, e i quali
potrebbero essere utilizzati da altri sottosistemi, ad es. sottosistemi di attuazione
• Alerts Generation: il sistema deve essere in grado di generare alert per gli operatori,
i quali saranno così avvertiti sulla situazione rilevata.
Tali requisiti funzionali possono essere riassunti nel seguente use case diagram.
51
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Figura 2.1: Use Case Diagram relativo ai requisiti funzionali
2.2.2 Requisiti non funzionali
In termini di requisiti non funzionali, che ricordiamo sono quei requisiti che descrivono
dei vincoli sul sistema, la nostra piattaforma invece deve:
• Essere in grado di elaborare gli eventi in real-time o near real-time
• Essere in grado di generare alert chiari e facili da comprendere per l’operatore, e
visualizzati in tempi brevi rispetto all’arrivo dei relativi eventi
52
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
• Essere facilmente manutenibile, garantendo che la modifica di uno dei suoi moduli
non comporti modifiche anche agli altri
• Essere facilmente estensibile, garantendo modifiche lievi o assenti agli altri moduli
all’aggiunta di un nuovo componente
• Garantire una buona capacità di riconoscimento delle situazioni di interesse, e
precisamente deve:
o Garantire una quantità molto bassa di falsi negativi, e quindi un valore di
Recall quanto più prossimo a 1
o Garantire una quantità di falsi positivi ottimale, cioè in quantità almeno
ridotte rispetto a quelli che si avrebbero senza l’ausilio del sistema. Ciò si
traduce in un valore di Precision non necessariamente molto vicino ad 1.
• Garantire il mantenimento delle proprie prestazioni, soprattutto in termini di falsi
negativi (e quindi di Recall), all’aumentare della quantità di eventi da elaborare
Da notare che i parametri di Precision e Recall saranno definiti e approfonditi nel capitolo
6, dove saranno trattai i risultati sperimentali di questo lavoro di tesi.
Defiamo ora i requisiti di dettaglio. A tal fine saranno descritti gli scenari applicativi
nell’ambito dei quali sarà simulata l’applicazione. Precisamente i due scenari sono:
• Building Security
• Network Security
2.3 Scenari applicativi: Building Security
Lo scenario è incentrato sul garantire la building security ad una determinata
organizzazione, allo scopo di prevenire, evitare o mitigare situazioni di pericolo per
persone, ambiente e sistema.
53
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
A tale scopo, la piattaforma è dotata di un insieme eterogeneo di sottosistemi ICT,
deputati, in varia misura, al monitoraggio di specifiche sezioni e/o tipologie di eventi del
contesto in cui sono calati. Tali dispositivi, al momento, non sono connessi tra loro,
dunque il sistema di sorveglianza non è adoperato in maniera ottimale.
Pertanto, l'obiettivo è quello di mettere in comunicazione i componenti deputati al
monitoring dell'area, al fine di ottenere una visione maggiormente dettagliata dello
scenario complessivo posto sotto sorveglianza. Tale conoscenza consentirà di
intraprendere
azioni
specifiche
per
prevenire/evitare/mitigare
situazioni
che
compromettono la sicurezza del sistema ed, in definitiva, di supportare l'ente preposto alla
sicurezza alla scelta delle azioni da intraprendere.
Figura 2.2: Data processing for alarm generation
Per quanto riguarda il sistema relativo a questo scenario, ad un elevato livello di
astrazione, i dispositivi che lo compongono sono:
• Sistema di controllo dell’impianto di illuminazione: si preoccupa di monitorare lo
stato dei componenti dell’impianto di illuminazione
• Sistema di controllo degli accessi: adoperato al fine di restringere l'accesso a
determinate aree, considerate "sensibili", a personale non autorizzato
• Sistema di monitoraggio e sorveglianza, che comprende:
o Telecamere, che monitorano diverse zone sensibili dell’organizzazione
o Centri di controllo, che ricevono le immagini dalle camere e dotati di moduli
54
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
per l'esecuzione di azioni specifiche.
Il sistema così realizzato, dovrà soddisfare una serie di requisiti, e precisamente:
• Monitoraggio del sistema di illuminazione: L'area sottoposta a videosorveglianza è
illuminata mediante fari dislocati lungo tutto il suo perimetro ed in corrispondenza
di ogni telecamera. Il sistema di controllo dovrà monitorare il corretto
funzionamento dell'impianto di illuminazione, segnalando eventi quali: mancanza
di alimentazione, anomalia o guasto di un dispositivo, etc.
• Controllo degli accessi pedonali: Il punto di accesso ad una zona sensibile sarà
dotato di un tornello, dotato di un badge reader e sbarra di accesso.
Il controllo sarà effettuato, oltre che sulle credenziali d'accesso presenti sul badge,
da una telecamera, che riprenderà 24h/24 il varco di ingresso. Tale telecamera,
dotata di un modulo di Video Analytics, al fine di consentire l'accesso all’area
riservata, eseguirà la Face Detection. Il sistema riceverà pertanto le informazioni
relativa alla persona identificata mediante il badge, e quelle relative alla persona
identificata mediante la Face Detection. L’addetto dovrà ovviamente garantire
l’accesso nel caso in cui le informazioni pervenute siano relative alla stessa
persona. Ovviamente si prevede che ciascun operatore sarà dotato di un badge
magnetico personale, contenente le credenziali di identificazione (nome, cognome,
numero operatore, società terza di afferenza, etc.) e la fototessera.
• Gestione del Tampering: Il sistema di videosorveglianza, attraverso la funzionalità
di Video Analytics, rileverà l'oscuramento di qualsiasi telecamera ubicata nella
zona sottoposta a sorveglianza. Il sistema di videosorveglianza gestirà l'evento
acquisito ed allerterà il centro di controllo, per consentire alle unità preposte di far
fronte all'evento.
• Gestione Low Light: All'interno dell'area sorvegliata, il sistema di videosorveglianza
sarà costituito da telecamere,
dotate di
funzionalità di Video Analytics ed
illuminate dai fari dell'impianto di illuminazione e da luce naturale. Ogni
55
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
telecamera sarà in grado di rilevare una variazione della luminosità dell'ambiente
circostante. In tal caso, il sistema individuerà e gestirà l'evento “Low Light”, ed
allerterà il centro di controllo, per consentire alle unità preposte di far fronte
all'accadimento.
Definito in maniera generale il primo scenario applicativo, e i requisiti relativi a
quest’ultimo, vediamo ora i due casi d’uso presi in considerazione, soffermandoci sia sui
requisiti richiesti al sistema CEP che si vuole realizzare, sia sugli effettivi vantaggi che
l’utilizzo di quest’ultimo porta in essi.
2.3.1 Casi d’uso: Rilevamento di un falso positivo per Camera Tampering
Il primo caso d’uso per questo scenario applicativo è relativo alla possibilità che venga
generato un falso positivo per evento di Tampering su una camera del sistema di
videosorveglianza.
Supponiamo infatti che, di notte, in un certo istante si verifica il guasto di una lampada,
che non viene tracciato. La telecamera, che è puntata nell’area illuminata da quella
lampada, interpreterà la variazione di luminosità come un evento di tampering e genererà
un allarme. Nel frattempo, l'operatore umano sarà situato nella Control Room, dalla quale
espleterà le operazioni di controllo, analisi ed interpretazione degli eventi generati dal
sistema, o meglio dai vari sotto-sistemi.
A questo punto valutiamo che cosa accade nel caso in cui sia presente o meno il nostro
sistema CEP:
• Nel caso di assenza di CEP, l'allarme relativo all'evento di tampering è stato
generato dal sistema di controllo della telecamera e perverrà all'operatore.
Nell'immediato, quest’ultimo non sarà in grado di identificare come falso allarme il
segnale di pericolo che è stato notificato, e quindi avrà una conoscenza errata dello
56
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
stato di sicurezza dell'ambiente. Ciò porterà all’attuazione di azioni non idonee alla
risoluzione del problema riscontrato. Altresì, il tempo necessario affinché
l'operatore possa chiarire le cause dell'evento potrebbe essere tale da non
consentirne una risposta tempestiva.
• Nel caso di presenza di CEP, si prevede che quest’ultimo sia stato preliminarmente
istruito sulla posizione di ciascuna lampada e sul raggio di copertura di ognuna di
esse, cioè conosce quali telecamere sono illuminate da quali lampade. Ciò fa sì che
per il sistema sarà chiara la relazione causale tra gli eventi “guasto della lampada”
ed “allarme di tampering”. Pertanto, filtrando le informazioni pervenutegli, e
precisamente riscontrando che l’evento di “tampering” per la camera è stato
preceduto dal guasto della lampada che illumina quella stessa camera, il CEP sarà
in grado di trascurare il falso allarme, notificando all'operatore il “guasto della
lampada”.
Come si può comprendere, l'integrazione di una soluzione CEP consente di aprire un varco
all'interoperabilità tra i sottosistemi, che saranno in grado di comunicare gli eventi generati
al sistema. Inoltre, l'operatore è sollevato dalla conoscenza specifica di tutti gli eventi che
possono essere originati da ciascun sottosistema, nonché delle loro relazioni di
dipendenza. Ed infatti, il CEP (se in precedenza istruito in maniera adeguata) eseguirà
automaticamente ed efficientemente le attività tipicamente a carico dell'operatore umano.
Infine, il sistema fornirà in near real-time solo le informazioni significative per il contesto
sorvegliato, allo scopo di supportare l'addetto alla sicurezza alla scelta dell'azione da
intraprendere a fronte di un problema reale.
Vediamo ora quali sono i requisiti del nostro sistema CEP per questo caso d’uso.
Precisamente abbiamo che la piattaforma deve essere in grado di:
• Interfacciarsi con sottosistemi che adoperano particolari standard (come ad es.
BACnet). In tal modo, i componenti coinvolti nel controllo della sicurezza potranno
comunicare eventi di natura diversa che, una volta correlati, consentiranno di
57
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
migliorare l'efficienza del sistema di sorveglianza nella sua interezza. In
particolare, per questo caso d’uso, i sottosistemi con cui dovrà interfacciarsi la
piattaforma sono:
o Sistema di monitoraggio dell’impianto di illuminazione
o Telecamere di videosorveglianza
• Riconoscere gli alert relativi al tampering di una camera, provenienti dal sistema di
videosorveglianza
• Riconoscere gli alert relativi al guasto di una lampada, provenienti dal sistema di
monitoraggio dell’impianto di illuminazione
• Conoscere la posizione di ogni telecamera e di ogni lampada, così da quale o quali
lampade illuminano una determinata videocamera
• Correlare le informazioni provenienti dalle due fonti, al fine di riconoscere un falso
positivo per un evento di “camera tampering”
2.3.2 Casi d’uso: Rilevamento di un accesso non autorizzato
Il secondo caso d’uso per questo scenario applicativo è relativo alla possibilità che un
dipendete dell’organizzazione, o una persona esterna, acceda ad una delle aree sensibili
utilizzando un badge di un altro dipendente.
In questa ipotesi, il sistema di controllo degli accessi verifica l'identità della persona che
sta accedendo all’area riservata attraverso il badge magnetico, che è stato opportunamente
inserito nel badge reader, autorizzandolo.
Contestualmente, la videocamera posta all’ingresso dell’area effettua la Face Detection e
rileva il volto della persona che ha richiesto l'accesso, identificandolo (nel caso in cui sia
un dipendente dell’organizzazione).
A questo punto valutiamo che cosa accade nel caso in cui sia presente o meno il nostro
sistema CEP:
58
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
• Nel caso di assenza di CEP, i due sottosistemi non sono in grado di comunicare;
pertanto, le operazioni di correlazione degli eventi sono completamente a carico
dell'addetto alla sicurezza. Questi dovrebbe, innanzitutto, reperire in tempo reale le
informazioni pervenute dal sistema di controllo degli accessi e da quello di
videosorveglianza, poi individuare le relazioni tra gli eventi ed, infine, ordinare il
blocco di accesso alla persona che lo ha richiesto. Ovviamente, il tempo necessario
affinché l'addetto compia in maniera efficiente tali operazioni potrebbe essere
inaccettabile. Del resto, il varco di ingresso all'area sorvegliata potrebbe presentare
più tornelli, cosa che complicherebbe molto il lavoro di un operatore umano, al
quale sarebbe richiesta un'attenzione simultanea a più sottosistemi, una notevole
capacità di correlazione degli eventi ed un tempo di risposta congruo.
• Nel caso di presenza di CEP, invece, si prevede che quest’ultimo sia stato istruito
precedentemente sugli eventi che possono essere generati dal sistema di controllo e
dal sistema di videosorveglianza; di conseguenza, sarà in grado, in tempo reale, di
correlare gli eventi occorsi (esito positivo dal primo ed esito negativo dal secondo
sottosistema), ed indicare all'addetto alla sicurezza l'azione da intraprendere, cioè il
blocco dell'ingresso all'area.
Come si può comprendere, anche in questo caso, l'integrazione di una soluzione CEP porta
a numerosi vantaggi, consentendo di sollevare l'operatore umano da operazioni talvolta
difficili, affinché possano essere intraprese azioni tempestive ed efficaci agli eventi
occorsi.
Vediamo ora quali sono i requisiti del nostro sistema CEP per questo caso d’uso.
Precisamente abbiamo che la piattaforma deve essere in grado di:
• Interfacciarsi con sottosistemi che adoperano particolari standard (come ad es.
BACnet). In tal modo, i componenti coinvolti nel controllo della sicurezza
potranno comunicare eventi di natura diversa che, una volta correlati consentiranno
di migliorare l'efficienza del sistema di sorveglianza nella sua interezza.
59
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
In particolare, per questo caso d’uso, i sottosistemi con cui dovrà interfacciarsi la
piattaforma sono:
o Sistema di controllo degli accessi
o Telecamere di videosorveglianza
• Riconoscere gli eventi relativi alla lettura di un badge da parte di un badge reader,
provenienti dal sistema di controllo degli accessi
• Riconoscere gli eventi di face detection di una camera, relativi all’accesso di una
persona in un’area riservata e provenienti dal sistema di videosorveglianza
• Conoscere la posizione di ogni telecamera e di ogni badge reader, così da sapere
quale camera sorveglia l’accesso protetto da quel determinato lettore
• Correlare le informazioni provenienti dalle due fonti, al fine di riconoscere un
tentativo di accesso all’area riservata da parte di un addetto, o di una persona
esterna, con un badge differente dal proprio.
2.4 Scenari applicativi: Network Security
Lo scenario è incentrato sulla protezione di una infrastruttura IT dagli attacchi alla
sicurezza. L’infrastruttura ipotizzata rappresenta la tipica dotazione informatica di
un’organizzazione di medie dimensioni, costituita da PC aziendali, infrastrutture cloud
private e/o multi-tennant, server dedicati ad uso interno (mail-server, repository, database
server, etc.). Essa è dotata di sistemi di monitoraggio e protezione, volti alla prevenzione
e/o rilevamento in tempo utile di attacchi informatici, cioè di: firewall, intrusion detection
systems (IDS), tool per la verifica dell’integrità di sistema e tool per la raccolta di log
applicativi.
Il problema tipico di questo tipo di infrastrutture è che la co-presenza di tutti i sistemi di
monitoraggio citati non viene sfruttata in maniera adeguata.
Ed infatti, ogni sistema produce le proprie segnalazioni (allarmi) indipendentemente
60
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
dall’altro, senza sfruttare le potenzialità di un uso sinergico delle informazioni raccolte.
Eppure un uso integrato delle segnalazioni potrebbe aiutare a ridurre i falsi positivi (falsi
allarmi) dovuti a comportamenti anomali ma ritenuti leciti, e nel contempo ridurre i falsi
negativi, laddove uno dei sistemi non rilevi il perdurare di un comportamento malizioso.
D’altra parte non è pensabile intervenire sui singoli sistemi al fine di renderli consapevoli
gli uni degli altri, poiché ciò richiederebbe di rivedere le regole con cui gli allarmi sono
segnalati.
L’obiettivo che si vuole raggiungere in uno scenario siffatto consiste nell’utilizzo delle
informazioni prodotte dai sotto-sistemi di monitoraggio dell’organizzazione, al fine di
rilevare in maniera automatica la presenza di attacchi in corso, per minimizzare
l’occorrenza di falsi positivi e falsi negativi.
Il soddisfacimento di questo obiettivo richiederà di risolvere diverse problematiche, quali:
• Realizzazione di uno strato per l’interoperabilità semantica e di formato delle
informazioni raccolte
• Definizione di regole per l’individuazione di falsi positivi e falsi negativi
• Necessità di realizzare strumenti di gestione automatici
Ad un elevato livello di astrazione, si può ipotizzare che l’architettura sia costituita dai
seguenti componenti:
• Intrusion Detection System (IDS): software o hardware, utilizzato per identificare
accessi non autorizzati ai computer o alla rete locale, e soprattutto per identificare
utilizzi anomali degli host
• Strumenti per la raccolta di log applicativi e di sistema: utilizzati al fine di tener
traccia delle attività svolte su ogni host dell’organizzazione, ed in particolare gli
accessi ad essi effettuati
• Sotto-sistemi di monitoraggio ausiliari: utilizzati per mantenere lo storico delle
connessioni, e apprendere le abitudini dei singoli utenti dell’organizzazione
• Componente di adattamento/correlazione allarmi: utilizzato per uniformare gli alert
61
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
e correlarli in maniera opportuna
Figura 2.3: Componenti previsti per lo scenario di Network Security
Il sistema così realizzato, dovrà soddisfare una serie di requisiti, e precisamente:
• Rilevamento di attività maliziose che coinvolgano gli host: Il sistema IT è dotato di
un IDS, il quale, istruito con opportune regole, è in grado di rilevare attività
maliziose svolte attraverso gli host che compongono l’infrastruttura IT.
Ovviamente il tutto attraverso l’analisi del traffico di rete. Precisamente il sistema
IDS è istruito con regole che gli consentiranno di rilevare:
o Download e Upload di file sospetti, cioè con estensioni sensibili
o Tentativi multipli di stabilire una connessione TCP verso un IP esterno
• Rilevamento delle connessioni agli host: Il sistema IT è dotato di un sottosistema
per la raccolta dei log applicativi e di sistema dei singoli host, attraverso il quale si
mantiene traccia di tutte le connessioni, e le informazioni ad esse correlate, che
avvengono dai singoli host da parte dei vari utenti dell’organizzazione. Da notare
che si presuppone che gli accessi avvengano da remoto attraverso il protocollo
SSH, con l’ausilio di differenti metodi di autenticazione.
Definito in maniera generale il secondo scenario applicativo, vediamo ora i due casi d’uso
presi in considerazione, soffermandoci, anche in questo caso, sia sui requisiti richiesti al
nostro sistema, sia sugli effettivi vantaggi che l’utilizzo di quest’ultimo porta in essi.
62
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
2.4.1 Casi d’uso: Rilevamento di una intrusione con credenziali rubate
Il primo caso d’uso per questo scenario applicativo è relativo alla possibilità che le
credenziali di un utente siano state rubate, e un attacker malintenzionato acceda alla rete
dell’organizzazione attraverso queste ultime.
Supponiamo che l’attacker, dopo aver effettuato l’accesso al sistema con le credenziali
rubate, effettui il download di un file sospetto da internet, ad es. il file patch.c, attraverso
un server dell’organizzazione.
A questo punto valutiamo che cosa accade nel caso in cui sia presente o meno il nostro
sistema CEP:
• Nel caso di assenza di CEP, il download è rilevato dal sistema IDS e segnalato nel
log di sistema, e sarà mostrato un allarme su un apposito terminale controllato
dagli amministratori. Questi ultimi sono allertati dalla segnalazione del download
sospetto e avviano un procedimento di ispezione al fine di determinare se il
download sospetto corrisponde ad un falso positivo, e , in caso affermativo, quale
sia l’entry-point dell’attacco per individuare le azioni di recovery da intraprendere
(riavvio di applicazioni/macchine, disattivazione di uno o più account, etc.).
Questa ispezione è condotta analizzando diversi log di sistema ed è un processo
quasi interamente manuale, e quindi soggetta ad errori, e fortemente timeconsuming. Il tempo necessario affinché gli amministratori possano determinare la
sorgente e la destinazione dell’attacco genera un ritardo nelle operazioni di
ripristino.
Figura 2.4: Data processing for alarm generation
63
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
• Nel caso di presenza di CEP, esso è stato configurato in maniera tale da
storicizzare le abitudini di ogni utente, ad es. gli IP che abitualmente utilizza per
connettersi al sistema, ed è in grado di allertarsi nel momento in cui l’utente non
rispetti queste abitudini (ad es. utilizzo di un IP diverso dai soliti utilizzati). Inoltre,
esso è in grado di ricevere gli alert generati dal sistema IDS.
Attraverso la correlazione dell’alert generato dal sistema IDS relativo al download
di un file sospetto, e dell’evento che un determinato utente non si è mai connesso
dall’IP che ha utilizzato, il CEP è in grado di allertare prontamente che tale utente
è compromesso, e che è in corso un’intrusione utilizzando le sue credenziali.
Come si può quindi notare, l’adozione del CEP introduce un enorme vantaggio,
sollevando gli amministratori del sistema di effettuare una correlazione manuale degli
eventi generati dalle due fonti, garantendo quindi una maggiore velocità di reazione e un
minor rischio di errore
.Vediamo ora quali sono i requisiti del nostro sistema CEP per questo caso d’uso.
Precisamente abbiamo che la piattaforma deve essere in grado di:
• Ricevere gli alert del sistema IDS
• Riconoscere gli alert relativi al download sospetto di un file, provenienti dall’IDS
• Ricevere
gli
eventi
provenienti
dai
log
di
sistema
delle
macchine
dell’organizzazione
• Riconoscere gli eventi di accesso al sistema, provenienti dai log di sistema,
scartando tutti gli altri eventi
• Apprendere le abitudini degli utenti, e precisamente quelle relative all’IP di
connessione, al metodo di autenticazione e all’host, e deve essere in grado di
segnalare se si tratta della prima connessione di un determinato utente
• Correlare le informazioni provenienti dalle due fonti, al fine di riconoscere un
tentativo di intrusione effettuato attraverso l’utilizzo di credenziali rubate,
generando, in tal caso, un alert
64
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
2.4.2 Casi d’uso: Rilevamento di un attacco TCP Gender Changer
Il secondo caso d’uso per questo scenario applicativo è relativo alla possibilità che
l’organizzazione subisca un attacco del tipo TCP Gender Changer. Esso prevede due nodi,
uno residente all’interno della rete dell’organizzazione (Compromised Server), attraverso
il quale il malintenzionato può accedere al server desiderato (Target Server), e l’altro
residente all’esterno della rete (Attacker). Di seguito sono riportati i passi dell’attacco:
• L’Attacker stabilisce l'accesso alla shell del Compromised Server in qualche modo,
ad esempio attraverso il protocollo ssh, ed effettua l’upload e l’avvio di un
software client sullo stesso, il quale si preoccuperà di realizzare una connessione
TCP con l’Attacker.
• Il software client tenta la connessione TCP verso l’Attacker. Al rilevamento della
connessione, l’Attacker invia una richiesta sul canale di comunicazione in modo
che il Compromised Server possa richiedere una nuova connessione dati.
• Il Compromised Server riceve il messaggio dall’Attacker e stabilisce una nuova
connessione con quest’ultimo. Inoltre, si connette al Target Server così da essere in
grado di inoltrare i dati da quest’ultimo all’Attacker e viceversa.
Figura 2.5: TCP Gender Changer
In questo scenario, l’IDS è in grado di rilevare l’upload di un file sospetto sul
Compromised Server, i continui tentativi di connessione di quest’ultimo verso l’esterno
65
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
della rete, nonché eventuali tentativi di Port Scanning verso lo stesso e notificare un alert
agli amministratori di rete.
A questo punto valutiamo che cosa accade nel caso in cui sia presente o meno il nostro
sistema CEP:
• Nel caso di assenza di CEP, gli amministratori avviano un procedimento di
ispezione al fine di determinare, se i tentativi di connessione ripetuti verso un IP
esterno alla rete corrispondono ad un falso positivo, ed, eventualmente stabilire
l’entry-point dell’attacco per individuare le azioni di recovery da intraprendere.
L’ispezione è condotta analizzando diversi log di sistema e i vari alert generati
dall’IDS, ed è un processo quasi interamente manuale, e quindi soggetto ad errori e
fortemente time-consuming. Il tempo necessario affinché gli amministratori
possano determinare la sorgente e la destinazione dell’attacco genera un ritardo
nelle operazioni di ripristino.
• Nel caso di presenza di CEP, esso è stato configurato in maniera tale da
storicizzare le abitudini di ogni utente, ad es. gli IP che abitualmente utilizza per
connettersi al sistema, ed è in grado di allertarsi nel momento in cui l’utente non
rispetti queste abitudini (ad es. utilizzo di un IP diverso dai soliti utilizzati). Inoltre,
esso è in grado di ricevere gli alert generati dal sistema IDS.
Attraverso la correlazione degli alert generati dal sistema IDS, nella fattispecie
quello relativo all’upload di un file sospetto sul Compromised Server e quello
relativo ai tentativi di connessione ripetuti da parte di quest’ultimo verso l’esterno
della rete, con l’alert che un determinato utente X si è connesso a quel server non
rispettando le sue abitudini (ad es. non si è mai connesso da quell’indirizzo IP), il
CEP è in grado di allertare prontamente che è in corso un probabile attacco del tipo
TCP Gender Changer sfruttando l’account dell’utente X. Inoltre il CEP è in grado
di riconoscere eventuali attacchi di questo tipo sferrati senza l’ausilio di credenziali
rubate. A tale scopo effettua la correlazione tra l’alert relativo ad un Port Scanning
sul Compromised Server e quello relativo ai ripetuti tentativi di connessione,
66
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
da parte di quest’ultimo, verso l’esterno della rete.
Vediamo ora quali sono i requisiti del nostro sistema CEP per questo caso d’uso.
Precisamente abbiamo che la piattaforma deve essere in grado di:
• Ricevere gli alert del sistema IDS
• Riconoscere gli alert relativi all’upload sospetto di un file, ai tentativi multipli di
stabilire la connessione TCP verso un indirizzo IP esterno, a un tentativo di port
scanning, provenienti dall’IDS
• Ricevere
gli
eventi
provenienti
dei
log
di
sistema
delle
macchine
dell’organizzazione
• Riconoscere gli eventi di accesso al sistema, provenienti dai log di sistema,
scartando tutti gli altri eventi
• Apprendere le abitudini degli utenti, e precisamente quelle relative all’IP di
connessione, al metodo di autenticazione e all’host, e deve essere in grado di
segnalare se si tratta della prima connessione di un determinato utente
Correlare le informazioni provenienti dalle due fonti, al fine di riconoscere un tentativo di
intrusione effettuato attraverso l’utilizzo di credenziali rubate, generando, in tal caso, un
alert.
67
Capitolo 3
Il CEP Engine Esper
3.1 Introduzione
Come vedremo nel prossimo capitolo, uno dei componenti fondamentali del sistema
progettato è il CEP Engine. Per la sua realizzazione, ci si è basati sull’ausilio di un motore
di correlazione molto diffuso, denominato Esper. Le motivazioni di tale scelta saranno
anche’esse approfondite nel prossimo capitolo. Ma vediamo meglio di cosa si tratta.
Esper è un componente per il Complex Event Processing (CEP), dotato anche di capacità
di Event Stream Processing, disponibile sia per Java che per .NET (Nesper), il quale
consente un rapido sviluppo di applicazioni che elaborano grandi volumi di messaggi o
eventi in real-time, o near real-time. Il motore di Esper funziona come un database
capovolto. Invece di memorizzare i dati ed eseguire query su questi ultimi, esso consente
alle applicazioni di memorizzare query ed eseguirle sui dati. Il modello di esecuzione è
continuo, infatti la risposta dell’engine è in tempo reale quando le condizioni definite
all’interno della query si verificano.
Esper fornisce due metodi principali per processare gli eventi, e sono:
• Event pattern
• Event stream query
Il primo si basa su un linguaggio che permette di specificare dei pattern expression-based
68
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
per il matching degli eventi. Questo metodo di elaborazione degli eventi, alla cui base vi è
l’implementazione di una macchina a stati, si aspetta sequenze di eventi o una loro
combinazione, e consente la loro correlazione basata sul tempo.
Il secondo metodo invece, offre la possibilità di definire query che consentono operazioni
di filtering, aggregation, correlation (attraverso gli operatori di join), nonché mettono a
disposizione funzioni di analisi per i flussi di eventi. Queste query seguono la sintassi del
linguaggio EPL (Event Processing Language) che è un linguaggio dichiarativo abbastanza
simile all’SQL, e mediante il quale è possibile definire gli statement CEP per la corretta
elaborazione degli stream.
L’EPL differisce dall’SQL sostanzialmente in quanto utilizza il concetto di vista piuttosto
che quello di tabella. Tali viste rappresentano le varie operazioni necessarie per strutturare
e ricavare i dati in un flusso di eventi.
Da notare che una volta espresse (in EPL), le interrogazioni dovranno essere registrate
nell'engine (a runtime), in modo che Esper possa verificare i risultati delle interrogazioni
sugli eventi in ingresso ed, eventualmente, inviarli in tempo reale ad uno o più moduli
sottoscriventi (listener). Tale modo di operare consente, qualora fosse necessaria, una
modifica abbastanza semplice e veloce delle interrogazioni già registrare e offre la
possibilità di eseguire il riuso degli eventi.
Figura 3.1: ESP e CEP in Esper [16]
69
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Un’altra grande potenzialità di Esper è la possibilità di accedere agevolmente ai maggiori
database esistenti grazie ad uno dei componenti dell’architettura, e precisamente
l’historical data access layer. Di seguito è mostrata una vista globale dell’architettura di
Esper [16].
Figura 3.2: Vista globale dell’architettura di Esper
Dopo aver fatto una breve panoramica, approfondiamo ora alcuni aspetti di questo CEP
engine, e precisamente vediamo più in dettaglio le modalità di rappresentazione degli
eventi, il modello di elaborazione, il linguaggio EPL, nonché le API, le modalità di
configurazione e le possibilità di integrazione ed estensione del suo motore.
3.2 Rappresentazione degli eventi
In Esper un evento può essere rappresentato attraverso differenti classi java, e
precisamente come [16]:
• Un qualsiasi java POJO (plain-old java object) che segue le convenzioni JavaBean
o una qualsiasi Legacy java class che non rispetta le convenzioni JavaBean,
entrambe derivate dalla classe java.lang.Object
• Una mappa del tipo java.util.Map, dove ogni entry rappresenta una proprietà
70
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
• Un array di oggetti (Object[ ]) dove ogni elemento è una proprietà dell’evento
• Un XML Document Object Model (DOM)
• Una qualsiasi Classe Applicativa, utilizzabile attraverso la plugin rapresentation
event messa a disposizione dalle API di Esper
Il comportamento delle API per tutte le rappresentazioni di eventi è la stessa, tranne in
alcuni rari casi. Tutte le rappresentazioni hanno in comune il supporto a determinate
tipologie di proprietà, e precisamente queste possono essere:
• Semplici: proprietà che hanno un valore unico, il cui tipo può essere un tipo
primitivo del linguaggio Java (come int), un semplice oggetto (ad esempio un
java.lang.String), o un oggetto più complesso la cui classe è definita mediante il
linguaggio Java.
• Indicizzate: proprietà che memorizzano un insieme ordinato di oggetti (tutti dello
stesso tipo) a cui è possibile accedere singolarmente attraverso un indice.
• Mappate: proprietà che accettano una chiave String-valued.
• Nidificate: proprietà che vivono all’interno di un altro oggetto Java che di per se è
una proprietà di un evento. Da notare che non c’è limite alla nidificazione.
Ovviamente sono possibili delle combinazioni.
3.2.1 Plain-Old Java Object Event
I Plain-Old Java Object Event sono istanze di oggetti che espongono le proprietà di un
evento attraverso degli appositi metodi get, come definito nelle specifiche JavaBeans. In
realtà, le classi o le interfacce che rappresentano gli eventi non devono essere pienamente
compatibili con queste ultime. Cosa fondamentale però è la presenza dei metodi get che
danno la possibilità al motore di Esper di ottenere le proprietà degli eventi.
71
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Di seguito è mostrato un esempio di evento di tipo POJO.
public class NewEmployeeEvent {
private String firstName;
private String address;
private Employee[] Subordinates;
public
public
public
public
String getFirstName(){…};
Address getAddress(String type){…};
Employee getSubordinate(int index){…};
Employee[] getAllSubordinates(){…};
}
Come si può notare la classe è dotata di due proprietà semplici, firstName e address, che
rappresentano rispettivamente il nome e l’indirizzo del dipendente, e una proprietà
indicizzata, Subordinates, che rappresenta i dipendenti subordinati del dipendente
considerato. Inoltre sono presenti i metodi get che permettono di recuperare le varie
proprietà.
3.2.2 Map Event
Come già detto precedentemente, gli eventi possono essere rappresentati anche da oggetti
che implementano l'interfaccia java.util.Map. In questo caso le proprietà degli eventi sono
i valori presenti nella mappa, i quali sono accessibili attraverso il metodo get esposto dalla
stessa interfaccia.
L'applicazione può aggiungere proprietà ad un evento
di
questo
tipo utilizzando
l'operazione di configurazione updateMapEventType. Le proprietà non possono essere
aggiornate o cancellate, ma solo aggiunte. Di seguito è mostrato un esempio di Event Map.
Map<String, Object> event = new HashMap<String, Object>();
event.put("carId", carId);
event.put("direction", direction);
72
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
3.2.3 Object-array Event
Un evento può anche essere rappresentato da un array di oggetti. In questo caso le
proprietà degli eventi sono i valori degli elementi dell'array. Un dato evento di questo tipo
può avere solo un supertipo che deve essere anche esso un Object-array. Ovviamente,
come nel caso dei Map Event, tutte le proprietà disponibili sul supertitpo Object-array
saranno disponibili anche sul tipo stesso.
L'applicazione può aggiungere proprietà ad un evento di questo tipo a runtime utilizzando
l'operazione di configurazione updateObjectArrayEventType. Le proprietà non possono
essere aggiornate o cancellate, ma solo aggiunte.
Di seguito un esempio di Object-array Event.
String[] propertyNames = {"carId", "direction"};
Object[] propertyTypes = {String.class, int.class};
3.2.4 XML Event
Gli eventi possono essere rappresentati anche come org.w3c.dom.Node. Ovviamente, se un
XML schema (file XSD) è reso disponibile come parte della configurazione dell’engine
(tale argomento sarà discusso più avanti), allora Esper può leggere lo schema e validare gli
statement che utilizzando quel tipo di evento e le sue proprietà.
Quando nessun XML schema viene fornito, gli eventi XML possono ancora essere
interrogati, ma tutte le espressioni realizzate nei loro confronti si presumono valide, in
quanto non vi è alcuna convalida dell'espressione.
In entrambi i casi Esper permette di configurare esplicite espressioni XPath come
proprietà di un evento.
Di seguito è mostrato un esempio di XML Event.
73
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
<?xml version="1.0" encoding="UTF-8"?>
<Sensor xmlns="SensorSchema">
<ID>urn:epc:1:4.16.36</ID>
<Observation Command="READ_PALLET_TAGS_ONLY">
<ID>00000001</ID>
<Tag>
<ID>urn:epc:1:2.24.400</ID>
</Tag>
<Tag>
<ID>urn:epc:1:2.24.401</ID>
</Tag>
</Observation>
</Sensor>
Mentre questo è l’XML schema associato:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Sensor">
<xs:complexType>
<xs:sequence>
<xs:element name="ID" type="xs:string"/>
<xs:element ref="Observation" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Observation">
<xs:complexType>
<xs:sequence>
<xs:element name="ID" type="xs:string"/>
<xs:element ref="Tag" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="Command" type="xs:string"
use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="Tag">
<xs:complexType>
<xs:sequence>
<xs:element name="ID" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
74
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
3.2.5 Confronto tra i tipi
Ciascuna delle rappresentazioni degli eventi ha vantaggi e svantaggi che sono riassunte
nella tabella seguente [16]:
Tabella 3.1: Confronto tra i tipi
Java Object
(POJO/Bean or
Map
Object-array
XML Document
other)
Not comparable
Performance
Good
Good
Very Good
and depending
on use of XPath
Depends on DOM
and XPath
Memory Use
Small
Medium
Small
implementation
used, can be
large
Call Method on
Yes, if contains
Yes, if contains
Object(s)
Object(s)
Yes
Yes
Yes
Yes
Yes
Yes
Multiple
Single
No
Yes
Event
No
Nested, Indexed and
Yes
Mapped Properties
Runtime Type
Reload class,
Change
Yes
Supertypes
Multiple
3.3 Modello di elaborazione
Come già detto all’inizio, il modello di elaborazione in Esper è continuo: l’Update
Listener è l’entità che riceve dal motore gli eventi, e tutte le altre informazioni derivanti
dalla elaborazione dei flussi, non appena il motore processa gli eventi per quel determinato
statement, sul quale il Listener è registrato.
75
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
La classe UpdateListener possiede un unico metodo astratto update(), come mostrato in
figura 3.3, che necessita di essere implementato.
Figura 3.3: UpdateListener
Il motore fornisce i risultati degli statement agli update listener inserendoli in oggetti
com.espertech.esper.client.EventBean. Un'implementazione tipica di un update listener
interroga le istanze EventBean tramite metodi get per ottenere i risultati generati.
Un secondo metodo per la consegna dei risultati, fortemente tipizzato, nativo e altamente
performante è l’utilizzo di un Subscriber Object, il quale rappresenta un legame diretto dei
risultati della query a un oggetto Java. L'oggetto, un POJO, riceve i risultati dello
statement tramite l’invocazione di metodi. Per poter implementare un subscriber object
non è necessario implementare ne un’interfaccia e ne estendere una classe.
Detto ciò, al fine di comprendere al meglio il modello di elaborazione di Esper,
analizziamo i concetti di Insert stream e Remove stream, nonché la capacità dell’engine di
gestire le cosiddette sliding windows, le quali sono fondamentali per l’elaborazione, nel
tempo, dei flussi di eventi. Nel fare ciò verrà mostrato anche qualche semplice esempio di
EPL.
3.3.1 Insert Stream
L’Insert Stream indica i nuovi eventi in arrivo, cioè quelli che o rientrano in una
opportuna finestra (data window), temporale, di lunghezza o batch che sia, definita da una
76
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
opportuna regola EPL, o che vengono aggregati con altri eventi, sempre attraverso
un’opportuna regola. Supponiamo di avere il seguente statement EPL:
select * from Withdrawal
il quale seleziona tutti gli eventi di tipo Withdrawal.
Ogni volta che l’engine processa un evento di questo tipo, esso invoca tutti gli update
listener associati allo statement, consegnando a ciascuno di essi il nuovo evento, il quale
entra a far parte dell’Insert Stream.
Il diagramma seguente mostra una serie di eventi di Withdraw in arrivo nel corso del
tempo.
Figura 3.4: Insert Stream
77
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
3.3.2 Remove Stream e Length Window
A differenza dell’Insert Stream, il Remove Stream indica gli eventi che lasciano una data
window. Per comprendere tale concetto, introduciamo una prima operazione messa a
disposizione dall’engine di Esper per gestire le sliding windows, e cioè quella di
considerare finestre di lunghezza prefissata, o length windows.
Supponiamo di avere il seguente statement EPL:
select * from Withdrawal.win:length(5)
il quale fa si che il motore faccia entrare tutti gli eventi di tipo Withdrawal in arrivo (Insert
Stream) nella data window. Quando la finestra è piena, cioè sono arrivati più di cinque
eventi, l'evento più vecchio viene spinto fuori. A questo punto il motore indica ai listener
tutti gli eventi che entrano dalla finestra come nuovi eventi e tutti gli eventi che lasciano la
finestra come vecchi eventi. Questi ultimi rappresentano il Remove Stream.
Il seguente diagramma chiarisce quanto appena spiegato.
Figura 3.5: Length Windows
78
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Come si può notare, all’arrivo dei primi 5 eventi, essi vengono inseriti nel vettore
NewEvents e, all’occorrenza di un ulteriore evento, il primo evento inserito, W1, viene
rimosso dalla finestra e inserito nel vettore OldEvents.
3.3.3 Time Window
Un’altra operazione molto importante sulle finestre è di tipo temporale, ossia time window.
In questo caso il parametro fisso non è la cardinalità della finestra, bensì il tempo. Quindi,
una finestra di lunghezza T secondi, conserva gli eventi ricevuti negli ultimi T secondi,
traslando continuamente nel tempo (finestra scorrevole nel tempo, sliding window) [16].
Figura 3.6: Time Windows
La figura 3.6 mostra un esempio di time-windows con T=4sec, in cui si nota come la
finestra contenga sempre gli eventi ricevuti negli ultimi 4 sec. Infatti, all’istante di tempo
79
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
t=5sec, in cui arriva in ingresso al motore un altro evento, la finestra è traslata “avanti nel
tempo” di 1 secondo (unità minima di tempo considerabile per il motore, avendo
specificato i secondi come unità di misura del tempo per la finestra).
All’istante t=6.5, la finestra contiene anche l’evento W3. Infine, all’istante t=8 sec, la
finestra temporale iniziale non conterrà più l’evento W1, occorso all’istante di tempo t=4.
Lo statement EPL che genera il comportamento appena descritto è il seguente:
select * from Withdrawal.win:time(4 sec)
3.3.4 Batch Window
Oltre alla possibilità di considerare finestre in base alla lunghezza e in base al tempo,
Esper consente anche di definire un batch, ossia un insieme finito, in cui si fissa il tempo o
la cardinalità del gruppo di eventi che possono eventualmente confluire in esso.
Si definisce dunque l’operazione di time-batch come l’elaborazione degli eventi che
arrivano in un intervallo di tempo prefissato, terminato il quale gli eventi memorizzati nel
vettore NewEvents vengono forniti all’UpdateListener.
A differenza dei due casi analizzati in precedenza, non si hanno finestre “scorrevoli”, in
relazione alla cardinalità N o il tempo T, ma sono fisse.
La figura 3.7 mostra un esempio di time-batch window con T=4 sec. Nei primi 4 secondi,
gli eventi W1 e W2 vengono inseriti nel batch. All’istante t=5 sec, entrambi gli eventi
vengono estratti dal batch ed inseriti nel vettore NewEvents, e il motore considera un
nuovo batch dello stesso intervallo temporale.
A differenza dei casi precedentemente esaminati, con il time-batch si hanno finestre fisse
che non traslano nel tempo, ossia tutti i batch sono indipendenti tra loro, in quanto ogni
evento può far parte di un solo batch specifico, e non può appartenere a più finestre entro
l’intervallo di tempo definito. Lo statement EPL che genera questo comportamento è il
80
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
seguente:
select * from Withdrawal.win:time_batch(4 sec)
Figura 3.7: Time-batch Windows
Oltre al time-batch, è possibile avere un batch di eventi legato soltanto alla lunghezza del
batch stesso, ed è rappresentato dalla operazione di length-batch.
Ad esempio, un batch di lunghezza N=5 consente di ricevere 5 eventi senza alcun vincolo
sull’intervallo di tempo entro cui gli eventi devono arrivare al fine di essere analizzati.
Analogamente al caso precedente, una volta “riempito” il batch, tutti gli eventi verranno
estratti da essi e passati all’UpdateListener per poter essere manipolati.
Lo statement EPL che genera questo comportamento è il seguente:
select * from Withdrawal.win:lenggth_batch(5)
81
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Ovviamente, sono stati mostrati esempi molto semplici per gli statement EPL, i quali,
attraverso le varie clausole, permettono di effettuare operazioni molto più complesse. Per
tale motivo, nella sezione successiva approfondiamo proprio tale linguaggio.
3.4 Il linguaggio EPL
Il linguaggio EPL è un linguaggio SQL-like, dotato delle clausole SELECT, FROM,
WHERE, GROUP BY, HAVING e ORDER BY, nel quale gli stream sostituiscono le tabelle
come fonte di dati e gli eventi sostituiscono le righe come unità base dei dati. Poiché gli
eventi contengono dati, i concetti di correlazione attraverso join, filtraggio e aggregazione
previsti nell’SQL possono essere efficacemente sfruttati [16].
Gli statement EPL vengono utilizzati per ricavare informazioni aggregate da uno o più
flussi di eventi, e per unire o fondere questi ultimi, e possono contenere definizioni di una
o più viste, che, come già detto all’inizio, sono simili a tabelle in SQL, ma definiscono i
dati disponibili per l'interrogazione e il filtraggio. Alcune viste rappresentano le finestre su
un flusso di eventi, altre derivano statistiche dalle proprietà degli eventi. Le viste possono
essere inoltre concatenate al fine di costruire una catena di viste.
Vediamo ora più da vicino la sintassi, nonché le possibilità offerte dall’EPL in termini di
accesso ai database relazionali e definizione di script. Infine approfondiremo il linguaggio
per la definizione di pattern expression.
3.4.1 Sintassi
Le query EPL si basano sulla seguente sintassi:
[annotations]
[expression_declarations]
82
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
[context context_name]
insert [istream|rstream] into event_stream_name[(property_name
[,...])]
select [istream | irstream | rstream] [distinct] * |
expression_list ...
from stream_def [.view_spec][(filter_criteria)][as name][,...]
[where search_conditions]
[group by grouping_expression_list]
[having grouping_search_conditions]
[output output_specification]
[order by order_by_expression_list]
[limit num_rows]
Come si può notare, le sole clausole obbligatorie sono la SELECT e la FROM, mentre le
altre sono del tutto opzionali. Vediamo ora velocemente il significato delle principali.
SELECT
La clausola select è richiesta in tutti gli statement EPL, e può essere utilizzata per
selezionare tutte le proprietà tramite il carattere *, o per specificare un elenco di
proprietà o espressioni.
Essa offre anche le parole chiave opzionali istream, irstream e rstream che consentono di
definire gli eventi di quale stream notificare agli UpdateListener.
Precisamente, la parola chiave istream, che rappresenta anche l’impostazione predefinita,
indica che l’engine Esper invia ai listener solo gli eventi dell’Insert stream, mentre quella
rstream indica al motore di erogare solo gli eventi del Remove Stream, ed infine quella
irstream indica che al motore di erogare gli eventi di entrambi gli stream.
Un’altra importante parola chiave è quella distinct, la quale permette di selezionare solo le
righe uniche a seconda della lista di colonne specificato dopo di esso.
Dio seguito è mostrato un esempio:
select symbol, price, sum(volume) as sm
from StockTick.win:time(60 sec)
Questo statement prevede la selezione degli attributi symbol e price degli eventi StockTick,
e la somma del volume per gli eventi di questo tipo che ricadono in una finestra temporale
83
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
di 60 secondi.
È importante notare che all’interno della clausola select è anche possibile definire delle
espressioni, come mostrato nel seguente statement:
select volume * price
from StockTick.win:time_batch(30 sec)
nel quale è selezionato il prodotto tra il volume e il prezzo.
FROM
La clausola from è obbligatoria in tutti gli statement EPL, e permette di specificare uno o
più flussi di eventi, ai quali opzionalmente può essere associato un nome attraverso la
parola chiave as.
Ovviamente la specifica di più di un flusso ha come obbiettivo la realizzazione di uno o
più join, che sono perfettamente supportati dall’EPL.
Attraverso la clausola from è anche possibile realizzare operazioni di filtraggio, il tutto
semplicemente prevedendo delle espressioni tra parentesi tonde subito dopo la definizione
del flusso di eventi. Vediamo un esempio:
select *
from RfidEvent(zone=1 and category=10)
Attraverso tale statement, sono selezionati tutti gli attributi degli eventi del tipo RfidEvent,
i quali presentano l’attributo zone=1 e quello category=10.
Un’altra operazione di fondamentale importanza che può essere realizzata attraverso tale
clausola è l’utilizzo delle viste. Infatti basta semplicemente far seguire al nome dello
stream quello della vista, preceduto da un punto. Un esempio di EPL è già stato mostrato
precedentemente, ma lo riproponiamo per semplicità:
select * from Withdrawal.win:time(4 sec)
84
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Ricordiamo che tale statement permette di definire una finestra temporale di 4 secondi.
Esistono molte viste predefinite in Esper, alcune delle quali sono definite nella seguente
tabella [16].
Tabella 3.2: Viste predefinite di Esper
View
Sintassi
Length window
win:length(size)
Length batch
window
Time window
Time batch window
Time-Accumulating
window
Sliding length window extending the specified
number of elements into the past.
Tumbling window that batches events and releases
win:length_batch(size)
them when a given minimum number of events has
been collected.
win:time(time period)
Sliding time window extending the specified time
interval into the past.
win:time_batch(time period
Tumbling window that batches events and releases
[,optional reference point]
them every specified time interval, with flow
[,flow control])
control options.
win:time_accum(time period)
Keep-all window
win:keepall()
Sorted window
ext:sort(size, sort criteria)
Time-order window
Descrizione
Sliding time window accumulates events until no
more events arrive within a given time interval.
The keep-all data window view simply retains all
events.
Sorts by values returned by sort criteria expressions
and keeps only the top events up to the given size.
ext:time_order(timestamp
Orders events that arrive out-of-order, using an
expression, time period)
expression providing timestamps to be ordered.
Retains only the most recent among events having
Unique window
std:unique(unique criteria(s))
the same value for the criteria expression(s). Acts as
a length window of size 1 for each distinct
expression value.
Grouped Data
std:groupwin(grouping
window
criteria(s))
Last Event window
std:lastevent()
First Event window
std:firstevent()
Groups events into sub-views by the value of the
specified expression(s), generally used to provide a
separate data window per group.
Retains the last event, acts as a length window of
size 1.
Retains the very first arriving event, disregarding all
subsequent events.
85
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
First Length
window
First Time window
win:firstlength(size)
win:firsttime(time period)
Retains the first size events, disregarding all
subsequent events.
Retains the events arriving until the time interval
has passed, disregarding all subsequent events.
Derives a count of the number of events in a data
Size
std:size([expression, ...])
window, or in an insert stream if used without a data
window, and optionally provides additional event
properties as listed in parameters.
Unvariate statistics
Regression
stat:uni(value expression
Calculates univariate statistics on the values
[,expression, ...])
returned by the expression.
stat:linest(value value
Calculates regression on the values returned by two
[,expression, ...])
expressions.
stat:correl(value expression,
Correlation
value expression [,expression,
...])
Weighted average
Calculates the correlation value on the values
returned by two expressions.
stat:weighted_avg(value
Calculates weighted average given a weight
expression, value expression
expression and an expression to compute the
[,expression, ...])
average for.
WHERE
La clausola where è una clausola facoltativa negli statement EPL, e consente di definire
quali flussi di eventi filtrare e su quali flussi effettuare un join.
Gli operatori di confronto utilizzabili sono =, <, >, >=, <=, !=, <>, is null, is not null,
ma sono anche possibili delle loro combinazioni logiche attraverso gli operatori AND e
OR. Mostriamo di seguito due esempi di utilizzo di tale clausola:
select 'IBM stats' as title, avg(price) as avgPric, sum(price) as
sumPric
from StockTickEvent.win:length(10)
where symbol='IBM'
Questo effettua un filtraggio dei risultati, prevedendo come esito della query EPL i soli
eventi la cui proprietà symbol è pari a IBM
86
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
select *
from TickEvent.std:unique(symbol) as t,
NewsEvent.std:unique(symbol)as n
where t.symbol = n.symbol
Questo invece effettua un join tra i due stream TickEvent e NewsEvent, attraverso la
proprietà symbol.
GROUP BY
La clausola group by è facoltativa in uno statement EPL, e permette di suddividere l'uscita
di quest’ultimo in gruppi. È possibile raggruppare a partire da uno o più nomi di proprietà
di eventi, o dal risultato di espressioni calcolate.
Ad esempio, la dichiarazione seguente restituisce il prezzo totale per simbolo per gli
eventi del tipo StockTickEvent negli ultimi 30 secondi:
select symbol, sum (price)
from StockTickEvent.win: time (30 sec)
group by symbol
Esper pone le seguenti restrizioni alle espressioni sulla clausola group by:
• Le espressioni in group by non possono contenere funzioni di aggregazione
• Le proprietà degli eventi che vengono utilizzati all'interno di funzioni di
aggregazione, nella clausola select, non possono essere utilizzate anche nelle
espressioni della group by
• Quando si raggruppa un flusso non limitato, è necessario assicurarsi che
l’espressione definita in group by non restituisca un numero illimitato di valori.
HAVING
La clausola having permette di rifiutare o lasciar passare eventi definiti in group by in
maniera molto semplice, e precisamente nello stesso modo in cui nella clausola where si
definiscono le condizioni per la select, con l’eccezione che in having è possibile utilizzare
87
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
funzioni di aggregazione.
Il seguente statement è un esempio di clausola having con una funzione di aggregazione.
Esso mostra il prezzo totale per simbolo degli eventi StockTickEvent degli ultimi 30
secondi, ma solo per quelli il cui prezzo totale supera 1000. Quindi tutti quelli il cui prezzo
totale è pari o inferiore a 1000 saranno eliminati.
select symbol, sum(price)
from StockTickEvent.win:time(30 sec)
group by symbol
having sum(price) > 1000
ORDER BY
La clausola order by è facoltativa, e viene utilizzata per ordinare gli eventi in uscita
rispetto ad alcune loro proprietà. Ad esempio, lo statement seguente restituisce gli eventi
StockTickEvent degli ultimi 60 secondi, ordinati in base al prezzo e al volume:
select symbol
from StockTickEvent.win:time(60 sec)
order by price, volume
Esper pone una restrizione per tale clausola, e cioè che tutte le funzioni di aggregazione
che compaiono in essa, devono apparire anche nell'espressione della select.
INSERT INTO
Anche la clausola insert into è facoltativa in Esper. Essa può essere utilizzata per rendere
disponibili i risultati di uno statement EPL come un flusso di eventi, così da poter essere
utilizzato in ulteriori statement. Tale clausola può anche essere usato per unire flussi di
eventi multipli per formare un unico flusso di eventi.
Esper pone le seguenti restrizioni alla clausola insert into:
• Il numero di elementi nella clausola select deve corrispondere al numero di elementi
nella clausola insert into, se essa specifica un elenco di nomi di proprietà degli
88
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
eventi
• Se il nome del flusso di eventi è stato già definito da uno statement precedente, e i
nomi delle proprietà degli eventi e/o i tipi non corrispondono, viene generata
un'eccezione in fase di creazione dello statement.
Il seguente esempio inserisce in un flusso di eventi, denominato CombinedEvent, il
risultato dello statement:
insert into CombinedEvent
select A.customerId as custId, A.timestamp - B.timestamp as
latency
from EventA.win:time(30 min) A, EventB.win:time(30 min) B
where A.txnId = B.txnId
Ogni evento in CombinedEvent ha due proprietà: "custid" e "latenza". Gli eventi generati
da tale statement possono essere utilizzati in ulteriori statement, come ad esempio quello
seguente:
select custId, sum(latency)
from CombinedEvent.win:time(30 min)
group by custId
3.4.2 Accesso ad un database e supporto ai linguaggi di script
Altre potenzialità messe a disposizione dal linguaggio EPL, sono la possibilità di accedere
ai dati relazionali presenti all’interno di un database attraverso l’utilizzo del linguaggio
SQL. A questa si aggiunge quella di poter definire al suo interno degli script, così da poter
eseguire determinate operazioni direttamente come parte dell’EPL stesso.
Per quanto riguarda l’accesso ad un database, tale operazione può essere realizzata
seguendo la seguente sintassi:
89
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
sql:database_name [" parameterized_sql_query "]
Un esempio di utilizzo è il seguente:
select custId, cust_name from CustomerCallEvent,
sql:MyCustomerDB [' select cust_name from Customer where cust_id =
${custId} ']
il quale presuppone che l’evento CustomerCallEvent presenti una proprietà denominata
custId. La query SQL non fa altro che selezionare il nome del customer dalla tabella
Customer, dove il cust_id presente nella tabella coincida con il custId dell’evento appena
sopraggiunto.
Relativamente invece alla possibilità di inserire script nel codice EPL, è importante
specificare che i linguaggi di scripting accettati sono quelli che supportano JSR 223 e il
MVEL. La sintassi per utilizzare questi linguaggi all’interno dell’EPL è la seguente:
expression [return_type] [dialect_identifier:] script_name [
(parameters) ]
[ script_body ]
Dove expression è la parola chiave per dichiarare uno script, return_type è opzionale e
rappresenta l’eventuale tipo di dato ritornato dallo script, dialect_identifier, anch’esso
opzionale, definisce il linguaggio utilizzato per lo script (es. mvel per MVEL, js per
JavaScript e python per Python). Di seguito è riportato un esempio di script che calcola il
totale di Fibonacci, e il suo utilizzo in uno statement EPL:
expression double js:fib(num) [
fib(num);
function fib(n) {
if(n <= 1)
return n;
return fib(n-1) + fib(n-2);
} ]
select fib(intPrimitive) from SupportBean;
90
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
3.4.3 Event Pattern
Come già accennato all’inizio di questa trattazione, gli Event Pattern sono dei pattern
expression-based per il matching degli eventi. Essi sono costituiti da due elementi
fondamentali:
• Pattern atoms: sono gli elementi costitutivi dei pattern, e sono espressioni di
filtraggio, osservatori per eventi temporali e plug-in per osservatori personalizzati
che osservano gli eventi esterni, cioè quelli che non sono sotto il controllo del
motore.
• Pattern operator: controllano il ciclo di vita delle espressioni e combinano i Pattern
atom in maniera logica o temporale.
La tabella seguente descrive i diversi pattern atom disponibili [16]:
Tabella 3.3: Pattern atom disponibili degli Event Pattern
Pattern Atom
Example
Filter expressions specify
StockTick(symbol='ABC', price > 100)
an event to look for
Time-based event
observers specify time
timer:interval(10 seconds)
intervals or time schedules.
Custom plug-in observers
can add pattern language
myapplication:myobserver("http://someResource")
syntax for observing
application-specific events.
Per quanto riguarda, invece, gli operatori, essi sono di 4 tipi:
• Operatori che controllano la ripetizione delle sottoespressioni:
o every: indica che la pattern sub-expression deve riavviarsi dopo essere stata
91
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
valutata.
o every-distinct: come every, ma elimina i duplicati
o [num]: si attiva quando una pattern sub-expression restituisce true un
numero num di volte
o until: permette di definire fino a quando effettuare la valutazione
• Operatori logici: AND, OR, NOT
• Operatori temporali: operano sull’ordine degli eventi: -> (followed-by)
• Guards:
sono
where-conditions che
controllano
il
ciclo di
vita delle
sottoespressioni. Esempi sono:
o timer:within: una sorta di cronometro che, se la pattern sub-expression non
ritorna true nello specifico intervallo temporale , viene fermato e ritorna
sempre false
o timer:withinmax: simile al precedente, ma possiede anche un contatore di
match
o while-expression: seguita da una espressione che il motore di valuta per ogni
match riportato dalla guard pattern sub-expression. Quando l'espressione
restituisce false, la pattern sub-expression termina.
Le pattern expression possono essere innestate con profondità arbitraria includendo
l'espressione nidificata in parentesi tonde.
Vediamo qualche esempio. Il seguente mostra una pattern expression che effettua il match
su ogni evento ServiceMeasurement il cui valore di latency è superiore a 20 secondi o il
cui valore di success è false.
every (spike=ServiceMeasurement(latency>20000) or
error=ServiceMeasurement(success=false))
Un esempio leggermente più complesso è il seguente, nel quale il pattern individua
quando 3 sensor event indicano una temperatura maggiore di 50 gradi ininterrottamente
92
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
per 90 secondi dal primo evento, considerando però gli eventi provenienti dallo stesso
sensore.
every sample=Sample(temp>50) ->
((Sample(sensor=sample.sensor, temp>50) and not
Sample(sensor=sample.sensor,temp<=50))->
(Sample(sensor=sample.sensor,temp>50) and not
Sample(sensor=sample.sensor, temp <= 50)))where timer:within(90
seconds))
Un aspetto molto importante da notare è che un pattern può apparire ovunque nella
clausola from di un'istruzione EPL, e possono essere utilizzati in combinazione con le
clausole where, group by, having e insert into.
Il seguente esempio mostra la selezione del prezzo totale per cliente sulla coppia di eventi
(ServiceOrder seguito da un evento ProductOrder per lo stesso id cliente entro 1 minuto),
che si verificano nelle ultime 2 ore, in cui la somma del prezzo è maggiore di 100:
select a.custId, sum(a.price + b.price)
from pattern [every a=ServiceOrder -> b=ProductOrder(custId
a.custId) where timer:within(1 min)].win:time(2 hour)
group by a.custId
having sum(a.price + b.price) > 100
=
3.5 Esper API
Le API di Esper sono caratterizzate da una serie di interfacce, ognuna delle quali ha uno
suo scopo ben definito. Le seguenti sono quelle considerate di primaria importanza [16]:
• Service Provider Interface
• Administrative Interface
• Runtime Interface
Vediamole più in dettaglio.
93
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
3.5.1 Service Provider Interface
L'interfaccia EPServiceProvider rappresenta un'istanza del motore di Esper. Ogni istanza è
completamente indipendente dalle
altre e dispone di una propria interfaccia di
amministrazione e runtime. Un’istanza del motore di Esper può essere ottenuta tramite
metodi statici sulla classe EPServiceProviderManager. Precisamente, il metodo
getDefaultProvider(String providerURI) e quello GetDefaultProvider() restituiscono
un'istanza del motore di Esper. In particolare, il primo può essere utilizzato per ottenere
più istanze del motore per valori diversi del provider URI. In questo caso
l’EPServiceProviderManager determina se il provider URI corrisponde a istanze già
definite e restituisce quella con lo stesso provider URI, in caso contrario, si crea una nuova
istanza del motore. Una volta istanziata, tale istanza può opzionalmente essere inizializzata
attraverso il metodo initialize(), il quale ferma l’istanza, rimuove tutti gli statement ad essa
associati e resetta la sua configurazione. Inoltre un’istanza può anche essere distrutta con il
metodo destroy().
Di seguito è riportato un semplice esempio di codice.
// Obtain an engine instance
EPServiceProvider epService =
EPServiceProviderManager.getDefaultProvider();
// Optionally
epService.initialize();
// Destroy the engine instance when no longer needed, frees up
resources
epService.destroy();
3.5.2 Administrative Interface
L’interfaccia EPAdministrator è utilizzata principalmente per creare e gestire statement
EPL e pattern, nonché per effettuare una configurazione a runtime dell’istanza del motore
di Esper (tale aspetto sarà mostrato più avanti in questa trattazione).
94
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Nello specifico, la creazione di uno statement EPL e di un pattern può essere realizzata
attraverso
l’utilizzo
rispettivamente
dei
metodi
createEPL(String
EPL)
e
createPattern(String Pattern), i quali ritornano entrambi un oggetto EPStatement, che
rappresenta lo statement creato, il quale viene automaticamente avviato e attivato.
Sugli EPStatement generati è poi possibile associare un listener, al quale saranno passati
tutti gli eventi di cui lo statement effettua il match, attraverso il metodo addlistener().
EPServiceProvider epService =
EPServiceProviderManager.getDefaultProvider();
EPAdministrator admin = epService.getEPAdministrator();
EPStatement 10secRecurTrigger = admin.createPattern("every
timer:at(*, *, *, *, *, */10)");
EPStatement countStmt = admin.createEPL("select count(*)
from MarketDataBean.win:time(60 sec)");
MyListener listener = new MyListener();
countStmt.addListener(listener);
3.5.3 Runtime Interface
L'interfaccia EPRuntime viene utilizzata principalmente per inviare eventi al motore
Esper, così da poter essere elaborati dallo stesso.
Il frammento di codice seguente mostra come inviare un oggetto evento Java al motore.
EPServiceProvider epService =
EPServiceProviderManager.getDefaultProvider();
EPRuntime runtime = epService.getEPRuntime();
// Send an example event containing stock market data
runtime.sendEvent(new MarketDataBean('IBM', 75.0));
Un altro metodo che può essere utilizzato per inviare eventi al motore è l’utilizzo
del’interfaccia EventSender, la quale consente di elaborare eventi di un determinato tipo.
Tale interfaccia mette a disposizione il metodo getEventSender(String EventTypeName)
attraverso il quale è possibile ottenere un EventSender per quel determinato tipo di evento.
95
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
EventSender sender =
epService.getEPRuntime().getEventSender("MyEvent");
sender.sendEvent(myEvent);
3.6 Configurazione
Esper ha un numero molto limitato di parametri di configurazione, i quali possono essere
utilizzati per semplificare gli event pattern e gli stetment EPL, nonché per ottimizzare il
comportamento del motore per specifiche esigenze. Il motore di Esper funziona out-ofthe-box senza configurazione, essa infatti è assolutamente facoltativa.
Nel caso in cui un’applicazione abbia la necessità di configurare opportunamente il motore
di Esper, vi sono due metodi possibili per realizzarla [16]:
• Configurazione a runtime
• Configurazione attraverso file XML
La classe di riferimento per tale operazione è quella Configuration, la quale rappresenta
tutti i parametri di configurazione per l’engine.
Nel primo metodo si prevede semplicemente di istanziare un oggetto Configuration il
quale sarà opportunamente popolato con i valori di configurazione. Successivamente tale
oggetto sarà passato all’EPServiceProviderManager per ottenere un’istanza del motore
Esper configurata ad hoc.
Configuration config = new Configuration();
config.addEventType("PriceLimit", PriceLimit.class.getName());
config.addEventType("StockTick", StockTick.class.getName());
config.addImport("org.mycompany.mypackage.MyUtility");
config.addImport("org.mycompany.util.*");
EPServiceProvider epService =
EPServiceProviderManager.getProvider("Ex",config);
Per quanto riguarda invece il secondo metodo, Esper è in grado di recuperare i parametri
96
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
necessari da un file xml. Ciò avviene attraverso il metodo configure() della classe
Configuration, il quale accetta un URL, o un oggetto File o String per identificare il file da
caricare. Per default tale file è esper.cfg.xml, che dovrà essere presente nella directory root
dell’applicazione.
Configuration configuration = new Configuration();
configuration.configure("myengine.esper.cfg.xml");
Un esempio di file XML di configurazione è presentato di seguito. Esso realizza la stessa
configurazione prevista nell’esempio del primo metodo.
<?xml version="1.0" encoding="UTF-8"?>
<esper-configuration
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.espertech.com/schema/esper"
xsi:schemaLocation="
http://www.espertech.com/schema/esper
http://www.espertech.com/schema/esper/esperconfiguration-2.0.xsd">
<event-type name="StockTick"
class="com.espertech.esper.example.stockticker
.event.StockTick"/>
<event-type name="PriceLimit"
class="com.espertech.esper.example.stockticker
.event.PriceLimit"/>
<auto-import importname="org.mycompany.mypackage.MyUtility"/>
<auto-import importname="org.mycompany.util.*"/>
</esper-configuration>
3.7 Integrazione ed Estensione
Esper mette a disposizione la possibilità di integrare dati esterni e/o estendere le
funzionalità dell’engine. I principali meccanismi presenti sono:
• Virtual Data Window
• Single-Row Function
97
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
• Derived-value and Data Window View
• Aggregation Function
• Pattern Guard
• Pattern Observer
• Event Type and Event Object
• Plugin
Di questi sarà ora fornita una breve descrizione, tranne che per le Derived-value and Data
Window View, che saranno approfondite in seguito.
Virtual Data Window
Le Virtual Data Window possono essere utilizzate quando si dispone di un (grande)
archivio esterno di dati a cui si desidera accedere. L'accesso avviene in maniera
trasparente: non vi è alcuna necessità di usare una sintassi speciale o join, tutte le query
sono supportate senza problemi. Non vi è la necessità di mantenere tutti i dati o eventi in
memoria con tali finestre, l'unico requisito è che tutte le righe di dati restituiti sono istanze
della classe EventBean.
Per poter realizzare una Virtual Data Window è necessario realizzare i seguenti passi:
• Implementare_l’interfaccia
com.espertech.esper.client.hook.VirtualDataWindowFactory
• Implementare l’interfaccia com.espertech.esper.client.hook.VirtualDataWindow
• Implementare_l’interfaccia
com.espertech.esper.client.hook.VirtualDataWindowLookup
• Registrare la classe factory nella configurazione dell’engine
Una volta completati questi step, sarà possibile utilizzare la finestra all’interno di uno
statement EPL.
98
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Single-Row Function
Le Single-Row Function sono funzioni che restituiscono un solo valore per ogni singola
riga di risultato generata da uno statement. Esse possono essere utilizzate in una qualsiasi
espressione e possono ricevere in input un numero qualsiasi di parametri. Esper prevede di
default un buon numero di funzioni di questo tipo (ad es. min e max che consentono di
determinare rispettivamente il minimo e il massimo degli esiti di due o più espressioni),
ma mette anche a disposizione la possibilità di definire funzioni Single-Row
personalizzate. A tale scopo è necessario seguire i due seguenti passi:
• Implementare una classe che prevede uno o più metodi statici che accettano il
numero e il tipo di parametri richiesti
• Registrare i nomi della classe e dei metodi della single-row function, attraverso il
file di configurazione dell’engine o le API
Aggregation Function
Le funzioni di aggregazione aggregano i valori delle proprietà degli eventi o i risultati di
un’espressione, ottenuti da uno o più flussi. Esempi di funzioni di aggregazione built-in
sono count (*), sum (prezzo * volume ) o avg (distinct volume).
Anche le funzioni di aggregazione possono essere personalizzate. A tal fine basta seguire i
seguenti passaggi:
• Implementare una aggregation function factory class, implementando l'interfaccia
com.espertech.esper.client.hook.AggregationFunctionFactory.
• Implementare
una
funzione
di
aggregazione,
implementando
l'interfaccia
com.espertech.esper.epl.agg.AggregationMethod.
• Registrare l’aggregation function factory class, attraverso il file di configurazione
del motore o le API.
Pattern Guard
I Pattern Guard sono pattern che controllano il ciclo di vita delle sub-expression, e
99
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
possono filtrare gli eventi generati da queste ultime. Esper da la possibilità di definirne di
personalizzate attraverso i seguenti passaggi:
• Implementare una guard factory class, responsabile della creazione di istanze dei
guard object.
• Implementare una guard class.
• Registrare la classe factory, tramite il file di configurazione del motore o le API.
Pattern Observer
I Pattern Observer sono pattern object che sono eseguiti come parte di una pattern
expression e possono osservare eventi o condizioni di prova. Esempi di observer built-in
sono timer:at e timer:interval.
I seguenti passi sono necessari per sviluppare e utilizzare un Observer Object
personalizzato:
• Implementare una Observer factory class, responsabile della creazione di istanze
degli Observer Object.
• Implementare una Observer class.
• Registrare la classe factory, tramite il file di configurazione del motore o le API.
Event Type and Event Object
È possibile definire nuovi tipi di eventi in Esper sottoforma di plugin, attraverso
l'implementazione dell’interface com.espertech.esper.plugin.PlugInEventRepresentation.
Una volta implementata sarà ovviamente necessario prevedere la registrazione all’interno
della classe Configuration.
È possibile registrare più rappresentazioni di eventi sottoforma di plug-in. Ogni
rappresentazione avrà un proprio URI,
il quale è utilizzato per dividere lo spazio
complessivo relativo alle diverse rappresentazioni di eventi e svolge un ruolo importante
nel risolvere i tipi di eventi.
L'implementazione
dell'interfaccia
PlugInEventRepresentation
deve
prevedere
100
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
l’implementazione di altre due interfacce: com.espertech.esper.client.EventType e
EventBean.
I metodi EventType forniscono i metadati relativi agli eventi, inclusi i nomi ei tipi delle
proprietà. Essi inoltre forniscono le istanze di EventPropertyGetter per il recupero dei
valori di tali proprietà. Ogni istanza di EventType invece, rappresenta un tipo distinto di
evento, e la sua implementazione è l'evento stesso, e incapsula l'evento sottostante.
I seguenti passi consentono l’elaborazione degli eventi definiti come plugin:
• Implementare le interfacce EventType, EventPropertyGetter e EventBean.
• Implementare le interfacce PlugInEventRepresentation, PlugInEventTypeHandler e
PlugInEventBeanFactory, e poi aggiungere il nome della classe che implementa la
prima alla configurazione dell’engine.
• Registrare il plug-in event type attraverso la configurazione.
• Ottenere
un
EventSender
dalla
EPRuntime
attraverso
il
metodo
getEventSender(URI[]), e usarlo per l’invio degli eventi.
Plugin
Un plug-in loader è utilizzato per aggiungere all’applicazione qualsiasi tipo di task che
possa beneficare dall'essere parte di un file di configurazione di Esper e che segua il ciclo
di vita del motore.
Un plug-in loader implementa l'interfaccia com.espertech.esper.plugin.PluginLoader e
può essere inserito nella configurazione. Ogni plug-in loader configurato segue il ciclo di
vita dell'istanza motore, infatti quando un'istanza del motore è inizializzata, viene creata
un'istanza di ciascuna delle classi di implementazione dei plug-in loader elencati nella
configurazione. In più il motore richiama i metodi relativi al ciclo di vita della classe che
implementa il plug-in loader prima e dopo che il motore venga completamente
inizializzato, e prima che un'istanza dello stesso venga distrutta.
È possibile dichiarare un plug-in loader nella configurazione XML come segue:
101
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
...
<plugin-loader name="MyLoader" classname="org.mypackage.MyLoader">
<init-arg name="property1" value="val1"/>
</plugin-loader>
In alternativa è possibile utilizzare le API:
Configuration config = new Configuration();
Properties props = new Properties();
props.put("property1", "value1");
config.addPluginLoader("MyLoader", "org.mypackage.MyLoader",
props);
Relativamente alla classe che implementa il plug-in loader, in essa è necessario
implementare il metodo init, il quale permette di ricevere i parametri di inizializzazione.
Il motore richiama questo metodo prima che il motore sia completamente inizializzato.
Altri metodi da implementare sono il postInitialize e quello destroy, i quali vengono
rispettivamente richiamati dal motore al termine dell’inizializzazione e prima della
distruzione del motore stesso.
3.7.1 Derived-Value and Data Window View
Le viste in Esper, come già accennato più volte, vengono utilizzate per ricavare
informazioni da un flusso di eventi e per realizzare delle data windows, e ne sono previste
differenti di default (v. tabella paragrafo 3.2).
I passaggi seguenti sono necessari per poter sviluppare e utilizzare una custom View con
Esper:
• Implementare una classe view factory. Le classi di questo tipo sono classi che
accettano e controllano i parametri della vista e creano un'istanza della classe view.
• Implementare una classe view. Una classe view spesso rappresenta una data
windows o deriva nuove informazioni da un flusso di eventi.
102
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
• Configurare la classe view factory fornendo un view namespace e un nome al file di
configurazione dell’engine.
Vediamoli più nel dettaglio.
3.7.1.1 Implementazione della classe View factory
La
classe
view
factory
è
un’estensione
della
classe
com.espertech.esper.view.ViewFactorySupport, ed è responsabile di una serie di compiti,
e precisamente sono:
• Accettare zero o più view parameter, che sono espressioni che la classe deve
validare e valutare
• Instanziare la classe view
• Fornire informazioni relative al tipo di eventi postati dalla view
Il
primo
compito
è
realizzato
attraverso
l’implementazione
del
metodo
setViewParameters, il quale riceve ed effettua l’analisi dei view parameter. Il seguente
codice, ad esempio, controlla il numero di parametri passati e li memorizza all’interno
della classe:
public void setViewParameters(ViewFactoryContext
viewFactoryContext, List<ExprNode> viewParameters) throws
ViewParameterException {
this.viewFactoryContext = viewFactoryContext;
if (viewParameters.size() != 3) {
throw new ViewParameterException("View requires a 3
parameters: ip, time and file name");
}
this.viewParameters = viewParameters;
}
Dopo che l’engine avrà fornito i view parameter alla classe factory, esso chiederà alla
103
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
vista di collegarsi alla sua parent view e di convalidare le parametr expression rispetto al
tipo di evento di quest’ultima.
A tale scopo è necessaria l’implementazione del metodo attach e l’utilizzo in esso del
metodo validate della classe ViewFactorySupport. Di seguito è riportato un esempio di
implementazione del metodo attach, nel quale avviene la convalida delle parameter
expression, nonché il controllo del tipo dei parametri.
public void attach(EventType parentEventType,
StatementContext statementContext, ViewFactory
optionalParentFactory, List<ViewFactory>
parentViewFactory) throws
ViewParameterException {
ExprNode[] validatedNodes =
ViewFactorySupport.validate("attackPV",
parentEventType, statementContext,
viewParameters, false);
ipExpression = validatedNodes[0];
timeExpression = validatedNodes[1];
fileExpression = validatedNodes[2];
if ((ipExpression.getExprEvaluator().getType() !=
String.class) &&
(timeExpression.getExprEvaluator().getType() !=
String.class) &&
(fileExpression.getExprEvaluator().getType() !=
String.class)){
throw new ViewParameterException("View requires
String-typed values for input parameters");
}
}
Infine, l’engine chiede alla view factory di creare un’istanza della custom view, e chiede il
tipo di eventi generati dalla stessa. Per tale motivo si prevede l’implementazione dei
metodi makeView e getEventType, di cui un esempio è riportato di seguito:
public View makeView(AgentInstanceViewFactoryChainContext
agentInstanceViewFactoryContext) {
return new PluginView(agentInstanceViewFactoryContext,
ipExpression, timeExpression, fileExpression);
}
public EventType getEventType() {
return
PluginView.getEventType(viewFactoryContext
104
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
.getEventAdapterService());
}
3.7.1.2 Implementazione della classe View
Una classe view, come già detto, rappresenta la vista personalizzata vera e propria, la quale
ricordiamo è istanziata dalla View Factory. Tale classe sarà un’estensione di quella
com.espertech.esper.view.ViewSupport, e sarà responsabile dei seguenti metodi:
• Il metodo setParent, che informa la vista del tipo di evento della parent view
• Il metodo update, che riceve gli eventi dell’insert stream e del remove stream dalla
sua parent view
• Il metodo iterator (opzionale), che fornisce un iterator per consentire ad
un'applicazione di prelevare o richiedere i risultati di un EPStatement
• Il metodo cloneView, che è necessario per creare una copia della vista per abilitare la
stessa a lavorare in un grouping context insieme ad una parent view del tipo
std:groupwin
Di questi, di fondamentale importanza è il metodo update, il quale si preoccupa
dell'elaborazione degli eventi in entrata (insert stream) e in uscita (remove stream) inviati
dalla parent view (se presente), oltre a fornire gli eventi in entrata e in uscita alle viste
figlie (child view).
Da notare che, l'implementazione della vista dovrà prevedere l’utilizzo del metodo
updateChildren, attraverso il quale effettuerà il post degli eventi dell’insert stream e del
remove stream. Simile al metodo di update, questo metodo prende gli eventi dei due
stream come parametri.
Di seguito è mostrato un esempio di implementazione del metodo update, nonché un
esempio di utilizzo del metodo updateChildren:
105
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
public void update(EventBean[] newData, EventBean[] oldData) {
for (EventBean theEvent : newData){
eventsPerStream[0] = theEvent;
String ip =
(String)ipExpression.getExprEvaluator().evaluate
(eventsPerStream, true,
agentInstanceViewFactoryContext);
String time =
(String)timeExpression.getExprEvaluator().evaluate
(eventsPerStream, true,
agentInstanceViewFactoryContext);
String file =
(String)fileExpression.getExprEvaluator().evaluate
(eventsPerStream, true,
agentInstanceViewFactoryContext);
if(find_probability("type")<0.5)
continue;
this.ip = ip;
this.time = time;
this.type = "Illegal_Download";
this.moreInfo = "Downloaded " + file;
postData();
}
}
private void postData(){
AttackEvent attackEvent = new
AttackEvent(ip,time,type,moreInfo);
EventBean outgoing =
agentInstanceViewFactoryContext.
getStatementContext().getEventAdapterService()
.adapterForBean(attackEvent);
if (lastEvent == null){
this.updateChildren(new EventBean[] {outgoing},
null);
}else{
this.updateChildren(new EventBean[] {outgoing},
new EventBean[] {lastEvent});
}
lastEvent = outgoing;
ip = null;
time = null;
type = null;
moreInfo = null;
}
Come si può notare, il metodo update riceve gli eventi dall’insert stream (newData) e dal
remove stream (oldData), realizza le sue elaborazioni sui dati presenti in essi, e
successivamente richiama, all’interno del metodo postData(), il metodo updateChildren,
106
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
con il quel effettua il post di una nuova tipologia di evento (AttackEvent), opportunamente
istanziata e popolata.
3.7.1.3 Configurazione della View
Come accade per gli altri componenti personalizzati, anche le custom view necessitano di
essere aggiunte all’interno della configurazione del motore di Esper. Precisamente è
necessario aggiungere il nome della classe view factory, il nome della classe che
implementa la custom view e il suo namespace. Ovviamente, la configurazione può
avvenire sia attraverso le API che attraverso un file XML. Di seguito è riportato un
esempio utilizzando le API, in cui si prevede la registrazione di una custom View di nome
attackPV, con namespace examples e istanziata dalla classe PluginViewFactory:
Configuration config = new Configuration();
config.addPlugInView("examples", "attackPV",
PluginViewFactory.class.getName());
107
Capitolo 4
Architettura e mapping tecnologico del sistema CEP
Dopo aver trattato dei requisiti che la piattaforma, oggetto di questo lavoro di tesi, deve
essere in grado di soddisfare, nonché del CEP Engine utilizzato alla base della stessa, è
bene ora soffermarci sulla sua architettura. Pertanto, sarà dapprima fornita una panoramica
sulle sue componenti logiche, per poi scendere maggiormente nel dettaglio descrivendo la
struttura e il funzionamento di ogni sua parte.
Prima però vediamo i principi alla base dell’architettura realizzata.
4.1 Event Driven Architecture
Il concetto alla base dello sviluppo architetturale della piattaforma progettata è, ancora una
volta, quello di evento. Infatti, trattandosi di un sistema integrato rivolto alla Complex
Event Processing, gli eventi rappresentano il vero filo conduttore dell’intera architettura.
Di conseguenza, l’approccio scelto per la realizzazione di tale sistema è quello relativo al
pattern architetturale EDA (Event Driven Architecture), che supporta la produzione di
eventi e la reazione ad essi.
In particolare, EDA costituisce uno stile architetturale in cui alcuni elementi applicativi
entrano in esecuzione in risposta al verificarsi di eventi. Ovvero, un elemento decide se
108
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
agire o meno, in base all’arrivo di eventi. Un evento è, semplicemente, qualcosa che
accade. Tale pattern può essere utilizzato per la specifica e l’implementazione di
applicazioni e sistemi che trasmettono eventi tra servizi e/o componenti debolmente
accoppiati.
Un sistema orientato agli eventi, infatti, è tipicamente costituito da produttori e
consumatori di eventi. I consumatori si sottoscrivono presso un elemento intermedio,
denominato solitamente manager, e i produttori pubblicano presso di esso i propri eventi.
Quando il manager riceve un evento dal producer, lo inoltra al consumer. Se il consumer
non è disponibile, il manager può memorizzare l’evento e provare ad inoltralo in seguito.
Figura 4.1: Event Driven Architecture
Si comprende quindi che la Event Driven Architecture fornisce una modalità di
accoppiamento lasco, essa infatti è un pattern asincrono che si basa sul paradigma di
comunicazione publish/subscribe. Il publisher è completamente ignaro della presenza del
subscriber, e viceversa, il che garantisce anche una elevata indipendenza tra le due
componenti.
È possibile vedere EDA come una estensione della Service Oriented Architecture, così
come la definisce Luckham, il quale afferma che:
"Una Event Driven Architecture (EDA) è una Service Oriented Architecture (SOA)
nella quale tutte le comunicazioni sono basate su eventi e tutti i servizi sono processi
109
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
in grado di reagire agli eventi (cioè, reagire ad un evento in ingresso e generare un
evento in uscita)" [5].
Da tale definizione si evince facilmente la stretta correlazione esistente tra un’architettura
orientata ai servizi ed una orientata agli eventi. Quest’ultima infatti eredita dalla SOA
alcuni dei suoi principi fondamentali, e precisamente:
• Componibilità: cioè la capacità di realizzare sistemi caratterizzati da più
componenti, i quali possano essere aggiunti e/o rimossi a seconda delle necessità, o
meglio del servizio che si intende offrire.
• Riusabilità: cioè la capacità di prevedere componenti che possano essere riutilizzati
anche per sistemi o ambiti differenti da quelli per cui erano inizialmente previsti.
• Interoperabilità: cioè la capacità di garantire che ogni componente del sistema sia
in grado di operare/comunicare con gli altri componenti, anche se estremamente
differenti.
• Accoppiamento lasco: cioè, come già detto precedentemente, la capacità di un
sistema di avere componenti che abbiano poca o nessuna conoscenza relativa agli
altri componenti del sistema.
Figura 4.2: Principi fondamentali della Service Oriented Architecture
110
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Costruire applicazioni e sistemi basandosi sul pattern EDA permette di ottenere una
maggiore affidabilità, poiché i sistemi basati sugli eventi sono, per costruzione, più
tolleranti e flessibili rispetto ad ambienti imprevedibili ed asincroni, spesso mediante
anche l'applicazione di logiche real-time e/o predittive.
Proprio questo aspetto, insieme a quelli fin’ora citati, ci ha spinti alla realizzazione della
nostra piattaforma seguendo questo pattern, il che ci ha portato allo sviluppo di un sistema
event-driven, basato sul paradigma di comunicazione publish/subscribe.
Si è cercato di rendere il sistema quanto più modulare e componibile possibile, così da
garantire la capacità di aggiunta di nuovi elementi in maniera rapida e indolore, e di
dotarlo, inoltre, di componenti che fossero indipendenti e fortemente riutilizzabili.
4.2 Componenti logici
Prima di passare alla descrizione dell’architettura della piattaforma, come già annunciato
all’inizio di questo capitolo, diamo uno sguardo alle le componenti logiche di cui il
sistema dovrà essere dotato, così come previsto nei primi documenti di progetto di
CEvOS.
Figura 4.3: Componenti logici del sistema
111
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Secondo tali documenti, il sistema deve essere caratterizzato, ad un elevato livello di
astrazione, dalle sei componenti mostrate in figura 4.3, le quali sono dotate delle seguenti
macrofunzionalità:
• Capture: modulo per la gestione degli stream in ingresso da cui sono elaborati gli
eventi
• Analyze: modulo che abiliterà la feature extraction dai flussi in input, per consentire
la classificazione di oggetti e metadati in essi contenuti, nonché eventuali
operazioni di filtraggio e aggregazione
• Store: modulo deputato alla gestione degli stream in input, sulla base dei quali gli
eventi sono classificati. Tale modulo si occuperà di mantenere le correlazioni sulle
feature estratte dal componente Analyze. Inoltre, è prevista l'esistenza sia di una
componente in memory, sia di una persistente che conterrà gli historical data
• Correlate: rappresenta il cuore del CEP Engine, che abiliterà la situation awareness
• Manage: componente che si occuperà di: integrare e far interagire le piattaforme di
gestione dei componenti di sorveglianza esterni; configurare i profili di accesso e
di servizio; implementare la “anomaly detection”. Tale modulo dovrà prevedere un
sottocomponente di “Control & Command”, per gestire l’esecuzione di azioni
dirette sui componenti attivi (sensori, telecamere, etc.), a valle delle rilevazioni di
allarmi/anomalie
• Search: componente che abilita le capabilities di investigazione del sistema. Infatti,
mediante l'esecuzione di query di ricerca (temporali, topologiche), il modulo
Search sarà in grado di restituire al sistema gli stream che rispondono ai criteri di
ricerca (caratterizzati da particolari feature, estratte nella fase di analisi e
storicizzate nello store). Si noti che, oltre alle funzionalità di ricerca in postprocessing, il motore di Search dovrà coadiuvare il componente di correlazione
(CEP) nella “Continous Analysis”, operazione che consiste nel verificare la
corrispondenza di un subset di eventi dell’event stream con i pattern codificati
per gli alert (e che indicheranno situazioni di pericolo). Si ricordi che tale
112
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
componente potrà affidarsi a tecniche di storicizzazione in-memory, piuttosto che a
quelle persistenti.
Da notare che non tutte queste componenti sono previste nella piattaforma implementata.
Infatti, come già accennato nell’introduzione di questa tesi, il sistema realizzato è una
prima versione di CEvOS e pertanto non prevede tutte le componenti che sono state
inizialmente pensate. Precisamente in termini di componenti logiche, non sono stai inclusi
il modulo Manage, Store e quello Search.
4.3 Architettura
Definiti i componenti logici, passiamo ora alla descrizione dell’architettura vera e propria
del sistema. Come già accennato all’inizio di questo capitolo, si è realizzata una
piattaforma modulare in cui i componenti sono indipendenti e riutilizzabili, nonché in
grado
di
comunicare
attraverso
un
canale
asincrono,
basato
sul
paradigma
publish/subscribe.
La piattaforma progettata è caratterizzata da cinque componenti fondamentali, mostrati
nella figura 4.4, che sono:
• Enterprise Service Bus: rappresenta il bus di comunicazione tra i vari moduli
• Mediator: media, attraverso degli appositi wrapper, tra i sensori/dispositivi di rete e
l’ESB, convertendo gli eventi raw, cioè gli eventi prodotti da ogni singola sorgente,
in un formato unico di rappresentazione degli eventi, così da renderli trasportabili
sul bus
• Prefiltering-Aggregation: realizza il filtraggio degli eventi raw ed un loro eventuale
arricchimento
• CEP Engine: che si preoccupa di effettuare la correlazione tra gli eventi raw,
opportunamente filtrati, al fine di generare eventi complessi relativi ai casi d’uso
113
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
presi in considerazione
• Business Process Management/Actuators: si dedicano alla gestione degli eventi
complessi generati dal CEP Engine, e alla realizzazione di operazioni di riposta ad
essi.
Figura 4.4: Architettura della piattaforma implementata
In realtà, dei componenti appena citati, l’unico a non essere stato implementato è quello
BPM/Actuators, che rientra nella componente logica Manage, in quanto è stato ritenuto
non essenziale al fine di realizzare un primo prototipo funzionante del sistema CEvOS.
Pertanto il suo sviluppo è stato escluso da questo lavoro di tesi.
Ognuno dei moduli implementati trova una diretta corrispondenza con una delle
componenti logiche descritte nel paragrafo precedente. Infatti, è facile comprendere che il
Mediator, e precisamente i suoi wrapper, rientrano nella componente di Capture, il
modulo di Prefiltering-Aggregation insieme al Mediator, e alla sua capacità, come
114
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
vedremo, di riconoscere i flussi in input, in quella di Analyze, mentre il CEP Engine nella
componente logica Correlate. Tali associazioni sono ben visibili nella figura 4.5.
Figura 4.5: Flusso di funzionamento della piattaforma
115
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
In tale figura, in realtà, non è mostrata la sola associazione tra le componenti reali e quelle
logiche del sistema, ma anche il flusso di funzionamento dell’intera piattaforma, così da
comprendere la reale interazione tra i vari moduli.
Come si può vedere dalla figura, tutto parte dalle sorgenti degli eventi, cioè i
sensori/software che sono disponibili (ad es. telecamere, sistemi IDS, etc.). Tali dispositivi
sono in grado di generare eventi nel momento in cui si verifica un determinato
avvenimento (ad es. per le telecamere con modulo di Face Detection può essere il
riconoscimento di un volto, per un sistema IDS può essere un tentativo di Port Scanning).
Ovviamente tali eventi conterranno informazioni atte a descrivere quanto i dispositivi
hanno rilevato.
Questi eventi, che saranno rappresentati nel formato specifico della sorgente, vengono
catturati dai wrapper del mediator, uno per ogni tipologia di sorgente, i quali si
preoccuperanno di convertire gli eventi in un formato comune di rappresentazione e di
inviarli sul Bus, dal quale saranno poi prelevati dal componente di PrefilteringAggregation.
Quest’ultimo effettuerà operazioni di filtraggio, infatti scarta gli eventi non di interesse,
mentre arricchisce, eventualmente, di altre informazioni quelli considerati significativi.
Ovviamente questi ultimi saranno nuovamente immessi sul bus. In realtà, come vedremo,
l’unica operazione prevista da questo componente sarà quella di filtraggio per un
determinata tipologia di eventi.
A questo punto, gli eventi non filtrati saranno ricevuti dal CEP Engine che,
opportunamente istruito, cercherà un’eventuale correlazione, e in tal caso genererà un
evento complesso che descrive la situazione rilevata. Tale evento può essere immesso
nuovamente sul bus, così da renderlo disponibile agli strumenti di gestione BPM/Actuators
nonché agli addetti al controllo. Ovviamente, non avendo implementato i componenti
BPM/Actuators, il CEP Engine non fa altro che visualizzare su un terminale gli alert
relativi alle situazioni rilevate.
Descritto
per sommi capi, il funzionamento del sistema, è bene ora scendere
116
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
maggiormente nel dettaglio, descrivendo ogni singolo componente, partendo innanzitutto
dai dispositivi sorgenti e dagli eventi che essi sono in grado di generare.
4.3.1 Dispositivi sorgenti
Come abbiamo già accennato nel paragrafo precedente, il processo di elaborazione della
piattaforma implementata parte dagli event source, rappresentati da sensori e/o software
che generano eventi in seguito alla rilevazione di determinati avvenimenti.
Sulla base degli scenari e dei casi d’uso previsti per l’utilizzo del nostro sistema (descritti
nel capitolo 2), sono stati previsti cinque sensori:
• Software IDS: il quale si preoccupa di controllare le attività che sono svolte
all’interno della rete locale sotto osservazione, generando all’occorrenza degli
opportuni alert
• Log di sistema: attraverso i quali è possibile monitorare le attività svolte sulle
singole macchine di una rete locale
• Telecamere BACnet con capacità di Face e Tampering Detection: cioè telecamere,
compatibile con il protocollo BACnet, in grado di riconoscere i volti delle persone
osservate (se noti), nonché di rilevare un attività di tampering. In entrambi i casi
esse sono in grado di generare un evento
• Sistema di controllo dell’illuminazione BACnet: cioè un sistema BACnet compliant
in grado di rilevare eventuali malfunzionamenti dell’impianto di illuminazione,
generando un evento
• Badge Reader BACnet: cioè un lettore in grado di generare un evento ogniqualvolta
un badge viene fatto passare nella fessura del lettore e anch’esso compatibile con il
protocollo BACnet.
Tali sensori, laddove possibile, sono stati utilizzati realmente. È il caso ad esempio del
117
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
software IDS e dei log di sistema, per i quali si è adoperato nel primo caso il software
SNORT [17] e per il secondo il sistema di gestione dei log di Linux, basato sul protocollo
SYSLOG [18], e precisamente RSYSLOG [19].
Per quanto riguarda gli altri sensori invece, non avendo a disposizione dispositivi reali,
sono stati realizzati appositi software che fossero in grado di simularli. Tali software sono
stati implementati facendo uso di una apposita libreria open source denominata BACnet4J,
la quale, insieme al protocollo BACnet, sarà descritta nei successivi paragrafi.
Ma vediamo più nel dettaglio ogni singola sorgente.
4.3.1.1 L’IDS: Snort
Come già annunciato, l’IDS utilizzato al fine di controllare la rete locale prevista nello
scenario della Network Security, è Snort. Quest’ultimo è un Network-based Intrusion
Detection/Prevention System open source sviluppato dalla Sourcefire Inc., e rappresenta
un vero e proprio standard de facto per i sistemi Unix-based.
Esso è in grado di eseguire il logging dei pacchetti e l’analisi, sia live che offline, del
traffico prodotto su una rete IP. Precisamente Snort esegue l’analisi di protocollo e la
ricerca/matching di contenuti all’interno dello stream di dati raccolto, il che gli permette di
realizzare sia live che offline detection, rilevando eventuali tentativi di intrusione in un
sistema tramite il confronto delle “impronte” dei pacchetti di rete in arrivo e quelle
conservate in un database (rules), nonché attraverso il rilevamento di anomalie di
protocollo.
Rilevata un’attività sospetta, Snort effettua sia la funzione di registrazione dell’accaduto
che di avviso all’amministratore, quest’ultima attraverso l’invio di appositi alert. Da
notare che tale IDS non è in grado, di default, di svolgere alcun compito di difesa attiva,
la quale sarà quindi demandata all’amministratore del sistema.
Come già accennato, la rilevazione di eventuali intrusioni viene effettuata attraverso
118
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
l’utilizzo di apposite regole, attraverso il cui matching Snort è in grado di identificare
situazioni sospette. Tali rules sono direttamente messe a disposizione dalla Sourcefire, ma
possono essere anche realizzate ad hoc dall’utente a seconda delle particolare necessità.
Ciò ci ha dato la possibilità di istruire l’IDS sulla base delle nostre esigenze, e cioè quelle
definite nell’ambito dello scenario della Network Security, e precisamente è stato
configurato in maniera tale da riconoscere:
• Il Download, da parte di un host della rete monitorata, di un file con estensione
sospetta (ad es. exe, c, sh etc.)
• L’Upload, verso un host interno alla rete, di un file con estensione sospetta
• Un Port Scanning realizzato su uno degli host della rete
• Tentativi ripetuti di stabilire una connessione TCP da parte di un host interno alla
rete verso uno stesso indirizzo IP esterno alla rete
A tale scopo, sono state realizzate delle apposite regole che portano alla generazione di
alert che saranno poi immessi all’interno dei log di sistema, così da poter essere analizzati.
In realtà, come vedremo nel prossimo paragrafo, tali log saranno inviati su delle apposite
socket così da poterli consegnare ai wrapper del Mediator. Precisamente i log relativi agli
alert di Snort saranno inviati sulla porta 2000.
A titolo di esempio, mostriamo di seguito una delle regole implementate e il relativo alert
generato da Snort. Precisamente è mostrata la regola che permette di rilevare le
connessioni TCP multiple.
alert tcp $HOME_NET any -> !$HOME_NET any
(msg:"20 or most connections to an external IP address";
threshold:type both, track by_dst, count 20, seconds 60;
sid:9000000; rev:3; priority:3;)
La comprensione della regola è molto semplice, in quanto si sta istruendo l’IDS a generare
un messaggio di alert, cioè “20 or most connection sto an external IP address”, quando un
indirizzo IP della HOME_NET, cioè la rete osservata, tenta di stabilire per venti volte, in
119
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
60 secondi, una connessione TCP con un indirizzo IP che non appartiene alla
HOME_NET. Al rilevamento di una tale condizione, l’alert generato sarà il seguente:
09/24-12:27:45.036332 [**] [1:9000000:3] 20 or most connections
to an external IP address [**] [Priority: 3] {TCP}
172.16.4.53:40625 -> 62.149.140.72:80
Come si può vedere, l’IDS segnala il tipo di alert, la data e l’ora in cui è stato generato, la
priorità assegnata nonché gli indirizzi IP e porta sorgente e destinazione.
4.3.1.2 Rsyslog
Una altra sorgente di eventi, nell’ambito dello scenario della Network Security, sono i log
di sistema degli host della rete monitorata. Precisamente si è preso come riferimento
Rsyslog, una software utility open source nata nel 2004 ad opera di Rainer Gerhards, la
quale è usata su sistemi UNIX e Unix-like per l'inoltro di messaggi di log in una rete IP.
Essa implementa il protocollo di base Syslog, estendendolo attraverso l’introduzione di
filtri basati sul contenuto, di una maggiore quantità di opzioni di configurazione, nonché
aggiungendo caratteristiche importanti come l'utilizzo di TCP per il trasporto.
Proprio queste caratteristiche ci hanno spinto al suo utilizzo come sorgente di eventi
relativa ai log. Infatti, la sue capacità di filtraggio nonché di elevata configurabilità, hanno
permesso di impostare il sistema di logging secondo le necessità. Precisamente, si è
configurato il sistema in maniera tale da riconoscere i log relativi agli alert di Snort e
separarli da quelli di sistema, così da garantire un diverso trattamento per le due tipologie.
Pertanto, mentre per gli alert del sistema IDS, come già detto nel paragrafo precedente, si
è impostato l’invio dei log attraverso una socket sulla porta 2000, per i log di sistema si è
previsto l’inoltro su una porta differente, e precisamente la porta 2001.
Ovviamente, come sarà accennato quando si discuterà del Mediator, i wrapper dedicati
alla cattura di queste informazioni saranno in ascolto proprio su tali porte.
120
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Mostriamo ora di seguito due esempi di log generati da Rsyslog, uno per ogni tipologia.
Il primo è un log relativo all’alert dell’IDS mostrato nel paragrafo precedente:
Sep 24 12:27:45 SM_0 snort: [1:9000000:3] 20 or most connections
to an external IP address[Priority: 3]: {TCP} 172.16.4.53:40625 ->
62.149.140.72:80
Il seguente, invece, mostra un log di sistema relativo all’accesso ad un determinato host:
Sep 24 12:34:45 SM_0 sshd[1341]: Accepted hostbased for PEL_DAV
from 62.211.226.162 port 2622 ssh2
Precisamente, con esso viene segnalato che l’utente con identificativo PEL_DAV ha
effettuato l’accesso all’host SM_0 dall’indirizzo 62.211.226.162:2622 utilizzando il
protocollo SSH2 e il metodo di autenticazione hostbased.
4.3.1.3 Sensori BACnet
L’ultima tipologia di sensori utilizzata per la piattaforma implementata è quella relativa ai
sensori per la building security basati sul protocollo BACnet, i quali ricordiamo sono:
• Telecamere con capacità di Face e Tampering Detection
• Sistema di controllo dell’illuminazione
• Badge Reader
Tali sensori, come già detto nel paragrafo 4.3.1, non sono stati adoperati fisicamente, bensì
sono stati simulati attraverso degli appositi software implementati nel corso di questo
lavoro di tesi.
Ognuno dei software implementati ha lo scopo di simulare un determinato dispositivo, e
precisamente la sua logica, nonché le operazioni di comunicazione, basate sul protocollo
121
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
BACnet. Tale operazione è stata possibile attraverso l’ausilio di un’apposita libreria
software denominata BACnet4J, che ha consentito un loro sviluppo agile.
Detto ciò, prima di passare alla descrizione dei tre software realizzati, è bene soffermarci a
descrivere sia il protocollo BACnet che la libreria BACnet4J.
4.3.1.3.1 BACnet e BACnet4J
BACnet è uno standard di comunicazione, internazionale ed aperto, per la Building
Automation, il cui sviluppo è stato appoggiato dalla ASHRAE (America Society of Heating
and Ventilating Engineers) [20].
BACnet consente l'utilizzo di un'unica interfaccia per controllare tutti i dispositivi di un
sistema, realizzandone e sfruttandone le relazioni in maniera più efficiente. Ed infatti, le
informazioni tra i sotto-sistemi vengono distribuite in base a regole logiche, invece che a
vincoli strutturali; pertanto, l'applicazione dello standard semplifica la ricerca e la
manutenzione dei singoli impianti. BACnet, infatti, non definisce la configurazione
interna, le strutture dati, la logica dei controllori o dei dispositivi su cui viene eseguito il
protocollo. Piuttosto il fulcro dello standard è nelle informazioni che i dispositivi possono
scambiarsi, astraendo i dettagli implementativi.
Precisamente, il modello offre un linguaggio standard e non ambiguo, comune a tutti i
dispositivi BACnet, utilizzato per specificare le entità che partecipano alla comunicazione
e le funzionalità che si vogliono implementare. Lo standard, infatti, si basa su quattro
elementi chiave:
• BACnet Object
• BACnet Service
• BIBBs
• BACnet Media
122
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Figura 4.6: BACnet architecture
Un oggetto rappresenta l'informazione che due dispositivi si scambiano (ad esempio il
valore di una misurazione di temperatura, un allarme), ed è caratterizzato da un
identificativo, da proprietà specifiche (obbligatorie ed opzionali) e da metodi di accesso
standardizzati. Un object è completamente descritto mediante le sue property, che devono
essere impostate al momento dell'istanziazione dell'oggetto stesso.
Al fine di soddisfare tutti i requisiti (meccanico, elettrico, servizi ausiliari, sicurezza,
incendio, controllo degli accessi, ecc.) della Building Automation, in BACnet sono definiti
venticinque oggetti standard, visibili nella figura 4.7, attraverso i quali sono rappresentate
sia le informazioni relative a dati e sistema, sia tutte le funzioni che si vogliono
implementare.
Per quanto riguarda i BACnet Service, essi rappresentano gli elementi attraverso i quali lo
standard è in grado di garantire l'affidabilità della comunicazione tra i dispositivi. Infatti
esso definisce un insieme di servizi standard, attraverso i quali i BACnet device potranno
acquisire le informazioni, inviare comandi, notificare eventi, etc. Essi quindi, in parole
povere, definiscono le regole di invio e ricezione dei messaggi lungo il media di
comunicazione. Tali servizi seguono un modello Client-Server, e sono definiti attraverso
la descrizione dei BACnet Interoperability Building Blocks (BIBBs).
Ciascun BIBB, in realtà, descrive una specifica unità funzionale, non una relazione tra
dispositivi nel suo complesso.
123
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Figura 4.7: Oggetti standard del protocollo BACnet
Essi infatti, poiché i servizi BACnet sono organizzati secondo il principio client/server,
sono espressi mediante una coppia di regole, una relativa all'attività client, l'altra
all'attività server.
Ultimo concetto alla base dello standard è quello del BACnet Media, ovvero del protocollo
di trasporto adoperato. In relazione al livello fisico utilizzato, si distinguono:
• BACnet PTP (connessione Punto-Punto)
• BACnet MSTP (connessione Token Passing)
• BACnet ARCnet (connessione ARCnet)
• BACnet Ethernet (connessione Ethernet, basata su MAC address)
• BACnet IP (connessione Ethernet basata due indirizzo IP).
Tra questi, molto utilizzato è BACnet IP, il quale indica le modalità di costruzione di una
BACnet Network over IP. La specifica definisce la BACnet/IP network, cioè una rete
virtuale costituita da un insieme di BACnet Device che comunicano utilizzando il
protocollo BACnet/IP.
Quest’ultimo lavora a livello Data Link e consente la comunicazione tra dispositivi ubicati
in sottoreti differenti, mediante l'utilizzo del BACnet Broadcast Management Device (uno
per ciascuna sottorete). Il BBMD riceve i messaggi broadcast e li distribuisce con un
124
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
messaggio diretto a BBMD di altre sottoreti. Il protocollo di trasporto adoperato è UDP/IP,
il cui port number di default è 47808 (in esadecimale X'BAC0').
Un Client BACnet può assegnare alle proprie uscite un dato livello di priorità (lo standard
definisce sedici livelli di priorità), che un gateway BACnet è in grado di gestire. Inoltre
quest’ultimo, quando opera come BACnet Server, è in grado anche di gestire il Change of
Value (COV). In pratica, un Client BACnet può fare richiesta di sottoscrizione alla notifica
di uno o più COV (di oggetti o proprietà), in maniera tale da ottenere un messaggio di
notifica ogniqualvolta l’oggetto, sulla quale si è sottoscritta la COV, subisce una modifica.
Precisamente, la sottoscrizione di una COV avviene attraverso i seguenti passi:
• Istanziazione e inizializzazione di un Device Locale (Client)
• Invio di un messaggio broadcast WHO-IS da parte del Device Locale, attraverso il
quale è grado di conoscere i dispositivi connessi alla rete
• Invio della risposta I-AM del Device Remoto al Device Locale, con la quale il device
remoto fa conoscere le proprie caratteristiche al device locale
• Invio da parte del Device Locale di una richiesta di sottoscrizione ad un oggetto, od
alle sue proprietà, mediante un messaggio di SubscribeCOVRequest verso il Device
Remoto
• Invio da parte del Device Remoto del messaggio SimpleACK verso il Device Locale
• Il Device Remoto invia una notifica al sottoscrittore ConfirmedCOVNotification, che
contiene le informazioni richieste dal Local Device, ogniqualvolta l’oggetto e/o la
proprietà sottoscritta viene modificata
• Il LocalDevice invia una SimpleAck al Dispositivo Remoto
125
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Figura 4.8: Sottoscrizione COV
Da notare che tutti i messaggi scambiati attraverso il protocollo BACnet hanno la struttura
mostrata in figura 4.9.
Figura 4.9: Struttura di un BACnet IP message
126
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Tutte queste caratteristiche rendono il protocollo BACnet una soluzione adottabile in
qualsiasi contesto di Building Automation ed applicabile a tutti i livelli del sistema,
indipendentemente dalla dimensione, dalla complessità dei sistemi coinvolti e dal numero
dei relativi costruttori.
Un sistema di dispositivi BACnet offre a proprietari e gestori una notevole libertà di scelta
dei dispositivi e delle tecnologie da adoperare nel contesto di interesse (soprattutto rispetto
alle tecnologie di cui già si dispone). In tal modo si potranno migliorare ed incrementare le
funzionalità/servizi offerti, aumentando il valore competitivo aziendale. In definitiva,
l'adozione della tecnologia BACnet comporta notevoli vantaggi in termini di riduzione dei
costi, aumento della flessibilità e delle performance globali del sistema. Tali
considerazioni hanno portato all’ausilio di tale protocollo, e di conseguenza alla necessità
di simulare dispositivi che lo adottassero. A tal fine si è utilizzata la libreria BACnet4J.
Tale libreria rappresenta una implementazione Java ad alte prestazioni del protocollo
BACnet IP. Essa mette a disposizione una serie di classi, attraverso le quali è in grado di
garantire il supporto a tutti i servizi BACnet.
Le principali classi previste sono:
• LocalDevice e RemoteDevice, attraverso le quali sono rappresentati device locali e
device remoti
• WhoIsRequest e SubscribeCOVRequest, attraverso le quali sono rappresentate le
richieste di Who-Is e quella di sottoscrizione di una COV
• BACnetObject e ObjectIdentifier, che rappresentano rispettivamente un oggetto
BACnet e il suo identificativo.
4.3.1.3.2 Struttura e logica applicativa
Dopo aver definito il protocollo BACnet e la libreria BACnet4J, vediamo ora come sono
stati implementati i software. Precisamente sono state realizzate tre classi, una per
127
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
dispositivo:
• BADGE_READER_Device, che simula un Badge Reader BACnet, generando
periodicamente eventi di lettura di un Badge, e quindi riconoscimento della
persona attraverso i dati presenti su di esso
• CAMERA_Device, che simula una videocamera di sorveglianza BACnet, generando
periodicamente, e in maniera alternata, eventi di Tampering e di Face Detection
• LAMP_Device, che simula un sistema di controllo dell’illuminazione BACnet,
generando periodicamente eventi di LAMP down, ovvero spegnimento e/o guasto
di una lampada del sistema.
Ognuna di queste classi è caratterizzata da un unico metodo main, che se eseguito avvia la
simulazione del dispositivo, e da una serie di attributi. Tra questi i principali sono il
LocalDevice, che rappresenta il dispositivo che si intende simulare, il BACnetObject e il
relativo ObjectIdentifier, che rappresentano l’oggetto e il suo ID, monitorato dal sensore, il
RemoteDevice, che rappresenta il getway che gestisce i dispositivi (il Mediator nell’ambito
della nostra piattaforma), nonché il LOCAL_ADDRESS e BRODCAST_ADDRESS, che
rappresentano rispettivamente l’indirizzo IP del dispositivo e quello di broadcast della rete
su cui esso è in funzione, ed infine il DEVICE_ID, che invece rappresenta l’identificativo
del dispositivo simulato.
Figura 4.10: Classi BACnet Device
128
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Una volta avviati i dispositivi assumeranno il comportamento mostrato nel sequence
diagram di figura 4.11, dove è mostrata per brevità il comportamento del solo Device
LAMP, che però rispecchia quello degli altri device. Precisamente per prima cosa
istanzieranno un LocalDevice e un BACnetObject, per poi successivamente associare al
primo un listener, il quale si preoccuperà di gestire eventuali messaggi ricevuti in ingresso
dal sensore, ma che in questo caso è stato lasciato con l’implementazione di default non
dovendo gestire alcuna operazione in particolare. Infatti la libreria BACnet4J è in grado di
gestire autonomamente le interazioni con un server BACnet/IP, quando utilizzata per
simulare un dispositivo. Fatto ciò, si inizializza il dispositivo, il quale sarà a quel punto
operativo e potrà cominciare a modificare in maniera casuale l’oggetto monitorato,
cosicché vengano generati messaggi di COVNotification verso tutti i dispositivi che hanno
sottoscritto una COV su quell’oggetto. Nell’ambito del nostro sistema, l’unico componente
in grado di effettuare sottoscrizioni sarà il Mediator.
Figura 4.11: Sequence Diagram del LAMP_Device
129
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
4.3.2 L’Enterprise Service Bus
Un Enterprise Service Bus (ESB), può esser definito come un middleware in grado di
riunire varie tecnologie di integrazione, al fine di creare servizi ampiamente disponibili per
il riuso. Un ESB offre la migliore soluzione per venire incontro alla necessità di
integrazione di applicazioni, fornendo un’infrastruttura software che permette l’impiego di
architetture SOA/EDA. In particolare, le applicazioni non interagiscono direttamente l’un
l’altra, bensì, l’ESB si comporta come un mediatore tra essi, garantendone il
disaccoppiamento. Pertanto agisce come un bus di messaggistica, eliminando la necessità
di una comunicazione point-to-point. Infatti, quando un sistema deve comunicare con un
altro, esso deposita
semplicemente
un messaggio sul bus, e sarà poi compito di
quest’ultimo instradare opportunamente il messaggio al suo endpoint di destinazione.
Figura 4.12: ESB - Comunicazione indiretta
Una comunicazione di questo tipo introduce due principali vantaggi, rispetto ad una
comunicazione point-to-point:
• L’aumento del numero di applicazioni che compongono il sistema integrato non
comporta un aumento della complessità del sistema stesso. Ciò consente di poter
aggiungere senza problemi ulteriori moduli senza compromettere le funzionalità
• Ogni componente non dovrà avere n interfacce per una comunicazione completa con
gli altri n-1 componenti, bensì basterà la sola interfaccia verso l’ESB
130
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
L’integrazione tra le varie applicazioni è inoltre garantita anche dalla possibilità di far
comunicare applicazioni basate su differenti protocolli di comunicazione (ad esempio
SOAP, CORBA, JMS, FTP, POP3, HTTP, etc.), realizzando le dovute trasformazioni nel
corso della trasmissione del messaggio.
I servizi chiave forniti da un ESB includono, quindi:
• Supporto a differenti protocolli di trasporto per i messaggi
• Supporto alle trasformazioni tra i vari protocolli
• Gestione ed instradamento dei messaggi
A questi poi, molto spesso, i fornitori degli ESB aggiungono anche caratteristiche di
quality of service, come fault tolerance, failover, load balancing, message buffering, etc.
Da quanto detto, si comprende che un tale componente è di fondamentale importanza per
il sistema implementato, in quanto, come più volte menzionato, l’architettura sviluppata
deve garantire la comunicazione tra moduli differenti in modalità asincrona e
disaccoppiata, nonché una semplice espandibilità del sistema, eventualmente anche con
sistemi basati su protocolli di comunicazione differenti da quelli utilizzati internamente
alla piattaforma.
Nello specifico, il protocollo di comunicazione utilizzato nel nostro sistema è JMS (Java
Messaging Service), mentre l’ESB adoperato è Apache ActiveMQ [21].
Diamo uno sguardo a queste due tecnologie.
4.3.2.1 Java Message Service
Java Messaging Service (JMS) è un insieme di API che consentono lo scambio di
messaggi tra applicazioni Java distribuite nella rete. In sostanza esso fornisce un metodo
standard tramite il quale le applicazioni Java possono creare, inviare e ricevere i messaggi
usando un Message Oriented Middleware (ad esempio lo stesso Apache ActiveMQ).
131
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
JMS
definisce,
dunque,
una
interfaccia
comune
indipendente
dalla
specifica
implementazione del sistema di messaging. In tal modo una applicazione Java risulta
essere indipendente, oltre che dal sistema operativo, anche dalla specifica implementazione
del sistema di messaging.
Gli elementi principali che compongono questo standard sono:
• JMS Provider: sistema di messaggistica che implementa la specifica JMS e realizza
funzionalità aggiuntive per l’amministrazione e il controllo della comunicazione
attraverso messaggi
• JMS Client: programma in linguaggio Java che invia o riceve messaggi JMS
• Message: raggruppamento di dati che viene inviato da un client a un altro
• Administered objects: sono oggetti preconfigurati da un amministratore ad uso dei
client, e permettono di creare e gestire la comunicazione tra le applicazioni. Essi
incapsulano la logica specifica del JMS provider nascondendola ai client,
garantendo maggiore portabilità al sistema complessivo
• Destination (queue/topic): è un Administered object che svolge il ruolo di
“deposito” in cui i mittenti possono lasciare i messaggi che creano, e da cui i
destinatari possono recuperare i messaggi. Le destinazioni possono essere usate
contemporaneamente da più mittenti e da più destinatari. A seconda del tipo di
destinazione usato (queue o topic), la consegna dei messaggi avviene secondo
modalità diverse (point-to-point o publish/subscribe).
Come appena accennato, la consegna dei messaggi in JMS può avvenire in due modalità
diverse, e precisamente:
• Point-to-Point
• Publish/Subscribe
Nel primo caso, cioè nel modello point-to-point (PTP), un client può inviare uno o più
messaggi ad un altro client, non in maniera diretta, bensì condividendo una stessa
132
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
destinazione verso cui si inviano e da cui si prelevano i messaggi.
Tale destinazione, nel modello PTP, prende il nome di coda (o queue): più produttori e più
consumatori possono condividere la stessa coda, ma ogni messaggio ha un solo
consumatore, infatti un messaggio dalla coda può essere letto una ed una sola volta.
Questo approccio consente di fatto una comunicazione uno-a-uno.
Ovviamente, non è prevista alcuna dipendenza temporale tra produttori e consumatori,
pertanto il consumer può prelevare il messaggio dalla coda anche se non era in ascolto al
momento del suo invio, confermando l’operazione con un Acknowledge.
Figura 4.13: Modello PTP
Il secondo modello, cioè quello Publish/Subscribe, è detto anche sistema di messaging
event-driven. I client inviano messaggi ad un Topic, ossia una particolare coda in grado di
inoltrare i messaggi a più destinatari. In particolare, il sistema si prende carico di
distribuire i messaggi inviati da più publishers: tali messaggi vengono consegnati
automaticamente a tutti i subscribers che hanno effettuato la sottoscrizione ad un certo
topic, cioè che si sono dichiarati interessati alla ricezione di messaggi appartenenti a quel
topic. In questo caso la comunicazione è uno-a-molti, in quanto ogni messaggio può avere
più consumatori. È il JMS Provider che si occupa di consegnare una copia di ogni
messaggio pubblicato agli interessati. Il messaggio viene poi eliminato dal topic quando
tutti i subscribers interessati lo hanno ricevuto.
Nel modello publish/subscriber esiste una dipendenza temporale tra publisher e
subscriber, in quanto quest’ultimo
può ricevere il messaggio solo dopo essersi
133
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
“sottoscritto” al topic d’interesse, e dopo che il publisher abbia effettivamente inviato il
messaggio. Inoltre il subscriber deve rimanere attivo se vuole continuare a ricevere.
Le API JMS rilassano tale vincolo temporale mediante il concetto di durable
subscriptions. Queste ultime, infatti, permettono di ricevere i messaggi anche se i
subscribers non erano in ascolto al momento dell’invio del messaggio.
Figura 4.14: Modello Publish/Subscribe
La figura 4.15, mostra le principali componenti del modello di programmazione JMS.
Precisamente abbiamo:
• Connection Factory e Destination
• Connection
• Session
• Message Producer
• Message Consumer
• Message
La Connection rappresenta l’astrazione di una connessione attiva con un particolare JMS
Provider e si ottiene dalla ConnectionFactory.
La Session, invece, si ottiene dalla Connection e rappresenta il canale di comunicazione
134
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
con una destinazione: permette la creazione di produttori, di consumatori nonché di
messaggi.
I Message Producer e Message Consumer permettono, rispettivamente, l’invio dei
messaggi verso una certa destinazione e la loro successiva ricezione.
Figura 4.15: Modello di programmazione JMS
Si comprende che le fasi tipiche che uno sviluppatore JMS esegue per lo sviluppo di
applicazioni client sono:
• Creare una connessione utilizzando la factory di connessione
• Creare una sessione con le proprietà desiderate dalla connessione
• Se l'applicazione è un fornitore, creare un Message Producer, se invece è un
consumatore, creare un Message Consumer dalla sessione
• Iniziare a inviare o ricevere messaggi utilizzando il produttore o l'oggetto di
consumo. Il produttore utilizzerà la sessione per creare diversi tipi di messaggi
135
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
JMS supporta cinque diversi tipi di messaggi, come mostrato nella figura 4.16, i quali
vengono creati mediante i metodi dell’interfaccia Session, dalla quale estendono sia
l’interfaccia QueueSession che TopicSession.
L’interfaccia mette a disposizione i metodi create relativi ad ogni tipologia di message:
createTextMessage, createObjectMessage, createMapMessage, createBytesMessage e
create StreamMessage.
Per creare messaggi nel caso di tipologia Point-to-point è sufficiente invocare il metodo
create opportuno sulla QueueSession, mentre nel caso di Publish/Subscribe sull'oggetto
TopicConnection [9].
Figura 4.16: Tipi di messaggi
La ricezione dei messaggi in JMS può avvenire in due modi: pull o push.
Nel modello pull, un client JMS richiama un metodo per il consumatore del messaggio al
fine di ricevere un evento. Nel modello push, invece, i registri dei consumatori richiamano
un oggetto del consumatore o della sessione, ed i messaggi vengono ricevuti in modo
asincrono dalle invocazioni del metodo onMessage nell'interfaccia di callback.
136
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Ovviamente, non è possibile utilizzare contemporaneamente entrambi i metodi di
ricezione.
4.3.2.2 Apache ActiveMQ
ActiveMQ è un middleware orientato ai messaggi (MOM) [22] della Apache Software
Foundation, open source e compatibile con JMS 1.1, che fornisce elevata disponibilità,
prestazionalità, scalabilità, affidabilità e sicurezza per la messaggistica aziendale, e più in
generale per la enterprise integration.
Il lavoro di un MOM è quello di mediare eventi e messaggi tra le applicazioni distribuite,
garantendo che raggiungano i relativi destinatari. Quindi è fondamentale che esso sia
altamente performante e scalabile. L'obiettivo di ActiveMQ è quello di poter garantire un
integrazione delle applicazioni ti tipo standard-based, nonché orientata ai messaggi,
cercando di supportare quanti più linguaggi e piattaforme possibile.
Tale ESB offre una grande varietà di funzioni, alcune delle quali sono definite di seguito:
• JMS compliance: ActiveMQ è un'implementazione della specifica JMS 1.1
• Connettività: ActiveMQ fornisce una vasta gamma di opzioni di connettività, incluso
il supporto per i protocolli come HTTP/S, multicast IP, SSL, TCP, UDP, XMPP, e
altri. Il supporto per ad una gran quantità di protocolli equivale a una maggiore
flessibilità. Molti sistemi, infatti, utilizzano un particolare protocollo e non hanno
la possibilità di cambiare, per cui una piattaforma di messaggistica che supporta
molti protocolli rende possibile la loro adozione.
• Pluggable persistance and security: ActiveMQ fornisce molteplici tipi di
persistenza, tari i quali è possibile scegliere. Inoltre, la sicurezza in esso può essere
completamente personalizzata, sia in termini di autenticazione e che di
autorizzazione.
• Costruire applicazioni di messaggistica con Java: L’utilizzo più comune di
137
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
ActiveMQ è con applicazioni Java, per l'invio e la ricezione di messaggi. Questo
compito, ovviamente, implica l'uso delle API JMS.
• Client API: ActiveMQ fornisce le API client per molti linguaggi di programmazione
oltre Java, tra cui C / C ++, .NET, Perl, PHP, Python, Ruby e altri.
• Amministrazione semplificata: ActiveMQ non richiede un amministratore dedicato
perché fornisce funzioni di amministrazione potenti, ma la tempo stesso semplici
da usare.
ActiveMQ è stato pensato per essere utilizzato, così come le specifiche JMS, per le
comunicazioni remote tra le applicazioni distribuite. Esso infatti offre i vantaggi di
accoppiamento lasco, garantendo una quasi totale indipendenza trai i vari componenti,
nonché una totale asincronicità nelle comunicazioni.
Inoltre le applicazioni possono contare anche sulla capacità di ActiveMQ di garantire la
consegna dei messaggi. Questo consente di liberare lo sviluppatore dal vincolo di
preoccuparsi di come o quando il messaggio venga recapitato. Allo stesso modo, le
applicazioni che attendono la ricezione di messaggi non hanno alcun interesse a conoscere
il modo con cui siano stati inviati ad ActiveMQ. Questo è un grande beneficio in ambienti
eterogenei, permettendo ai client di essere scritti utilizzando linguaggi e protocolli diversi.
ActiveMQ funge da intermediario, permettendo l'integrazione e l'interazione eterogenea in
modo asincrono.
Ovviamente l’accoppiamento lasco garantito da tale ESB, porta numerosi vantaggi anche
nell’ambito dell’espandibilità del sistema. Infatti, a differenza di due moduli fortemente
accoppiati, per i quali la modifica di una dei due porterà inevitabilmente anche alla
modifica dell’altro, nel caso di componenti accoppiati in maniera lasca, ciò non accade.
Si comprende quindi che ActiveMQ offre ai sistemi una forte flessibilità dell'architettura
applicativa, permettendo ai concetti che circondano l’accoppiamento lasco di diventare
una realtà.
Ci sono molti scenari in cui ActiveMQ e messaggistica asincrona possono avere un impatto
138
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
significativo sull’architettura di un sistema. Ad esempio:
• Integrazione: ActiveMQ supporta differenti linguaggi di programmazione. Questo è
un vantaggio enorme se si considera come si potrebbe integrare applicazioni scritte
in linguaggi diversi su piattaforme diverse. In casi come questo, le API dei vari
client permettono l’invio e la ricezione di messaggi tramite ActiveMQ senza
preoccuparsi del linguaggio utilizzato.
• Ridurre l'accoppiamento tra le applicazioni: Come già discusso, architetture con un
elevato accoppiamento possono generare problemi per molte ragioni, soprattutto se
distribuite.
Architetture
debolmente
accoppiate,
invece,
mostrano
meno
dipendenze, rendendo più semplice la gestione di cambiamenti imprevisti.
• Nelle Event-Driven Architecture: Il disaccoppiamento e lo stile asincrono
dell’architettura descritta al punto precedente, conferisce al sistema una maggiore
scalabilità, nonché la capacità di gestire una quantità notevolmente maggiore di
client attraverso l’ottimizzazione, l'allocazione di memoria aggiuntiva, e così via
(noto come scalabilità verticale), anziché attraverso il solo aumento del numero di
nodi broker (noto come scalabilità orizzontale).
• Per migliorare la scalabilità delle applicazioni: Molte applicazioni utilizzano una
event-driven architecture al fine di fornire una elevata scalabilità, compresi settori
come l’e-commerce, il gioco online, etc. Attraverso la separazione di
un'applicazione lungo linee del dominio aziendale, utilizzando lo scambio
asincrono di messaggi, molte altre possibilità possono emergere. Basti pensare alla
capacità di progettare un'applicazione prevedendo un servizio per ogni specifico
compito, concetto che è alla base della SOA. Ogni servizio soddisfa una
determinata funzione e solo quella. Di conseguenza, le applicazioni sono costruite
attraverso la composizione di questi servizi, e la comunicazione tra i servizi si
ottiene utilizzando la messaggistica asincrona. Questo stile di progettazione
consente di introdurre concetti come quello del già noto Complex Event
Processing, utilizzando il quale, come sappiamo, le interazioni tra i componenti di
139
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
un sistema sono monitorati per ulteriori analisi [23].
4.3.2.3 Logica applicativa
Definite le tecnologie alla base del Bus utilizzato nella nostra architettura, è bene
riassumere le sue caratteristiche.
Come già menzionato nel paragrafo 4.3.2, l’ESB utilizzato è ActiveMQ, il quale è stato
utilizzato out of the box, cioè senza alcuna modifica o configurazione particolare. Si è
sfruttata la sua caratteristica di essere JMS compliant, così da basare l’intero processo di
comunicazione delle varie componenti del sistema sul protocollo JMS.
Precisamente, relativamente a quest’ultimo, si prevede l’utilizzo del modello di
comunicazione publish/subscribe, che consente di realizzare un meccanismo di
comunicazione uno-a-molti asincrono. Come sappiamo tale modello è basato sul concetto
di Topic, ed infatti sul BUS sono previsti proprio una serie di Topic, uno per ogni tipologia
di event source, e precisamente:
• IDS: sul quale viaggeranno gli eventi generati dal sistema IDS, sottoforma di
MapMessage
• Unfiltered_Syslog: sul quale viaggeranno gli eventi generati dai log di sistema,
sottoforma di TextMessage
• SYSLOG: sul quale viaggeranno gli eventi generati dai log di sistema, che
supereranno l’operazione di filtraggio, sottoforma di MapMessage
• LAMP: sul quale viaggeranno gli eventi generati dal sistema di controllo
dell’impianto di illuminazione, sottoforma di MapMessage
• CAMERA: sul quale viaggeranno gli eventi viaggeranno gli eventi generati dalle
videocamere di sicurezza, sottoforma di MapMessage
• BADGE_READER: sul quale viaggeranno gli eventi generati dai Badge Reader,
sottoforma di MapMessage
140
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Di seguito è mostrata una tabella che definisce per ogni Topic quali siano i moduli del
nostro sistema che fungono da Publisher e quali da Subscriber.
Tabella 4.1: Publisher e Subscriber dei topic previsti
TOPIC
PUBLISHER
SUBSCRIBER
IDS
Mediator (Wrapper IDS)
CEP Engine
Unfiltered_Syslog
Mediator (Wrapper Syslog)
Prefiltering-Aggregation
SYSLOG
Prefiltering-Aggregation
CEP Engine
LAMP
Mediator (Wrapper BACnet)
CEP Engine
CAMERA
Mediator (Wrapper BACnet)
CEP Engine
BADGE_READER
Mediator (Wrapper BACnet)
CEP Engine
Si può notare che quasi tutti i topic prevedano come Publisher il Mediator. L’eccezione è
data da quello SYSLOG, in quanto, come sarà chiarito quando verrà descritto il
componente di Prefiltering-Aggregation, gli eventi presenti su questo topic sono quelli
“sopravvissuti” ad una operazione di filtraggio, realizzata allo scopo di mantenere i soli
eventi relativi a connessioni SSH sugli host monitorati. Pertanto il suo Publisher è proprio
il componente di Prefiltering-Aggregation. Ovviamente, per lo stesso motivo, il topic
Unfiltered_Syslog prevede come Subscriber proprio l’appena citato componente.
Un’ultima cosa da chiarire relativamente al BUS, è che si prevede che la consegna dei
messaggi avvenga attraverso la modalità push, che, come accennato nel paragrafo 4.3.2.1,
è caratterizzata dal fatto che i Subscriber ricevano i messaggi in modo asincrono attraverso
le invocazioni del metodo onMessage nell'interfaccia di callback.
141
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
4.3.3 Mediator
Come già detto nel paragrafo 4.3, il Mediator è quel componente del sistema che media,
attraverso degli appositi wrapper, tra i sensori/dispositivi di rete e l’ESB, convertendo gli
eventi raw, cioè gli eventi prodotti da ogni singola sorgente, in un formato unico di
rappresentazione degli eventi, così da renderli trasportabili sul bus.
L’idea alla base di questo componente è quella di realizzare uno strato di adattamento:
• Completamente avulso dalla natura dei sensori, che rappresentano, come sappiamo,
la fonte di eventi della piattaforma, nonché dalle caratteristiche dei dati che
pervengono da essi
• Che sia una interfaccia comune a tutte i sensori connessi alla piattaforma
• Che sia in grado di ricevere, riconoscere e distribuire gli eventi verso l’Enterprise
Service Bus, e più precisamente verso gli appositi topic su di esso definiti.
La principale problematica relativa alla realizzazione di un componente di questo tipo è
stata sicuramente quella relativa alla natura diversa dei sensori che potessero essere
utilizzati come sorgenti di eventi.
Ogni sensore, infatti, hardware o software che sia, è in grado di produrre dati secondo un
proprio formato di rappresentazione. Ciò è dovuto, innanzitutto, alla tipologia
dell’informazione che ognuno di essi è in grado di trattare, cioè: audio, video, testo,
immagini, valori analogici, etc.. In secondo luogo, i dispositivi coinvolti sono spesso
basati su piattaforme proprietarie, magari obsolete, quindi volutamente o forzatamente non
dotate di flessibilità.
Al fine di risolvere questa problematica, si è pensato per tale componente un’architettura
basata su wrapper, uno per ciascuna tipologia di sensori. Tali wrapper non fanno altro che
ricevere gli eventi provenienti dalla tipologia di sensori a cui sono stati associati,
riconoscere gli eventi ricevuti, trasformare questi eventi in un formato intermedio
utilizzabile dal BUS, e poi inviarlo su quest’ultimo, e precisamente sul topic associato a
142
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
quella determinata tipologia di sensore. Ovviamente il formato intermedio sarà JMS, che
come abbiamo visto è supportato da ActiveMQ, e precisamente ogni evento sarà
trasformato in un MapMessage o TextMessage.
Vediamo ora più nel dettaglio come è implementato questo componente, nonché il suo
funzionamento.
4.3.3.1 Struttura e logica applicativa
Come abbiamo detto, tale componente è stato pensato e realizzato come un insieme di
wrapper, ognuno dei quali rappresenta una vera e propria interfaccia tra una specifica
tipologia di sensore e la nostra piattaforma.
Dati gli scenari previsti, nonché i relativi casi d’uso, (descritti nel capitolo 2) si è deciso di
prevedere tre wrapper:
• Wrapper_BACnet: rappresenta il wrapper per i tre dispositivi BACnet previsti
• Wrapper_IDS: rappresenta il wrapper per il sistema IDS
• Wrapper_SYS: rappresenta il wrapper per i log di sistema
Vediamoli più in dettaglio.
Wrapper_BACnet
Il diagramma delle classi per il Wrapper_BACnet, è quello di figura 4.17.
Come si può notare, la classe principale è quella denominata Wrapper_BACnet, la quale
prevede il metodo main, che consente l’avvio del wrapper nonché l’inizializzazione della
connessione con il bus, e quello bacnet_interaction, il quale si preoccupa di realizzare
l’intera logica necessaria alla comunicazione con i vari dispositivi BACnet. A tale scopo, è
stata utilizzata la libreria BACnet4J (descritta nel paragrafo 4.3.1.3.1), grazie alla quale il
wrapper funge da vero e proprio BACnet/IP Server. Esso infatti è in grado di gestire più di
143
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
un dispositivo BACnet contemporaneamente, sottoscrivendo una COV Notification per
ognuno di essi.
Figura 4.17: Wrapper_BACnet – Class Diagram
Ovviamente, per l’interazione con i dispositivi si prevede l’istanziazione di un apposito
listener, BACnet_Listener, che implementa l’interfaccia DeviceEventListener della libreria
BACnet4J. Pertanto, come si può vedere dal diagramma, tale classe prevede
un’implementazione di tutti i suoi metodi, ognuno di quali viene richiamato alla ricezione
del relativo messaggio proveniente da un dispositivo. Da notare che in realtà gli unici
metodi per cui non si è prevista l’implementazione di default sono iAmReceived e
covNotificationReceived, demandati rispettivamente alla gestione della ricezione di un
messaggio di I-AM e di una notifica COV.
Per quanto riguarda gli attributi, la classe Wrapper_BACnet prevede il LocalDevice, che
rappresenta il BACnet/IP Server, nonché il DEVICE_ID, il LOCAL_ADDRESS e il
BRODCAST_ADDRESS, che rappresentano rispettivamente l’ID del server (essendo esso
144
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
stesso visto come un device), l’indirizzo IP locale di quest’ultimo e quello di Broadcast
della rete su cui esso è in funzione. Di fondamentale importanza sono poi anche l’attributo
di tipo Session e quello BUS_ADDRESS, che invece rappresentano rispettivamente la
sessione stabilita con l’ESB e l’indirizzo IP per connettersi ad esso.
La classe BACnet_Listener prevede anch’essa una serie di attributi, tra cui ancora una
volta LocalDevice e Session, che sono passati al suo costruttore dalla classe
Wrapper_BACnet, nonché RemoteDevices, MessageProducers e Destinations, le quali
rappresentano rispettivamente una lista di RemoteDevice, con il quale il server interagisce,
una lista di MessageProducer e una lista di Destination, entrambe utilizzate per l’invio
degli eventi sui relativi topic dell’ESB. Da notare che tutte e tre le liste menzionate sono
popolate dal metodo iAmReceived alla ricezione di un messaggio di I-AM da ogni
dispositivo.
Relativamente al funzionamento delle due classi, esso è visibile nel sequence diagram di
figura 4.18, nel quale però sono mostrate solo le operazioni rilevanti.
Come si può notare da quest’ultimo, una volta avviato, il wrapper stabilisce una
connessione con l’ESB attraverso la ActiveMQConnectionFactory, alla quale viene passato
l’indirizzo del bus, e il metodo createConnection, per poi avviarla attraverso il metodo
start. Dalla connessione è poi creata una sessione con il metodo createSession.
In seguito viene istanziano un oggetto Wrapper_BACnet , sul quale viene invocato il
metodo bacnet_interaction. Tale metodo istanzia il LocalDevice, che rappresenta il
BACnet/IP Server, setta alcune proprietà con il metodo setProperty, come ad esempio il
numero di porta su cui il server è in ascolto, per poi instanziare ed associare il
BACnet_Listener al LocalDevice. Si può notare che al costruttore del listener sono passati
sia l’oggetto Session che quello LocalDevice, in quanto, come vedremo, quest’ultimo li
utilizza al fine di creare i topic e inviare su di essi gli eventi, con il primo, e per inviare le
richieste di COV ai dispositivi, con il secondo.
145
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Figura 4.18: Wrapper_BACnet – Sequence Diagram
146
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Successivamente viene inizializzato il device, attraverso il metodo initialize, e rispettando i
passi descritti nel paragrafo 4.3.1.3.1, si prevede l’invio in broadcast di un messaggio di
WHO-IS, così da conoscere i dispositivi in ascolto, i quali risponderanno con messaggio di
I-AM.
Infine si prevede l’invio, sempre in broadcast, di un messaggio di I-AM, così da garantire
ad ogni dispositivo di conoscere le informazioni relative al server.
Per quanto riguarda il BACnet_Listener, invece, il suo funzionamento è descritto dal
sequence diagram della figura 4.19. In essa viene mostrata che cosa accade nel momento
in cui viene ricevuto un messaggio di I-AM e una COV Notification da parte di un sensore.
Precisamente, nel primo caso, viene invocato il metodo iAmReceived, la cui
implementazione prevede di prelevare il Vendor ID del dispositivo, e sulla base di
quest’ultimo, e quindi del tipo di dispositivo, creare un ObjectIdentifier per l’oggetto
monitorato da quel device, nonché un’apposita Destination e MessageProducer per quella
tipologia di dispositivo. Queste ultime saranno poi aggiunte alle rispettive liste.
Ovviamente, attraverso le Destination saranno creati gli appositi topic. Di conseguenza, a
seconda che il dispositivo che abbia inviato l’I-AM sia una camera, un badge reader o il
sistema di controllo dell’illuminazione, sarà creato l’apposito topic, che potrà essere
rispettivamente CAMERA, BADGE_READER o LAMP.
Creati i topic, l’operazione successiva è l’invio della SubscribeCOVRequest verso il
dispositivo da cui si è ricevuto il messaggio di I-AM.
A questo punto, alla ricezione di una COV Notification, entra in gioco il metodo
covNotificationReceived, il quale non fa altro che creare, sulla base del tipo di device che
ha inviato la COV Notification, un MapMessage (i cui campi sono definiti nella tabella
4.2) con i dati ottenuti dalla COV, e inviare tale message sul topic relativo a quella
determinata tipologia di device. Ciò, ovviamente, dopo aver recuperato l’opportuna
Destination e MessageProducer dalla rispettive liste.
147
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Figura 4.19: BACnet_Listener – Sequence Diagram
148
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Tabella 4.2: Attributi MapMessage per ogni Device/Topic
ATTRIBUTI MAP MESSAGE
DEVICE/TOPIC
ATTRIBUTO
LAMP
DESCRIZIONE
lampID
ID della lampada fuori uso
camID
ID della camera che ha generato
l’evento
eventType
Tipo do evento generato dalla camera
CAMERA
(0 = Tampering
ID_employee
1 = Face Detection)
ID dell’impiegato riconosciuto
(nel caso di evento di Face Detection)
badgeID
ID del Badge Reader
BADGE_READER
ID_employee
ID dell’impiegato riconosciuto
Wrapper_IDS
Il diagramma delle classi per il Wrapper_IDS, è quello mostrato nella seguente figura.
Figura 4.20: Wrapper_IDS – Class Diagram
Come si può notare, la classe principale è quella denominata Wrapper_IDS, la quale è
dotata di un metodo main che consente l’avvio del Wrapper nonché l’inizializzazione
della connessione con il bus, del quale è noto l’indirizzo IP, definito dall’attributo
BUS_ADDRESS. Attraverso tale metodo, in realtà, questa classe istanzia anche un thread,
Thd_IDS, il quale si preoccuperà di gestire la comunicazione con il sistema IDS,
149
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
ricevendo gli alert da esso generati e immettendoli poi sul relativo topic del bus.
Tale classe, essendo un’estensione della classe Thread, prevede l’implementazione del
metodo run, che realizza la sua logica applicativa. Essa inoltre è caratterizzata
dal’'attributo Session, ricevuto dalla classe Wrapper_IDS e che rappresenta la sessione
instaurata con l’ESB, nonché da quelli PORT e BUFFER_SIZE, che rappresentano
rispettivamente il numero di porta e la dimensione del buffer relativi alla socket utilizzata
dal metodo run per comunicare con l’IDS. In realtà, la comunicazione non avviene
direttamente con l’IDS, bensì con RSYSLOG. Infatti si prevede che l’IDS immetta i propri
alert nei log di sistema, e che RSYSLOG li invii, all’interno di pacchetti, all’indirizzo IP su
cui è in esecuzione il wrapper e sul numero di porta PORT, cioè 2000.
Per quanto riguarda la logica applicativa delle due classi, essa è visibile nel sequence
diagram di figura 4.21, nel quale sono mostrate le sole operazioni rilevanti.
Come si può notare, una volta avviato, il wrapper crea una connessione, e la relativa
sessione, con l’ESB e la avvia. Successivamente, istanzia il Thd_IDS e lo avvia mediante il
metodo start. Alla chiamata di tale metodo, viene eseguito il metodo run della sopra citata
classe, all’interno del quale viene generato un topic, e precisamente quello IDS, e il
relativo MessageProducer. A questo punto viene istanziata una DatagramSocket che viene
posta in ascolto sulla porta 2000, mediante il metodo receive. Alla ricezione di un
DatagramPacket dalla socket, il metodo analizza il suo contenuto al fine di definire il tipo
di alert pervenuto, e sulla base di quest’ultimo genera un apposito MapMessage (i cui
campi variano al variare del tipo di alert, e i quali sono descritti nella tabella presentata di
seguito) e lo invia sul topic IDS.
150
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Figura 4.21: Wrapper_IDS – Sequence Diagram
151
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Tabella 4.3: Attributi MapMessage per ogni alert
ATTRIBUTI MAP MESSAGE
ALERT
ATTRIBUTO
Type
Tipo di alert
File
File oggetto dell’alert
(solo per Upload e Download)
“Suspicious File Upload”
or
Source address
Destination address
“20 or most connection to
an external IP address”
Indirizzo IP sorgente del l’Download o
Upload
“Suspicious File Download”
or
DESCRIZIONE
Indirizzo IP destinazione del l’Download
o Upload
Source Port
Porta sorgente del l’Download o
Upload
Destination Port
Porta destinazione del l’Download o
Upload
Type
Source address
TCP Portscan
Tipo di alert
Indirizzo IP sorgente del l’Download o
Upload
Destination address
Indirizzo IP destinazione del l’Download
o Upload
Wrapper_SYS
Il diagramma delle classi per il Wrapper_IDS, è quello mostrato in figura 4.22. Come si
può notare, la classe principale è quella denominata Wrapper_SYS, la quale, così come il
Wrapper precedentemente definito, è dotata di un metodo main che consente l’avvio del
Wrapper e l’inizializzazione della connessione con il bus. L’indirizzo di quest’ultimo è
noto, ed è definito dall’attributo BUS_ADDRESS. Attraverso il metodo main, in realtà,
questa classe istanzia anche un thread, Thd_SYS, il quale si preoccuperà di gestire la
152
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
comunicazione con RSYSLOG, ricevendo i log di sistema da esso gestiti e immettendoli
poi sul relativo topic del bus. Tale classe, essendo un’estensione della classe Thread,
prevede l’implementazione del metodo run, che realizza la sua logica applicativa. Essa
inoltre è caratterizzata dall’attributo Session, ricevuto dalla classe Wrapper_SYS e che
rappresenta la sessione instaurata con l’ESB, nonché da quelli PORT e BUFFER_SIZE,
che rappresentano rispettivamente il numero di porta e la dimensione del buffer relativi
alla socket utilizzata dal metodo run per comunicare con l’RSYSLOG.
Figura 4.22: Wrapper_SYS – Class Diagram
Per quanto riguarda la logica applicativa delle due classi, essa è visibile nel sequence
diagram di figura 4.23, nel quale sono mostrate le sole operazioni rilevanti.
Come si può notare, una volta avviato, il wrapper crea una connessione, e la relativa
sessione, con l’ESB e la avvia. Successivamente, istanzia il Thd_SYS e lo avvia mediante il
metodo start. Alla chiamata di tale metodo, viene eseguito il metodo run della sopra citata
classe, all’interno del quale viene generato un topic, e precisamente quello
Unfiltered_Syslog, sul bus e il relativo MessageProducer. A questo punto viene istanziata
una DatagramSocket, la quale viene posta in ascolto sulla porta 2001 mediante il metodo
receive. Alla ricezione di un DatagramPacket dalla socket, il metodo prende il suo
contenuto e lo immette all’interno di un TextMessage precedentemente creato, e lo invia
sul topic Unfiltered_Syslog.
153
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Figura 4.23: Wrapper_SYS – Sequence Diagram
154
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Definiti i tre wrapper è bene fare una considerazione. Come si può notare dalla loro
struttura, tutti e tre sono stati implementati in maniera tale da essere indipendenti, e quindi
eseguibili su macchine differenti. Ciò consente di poter scegliere senza alcun problema la
loro migliore ubicazione nell’ambito del sistema che si sta monitorando. Ad esempio, si
potrebbe prevedere di avviare il Wrapper_SYS sulla macchina adibita al raccoglimento dei
log di sistema di tutti gli host, nonché l’avvio del Wrapper_IDS sulla macchina su cui è
installato il sistema IDS, etc. Si comprende quindi che in realtà il componente Mediator è
un componente astratto, formato da tre wrapper indipendenti.
4.3.4 Prefiltering-Aggregation
Come già definito nel paragrafo 4.3, il componente Prefiltering-Aggregation realizza il
filtraggio degli eventi raw ed un loro eventuale arricchimento.
La motivazione alla base di questo componente è quella relativa alla capacità di ogni
sensore di generare, in un breve lasso temporale, una elevata quantità di dati, non tutti
necessari alla produzione di informazioni rilevanti.
Pertanto si è reso necessaria l’implementazione di un modulo che si preoccupi di effettuare
un’analisi degli eventi provenienti dalle varie fonti, al fine di determinare quelli realmente
necessari, che saranno mantenuti ed eventualmente arricchiti, e quelli non significativi,
che invece saranno scartati.
In realtà, come vedremo nel prossimo paragrafo, nella sua implementazione finale, tale
componente si preoccuperà solo ed esclusivamente di effettuare il filtraggio dei messaggi
provenienti dal Wrapper_SYS, allo scopo di far giungere al CEP Engine i soli messaggi
relativi alle operazioni di accesso, mediante protocollo SSH, agli host della rete
monitorata. Vediamo ora più nel dettaglio come è implementato questo componente,
nonché il suo funzionamento.
155
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
4.3.4.1 Struttura e logica applicativa
Il diagramma delle classi per il componente di Prefiltering-Aggregation, è mostrato nella
figura seguente.
Figura 4.24: Prefiltering-Aggregation – Class Diagram
Come si può notare, la classe principale è quella Prefiltering_Aggregation, la quale è
dotata di un metodo main che consente l’avvio del componente e l’inizializzazione della
connessione con il bus. L’indirizzo di quest’ultimo è noto, ed è definito dall’attributo
BUS_ADDRESS. In realtà, oltre a tali operazioni, tale metodo si preoccupa anche di
definire il topic del bus sul quale sarà in ascolto, e precisamente quello Unfiltered_Syslog,
nonché istanziare un apposito Listener, BusListener, mediante il quale riceverà i messaggi
che viaggiano su tale topic. Questo listener, come si può vedere dal class diagram, è
caratterizzato da un attributo di tipo Session, passato dalla classe Prefiltering-Aggregation,
e da uno di tipo MessageProducer, il quale è utilizzato nel metodo onMessage per l’invio
dei MapMessage sul bus. Infatti, tale metodo, che ricordiamo viene invocato alla ricezione
di ogni messaggio sul topic considerato, si preoccupa anche di effettuare la vera e propria
operazione di filtraggio, analizzando i TextMessage. Se questi non dovranno essere
scartati, vengono convertiti in MapMessage è immessi nuovamente sul bus, questa volta
però nel topic SYSLOG, attraverso il quale giungeranno al CEP Engine.
Di seguito è mostrato il sequence diagram relativo a questo componente.
156
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Figura 4.25: Prefiltering-Aggregation – Sequence Diagram
157
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Ovviamente, in esso sono mostrate le sole operazioni rilevanti.
Come si può notare, una volta avviato, il componente crea una connessione, e la relativa
sessione, con l’ESB e la avvia, mediante il metodo start. Successivamente, crea il topic sul
quale intende mettersi
in
ascolto
(Unfiltered_Syslog) e instanzia il
relativo
MessageConsumer, al quale poi associa, mediante il metodo setMessageListener,
un’istanza della classe BusListener. Come già detto precedentemente, a tale classe viene
passata la sessione generata.
Per quanto riguarda proprio il listener, nel momento in cui giunge un TextMessage sul
topic Unfiltered_Syslog, viene richiamato il suo metodo onMessage, il quale non fa altro
che utilizzare il metodo getText per prelevare il contenuto del messaggio, il quale sarà
successivamente analizzato. Precisamente, se il messaggio contiene le parole chiave ssh e
Accepted, che compaiono contemporaneamente nei soli log relativi alle agli accessi con
protocollo ssh, allora il messaggio sarà convertito in un MapMessage, che sarà poi inviato
sul topic SYSLOG del bus, mediante il metodo send richiamato su un oggetto
MessageProducer precedentemente instanziato.
Tale MapMessage sarà caratterizzato dai seguenti campi:
• Host e HostIP, che contengono relativamente l’host al quale è stato effettuato
l’accesso e il suo IP. Quest’ultimo viene ricavato dal componente stesso
• ExtIP e ExtPort, che contengono rispettivamente l’indirizzo IP e la porta esterni dal
quale è stato effettuato l’accesso
• User ed Auth_method, che rappresentano rispettivamente l’username dell’utente che
ha effettuato l’accesso e il metodo di autenticazione utilizzato
Da notare che, nel caso l’analisi del messaggio non vada a buon fine, cioè il messaggio
non rappresenta un accesso tramite ssh, allora esso viene ignorato e scartato.
158
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
4.3.5 CEP Engine
Il componente fondamentale di tutta l’architettura progettata è sicuramente il Complex
Event Processing Engine, il quale, come già accennato nei primi paragrafi, rappresenta il
modulo che si preoccupa di effettuare la correlazione tra gli eventi raw, generati dai
sensori ed opportunamente trasformati in MapMessage dal Mediator, nonché controllati
dal componente di prefiltering, al fine di generare eventi complessi relativi ai casi d’uso
presi in considerazione.
Precisamente questo componente deve essere in grado di:
• Ricevere gli eventi che viaggiano sui differenti topic dell’ESB
• Convertire tali eventi nel formato di rappresentazione degli eventi del motore di
correlazione utilizzato
• Correlare gli eventi convertiti, in real-time o near real-time, al fine di riconoscere i
casi d’uso presi in considerazione, e opportunamente descritti attraverso delle
regole
• Usufruire delle informazione relative alle abitudini degli utenti del sistema
dell’organizzazione monitorata, per raggiungere l’obbiettivo di cui al punto
precedente
• Generare eventi complessi al riconoscimento dei casi d’uso e stampa a video degli
alert relativi
Come già annunciato nel capitolo precedente, per la realizzazione di questo componente si
è scelto di utilizzare il CEP Engine Esper, il quale è anche stato ampiamente descritto
nello stesso. Le motivazioni principali che hanno portato alla sua scelta sono basate
sostanzialmente su alcune delle sue principali caratteristiche, e precisamente:
• È scritto in Java, e può facilmente essere integrato in applicazioni scritte con tale
linguaggio, proprio come la nostra piattaforma
• Consente l’analisi in real-time di flussi di eventi
159
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
• È basato sull’EPL, un linguaggio di event stream processing SQL-like molto
intuitivo, flessibile e potente, che consente di rappresentare in maniera semplice e
veloce qualsiasi scenario possibile, dal più semplice al più complesso
• Offre differenti modi di rappresentazioni degli eventi, così da potersi adattare alle
varie necessità
• Garantisce una semplice e rapida espandibilità e configurazione
Tutti questi aspetti, già discussi nel capitolo 3, hanno portato al suo utilizzo nell’ambito
della nostra piattaforma. In realtà, però, c’è da riconoscere un limite ad Esper, e cioè
l’assenza di auto-apprendimento, e cioè la capacità di apprendere automaticamente nuove
situazioni critiche. Ciò comporta la sua incapacità di poter rilevare situazioni non previste,
cioè per le quali non sono state previste delle regole. Ma in realtà, questo è un problema
che pesa su quasi tutti i CEP Engine rule-based.
Detto ciò, passiamo ora alla descrizione della struttura di questo componente.
4.3.5.1 Struttura
Prima di procedere alla definizione dettagliata delle classi che compongono questo
modulo, è bene soffermarci su alcuni elementi fondamentali, e cioè gli eventi.
Come abbiamo detto nel paragrafo precedente, e ancor prima nel capitolo 3, Esper è in
grado di supportare differenti modalità di rappresentazione di eventi, come Java POJO,
Java Map, XML Document, etc. Ognuna di queste presenta determinati vantaggi e
svantaggi, come mostrata nella tabella 3.1. Proprio valutando tale tabella, si è dedotto che
il miglior compromesso, rispetto ai parametri valutati, è dato dalla rappresentazione basata
su Java POJO.
Come ormai è noto, gli eventi raw da rappresentare sono otto, e sono:
• Lettura di un badge da parte di un Badge Reader
160
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
• Riconoscimento di un Port Scanning da parte dell’IDS SNORT
• Face Detection da parte di una videocamera
• Tampering Detection da parte di una videocamera
• Rilevamento del guasto ad una lampada da parte del sistema di controllo
dell’impianto di illuminazione
• Riconoscimento di un Download sospetto da parte dell’IDS SNORT
• Riconoscimento di un Upload sospetto da parte dell’IDS SNORT
• Riconoscimento di ripetuti tentativi di stabilire una connessione TCP da parte di un
host interno alla rete monitorata, verso un indirizzo IP esterno, da parte dell’IDS
SNORT
La loro rappresentazione è mostrata nella seguente figura.
Figura 4.26: Eventi – Class Diagram
Come si può notare, ogni evento è rappresentato da una apposita classe la quale è dotata di
una serie di attributi, che sono quelli che caratterizzano la particolare tipologia di evento,
nonché una serie di metodi che non sono altro che getter method che l’engine Esper
161
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
utilizzerà per prelevare le informazioni dagli eventi, qualora richieste all’interno di una
regola EPL. Come si può notare, gli attributi rispecchiano fedelmente i dati presenti
all’interno dei MapMessage inviati sul Bus dal Mediator. In realtà, però, da un’analisi più
attenta della figura 4.26 è possibile anche notare che sono presenti degli attributi in più. È
il caso degli attributi time, nonché di quelli posID/placeID. Tali attributi sono popolati,
come vedremo, dalla classe che si preoccupa di recuperare i messaggi dall’ESB, e
conterranno rispettivamente l’istante di arrivo dell’evento al CEP Engine e l’ID della
posizione in cui si trova il sensore che ha generato l’evento.
Oltre agli eventi raw, però il CEP Engine deve essere anche in grado di gestire gli eventi
complessi, che sono generati a valle del riconoscimento di uno dei casi d’uso descritti
mediante le regole. Precisamente i complex event previsti sono:
• Accesso sospetto al sistema, cioè da parte di un utente che non rispetta le sue
consuete abitudini
• Accesso al sistema con credenziali rubate
• Attacco TCP Gender Changer, con upload di file sospetto
• Attacco TCP Gender Changer, con Port Scanning
• Riconoscimento di un evento di Tampering su una videocamera
• Riconoscimento di un tentativo di accesso ad un area riservata con un badge
diverso dal proprio
In realtà, non per tutti questi eventi è stato necessario prevedere la realizzazione di un Java
POJO. Ciò infatti si è reso necessario solo per il primo, dato che, come vedremo, viene ad
essere generato e popolato attraverso una apposita View, concetto di Esper già descritto
nel paragrafo precedente. Per gli altri non si è reso necessario, in quanto la loro definizione
è avvenuta direttamente all’interno dell’EPL, che sarà successivamente illustrato.
In Figura 4.27 è mostrata la rappresentazione in Esper dell’evento Accesso sospetto al
Sistema. Come si può notare, esso da attributi che descrivono l’evento e da metodi.
Precisamente gli attributi sono:
162
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
• HostIp e Host: rappresentano rispettivamente l’identificativo dell’host, al quale sta
accedendo l’utente, e il suo indirizzo IP
• ExtIp e ExtPort: rappresentano rispettivamente l’indirizzo IP e il numero di porta
esterni dal quale si sta effettuando l’accesso
• userId ed authMethod: rappresentano l’username dell’utente che ha effettuato
l’accesso e il metodo di autenticazione utilizzato
• time e motivation: rappresentano l’istante in cui è avvenuto l’accesso e la
motivazione che spiega il perché quell’accesso è ritenuto sospetto. Sostanzialmente
quest’ultimo riporta quale o quali abitudini l’utente non ha rispettato.
Figura 4.27: SuspiciousAccessSystemEvent – Class Diagram
Come questi eventi sono generati, sarà discusso in seguito, quando saranno descritte le
regole EPL utilizzate per riconoscere i vari casi d’uso.
Vediamo ora la struttura vera e propria del componente, la quale è mostrata nella figura
4.28. Da quest’ultima si può facilmente notare la presenza di un solo event raw, e
163
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Figura 4.28: CEP Engine – Class Diagram
164
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
precisamente quello di UploadFileEvent. Ciò ovviamente è dovuto agli ovvi problemi di
ingombro, ma anche perché tutti gli altri event raw presentano le stesse relazioni visibili
per l’evento sopra citato.
La classe principale dell’intera struttura è quella MainCEvOS, la quale è dotata di un
metodo main che consente di configurare l’engine di Esper, definendo gli eventi che esso
dovrà gestire, nonché le View utilizzabili e le regole EPL da valutare all’arrivo di ogni
evento. Precisamente, al fine di definire quali eventi e view sono utilizzate, all’interno di
tale metodo è prevista una referenziazione per nome dei .class che rappresentano gli eventi
e la view. Da ciò si comprende la relazione esistente tra la classe MainCEvOS e le due
classi UploadFileEvent e AccessSystemViewFactory. Il metodo main inoltre, una volta
configurato l’engine e definite le regole, si preoccupa di istanziare un listener, MyListener,
il quale interviene ogni qualvolta viene trovato un matching con una delle regole.
Precisamente, in tale evenienza ad essere invocato è il suo metodo update, che si
preoccuperà di generare i dovuti alert.
Un’ulteriore relazione della classe MainCEvOS è quella esistente con la classe
BusConnection. Infatti, attraverso il metodo main, viene istanziato un oggetto di tale classe
che verrà utilizzato per stabilire una connessione con l’ESB, mediante il suo metodo
Connection. Tale metodo a sua volta istanzierà un oggetto della classe BusListener,
attraverso il quale riceverà i MapMessage che viaggiano sui vari topic dell’ESB, e per ogni
messaggio istanzierà un oggetto della classe che rappresenta quel determinato tipo di
evento, e lo invierà all’engine di Esper.
Per quanto riguarda la classe AccessSystemViewFactory, come sappiamo dal capitolo
precedente, essa rappresenta una classe factory per una View, di conseguenza il suo
compito è quello di accettare e controllare i parametri della vista, che in questo caso
corrispondono ai campi di un evento di tipo AccessSystemEvent, nonché di creare
un’istanza della View. In particolare tale classe istanzia la AccessSystemView, il cui
compito è verificare, attraverso i dati ricevuti, se l’evento a cui essi fanno riferimento
rappresenti o meno un accesso sospetto. A tale scopo controlla le abitudini dell’utente,
165
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
memorizzate in una HashMap composta di oggetti di tipo User e instanziata dalla factory.
Nel caso in cui dal controllo si deduce che l’accesso è sospetto, allora sarà generato un
evento del tipo SuspiciousAccessSystemEvent.
Da notare che la classe User, rappresenta un generico utente, ed è infatti caratterizzata
dall’attributo userID, che rappresenta l’ID dell’utente, nonché da quelli uses_auh_method,
uses_host e uses_IP, che sono JavaMap che contengono rispettivamente tutti i metodi di
autenticazione, gli host e gli IP esterni utilizzati da quell’utente.
Approfondiamo ora la logica applicativa di ogni singola classe.
4.3.5.2 Logica applicativa
Per quanto riguarda il funzionamento della classe MainCEvOS, esso è ben visibile dal
sequence diagram seguente, nel quale sono mostrate solo le operazioni rilevanti.
Figura 4.29: MainCEvOS – Sequence Diagram
166
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Come si può notare, nel metodo main per prima cosa viene istanziato un oggetto
Configuration, attraverso il quale avviene la configurazione del motore di Esper.
Precisamente è prevista l’aggiunta dei tipi di eventi che esso dovrà gestire, mediante il
metodo addEventType, nonché delle view utilizzabili, mediante il metodo addPluginView.
Successivamente, dopo aver istanziato, attraverso il metodo getProvider della classe
EPServiceProviderManager, una istanza dell’engine di Esper si prevede la definizione
delle regole EPL per la correlazione (che saranno mostrate nel paragrafo successivo) e la
loro creazione, con il metodo createEPL dell’interfaccia EPAdministartor. Tale metodo
restituirà un apposito Statement, al quale sarà associato l’istanza della classe MyListener,
in maniera tale che ogni matching trovato per quella determinata regola, porterà
all’invocazione del suo metodo update.
Dopo tale operazione, si istanzia un oggetto della classe BusConnection, al quale viene
passato l’oggetto EPServiceProvider, sul quale viene poi richiamato il metodo
Connection, che si preoccuperà proprio di effettuare la connessione al Bus.
Vediamo proprio il comportamento di questa classe, il quale è mostrato nel sequence
diagram di figura 4.30. Come si può notare, il metodo Connection stabilisce una
connessione con l’ESB attraverso la ActiveMQConnectionFactory, alla quale viene
passato l’indirizzo del bus, e il metodo createConnection, per poi avviarla attraverso il
metodo start. Dalla connessione è poi creata una sessione con il metodo createSession,
attraverso la quel vengono ad essere definiti i topic sui quali mettersi in ascolto. Infatti per
ognuno di essi si definisce una Destination e un Consumer. A quest’ultimo sarà associato
l’istanza della classe BusListener, mediante il metodo setMessageListener.
Alla ricezione di un messaggio su uno dei topic definiti, verrà richiamato il metodo
onMessage del listener, il quale, sulla base del topic sul quale si è ricevuto l’evento, non
farà altro che istanziare un oggetto della classe che descrive quella determinata tipologia di
evento, per poi inviarla all’engine Esper mediante il metodo sendEvent. Ciò permetterà
Esper di elaborare quell’evento. Infatti a questo punto l’engine cercherà eventuali match
167
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Figura 4.30: BusConnection – Sequence Diagram
168
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
con le regole definite, e in tal caso va a richiamare il metodo update della classe
MyListener. Il sequence diagram di questa classe è mostrato in figura 4.31.
Da esso è possibile notare che, quando viene invocato il metodo update, questo non faccia
altro che prendere i dati dall’evento generato, soprattutto il tipo di evento, che in questo
caso è un complex event generato a valle della correlazione, in maniera tale da generare
alert differenti proprio sulla base dell’evento complesso generato, o meglio del caso d’uso
rilevato.
Figura 4.31: MyListener – Sequence Diagram
Le ultime classi da analizzare sono quella AccessSystemViewFactory e la relativa
AccessSystemView. La prima, e precisamente il suo metodo makeView, entra in azione nel
momento in cui, all’interno di una opportuna regola EPL, viene richiesto l’utilizzo della
AccessSystemView. Tale metodo, come visibile nel sequence diagram di figura 4.32, non
169
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Figura 4.32: AccessSystemViewFactory – Sequence Diagram
170
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
fa altro che istanziare una HashMap di oggetti di tipo User, che come già accennato
contiene le abitudini degli utenti, nonché istanzia un oggetto della classe
AccessSystemView, al quale passa tale HashMap. Alla ricezione di un evento da parte della
view, viene ad essere richiamato il suo metodo update, il quale, dopo aver valutato i
parametri ottenuti, richiama il metodo verify_access, da noi implementato, che non fa altro
che verificare se l’accesso effettuato da quel determinato utente rispetta le sue normali
abitudini. In caso affermativo, il metodo ritornerà il valore booleano false e la view
termina il suo operato. In caso negativo invece, il metodo restituirà true e
sarà invocato il metodo postData, il quale istanzierà un SuspiciuosAccessSystemEvent,
passandolo alla regola EPL che ha richiesto la view, attraverso il metodo updateChildren.
4.3.5.3 Regole EPL
Diamo ora uno sguardo, alle regole EPL implementate sia al fine di rilevare i casi d’uso
descritti nel capitolo 2, sia di generare gli eventi complessi ad essi associati.
Ma andiamo per ordine, e consideriamo ogni singolo caso d’uso.
Building Security: Rilevamento di un falso positivo per Camera Tampering
Ricordiamo che tale caso d’uso è relativo alla possibilità che venga generato un falso
positivo per evento di Tampering su una camera del sistema di videosorveglianza.
Supponiamo infatti che, di notte, in un certo istante si verifica il guasto di una lampada,
che non viene tracciato. La telecamera, che è puntata nell’area illuminata da quella
lampada, interpreterà la variazione di luminosità come un evento di tampering e genererà
un allarme, che rappresenta ovviamente un falso positivo.
La regola pensata per riconoscere una situazione del genere è basata sull’idea che un
evento di Tampering, non sia un falso positivo se esso non è preceduto, in una finestra
temporale di 10 secondi, da eventi di LampDown, relativi a lampade che si trovano nella
171
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
stessa posizione della videocamera che ha generato l’evento di Tampering. Pertanto la
regola EPL è la seguente:
insert into Scenario1Stream
select TE.camID as camID, TE.posID as posID, TE.time as time
from TamperingEvent as TE
where not exists
(select * from LampDownEvent.win:time(10 sec) as LDE
where TE.posID=LDE.posID)
Si comprende che se la regola produce un riscontro, l’evento complesso viene inserito
nello stream Scenario1Stream, e sarà caratterizzato dagli attributi camID, posID e time.
Building Security: Rilevamento di un accesso non autorizzato
Come già descritto nel capitolo 2, tale caso d’uso è relativo alla possibilità che un
dipendete dell’organizzazione, o una persona esterna, acceda ad una delle aree sensibili
utilizzando un badge di un altro dipendente.
In questa ipotesi, il sistema di controllo degli accessi verifica l'identità della persona che
sta accedendo all’area riservata attraverso il badge magnetico, che è stato opportunamente
inserito nel badge reader, autorizzandolo.
Contestualmente, la videocamera posta all’ingresso dell’area effettua la Face Detection e
rileva il volto della persona che ha richiesto l'accesso, identificandolo (nel caso in cui sia
un dipendente dell’organizzazione). Ovviamente, al fine di riconoscere il tentativo di
accesso, è necessario correlare le due informazioni. A tale scopo, l’idea alla base è quella
che un accesso sia non autorizzato se un BadgeReaderEvent, generato da un determinato
Badge Reader,
è
seguito,
in
una
finestra
temporale
di 6 secondi, da un
FaceDetectionEvent, proveniente dalla videocamera che riprende quel determinato lettore,
i quali però prevedono un valore differente per l’attributo ID_employee. Pertanto la regola
EPL è la seguente:
172
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
insert into Scenario2Stream
select BRE.ID_employee as idBadge, FDE.time as time,
FDE.ID_employee as idFace, BRE.placeID as placeID
from pattern[every BRE=BadgeReaderEvent ->
FDE=FaceDetectionEvent((BRE.placeID=FDE.placeID) and
(BRE.ID_employee!=FDE.ID_employee))
where timer:within(6 sec)]
Si comprende che se la regola produce un riscontro, l’evento complesso viene inserito
nello stream Scenario2Stream, e sarà caratterizzato dagli attributi idBadge, time, idFace e
placeID.
Network Security: Rilevamento di una intrusione con credenziali rubate
Ricordiamo che tale caso d’uso è relativo alla possibilità che le credenziali di un utente
siano state rubate, e un attacker malintenzionato acceda alla rete dell’organizzazione
attraverso queste ultime. Si suppone, inoltre, che l’attacker, dopo aver effettuato l’accesso
al sistema con le credenziali rubate, effettui il download di un file sospetto da internet
attraverso un server dell’organizzazione.
Per rilevare questo caso d’uso, l’idea alla base è quella di considerare che stia avvenendo
una intrusione di questo tipo se un SuspiciousAccessSystemEvent, cioè un accesso
effettuato da un utente senza rispettare la sue normali abitudini, è seguito, in una finestra
temporale di cinque minuti, da un DownloadFileEvent, cioè il download di un file
sospetto, il cui indirizzo IP di destinazione coincida con quello dell’host al quale l’utente
ha acceduto. Pertanto, in questo caso, sono necessarie due regole EPL. La prima che
verifica se un determinato AccessSystemEvent rappresenti o meno un accesso sospetto.
Ciò, in particolare, viene realizzato attraverso l’utilizzo della AccessSystemView, indicata
nella regola come accessSystemPV:
insert into SuspiciousAccessSystemEvent
select * from pattern[every
ASE=AccessSystemEvent].accessSystem:accessSystemPV
(ASE.hostIp, ASE.host, ASE.extIp, ASE.extPort,
ASE.time, ASE.authMethod, ASE.userId)
173
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
La seconda invece, realizza la vera e propria correlazione:
insert into ScenarioR1Stream
select SASE.hostIp as hostIp, SASE.host as host, SASE.extIp as
extIp, SASE.extPort as extPort, SASE.authMethod as authMethod,
SASE.userId as userId, SASE.motivation as motivation, SASE.time as
aTime, DFE.sourceIp as sourceIp, DFE.sourcePort as sourcePort,
DFE.time as dTime, DFE.file as file, DFE.destinationIp as
destDown, DFE.destinationPort as destinationPort
from pattern[every SASE=SuspiciousAccessSystemEvent->
DFE=DownloadFileEvent(SASE.hostIp=DFE.destinationIp)
where timer:within(5 min)]
Si comprende che se la regola produce un riscontro, l’evento complesso viene inserito
nello stream ScenarioR1Stream, e sarà caratterizzato dagli attributi hostIp, host, extIp,
extPort, authMethod, userId, motivation, aTime, sourceIp, sourcePort, dTime, file,
destDown e destinationPort.
Network Security: Rilevamento di un attacco TCP Gender Changer
Ricordiamo che tale caso d’uso è relativo alla possibilità che l’organizzazione monitorata
subisca un attacco del tipo TCP Gender Changer. In particolare ricordando i passi descritti
nel paragrafo 2.4.2, una delle idee per la rilevazione di tale attacco è quella di verificare
che un evento di SuspiciousAccessSystemEvent non sia seguito, in una finestra temporale
di due minuti, da un UploadFileEvent che presenti come IP destinazione l’IP dell’host
utilizzato per quel determinato accesso sospetto, e inoltre che questa sequenza non sia a
sua volta seguita, in una finestra temporale di tre minuti, da un MultyTCPconnEvent che
presenti come hostIP lo stesso dell’ SuspiciousAccessSystemEvent. Pertanto si prevedono
due regole. La prima intercetta la prima sequenza di eventi:
insert into AccSysAndUpFile
select SASE.hostIp as hostIp, SASE.host as host, SASE.extIp as
aExtIp, SASE.extPort as aExtPort, SASE.authMethod as authMethod,
SASE.userId as userId, SASE.motivation as motivation, SASE.time as
aTime, UFE.sourceIp as sourceIp, UFE.sourcePort as sourcePort,
UFE.time as uTime, UFE.file as file, UFE.destinationIp as destUpl,
UFE.destinationPort as destinationPort
174
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
from pattern[every SASE=SuspiciousAccessSystemEvent->
UFE=UploadFileEvent(SASE.hostIp=UFE.destinationIp)
where timer:within(2 min)]
Mentre la seconda, correla la prima sequenza con gli eventi di MultyTCPconnEvent:
insert into ScenarioR2aStream
select ASAUF.hostIp as hostIp, ASAUF.host as host, ASAUF.aExtIp as
aExtIp, ASAUF.aExtPort as aExtPort,
ASAUF.authMethod as authMethod, ASAUF.userId as userId,
ASAUF.motivation as motivation, ASAUF.aTime as aTime,
ASAUF.sourceIp as sourceUpl, ASAUF.sourcePort as sourceUplPort,
ASAUF.uTime as uTime, ASAUF.file as file, ASAUF.destUpl as
destUpl, ASAUF.destinationPort as destUplPort, MTCE.hostIp as
mHostIp, MTCE.hostPort as mHostPort, MTCE.extIp as mExtIp,
MTCE.extPort as mExtPort, MTCE.time as mTime
from pattern[every ASAUF=AccSysAndUpFile->
MTCE=MultyTcpConnEvent(ASAUF.hostIp=MTCE.hostIp)
where timer:within(3 min)]
Si comprende che se la regola produce un riscontro, l’evento complesso viene inserito
nello stream ScenarioR2aStream, e sarà caratterizzato dagli attributi hostIp, host, aExtIp,
aExtPort, authMethod, userId, motivation, aTime, sourceUpl, sourceUplPort, uTime, file,
desUpl, destUplPort, mHostIp, mHostPort, mExtIp, mExtPort ed mTime.
Allo scopo poi di rilevare un attacco TCP Gender Changer, che però sia realizzato
attraverso l’ausilio di un Port Scanning, è stata realizzata un’altra regola la quale genera
un riscontro se un PortScanEvent è seguito, in una finestra temporale di 5 minuti, da un
MultyTCPconnEvent, il cui hostIP coincida con l’IP di destinazione del Port Scanning.
Pertanto la regola è:
insert into ScenarioR2bStream
select MTCE.hostIp as hostIp, MTCE.hostPort as mHostPort,
MTCE.extIp as mExtIp, MTCE.extPort as mExtPort, MTCE.time as
mTime, PS.sourceIp as pExtIp, PS.time as pTime
from pattern[every PS=PortScanEvent-> MTCE=MultyTcpConnEvent
(PS.destinationIp=MTCE.hostIp)
where timer:within(5 min)]
Si comprende che se la regola produce un riscontro, l’evento complesso viene inserito
175
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
nello stream ScenarioR2bStream, e sarà caratterizzato dagli attributi hostIp, mHostPort,
mExtIp, mExtPort, mTime, pExtIp e pTime.
176
Capitolo 5
Verifica del funzionamento del sistema CEP
5.1 Introduzione
Dopo aver mostrato in dettaglio l’architettura e il funzionamento della piattaforma oggetto
di questo lavoro di tesi, si vuole ora focalizzare l’attenzione sul comportamento della
stessa nell’ambito della simulazione di alcuni dei casi d’uso descritti nel capitolo 2. Ciò
allo scopo di dimostrare sia il suo corretto funzionamento, nonché la sua capacità di
soddisfare i requisiti previsti in fase di progettazione.
Saranno presi in considerazioni due dei quattro casi d’uso previsti, uno per ogni scenario,
così da mettere in luce il funzionamento di ogni componente dell’architettura in situazioni
reali, in quanto non tutti sono sempre utilizzati.
Precisamente i casi d’uso simulati saranno:
• Rilevamento di una intrusione con credenziali rubate, per lo scenario relativo alla
Network Security
• Rilevamento di un accesso non autorizzato, per lo scenario relativo alla Building
Security
Per ognuno di essi sarà fornita, per semplicità, nuovamente una breve descrizione, nonché
una descrizione del comportamento di ogni singolo componente del sistema in quel
preciso caso, la quale sarà corredata da opportuni screenshot ed estratti del codice
177
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
sorgente.
Prima, però, viene definito brevemente il sistema di riferimento sul quale sono basate le
simulazioni realizzate.
5.2 Sistema di riferimento
Il sistema di riferimento pensato per la piattaforma implementata, cioè un sistema in cui
l’adozione di CEvOS può risultare utile, è quello relativo ad una generica organizzazione,
nella quale si prevede che:
• I dipendenti possano accedere agli host, durante l’orario lavorativo, attraverso
connessioni remote basate sul protocollo SSH
• Le aree sensibili e i varchi di accesso all’organizzazione siano monitorate mediate
appositi sistemi di sicurezza
• Il sistema di illuminazione sia costantemente monitorato
Precisamente, si prevede che un tale sistema sia costituito da:
• 5 macchine utente (SM_0, SM_1, SM_2, SM_3, SM_4), alle quali i dipendenti
possono connettersi in remoto
• 1 macchina (LOG_HOST) su cui sono inviati i log di sistema delle 5 macchine
utente
• 1 macchina (IDS_HOST) su cui è installato l’IDS
• 1 macchina (BACNET_HOST) su cui arrivano gli eventi generati dai sistemi di
sicurezza BACnetIP, che sono:
o 2 telecamere BACnetIP , installate in prossimità di due zone sensibili
o 2 telecamere BACnetIP con modulo di Face Detection, installate in
prossimità dei due ingressi
o 2 badge reader BACnetIP, installati in prossimità dei due ingressi
178
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
o 4 sensori per il controllo dell’impianto di illuminazione BACnetIP, ognuno
installato in prossimità delle telecamere
Ovviamente tutte le macchine e i dispositivi di sicurezza sono connessi in rete tra loro
attraverso un apposito switch di rete, e in particolare i componenti di relativi alla building
security sono collegati a quest’ultimo mediante un access point WiFi. Lo switch è inoltre
connesso ad un gateway che consente l’accesso alla rete Internet.
Come si può facilmente comprendere, l’utilizzo della piattaforma implementata in un
sistema siffatto produce l’indubbio vantaggio di mettere in comunicazione le varie fonti di
informazioni, correlando i dati da esso generati, così da garantire una maggiore sicurezza
sia in termini di Network Security che di Building Security.
L’installazione di CEvOS in tale organizzazione prevede:
• Aggiunta di un host (CEVOS_HOST) su cui sarà avviato il componente CEP
Engine, nonché l’ESB Apache ActiveMQ
• Esecuzione del componente di Prefiltering-Aggregation e del Wrapper_SYS sulla
macchina LOG_HOST
• Esecuzione del Wrapper_IDS sulla macchina IDS_HOST
• Esecuzione del Wrapper_BACnet sulla macchina BACNET_HOST
Nella figura seguente è mostrato il sistema di riferimento configurato nel modo appena
descritto.
179
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Figura 5.1: Sistema di riferimento
5.3 Casi d’uso simulati: Rilevamento di una intrusione con credenziali rubate
Il primo caso d’uso simulato è quello relativo alla possibilità che le credenziali di un
utente
siano
state
rubate,
e
un
attacker
malintenzionato
acceda
alla
rete
dell’organizzazione attraverso queste ultime. Si suppone, come già descritto nel capitolo 2,
che l’attacker, dopo aver effettuato l’accesso al sistema, effettui il download di un file con
estensione sospetta da internet, ad es. un file con estensione .exe, utilizzando l’host
dell’organizzazione a cui si è connesso.
In questo caso, i sensori che intervengono sono due, e precisamente sono il sistema di
gestione dei log RSYSLOG, che invia i log all’apposito wrapper tramite una socket, e
l’Intrusion Detection System SNORT, che immette i propri alert all’interno dei log di
sistema attraverso i quali arriveranno all’apposito wrapper, anch’essi tramite socket.
Ovviamente da RSYSLOG giungerà al sistema la segnalazione di accesso da parte di un
180
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
utente ad uno degli host dell’organizzazione monitorata, mentre da SNORT giungerà
l’alert relativo al download di un file sospetto.
La nostra piattaforma, attraverso la correlazione di questi due eventi, è in grado di
riconoscere il tentativo di intrusione e generare un apposito alert.
5.3.1 Comportamento del sistema
Come già annunciato nell’introduzione di questo capitolo, non tutti i moduli del sistema
implementato sono sempre utilizzati. In particolare, nello scenario appena descritto
entrano in azione cinque componenti, e precisamente:
• Il Wrapper IDS
• Il Wrapper SYSLOG
• L’Enterprise Service Bus
• Il componente di Prefiltering-Aggregation
• Il CEP Engine
Vediamo quindi come ognuno di essi lavoro nell’ambito di questo caso d’uso.
5.3.1.1 Wrapper Syslog
Il Wrapper Syslog, come noto, è il componente dell’architettura che si preoccupa di
comunicare con il sistema di gestione dei log di sistema, nello specifico con RSYSLOG,
allo scopo di ricevere i log generati dai vari host e darli in pasto al sistema.
Come già descritto nel capitolo 4, tale componente per prima cosa effettua la connessione
al bus e successivamente instanzia un thread che rappresenta il wrapper vero e proprio.
Di seguito è mostrato un estratto di codice del metodo main della classe Wrapper_SYS.
181
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
…
ConnectionFactory factory= new
ActiveMQConnectionFactory(BUS_ADDRESS);
javax.jms.Connection connection;
try {
connection = factory.createConnection();
connection.start();
System.out.println("Connected to bus");
// Create a Session
Session session =
connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
//Create and start Thread Syslog
Thd_Sys TSys = new Thd_Sys(session);
TSys.start();
} catch (JMSException e) {
e.printStackTrace();
}
…
Come si può vedere, una volta istanziato, il thread viene anche lanciato. Quest’ultimo
effettua la creazione del topic Unfiltered_Syslog sul bus, genera un producer su di esso, e
instanzia una socket sul porto 2001, sul quale si pone in ascolto. Infatti proprio su tale
porto, come già anticipato nel capitolo precedente, è stato configurato l’inoltro dei log da
parte di RSYSLOG.
Nel caso d’uso simulato, si è previsto che venga effettuato un accesso dall’utente raffaele
sull’host raffaele-HP-Pavillion-dv5-Notebook-PC. Tale accesso è stato effettuato
dall’indirizzo IP 192.168.1.111 e prevede come metodo di autenticazione una password.
Pertanto alla realizzazione dell’accesso, RSYSLOG genera un apposito log, e
precisamente:
<38>Sep 30 17:38:30 raffaele-HP-Pavillion-dv5-Notebook-PC
sshd[3462]: Accepted password for raffaele from 192.168.1.111 port
51028 ssh2
182
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Tale log sarà inviato sul porto 2001, e sarà quindi ricevuto dal Wrapper Syslog, come
mostrato nella figura seguente.
Figura 5.2: Output del Wrapper Syslog
Si può notare che in realtà il wrapper non riceve il solo log descritto, ma anche altri, i
quali sono stati generati allo scopo di mostrare, successivamente, le capacità di filtraggio
del componente di Prefiltering-Aggregation. Dalla figura precedente è anche possibile
vedere la successiva operazione svolta dal wrapper, il quale infatti, alla ricezione del log
sulla socket, non fa altro che generare un apposito TextMessage, popolato con l’intero log,
ed immetterlo sul topic precedentemente definito. Fatto ciò, si rimette nuovamente in
ascolto sulla socket.
Di seguito è mostrato un estratto del codice sorgente del metodo run della classe Thd_Sys
che realizza le operazioni descritte:
public synchronized void run(){
try {
// Create the destination Topic
Destination destination =
session.createTopic("Unfiltered_Syslog");
// Create a MessageProducer
MessageProducer producer =
session.createProducer(destination);
…
DatagramSocket socket = new DatagramSocket(PORT);
DatagramPacket packet = new DatagramPacket(new
byte[BUFFER_SIZE],BUFFER_SIZE);
String Sys_message = null;
183
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
TextMessage TextMess = null;
while(true) {
socket.receive(packet);
Sys_message = new
String(packet.getData(),0,packet.getLength());
…
TextMess = session.createTextMessage();
TextMess.setText(Sys_message);
…
producer.send(TextMess);
}
} catch (JMSException e) {
e.printStackTrace();
}
…
}
5.3.1.2 Wrapper IDS
Come sappiamo, il Wrapper IDS è il componente dell’architettura che si preoccupa di
comunicare con il sistema di gestione dei log di sistema, nello specifico con RSYSLOG,
allo scopo di ricevere gli alert generati dall’IDS SNORT.
Come per il wrapper SYSLOG, anche tale componente prevede per prima cosa la
connessione al bus e successivamente l’istanziazione di un thread che rappresenta il
wrapper vero e proprio. Di seguito è mostrato un estratto di codice del metodo main della
classe Wrapper_IDS.
…
ConnectionFactory factory= new
ActiveMQConnectionFactory(BUS_ADDRESS);
javax.jms.Connection connection;
try {
connection = factory.createConnection();
connection.start();
System.out.println("Connected to bus");
// Create a Session
Session session =
connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
184
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
//Create and start Thread IDS
Thd_IDS TIDS = new Thd_IDS(session);
TIDS.start();
} catch (JMSException e) {
e.printStackTrace();
}
…
Come si può vedere, una volta istanziato, il thread viene anche lanciato. Quest’ultimo
effettua la creazione del topic IDS sul bus, genera un producer su di esso, e instanzia una
socket sul porto 2000, sul quale si pone in ascolto. Infatti proprio su tale porto, come già
anticipato nel capitolo precedente, è stato configurato l’inoltro dei log relativi agli alert di
SNORT da parte di RSYSLOG.
Nel caso d’uso simulato, si è previsto che venga effettuato un download di un file con
estensione .exe dall’IP dell’host sul quale era avvenuto l’accesso da parte dell’utente
raffaele. Alla realizzazione del download viene immediatamente sollevato un alert da
parte di SNORT, il quale è stato istruito in maniera tale da intercettare download relativi a
file con estensioni sensibili, tipo i .exe. Inoltre è stato configurato in maniera tale da
immettere tali alert all’interno dei log di sistema. Di conseguenza sarà generato un
apposito log, e precisamente:
<38>Sep 30 17:38:44 raffaele-HP-Pavillion-dv5-Notebook-PC snort:
[1:900000007:3] Suspicious File Download – extension.exe[Priority:
2]: {TCP} 62.149.140.72:80 -> 192.168.1.108:36574
Tale log sarà inviato sul porto 2000 da parte di RSYSLOG, e sarà quindi ricevuto dal
Wrapper IDS, come mostrato nella figura seguente.
Figura 5.3: Output del Wrapper IDS
185
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Da tale figura è anche possibile notare la successiva operazione svolta dal wrapper, il
quale infatti, alla ricezione del log sulla socket, non fa altro che analizzarne il contenuto, al
fine di classificare l’alert ricevuto tra quelli che in grado di gestire, che ricordiamo sono:
• Suspicious File Download
• Suspicious File Upload
• 20 or most connections to an external IP address
• TCP Port scan
Dopo aver rilevato che si tratta di un alert del tipo Suspicious File Download, il wrapper
genera un apposito MapMessage, popolato con le principali informazioni contenute in
esso. La creazione di tale messaggio avviene in seguito ad un’operazione di parsing del
testo ricevuto, così da poter estrarre tutte le informazioni di interesse. Una volta generato il
messaggio, questo viene immesso sul topic precedentemente definito. Fatto ciò, il wrapper
si rimette nuovamente in ascolto sulla socket.
Di seguito è mostrato un estratto del codice sorgente del metodo run della classe Thd_IDS
che realizza le operazioni descritte:
public synchronized void run(){
try {
// Create the destination Topic and Message
// Producer
Destination destination =
session.createTopic("IDS");
MessageProducer producer =
session.createProducer(destination);
…
DatagramSocket socket = new DatagramSocket(PORT);
DatagramPacket packet = new DatagramPacket(new
byte[BUFFER_SIZE],BUFFER_SIZE);
String IDS_message = null;
while(true) {
socket.receive(packet);
IDS_message = new
String(packet.getData(),0,packet.getLength());
…
MapMessage mymap = null;
if(IDS_message.contains("Suspicious File
Download")){
186
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
String file = IDS_message.substring(…);
String source_address =
IDS_message.substring(…);
String source_port = IDS_message.substring(…);
String destination_address =
IDS_message.substring(…);
String destination_port =
IDS_message.substring(…);
…
mymap.setString("File", file);
mymap.setString("Source_address",
source_address);
mymap.setString("Source_port", source_port);
mymap.setString("Destination_address",
destination_address);
mymap.setString("Destination_port",
destination_port);
producer.send(mymap);
}else
if(IDS_message.contains("20 or most connections
to an external IP address")){
…
}else
if(IDS_message.contains("Suspicious File
Upload")){
…
}else
if(IDS_message.contains("TCP Portscan")){
…
}
}
} catch (JMSException e) {
e.printStackTrace();
}
…
}
5.3.1.3 Enterprise Service Bus
Dopo che i wrapper avranno ricevuto gli eventi provenienti dalle rispettive fonti, come
abbiamo visto, l’operazione seguente è relativa alla costruzione di appositi messaggi della
specifica JMS, per poi immetterli sul bus. È qui quindi che entra in azione l’ESB utilizzato,
cioè Apache ActiveMQ. Infatti, una volta avviato, accetterà le richieste di creazione dei
topic, precisamente quello Unfiltered_Syslog e quello IDS, e si preoccuperà di gestirli
187
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
garantendo che i messaggi spediti su di essi giungano ai relativi Consumer, cioè a quei
componenti interessati alla ricezione dei messaggi su quei topic.
Precisamente, i Consumer in questo caso sono rappresentati dal modulo di PrefilteringAggregation, che si sottoscrive al topic Unfiltered_Syslog, e dal CEP Engine, che si
sottoscrive al topic IDS e, come vedremo, a quello SYSLOG.
Di seguito è mostrato uno screenshot del pannello di gestione di Apache ActiveMQ, nel
quale sono visibili i topic generati, e i messaggi in transito e prelevati da essi.
Figura 5.4: Topic su Apache ActiveMQ
Come si può notare, oltre ai vari topic di gestione, sono stati generati anche i topic prima
menzionati, nonché quello SYSLOG che è stato generato dal componente di PrefilteringAggregation, di cui parleremo nel prossimo paragrafo. In realtà la figura fornisce anche
altre importanti informazioni. Infatti definisce che per ogni topic vi sia un numero pari a
uno di Consumer, nonché che all’interno del topic IDS è stato immesso un solo messaggio,
in quello Unfiltered_Syslog sono stati immessi quattro messaggi, mentre in quello
SYSLOG è stato immesso un unico messaggio.
Tali informazioni sono ovviamente attese, in quanto si è visto nei paragrafi precedenti che
il wrapper IDS ha ricevuto il solo alert relativo al download sospetto dall’IDS SNORT, il
quale è stato quindi immesso sul topic IDS, mentre il wrapper SYSLOG ha ricevuto quattro
188
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
log di sistema da RSYSLOG, i quali sono quindi stati immessi sul topic Unfiltered_Syslog.
Relativamente al topic SYSLOG, rimandiamo la trattazione al prossimo paragrafo, così da
comprendere al meglio i dati presenti nella figura 5.4.
Ovviamente i messaggi, una volta messi sul bus, sono stati smistati ai rispettivi consumer.
5.3.1.4 Prefiltering-Aggregation
Come appena detto, dopo che i messaggi sono immessi sui topic dell’ESB, essi saranno
smistati ai rispettivi consumer. Uno di questi è proprio il componente di PrefilteringAggregation, il quale, come sappiamo, ha lo scopo sostanziale di effettuare un filtraggio
dei messaggi che viaggiano sul topic Unfiltered_Syslog al fine di immettere su quello
SYSLOG i soli messaggi di log relativi ad operazioni di accesso ad un host.
A tal fine, dopo essersi connesso al bus, tale componete istanzia un MessageConsumer sul
topic Unfiltered_Syslog e vi associa un apposito BusListener. Di seguito è mostrato un
estratto di codice del metodo main della classe Prefiltering_Aggregation.
…
ConnectionFactory factory= new
ActiveMQConnectionFactory(BUS_ADDRESS);
javax.jms.Connection connection;
try {
connection = factory.createConnection();
connection.start();
System.out.println("Connected to bus");
// Create a Session
Session session =
connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// Create the Topic, a MessageConsumer and
// Set a Listener
Destination destination =
session.createTopic("Unfiltered_Syslog");
MessageConsumer consumer =
session.createConsumer(destination);
BusListener BL = new BusListener(session);
consumer.setMessageListener(BL);
} catch (JMSException e) {
e.printStackTrace();}…
189
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Una volta istanziato il listener, e dopo averlo associato al consumer, nel momento in cui
giunge un nuovo messaggio, e precisamente un TextMessage, sul topic Unfiltered_Syslog
viene immediatamente invocato il metodo onMessage dello stesso. Attraverso tale metodo,
il componente di prefiltering, realizza la vera e propria operazione di filtraggio. Infatti
esso per prima cosa verifica se il messaggio ricevuto sia o meno un TextMessage. In tal
caso, effettua l’analisi del suo contenuto al fine di verificare se si tratti di un messaggio
contenente o meno un
log relativo ad un’operazione di accesso ad un host
dell’organizzazione. A tal fine verifica, come già accennato nel capitolo precedente, se
esso contenga o meno le parole sshd[ e Accepted. Se la verifica ha prodotto esito positivo,
allora effettuerà un parsing del testo del TextMessagge, così da prelevare le informazioni
rilevanti e costruire un apposito MapMessagge da immettere sul topic SYSLOG, il quale è
stato generato dal costruttore della classe BusListener.
Di seguito è mostrato un estratto del codice sorgente del costruttore e del metodo
onMessage della classe BusListener, che realizzano le operazioni descritte:
public BusListener(Session session){
Destination destination;
this.session = session;
try {
destination =
this.session.createTopic("SYSLOG");
// Create a MessageProducer from the Session
// to the Topic
producer =
this.session.createProducer(destination);
…
} catch (JMSException e) {
e.printStackTrace();
}
}
public void onMessage(Message message) {
try{
if(message instanceof TextMessage){
TextMessage txtmessage = (TextMessage)message;
…
if((txtmessage.getText().contains("sshd[")) &&
(txtmessage.getText().contains("Accepted"))){
MapMessage mapmessage =
session.createMapMessage();
190
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
String text = txtmessage.getText();
…
mapmessage.setString("Host",
text.substring(…));
…
mapmessage.setString("HostIP",…);
…
mapmessage.setString("Auth_method",
text.substring(…));
mapmessage.setString("User",
text.substring(…));
mapmessage.setString("ExtIP",
text.substring(…));
mapmessage.setString("ExtPort",
text.substring(…));
producer.send(mapmessage);
…
}else{
System.out.println("\nNew message
filtered!");
}
}else
System.out.println("\nNo TextMessage
received!");
}catch(JMSException e){
e.printStackTrace();
}
}
Si noti che, se il messaggio non contiene le parole chiave prima specificate, esso viene
scartato, come si può vedere nella figura seguente.
Figura 5.5: Output del componente di Prefiltering-Aggregation
Si vede infatti, come, tra tutti i messaggi ricevuti, l’unico a non essere scartato è quello
191
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
relativo alla connessione tramite il protocollo SSH. Di conseguenza si può comprendere il
motivo per cui nella figura 5.4, presentata nel paragrafo precedente, si indicato la presenza
di un unico messaggio all’interno del topic SYSLOG.
5.3.1.5 CEP Engine
L’ultimo componente dell’architettura ad entrare in azione è il CEP Engine. Esso infatti,
rappresenta il consumer di tutti i topic generati sul bus, tranne che per quello
Unfiltered_Syslog. Come sappiamo, il suo scopo è quello di effettuare la correlazione tra
gli eventi ricevuti in ingresso attraverso il bus, al fine di rilevare il verificarsi di un
determinato caso d’uso. In questo caso specifico, il suo obbiettivo è quello di rilevare
un’intrusione all’interno di un host attraverso l’utilizzo di credenziali rubate.
A tale scopo, come già definito nel capitolo 4, questo modulo utilizza il motore di
correlazione Esper, il quale ovviamente necessita di essere instanziato ed opportunamente
configurato. Proprio questa è la prima operazione svolta dal componente CEP Engine, il
quale infatti configura Esper definendo sia i tipi di eventi che saranno utilizzati, nonché le
eventuali View. Successivamente instanzia il motore di correlazione e lo istruisce con delle
apposite espressioni EPL, così da consentirgli il riconoscimento dei vari casi d’uso.
A partire da tali espressioni, saranno generati degli appositi statement, uno per ogni regola,
ai quali sarà associato un listener, il cui metodo update verrà richiamato in caso di
matching dei flussi di eventi ricevuti con una o più regole.
Dopo ciò, viene istanziato un oggetto BusConnection, il quale si preoccuperà di realizzare
la connessione sul bus e ricevere i messaggi che viaggiano sui topic, dopo ovviamente
aver istanziato dei MessageConsumer per ogni topic da ascoltare (IDS e SYSLOG in
questo caso) e un apposito listener.
Di seguito è mostrata una parte del codice del metodo main della classe MainCEvOS e del
metodo Connection della classe BusConnection, nei quali sono mostrate le sole istruzioni
192
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
fondamentali per questo caso d’uso.
public static void main(String[] args) throws
InterruptedException{
// Configurazione engine
Configuration config = new Configuration();
…
config.addEventType("AccessSystemEvent",
AccessSystemEvent.class);
config.addEventType("DownloadFileEvent",
DownloadFileEvent.class);
…
config.addPlugInView("accessSystem",
"accessSystemPV",
AccessSystemViewFactory.class.getName());
EPServiceProvider epService=
EPServiceProviderManager.getProvider("CEvOS_Engine"
, config);
…
// Definizione EPL per Scenario reti: Accesso
// sospetto e Download sospetto
String expressionSR1_1 = "insert into
SuspiciousAccessSystemEvent …”;
EPStatement stmtSR1_1 =
epService.getEPAdministrator().createEPL(expressionSR1_1);
String expressionSR1 = "insert into
ScenarioR1Stream select…”;
EPStatement stmtSR1 =
epService.getEPAdministrator().createEPL(expressionSR1);
…
// Istanziazione listener
MyListener listener = new MyListener();
…
stmtSR1.addListener(listener);
stmtSR1_1.addListener(listener);
…
//Connessione al bus
BusConnection BC = new BusConnection(epService);
BC.Connection();
}
public void Connection(){
ConnectionFactory factory= new
ActiveMQConnectionFactory(BUS_ADDRESS);
javax.jms.Connection connection;
try {
connection = factory.createConnection();
connection.start();
…
// Create a Session
Session session =
connection.createSession(false,
193
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Session.AUTO_ACKNOWLEDGE);
// Create Topic, a MessageConsumer and Set a
// Listener
Destination destination =
session.createTopic("IDS");
MessageConsumer consumer =
session.createConsumer(destination);
BusListener BL = new BusListener(epService);
consumer.setMessageListener(BL);
destination = session.createTopic("SYSLOG");
consumer= session.createConsumer(destination);
consumer.setMessageListener(BL);
…
} catch (JMSException e) {
e.printStackTrace();
}
}
Si noti che per brevità non sono state inserite le regole EPL (§ 4.3.5.3).
Dal codice è possibile anche notare la configurazione di Esper con gli eventi
AccessSystemEvent e DownloadFileEvent, che rappresentano rispettivamente l’evento
accesso al sistema e quello download file sospetto rappresentati sottoforma di Java POJO.
Ricordiamo che una loro descrizione accurata è stata già data nel capitolo precedente.
A questo punto, terminate le operazioni di configurazione, così come è accaduto per il
componente di Prefiltering-Aggregation, alla ricezione di un messaggio su uno dei topic
sottoscritti viene invocato il metodo onMessage della classe BusListener.
Attraverso tale metodo il CEP Engine, sulla base del topic dal quale è stato ricevuto il
MapMessage, va ad istanziare un oggetto evento. Nel caso considerato, ad esempio, alla
ricezione del MapMessage relativo all’evento accesso sul topic SYSLOG, il modulo va ad
istanziare un oggetto della classe AccessSystemEvent e a popolarlo con i dati contenuti nel
messaggio stesso. Successivamente il messaggio sarà inviato al motore di correlazione.
Stessa operazione viene svolta alla ricezione del MapMessage relativo all’evento
download sospetto. In questo caso però, dato che sul topic IDS, sul quale è stato ricevuto,
possono viaggiare differenti tipi di alert, viene effettuato un controllo sul campo Type del
messaggio. Nel caso considerato, trattandosi di un download, viene istanziato un oggetto
della classe DownloadFileEvent, il quale viene prima opportunamente popolato e poi
194
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
inoltrato al motore di correlazione.
Di seguito è mostrato un estratto di codice del metodo onMessage, dove sono mostrate le
solo istruzioni fondamentali per il caso d’uso considerato.
public void onMessage(Message message) {
try{
if(message instanceof MapMessage){
MapMessage mapmessage = (MapMessage) message;
if(message.getJMSDestination().toString()
.contains("IDS")){
time=new Date().toString();
if(mapmessage.getString("Type")
.contains("Suspicious File Download")){
DownloadFileEvent DFevent = new
DownloadFileEvent(
mapmessage.getString("Source_address"),
mapmessage.getString("Source_port"),
mapmessage.getString("Destination_address"),
mapmessage.getString("Destination_port"),
mapmessage.getString("File"),time);
epService.getEPRuntime()
.sendEvent(DFevent);
…
}else
if(mapmessage.getString("Type").contains(
"20 or most connections to an external
IP address")
…
}else
if(mapmessage.getString("Type")
.contains("Suspicious File
Upload")){
…
}else
if(mapmessage.getString("Type")
.contains("TCP Portscan")){
…
}
}else
if(message.getJMSDestination().toString()
.contains("SYSLOG")){
time=new Date().toString();
AccessSystemEvent ASevent = new
AccessSystemEvent(
mapmessage.getString("HostIP"),
mapmessage.getString("Host"),
mapmessage.getString("ExtIP"),
mapmessage.getString("ExtPort"),
time,
195
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
mapmessage.getString("Auth_method"),
mapmessage.getString("User"));
epService.getEPRuntime()
.sendEvent(ASevent);
…
}else
if(message.getJMSDestination()
.toString().contains("LAMP")){
…
}else
if(message.getJMSDestination().
toString().contains("CAMERA")){
…
}else
if(message.getJMSDestination()
.toString().contains("BADGE_READER")){
…}
}else
System.out.println("No MapMessage received!");
}catch(JMSException e){
e.printStackTrace();
}
}
A questo punto, il motore di correlazione, ricevuti gli eventi cerca un eventuale matching
con le regole con le quali è stato precedentemente istruito. Nel caso in cui venga trovata
una corrispondenza, viene richiamato il metodo update della classe MyListener, di cui
un’istanza era stata associata ai vari statement relativi alle regole definite.
Con tale metodo, il listener verifica quale sia l’evento complesso generato, e sulla base di
quest’ultimo produce un alert, che sarà visualizzato a terminale. Di seguito è mostrato
parte del codice del metodo update della classe MyListener.
public void update(EventBean[] newEvents, EventBean[]
oldEvents) {
EventBean event = newEvents[0];
if(event.getEventType().getName()
.compareTo("Scenario2Stream")==0){
…}
if(event.getEventType().getName()
.compareTo("Scenario1Stream")==0){
…}
if(event.getEventType().getName()
.compareTo("ScenarioR1Stream")==0){
System.out.println("\n ** ALERT: Compromised
User Event caused by Suspicious Access System
and File Download\n ** UserID= " +
196
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
event.get("userId") + " ---- Host= " +
event.get("host") + " ---- Host IP= " +
event.get("hostIp"));
System.out.println(" **
Access System info:");
System.out.println(" **
External IP= " +
event.get("extIp") + ":"+event.get("extPort")+
" ---- Authentication Method= " +
event.get("authMethod"));
System.out.println(" **
Motivation= " +
event.get("motivation") + " ---- Time= " +
event.get("aTime"));
System.out.println(" **
File Download info:");
System.out.println(" **
File= " +
event.get("file") + " ---- Source= "
+ event.get("sourceIp")+":" +
event.get("sourcePort"));
System.out.println(" **
Destination Port= "
+ event.get("destinationPort") + " Time= " +
event.get("dTime") + "\n");
…
}
if(event.getEventType()
.getName().compareTo("ScenarioR2aStream")==0){
…}
if(event.getEventType()
.getName().compareTo("ScenarioR2bStream")==0){
…}}
Nel caso considerato, si ha un matching sia con la regola che genera lo stream
SuspiciousAccessSystemEvent sia con quella che genera lo stream ScenarioR1Stream, che
riportiamo di seguito in versione ridotta.
insert into SuspiciousAccessSystemEvent
select * from pattern[every
ASE=AccessSystemEvent].accessSystem:accessSystemPV
(ASE.hostIp, ASE.host, ASE.extIp, ASE.extPort, ASE.time,
ASE.authMethod, ASE.userId)
insert into ScenarioR1Stream
select …
from pattern[every SASE=SuspiciousAccessSystemEvent->
DFE=DownloadFileEvent
(SASE.hostIp=DFE.destinationIp)
where timer:within(5 min)]
197
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Ciò è avvalorato anche dall’output del modulo CEP Engine mostrato di seguito.
Figura 5.6: Output del CEP Engine
Precisamente all’arrivo del ASevent, il motore trova una corrispondenza con la prima
regola, dato che essa analizza tutti gli eventi de tipo AccessSystemEvent.
Di conseguenza, l’evento ricevuto viene passato alla View AccessSystemPV, la quale,
come già detto nel capitolo precedente, si preoccupa di verificare se l’utente che ha
effettuato l’accesso stia rispettando o meno le sue normali abitudini.
Precisamente il controllo viene effettuato sull’IP esterno utilizzato, sul metodo di
autenticazione, nonché sull’host a cui l’utente si è connesso, verificando se ognuno di essi
sia già presente in un’apposita HashMap (users nel codice) contenete la storia degli
accessi di quell’utente, proprio rispetto a questi elementi. Inoltre viene verificato anche se
si tratta della prima connessione, semplicemente controllando se l’utente sia presente o
meno nella HashMap.
Nel caso in cui uno di questi elementi non sia presente nella rispettiva HashMap, allora
sarà generato un evento del tipo SuspiciousAccessSystemEvent.
Di seguito è mostrato una parte del codice del metodo update, e dei metodi da esso
utilizzati, della classe AccessSystemView che si preoccupa di realizzare queste operazioni.
public void update(EventBean[] newData, EventBean[]
oldData) {
if (newData!=null)
for (EventBean theEvent : newData){
// Recupero dati evento
eventsPerStream[0] = theEvent;
hostIp =
198
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
(String)hostIpExpression.getExprEvaluator()
.evaluate (eventsPerStream, true,
agentInstanceViewFactoryContext);
host = (String)…
extIp = (String)…
extPort = (String)…
time = (String)…
authMethod = (String)…
userId = (String)…
// Verifica l'accesso
if(verify_access())
continue;
// Invia i dati
postData();
}
}
private boolean verify_access(){
boolean status_verify = true;
…
String motivation = "";
if(users.containsKey(userId)){
User user = (User)users.get(userId);
HashMap<String,String> auth_methods =
(HashMap<String,String>)
user.get_auth_methods();
HashMap<String,String>hosts=
(HashMap<String,String>) user.get_hosts();
HashMap<String,String>extIPused=
(HashMap<String,String>)user.get_IP();
if(!auth_methods.containsKey(authMethod)){
status_verify = false;
motivation = motivation+" //Auth method
never used";
}
if(!hosts.containsKey(host)){
status_verify = false;
motivation= motivation+" //Host never used";
}
if(!extIPused.containsKey(extIp)){
status_verify = false;
motivation=motivation+" //Ext IP never
used";
}
}else{
status_verify = false;
motivation = "//First connection";
}
return status_verify;
}
private void postData(){
SuspiciousAccessSystemEvent SASE = new
SuspiciousAccessSystemEvent(
hostIp,host,extIp,extPort,time,authMethod,
199
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
userId,motivation);
EventBean outgoing =
agentInstanceViewFactoryContext.
getStatementContext().getEventAdapterService()
.adapterForBean(SASE);
if (lastEvent == null){
this.updateChildren(new EventBean[]
{outgoing}, null);
}else{
this.updateChildren(new EventBean[]{outgoing},
new EventBean[]{lastEvent});
}
lastEvent = outgoing;
…
}
Nel caso in esame, il metodo verify_access restituisce il valore false, in quanto essendo
vuota la HashMap users, l’utente risulta essersi connesso per la prima volta. Di
conseguenza viene richiamato il metodo post_Data che genera l’evento.
A questo punto, tale evento insieme a quello DFevent ricevuto dal CEP Engine provoca il
matching con la seconda regola. Infatti, come è possibile notare dalla figura 5.6, i due
eventi presentano lo stesso indirizzo IP come hostIP, per l’evento accesso, e destinationIP,
per l’evento download. Inoltre il primo segue il secondo in un intervallo temporale minore
di cinque minuti. Pertanto viene generato un evento del tipo ScenarioR1Stream, che porta
alla visualizzazione da parte del listener dell’alert visibile sempre in figura 5.6.
5.4 Casi d’uso simulati: Rilevamento di un accesso non autorizzato
Il secondo caso d’uso simulato è quello relativo alla possibilità che un dipendete
dell’organizzazione monitorata, o una persona esterna, acceda ad una delle aree sensibili
utilizzando il badge di un altro dipendente.
In questa ipotesi, il sistema di controllo degli accessi verifica l'identità della persona che
sta accedendo all’area riservata attraverso il badge magnetico, che è stato opportunamente
inserito nel badge reader, autorizzandolo.
200
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Contestualmente, la videocamera posta all’ingresso dell’area effettua la Face Detection e
rileva il volto della persona che ha richiesto l'accesso, identificandolo (nel caso in cui sia
un dipendente dell’organizzazione).
Si comprende quindi che, in questo caso d’uso, i sensori che intervengono sono due, e
precisamente sono un badge reader, che invia l’evento relativo alla lettura del badge del
dipendente, e una videocamera di sicurezza con modulo di Face Detection, la quale tenta
di riconoscere la persona che sta tentando l’accesso generando un apposito evento con
l’esito.
La nostra piattaforma, attraverso la correlazione di questi due eventi, è in grado di
riconoscere il tentativo di un accesso non autorizzato, cioè un accesso effettuato da un
dipendente che sta utilizzando il badge di un altro dipendente, o addirittura da una persona
non riconosciuta che utilizza un badge aziendale. Ma vediamo come ciò avviene attraverso
l’analisi del comportamento di ogni singolo componente.
5.4.1 Comportamento del sistema
Nello scenario analizzato, non tutti i moduli del sistema progettato sono utilizzati, infatti
nell’ambito della Building Security non è previsto l’ausilio del componente di PrefilteringAggregation. Precisamente i componenti chiamati in causa sono:
• I BACnet Device
• Il Wrapper BACnet
• L’Enterprise Service Bus
• Il CEP Engine
Vediamo quindi come ognuno di essi lavoro nell’ambito di questo caso d’uso.
201
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
5.4.1.1 BACnet Device
I BACnet Device, come abbiamo definito nel capitolo precedente, sono stati implementati
allo scopo di colmare l’assenza di dispositivi reali per la realizzazione di simulazioni.
Pertanto si è reso necessaria l’implementazione di software in grado di simularli.
Precisamente, per lo scenario in analisi, sono simulati i due device CAMERA e
BADGE_READER. Il loro comportamento è molto semplice, infatti i due device una volta
avviati si limitano a generare, ad intervalli di tempo regolari, delle modifiche al valore del
BACnet Object sotto osservazione, il che produce l’invio di una COVNotification agli altri
BACnet Device che hanno effettuato una sottoscrizione COV a tale oggetto. Come
vedremo nei prossimi paragrafi, e come già accennato nel capitolo 4, il dispositivo che
effettua tale sottoscrizione è il Wrapper_BACnet.
Di seguito è mostrato un estratto del codice del metodo main del device CAMERA che
realizza tali operazioni.
public static void main(String[] args) {
localDevice = new LocalDevice(DEVICE_ID,
BROADCAST_ADDRESS, LOCAL_DEVICE_ADDRESS);
localDevice.setPort(0xBAC0);
// Set up objects.
ai0 = new BACnetObject(localDevice, new
ObjectIdentifier(ObjectType.binaryValue,0));
try {
localDevice.addObject(ai0);
…
localDevice.initialize();
System.out.println("I'm ready");
try {
Thread.sleep(20000);
} catch (InterruptedException e2) {
e2.printStackTrace();
}
boolean ai0value = false;
int i=1;
while (i<10) {
// Change the values.
ai0value = !ai0value;
ai0.setProperty(PropertyIdentifier.presentValue,
ai0value ? BinaryPV.active :
BinaryPV.inactive);
202
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
System.out.println("Observed value
changed...COVNotification sent");
Thread.sleep(5000);
i++;
}
} catch (BACnetServiceException e) {
e.printStackTrace();
} …
}
Si noti che lo stesso codice caratterizza anche il metodo main del device
BADGE_READER. Tale codice porta al seguente output.
Figura 5.7: Output del Camera Device
5.4.1.2 Wrapper BACnet
Il Wrapper BACnet, come noto, è il componente dell’architettura che si preoccupa di
comunicare con i dispositivi basati su questo protocollo, nello specifico con i due device
definiti nel capitolo precedente, allo scopo di ricevere gli eventi da essi generati.
Come già descritto nel capitolo 4, tale componente per prima cosa effettua la connessione
al bus e successivamente instanzia un oggetto del tipo Wrapper_BACnet che rappresenta il
wrapper vero e proprio. Precisamente di tale oggetto viene richiamato il metodo
bacnet_interaction, il quale si preoccupa di stabilire una connessione con i vari device, e
precisamente una sottoscrizione COV, secondo i passi illustrati nella figura 4.8. A tale
scopo istanzia anche un apposito BACnet_Listener. Di seguito è mostrato un estratto di
codice dei metodi main e bacnet_interaction della classe Wrapper_BACnet.
203
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
public static void main(String[] args) {
ConnectionFactory factory= new
ActiveMQConnectionFactory(BUS_ADDRESS);
javax.jms.Connection connection;
try {
connection = factory.createConnection();
connection.start();
System.out.println("Connected to bus");
// Create a Session
session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
Wrapper_BACnet WB = new Wrapper_BACnet();
WB.bacnet_interaction();
} catch (JMSException e1) {
e1.printStackTrace();
}…
}
private void bacnet_interaction() throws …{
// Create Local Bacnet Device
localDevice = new
LocalDevice(DEVICE_ID,BROADCAST_ADDRESS,
LOCAL_DEVICE_ADDRESS);
localDevice.setPort(0xBAC0);
localDevice.getConfiguration().setProperty(
PropertyIdentifier.segmentationSupported,
Segmentation.noSegmentation);
localDevice.getEventHandler().addListener(new
BACnet_Listener(localDevice,session));
localDevice.initialize();
// Send WhoIsRequest
localDevice.sendBroadcast(0xBAC0,new
WhoIsRequest(null,null));
System.out.println("\nWhoIsRequest sent\n");
…
// Wait for I-Am message
Thread.sleep(15000);
}
Dal codice è possibile notare che il metodo bacnet_interaction in realtà copre i soli primi
due passi della figura 4.8. Per semplicità li riportiamo di seguito:
• Istanziazione e inizializzazione di un Device Locale (Client)
• Invio di un messaggio broadcast WHO-IS da parte del Device Locale, attraverso il
quale è grado di conoscere i dispositivi connessi alla rete
• Invio della risposta I-AM del Device Remoto al Device Locale, con la quale il device
remoto fa conoscere le proprie caratteristiche al device locale
204
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
• Invio da parte del Device Locale di una richiesta di sottoscrizione ad un oggetto, od
alle sue proprietà, mediante un messaggio di SubscribeCOVRequest verso il Device
Remoto
• Invio da parte del Device Remoto del messaggio SimpleACK verso il Device Locale
• Il Device Remoto invia una notifica al sottoscrittore ConfirmedCOVNotification, che
contiene le informazioni richieste dal Local Device, ogniqualvolta l’oggetto e/o la
proprietà sottoscritta viene modificata
• Il LocalDevice invia una SimpleAck al Dispositivo Remoto
Gli altri passi infatti saranno realizzati dal BACnet_Listener. Tale classe, come abbiamo
già visto nel capitolo precedente, è dotata di tanti metodi quanti sono i tipi di messaggi che
è possibile ricevere da un device BACnet remoto. Nel nostro caso, dovendo solo gestire
messaggi di I-AM e COVNotification, si è prevista la sola implementazione dei relativi
metodi, cioè iAmReceived e covNotificationReceived.
Il primo viene invocato alla ricezione di un messaggio di I-AM, il quale è inviato in
automatico dai device prima descritti, alla ricezione del messaggio di WHO-IS. Esso
prevede per prima cosa la generazione dei topic sul bus e l’istanziazione del rispettivo
MessageProducers (che sarà anche inserito all’interno di una apposita List), sulla base del
vendorID del dispositivo mittente. Precisamente, nel caso in esame saranno generati due
topic: quello CAMERA, su cui viaggeranno gli eventi di Face Detection generati dalla
videocamera, e quello BADGE_READER, su cui viaggeranno gli eventi generati dal badge
reader. Successivamente tale metodo aggiunge il device remoto mittente in un’apposita
List, e gli invia una SubscribeCOVRequest per monitorare l’oggetto che esso gestisce.
Il metodo covNotificationReceived viene invece invocato alla ricezione di una notifica
COV da parte di uno dei dispositivi remoti con cui si è realizzata una sottoscrizione COV,
e si preoccupa di creare i MapMessage che descrivono l’evento relativo al cambiamento
del valore monitorato. Ovviamente tale operazione sarà differenziata a seconda di quale
sia il device mittente.
205
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Di seguito è mostrato parte del codice sorgente dei due metodi, contenente le sole
istruzioni fondamentali per il caso d’uso in esame.
public synchronized void iAmReceived(RemoteDevice d) {
// I-Am received
Destination destination = null;
// Set name
try{
switch (d.getVendorId()) {
case LAMP:{ …
}break;
case CAMERA:{
d.setName("CAMERA");
index_CAMERA = index;
destination = session.createTopic("CAMERA");
Destinations.add(index_CAMERA,destination);
MessageProducers.add(session
.createProducer(destination));
}break;
case BADGE_READER:{
d.setName("BADGE_READER");
index_BADGE_READER = index;
destination =
session.createTopic("BADGE_READER");
Destinations.add(index_BADGE_READER,
destination);
MessageProducers.add(session
.createProducer(destination));
}break;
}
} catch (JMSException e) {
e.printStackTrace();
}
index++;
…
remoteDevices.add(d);
// Send SubscribeCOV
…
SubscribeCOVRequest SCOVreq = new
SubscribeCOVRequest(…);
try {
…
localDevice.send(d, SCOVreq);
…
} catch (BACnetException e) {
e.printStackTrace();
}…
}
206
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
public void covNotificationReceived(…) {
MapMessage mymap;
Random rand=new Random();
try{
mymap = session.createMapMessage();
switch (initiatingDevice.getVendorId()) {
case LAMP:{
...
}break;
case CAMERA:{
String camID = ""+rand.nextInt(4);
String type_event =
listOfValues.getValues().get(1)
.getValue().toString();
mymap.setString("camID",camID);
mymap.setString("EventType",
type_event);
if(type_event.contains("1")){
String ID_employee =
""+rand.nextInt(4);
mymap.setString("ID_employee",
ID_employee);
}
MessageProducers.get(index_CAMERA)
.send(mymap);
…
}break;
case BADGE_READER:{
String badgeID = ""+rand.nextInt(4);
String ID_employee = ""+rand.nextInt(4);
mymap.setString("badgeID",badgeID);
mymap.setString("ID_employee",
ID_employee);
MessageProducers.get(index_BADGE_READER)
.send(mymap);
…
}break;
}
} catch (JMSException e) {
e.printStackTrace();
}
}
Una cosa fondamentale da notare è che all’interno del metodo covNotificationReceived, i
dati necessari al popolamento dei MapMessage da immettere sui topic sono generati
causalmente all’interno del metodo stesso. Il motivo di tale operazione è dovuta alla
necessità di dover superare la limitazione imposta dalla libreria BACnet4J, che ricordiamo
è alla base sia dell’implementazione di questo wrapper sia dei dispositivi prima descritti.
207
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Tale limitazione in pratica prevede di poter gestire un unico oggetto quando un
LocalDevice è utilizzato come client, e soprattutto la possibilità di poter sottoscrivere COV
solo su oggetti di tipo booleano. Ciò impedisce la possibilità di poter simulare
precisamente il comportamento reale di un dispositivo, dal quale si potrebbero ricavare
senza problemi tutte le informazioni necessario. Di conseguenza l’unico valore che è
possibile ottenere è quello booleano dell’oggetto tenuto sotto osservazione dai device. In
particolare, il valore di tale oggetto viene utilizzato solo nell’ambito degli eventi generati
dalla device CAMERA, al fine di discriminare gli eventi di Face Detection da quelli di
Camera Tampering. Infatti, ricordiamo che si è presupposto che tale device generi in
maniera alternata le due tipologie di eventi.
Detto ciò, si comprende che all’avvio del wrapper, nel caso considerato, quest’ultimo
invia la propria WHO-IS Request, ricevendo in risposta i messaggi di I-AM dai due device
simulati e successivamente sottoscriverà una COV con entrambi. Di conseguenza ad ogni
modifica del valore dell’oggetto monitorato dai due dispositivi, il wrapper riceverà una
COV Notification. Precisamente è stata presa in considerazione una solo notifica per
dispositivo, delle nove generate da entrambi: una proveniente dal device CAMERA,
relativa ad un evento di Face Detection, che porta alla creazione del relativo MapMessage
sul topic CAMERA, e una dal device BADGE_READER, che porterà alla creazione del
relativo MapMessage sul topic BADGE_READER.
Di seguito è mostrato l’output del wrapper.
208
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Figura 5.8: Output del Wrapper_BACnet
5.4.1.3 Enterprise Service Bus
Come nel caso d’uso precedente, anche per questo caso Apache ActiveMQ, una volta
avviato, accetterà le richieste di creazione dei topic, precisamente quello CAMERA e
quello BADGE_READER, e si preoccuperà di gestirli garantendo che i messaggi spediti su
di essi giungano ai relativi Consumer. Precisamente, il Consumer in questo caso è unico
ed è rappresentato dal CEP Engine, il quale si sottoscrive ad entrambi i topic.
In figura 5.9 è mostrato un screenshot del pannello di gestione di Apache ActiveMQ, nel
quale sono visibili i topic generati, e i messaggi in transito e prelevati da essi.
Come si può notare, oltre ai vari topic di gestione, sono stati generati anche i topic prima
menzionati. Inoltre è possibile vedere che per ogni topic vi è un numero pari a uno di
Consumer, nonché che all’interno dei topic CAMERA e BADGE_READER sono stati
immessi, e successivamente inoltrati al consumer, nove messaggi.
Tali informazioni sono ovviamente attese, in quanto si è visto nei paragrafi precedenti che
il wrapper BACnet ha ricevuto nove eventi del device CAMERA e nove da quello
BADGE_READER.
209
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Figura 5.9: Topic su Apache ActiveMQ
5.4.1.4 CEP Engine
Essendo il consumer dei due topic considerati, il CEP Engine è l’ultimo dei componenti
dell’architettura ad entrare in azione. Il suo comportamento in questo caso d’uso è
esattamente pari a quello descritto per il caso d’uso precedente. Pertanto non saranno
descritte nuovamente tutte le singole operazioni. Ovviamente le differenze risiedono nei
differenti tipi di eventi gestiti, e nelle differenti regole EPL che questi ultimi attivano.
Vediamo pertanto parte del codice del metodo main della classe MainCEvOS e del metodo
Connection della classe BusConnection.
public static void main(String[] args) throws
InterruptedException{
// Configurazione engine
Configuration config = new Configuration();
…
config.addEventType("BadgeReaderEvent",
BadgeReaderEvent.class);
config.addEventType("FaceDetectionEvent",
FaceDetectionEvent.class);
…
EPServiceProvider epService =
EPServiceProviderManager.getProvider(
"CEvOS_Engine", config);
…
// Definizione EPL per Scenario 2: BadgeReader e
// FaceDetectoin
210
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
String expressionS2 = "insert into Scenario2Stream…";
EPStatement stmtS2 =
epService.getEPAdministrator().createEPL(expressionS2);
…
// Istanziazione listener
MyListener listener = new MyListener();
…
stmtS2.addListener(listener);
…
//Connessione al bus
BusConnection BC = new BusConnection(epService);
BC.Connection();
}
public void Connection(){
ConnectionFactory factory= new
ActiveMQConnectionFactory(BUS_ADDRESS);
javax.jms.Connection connection;
try {
connection = factory.createConnection();
connection.start();
…
// Create a Session
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
// Create the destination Topic, a MessageConsumer
// and Set a Listener
Destination destination =
session.createTopic("CAMERA");
MessageConsumer consumer =
session.createConsumer(destination);
BusListener BL = new BusListener(epService);
consumer.setMessageListener(BL);
…
destination = session.createTopic("BADGE_READER");
consumer = session.createConsumer(destination);
consumer.setMessageListener(BL);
…
} catch (JMSException e) {
e.printStackTrace();
}
}
Si noti che per brevità non sono state inserite le regole EPL (§ 4.3.5.3).
Dal codice è possibile anche notare la configurazione di Esper, e precisamente l’aggiunta
a quest’ultima degli eventi BadgeReaderEvent e FaceDetectionEvent, che rappresentano
rispettivamente l’evento lettura di un badge e quello di riconoscimento di un volto.
In questo caso infatti, lo scopo di questo componente è quello di rilevare un accesso non
211
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
autorizzato effettuato da un dipendente utilizzando un badge differente dal proprio.
A tale scopo, una volta ricevuti i messaggi in transito sui topic CAMERA e
BADGE_READER del bus, attraverso il metodo onMessage della classe BusListener, il
CEP Engine, proprio all’interno di tale metodo va ad istanziare un oggetto evento a
seconda del topic dal quale ha ricevuto il MapMessage. Precisamente viene istanziato un
oggetto della classe FaceDetectionEvent se il MapMessage proviene dal topic CAMERA e
presenta come valore del campo Type la stringa “1”, mentre ne viene istanziato uno della
classe BadgeReaderEvent, nel caso di MapMessage ricevuto dal topic BADGE_READER.
Una volta istanziati e popolati, tali eventi saranno inviati al motore di correlazione.
Di seguito è mostrato un estratto di codice del metodo onMessage, dove sono mostrate le
solo istruzioni fondamentali per il caso d’uso considerato.
public void onMessage(Message message) {
try{
if(message instanceof MapMessage){
MapMessage mapmessage = (MapMessage) message;
if(message.getJMSDestination()
.toString().contains("CAMERA")){
if(mapmessage.getString("EventType")
.contains("1")){
time=new Date().toString();
FaceDetectionEvent FDevent= new
FaceDetectionEvent("ROS_VNC"
+mapmessage.getString("ID_employee"),time,
"POS_"+mapmessage.getString("camID"));
epService.getEPRuntime().sendEvent(FDevent);
…
}else{
time=new Date().toString();
TamperingEvent Tevent= new
TamperingEvent("CAM_"+mapmessage.
getString("camID"),"POS_"
+mapmessage.getString("camID"), time);
epService.getEPRuntime().sendEvent(Tevent);
…}
}else
if(message.getJMSDestination().toString()
.contains("BADGE_READER")){
time=new Date().toString();
BadgeReaderEvent BRevent= new
BadgeReaderEvent("ROS_VNC"
+mapmessage.getString("ID_employee"),time,
"POS_"+mapmessage.getString("badgeID"));
212
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
epService.getEPRuntime().sendEvent(BRevent);
…
}else
if(message.getJMSDestination().toString()
.contains("LAMP")){
…
}else
if(message.getJMSDestination().toString()
.contains("IDS")){
…
}else
if(message.getJMSDestination().toString()
.contains("SYSLOG")){
…}
}else
System.out.println("No MapMessage received!");
}catch(JMSException e){
e.printStackTrace();
}
}
A questo punto, ricevuti gli eventi, il motore di correlazione cerca un eventuale matching
con le regole con le quali è stato precedentemente istruito. Nel caso in cui venga trovata
una corrispondenza, viene richiamato il metodo update della classe MyListener, di cui
un’istanza era stata associata ai vari statement relativi alle regole definite.
Con tale metodo, il listener verifica quale sia l’evento complesso generato, e sulla base di
quest’ultimo produce un alert, che sarà visualizzato a terminale. Di seguito è mostrato
parte del codice del metodo update.
public void update(EventBean[] newEvents, EventBean[]
oldEvents) {
EventBean event = newEvents[0];
if(event.getEventType().getName()
.compareTo("Scenario1Stream")==0)}
…}
if(event.getEventType().getName()
.compareTo("Scenario2Stream")==0){
System.out.println("\n ** ALERT: Unauthorized
access\n ** place = " + event.get("placeID") + "\n
** time: " + event.get("time") +"\n **”+“BadgeID: "
+ event.get("idBadge") + "\n ** FaceID: " +
+ event.get("idFace") + "\n");
…
}
if(event.getEventType().getName()
.compareTo("ScenarioR1Stream")==0){
213
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
…}
if(event.getEventType().getName()
.compareTo("ScenarioR2aStream")==0){
…}
if(event.getEventType().getName()
.compareTo("ScenarioR2bStream")==0){
…}
Nel caso considerato, si ha un matching con la regola che genera lo stream
Scenario2Stream, che riportiamo di seguito.
insert into Scenario2Stream
select BRE.ID_employee as idBadge, FDE.time as time,
FDE.ID_employee as idFace, BRE.placeID as placeID
from pattern[every BRE=BadgeReaderEvent -> FDE=FaceDetectionEvent
((BRE.placeID=FDE.placeID) and
(BRE.ID_employee!=FDE.ID_employee))
where timer:within(6 sec)]
Ciò è avvalorato anche dall’output del modulo CEP Engine mostrato di seguito.
Figura 5.10: Output CEP Engine
Precisamente all’arrivo del BRevent e del successivo FDevent, il motore cerca una
corrispondenza con la regola EPL prima definita. Pertanto, osservando la figura 5.10, si
può notare che i due eventi possiedono entrambi lo stesso valore per il campo placeID,
mentre hanno valori differenti per quello ID_employee.
Inoltre il BRevent segue
l’FDevent in una finestra temporale minore di sei secondi. Si comprende quindi che tale
sequenza di eventi realizza un effettivo matching con la regola EPL considerata. Di
conseguenza viene generato un evento del
tipo Scenario2Stream, che porta alla
visualizzazione da parte del listener dell’alert visibile nella stessa figura 5.10.
214
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
5.5 Considerazioni
Dalle simulazioni effettuate è semplice dedurre che il sistema implementato funziona
correttamente, in quanto assume il comportamento atteso. In più, analizzando il
comportamento di ogni singolo componente, è chiara anche la sua capacità di soddisfare i
requisiti previsti nell’ambito dell’attività di progettazione. Infatti, in termini di requisiti
funzionali, il sistema soddisfa:
• Il requisito di Events Receiving, attraverso l’ausilio dei vari wrapper, che gli
consentono di ricevere gli eventi generati da più sottosistemi, anche fortemente
eterogenei
• Il requisito di Events Filtering and Aggregation, attraverso l’ausilio del componente
di Prefiltering-Aggregation, il quale gli consente di effettuare un filtraggio sugli
eventi ricevuti dai vari wrapper, prima che essi giungano al motore di correlazione
• I requisiti di Events Correlation, Complex Events Generation e Alerts Generation,
attraverso l’ausilio del componente CEP Engine, il quale è in grado di correlare gli
eventi ricevuti dai wrapper, opportunamente filtrati dal componente di
Prefiltering-Aggregation, nonché di generare eventi complessi ed opportuni alert,
nel caso in cui sia riconosciuta una particolare situazione definita in una delle
regole con cui è stato istruito
Il sistema inoltre soddisfa anche i requisiti non funzionali. Esso infatti è facilmente
manutenibile ed estensibile, grazie alla sua architettura modulare e a componenti
indipendenti, nonché consente una elaborazione dei dati in real-time. Precisamente,
relativamente a quest’ultimo requisito, pur non avendo realizzato dei veri e propri test, è
possibile vedere che il sistema fornisce delle risposte in tempi molto rapidi. Infatti, se
prendiamo in considerazione le figure 5.3 e 5.6, è possibile notare che il timestamp
relativo all’arrivo dell’evento SuspiciousFileDownload al wrapper IDS (Figura 5.3) e
quello relativo all’arrivo dello stesso evento al CEP Engine (Figura 5.6) sono
215
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
perfettamente identici. Quindi l’elaborazione realizzata dalla piattaforma avviene
nell’ambito dello stesso secondo. A ciò si aggiunge anche la capacità del sistema di
generare istantaneamente gli alert. Infatti, come è possibile vedere sempre nella figura 5.6,
l’alert relativo ad un tentativo di intrusione con credenziali rubate viene visualizzato a
video in contemporanea con il messaggio relativo alla ricezione dell’evento di download
sospetto.
Si noti che anche il requisito funzionale relativo ad un’elevata Precision e Recall è
soddisfatto, anche se non completamente. Ciò sarà chiarito nel successivo capitolo.
216
Capitolo 6
Risultati sperimentali
6.1 Introduzione
L’ultima attività che ha interessato questo lavoro di tesi è quella volta alla valutazione
sperimentale delle capacità del sistema implementato.
In questo capitolo ci preoccuperemo proprio di descrivere questa attività, e i risultati da
essa ottenuti.
In particolare, sarà fornita una descrizione delle due sottoattività realizzate, che sono:
• Valutazione del sistema con una distribuzione reale del traffico
• Valutazione del sistema all’aumentare del traffico
Entrambe le sottoattività sono state svolte nell’ambito dello scenario di Network Security,
ed entrambe avevano come obbiettivi sia quello di verificare ulteriormente la corretta
funzionalità del sistema, sia quello di valutare le capacità dello stesso di rilevare attacchi.
A tale scopo sono stati valutati alcuni parametri fondamentali, quali:
• Falsi Positivi
• Falsi Negativi
• Precision
• Recall
• F-Measure
217
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Essi saranno opportunamente presentati nei paragrafi successivi, dove sarà fornita la
descrizione sia di come sono state realizzate le due sottoattività, sia dei risultati con esse
ottenuti.
6.2 Valutazione del sistema con una distribuzione reale del traffico
Come anticipato nell’introduzione, la prima sottoattività realizzata è quella di verificare il
nostro sistema nell’ambito dello scenario di Network Security, e verificare la sua
funzionalità, nonché la sua capacità di rilevare attacchi sottoponendolo ad una
distribuzione reale del traffico.
6.2.1 Descrizione
Per raggiungere lo scopo appena definito, è stata presa in considerazione una particolare
distribuzione reale di traffico. Precisamente è stata utilizzata quella definita in [24], dove,
al fine di rilevare i possibili utenti compromessi che si connettono all’interno di un sistema
reale, sono state messe in luce sia la tipologia che la quantità degli eventi a cui è
sottoposto tale sistema nell’arco di una giornata standard di utilizzo.
Precisamente, gli eventi considerati sono:
• Accesso Sospetto ad un host, considerato tale per una delle seguenti motivazioni:
o Indirizzo IP esterno mai utilizzato (AS1)
o Metodo di autenticazione mai utilizzato (AS2)
o Host mai utilizzato (AS3)
o Prima connessione al sistema (AS4)
• Download di un file con estensione sospetta da un host
• Upload di un file con estensione sospetta da un host
218
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
• Connessioni TCP multiple di un host verso un indirizzo IP esterno
• Tentativi di Port Scanning verso il sistema monitorato
La distribuzione di tali eventi è mostrata nella tabella seguente, dove i valori indicati si
intendono per un giorno di attività del sistema.
Tabella 6.1: Distribuzione degli eventi
Download
sospetto
Accesso sospetto
Alert
(al giorno)
Upload
sospetto
Connessioni
TCP multiple
Port
Scanning
Tot
A
S
1
A
S
2
A
S
3
A
S
4
R
20
6
10
1
15 162
S
R
S
R
S
R
S
R
10
50
5
5
12
6
7
309
È importante notare che per ogni tipologia di eventi sono definiti due valori,
contrassegnati con la lettera S ed R, i quali stanno a rappresentare rispettivamente gli
eventi generati per ricreare la distribuzione definita in [24] e quelli generati al fine di
simulare attacchi reali.
Infatti, allo scopo di valutare le capacità di riconoscimento di attacchi del nostro sistema è
stato necessario non solo generare eventi che ricreassero uno scenario reale, ma anche
eventi che facessero parte di attacchi reali.
Ovviamente le tipologie di attacchi generati, sono quelle che la nostra piattaforma è in
grado di riconoscere, essendo stata opportunamente istruita con le regole mostrate nei
capitoli precedenti.
La distribuzione di tali attacchi è mostrata nella tabella seguente.
219
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Tabella 6.2: Distribuzione degli attacchi reali
Attacchi reali
(al giorno)
Intrusione con
credenziali
rubate
TCP Gender
Changer
Variante 1
TCP Gender
Changer
Variante 2
Totale
10
5
7
22
Come si può notare dalla tabella, gli attacchi generati sono proprio quelli oggetto dei casi
d’uso definiti nel capitolo 2, e sono in quantità nettamente inferiori rispetto al resto del
traffico generato.
Il compito del sistema implementato sarà proprio quello di cercare di rilevare questi
attacchi, attraverso l’analisi degli eventi che sono stati generati. Si può quindi facilmente
comprendere che il traffico di eventi indicato con S nella tabella 6.1, può essere visto
come una fonte di disturbo per l’operato della nostra piattaforma.
Per quanto riguarda la generazione degli eventi presi in considerazione, è importante
notare che, non essendo possibile crearli agilmente con attività reali che allertino l’IDS
utilizzato, che ricordiamo è SNORT, si è resa necessaria una loro creazione via software.
Pertanto si è sviluppato un apposito tool che si preoccupasse di generare eventi
appartenenti alle varie tipologie. In particolare si prevede la loro creazione già nel formato
MapMessage, in maniera tale da poter essere immessi direttamente sul bus, senza
utilizzare i wrapper, i quali non sono oggetto dell’attività di verifica. Una caratteristica
fondamentale di questo software è che gli eventi generati, ed appartenenti ad una stessa
tipologia, siano inviati sul bus con una cadenza temporale non costante, bensì determinata
in maniera casuale per ogni evento. Ciò permette di dar vita, ad ogni avvio della
simulazione, ad un flusso di eventi sempre differente, pur rispettando la distribuzione
stabilita.
Tale aspetto si è reso necessario al fine di realizzare una simulazione su più giorni. Infatti,
il sistema è stato sottoposto al traffico così generato per un totale di 10 giorni, così da
220
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
poter valutare mediamente il suo comportamento.
Da notare però, che il tempo utilizzato per la realizzazione dell’attività di valutazione non
è quello reale. Infatti la simulazione è stata realizzata in tempo simulato, prevedendo la
trasformazione:
1 minuto reale = 1 minuto simulato
Ciò ha permesso di realizzare il tutto in maniera nettamente più agevole.
Ovviamente le regole EPL, con le quali si è istruito il CEP engine, sono state
opportunamente adattate.
Una volta generati gli eventi, essi sono stati dati in pasto al nostro sistema, e
successivamente sono valutati i suoi output, e precisamente gli alert che ha generato, al
fine di comprendere le sue capacità di rilevazione degli attacchi.
Precisamente, come già accennato all’inizio di questo capitolo, sono stati valutati una serie
di parametri, quali:
• Falsi Positivi: rappresentano gli attacchi non reali rilevati. Essi sono calcolati nel
modo seguente:
Falsi Positivi = Attacchi rilevati – Attacchi reali generati
• Falsi Negativi: rappresentano gli attacchi reali non rilevati. Essi sono calcolati nel
modo seguente:
Falsi Negativi = Attacchi reali generati – Attacchi reali rilevati
• Precision: parametro di information retrieval che valuta la capacità del sistema di
riconoscere i soli attacchi reali. Esso è calcolato nel modo seguente:
221
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Si comprende che un valore pari a 1 di questo parametro indica che ogni attacco
rilevato dal sistema è sicuramente un attacco reale, e quindi totale assenza di falsi
positivi
• Recall: parametro di information retrieval che valuta la capacità del sistema di
riconoscere tutti gli attacchi reali. Esso è calcolato nel modo seguente:
Si comprende che un valore pari a 1 di questo parametro indica che il sistema è
stato in grado di rilevare tutti gli attacchi reali, e quindi totale assenza di falsi
negativi
• F-Measure: indice prestazionale di information retrieval ottenuto come
combinazione di precision e recall. Esso è calcolato nel modo seguente:
Si comprende che un valore pari a 1 di questo parametro indica ottime prestazioni
del sistema.
Descriviamo ora i risultati ottenuti da questa prima sottoattività.
6.2.2 Risultati ottenuti
Dalla simulazione realizzata sul nostro sistema, utilizzando come fonte di eventi il
software precedentemente descritto, sono stati ottenuti risultati interessanti, i quali sono
ottimamente riassunti nella seguente tabella.
222
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Tabella 6.3: Risultati della prima sottoattività di valutazione
Giorno
1
2
3
4
5
6
7
8
9
10
Medie
Attacchi Attacchi Reali
rilevati
rilevati
31
21
25
18
30
20
26
20
30
22
30
21
32
22
29
21
30
21
24
17
28,7
20,3
Falsi
Positivi
10
7
10
6
8
9
10
8
9
7
Falsi
Negativi
1
4
2
2
0
1
0
1
1
5
8,4
1,7
Recall
0,95
0,82
0,91
0,91
1,00
0,95
1,00
0,95
0,95
0,77
0,92
Precision F-Measure
0,68
0,72
0,67
0,77
0,73
0,70
0,69
0,72
0,70
0,71
0,71
0,79
0,77
0,77
0,83
0,85
0,81
0,81
0,82
0,81
0,74
0,80
Analizzando tale tabella, è possibile notare immediatamente uno dei grandi vantaggi
introdotti dalla piattaforma implementata, e cioè ridurre considerevolmente il carico di
lavoro a cui è soggetto un operatore umano. Infatti come si può vedere, il numero di
attacchi rilevati, e quindi di alert generati dal sistema, è nettamente inferiore rispetto a
quelli che sarebbero stati generati nel caso di assenza dello stesso. Precisamente, nella
simulazione realizzata, l’operatore dovrà analizzare tra i 24 e 32 alert al giorno, contro i
309 (vedi tabella 6.1) che avrebbe dovuto analizzare in sua assenza.
Per quanto riguarda, invece, la sua capacità di rilevare attacchi, sempre dalla tabella è
possibile vedere che il sistema, nelle condizioni simulate, è stato in grado di rilevare
mediamente il 91% degli attacchi reali generati, che ricordiamo sono 22 (vedi tabella 6.2).
Infatti gli attacchi reali rilevati variano da un minimo di 17 ad un massimo di 22, ciò mette
in luce ottime capacità di rilevare tutti gli attacchi generati, perdendone pochi. Tale
risultato è avvalorato maggiormente sia dai Falsi Negativi, il cui valore si attesta
mediamente intorno ad 1,7, sia dai valori della Recall, che si attestano mediamente ad un
valore abbastanza prossimo a 1.
Diversamente invece accade relativamente alla capacità del sistema di rilevare i soli
attacchi reali. Infatti dando uno sguardo ai Falsi Positivi è possibile vedere come essi si
223
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
attestino intorno ad un valore circa pari a 8, il che ci porta a comprendere che il sistema
tende a generare di falsi allarmi. Tale aspetto è comprensibile anche valutando i valori di
Precision, che si attestano ad un valore di 0,71, quindi nettamente più lontano dall’ottimo
rispetto alla Recall. Tale comportamento in realtà era prevedibile, in quanto, come
descritto nel paragrafo 1.5.1.2, esso rappresenta proprio una delle peculiarità dei sistemi di
correlazione rule-based.
In ogni caso, si tratta comunque di un risultato accettabile se paragonato all’enorme
riduzione di Falsi Positivi che il sistema introduce con il suo utilizzo, e di cui si è trattato
all’inizio di questo paragrafo.
In conclusione, quindi, le prestazioni in termini di rilevazione complessive, nell’ambito di
uno scenario reale di utilizzo, sono medio-alte, il che è suggerito anche dal valore del
parametro F-Measure, il quale si attesta intorno ad un valore di 0,8.
Da notare infine che da tale sottoattività è stato rilevato un corretto funzionamento del
sistema, il quale non ha generato alcun tipo di problema nel corso delle simulazioni
realizzate.
6.3 Valutazione al variare del traffico
Per quanto riguarda la seconda sottoattività, anch’essa è realizzata nell’ambito dello
scenario di Network Security, come già anticipato nell’introduzione di questo capitolo, ed
è incentrata sul verificare la capacità della piattaforma del sistema di rilevare attacchi,
questa volta considerando però più livelli di traffico, differenti l’uno dall’altro, e
caratterizzati da un valore sempre maggiore di eventi.
224
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
6.3.1 Descrizione
Per raggiungere lo scopo appena definito, anche in questo caso è stata presa in
considerazione, come base di partenza per la generazione degli eventi, la distribuzione
definita in [24]. Infatti, avendo come obiettivo quello di valutare il sistema con differenti
livelli di traffico, si è deciso di generare questi ultimi riducendo e aumentando in maniera
proporzionale la quantità di eventi per ogni tipologia prevista nella tabella 6.1.
Precisamente i livelli generati sono definiti nella seguente tabella.
Tabella 6.4: Livelli di traffico generati
Traffico
Totale
alert
generati
Upload
sospetto
Connessioni
TCP multiple
Port
Scanning
A
S
1
A
S
2
A
S
3
A
S
4
R
S
R
S
R
S
R
S
R
179
10
3
5
1
15
81
10
25
5
2
12
3
7
309
20
6
10
1
15 162
10
50
5
5
12
6
7
438
30
9
15
1
15 243
10
75
5
7
12
9
7
568
40 12 20
1
15 324
10
100
5
10
12
12
7
827
60 18 30
1
15 486
10
150
5
15
12
18
7
1086
80 24 40
1
15 648
10
200
5
20
12
24
7
• A
Traffico
1 c
Traffico
2 c
Traffico
3 e
Traffico
4 s
Trafficos
5
Trafficoo
6
Download
sospetto
Accesso sospetto
È importante notare che anche in questo caso, per ogni tipologia di eventi sono definiti i
due valori S ed R. Infatti, allo scopo di valutare le capacità di riconoscimento di attacchi
del nostro sistema è stato ovviamente necessario non solo generare eventi che ricreassero
uno scenario reale, ma anche eventi che facessero parte di attacchi reali.
Una cosa fondamentale da notare però, e che è ben visibile anche dalla tabella, è che in
ogni livello di traffico ad aumentare sono solo gli eventi generati come falsi positivi,
225
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
mentre rimangono invariate le quantità degli eventi generati al fine di simulare attacchi
reali, la cui distribuzione è ancora quella della figura 6.2. Si comprende quindi, che ad
aumentare del livello, crescere il traffico di disturbo per il nostro sistema.
Il compito della piattaforma implementata sarà ancora una volta, quindi, quello di cercare
di rilevare questi attacchi, all’aumentare del traffico di eventi da analizzare.
Naturalmente, anche per questa attività è stata prevista sia la generazione degli eventi
attraverso il tool implementato, di cui si è parlato nell’ambito della descrizione della
precedente sottoattività, sia la realizzazione di simulazioni baste su più giorni sfruttando il
tempo simulato. Precisamente ogni livello di traffico è stato simulato per 10 giorni.
I parametri valutati sono esattamente gli stessi presi in considerazione nella precedente
attività. Di seguito sono mostrati i risultati ottenuti da questa seconda sottoattività.
6.3.2 Risultati ottenuti
Dalla simulazione realizzata sul nostro sistema, prevedendo quanto detto nel paragrafo
precedente, sono stati ottenuti risultati ottimamente riassunti nella tabella 6.5, nella quale i
dati presenti sono da intendersi come valori medi su una simulazione di 10 giorni, in
tempo simulato.
Analizzando tale tabella, è possibile notare che anche in questa attività viene messa in luce
la capacità del sistema di ridurre considerevolmente il carico di lavoro a cui è soggetto un
operatore umano. Infatti come si può vedere, il numero di attacchi rilevati, e quindi di
alert generati dal sistema, è nettamente inferiore rispetto a quelli che sarebbero stati
generati nel caso di assenza dello stesso. Precisamente, nella simulazione realizzata,
l’operatore dovrà analizzare tra i 23 e 51 alert al giorno, contro i 179 - 1086 che avrebbe
dovuto analizzare in sua assenza, al variare del traffico.
226
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Tabella 6.5: Risultati della seconda sottoattività di valutazione
Traffico
Traffico
1
Traffico
2
Traffico
3
Traffico
4
Traffico
5
Traffico
6
Attacchi
Falsi
Falsi
Reali
Positivi Negativi
rilevati
Alert
generati
Attacchi
rilevati
179
23
20,4
2,6
1,6
0,927
0,887
0,91
309
28,7
20,3
8,4
1,7
0,923
0,707
0,80
438
34,1
20,2
13,9
1,8
0,918
0,592
0,72
568
36,2
20,1
16,1
1,9
0,914
0,555
0,69
827
46,6
20
26,6
2
0,909
0,429
0,58
1086
50,5
19,9
30,6
2,1
0,905
0,394
0,55
Recall
Precision F-Measure
Per quanto riguarda, invece, la sua capacità di rilevare attacchi all’aumentare del carico,
sempre dalla tabella è possibile vedere che il sistema, nelle condizioni simulate, è stato in
grado di rilevare mediamente il 91% degli attacchi reali generati, che ricordiamo sono 22
(vedi tabella 6.2). Infatti gli attacchi reali rilevati variano da un minimo di 19,9 ad un
massimo di 20,4, ciò mette in luce ottime capacità di rilevare tutti gli attacchi generati,
perdendone pochi, anche all’aumentare del traffico di disturbo. Tale risultato è avvalorato
maggiormente sia dai Falsi Negativi, il cui valore non è mai superiore alle 2 unità, sia da
quelli di Recall che si attestano mediamente ad un valore abbastanza prossimo a 1.
Diversamente invece accade relativamente alla capacità del sistema di rilevare i soli
attacchi reali all’aumentare del carico. Infatti dando uno sguardo ai Falsi Positivi è
possibile vedere come essi crescano all’aumentare degli alert generati, il che ci porta a
comprendere che il sistema tende a generare falsi allarmi in quantità sempre maggiori
all’aumentare del traffico. Tale aspetto è comprensibile anche valutando i valori di
Precision, i quali decrescono considerevolmente all’aumentare del livello di traffico,
giungendo ad un valore, nel caso peggiore, nettamente lontano dall’ottimo, che ricordiamo
è rappresentato dal valore 1.
In ogni caso, si tratta comunque di un risultato accettabile se paragonato all’enorme
227
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
riduzione di Falsi Positivi che il sistema introduce con il suo utilizzo, e di cui si è trattato
all’inizio di questo paragrafo.
In conclusione, quindi, le prestazioni complessive in termini di rilevazione degli attacchi
sono ottimali in condizioni di carico basso, come è suggerito anche dai valori del
parametro F-Measure, i quali al ridursi del traffico tendono sempre di più all’ottimo.
Tali risultati sono meglio comprensibili dal seguente grafico, dove sono mostrati i
parametri di Recall, Precision e F-Measure proprio al variare del traffico.
Figura 6.1: Recall, Precision e F-Measure al variare del traffico
Analizzando il grafico, si può notare come la Recall subisca una riduzione molto lieve,
restando quasi pressoché immutata, al variare della quantità di traffico. Questo suggerisce,
come già preannunciato, che il sistema è in grado di rilevare buona parte degli attacchi
reali che sono stati sferrati verso l'organizzazione.
Per quanto riguarda la Precision, invece, si può notare una sua netta riduzione
228
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
all'aumentare della quantità di alert simulati, proprio come si è già notato nella tabella
precedente. Ciò, come già detto, è sintomo del fatto che il sistema introduce falsi positivi
in quantità sempre maggiore all'aumentare del traffico. Ricordiamo nuovamente, però,
che nonostante questo il sistema riesce comunque a svolgere egregiamente uno dei suoi
scopi fondamentali e cioè ridurre il carico di lavoro per l'operatore umano, infatti seppur i
falsi positivi aumentano, la loro quantità è nettamente inferiore rispetto a quelli che
sarebbero generati e segnalati all'operatore in assenza del nostro sistema. Precisamente si
ottiene mediamente una riduzione circa pari al 92%.
Infine, così come accade per la Precision, anche la F-Measure ha un andamento
discendente molto più marcato rispetto alla Recall all'aumentare della quantità di alert
generati. Ciò ci suggerisce che le migliori prestazioni del nostro sistema sono ottenute con
una quantità di traffico non estremamente elevato. Tale affermazione è ulteriormente
avvalorata dal seguente grafico, dove è mostrata la curva di Recall/Precision.
Figura 6.2: Curva Recall/Precision al variare del traffico
229
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Infatti, analizzando l’andamento della curva, e sapendo che in un grafico di questo tipo la
prestazione ideale si ottiene quando più ci si avvicina al punto (1,1), si può vedere
facilmente che le prestazioni del sistema sono ottimali al diminuire degli alert generati.
Anche qui, inoltre, è possibile verificare, come ad una lieve riduzione della Recall
corrisponda una maggiore riduzione della Precision, il che convalida quanto già dedotto
precedentemente, e cioè che il nostro sistema introduce pochi falsi negativi all'aumentare
del traffico, mentre introduce maggiori falsi positivi all'aumentare di quest'ultimo.
In ultima istanza, è bene notare che anche in questa sottoattività è stato rilevato un corretto
funzionamento del sistema, il quale non ha generato alcun tipo di problema nel corso delle
simulazioni realizzate.
230
Conclusioni e Sviluppi futuri
Nell’ambito di questo lavoro di tesi è stato progettato e successivamente implementato un
sistema integrato per la rilevazione di situazioni anomale in scenari di sicurezza.
Tale sistema è nato essenzialmente allo scopo di fornire un supporto ad un operatore
umano, sia nell’ambito della Building che Network Security, in quanto i centri di controllo
sono oggi caratterizzati da una quantità sempre maggiore di dispositivi indipendenti, e
molto spesso eterogenei. Ciò ha portato ad un netto aumento della quantità di dati da
analizzare ed un conseguente aumento dei tempi di risposta da parte dell’operatore. Su di
esso infatti ricade l’intera operazione di analisi e correlazione delle informazioni rilevate,
la quale, quindi, diventa fortemente dipendente dalle sue capacità, nonché dalla sua
conoscenza del contesto monitorato e dei sistemi utilizzati.
Pertanto la piattaforma implementata si pone l’obiettivo di ridurre il carico di lavoro a cui
è soggetto l’operatore, nonché di migliorare la cosiddetta situation awareness, il tutto
attraverso l’ausilio della Complex Event Processing.
Precisamente, la piattaforma è caratterizzata da un’architettura modulare, e a componenti
indipendenti, basata sul paradigma architetturale Event Driven Architecture e su quello di
comunicazione Publish/Subscribe. Essa è dotata di quattro componenti, che sono:
• Mediator
• Enterprise Service Bus
• Prefiltering-Aggregation
231
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
• CEP Engine
Sul sistema così costituito sono state realizzate due attività di verifica, una volta a valutare
il corretto funzionamento del sistema, nonché il rispetto dei requisiti previsti durante la sua
progettazione, e l’altra volta a valutare sperimentalmente la capacità del sistema di rilevare
attacchi informatici. Precisamente, in quest’ultima le valutazioni sono state effettuate
attraverso alcuni parametri, e cioè:
• Falsi Positivi e Falsi Positivi
• Recall, Precision e F-Measure
Inoltre, essa è stata suddivisa in due sottoattività. Nella prima si è sottoposta al sistema una
distribuzione reale di traffico, mentre nella seconda sono stati sottoposti ad esso differenti
livelli di traffico, ognuno caratterizzato da una quantità crescente di eventi.
Oltre al corretto funzionamento della piattaforma, dalle due attività previste è emerso che
il sistema soddisfa i requisiti definiti in fase di progettazione, ma, soprattutto, è emersa
anche la sua capacità di generare un valore molto basso di Falsi Negativi, anche
all’aumentare del traffico. Infatti sono stati osservati valori di Recall abbastanza prossimi a
1, il che si traduce nella capacità del sistema implementato di riuscire a riconoscere tutti
gli attacchi a cui la rete monitorata è sottoposta. Oltre a ciò, è anche emersa la sua
tendenza a generare un valore crescente di Falsi Positivi all’aumentare del carico, il che si
traduce nell’incapacità di rilevare i soli attacchi reali a cui è soggetta la rete monitorata
quando la quantità di traffico aumenta. Infatti sono stati osservati valori di Precision che si
allontanano fortemente da 1 all’aumentare del livello di traffico.
In realtà, nonostante questo comportamento, il sistema riesce in ogni caso a raggiungere il
suo obiettivo di ridurre il carico di lavoro degli operatori. Dalla seconda attività, infatti, è
emerso anche che, in qualsiasi condizione di traffico, il sistema genera una quantità di
Falsi Positivi nettamente inferiore rispetto a quella a cui sarebbe sottoposto l’operatore
senza il suo utilizzo.
232
Progettazione e sviluppo di un sistema integrato
per la rilevazione di eventi anomali in scenari di sicurezza
Per quanto riguarda gli sviluppi futuri, trattandosi di una prima versione della cosiddetta
piattaforma CEvOS, il sistema implementato richiede sicuramente una serie di
ottimizzazioni. Prima tra tutte, la necessità di migliorare le regole di correlazione con il
quale è stato istruito il CEP Engine, al fine di ridurre la quantità di Falsi Positivi che sono
generati dal sistema all’aumentare del traffico a cui è sottoposto.
Oltre a questa, vi sono altre migliorie che potrebbero essere realizzate sul sistema, e che
risulterebbero di grande interesse. Tra queste abbiamo ad esempio:
• L’introduzione di tecniche di autoapprendimento, che consentano al sistema di poter
riconoscere situazioni non previste, e per le quali non è stata definita a priori
alcuna di regola
• L’introduzione di un database per la storicizzazione degli eventi, il che darebbe la
possibilità di realizzare operazioni di Historical Analysis
• L’introduzione nel sistema di più motori di correlazione, e prevedere la
combinazione dei loro esiti attraverso un sistema multi-esperto, in modo tale da
migliorare la capacità del sistema nel riconoscimento di situazioni anomale.
233
Bibliografia
[1]
System Management, http://www.sysmanagement.it/
[2]
Cini ITEM, http://www.consorzio-cini.it/?q=node/19
[3]
D. Luckham, 2007, “A short history of complex event processing - part 1:
Beginnings”
[4]
D. Luckham, 2007, “A short history of complex event processing - part 2: The rise
of CEP”
[5]
D. Luckham, 2002, “The Power of Events: An introduction to Complex Event
Processing in Distribuited Systems”
[6]
J. Holland, 1992, “Complex Adaptive Systems”
[7]
David B. Robins, 2010, “Complex Event Processing”, University of Washington,
Redmond, WA
[8]
Alessandro Miracca, 2010/2011, Tesi: “Approccio basato su Complex Event
Processing per l'adattività nei sistemi informativi”, Politecnico di Milano, Corso di
Laurea Specialistica in Ingegneria Informatica
[9]
Antonio Addivinola, 2009/2010, Tesi: "Sviluppo di un’architettura software per il
“Complex Event Processing” in scenari di videosorveglianza", Università degli
studi di Napoli Federico II, corso di Laurea Specialistica in Ingegneria Informatica
[10] Peyman Kabiri, Ali A. Ghorbani, July 2007, “A Rule-Based Temporal Alert
Correlation System”, Vol.5, No.1, PP.66–72
[11] Andreas Muller, 2009, “Event Correlation Engine”, Department of Information
Technology and Electrical Engineering Swiss Federal Institute of Technology
Zurich
234
[12] Nahid Amani, Mahmood Fathi, Mehdi Dehghan, “A Case-Based Reasoning Method
For Aalarm Filtering And Correlation In Telecommunication Networks”
[13] Feng Xuewei, 2010, “Analyzing and Correlating Security Events Using State
Machine”, Nat. Key Lab. of Sci. & Technol. on Inf. Syst. Security, Beijing Inst. of
Syst. Eng., Beijing, China
[14] B. Schilling, B. Koldehofe, K. Rothermel, “Distributed heterogeneous event
processing: enhancing scalability and interoperability of CEP in an industrial
context”
[15] D. Jobst, “Modern Process Management with SOA, BAM und CEP”
[16] Esper
Team
and
EsperTech
Inc.,
“Esper
Reference
Version
4.6.0”,
http://esper.codehaus.org
[17] SNORT, www.snort.org
[18] R. Gerhards, 2009, RFC 5424: “The Syslog Protocol”
[19] RSYSLOG, http://en.wikipedia.org/wiki/Rsyslog
[20] Ashare, Ashare Standard: “BACnet - A Data Comunication Protocol for Building
Automation
and
Control
Networks”,
ANSI/ASHARE
Addendum
d
to
ANSI/ASHARE standard 135-2001
[21] Apache ActiveMQ, http://activemq.apache.org/
[22] S. Russo, D. Cotroneo, C. Savy, A. Sergio, 2002, “Introduzione a CORBA”,
McGraw-Hill
[23] Bruce Snyder, Dejan Bosanac, Rob Davies, 2011, “ActiveMQ in Action”, Manning
Pubblications
[24] A. Pecchia, A. Sharma, Z. Kalbarczyk, D. Cotroneo, R. K. Iyer, 2011, “Identifying
Compromised Users in Shared Computing Infrastructures: a Data-Driven Bayesian
Network Approach”, Dipartimento di Informatica e Sistemistica, Università degli
Studi di Napoli Federico II, Center for Reliable and High Performance Computing,
University of Illinois at Urbana-Champaign
235