240 likes | 422 Views
Risto Vaarandi risto.vaarandi@eyp.ee. Andmete klasterdamise algoritm sündmuste logidest mustrite kaevandamiseks. Mustrite otsimine logifailidest. Logid ja nende monitooring Lähteülesanne: milleks otsida mustreid logidest? Võimalik lahendus: andmekaevandamine Klasterdamisalgoritm
E N D
Risto Vaarandi risto.vaarandi@eyp.ee Andmete klasterdamise algoritm sündmuste logidest mustrite kaevandamiseks
Mustrite otsimine logifailidest • Logid ja nende monitooring • Lähteülesanne: milleks otsida mustreid logidest? • Võimalik lahendus: andmekaevandamine • Klasterdamisalgoritm • SLCT (Simple Logfile Clustering Tool)
Logid ja nende monitooring • Logid ja nende monitooring mängivad infosüsteemi halduses ja monitooringus olulist rolli: • Sündmuste logimine on osa tootmissüsteemide “headest tavadest” – rõhuv enamus süsteemirakendusi, operatsioonisüsteeme ja võrguseadmeid on võimelised logima oma töös ettetulevaid sündmusi ja/või oma staatusinfot kas kohalikku või logiserveris asuvasse logifaili. Seetõttu on logifailid väärtuslik (ja tihti ainus) allikas süsteemi töös esinevate vigade avastamiseks. • Logimisstandardite olemasolu – BSD syslog logimisprotokolli toetavad kõik suuremad süsteemitarkvara, serverite ja võrguseadmete tootjad (Sun, IBM, HP, Cisco, Nortel, jne.). See lihtsustab märgatavalt tsentraliseeritud logisüsteemi ehitamist - kõik süsteemi sõlmedes tekkivad logid kogutakse kesksele logiserverile, kus toimub analüüs ja sündmuste korrelatsioon. • Logide monitooringut võimaldavate programmmide olemasolu – Swatch, Logsurfer, LogWatch, jt. (vt. http://www.loganalysis.org).
Näide logifailist Dec 18 08:47:26 myhost sshd[15172]: connect from 10.2.211.19 Dec 18 08:47:26 myhost sshd[15172]: log: Connection from 10.2.211.19 port 1304 Dec 18 08:47:39 myhost sshd[15172]: log: Password authentication for alex accepted. Dec 18 08:48:28 myhost sshd[15226]: connect from 10.2.211.110 Dec 18 08:48:28 myhost sshd[15226]: log: Connection from 10.2.211.110 port 1413 Dec 18 08:48:35 myhost sshd[15226]: log: Password authentication for sloj accepted. Dec 18 08:50:09 myhost vmunix: /var/tmp: file system full Dec 18 08:50:10 myhost imapd[15399]: imap service init from 10.2.213.2 Dec 18 08:50:10 myhost imapd[15399]: Login user=risto host=risto2 [10.2.213.2]
Traditsiooniline logide monitooring • Traditsiooniline logifailide monitooring – antakse ette vigu tähistavad mustrid, millele vastava rea lisandumisel logifaili genereerib monitooringusüsteem (logifaili monitor) alarmi. watchfor = /file system full/ exec=/opt/local/bin/qpage -f \"\" cns \"Duty: Disk space exhausted on $4. --swatch\" mail = it-server throttle = 480:00 watchfor = /dma error|DMA error/ exec=/opt/local/bin/qpage -f \"\" cns \"Duty: RAM problems on $4. --swatch\" mail = it-server throttle = 480:00 • Variatsioon – huvipakkuvad sündmused suunatakse sündmuste korrelaatorisse, avastamaks metasündmusi (lihtsündmuste kombinatsioone, mis esinevad teatud ajalises aknas).
Mudelipõhine monitooring ning lähteülesanne • Traditsiooniline logifailide monitooring – antakse ette vigu tähistavad mustrid, millele vastava rea lisandumisel logifaili genereerib monitooringusüsteem (logifaili monitor) alarmi. Puudus: ei avastata uusi, senitundmatuid vigu • Mudelipõhine monitooring – lisaks veamustritele on ette antud süsteemi tavapärase käitumise profiil. Kui logisse ilmub rida, mis ei sobi profiiliga ning mis ei ole viga, loetakse teade anomaalseks ning suunatakse ta edasisse töötlusse (näit. genereeritakse alarm). Puudus: logifaili mudeli loomine on töömahukas ning aeganõudev • Ülesanne: vaja on tarkvara, mis hõlbustaks logifaili mudeli loomist (ehk tarkvara, mis aitaks leida nii süsteemi tavapärast käitumist kajastavad mustreid kui vigu esindavaid mustreid).
Võimalikud lahendused • Andmekaevandamisalgoritmid • Assotsiatsioonireeglite leidmise algoritmid • Üritavad leida korrelatsioone andmebaasi kirje elementide vahel (näit. kirjes esineb element X => kirjes esineb 99% tõenäosusega element Y) • Siiani on neid kasutatud peamiselt ajaliste mustrite leidmiseks (näit. sündmustele A ja B järgneb 1m jooksul 95% tõenäosusega sündmus C) • Leiavad vaid piisavalt tihti esinevate sündmuste mustreid, kuid meie jaoks sageli on huvipakkuvad ka harvaesinevad sündmused (näit. veasituatsioonid on reeglina huvipakkuvad, kuid samas ei ole need normaalses süsteemis sagedased!) • Klasterdamisalgoritmid - üritavad etteantud andmehulga jagada gruppideks (klastriteks), kus igasse klastrisse kuuluvad sarnased elemendid.
Klasterdamisalgoritmid Punktid x, y Rn d(x, y) - kaugusfunktsioon
Klasterdamisalgoritmide puudused • Tänapäeval on suur hulk andmeid tekstilised, ning andmepunktidel võib olla erinev arv atribuute: • log: Connection from 192.168.1.1 port 1468 • log: RSA key generation complete. • connect from 172.26.10.12 • Kui ruumi dimensioon n on suurem, siis kaugusfunktsioon kaotab oma tähenduse (n ≥ 10 korral muutub probleem küllalt tõsiseks) • Nendel põhjustel on viimastel aastatel leiutatud mõned Apriori-põhised klasterdamisalgoritmid (CLIQUE ja MAFIA), mis ei kasuta kaugusfunktsioone, vaid üritavad leida ruumis tihedaid regioone ning formeerida neist regioonidest klastreid.
Apriori-põhine klasterdamine Nõutav tihedus = 3 Probleem: eksponentsiaalne keerukus!
Logifailide omadused • Mängivad klasterdamisalgoritmi loomisel olulist rolli: • Rõhuv enamus sõnu esineb logifailis väga harva (tüüpiliselt alla 5 korra). Suur osa sõnu esineb vaid ühel korral. Teisalt on vaid vähesed sõnad sagedased (näit. esinevad vähemalt korra iga 10,000 logirea kohta). Sama fenomeni on täheldatud loomulike keelte korral, kus sõnade esinemissagedused alluvad Zipf'i jaotusele. • Logifailides on paljude sagedasti esinevate sõnade vahel tugev korrelatsioon, mis muudab Apriori meetodi kasutamise mõttetuks. Põhjus: teated vormindatakse enne logimist mingi formaatstringi alusel, näiteks sprintf(message,"log: Connection from %s port %d", ipaddress, port);
Logifailide klasterdamine • Algoritm võtab arvesse logifailide omadusi ning üritab iga klastri luua nii, et see vastaks teatud mustrile (näit. connection from * closed). • Igas klastris peab olema vähemalt N rida, kus parameetri N väärtuse annab ette kasutaja. • Logiread, mis ei sobi ühessegi leitud klastrisse, paigutatakse omaette nn. kõrvalejääjate klastrisse.
Algoritm logifailide klasterdamiseks • Vaadata andmehulk läbi ning leida kõik sagedased sõnad (sõnad, mis esinevad antud positsioonil rohkem arv kordi kui kasutaja poolt etteantud lävi N). • Vaadata andmehulk teist korda läbi ning formeerida klastrikandidaadid. Iga rea puhul, millel esinevad sagedased sõnad, formeeritakse nendest sõnadest kandidaat. Näiteks kui sõnad Connection, from ja port on sagedased, siis rea Connection from 192.168.1.1 port 2014 puhul formeeritakse kandidaat Connection from * port. Kui formeeritud kandidaati pole kandidaatide tabelis, paigutada ta sinna loenduri väärtusega 1, vastasel korral liita loendurile 1. • Defragmenteerimine (optional): iga kandidaadi K puhul leida kandidaadid, mis esindavad spetsiifilisemaid mustreid, ning lisada nende loendurite väärtused K omale (väldib väga paljude ebapiisava suurusega klastrikandidaatide teket, lubades samas klastrite ühisosasid). • Lugeda klastriteks need kandidaadid, mille loenduri väärtus ületab kasutaja poolt etteantud läve N (ehk need kandidaadid, mis sisaldavad vähemalt N rida). • Vaadata andmehulk veelkord läbi ning leida kõrvalejääjate klaster.
Võrdlus Apriori’ga • Erinevalt Apriori meetodist genereeritakse kandidaadid andmete ühe läbivaatusega: + niimoodi välditakse eksponentsiaalset keerukust, kus iga k-mustrini jõudmiseks läbitakse 2k-2 üldisemat mustrit. + kuna logifaili sagedaste sõnade vahel on tihti tugevad korrelatsioonid, on mõttetu testida kõikvõimalikke kombinatsioone sagedastest sõnadest. - Apriori algoritm avastab mustreid, mida klasterdamisalgoritm ei avasta. Näiteks kui A, B ja C on sageli esinevad sõnad, mis esinevad tekstis kombinatsioonidena AB, AC ja BC, kusjuures ükski kombinatsioon eraldivõetuna ei ole sageli esinev, siis klasterdamisalgoritm ei pea mustreid A, B ja C klastriteks.
Probleemid • Probleem1 – algoritmi esimese sammu jaoks (sõnastiku ehitamine) ei pruugi jätkuda mälu, • Probleem2 – kuigi tänu sagedaste sõnade vahelistele korrelatsioonidele ei ole kandidaatide tabel võrreldes sagedaste sõnade arvuga väga suur, võib see olukord ülimadala läve korral muutuda. See toob kaasa:- suure mälukulu- kuna defragmenteerimise keerukus on O(n2), siis ka suure ajakulu
Sõnastiku ehitamine • Enne sõnastiku ehitamist luuakse kõigist sõnadest n loenduriga summaarne vektor (c0,...,cn-1), mille kõik loendurid seatakse töö algul võrdseks nulliga. Tavaliselt n << erinevate sõnade arv. • Andmed vaadatakse läbi ning iga sõna viiakse kiire räsifunktsiooniga (shift-add-xor) täisarvude lõiku [0,...,n-1]. Kui sõna puhul saadakse tulemuseks väärtus i, siis suurendatakse vektori i-ndat loendurit 1 võrra. • Kui vektor on loodud, ehitatakse sõnastik, kuid sõnastikku paigutatakse vaid need sõnad, millele vastav vektori loendur ületab läve N. Kuna enamus sõnu esineb failis väga harva, on enamus vektori loendureid lävest N väiksema väärtusega, mistõttu sõnastiku maht väheneb oluliselt. Vektor ise palju mälu ei nõua.
Sõnastiku vektorfilter A, 1 B, 3 C, 1 D, 15 E, 1 F, 1 G, 4 H, 1 I, 2 C0 = 5 C1 = 17 C2 = 7 Kui lävi N = 10, siis saavad ainult sõnad D, E ja F olla sagedased, ülejäänud sõnu pole aga mõtet nende sageduse mõõtmiseks sõnastikku salvestada. Üks räsifunktsioonide omadusi ühtlus - kui erinevaid sõnu on W tükki ning vektori suurus on m, siis iga vektori loendur vastab W / m sõnale. Kuna enamus sõnu on harvaesinevad ning sagedasi sõnu on väga vähe, siis ei ületa suurem osa vektori loenduritest läve ning sõnastikku sisestatakse palju vähem sõnu kui muidu. Kuna vektor ise nõuab küllalt vähe mälu, on mälu kokkuhoid reeglina märkimisväärne.
Kandidaatide tabel • Kui tabel nõuab liiga palju mälu, saab tabelisse kantud kandidaatide arvu vähendamiseks rakendada vektor-filtrit (defragmenteerimise puhul see meetod ei sobi). • Defragmenteerimine on keerukusega O(n2) (kuna iga kandidaati K peab võrdlema kõigi ülejäänutega) ning suurema tabeli korral on ajakulu märkimisväärne. Selle vältimiseks jagatakse tabel osadeks, kus igas osas leiduvate kandidaatide fikseeritud sõnu kirjeldab bitivektor. Kui bitivektor ei sisalda kõiki neid sõnu, millest koosneb kandidaat K, siis pole mõtet kandidaati K antud tabeli osas paiknevate kandidaatidega võrrelda.
Bitivektorid kandidaatide tabelile • Tähistame sagedased sõnad naturaalarvudega 1..W, sagedasele sõnale M vastab bitivektoris positsioon M. Bitivektori suurus on int(W / 8) + 1 baiti. • Kui tabeli osas on näiteks kandidaadid Login for * failed ja log: , ning Login=1, for=5, failed=9 ja log:=2, siis antud tabeliosa jaoks on bitivektoriks 110010001 (s.t. positsioonid 1,2,5,9 on seatud). • Analoogilisel viisil saab igale üksikule kandidaadile seada vastavusse bitivektori. • Kui kandidaadi K bitivektor on K’ ja tabeliosa T vektor on T’, ning K’ AND T’ K’, siis pole mõtet kandidaati K tabeliosa T kandidaatidega võrrelda.
SLCT – simple logfile clustering tool • Kirjutatud C-keeles, testitud RedHat8.0 ja Solaris8 platvormidel • Koduleht http://kodu.neti.ee/~risto/slct/, litsents GNU GPL • Sõnade eraldaja saab ette anda regulaaravaldisena - vaikimisi on sõnade eraldajaks [ \t]+ (üks või rohkem tühikut või tab-sümbolit) • Ainult teatud tüüpi ridade töötlemiseks saab ette anda regulaaravaldisest filtri, peale filtri rakendumist võib rea teisendada uuele kujule ($1, $2, ... muutujate abil):kui filter on sshd\[[0-9]+\]: (.+) ja template on “$1”, siissshd[2781]: connect from 10.1.1.1 connect from 10.1.1.1 • Mustrites sisalduvaid metsikuid sümboleid saab "lihvida" konstantsete prefiksite ja sufiksite otsimise abil (* => sshd[*])
SLCT – tabelid ja räsifunktsioon • Sõnastiku ja kandidaatide tabeli realiseerimiseks on kasutusel ettenihutamisega paisktabel (move-to-front hash table). Erinevalt tavalisest paisktabelist on tabeli positsioonide arv palju väiksem tabelisse paigutatavate elementide arvust. Tabeli loomisel tekib iga positsiooni juurde seetõttu pikk välisahel. Iga kord, kui tabelist otsitakse või tabelisse lisatakse element X, tõstetakse element X välisahela esimeseks elemendiks. Selline paisktabel sobib eriti hästi selliste andmehulkade jaoks, kus vaid vähesed elemendid esinevad sageli, kuna siis sagedased elemendid viibivad peaaegu kogu aeg välisahelate alguses ning nad leitakse kiiresti. • Räsifunktsioonina on kasutusel Zobeli ja Ramakrishna kiire funktsioon, kus on tehetena kasutusel vaid liitmine, bitikaupa nihutamine ja bitikaupa XOR (puudub kulukas jagamistehe!).
Kõrvale- jääjad Klaster1 Klaster2 Kõrvale- jääjad Kõrvale- jääjad Klaster5 Klaster3 Klaster4 Analüüs jätkub SLCT iteratiivne rakendamine Logi
SLCT – näiteid leitud mustritest Dec 18 * myhost.mydomain sshd[*]: connect from 10.1.1.17 Dec 18 * myhost.mydomain sshd[*]: log: Connection from 10.1.1.17 port * Dec 18 * myhost.mydomain sshd[*]: fatal: Did not receive ident string. Dec 18 * myhost.mydomain * log: * * * * Dec 18 * myhost.mydomain sshd[*]: connect from 10.* Dec 18 * myhost.mydomain sshd[*]: log: Connection from 10.* port * Dec 18 * myhost.mydomain sshd[*]: log: * authentication for * accepted. Dec 18 * myhost.mydomain sshd[*]: log: Closing connection to 10.*