• Nie Znaleziono Wyników

Firewalle programowe

W dokumencie Index of /rozprawy2/10323 (Stron 24-34)

2.3. Klasyfikacja implementacyjna

Rozwój platform implementacyjnych systemów bezpieczeństwa typu Firewall jest ściśle powiązany z opisaną w rozdziale 2.2 klasyfikacją funkcjonalną. Wdrażanie nowych mechanizmów ochrony danych niesie z sobą konieczność poszukiwania coraz bardziej wydajnych algorytmów lub architektur sprzętowych. Trend ten utrzymuje się stale, choć obecnie jest bardziej uwarunkowany przez lawinowo rosnącą ilość informacji przetwarzanych w systemach zabezpieczających. Jego efektem jest powstanie rozwiązań wyraźnie wyróżniających w dotychczas jednorodnej grupie systemów stricte programowych, wykorzystujących aplikacje filtrujące oraz popularne procesory ogólnego przeznaczenia. Mowa tutaj o próbach zastosowania rozwiązań sprzętowych w postaci układów ASIC, FPGA bądź pamięci TCAM jako metody zwiększenia bezpieczeństwa oraz wydajności przetwarzania danych.

2.3.1. Firewalle programowe

Historycznie najstarsza metoda implementacji ścian ogniowych wykorzystuje dedykowane aplikacje filtrujące działające w systemie komputerowym opartym na procesorach GPU. To rozwiązanie, choć niewątpliwie najprostsze i najtańsze z możliwych, niesie ze sobą wiele poważnych wad (Rys. 2.8). Przede wszystkim wykorzystanie typowego (powszechnie wykorzystywanego) systemu operacyjnego umożliwia hakerom podejmowanie prób włamań z wykorzystaniem znanych luk bezpieczeństwa.

Platforma komputerowa ogólnego przeznaczenia Aplikacja usługowa Moduły obsługi komunikacji sieciowej Niemodyfikowany system operacyjny Atak Aplikacja usługowa Ograniczenia wydajnościowe . .. ... . ... .. .

Rys. 2.8. Poglądowy diagram wrażliwych punktów struktury programowego Firewalla.

O skali tego problemu świadczy dobitnie liczba rejestrowanych co roku błędów w zabezpieczeniach oprogramowania. Przykładowe zestawienie za rok 2009 dla czterech wybranych wersji popularnych systemów operacyjnych zaprezentowano na rysunku 2.9.

25

Rys. 2.9. Liczba luk bezpieczeństwa wybranych systemów operacyjnych wykrytych w roku 2009 (na podstawie [102]) .

Producenci systemów operacyjnych starają się na bieżąco wydawać odpowiednie poprawki likwidujące wykryte zagrożenia. Jednak to na użytkownikach zapór ogniowych ciąży odpowiedzialność ciągłej aktualizacji oprogramowania wewnętrznego. Jakiekolwiek zaniedbania w tej kwestii mogą doprowadzić do przełamania zabezpieczeń i utraty istotnych danych.

Drugi problemem dotyczy platformy sprzętowej wykorzystanej do budowy tego typu urządzeń. Z reguły minimalizacja kosztów produkcji zmusza producentów do stosowania uniwersalnych rozwiązań sprzętowych wyposażonych w popularne procesory ogólnego przeznaczenia. Nieoptymalizowana pod kątem realizowanych zadań architektura płyt głównych, w połączeniu z dużą ilością zbędnych usług działających w systemie operacyjnym, zmniejsza w sposób radykalny całkowitą wydajność zapory.

Poszukiwania metod rozwiązania opisanych słabych stron zapór programowych obejmują kilka równolegle rozwijających się działań:

 tworzenie specjalnie zabezpieczonych wersji systemów operacyjnych,

 optymalizacja algorytmów klasyfikujących pakiety,

 akceleracja weryfikacji danych z wykorzystaniem rozwiązań sprzętowych.

0 5 10 15 20 25 Windows Server 2008 SUSE Linux Enterprise Server (SLES) 11 Red Hat Enterprise Linux ES4

Debian GNU/Linux 5.0 Li cz b a za re je st ro w an yc h lu k b ez p ie cz eń st w a Microsoft

26 Zabezpieczanie systemu operacyjnego, zwane również utwardzaniem (ang. hardening), polega na minimalizacji ekspozycji na aktualne oraz przyszłe zagrożenia poprzez przeprowadzenie pełnej konfiguracji systemu wraz z usunięciem zbędnych aplikacji i urządzeń [78]. Proces ten nie kończy się na jednorazowej aktywności, lecz powinien być kontynuowany przez administratorów w toku produkcyjnej eksploatacji poszczególnych urządzeń. W przypadku wykorzystywania systemu operacyjnego do budowy dedykowanych ścian ogniowych, utwardzanie powinno sięgać o wiele dalej. Konieczna jest ingerencja w kod źródłowy systemu, tak, aby wdrożyć mechanizmy rozgraniczające w wyraźny sposób obszary, w których funkcjonują aplikacje bezpieczne bądź narażone na złamanie (Rys. 2.10). Dopiero takie podejście daje gwarancję prawidłowej ochrony danych, eliminując możliwość włamania się hakera do systemu operacyjnego z wysokimi prawami użytkownika [36].

Platforma komputerowa ogólnego przeznaczenia Zabezpieczona

aplikacja usługowa

Bezpieczne moduły obsługi komunikacji sieciowej

Bezpieczny system operacyjny Niezabezpieczona aplikacja usługowa Ograniczenia wydajnościowe . .. ... . ... .. . Atak Granica bezpieczeństwa

Rys. 2.10. Poglądowy diagram struktury programowego Firewalla z zabezpieczonym („utwardzonym”) systemem operacyjnym (na podstawie [36]).

Dla systemów z grupy Linux, często wykorzystywanych do budowy programowych ścian ogniowych, stosowane w praktyce mechanizmy ochrony można podzielić na cztery grupy [77]:

 ochrona pamięci w jądrze systemu,

 ochrona pamięci w kompilatorze,

 nadzór nad dostępem do systemu (kontrola dostępu),

 inne (stosujące randomizację, szczegółowe ograniczenia dostępu, zapis zdarzeń

zachodzących w systemie itp.).

Wpisują się one w szersze modele definiujące sposób przydzielania i kontroli uprawnień. W najbardziej powszechnym modelu nieobowiązkowej kontroli DAC (ang. Discretionary Access

Control) zarówno użytkownicy, jak i procesy, dysponują możliwością pełnej kontroli nad

posiadanymi obiektami (m.in. plikami, katalogami, urządzeniami, itp.) [60, 77]. Takie podejście nie nadaje się do budowy bezpiecznego środowiska dla funkcjonowania krytycznych aplikacji. Stąd też w roku 1985 Departament Obrony Stanów Zjednoczonych opracował standard wprowadzający

27 obligatoryjny mechanizm ochrony zwany MAC (ang. Mandatory Access Control) [19]. Model ten można podzielić na składowe polityki obejmujące m.in.: kontrolę dostępu podmiotów (użytkownicy i procesy) do obiektów, autentykację tożsamości a zarazem przywilejów poszczególnych użytkowników oraz metody szyfrowania istotnych danych [60]. W tym przypadku to administrator systemu decyduje o konfiguracji zabezpieczeń i praw dostępów. Użytkownicy nie są w stanie samodzielnie zmienić narzuconej im polityki bez wcześniejszej zgody administratora.

Nieustanny rozwój systemów komputerowych oraz wzrost znaczenia informacji przetwarzanej w postaci cyfrowej spowodował konieczność modyfikowania ogólnych założeń modeli DAC i MDAC. W wyniku takich działań powstało szereg dodatkowych rozwinięć koncepcji ochrony systemów operacyjnych, dostosowanych do specyficznych potrzeb aplikacyjno-użytkowych. Do najważniejszych zaliczyć należy modele:

wymuszania typów TE (ang. Type Enforcement),

kontroli dostępu na podstawie ról RBAC (ang. Role-Based Access Control),

wielopoziomowego bezpieczeństwa MLS (ang. Multi-Level Security).

Model bezpieczeństwa TE, bazujący na kontroli typów obiektów, minimalizuje uprawnienia aplikacji do zakresu pozwalającego na ich poprawne funkcjonowanie oraz ogranicza potencjalne negatywne skutki nadużycia tychże przywilejów [60]. Stanowi on praktyczną implementację elastycznej architektury Flask [95], w której każdemu procesowi oraz obiektowi przypisany zostaje specjalny zestaw atrybutów bezpieczeństwa (ang. security attributes), określany jako tzw. kontekst bezpieczeństwa [124]. Dzięki temu funkcja kontrolująca uprawnienia, w momencie podejmowania decyzji o zezwoleniu danej operacji, dysponuje zbiorem niezbędnych informacji. Implementacja TE wprowadza pojęcie domeny jako atrybutu opisującego każdy proces oraz pojęcie typu klasyfikującego każdy obiekt. Wszystkie procesy będące w tej samej domenie, jak również wszystkie obiekty o konkretnym typie, podlegają takim samym zasadom bezpieczeństwa. Pojedynczy zestaw atrybutów, opisujący zarówno procesy jak i obiekty, pozwala wykorzystać jedną macierz specyfikującą warunki dostępu oraz wzajemnej interakcji pomiędzy typami i obiektami [124].

Kontrola dostępu na podstawie ról RBAC wykorzystuje do podejmowania decyzji informacje o funkcjach, jakie przydzielono użytkownikowi w danej organizacji. Użytkownik nie może według własnego uznania dokonywać operacji czy też uzyskiwać dostępu do danych innych użytkowników systemu. RBAC jest więc przeciwieństwem modelu DAC. Ze względu na brak wykorzystania wielopoziomowych mechanizmów zabezpieczających nie można go jednak zaliczyć wprost do grupy obligatoryjnych modeli MDAC [27]. Wprowadzenie klasyfikowania użytkowników według ról ułatwia proces zarządzania polityką bezpieczeństwa systemu. Wystarczy bowiem zdefiniować zestaw zasad i uprawnień odzwierciedlających strukturę organizacji, a później przyporządkować użytkowników według właściwej im lokalizacji. W przypadku zmiany stanowiska czy też przynależności działowej pracownikowi przydzielony zostaje nowy zestaw reguł.

28 System zabezpieczony zgodnie z wymogami modelu wielopoziomowego bezpieczeństwa MLS, powinien być wyposażony w następujące funkcjonalności [55]:

 możliwość tworzenia oraz izolowania równoważnych klas zasobów systemowych, przez co

wszystkie aktywne elementy danej klasy są dostępne na takich samych zasadach bezpieczeństwa,

 zdefiniowane zasady interakcji pomiędzy poszczególnymi klasami,

 mechanizmy gwarantujące wdrożenie polityki MLS,

 metody kontroli zgodności działania mechanizmów zabezpieczających z obowiązującymi

regułami,

 nadanie czytelnych, łatwo identyfikowalnych etykiet poszczególnym klasom zasobów

systemowych.

Dzięki takim cechom system MLS pozwala w praktyce precyzyjnie odseparować poszczególne klasy informacji oraz zarządzać użytkownikami o różnych poziomach uprawnień. Hierarchiczna struktura klasyfikująca dane oraz uprawnienia, w połączeniu z mechanizmami weryfikacji użytkowników, uniemożliwia nieautoryzowany dostęp do zasobów systemowych. Klasyczne rozwiązania MLS opierają się na modelu kontroli dostępu Bell-LaPadula [9], w którym użytkownik nie może odczytywać danych z wyższych poziomów uprawnień oraz nie może dokonywać zapisów na poziomach innych od przydzielonego użytkownikowi. Restrykcje takie odnoszą się również do programów uruchamianych przez użytkownika w danym systemie [86] .

Zaprezentowanej aktywności w obszarze zwiększania bezpieczeństwa systemów operacyjnych towarzyszy poszukiwanie metod optymalizacji algorytmów klasyfikacji pakietów przetwarzanych przez zapory ogniowe. Pomimo tego, że parametry funkcjonalne poszczególnych rozwiązań są uwarunkowane docelowym obszarem zastosowań, można wyróżnić kilka uniwersalnych wymagań, stawianych wszystkim nowoczesnym algorytmom klasyfikującym. Należą do nich m.in. [26, 33, 34, 62]:

 duża prędkość wyszukiwania – coraz szybsze łącza teleinformatyczne oraz rosnące

wymagania co do akceptowalnych poziomów opóźnień przetwarzania danych wymuszają opracowywanie rozwiązań pozwalających na pracę z prędkościami medium komunikacyjnego (ang. wire-speed),

 minimalizacja ilości zasobów pamięciowych niezbędnych do implementacji algorytmu –

w zależności od przeznaczenia urządzenia zestaw reguł bezpieczeństwa może zawierać od kilkudziesięciu do kilkuset tysięcy elementów,

 skalowalność ilości pól wykorzystywanych do weryfikacji danych – rozbudowa

funkcjonalna systemów bezpieczeństwa wiąże się z koniecznością analizy dodatkowych informacji z nagłówków pakietów. Uniwersalny algorytm klasyfikujący powinien pozwalać na łatwe poszerzenie zakresu sprawdzanych pól,

29

 elastyczność definiowania opisu reguł – oprócz arbitralnego ustalania wartości

poszczególnych pól składowych reguły, wymagana jest możliwość wykorzystywania masek, operatorów (mniejszy, większy, etc.) czy też zakresów,

 szybkość aktualizacji zestawu reguł – praktyczna eksploatacja klasyfikatorów wiąże się

z koniecznością wdrożenia mechanizmów umożliwiających aktualizację definicji polityki bezpieczeństwa. Szybkość realizacji tego procesu wpływa na efektywność całego urządzenia.

Problem klasyfikacji pakietów w ujęciu ogólnym sprowadza się do porównywania określonych pól nagłówków przetwarzanych pakietów z bazą danych klasyfikatora, zawierającą

skończoną sekwencję n reguł bezpieczeństwa: R1, R2… Rn. Poszczególne reguły składają się

z k-elementarnych wartości, odpowiadających analizowanym polom nagłówków pakietów. Każde pole może być porównane z k-tym elementem reguły na jeden z trzech sposobów: bezpośrednio, prefiksowo lub poprzez zakres. W przypadku porównywania bezpośredniego pole nagłówka musi jednoznacznie odpowiadać wartości k danej reguły. Sytuacja taka ma miejsce przy specyfikowaniu pojedynczego adresu IP, konkretnego numeru portu lub protokołu sieciowego. Dopasowywanie prefiksowe jest wykorzystywane do opisywania grup adresów tworzących podsieci. Ostatni sposób, polegający na porównywaniu zakresów, służy w praktyce określaniu przedziałów portów protokołów transportowych [6]. Niezależnie od zastosowanej metody weryfikowany pakiet jest zgodny z daną

regułą Ri jedynie wówczas, jeśli ściśle zdefiniowane pola nagłówka odpowiadają jednocześnie

wszystkim k-elementarnym wartościom składowym reguły.

Do wyrażenia funkcyjnej złożoności czasowej algorytmów klasyfikujących powszechnie używana jest w literaturze notacja „dużego O” [3]. W celu zapewnienia jak najlepszej czytelności prezentowanych w dalszej części rozdziału charakterystyk metod weryfikacji pakietów, w tabeli 2.1 przedstawiono listę zmiennych wykorzystywanych w funkcjach opisujących złożoność czasową poszczególnych algorytmów.

Tab. 2.1. Opis zmiennych wykorzystywanych w funkcjach złożoności czasowej poszczególnych algorytmów.

Zmienna Opis

N Liczba reguł

d Liczba wymiarów (analizowanych pól nagłówków)

W Długość (bitowa) prefiksu pojedynczego wymiaru

S Szerokość słowa danych pamięci

30 Wykorzystywane obecnie algorytmy klasyfikujące można podzielić na cztery główne grupy, wymienione w tabeli 2.2 (na podstawie [33, 50]). W dalszej części rozdziału zostaną omówione pokrótce najważniejsze cechy algorytmów wchodzących w skład pierwszych trzech grup, jako metod klasyfikacji pakietów stosowanych w programowych systemach typu Firewall. Ostatnia kategoria, wymieniona w tabeli 2.2 ze względu na konieczność całościowego przeglądu algorytmów klasyfikujących, stanowi odrębny rozdział, dedykowany sprzętowym rozwiązaniom zabezpieczającym transmisję danych w sieciach teleinformatycznych.

Tab. 2.2. Podział algorytmów klasyfikujących (na podstawie [33, 50]).

Kategoria Przykłady algorytmów

Podstawowe struktury danych

Przeszukiwanie liniowe, drzewa hierarchiczne, drzewa przycinane, wektory bitowe

Geometryczne GOT, cross-producting, AQT, FIS-tree

Heurystyczne RFC, HiCutts, HyperCuts, przestrzeń krotek

Sprzętowe TCAM, bitmap intersection

Najstarszy i zarazem najprostszy algorytm wyszukiwania liniowego polega na porównywaniu odpowiednich pól nagłówków przetwarzanych pakietów z listą reguł bezpieczeństwa. Analiza taka dokonywana jest sekwencyjnie, począwszy od reguły o najwyższym priorytecie, aż do momentu, w którym dopasowane zostaną wszystkie pola nagłówkowe. Pomimo swej prostoty i stosunkowo niewielkiego zapotrzebowania na zasoby pamięciowe O(N), algorytm przeszukiwania liniowego charakteryzuje się niewielką wydajnością oraz skalowalnością. Czas przeszukiwania listy reguł, wynoszący O(N), rośnie wprost proporcjonalnie do ich liczby [33, 50, 56, 119], co w praktyce dyskwalifikuje możliwość produkcyjnego wykorzystania tego typu rozwiązań w najbardziej wymagających obszarach zastosowań. Z tego względu rozpoczęto intensywne poszukiwania efektywniejszych form klasyfikacji pakietów, zwiększających szybkość dopasowywania pakietów do wzorców oraz zmniejszających zapotrzebowanie na zasoby pamięciowe. Początkowo prace te skoncentrowały się na wykorzystaniu podstawowych struktur danych, jakimi są prefiksowe drzewa wielokierunkowe trie (z ang. retrieval) przechowujące zbiory słów (łańcuchy znaków albo innych obiektów, np. liczb całkowitych) nad pewnym zdefiniowanym alfabetem [3]. W wypadku standardowych binarnych drzew przeszukiwań każdy z węzłów posiada maksymalnie dwa węzły-dzieci. Dodatkowo dla każdego węzła n takiego drzewa wszystkie wartości przechowywane w lewym poddrzewie (drzewie, którego korzeniem jest lewe dziecko korzenia głównego) są mniejsze od wartości v zapisanej w n, zaś wszystkie wartości z prawego poddrzewa są większe od v [24]. Struktury typu trie różnią się od binarnych drzew przeszukiwań sposobem przechowywania

31 wyszukiwanych słów – są one zapisywane w liściach drzewa trie [8]. Węzły wewnętrzne drzewa zawierają jedynie tablice wskaźników do kolejnych poddrzew trie lub węzłów zewnętrznych [49, 91]. Przeszukiwanie drzewa polega na przemieszczaniu się po jego strukturze zgodnie z kolejno odczytywanymi bitami prefiksu, aż do osiągnięcia liścia zawierającego szukany klucz lub wskaźnika pustego, oznaczającego, że dane słowo w drzewie nie występuje. Cecha taka idealnie wpasowuje się w specyfikę wymagań związanych z klasyfikacją pakietów, gdzie weryfikowane ciągi informacji są zazwyczaj znacznej długości (minimalne dwuwymiarowe słowo wejściowe złożone z pola adresu źródłowego i docelowego IP posiada łączną długość 64 bitów).

Najprostsza metoda klasyfikacji z wykorzystaniem struktur trie polega na utworzeniu

d-wymiarowego hierarchicznego drzewa prefiksowego [82]. W wypadku, gdy d>1, procedura

konstruowania drzewa rozpoczyna się od utworzenia drzewa przeszukiwania F1 złożonego ze zbioru prefiksów pierwszego wymiaru (np. adresu źródłowego IP). Dla każdego prefiksu p w drzewie F1, jednoznacznie zdefiniowanego w zestawie reguł, rekurencyjnie tworzone są drzewa przeszukiwań dla wymiarów d-1. Poszczególne prefiksy stanowią zarazem wskaźniki łączące drzewa kolejnych poziomów hierarchii. Zapotrzebowanie na zasoby pamięciowego algorytmu hierarchicznych drzew

trie wynosi O(NdW), zaś maksymalny czas przeszukiwania jest równy O(Wd) [33, 50]. Możliwym jest

również dokonywanie przyrostowych aktualizacji hierarchii drzew w czasie O(d2

W). Główne wady

omawianego algorytmu obejmują alokację dużych zasobów pamięciowych (większą niż w przypadku przeszukiwania liniowego) oraz konieczność wstecznych wyszukiwań (ang. backtracking search) w celu odnalezienia właściwej ścieżki do odpowiedniego prefiksu. Eliminacja wyszukiwań wstecznych możliwa jest dzięki modyfikacji struktury danych drzewa trie poprzez replikację odpowiednich reguł. Tak powstała nowa wersja drzewa, określana w literaturze jako Cecilia [98, 121] bądź set-pruning trie [33], redukuje czas weryfikacji dla najgorszego przypadku do wartości O(dW)

kosztem zwiększenia zapotrzebowania na pamięć do poziomu O(Nd

dW). Złożoność czasowa

aktualizacji, wynosząca O(Nd

), ogranicza obszar wykorzystania algorytmu do relatywnie małych

i statycznych klasyfikatorów.

Alternatywną metodę wykorzystania struktur trie zaproponowano w algorytmie BVL (ang. Bit

Vector Linear serach) [6]. Poszczególnym węzłom drzewa trie przyporządkowane są N-bitowe

wektory sygnalizujące reguły odpowiadające danemu węzłowi. Dla każdego z wymiarów tworzone jest odrębne drzewo trie o takiej konstrukcji. Wyznaczenie zbioru reguł zgodnych z weryfikowanym słowem sprowadza się do określenia N-bitowych punktów przecięć pomiędzy d wektorami, stąd

najmniej korzystny czas wyszukiwania wynosi przy wykorzystaniu pamięci równym

[50]. Obserwacje praktyczne pozwoliły stwierdzić, że przetwarzane pakiety pasują równocześnie jedynie do niewielkiej liczby reguł, nawet w przypadku polityk bezpieczeństwa złożonych z około 1700 wpisów [6]. Definiowanie N-bitowych wektorów, dla każdego z wymiarów, prowadzi w tej sytuacji do zbędnego zwiększania złożoności obliczeniowej. Zaproponowana przez Baboescu et al. [6] zmodyfikowana wersja algorytmu ABV (ang. Aggregated Bit Vector), poprzez wykorzystanie

32 zagregowanego wektora bitowego o długości A, redukuje koszt operacji wstępnego przetwarzania

bazy reguł do wartości O(N2

d), zwiększając przy tym zapotrzebowanie na zasoby pamięciowe

o dodatkowe bitów (w stosunku do klasycznego algorytmu BVL) [50].

Kolejnym algorytmem bazującym na strukturach typu trie jest siatka drzew GOT (ang.

Grid-Of-Tries) [98]. Ze względu na swą specyfikę GOT jest przyporządkowywany w dostępnej literaturze

do różnych grup funkcjonalnych: A. Kolehmainen zakwalifikowuje GOT do kategorii klasycznych metod weryfikacji pakietów [50], zaś P. Gupta do grupy algorytmów geometrycznych [33]. Siatka drzew tries została opracowana przez V. Srinivasana et al. [98] głównie z przeznaczeniem dla klasyfikacji dwuwymiarowej, obejmującej adresy źródłowe i docelowe protokołu IP. Algorytm GOT charakteryzuje się zapotrzebowaniem na zasoby pamięciowe rzędu O(NdW), osiągniętym poprzez umieszczanie reguł (kluczy) tylko w pojedynczych węzłach drzewa. Dodatkowo stosowane jest wstępne przetwarzanie bazy reguł w celu określenia pozycji wskaźników łączących drzewa poszczególnych wymiarów. Dzięki temu możliwe są bezpośrednie skoki pomiędzy poddrzewami prefiksów danego wymiaru bez konieczności wstecznego wyszukiwania, co zmniejsza czas

klasyfikacji do wartości O(Wd-1

). Negatywną konsekwencją zastosowania takiej metody definiowania

wskaźników jest utrudnienie procesu przyrostowych aktualizacji – twórcy algorytmu sugerują przebudowywanie całej struktury drzewa. Proces taki posiada złożoność czasową równą O(NW) [33].

Praktyczne potrzeby weryfikacji wielu pól z możliwością definiowania reguł zawierających przedziały wyszukiwanych wartości doprowadziły do opracowania algorytmu cross-producting [98]. Pierwszy etap przetwarzania danych w tej metodzie polega na wydzieleniu z bazy reguł kolumn zawierających wszystkie różne zakresy prefiksów dla każdego z wymiarów d. Na podstawie tych

informacji konstruowana jest tabela CT (ang. cross-product table) złożona ze zidentyfikowanych

zakresów wraz z odpowiadającymi im numerami reguł, przechowywanych w postaci krotek , gdzie

i oznacza kolejne zakresy dla wymiaru d (np. [ , ], [ , ]….) [50]. Ponieważ dla N prefiksów

istnieje najwyżej 2N-2 zakresów, maksymalny rozmiar tablicy CT, a zarazem zapotrzebowanie na

zasoby pamięciowe algorytmu cross-producting, osiąga wartość O(Nd

). Z tego względu nadaje się on

jedynie dla bardzo małych klasyfikatorów [33]. Czas wyszukiwania wynosi w tym przypadku O(dW). Odmienną koncepcję dwuwymiarowego systemu klasyfikacji pakietów (ang. 2-dimensional

classification scheme) zaproponował T. Lakshman et al. [52]. Algorytm ten nakłada restrykcje

odnośnie specyfiki poszczególnych wymiarów: pierwszy wymiar F1jest ograniczony jedynie do formy

prefiksowej, drugi zaś F2 pozwala na definiowanie dowolnych przedziałów. Dzięki takim założeniom

początkowym możliwe jest wykorzystanie drzewa trie jako struktury przechowującej prefiksy F1.

Węzłom zewnętrznym drzewa F1 przyporządkowane zostają niezachodzące na siebie przedziały

cząstkowe wymiaru F2, reprezentujące poszczególne reguły, zgodne z prefiksem wymiaru F1. Jako

struktury danych przeznaczone do identyfikacji zakresów wykorzystywane są zwykle binarne drzewa wyszukiwań. Ponieważ każda z reguł zapisywana jest tylko raz w drzewie wyszukiwania,

33 zapotrzebowanie algorytmu na zasoby pamięciowe wynosi O(NW). Czas weryfikacji danych dla najbardziej niekorzystnego przypadku wynosi O(WlogN) [33].

Do grupy metod geometrycznych, dedykowanych klasyfikacji dwuwymiarowej, należy także algorytm AQT (ang. Area-based Quad Tree) [12]. Buddhikot et al. [24, 28] stosują dekompozycję każdego z wymiarów do drzewa ćwiartek (ang. quad tree), składającego się z czterech węzłów (tzw. kwadrantów) odpowiadających prefiksom „00”, ”01”, ”10” oraz „11”. Proces dekompozycji realizowany jest rekurencyjnie aż do momentu, kiedy w każdym z kwadrantów drzewa ćwiartek pozostaje najwyżej jedna pasująca reguła. Dana reguła przecina kwadrant, jeżeli całościowo obejmuje przynajmniej jeden z jego wymiarów [33]. Algorytm AQT charakteryzuje się następującymi parametrami: zapotrzebowanie pamięciowe O(NW), złożoność operacji wyszukiwania O(αW), czas

aktualizacji , gdzie αoznacza parametr optymalizacyjny, definiujący liczbę podziałów [50].

Ostatnim z omawianych w grupie metod geometrycznych jest algorytm FIS-tree (ang. Fat

Inverted Segment tree), zaproponowany przez A. Feldmana et al. [26], wykorzystujący

zmodyfikowaną wersję drzewa odcinków (ang. segment tree). Struktura taka jest zrównoważonym drzewem binarnym, w którym każdy z liści odpowiada przedziałom elementarnym, wyznaczonym przez uporządkowane końce poszczególnych przedziałów. Węzły wewnętrzne drzewa odcinków odpowiadają z kolei przedziałom, które są sumą odpowiednich przedziałów elementarnych poddrzewa zakorzenionego w danym węźle [18]. Algorytm FIS-tree wprowadza dwie istotne zmiany: po pierwsze kompresuje strukturę drzewa odcinków, redukując jego głębokość kosztem zwiększenia liczby wymiarów l, po drugie nie wykorzystuje wskaźników powrotnych od węzłów-dzieci do węzła-rodzica [33]. Dzięki takim zmianom uzyskano złożoność czasową wyszukiwania na poziomie O((l+1)W)

oraz zapotrzebowanie na pamięć rzędu O(l N 1+1/l

) [50].

Zarówno w przypadku zaprezentowanych podstawowych metod wyszukiwania, jak i algorytmów geometrycznych, optymalizacja jednego z istotnych parametrów oceny jakościowej (czasu wyszukiwania bądź zapotrzebowania na pamięć) odbywa się często kosztem degradacji drugiego parametru. Spostrzeżenie to stało się przyczyną poszukiwań nowych sposobów klasyfikacji wielowymiarowej, opartych o heurystyki, uwzględniające specyfikę rzeczywistych baz reguł bezpieczeństwa, posiadających niejednokrotnie bardzo rozbudowaną strukturę z nadmiarowymi lub wykluczającymi się wpisami. Redukcja zbędnych informacji poprzez wstępne przetwarzanie bazy reguł jest podstawą działania algorytmu heurystycznego RFC (ang. Recursive Flow

W dokumencie Index of /rozprawy2/10323 (Stron 24-34)

Powiązane dokumenty