XXX. ASR '2005 Seminar, Instruments and Control, Ostrava, April 29, 2005
437
Monitoring Users Activities Monitorování aktivit uživatelů ŠREK, Petr Ing., Katedra ATŘ-352, VŠB TU Ostrava, 17. listopadu 15, Ostrava-Poruba,
[email protected], Abstrakt: Při správě počítačové sítě může správce narazit na řadu problémů, které musí řešit. Mimo problémů, které souvisejí se správou jednotlivých elementů počítačové sítě jako je instalace software, opravy a výměny hardware patří nepochybně přehled základních údajů o zatížení sítě, přehled a lokace právě přihlášených uživatelů, jejich aktuálně spuštěné programy, množství přijatých a odeslaných dat u konkrétního uživatele, čas a množství přihlášení a odhlášení apod. Mým úkolem bylo navrhnout a realizovat způsob monitorování výše uvedených aktivit uživatelů a možnosti prezentace zjištěných výsledků. Tuto úlohu jsem řešil jako aplikaci typu klient/server, kde klienta reprezentuje systémová služba Windows. Tato služba musí být nainstalována na všechny počítače, které chceme monitorovat. Úloha této systémové služby spočívá v tom, že monitoruje aktivity aktuálně přihlášeného uživatele. Zaznamená čas přihlášení, čas odhlášení uživatele, uživatelské jméno, zjistí počet přijatých a odeslaných kByte, monitoruje spouštěné aplikace atd. Tyto nashromážděné informace následně odešle na SQL server. Odesílání probíhá po odhlášení uživatele. Při přihlášení se znova inicializují veškeré nastavení a začíná se s monitorováním pro nového uživatele. Uložené informace jsou prezentovány na internetových stránkách prostřednictvím webového klienta. Jedná se o sadu dynamicky generovaných stránek. Pro realizaci jednotlivých dílčích kroků bylo využito technologie .NET. Systémová služba byla naprogramována v jazyce C# [Robinson, S & kol] a internetové stránky pomocí ASP.NET [Sharp, J. Jagger, J.]. Klíčová slova: Monitorování, uživatel, LDAP, ADSI, služba, ASP, C#, .NET
1 Adresářové služby Adresářové služby se snaží vnést jednotu do rozličných síťových prostředí. Kombinováním síťových služeb a informací do jedné entity výrazně zjednodušíme správu informací. Obecně platí, že zjednodušení správy informací je úměrné velikosti našeho prostředí. Například malé prostředí s jedním nebo dvěmi servery podporující infrastrukturu nevyužije tolik výhod jako velká společnost s desítkami či stovkami podporovaných serverů a služeb. Správou informací máme na mysli správu uživatelů, tiskáren, emailových účtů, počítačů a dalších prvků síťového prostředí. Adresářovou službou se rozumí specializovaná aplikace pro ukládání dat, jejich organizaci a přístup k nim. Specifikum je především v datovém modelu, který je rámcem pro práci s daty. Nejjednodušší představa je taková, že data jsou uložena ve formě položek (ENTRY), přičemž každá položka obsahuje několik atributů. Atribut je nositelem dat, tj. má hodnotu (VALUE) viz.
XXX. ASR '2005 Seminar, Instruments and Control, Ostrava, April 29, 2005
438
Obrázek 1 – Struktura dat adresářových služeb Jelikož každá síťová architektura pracuje s daty svým způsobem, musel být stanoven nějaký standard, který umožňoval vzájemnou komunikaci jednotlivých služeb a klientů, kteří potřebují s informacemi uložených v jednotlivých adresářových službách pracovat. Tímto standardem se stal protokol LDAP (Lightweight Directory Access Protocol). Protokol LDAP vychází ze standardu X.500 a protokolu DAP (Directory Access Protocol). Jak název napovídá, protokol LDAP je odlehčená verze DAP. Mimo to je navržen speciálně pro správu a dotazování informací v adresářové službě přes spojení TCP (port 389). Hlavní zjednodušení tkví tedy v použití rodiny protokolů TCP/IP jako komunikační vrstvy a ve zjednodušení protokolu jako celku. Postupem času došlo k „osamostatnění“ protokolu LDAP, tj. byla uplatněna idea samostatného LDAP serveru, což znamená adresářový server, který komunikuje s klientem protokolem LDAP. Protokol LDAP podporuje jak komunikaci klientů, tak i serverů, ale většina dodavatelů jej používá hlavně pro klienty pro správu a dotazování informací ve vlastní adresářové službě. Jeho struktura je stromová, což usnadňuje ukládání a hledání objektů v adresářovém stromu. V adresářové službě se mohou nacházet dva typy objektů tzv. kontejnery a koncové objekty. Pro přiblížení si toto uspořádání lze přirovnat k uložení dat na disku ve formě složek a souborů, kde kontejnerem je složka a koncovým objektem je soubor. Kontejner, stejně jako složka, může obsahovat další kontejnery stejně jako složka může obsahovat další složky. Může obsahovat i koncové objekty jako složka může obsahovat soubory. Jediný rozdíl je pak v tom, že kontejner v adresářové službě může nést daleko více informací, může být využit jako rodič pro vytvoření dalších kontejnerů apod. Celý adresářový strom lze pak velice jednoduše rozčlenit na jednotlivé podstromy a udržovat tak jednoduchým způsobem konzistentní informace o objektech reprezentující dané subjekty počítačové sítě. Adresářová služba je nedílnou součástí většiny síťových operačních systémů. Působí v něm jako centrální autorita pro práci s objekty sítě. Nejznámější adresářové služby jsou tyto: •
Active Directory (AD) – je součástí serverových produktů firmy Microsoft.
•
Netware Directory Services (NDS) – jedná se ekvivalent Active Directory. Je zabudován do síťových operačních systémů firmy Novell. Obsahuje obdobný druh informací o uživatelských účtech, oprávněních a zdrojích sítě
•
IIS Metabase – jedná se o databázi obsahující konfigurační data IIS.
•
WinNT – je tvořen množinou COM komponent, které umožňují přístup k informacím prostřednictvím ADSI. Jedná se o doplněk pro sítě založené na platformě Windows NT.
Existují samozřejmě i jiné adresářové služby. Zde jsem uvedl jen nejznámější se kterými je možno se setkat. Chceme-li tvořit aplikace, které nějakým způsobem využívají, prezentují
XXX. ASR '2005 Seminar, Instruments and Control, Ostrava, April 29, 2005
439
nebo modifikují data uložena v adresářové službě musíme vědět jak k dané adresářové službě přistupovat. Nastiňuje to následující kapitola.
1.1 Programový přístup k adresářovým službám Pro programový přístup k adresářově službě je nutné znát API konkrétní adresářové služby nebo využít již předpřipravených komponent. Programátor pak vytváří instanci komponenty zastupující konkrétní objekt sítě stále stejným způsobem jen s jiným inicializačním řetězcem. Příkladem této technologie je např. JNDI od firmy Sun pro jazyk Java nebo ADSI od firmy Microsoft. ADSI tvoří sada COM rozhraní a je možno ji využít na platformě Windows v různých programovacích jazycích jako Visual Basic, C/C++, VBScript, C# apod.
Obrázek 1 – Architektura ADSI Tím, že lze k programování využít i skriptovacích jazyků lze informace prezentovat na internetových stránkách. Každý objekt adresářové služby může nést určité informace, které se k němu vztahují. Jedná-li se např. o tiskárnu, mohou tyto informace být kolik stran za minutu tiskárna vytiskne, je-li barevná atd. Jedná-li se o uživatele pak tyto informace mohou být jméno, příjmení, e-mail, čas přihlášení, IP adresa počítače apod. Při potřebě zjistit, kde je jaký uživatel přihlášený využijeme právě posledně zmiňovaný atribut. Pokud je uživatel přihlášen, pak instance objektu uživatele obsahuje parametr obsahující IP adresu počítače. Pokud tento parametr neobsahuje, uživatel přihlášen není. Tímto způsobem lze velice lehce monitorovat aktuálně přihlášené uživatele. Nevýhoda tohoto postupuje v rychlosti. Je nutné vytvářet velké množství instancí objektů reprezentujících uživatele, prohledávat jejich vlastnosti a následně je odstraňovat z paměti. Tento problém samozřejmě není v komunikaci s adresářovou službou, ale v použité technologii (ADSI + VB/C++).
1.2 Ukázka přístupu k objektu Pro demonstraci jednoduchosti a elegantnosti a jakou lze přistupovat k informacím o konkrétním objektu ukazuje následující příklad. Tento kód vytvoří instanci objektu typu kontejner, který obsahuje další objekty reprezentující jednotlivé uživatele. Prolistováním všech objektů vnořených do kořenového vylistujeme v tomto konkrétním příkladě všechny objekty zastupující studenty na fakultě strojní. Pro jednoduchost byl zvolen jazyk VBScript a část kódu z ASP stránky. Dim objContainer Dim objUser Set objContainer = Server.CreateObject(“LDAP://ldap.vsb.cz/ou=stu,o=fs”) objContainer.Filter = Array(“User”) for each objUser in objContainer
XXX. ASR '2005 Seminar, Instruments and Control, Ostrava, April 29, 2005
next
440
Response.Write objUser.Name & “ : “ Response.Write objUser.ADsPath & “
”
Nejdůležitější část je na řádku 3. Technologie ADSI nás oprošťuje od komunikace s konkrétní adresářovou službou. Jediné co musíme znát je textový řetězec, který musíme předat metodě CreateObject. Na řádku 4 zvolíme filtr protože nás zajímají jen objekty typu User a v cyklu FOR vylistujeme všechny objekty. Pro jednoduchost nejsou provedeny kontroly na ověření platných odkazů na objekty apod. Pro ověření funkčnosti a jednoduššího ladění byla naprogramována jednoduchá aplikace, která prezentovala jednotlivé dílčí úkoly jako seznam aktuálně přihlášených uživatelů, informace o objektu v síti, vyhledání uživatele apod.
Obrázek 2 – Informace o uživateli
Obrázek 3 – Vyhledání uživatele
XXX. ASR '2005 Seminar, Instruments and Control, Ostrava, April 29, 2005
441
2 Sledování aktivit přihlášených uživatelů Informace, které jsme schopni získat prostředky zmiňovanými v předchozí kapitole nevypovídají nic o historii toho kterého objektu. Objekt sebou nese informace, které se v průběhu času nemění. Konkrétní uživatel má stále stejné telefonní číslo, stejný email, příjmení apod. Datový model adresářové služby je optimalizován pro čtení informací, nikoli pro jejich dynamickou aktualizaci, přidávání a neustálé změny. V neposlední řadě by tak neúměrně narůstala velikost této databáze. Pro monitorování aktivit přihlášeného uživatele tedy musíme využít jiných prostředků. Hlavně se musíme vydat trochu jinou cestou. Oprostíme se od centrálního sledování všech uživatelů a jednotlivé dílčí úlohy rozdělíme na klientské počítače, na které se jednotliví uživatelé hlásí. Na každý počítač nainstalujeme námi naprogramovanou systémovou službu, které bude monitorovat aktivitu aktuálně přihlášeného uživatele. Tato služba bude schopna sledovat jaké procesy uživatel spustil, kolik dat odeslal a přijal apod. Nashromážděná data tato systémová služba monitoruje po celý čas přihlášení uživatele. Po jeho odhlášení se monitorování přeruší a provede se odeslání dat na SQL server. Tato nashromážděná data je pak možno prezentovat ve spojení s konkrétním uživatelem a k informacím získaných z adresářové služby připojit i informace o jeho aktivitách při přihlášení do sítě. Celou tuto úlohu je možno řešit rovněž jako samostatnou aplikaci, která by se spouštěla při přihlášení uživatele. Použití systémové služby má tu výhodu, že běží na pozadí Windows. Je aktivní i pokud se uživatel ještě nepřihlásil a po celou dobu přihlášení uživatele do vypnutí celého systému. Velice podstatnou výhodou má systémová služba oproti klasické aplikaci v tom, že běží pod systémovým uživatelským účtem, který má dokonce větší práva než administrátor. Obyčejný uživatel ji nemůže jen tak vyřadit z provozu. Oproti tomu, kdyby se monitorovací aplikace spustila při přihlášení uživatele, spustí se s uživatelskými právy aktuálně přihlášeného uživatele. Informace je potřeba získat z registru Windows a ten má právo číst a měnit pouze administrátor. Jak tato monitorovací služba pracuje a jaká data získává popisuje následující kapitola
3 Struktura a základní funkce monitorovací služby Pro naprogramování této služby bylo využito jazyka C# tudíž aby bylo možné tuto služby nainstalovat a spustit na klientském PC, je nutné také nainstalovat .NET framework. Každá část této služby je realizována jako samostatná třída, která si sama uchovává informace, které získala v průběhu monitorování. Každá třída obsahuje seznam veřejných metod, kterými se snímané informace mohou dostat ven. Jednotlivé části této monitorovací služby jsou rozděleny do těchto tříd.
3.1 ListOfProcesses Jedná se o třídu, která monitoruje spouštěné aplikace. Pamatuje si ve formě setřízeného seznamu všechny spuštěné a ukončené procesy, čas jejich spuštění, ukončení, kolik systémového času procesoru jednotlivé procesy potřebovali a kolik z toho bylo od aktivit uživatele. Tato informace se dá využít při sledování jak jsou využívány aplikace, které přímo souvisejí s výukou a jak jsou využívány aplikace, které s výukou nesouvisejí. Na server se pak posílá tento seznam, který je možno dále analyzovat a prezentovat. Tato třída má následující strukturu: Privátní proměnné SortedList mapSaved
Setřízený seznam všech procesů, které byly na počítači spuštěny i ukončeny od přihlášení uživatele
SortedList mapAktual
Seznam aktuálně spuštěných procesů v každém kroku aktualizace
XXX. ASR '2005 Seminar, Instruments and Control, Ostrava, April 29, 2005
string strComputerName
442
Jméno počítače
Privátní metody void Init()
Metoda, které inicializuje objekt při jeho vytvoření a při opětovném startu monitorování
void RefreshProcesses()
Metoda obnoví seznam aktuálně běžících procesů a uloží ho do proměnné mapAktual. Zároveň zjistí jestli nebyl nějaký proces ukončen nebo spuštěn a pokud ano, tak aktualizuje seznam mapSaved
Veřejné metody SortedList GetProcessesSaved()
Metoda vrátí setřízený seznam procesů spuštěných od přihlášení uživatel
SortedList GetProcessesAktual()
Metoda vrátí setřízený seznam aktuálně běžících procesů
void MonitorThis(bool monitorThis)
Pomocí této metody se zahajuje monitorování procesů
3.2 ProcessorUsage Tato třída sleduje zatížení procesoru v průběhu práce. Tyto hodnoty se uchovávají opět v poli a mohou sloužit k vyobrazení průběhu zatížení počítače. Při vysokých hodnotách zatížení může jít například o nepovolené sledování filmů, hraní her nebo naopak využívání počítače k řešení složitých simulačních úloh což je samozřejmě v pořádku. Jelikož programujeme pomocí .NET není možné přistupovat k systémovým zdrojům přímo, ale je nutné práci zaobalit do třídy, která se postará o zjištění patřičných informací. Pro monitorování zatížení je tedy nutné založit instanci třídy ManagementObject. Konstruktoru je nutné předat parametr, který mu říká, jaký typ informací potřebujeme získat. Privátní proměnné ManagementObject pRawProc
Objekt, který poskytuje informace o zatížení procesoru
int iProcUsage
Hodnota zatížení procesoru v daném okamžiku
ArrayList mapProcUsage
Pole obsahující historii zatížení procesoru
Privátní metody int GetProcessorUsage()
Metoda, která vrátí aktuální zatížení procesoru
Veřejné metody ArrayList GetProcessesUsageOut()
Metoda vrátí pole charakterizující historii zatížení procesoru
void MonitorThis(bool monitorThis)
Pomocí této metody se zahajuje monitorování procesů
3.3 WorkWithRegistry Tato třída získává informace z registru. V registru systému Windows jsou uloženy důležité informace, které tam zanechávají aplikace a monitorováním hodnot uložených v registru můžeme zjistit kdo je aktuálně přihlášen do sítě Novell, na jaký server a do jakého stromu se uživatel přihlásil a s jakým kontextem. Podmínkou je přihlašování prostřednictvím
XXX. ASR '2005 Seminar, Instruments and Control, Ostrava, April 29, 2005
443
Novell klienta a jeho správné nastavení. Tyto podmínky jsou splněné na všech počítačích katedry určené pro výuku a monitorování. Privátní proměnné RegistryEntries regOut
Uživatelsky definovaný typ, který informace získané z registru Windows
obsahuje
Veřejné metody RegistryEntries GetValueFromRegistry()
Metoda vrátí uživatelsky definovaný typ obsahující informace získané z registru Windows
void DeleteValuesFromRegistry()
Smaže dočasné informace z registru Windows
3.4 NetworkAdapter a NetworkMonitor Tyto dvě třídy realizují monitorování síťového provozu. Třída NetworkAdapter charakterizuje konkrétní síťovou kartu, kterou chceme monitorovat. Třída NetworkMonitor prochází jednotlivé adaptéry a uchovává si hodnoty o počtu odeslaných a přijatých kByte, rychlosti připojení apod. Na počítači může být nainstalováno více síťových karet, proto jsou tyto třídy napsány velice obecně. Třída NetworkMonitor zjistí kolik síťových adaptérů je na počítači nainstalováno a uchová si jejich hodnoty ve formě seznamu instancí tříd NetworkAdapter. Ve stanovený okamžik prochází všechny síťové adaptéry a zjistí požadované informace, které si uchovává. Struktura obou tříd je poměrně komplikovaná, proto uvedu jen nezbytnou část, která tyto třídy charakterizuje. NetworkAdapter Veřejné proměnné double DownloadSpeedKbps
Aktuální rychlost stahování dat
double UploadSpeedKbps
Aktuální rychlost odesílání dat
Veřejné metody void Init()
Inicializuje objekt při jeho vytvoření
void Refresh()
Opět naměří aktuální stav přenášených dat
NetworkMonitor Privátní proměnné ArrayList Adapters
Seznam síťových karet v PC
ArrayList monitoredAdapters
Seznam aktuálně monitorovaných síťových karet v PC
double ReceiveBytes
Počet přijatých Byte od všech síťových adaptérů
double SentBytes
Počet odeslaných Byte od všech síťových adaptérů
Privátní metody void EnumerateNetworkAdapters()
Zjistí počet síťových adaptérů v počítači a přiřadí k nim objekty pro monitorování jejich aktivit.
XXX. ASR '2005 Seminar, Instruments and Control, Ostrava, April 29, 2005
444
Veřejné metody void StartMonitoring()
Metoda spustí monitorování všech adaptérů
void StartMonitoring(NetworkAdapter adapter)
Metoda spustí adaptéru
void StopMonitoring()
Metoda ukončí monitorování všech adaptérů
void StopMonitoring(NetworkAdapter adapter)
Metoda ukončí adaptéru
monitorování
monitorování
konkrétního
konkrétního
3.5 HistoryOfInternet Tato třída zjišťuje informace, které souvisí z prohlížením internetových stránek. Její činnost je velice podobná třídě pro monitorování procesů. Při prohlížení internetu se do dočasného adresáře ukládají do souboru index.dat informace o navštívených stránkách. Zpracováním tohoto souboru je možno zjistit, které stránky uživatel navštívil. Do tohoto souboru se ukládají informace o všech navštívených stránkách, stáhnutých souborech, uživatel, který je stáhnul, typ souboru a další informace. Třída si sama zpravuje tyto informace a na požádání je předá volajícímu. Třída umožňuje poskytnout kompletní informace v podobě všech navštívených odkazů, stáhnutých souborů apod. nebo jen seznam procházených serverů. Privátní proměnné ArrayList netAddresses
Seznam procházených serverů, stáhnutých souborů apod.
Privátní metody void Init()
Inicializuje objekt při jeho vytvoření
Veřejné metody ArrayList GetServersOnly()
Vrátí jen seznam procházených serverů
ArrayList GetAddressesAll()
Vrátí informace o všech prohlížených stránkách a stáhnutých souborech
3.6 SendDataToSQL •
tato třída se jak název napovídá stará o přenos získaných dat na SQL server. Po odhlášení uživatele se přenesou získána data do vnitřních proměnných této třídy. Tyto data jsou verifikována a přenesena do databáze. Privátní proměnné DataToSQL dToSQL
Data, která obsahují získané informace. Tyto data jsou následně odeslány na server
Veřejné metody void SendData()
Metoda odešle data na SQL server
XXX. ASR '2005 Seminar, Instruments and Control, Ostrava, April 29, 2005
445
3.7 Základní koncepce monitorovací služby Základní koncepci s jakou jsou data získávána a ukládána přibližuje následující obrázek. Monitorovací služba jak bylo zmíněno je nainstalována na jednotlivých klientských PC a ukládá získána data do databáze odkud mohou být v případě potřeby poskytnuta klientům.
Obrázek 4 – Základní koncepce monitorovací sužby
4 Prezentace získaných dat Obrázek 4. naznačuje rozdělení informací na dva základní datové sklady. Jeden je tvořen informacemi získanými z adresářové služby a druhý je tvořen daty uloženými na SQL serveru. Tyto data tam byla uložena monitorovací službou. Zpracováním této databáze můžeme prezentovat získané informace. Klientská aplikace v podstatě shromáždí potřebné informace z obou stran a prezentuje je správci. Klientská aplikace může mít podobu klasické aplikace, která se dá spustit na klientském PC, nebo může mít podobu webové aplikace a získané data jsou prezentována v okně internetového prohlížeče. Druhou variantu přibližují následující obrázky. Základní informace o objektu přibližují obrázky 3. a 4. Nás v této chvíli budou zajímat data získaná monitorovací službou a jejich prezentace na ASP stránkách
Obrázek 5 – Historie přihlášení uživatele Pro nalezení požadovaného uživatele je nutno zadat jeho login do input boxu. Po zadání uživatelského jména a zmáčknutí klávesy ENTER jsou potřebná data získána z SQL serveru viz. obrázek 6. V levé části je pak nabídka pro zobrazení základních historických údajů.
XXX. ASR '2005 Seminar, Instruments and Control, Ostrava, April 29, 2005
446
Obrázek 6 – Historie zatížení CPU Další monitorovanou aktivitou bylo sledování množství přenesených dat. Pro zobrazení správných výsledků je nutné zadat období, ve kterém nás tato informace zajímá neboť při větším počtu záznamů by graf ztratil vypovídací schopnost.
Obrázek 7 – Množství přenesených dat uživatelem Posledním prezentovaným údajem je historie procházených stránek při přihlášení uživatele. Jak je vidět na posledním obrázku, aplikace zjistí četnost přístupů na danou webovou adresu. Počet přístupů zjišťuje monitorovací služba přečtením souboru s historie Internet Explorer.
XXX. ASR '2005 Seminar, Instruments and Control, Ostrava, April 29, 2005
447
Obrázek 9 – Historie internetu
5 Závěr Tato práce se zabývá možnostmi sledování vytíženosti počítačové sítě v průběhu práce jednotlivých uživatelů. Tato data jsou získávána prostřednictvím systémové služby nainstalované na jednotlivá klientská PC, která monitoruje aktivity aktuálně přihlášeného uživatele. Tyto data jsou ukládána do databáze, kde je možno je analyzovat a spojit s konkrétním uživatelem. Jedná se o historii přihlašování, spouštěných programech, navštěvované WWW servery, velikost přijatých a odeslaných dat, zatížení konkrétního PC apod. Získaná data mohou být využita k analýze využívání instalovaného software, zatížení segmentu sítě apod. Uvedená služba nezjišťuje konkrétní obsah přenášených dat ani nijak data neupravuje. Získaná data jsou použita čistě ke statistickým účelům.
6 Použitá literatura MICROSOFT. 2004: Microsoft Developer Network Library CD. Redmont USA: Microsoft Corporation, 2004. ROBINSON, S & kol. C# Programujeme profesionálně. Computer Press, 2003. 1130s. ISBN 80-251-0085-5 DUTHIE ANDREW, G. ASP .NET krok za krokem. Redmond USA, Microsoft press, 2002. 511s. ISBN 80-86593-33-9 GARDINIER, K. IVENS, K. 2000: Windows 2000 podrobný přehled I.díl. CCB s.r.o. 941s. ISBN 80-85825-49-X CHAPPELL, D. Understanding Windows 2000 Distributed Services. Microsoft Press 2000. 448s. ISBN 1-57231-687-X CITERA, J. 1999: Adresářové služby. Univerzita Plzeň. [cit. 2003-05-21]: Dostupné z www: