www.hakin9.org
hakin9 Nr 5/2006
44
Pod lupą
W
sferze bezpieczeństwa systemu in-
formatycznego logi zdarzeń odgry-
wają krytyczną rolę. We współcze-
snym świecie wiele aplikacji, systemów ope-
racyjnych, urządzeń sieciowych i innych kom-
ponentów systemu jest w stanie zapisywać do
plików komunikaty o związanych z bezpieczeń-
stwem wydarzeniach. Pochodzący z BSD pro-
tokół syslog to standard logowania zdarzeń ob-
sługiwany przez większość producentów syste-
mów operacyjnych i urządzeń sieciowych, po-
zwalający na uruchomienie centralnego ser-
wera logów, który zbiera i składuje wiadomo-
ści o zdarzeniach z całego systemu informa-
tycznego. Istnieje także szereg elastycznych i
potężnych implementacji serwera syslog zdat-
nych do użytku na centralnym serwerze logów,
w szczególności Syslog-ng. Biorąc pod uwa-
gę, że logowanie zdarzeń jest szeroko rozpo-
wszechnione i wysoce ustandaryzowane, są
duże szanse że po zaistnieniu w systemie in-
formatycznym incydentu związanego z bez-
pieczeństwem, fakt ten dokumentować będzie
jedna lub więcej wiadomości w pliku bądź pli-
kach logów.
Jako że w większości przypadków wiado-
mości o zdarzeniach są dołączane do plików
logów w czasie rzeczywistym w miarę, jak są
one emitowane przez komponenty systemu, lo-
gi zdarzeń są doskonałym źródłem informacji
dla monitorowania systemu, uwzględniając tu-
taj mogące w nim wystąpić wydarzenia z dzie-
dziny bezpieczeństwa. W ciągu ostatnich 10-15
lat powstało wiele otwartych narzędzi pozwala-
jących na monitorowanie logów zdarzeń w cza-
sie rzeczywistym, m.in. Swatch czy Logsurfer.
Simple Event Correlator
(SEC) w monitorowaniu
logów bezpieczeństwa
Risto Vaarandi
stopień trudności
W ciągu ostatniej dekady korelacje między zdarzeniami stały
się istotną techniką przetwarzania zdarzeń w wielu dziedzinach
(zarządzaniu sieciami i bezpieczeństwem, detekcja intruzów itd.),
jednak istniejące otwarte narzędzia monitorujące nie obsługują
ich zbyt dobrze. Omówimy tutaj, jak zastosować SEC
w monitorowaniu i korelowaniu zdarzeń z logów bezpieczeństwa.
Z artykułu dowiesz się...
• Czym jest korelowanie zdarzeń i jakie są po-
wszechne podejścia do tego zagadnienia,
• jaka była motywacja ku stworzeniu SEC i jakie
są jego główne możliwości,
• jak zastosować SEC w monitorowaniu w czasie
rzeczywistym logów zdarzeń bezpieczeństwa.
Powinieneś wiedzieć...
• zakładamy, że czytelnik zna język wyrażeń re-
gularnych,
• przy czytaniu sekcji Integrowanie własnego ko-
du Perla z zasadami SEC pomocna okaże się
znajomość podstaw Perla.
hakin9 Nr 5/2006
www.hakin9.org
Pod lupą
46
Niestety, większość z tych narzędzi
jest w stanie wykonywać jedynie naj-
prostsze zadania, na przykład pod-
nosić alarm natychmiast po dołącze-
niu konkretnej wiadomości do pliku
logów. Z drugiej strony, wiele waż-
nych zadań z dziedziny przetwarza-
nia zdarzeń opiera się na korelowa-
niu zdarzeń – konceptualnej proce-
durze interpretacji, w której znacze-
nie przypisywane jest szeregom zda-
rzeń mających miejsce w uprzednio
określonych przedziałach czasu (Ja-
kobson i Weissman, 1995). Aplikacja
implementująca korelowanie zda-
rzeń nazywana jest korelatorem zda-
rzeń; w czasie realizacji procedury
interpretacji korelator może tworzyć
nowe zdarzenia i/lub ukrywać zda-
rzenia oryginalne przed końcowym
użytkownikiem.
W ramach przykładu na to, jak
ważne jest korelowanie zdarzeń w
zarządzaniu bezpieczeństwem, roz-
ważmy przetwarzanie zdarzeń nie-
udane logowanie. Chociaż pojedyn-
cze zdarzenie nieudane logowanie
może być oznaką próby złamania ha-
sła, jednak może ono także znaczyć,
że użytkownik przypadkowo wpisał
niewłaściwe hasło. Z tego względu
nie można po prostu skonfigurować
narzędzia monitorującego logi tak,
by ogłaszało ono natychmiastowy
alarm po wystąpieniu w logach wia-
domości nieudane logowanie – skut-
kiem takiego podejścia mogłaby być
duża liczba fałszywych alarmów. Do
ograniczenia liczby fałszywych alar-
mów wykorzystać można jeden bądź
oba przedstawione poniżej sposoby
korelacji zdarzeń:
• jeżeli wystąpiło N zdarzeń nie-
udane logowanie jako użytkow-
nik X w ciągu ostatnich T sekund,
wygeneruj zdarzenie nadmierna
liczba nieudanych logowań jako
użytkownik X i wyślij je w formie
alarmu do administratora bezpie-
czeństwa,
• jeżeli wystąpiło zdarzenie nie-
udane logowanie jako użytkow-
nik X, a w ciągu kolejnych T se-
kund nie zaobserwowano zda-
rzenia udane logowanie jako
użytkownik X, wygeneruj zdarze-
nie nieudane logowanie bez póź-
niejszego sukcesu, jako użytkow-
nik X i wyślij je w formie alarmu
do administratora bezpieczeń-
stwa.
W ciągu ostatniej dekady zapropo-
nowano szereg podejść do korelo-
wania zdarzeń, między innymi opar-
te na: regułach (Froehlich et al.,
2002), księgach kodów (Yemini et
al., 1996), grafach (Gruschke 1998)
i sieciach neuronowych (Wietgrefe
et al., 1997; Wietgrefe 2002), a tak-
że metody probabilistyczne (Meira
1997; Steinder and Sethi, 2002). Po-
nadto na rynku dostępnych jest wie-
le produktów korelujących zdarze-
nia, na przykład HP ECS, SMARTS,
NetCool, NerveCenter, LOGEC czy
RuleCore.
Metoda oparta na księgach kodów
(wykorzystywana przez SMARTS)
działa następująco – jeżeli szereg
zdarzeń
e1, …, ek
ma być interpreto-
wany jako zdarzenie A,
e1, …, ek
jest
składowany w księdze kodów jako bi-
towy wektor wskazujący na A. Gdy
korelator ma skorelować szereg zda-
rzeń, wyszukuje najlepiej pasujący
wektor bądź wektory w księdze kodów
i zgłasza odpowiednie dla niego/nich
interpretacje. W metodzie opartej na
grafach, człowiek-analityk identy-
fikuje wszystkie zależności pomię-
dzy komponentami systemu (usługa-
mi, hostami, urządzeniami sieciowymi
itd.) i konstruuje graf, w którym każdy
wierzchołek to komponent systemu,
każda krawędź zaś – zależność po-
między dwoma komponentami. Kie-
dy występuje szereg zdarzeń, za po-
mocą grafu wyszukuje się pierwotną
ich przyczynę (np. dziesięć zdarzeń
serwer HTTP nie odpowiada zosta-
ło spowodowanych przez awarię po-
jedynczego połączenia sieciowego).
W metodzie opartej na sieciach neu-
ronowych odpowiednio szkoli się sieć,
by mogła identyfikować anomalie
w strumieniu zdarzeń, wykrywać pier-
wotne przyczyny i tak dalej.
Podejście oparte na regułach
jest stosowane bardzo powszech-
nie w korelowaniu zdarzeń i zo-
stało wykorzystane w wielu pro-
duktach, na przykład HP ECS czy
RuleCore. W tym przypadku zda-
rzenia korelowane są według zde-
finiowanych przez człowieka-anali-
tyka reguł postaci warunek → dzia-
łanie,. Jedną z głównych zalet kore-
lowania zdarzeń w oparciu o reguły
jest fakt, że ludzie potrafią na ogół
wyrazić w naturalny sposób swo-
ją wiedzę w postaci reguł. Przykła-
dowo, za pomocą reguł łatwo moż-
na opisać zależności czasowe po-
między zdarzeniami – co w przy-
padku innych metod byłoby kłopo-
tliwe. Ponadto w przeciwieństwie
do niektórych innych metod korelo-
wania zdarzeń (np. w oparciu o sie-
ci neuronowe), korelowanie w opar-
ciu o reguły i jest jasne i przejrzy-
ste dla końcowego użytkownika.
Jak postuluje się w (Rich i Knight,
1991), kiedy końcowi użytkownicy
nie rozumieją, dlaczego i jak aplika-
cja zwróciła takie, a nie inne infor-
macje, mają oni tendencję do igno-
rowania obliczonych przez tę apli-
kację rezultatów.
Chociaż korelowanie zdarzeń
stało się ważną techniką przetwa-
Listing 1.
Reguła SEC korelująca wiadomości SNMP public access udp
ze Snort IDS
# Sample matching input line:
# Mar 1 00:36:32 snorthost.mydomain [auth.alert] snort[17725]: [1:1411:10]
# SNMP public access udp [Classification: Attempted Information Leak]
# [Priority: 2]: {UDP} 192.168.115.34:54206 -> 192.168.52.179:161
type
=
SingleWithSuppress
ptype
=
RegExp
pattern
=
snort
\
[
\
d
+
\
]:
\
[[
\
d
:]+
\
]
SNMP
public
access
udp
.
*
\
{
UDP
\
}
\
([
\
d
\.
]+):
\
d
+
->
([
\
d
\.
]+):
\
d
+
desc
=
SNMP
public
access
from
$
1
to
$
2
action
=
pipe
'
%
s
'
-
s
'
Snort
alert
'
root
window
=
300
Simple Event Correlator
hakin9 Nr 5/2006
www.hakin9.org
47
rzania zdarzeń w wielu dziedzi-
nach (w tym zarządzaniu sieciami
i bezpieczeństwem, detekcji intru-
zów itd.), istniejące otwarte narzę-
dzia do monitorowania logów nie
obsługują go zbyt dobrze. Pomi-
mo faktu, że systemy korelacji zda-
rzeń obecne już na rynku odniosły
wielki sukces i są używane przez
wiele dużych firm na całym świe-
cie, cierpią one na szereg przy-
padłości. Po pierwsze, istniejące
systemy to często ciężkie rozwią-
zania o skomplikowanej konstruk-
cji i interfejsie użytkownika. Ozna-
cza to, że ich wdrażanie i pielę-
gnacja są czasochłonne, a także
że wymagają szeroko zakrojone-
go szkolenia użytkowników. Ponad-
to ich złożoność i wymagania pod
względem zasobów często czynią
je niezdatnymi do wykorzystania
w mniejszych systemach informa-
tycznych bądź do korelowania zda-
rzeń na węzłach o ograniczonych
zasobach obliczeniowych. Po dru-
gie, ze względu na to że istniejące
systemy są w większości komercyj-
ne, są one przywiązane do konkret-
nych platform – klientom zapewnia
się pliki binarne programów, które
można uruchomić pod ograniczo-
ną liczbą systemów operacyjnych.
Ponadto niektóre komercyjne sys-
temy zaprojektowane zostały tylko
pod jedną konkretną platformę za-
rządzania (np. HP OpenView). Nie-
które obciąża także fakt, że zapro-
jektowano je konkretnie pod kątem
zarządzania problemami z siecią,
co czyni niewygodnym ich zasto-
sowanie w innych sferach (w tym
do monitorowania logów zdarzeń).
Po trzecie, istniejące systemy ma-
ją tendencję do bycia dość drogimi,
a co za tym idzie wiele instytucji o
coraz bardziej ograniczonym bu-
dżecie nie może korzystać z nich w
codziennych zadaniach z dziedzi-
ny zarządzania bezpieczeństwem
i sieciami.
W niniejszej publikacji omówi-
my SEC (Simple Event Correlator)
– otwarte narzędzie stworzone przez
jej autora na potrzeby lekkiego i nie-
zależnego od platformy korelowania
zdarzeń – oraz przeanalizujemy kil-
ka z życia wziętych przykładów na
to, jak wykorzystać SEC w monitoro-
waniu i korelowaniu zdarzeń z logów
bezpieczeństwa.
Podstawy SEC
SEC to otwarte narzędzie korelu-
jące zdarzenia, wykorzystujące do
przetwarzania zdarzeń podejście
oparte na regułach. To ostatnie wy-
brane zostało ze względu na natu-
ralność wyrażania w nim wiedzy
oraz przejrzystość procesu korelo-
wania zdarzeń. Głównymi zadania-
mi projektowymi SEC były: nieza-
leżność od platformy, lekkość kon-
strukcji i łatwość konfiguracji, możli-
wość zastosowania w szerokim za-
kresie zadań z udziałem korelowa-
nia zdarzeń oraz niskie wymaga-
nia pod względem zasobów syste-
mowych.
Aby osiągnąć niezależność od
platformy systemu operacyjnego,
autor zdecydował się napisać SEC
w Perlu. Biorąc pod uwagę, że Perl
dostępny jest pod prawie każdym ro-
dzajem systemów operacyjnych i że
stał się standardową częścią wie-
lu ich dystrybucji, perlowe aplikacje
mogą działać pod całą gamą syste-
mów. Ponadto, dobrze napisane pro-
gramy w Perlu są szybkie i efektyw-
nie korzystają z pamięci.
SEC pobiera zdarzenia ze stru-
mieni plików. W chwili obecnej ob-
sługiwane są zwykłe pliki, nazwa-
ne potoki i standardowe wejście,
co pozwala wykorzystywać SEC w
charakterze rozwiązania monitoro-
wania logów zdarzeń i zintegrować
je z dowolnymi aplikacjami zdolny-
mi zapisywać wysyłane przez sie-
bie zdarzenia do strumieni plików.
Listing 2.
Zbiór reguł SEC do korelowania wiadomości sshd o porażce i
sukcesie uwierzytelniania, pod Solarisem
# Sample matching input lines:
# Apr 3 14:20:19 myhost sshd[25888]: [ID 800047 auth.error] error:
# PAM: Authentication failed for risto from myhost2
# Apr 3 14:20:23 myhost sshd[25888]: [ID 800047 auth.info] Accepted
# keyboard-interactive/pam for risto from 192.168.27.69 port 9729 ssh2
type
=
PairWithWindow
ptype
=
RegExp
pattern
=
sshd
\
[
\
d
+
\
]:
\
[
ID
\
d
+
auth
\.
error
\
]
\
error
:
PAM
:
Authentication
failed
for
(
\
S
+)
from
\
S
+
desc
=
PAM
authentication
failed
for
$
1
action
=
event
PAM_AUTHENTICATION_FAILED_FOR_
$
1
ptype2
=
RegExp
pattern2
=
sshd
\
[
\
d
+
\
]:
\
[
ID
\
d
+
auth
\.
info
\
]
\
Accepted
keyboard
-
interactive
/
pam
for
(
$
1
)
from
\
S
+
port
\
d
+
ssh2
desc2
=
PAM
authentication
successful
for
$
1
action2
=
none
window
=
30
type
=
SingleWithThreshold
ptype
=
RegExp
pattern
=
PAM_AUTHENTICATION_FAILED_FOR_
(
\
S
+)
context
=!
USER_
$1
_ALREADY_COUNTED
&&
!
COUNTING_OFF
continue
=
TakeNext
desc
=
Ten
authentication
failures
for
distinct
users
have
been
observed
action
=
pipe
'
%
s
'
-
s
'
PAM
alert
'
root
;
create
COUNTING_OFF
3600
window
=
600
thresh
=
10
type
=
Single
ptype
=
RegExp
pattern
=
PAM_AUTHENTICATION_FAILED_FOR_
(
\
S
+)
context
=!
USER_
$1
_ALREADY_COUNTED
&&
!
COUNTING_OFF
desc
=
Set
up
the
"count once"
context
for
user
$
1
action
=
create
USER_
$1
_ALREADY_COUNTED
600
hakin9 Nr 5/2006
www.hakin9.org
Pod lupą
48
Aplikacje posiadające API zarzą-
dzania zdarzeniami można również
zintegrować poprzez proste wtycz-
ki, które korzystają z wywołań API
przy czytaniu strumienia zdarzeń
z aplikacji i kopiują te ostatnie na
standardowe wyjście bądź do pliku
(przykładową wtyczka dla HP Open-
View Operations znaleźć można w
pakiecie SEC).
SEC może serwować zdarzenia
wywołując podane przez użytkow-
nika polecenia powłoki, zapisując
komunikaty do plików bądź nazwa-
nych potoków, wywołując prekom-
pilowane procedury Perla itd. Za-
uważ także, że zdarzenia te mogą
być także wysyłane przez sieć do
innej instancji SEC, co pozwala na
zestawienie rozproszonych mecha-
nizmów korelowania zdarzeń. Po-
nadto chociaż SEC nie posiada gra-
ficznego interfejsu użytkownika do
przeglądania i zarządzania wytwa-
rzanymi przez siebie zdarzeniami,
bardzo prosto można skierować je-
go zdarzenia do aplikacji/ramy za-
rządzania systemem, która taki GUI
posiada (np. HP OpenView Opera-
tions).
Konfiguracja SEC składowana
jest w plikach tekstowych, które moż-
na tworzyć i modyfikować za pomo-
cą dowolnego edytora tekstu. Każ-
dy plik zawiera jedną lub więcej re-
guł, zaś zbiory reguł z różnych pli-
ków stosowane są praktycznie rów-
nolegle. SEC czyta dane ze swoich
źródeł linia po linii, zaś za każdym
razem, gdy wczytana została nowa
linijka, jest ona porównywana z re-
gułami z pliku bądź plików konfigu-
racyjnych.
Ważną częścią każdej regu-
ły SEC jest wzorzec dopasowania
zdarzenia. SEC obsługuje we wzor-
cach wyrażenia regularne, podłań-
cuchy, procedury Perla oraz war-
tości logiczne. Wsparcie dla wyra-
żeń regularnych ułatwia konfigura-
cję programu, jako że wiele unikso-
wych narzędzi (np. grep, sed, find
itp.) opiera się na nich i przez to
większość administratorów bezpie-
czeństwa, systemów i sieci zna już
język wyrażeń regularnych. Ponad-
to biorąc pod uwagę, że język wy-
rażeń regularnych jest stosowa-
ny przy dopasowywaniu zdarzeń
przez większość narzędzi do moni-
torowania logów, ewentualne wdro-
żenie SEC jako alternatywy dla nich
wymaga znacznie mniej wysiłku.
Poczynając od wersji 2.3.0 moż-
liwe jest przekazywanie zdarzeń
do sprawdzenia prekompilowanych
procedur Perla, co pozwala użyt-
kownikom tworzyć własne mecha-
nizmy dopasowywania wzorców.
Oprócz wzorca dopasowania
większość reguł określa listę dzia-
łań, a opcjonalnie także boolowskie
wyrażenie określające kontekst.
Konteksty SEC to logiczne twory
tworzone w procesie korelowania
zdarzeń, każdy posiada określo-
ny (skończony bądź nie) czas ży-
cia. Konteksty pozwalają nam ak-
tywować bądź deaktywować zasa-
dy dynamicznie, w czasie działania
– np. jeżeli w definicji reguły mamy
wyrażenie kontekstu (X OR Y), a
ani kontekst X, ani kontekst Y w da-
nej chwili nie istnieją, dana reguła
nie zostanie zastosowana. Kolejną
ważną funkcją kontekstów SEC jest
działanie jako składy zdarzeń – in-
teresujące nas zdarzenia mogą być
skojarzone z kontekstem, po czym
wszystkie wybrane zdarzenia mo-
gą być przekazane do zewnętrz-
nego przetworzenia w późniejszym
czasie (pomysł ten zapożyczone
został z Logsurfera).
W chwili obecnej SEC obsługuje
dziewięć rodzajów reguł, implemen-
tujących szereg powszechnych sce-
nariuszy korelowania zdarzeń:
• Single – wykonaj listę działań
po zaobserwowaniu pasującego
zdarzenia,
• SingleWithScript – jak Single, ale
dodatkowo wykorzystaj do dopa-
sowania zewnętrzny skrypt,
• SingleWithSuppress – jak Single,
ale ponadto ignoruj dalsze pasu-
jące zdarzenia przez t sekund,
• Pair – wykonaj listę działań dla
zdarzenia A, po czym ignoruj dal-
sze wystąpienia A do momentu,
aż nie pojawi się zdarzenie B;
w chwili wystąpienia B wykonaj
drugą listę działań,
• PairWithWindow – po zaobser-
wowaniu zdarzenia A, zaczekaj t
sekund na pojawienie się zdarze-
nia B; jeżeli B nie dotrze na czas
wykonaj listę działań, w przeciw-
nym wypadku wykonaj inną listę,
• SingleWithThreshold – licz pa-
sujące zdarzenia przychodzące
w ciągu t sekund, wykonaj listę
działań jeżeli przekroczony zo-
stał podany próg,
• SingleWith2Thresholds – jak
SingleWithThreshold, ale z do-
datkową drugą rundą zliczania,
z opadającym progiem,
• Suppress – ukryj pasujące zda-
rzenia wejściowe,
• Calendar – wykonaj listę działań
o określonej porze.
Większość definicji reguł SEC po-
siada parametr zwany łańcuchem
opisu zdarzenia, którego zada-
niem jest określenie zakresu ko-
relacji zdarzeń (jego szczegółowe
omówienie znajdziecie w sekcji Re-
guły SEC i operacje korelacji zda-
rzeń). Kiedy zdarzenie pasuje do
danej reguły, SEC wylicza klucz ko-
relacji zdarzenia, łącząc nazwę pli-
ku reguły, jej identyfikator oraz łań-
cuch opisu zdarzenia. Jeżeli istnieje
operacja korelacji zdarzeń o takim
samym kluczu, zdarzenie jest z nią
korelowane. Jeżeli nie istnieje taka
operacja, a reguła deklaruje korela-
cję zdarzeń w czasie, SEC tworzy
nową operację o wyliczonym wła-
śnie kluczu. Trzeba tutaj odnoto-
wać, że między regułami, a opera-
cjami korelacji zdarzeń nie istnie-
je zależność jeden na jeden – SEC
może uruchomić wiele operacji dla
jednej reguły, zaś reguły typów:
Single, SingleWithScript, Suppress
oraz Calendar nie deklarują korela-
cji zdarzeń w czasie i z tego wzglę-
du nigdy nie wyzwalają operacji.
Działania SEC przewidziano nie
tylko do generowania zdarzeń wyj-
ściowych, ale także do tworzenia
reguł dla interakcji, do zarządza-
nia kontekstami i składowania zda-
rzeń, do łączenia z SEC zewnętrz-
nych modułów analizy zdarzeń, do
wywoływania własnego kodu Per-
la bez otwierania osobnego proce-
Simple Event Correlator
hakin9 Nr 5/2006
www.hakin9.org
49
su itd. Łącząc grupy reguł z odpo-
wiednimi listami działań i wyraże-
niami kontekstu można definiować
bardziej złożone mechanizmy ko-
relowania zdarzeń. Poniższa sekcja
przedstawia szczegółowe przykła-
dy oraz dyskusję na temat konstru-
owania zbiorów reguł SEC pod ką-
tem monitorowania logów zdarzeń
bezpieczeństwa.
Monitorowanie logów
bezpieczeństwa z SEC
W niniejszej sekcji omówimy kilka
przykładów zbiorów reguł oraz moż-
liwości przetwarzania zdarzeń ofero-
wane przez SEC. Przykładowe zbio-
ry reguł napisane zostały pod ką-
tem monitorowania w czasie rzeczy-
wistym logów zdarzeń – logów zda-
rzeń Snort IDS, dziennika systemo-
wego Solaris /var/adm/messages
oraz logu błędów serwera WWW
Apache. Zbiory te zostały przetesto-
wane pod SEC w wersji 2.3.3.
Jeżeli chcecie poeksperymento-
wać z przedstawionymi w tej sekcji
zbiorami reguł, możecie pobrać SEC
z jego strony domowej. Aby zainsta-
lować SEC z jego pakietu źródłowe-
go, rozpakuj archiwum (np.
tar –xzvf
sec-2.3.3.tar.gz
) i skopiuj nowo utwo-
rzony plik sec.pl do odpowiedniego
katalogu (np.
cp sec-2.3.3/sec.pl /
usr/local/bin
). Strona domowa SEC
zawiera także odnośniki do pakietów
binarnych SEC dla różnych platform
systemów operacyjnych.
Aby uruchomić SEC w trybie inte-
raktywnym, do monitorowania dzien-
nika /var/log/messages z wykorzy-
staniem reguł z my.conf, wprowadź
w linii poleceń poniższe:
sec.pl –conf=my.conf
–input=/var/log/messages
Do skonfigurowania SEC tak, by mo-
nitorował on swoje standardowe wej-
ście (jest to przydatne podczas te-
stów) posłuży nam poniższe pole-
cenie:
sec.pl –conf=my.conf –input=–
Zauważ, że w linii poleceń można
podać więcej niż jedną opcję:
–input
i/lub
–conf
. Inne często stosowane
opcje to
–log
(ustawia dziennik SEC),
–syslog
(poleca SEC generować lo-
gi poprzez syslog),
–debug
(ustawia
poziom logowania SEC),
–pid
(usta-
wia plik identyfikatora procesu SEC),
–detach
(zmusza SEC do odłączenia
się od sterującego terminala i sta-
nia się demonem) oraz
–testonly
(sprawdza poprawność reguł bez
uruchamiania SEC).
Reguły SEC i operacje
korelacji zdarzeń
Załóżmy, że mamy plik reguł o na-
zwie my.conf, zawierający jedną re-
gułę przedstawioną na Listingu 1.
Reguła SingleWithSuppress z
Listingu 1 została zaprojektowa-
na tak, by dopasowywać wiadomo-
ści SNMP public access udp z lo-
gów Snort IDS. Za każdym razem,
gdy demon Snorta zauważa w sie-
ci pakiet zapytania SNMP z polem
społeczności o wartości public, za-
pisuje on odpowiednią wiadomość
– jednak ze względu na to, że wie-
le narzędzi do zarządzania siecią
odpytuje te same hosty wielokrot-
nie z krótkimi interwałami czaso-
wymi, wiadomość może być zapi-
sana wielokrotnie dla tych samych
par źródłowych i docelowych ad-
resów IP. Omawiana tu reguła im-
plementuje scenariusz korelowania
zdarzeń zwany kompresją – powta-
rzające się wystąpienia identycz-
nych zdarzeń są redukowane do
pojedynczego zdarzenia. Parametr
ptype w definicji reguły deklaruje,
że wzorzec dopasowania zdarze-
nia jest wyrażeniem regularnym,
zaś parametr pattern podaje wy-
rażenie regularne. Parametr desc
Listing 3.
Zbiór reguł SEC do konsolidacji wiadomości alarmowych
priorytetu 1 ze Snort IDS
# Matching input line:
# Apr 4 10:10:55 snorthost.mydomain [auth.alert] snort[18800]:
# [1:2528:14] SMTP PCT Client_Hello overflow attempt
# [Classification: Attempted Administrator Privilege Gain]
# [Priority: 1]: {TCP} 192.168.5.43:28813 -> 192.168.250.44:25
type
=
Single
ptype
=
RegExp
pattern
=
snort
\
[
\
d
+
\
]:
\
[[
\
d
:]+
\
]
.
*
\
[
Priority
:
1
\
]:
\
S
+
\
([
\
d
\.
]+):
?\
d
*
->
[
\
d
\.
]+:
?\
d
*
context
=!
ATTACK_FROM_
$
1
continue
=
TakeNext
desc
=
Priority
1
attack
started
from
$
1
action
=
create
ATTACK_FROM_
$
1
;
\
pipe
'
%
s
'
-
s
'
Snort
:
priority
1
attack
from
$
1
(
alert
)
'
root
type
=
Single
ptype
=
RegExp
pattern
=
snort
\
[
\
d
+
\
]:
\
[[
\
d
:]+
\
]
.
*
\
[
Priority
:
1
\
]:
\
S
+
([
\
d
\.
]+):
?\
d
*
->
[
\
d
\.
]+:
?\
d
*
context
=
ATTACK_FROM_
$
1
desc
=
Priority
1
incident
from
$
1
action
=
add
ATTACK_FROM_
$
1
$
0
;
\
set
ATTACK_FROM_
$
1
300
(
report
ATTACK_FROM_
$
1
\
-
s
'
Snort
:
priority
1
attack
from
$
1
(
report
)
'
root
)
Listing 4.
RegułaSEC przepuszczająca jedynie linie z /var/log/
messages
type
=
Suppress
ptype
=
TValue
pattern
=
TRUE
context
=!
_FILE_EVENT_
/
var
/
log
/
messages
desc
=
Pass
only
those
lines
that
come
from
/
var
/
log
/
messages
hakin9 Nr 5/2006
www.hakin9.org
Pod lupą
50
definiuje łańcuch opisu zdarzenia,
parametr action – listę działań wy-
syłającą e-mailem ostrzeżenie do
lokalnego użytkownika root, win-
dow zaś – ustawia okno korelacji
na 300 sekund.
Kiedy wyrażenie regularne pa-
suje do linii na wejściu, zmienne
specjalne $1 i $2 przyjmują wartości
pól odpowiednio: źródłowego i do-
celowego adresu IP z tej linii – wy-
rażenie regularne korzysta bowiem
w przypadku tych pól ze składni
z nawiasami. Następnie SEC wyli-
czy klucz korelacji zdarzeń łącząc
nazwę pliku z regułą, identyfikator
reguły oraz łańcuch opisu zdarze-
nia – np. jeżeli $1 to 192.168.115.34,
a $2 to 192.168.52.179, wówczas
uzyskany klucz będzie miał postać
my.conf | 0 | SNMP public access
from 192.168.115.34 to 192.168.52.179
(identyfikatory reguł nadawane są
od wartości zero, zaś znak poto-
ku wykorzystaliśmy jako separator).
Jeżeli istnieje operacja o danym klu-
czu, SEC przekaże do niej zdarze-
nie wejściowe. Jeżeli operacja o da-
nym kluczu nie istnieje, SEC utwo-
rzy nową, o czasie życia 300 se-
kund. Operacja natychmiast wysy-
ła e-mailem ostrzeżenie do lokal-
nego użytkownika root, korzysta-
jąc z działania pipe – łańcuch opi-
su zdarzenia, oznaczony tutaj przez
%s, zostanie przekazany na stan-
dardowe wejście polecenia
mail –s
'Snort alert' root
– po czym za-
cznie ignorować wszystkie dalsze
zdarzenia tego rodzaju otrzymane
przez SEC do skorelowania. Inny-
mi słowy, reguła zredukuje powta-
rzające się wiadomości SNMP pu-
blic access udp z tymi samymi: źró-
dłowym i docelowym adresem IP,
do pojedynczej wiadomości (pierw-
szej z nich).
Zawarcie w kluczu korelacji zda-
rzeń nazwy pliku z regułami oraz
identyfikatora reguły gwarantuje, że
nigdy nie wystąpi kolizja pomiędzy
operacjami korelacji zdarzeń wy-
zwolonymi przez różne reguły. Po-
nadto użytkownik końcowy może,
wybierając odpowiednią wartość
parametru desc, zmienić zakres ko-
relowania zdarzeń. Jeżeli na przy-
kład wartość parametru desc to
SNMP
public access from $1
, SEC zreduku-
je wszystkie wiadomości o takim sa-
mym źródłowym adresie IP do jed-
nej, całkowicie ignorując adresy do-
celowe.
Na koniec warto wspomieć, iż
należy zachować ostrożność przy
korzystaniu ze zmiennych specjal-
nych $1, $2, … w definicjach sta-
nowiących część linii poleceń – ich
wartości zostaną bowiem zinter-
pretowane przez powłokę tak sa-
mo, jak reszta linii poleceń. Przy-
kładowo, jeżeli parametr pattern
ma wartość
sshd\[\d+\]: (.+)
, ac-
tion zaś –
shellcmd echo $1 >>
myfile
, złowrogi użytkownik mógłby
wywołać poprzez SEC dowolne po-
lecenie zapisując do logów za po-
mocą narzędzia logger fałszywą li-
nię
sshd[0]: `mycommand`
. Aby unik-
nąć sytuacji tego rodzaju, wzorce
SEC ustawiające specjalne zmien-
ne dla linii poleceń powinny być pi-
sane tak, by metaznaki powłoki i in-
ne niespodziewane dane nie były
przypisywane zmiennym.
Tworzenie zestawów reguł
SEC z pojedynczych reguł
Przedstawiony na Listingu 2 zbiór
reguł do przetwarzania wiadomości
o porażkach i sukcesach uwierzy-
telniania stanowi bardziej złożony
przykład, pokazujący jak uzyskać
można interakcję reguł poprzez
syntetyczne zdarzenia oraz kon-
teksty. Zadaniem tego zbioru reguł
jest filtrowanie przypadkowych po-
rażek logowania, po których wkrót-
ce następuje sukces, a następnie
zliczenia nieprzypadkowych po-
rażek, próbując w ten sposób wy-
kryć próby włamania się w krótkim
okresie czasu na dużą liczbę wielu
kont, w odróżnieniu od działań skie-
rowanych przeciwko pojedynczemu
bądź kilku kontom.
Pierwsza reguła, typu PairWi-
thWindow, ma za zadanie kojarzyć
wiadomości sshd o porażkach i
sukcesach uwierzytelniania, w so-
larisowym dzienniku systemowym
/var/adm/messages. Po tym jak wy-
rażenie regularne podane przez pa-
rametr pattern dopasowane zosta-
nie do wiadomości o porażce uwie-
rzytelniania dla danego użytkow-
nika, zmienna $1 ustawiana jest
na nazwę użytkownika. Następnie
SEC uruchamia operację korelowa-
nia zdarzeń, która czeka na wiado-
mość o sukcesie uwierzytelnienia
w ciągu kolejnych 30 sekund. Je-
żeli wiadomość ta dotrze na czas,
nie są podejmowane żadne dzia-
łania (ponieważ parametr action2
ustawiany jest na
none
). Warto za-
uważyć, że w regułach Pair* moż-
na korzystać ze zmiennych specjal-
nych $1, $2, … w parametrze pat-
tern2, tj. wzorzec w drugiej połowie
reguły Pair* może mieć dynamiczny
charakter. Jeżeli wiadomość o suk-
cesie uwierzytelnienia nie pojawi-
ła się, operacja generuje poprzez
działanie event syntetyczne zdarze-
nie o nazwie
PAM _ AUTHENTICATION _
FAILED _ FOR _ <username>
.
Synte-
tyczne zdarzenia SEC traktowane
są jak zwyczajne zdarzenia wej-
ściowe, czytane z plików dziennika
– są dodawane do kolejki wejścio-
wej i dopasowywane do wszyst-
kich reguł.
Druga reguła, typu SingleWithTh-
reshold, uruchamia operację korela-
cji zdarzeń dopasowującą i zliczającą
wiadomości
PAM _ AUTHENTICATION _
F A I L E D _ F O R _ < u s e r n a m e >
.
Jeżeli w oknie o szerokości 600 se-
kund zaobserwowano 10 takich wia-
domości, operacja wysyła e-mailem
ostrzeżenie do lokalnego użytkow-
nika root, a ponadto tworzy kontekst
COUNTING _ OFF
o czasie życia 1 go-
dziny – pozwala on uniknąć wysyła-
nia ostrzeżeń do roota co 10 minut
w sytuacji, gdy skanowanie kont trwa
dłużej. Wyrażenie podane w parame-
trze context definicji reguły można od-
czytać jako: kontekst USER_<user-
name>_ALREADY_COUNTED nie
istnieje i kontekst COUNTING_OFF
nie istnieje (w wyrażeniach kontekstu
SEC
!
oznacza logiczne zaprzecze-
nie,
&&
- logiczną koniunkcję (AND), a
||
- logiczną alternatywę (OR)). Dla-
tego w przypadku istnienia kontek-
stu
COUNTING _ OFF
wyrażenie zwró-
ci fałsz i reguła nie dopasuje żadne-
go zdarzenia. Po zliczeniu zdarzenia
PAM _ AUTHENTICATION _ FAILED _ FOR _
Simple Event Correlator
hakin9 Nr 5/2006
www.hakin9.org
51
<username>
jest ono przekazywane
do trzeciej reguły, albowiem parametr
continue drugiej reguły ma wartość
TakeNext
. Trzecia reguła tworzy kon-
tekst
USER _ <username> _ ALREADY _
COUNTED
i, biorąc pod uwagę że czas
życia kontekstu i rozmiar okna zlicza-
nia są takie same (600 sekund), za-
pewnia on że każda unikalna nazwa
użytkownika zwiększy licznik tylko
raz na etapie zliczania (po utworze-
niu kontekstu dla danej nazwy użyt-
kownika wyrażenie kontekstu drugiej
reguły dla tej nazwy będzie zwracało
fałsz). Innymi słowy, interakcja pomię-
dzy drugą a trzecią regułą oznacza,
że e-maile z ostrzeżeniami będą wy-
syłane tylko w przypadkach dotyczą-
cych dziesięciu różnych kont.
Wykorzystanie kontekstów
SEC do konsolidacji zdarzeń
Konteksty SEC wykorzystać moż-
na nie tylko do aktywowania i de-
aktywowania reguł, ale także do
składowania zdarzeń. SEC definiu-
je działanie add dodające zdarze-
nie do składu zdarzeń danego kon-
tekstu, działanie report do przekazy-
wania wszystkich zdarzeń ze składu
na standardowe wejście zewnętrz-
nego polecenia, a także szereg zda-
rzeń do wykonywania innych ope-
racji na kontekstach (np. do prze-
noszenia danych pomiędzy kontek-
stami bądź zmiennymi specjalnymi
SEC). W niniejszej sekcji przyjrzy-
my się prostemu scenariuszowi wy-
korzystania kontekstów do agrega-
cji i zgłaszania wiadomości alarmo-
wych Snort IDS.
Wiadomości alarmowe w dzien-
nikach demonów Snorta mają przy-
znawany priorytet od 1 do 3 (gdzie
1 to najwyższy, a 3 – najniższy
priorytet), ponadto każda wiado-
mość posiada pola ze źródłowym
i docelowym adresem IP, odzwier-
ciedlające nadawcę i odbiorcę po-
dejrzanego ruchu w sieci. Dość po-
wszechnym zjawiskiem jest fakt, że
po zauważeniu przez Snorta zda-
rzenia dla pewnego źródłowego
adresu IP, wkrótce potem pojawiają
się inne zdarzenia związane z tym-
że adresem (szczególnie prawdzi-
we jest to w przypadku ataków za
pomocą narzędzi starających się
znaleźć w sieci docelowej jak naj-
większą liczbę słabych punktów).
Z tego względu często nie jest roz-
sądne generowanie alarmów dla
każdego wydarzenia – lepiej kon-
solidować je w mniejszą liczbę ra-
portów.
Zestaw reguł przedstawiony na
Listingu 3 zaprojektowano tak, by
przetwarzać komunikaty Snorta o
priorytecie 1 i tej samej wartości po-
la źródłowego adresu IP (w dalszej
części tego fragmentu tekstu ruch
sieciowy wyzwalający takie wiado-
mości nazywać będziemy atakami).
Kiedy zauważona zostaje pierwsza
wiadomość dla danego źródłowe-
go adresu IP, SEC wyśle e-mailem
ostrzeżenie o rozpoczęciu ataku. Je-
żeli w ciągu kolejnych 5 minut nie po-
jawiły się żadne nowe wiadomości
dla tego adresu o priorytecie 1, SEC
traktuje to jako koniec ataku i wysyła
e-mailem raport zawierający wszyst-
kie zapisane wiadomości istotne dla
tego ataku.
Aby składować wiadomości doty-
czące pewnego adresu IP
<ipaddress>
,
zbiór reguł tworzy kontekst
ATTACK _
FROM _ <ipaddress>
. Pierwsza reguła
wykrywa pierwsze zdarzenie przyna-
leżące do ataku – dopasowuje on zda-
rzenia o priorytecie 1 dla danego źró-
dłowego adresu IP tylko wtedy, gdy nie
istnieje jeszcze kontekst dla tego adre-
su. Po dopasowaniu zdarzenia reguła
tworzy kontekst i wysyła e-mailem do
lokalnego użytkownika root ostrzeże-
nie o rozpoczęciu ataku. Druga regu-
ła dopasowuje wiadomości priorytetu
1 i za pomocą działania add dołącza
je do składu zdarzeń odpowiedniego
kontekstu (zmienna specjalna $0 za-
wiera całość dopasowanej linii wiado-
mości). Następnie reguła wykorzystu-
je działanie set, aby przedłużyć czas
życia kontekstu o kolejne 300 sekund
oraz ustawić dlań działanie przy kaso-
waniu (
report ATTACK _ FROM _ $1 mail
-s 'Snort: priority 1 attack from $1
(report)' root
). Działanie to zostanie
wywołane tuż przed upływem cza-
su życia kontekstu i jego usunięciem,
Listing 5.
Zbiór reguł SEC do monitorowania dziennika błędów
lokalnego serwera WWW Apache za pomocą dynamicznej listy wyrażeń
regularnych, a także przekazywania pasujących linii do zdalnego
serwera syslog
type
=
Single
ptype
=
SubStr
pattern
=
SEC_STARTUP
context
=
SEC_INTERNAL_EVENT
continue
=
TakeNext
desc
=
Load
the
Sys
::
Syslog
module
action
=
assign
%
a
0
;
eval
%
a
(
require
Sys
::
Syslog
);
\
eval
%
a
(
exit
(
1
)
unless
%
a
)
type
=
Single
ptype
=
RegExp
pattern
=(
SEC_STARTUP
|
SEC_RESTART
)
context
=
SEC_INTERNAL_EVENT
desc
=
Compile
the
logging
routine
and
initialize
the
list
of
patterns
action
=
eval
%
syslog
(
sub
{
Sys
::
Syslog
::
syslog
(
'
err
', $
_
[
0
]);
}
);
\
eval
%
a
(
@
regexp
=
(
'
192
\.
168
\.
1
\.
1
', '
File
does
not
exist
:
'
);
\
Sys
::
Syslog
::
openlog
(
'
SEC
', '
cons
,
pid
', '
daemon
'
)
)
# Matching input line:
# [Fri Mar 24 09:19:50 2006] [error] [client 192.168.1.1]
# File does not exist: /var/apache/htdocs/robots.txt
type
=
Single
ptype
=
PerlFunc
pattern
=
sub
{
foreach
my
$
pat
(
@
regexp
)
{
\
if
(
$
_
[
0
]
=
~ /$
pat
/
)
{
return
1
;
}
}
return
0
;
}
desc
=
Forward
the
suspicious
message
line
to
remote
syslog
server
action
=
call
%
o
%
syslog
$
0
hakin9 Nr 5/2006
www.hakin9.org
Pod lupą
52
tj. w sytuacji gdy nie zaobserwowano
żadnych wiadomości o priorytecie 1
dla danego IP przez ostatnie 300 se-
kund. Działanie przy kasowaniu wyko-
rzystuje działanie report do przekaza-
nia składu zdarzeń danego kontekstu
do polecenia
mail -s 'Snort: priority
1 attack from $1 (report)' root
, któ-
re wysyła zebrane zdarzenia do lokal-
nego użytkownika root. Z jednej stro-
ny ataki składające się z wielu zdarzeń
będą zgłaszane w jednym liście, z dru-
giej zaś nawet w przypadku długotrwa-
łego ataku końcowy użytkownik wciąż
otrzyma na czas ostrzeżenie o jego
rozpoczęciu.
Monitorowanie wielu plików
Obok możliwości zaawansowane-
go korelowania i konsolidacji zda-
rzeń, SEC posiada kolejną istot-
ną zaletę w porównaniu z inny-
mi dobrze znanymi rozwiązaniami
do monitorowania logów – możli-
wość jednoczesnego monitorowa-
nia wielu dzienników, dzięki której
SEC jest w stanie korelować zda-
rzenia pochodzące z różnych źró-
deł. Ponadto w sytuacji, gdy w sys-
temie istnieje duża liczba dzienni-
ków, mogą być one monitorowane
przez pojedynczy proces SEC, co
nie tylko oszczędza miejsce w ta-
beli procesów, ale także upraszcza
pielęgnację samego SEC (np. SEC
posiada wtedy tylko jeden identy-
fikator procesu i jeden plik dzien-
nika). Konfiguracja SEC pod ką-
tem monitorowania więcej niż jed-
nego źródła wejściowego jest bar-
dzo prosta – po prostu podaje się
mu więcej niż jedną opcję
–input
w
linii poleceń, przekazuje się opcji
–input
nazwę pliku zawierającą jo-
kery, względnie łączy obie możli-
wości.
Jeżeli jednak stosuje się wie-
le reguł, korzystanie z więcej niż
jednego źródła wejściowego może
spowodować problemy z wydajno-
ścią i przejrzystością. Jeżeli obec-
nych jest wiele reguł zaprojektowa-
nych pod kątem pojedynczego źró-
dła, dopasowywanie doń linii po-
chodzących z innych źródeł może
generować istotny narzut na dzia-
łanie programu. Ponadto jeżeli linie
wejściowe z różnych źródeł przy-
padkowo pasują do reguł, do któ-
rych nie miały pasować, wywoły-
wane w ten sposób niespodziewa-
ne efekty uboczne mogą uczynić
zachowanie zbioru reguł niezrozu-
miałym dla użytkownika.
Celem zajęcia się ww. problema-
mi SEC oferuje opcję
–intcontexts
,
która nakazuje mu stworzenie we-
wnętrznego kontekstu po wczyta-
niu linii ze źródła, a następnie ska-
sowaniu go po porównaniu tej li-
nii ze wszystkimi regułami. Jeże-
li plik wejściowy nosi nazwę np.
/var/log/messages, odpowiedni we-
wnętrzny kontekst zostanie nazwa-
ny
_ FILE _ EVENT _ /var/log/messages
.
Dzięki temu, że wewnętrzne kontek-
sty mogą być wykorzystywane w wy-
rażeniach kontekstu w definicjach re-
guł, użytkownik może pisać reguły
pasujące do zdarzeń pochodzących
jedynie z pewnego konkretnego źró-
dła. Jeżeli użytkownik pragnie zasto-
sować własne nazwy wewnętrznych
kontekstów albo stworzyć jeden ta-
ki kontekst dla wielu źródeł wejścio-
wych, odpowiednie nazwy mogą być
podane w argumencie opcji
–input
.
Przykładowo, opcje
–input=/var/
log/syslog=SYSLOG –input=/var/adm/
messages=SYSLOG
nakazują SEC sto-
sować wewnętrzny kontekst
SYSLOG
zarówno dla /var/log/syslog, jak i
/var/adm/messages.
Tytułem przykładu zastosowania
wewnętrznych kontekstów rozważ-
my regułę Suppress przedstawioną
na Listingu 4, umieszczoną na po-
czątku pliku z regułami.
Reguła SEC typu Suppress
ukrywa pasujące do niej zdarze-
nia – pełni rolę filtru nieprzepusz-
czającego zdarzeń do dalszych re-
guł w ich pliku. W definicji regu-
ły na Listingu 4 parametry ptype
i pattern określają, że wzorzec to
wartość logiczna TRUE, pasująca
do każdej linii – jednak wyrażenie
kontekstu
! _ FILE _ EVENT _ /var/
log/messages
zwraca prawdę je-
dynie dla linii nie pochodzących z
/var/log/messages. Z tego wzglę-
du reguła ta może zostać użyta
na początku pliku z regułami za-
projektowanymi do przetwarzania
/var/log/messages, przepuszcza
ona bowiem jedynie linie dla niej
odpowiednie.
Jeżeli opcja –intcontexts zosta-
ła podana, dla syntetycznych zda-
rzeń generowanych przez działa-
nie event SEC stosuje wewnętrz-
ny
kontekst
_ INTERNAL _ EVENT
.
Z drugiej strony, czasem końco-
wy użytkownik chciałby móc zde-
finiować inny wewnętrzny kontekst
dla syntetycznego zdarzenia. Moż-
na to obejść tworząc nazwany po-
tok za pomocą narzędzia mkfifo,
nakazując SEC za pomocą opcji
–input
monitorowanie tego potoku
i stosując w odpowiednich defini-
cjach reguł działanie write zamiast
event. Jeżeli np. stworzyliśmy na-
zwany potok /var/log/pipe wywołu-
jąc polecenie
mkfifo /var/log/pipe
,
a SEC został uruchomiony z opcją
–input=/var/log/pipe=SYSLOG
,
za-
stosowanie
action=write /var/log/
pipe MY _ SYNTHETIC _ EVENT
(które
to działanie każe SEC zapisać linię
MY _ SYNTHETIC _ EVENT
do /var/log/
pipe) powoduje wystąpienie zda-
rzenia
MY _ SYNTHETIC _ EVENT
w we-
wnętrznym kontekście
SYSLOG
.
Integracja własnego kodu
Perla z regułami SEC
Chociaż omówione do tej pory moż-
liwości SEC pozwalają pisać zbiory
reguł odpowiednie dla szerokiego
zakresu scenariuszy korelowania
zdarzeń, istnieją pewne przypadki
których nie da się przetworzyć po-
przez połączenie tych możliwości.
Przykładowo, wzorce RegExp nie
mogą być wykorzystane do zdefi-
niowania dynamicznej listy wyra-
żeń regularnych. Ponadto działanie
pipe z poprzedniego przykładowe-
go zbioru zadań wymaga tworzenia
osobnych procesów dla zewnętrz-
nych poleceń, przez co wywołanie
pipe kilkaset razy na sekundę spo-
woduje zmarnowanie na tworzenie
nowych procesów znaczących ilo-
ści czasu procesora. Wprawdzie
SEC zapewnia zmienne specjalne,
które użytkownik może wykorzy-
stać do składowania wartości, są
one jednak podobne do perlowych
skalarów i nie jest możliwe zbudo-
Simple Event Correlator
hakin9 Nr 5/2006
www.hakin9.org
53
wanie z nich bardziej złożonych
struktur danych (takich jak perlowe
listy czy hasze). Wychodząc na-
przeciw tym problemom SEC ofe-
ruje wzorce PerlFunc (zdefiniowa-
ne przez użytkownika funkcje Per-
la służące do dopasowywania linii
wejściowych) oraz perlowe wyra-
żenia kontekstu, ale także i działa-
nia eval i call pozwalające kompilo-
wać i uruchamiać własny kod Perla
z poziomu SEC.
Zbiór reguł z Listingu 5 pokazu-
je, jak można zastosować działania
eval i call oraz wzorce PerlFunc,
ale także jak korzystać w SEC z
modułów Perla oraz jak tworzyć
i sięgać do struktur danych Perla
we własnym kodzie. Zbiór reguł za-
projektowano pod kątem monitoro-
wania dziennika błędów lokalnego
serwera WWW Apache za pomo-
cą dynamicznej listy wyrażeń regu-
larnych, a także przekazywania pa-
sujących linii do zdalnego serwe-
ra syslog (gdzie mogą być skore-
lowane przez inną instancję SEC).
Celem zaoszczędzenia czasu pro-
cesora zbiór nie wywołuje w ce-
lu przekazywania linii jako wiado-
mości syslog, narzędzia logger, po-
legając zamiast tego na funkcjach
openlog()
i
syslog()
z perlowego
modułu Sys::Syslog.
Aby móc korzystać z modu-
łu Sys::Syslog musi on być za-
ładowany przy starcie SEC. Je-
żeli SEC uruchomiony został z
opcją
–intevents
, przy starcie ge-
neruje on jako pierwsze syntetycz-
ne zdarzenie
SEC _ STARTUP
, przy-
pisuje mu wewnętrzny kontekst
SEC _ INTERNAL _ EVENT
i przetwarza
je przed jakimikolwiek innymi zda-
rzeniami. Pozwala to użytkowniko-
wi pisać reguły służące do urucha-
miania rozmaitych procedur starto-
wych. Pierwsza reguła jest regu-
łą właśnie tego rodzaju, próbują-
cą załadować moduł Sys::Syslog
korzystając z działań: assign oraz
eval. Najpierw ustawia ona zmien-
ną specjalną %a na 0 za pomocą
działania assign, a następnie prze-
twarza kod Perla
require Sys::
Syslog
za pomocą działania eval
(które wewnętrznie wywołuje per-
Bibliografia
• Jim Brown. 2003. Working with SEC – the Simple Event Correlator. http://sixshoot
er.v6.thrupoint.net/SEC-examples/article.html,
• P. Froehlich, W. Nejdl, M. Schroeder, C. V. Damasio, L. M. Pereira. 2002. Using
Extended Logic Programming for Alarm-Correlation in Cellular Phone Networks.
Applied Intelligence 17(2), pp. 187-202,
• Boris Gruschke. 1998. Integrated Event Management: Event Correlation using De-
pendency Graphs. Proceedings of the 9th IFIP/IEEE International Workshop on
Distributed Systems: Operations and Management, pp. 130-141,
• G. Jakobson i M. Weissman. 1995. Real-time telecommunication network ma-
nagement: Extending event correlation with temporal constraints. Proceedings
of the 4th International Symposium on Integrated Network Management, pp.
290-301,
• Dilmar Malheiros Meira. 1997. A Model For Alarm Correlation in Telecommunica-
tion Networks. PhD thesis, Federal University of Minas Gerais, Brazil,
• Elaine Rich i Kevin Knight. 1991. Artificial Intelligence, 2nd edition. McGraw-Hill,
ISBN 0-07-052263-4,
• John P. Rouillard. 2004. Real-time Logfile Analysis Using the Simple Event Corre-
lator (SEC). Proceedings of USENIX 18th System Administration Conference, pp.
133-149,
• M. Steinder i A. S. Sethi. 2002. End-to-end Service Failure Diagnosis Using Be-
lief Networks. Proceedings of the 8th IEEE/IFIP Network Operations and Manage-
ment Symposium, pp. 375-390,
• James Turnbull. 2005. Hardening Linux. Apress, ISBN: 1-59059-444-4.
• Risto Vaarandi. 2005. Tools and Techniques for Event Log Analysis. PhD thesis,
Tallinn University of Technology, Estonia,
• Hermann Wietgrefe. 2002. Investigation and Practical Assessment of Alarm Cor-
relation Methods for the Use in GSM Access Networks. Proceedings of the 8th
IEEE/IFIP Network Operations and Management Symposium, pp. 391-404,
• Hermann Wietgrefe, Klaus-Dieter Tuchs, Klaus Jobmann, Guido Carls, Peter
Froehlich, Wolfgang Nejdl, Sebastian Steinfeld. 1997. Using Neural Networks
for Alarm Correlation in Cellular Phone Networks. Proceedings of the Internatio-
nal Workshop on Applications of Neural Networks in Telecommunications, pp.
248-255,
• S. A. Yemini, S. Kliger, E. Mozes, Y. Yemini i D. Ohsie. 1996. High speed and ro-
bust event correlation. IEEE Communications Magazine 34(5), pp. 82-90.
W Sieci
• http://www.bmc.com/ – BMC Patrol,
• http://www.cisco.com/ – CiscoWorks,
• http://www.managementsoftware.hp.com/products/ecs/index.html – HP ECS,
• http://www.openview.hp.com/ – HP OpenView,
• http://www.netfilter.org/ – Iptables,
• http://www.logec.com/ – LOGEC,
• http://www.cert.dfn.de/eng/logsurf/ – Logsurfer,
• http://www.mysql.com/ – MySQL,
• http://www.nagios.org/ – Nagios,
• http://www.openservice.com/products/nervecenter.jsp – NerveCenter,
• http://www.micromuse.com/ – NetCool,
• http://www.prelude-ids.org/ – Prelude IDS,
• http://www.rulecore.com/ – RuleCore,
• http://simple-evcorr.sourceforge.net/ – Simple Event Correlator,
• http://www.smarts.com/ – SMARTS,
• http://snmptt.sourceforge.net/ – SNMPTT,
• http://www.snort.org/ – Snort IDS,
• http://swatch.sourceforge.net/ – Swatch,
• http://www.balabit.com/products/syslog_ng/ – Syslog-ng.
hakin9 Nr 5/2006
www.hakin9.org
Pod lupą
lową funkcję
eval()
). Jeżeli dzia-
łanie eval zakończyło się sukce-
sem i moduł został załadowany, do
%a przypisana zostanie wartość 1
(którą to wartość zwraca pozytyw-
ne wywołanie
require Sys::Syslog
),
jeżeli eval poniosło porażkę %a za-
chowuje swoją oryginalną wartość
(0). Następnie ponownie wykorzy-
stujemy działanie eval, aby spraw-
dzić wartość %a; jeżeli wynosi ona
0 (tj. moduł nie mógł zostać zała-
dowany), wywołujemy w perlowym
kodzie przetwarzanym przez eval
polecenie
exit(1)
. Jako że wywo-
łanie
exit(1)
ma miejsce wewnątrz
procesu SEC process, spowodu-
je ono zamknięcie SEC z kodem
wyjścia 1.
Przeznaczeniem drugiej reguły
jest dopasowywanie zarówno we-
wnętrznych zdarzeń
SEC _ STARTUP
,
jak i
SEC _ RESTART
(jeżeli SEC uru-
chomiony został z opcją
–intevents
,
po otrzymaniu sygnału SIGHUP
– żądania resetu jego wewnętrz-
nego stanu i ponownego wczyta-
nia konfiguracji – program generuje
syntetyczne zdarzenie
SEC _ RESTART
,
w wewnętrznym kontekście
SEC _
INTERNAL _ EVENT
). Po zaobserwo-
waniu pasującego zdarzenia, regu-
ła najpier korzysta z działania eval
aby przetworzyć kod Perla
sub {
Sys::Syslog::syslog('err', $ _ [0]);
}
. Kod ten stanowi definicję funkcji,
w efekcie eval skompiluje ją i zwróci
wskaźnik do skompilowanego kodu,
który zostanie zapisany w zmiennej
specjalnej %syslog. Sama funkcja
przyjmuje jeden parametr wejściowy
i korzysta z funkcji
syslog()
z modu-
łu Sys::Syslog, by przesłać parametr
wejściowy jako wiadomość poziomu
err do serwera syslog. Następnie re-
guła zainicjuje listę @regexp – per-
lową listę do przechowywania wy-
rażeń regularnych. @regexp jest li-
stą globalną, dzięki czemu można
do niej sięgać bądź ją modyfikować
kolejnymi wywołaniami eval. (Aby
uniknąć kolizji z nazwami zmien-
nych w kodzie SEC tworzona jest
osobna przestrzeń nazw,
main::SEC
,
zaś działanie eval zawsze przetwa-
rza własny kod Perla w tej przestrze-
ni.) Ostatnim krokiem jest otwarcie
połączenia syslog za pomocą funk-
cji
openlog()
, ustawienie nazwy pro-
gramu na
SEC
, obiektu logowania
na
daemon
oraz opcji logowania na
cons,pid
(jeżeli standardowe logowa-
nie zawiedzie; wyślij komunikat na
konsolę; dołącz do każdej wiadomo-
ści identyfikator procesu).
Trzecia reguła została stworzo-
na do dopasowywanie linii wejścia
za pomocą wyrażeń regularnych
z listy @regexp, którą zainicjowa-
ła druga reguła (i która może być
zmieniana w czasie działania pro-
gramu). Do dopasowywania regu-
ła wykorzystuje wzorzec PerlFunc
– wartość parametru pattern musi
być poprawną definicją funkcji Per-
la, która zostanie skompilowana w
czasie wczytywania reguł. W przy-
padku trzeciej reguły funkcja po-
biera linię wejściową (przekazaną
do funkcji poprzez parametr wej-
ściowy $_[0]) i skanuje listę @re-
gexp w poszukiwaniu pasujące-
go wyrażenia regularnego. Jeżeli
znajdziemy odpowiednie wyraże-
nie regularne funkcja zwraca 1 (co
oznacza, że wzorzec PerlFunc do-
pasował linię wejściową), w prze-
ciwnym razie zwraca 0 (co ozna-
cza brak dopasowania). W pierw-
szym przypadku reguła wywoła,
za pomocą działania call, prekom-
pilowaną funkcję Perla służącą do
logowania syslog. Zmienna spe-
cjalna %o służy do przechowywa-
nia wartości wyjściowej wywoła-
nia funkcji, zmienna %syslog za-
wiera wskaźnik do funkcji, zaś $0
(zawierająca całą dopasowywaną
linię wejścia) to parametr wejścio-
wy dla funkcji.
W ten sposób zbiór reguł efek-
tywnie implementuje dynamicz-
R
E
K
L
A
M
A
Chcesz regularnie otrzymywać swoje
czasopismo?
Chcesz płacić mniej?
22,50 zł
w prenumeracie tylko:
* więcej o prezentach na stronie www.hakin9.org/prenumerata
gr
at
is
do
każ
dej prenum
era
ty *
za numer
A
rc
hiw
um
m
agaz
ynu hakin9 2005
na
pł
yc
ie
C
D
Simple Event Correlator
hakin9 Nr 5/2006
www.hakin9.org
55
ne dopasowywanie wyrażeń regu-
larnych do linii z dziennika błędów
serwera WWW, które nie mogłoby
być wyrażone poprzez wzorce Re-
gExp patterns, jak również prze-
kazywanie dopasowanych linii do
zdalnego serwera syslog bez two-
rzenia osobnego procesu wymaga-
nego przez zewnętrzne polecenie.
Dzięki temu, że wszystkie fragmen-
ty kodu Perla zastosowane w trze-
ciej regule są kompilowane, gdy
SEC jest uruchamiany, ich wykony-
wanie podczas działania programu
jest równie wydajne, jak wykonywa-
nie kodu samego SEC.
Wydajność SEC
i doświadczenia
praktyczne
Chociaż SEC jest napisany w ję-
zyku interpretowanym (i z tego
względu nie jest tak szybki ani nie
dysponuje pamięcią tak efektyw-
nie jak skompilowane programy w
C), jest w stanie przetwarzać set-
ki zdarzeń na sekundę i wciąż wy-
magać względnie skromnych zaso-
bów. W przeprowadzonym niedaw-
no eksperymencie o czasie trwa-
nia 49,8 dni, dwie instancje SEC
uruchomiono na linuksowym ser-
werze syslog z dwoma procesora-
mi Intel P4 Xeon o częstotliwości 3
GHz. Pierwsza instancja monitoro-
wała jednocześnie 20 dzienników
i korzystała z 243 reguł w 22 pli-
kach konfiguracyjnych, druga zaś
czytała dane z nazwanego potoku
i korzystała z 67 reguł w 5 plikach.
Pierwsza instancja przetworzyła
107 059 511 linii wejścia (średnio
24,9 linii na sekundę) i zużyła 3,0%
czasu procesora oraz 8,1 MB pa-
mięci. Druga instancja przetworzy-
ła 364 534 428 linii wejścia (śred-
nio 84,7 linii na sekundę), zużyw-
szy 8,8% czasu procesora oraz
6,1 MB pamięci.
Prędkość przetwarzania zda-
rzeń przez SEC silnie zależy od
sposobu ułożenia reguł, istnieje
więc kilka sposobów na poprawie-
nie wydajności. Jako że linie wej-
ściowe są porównywane z regułami
w kolejności, w jakiej te ostatnie de-
finiowane są w pliku, przesunięcie
najczęściej dopasowywanych re-
guł na początek pliku reguł oszczę-
dza czas procesora. Ponadto jeże-
li wiele linii wejścia nie pasuje do
żadnej reguły, oszczędność czasu
da nam również wstawienie na po-
czątku pliku z regułami odpowiada-
jących tym liniom reguł Suppress.
Jeżeli SEC skonfigurowano do mo-
nitorowania wielu źródeł, można
zwiększyć prędkość przetwarzania
zdarzeń przez program stosując
wewnętrzne konteksty (patrz sek-
cja Monitorowanie wielu plików).
Wśród innych pomysłów na popra-
wienie wydajności SEC wspomnieć
można pisanie wydajniejszych wy-
rażeń regularnych oraz zastępowa-
nie gdzie się da wzorców RegExp
wzorcami SubStr (te ostatnie są
szybsze).
W ciągu ostatnich kilku lat SEC
został przyjęty przez wiele różnych
rozmiarów instytucji oraz był wyko-
rzystywany w wielu dziedzinach,
w tym w monitorowaniu logów, za-
rządzaniu firewallami, detekcji intru-
zów oraz zarządzaniu siecią (tro-
chę szczegółowych studiów przy-
O autorze
Risto Vaarandi uzyskał w czerwcu 2005 stopień doktora inżynierii komputerowej na
Politechnice Tallińskiej (Estonia). Od ośmiu lat pracuje w SEB Eesti Ühispank jako in-
żynier rozwoju informatycznego, obecnie zaś jest także na część etatu badaczem w
Instytucie Informatyki na Uniwersytecie Tartu, Estonia. Z Risto można skontaktować
się poprzez jego stronę domową, dostępną pod adresem http://kodu.neti.ee/~risto.
Podziękowania
Opisane tu prace wspierane są przez SEB Eesti Ühispank, a ponadto uzyskały one
wsparcie finansowe w formie estońskiego narodowego grantu nr SF0182712s06.
padków znaleźć możesz w [Vaaran-
di 2005]). SEC stosowano z po-
wodzeniem z: Snort IDS, Prelude
IDS, firewallem iptables, HP Ope-
nView (zarówno NNMm jak i Ope-
rations), Nagios, CiscoWorks, BMC
patrol, SNMPTT itd. SEC wykorzy-
stywano pod szerokim zakresem
systemów operacyjnych, w tym pod
Linuksem, FreeBSD, OpenBSD, So-
larisem, HP-UXem, AIXem, Tru64
Unixem, Mac OSem X oraz Win-
dows 2000.
Podsumowanie
Niniejsza publikacja omówiła SEC
(Simple Event Correlator) – otwar-
te narzędzie do lekkiego i nieza-
leżnego od platformy korelowa-
nia zdarzeń – a ponadto przed-
stawiła z życia wziętych przykła-
dów wykorzystania SEC w moni-
torowaniu w czasie rzeczywistym
zdarzeń z logów bezpieczeństwa,
jednak ze względu na ograniczo-
ną przestrzeń nie wspomina ona
o wielu funkcjonalnościach SEC.
Zainteresowani mogą odnaleźć
dogłębny opis SEC w jego doku-
mentacji online. Dostępny jest tak-
że trochę innych źródeł informacji
na temat SEC. Repozytorium re-
guł SEC na BleedingSnort (http://
www.bleedingsnort.com/sec/) za-
wiera szereg przykładowych zbio-
rów reguł dla wielu scenariuszy,
na przykład korelowania zdarzeń
z programu Snort bądź zarządza-
nia firewallem iptables. Working
with SEC – the Simple Event Cor-
relator (Brown 2003) to tutorial on-
line, który nie tylko stanowi dobre
wprowadzenie do SEC, ale tak-
że omawia kilka zaawansowanych
zagadnień, takich jak np. integra-
cja SEC z MySQL. Rozdział 5 Har-
dening Linux (Turnbull 2005) opi-
suje, jak zaprząc SEC do logowa-
nia plików logów syslog. Wreszcie,
wydana niedawno publikacja za-
wierająca bibliotekę przydatnych
zestawów reguł opisuje zastoso-
wania SEC na Uniwersytecie Mas-
sachusetts w Bostonie (Rouillard
2004). l