Toto je starší verze dokumentu!
Systém Mentat byl navržen jako distribuovaný systém s důrazem na co možná nejjednodušší rozšiřitelnost a škálovatelnost. Při návrhu jsme se inspirovali architekturou MTA systému Postfix. Celý systém se skládá z mnoha jednoduchých jednoúčelových modulů - daemonů, které provádějí vždy jeden jednoduchý úkon. Tento přístup umožňuje velmi jednoduchou paralelizovatelnost. Všechny moduly interně používají jednotnou kostru a framework, což znamená, že je velmi jednoduché přidávat další a rozšiřovat tak funkčnost celého systému.
V první fázi návrhu a vývoje se počítalo, že systém Mentat bude obsahovat i vlastnosti a nástroje pro sběr a výměnu bezpečnostních informací. Tuto funkci však později převzal sesterský projekt Warden, jehož ambice byly trochu skromnější, návrh jednodušší a ve výsledku se ukázalo, že k tomuto účelu i lepší. V tuto chvíli se tedy systém Warden profiluje jako jednotný komunikační kanál pro sdílení bezpečnostních informací a systém Mentat jako nástroj pro jednotné zpracování bezpečnostních informací.
Implementační jazyk | Python3 |
---|---|
Databáze | PostgreSQL |
Datový model | IDEA |
Git repozitář | git clone https://alchemist.cesnet.cz/mentat/repo.git mentat |
Tiketovací systém | Mentat@homeproj.cesnet.cz |
Formát balíčků | deb, tar (návod k instalaci) |
Dokumentace | odkaz |
Následujíci obrázek popisuje aktuální stav architektury systému Mentat.
Implementačním jazykem je striktně Python3 bez jakýchkoliv pokusů o kompatibilitu se stárnoucím Pythonem verze 2. Systém používá PostgreSQL databázi jak perzistentní úložiště událostí. Systém používá IDEA jako datový model pro popis událostí, který je postavený na JSON a který byl speciálně navržen pro popis a ukládání zpráv popisujících široké spektrum bezpečnsotních událostí a myšlenkou možného budoucího rozšiřování.
Systém Mentat se skládá z nástrojů umožnujících zpracování zpráv jak v reálném čase, tak zpětně za určité časové období. V tuto chvíli jsou k dispozici následující nějdůležitější moduly pro zpracování v zpráv v reálném čase:
pravdivá
. Nejčastějšími a nejužitečnějšími případy užití tohoto modulu jsou klasifikace a verifikace zpráv, filtrace nebo podmíněné zpracování. (více informací)Většina modulů umožňujících zpětné zpracování zpráv je založená na pravidelně spouštěných skriptech (tzv. cronech). V tuto chvíli jsou k dispozici následující moduly umožňující zpětné zpracování za určitý časový interval:
Poněkud stranou je poměrně velká kolekce nástrojů a skriptů pro správu, jejichž úkolem je zjednodušení jednotvárných a opakujících se administrativních úkonů. Některé z nejužitečnějších jsou následující:
Konečně poslední důležitou kmponentou systému je webové uživatelské rozhraní:
Jak již bylo zmíněno výše, všechny systémové moduly včetně neustále běžících démonů i pravidelně spouštěných skriptů používají společný framework nazvaný PyZenKit, který zajišťuje všechny společné vlastnosti:
Všechny stále běžící moduly fungují na principu *trubky*, kdy zpráva na jedné straně do modulu vstoupí, ten provede relevantní zpracování a zpráva na druhém konci opět vystoupí. K jednoduché výměně zpráv mezi jednotlivými moduly slouží podobně jako v MTA Postfix fronty založené na souborech a adresářích na filesystému.
Interně používají všechny daemon moduly design založený na zpracování událostí. V každém démonu existuje interní nekonečná smyčka a fronta událostí. Události jsou emitovány v různých komponentách daného démona a řazeny do fronty událostí. Interní plánovač pak vybírá ve správném pořadí události z fronty a volá příslušný řetězec zpracovacích metod.
Za účelem zvýšení znovupoužitelnosti kódu se každý démon skládá z jedné nebo více *komponent*, ve kterých se teprve skutečně ukrývá aplikační logika a obalující démon slouží v podstatě pouze jako kontejner. V tuto chvíli již existují komponenty zajišťující nejruznější dílčí úkony jako načtení zprávy ze souboru, parsování zprávy do objektu, filtrování zprávy dle definovancýh pravidel atd. Tyto komponenty mohou být následně řazeny za sebe a jejich správnou kombinací je pak dosaženo požadovaného výsledného efektu.
Následující obrázek popisuje interní architekturu démon modulů s důrazem na znázornění zpracování vnitřních událostí a komponent:
V případě implementace nového démon modulu je tedy většinou nutné navrhnout a implementovat komponentu pro dané vlastní zpracování; vše ostatní je již zajištěno automaticky včetně načítání zpráv z fronty na disku a jejich následného vložení do fronty následujícímu démonu v řetězu.
Pro umožnění výměny zpráv mezi jednotlivými démon moduly byl navržen a implementován protokol pro výměnu zpráv založený na filesystému (aka. *filer protocol*). Inspirací byl opět již zmiňovaný Postfix MTA.
Protokol používá pro výměnu zpráv označené adresáře na filesystému s definovanou nasledující strukturou se speciálním významem:
Klíčovým požadavkem pro správnou funkci protokolu je atomická operace přesunu na úrovni filesystému. Tento požadavek je na Linuxových systémech uspokojen v případě, že zdrojový a cílový adresář se nacházejí na stejné partition. Z toho vyplývá požadavek nikdy nedávat podadresáře fronty na různé oddíly disku. Následující procedura popisuje bezpečné vložení nové zprávy do fronty démona ke zpracování:
Následující obrázek popisuje zmiňovaný proces vložení nové zprávy do fronty démonu:
Modré šipky jsou filesystémové operace prováděné externím procesem, který vkládá novou zprávu do fronty. Dle výše popsané prcedury je zpráva nejprve vložena do podadresáře tmp a poté atomicky přesunuta do incoming. Červené šipky jsou filesystémové operace prováděné samotným démonem. Atomickým přesunutím zprávy z incoming do pending dojde k jejímu označení jakožto *in progress* a démon může zahájit zpracování. Když je hotov, zpráva je přesunuta do fronty následujícího dému v řadě, přesunuta do errors v případe nějaké chyby při zpracování nebo zcela smazána (v případě, že démon je posledním ve zpracovacím řetězu).
Operace atomického přesunu z incoming do pending má i další účel a tím je zamykání. Ve chvíli, kdy více instancí démonu pracuje nad stejnou frontou atomicita přesunu zajišťuje, že každá zpráva je a bude zpracována právě jednou. Všechny démony jsou na tuto eventualitu připraveny a umí se vyrovnat s tím, že se nějaká zpráva nepodaří přesunout nebo záhadně zmizí z fronty.
Webového rozhraní systému Mentat má jméno Hawat a je postaveno na vynikajícím microframeworku Flask microframework. Slovo *micro* v názvu frameworku však znamená, že ro zjednodušení imlementace některých opakujících se dílších celků jsou k dispozici ještě vlastní nástroje odvozené od nástrojů samotného Flasku, které umožňují i lepší vzájemnou provázanost jednotlivých komponent v rámci celého rohraní.
Flask již v základní instalaci poskytuje nástroj pro rozdělení velkých aplikací do menších logických celků v rámci svého mechanismu tzv. blueprintů. Tato vlastnost je velmi využívána, pouze velmi malá část kódu rozhraní je neměnná a zbytek jsou zásuvné blueprinty/submoduly.
CESNET, z. s. p. o.
Generála Píky 26
160 00 Praha 6
Tel: +420 234 680 222
Fax: +420 224 320 269
info@cesnet.cz
Tel: +420 234 680 222
GSM: +420 602 252 531
Fax: +420 224 313 211
support@cesnet.cz