cs:architecture

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
Poslední revize Obě strany příští revize
cs:architecture [11.09.2018 15:10]
mach@cesnet.cz [Architektura webového rozhraní]
cs:architecture [03.02.2020 11:26]
Jan Mach
Řádek 1: Řádek 1:
 ====== Architektura ====== ====== Architektura ======
  
-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 [[http://​www.postfix.org/​|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. +<note important>​Tato stránka ​je dostupná pouze v [[en:​architecture|angličtině]].</note>
- +
-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 ​[[https://​wardenw.cesnet.cz/​|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 [[https://​wardenw.cesnet.cz/​|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í**. +
- +
-===== Technické detaily ===== +
- +
-^ Implementační jazyk | [[https://​www.python.org/​|Python3]] | +
-^ Databáze | [[https://​www.postgresql.org/​|PostgreSQL]] | +
-^ Datový model | [[https://​idea.cesnet.cz/​|IDEA]] | +
-^ Git repozitář | ''​git clone https://​alchemist.cesnet.cz/​mentat/​repo.git mentat''​ | +
-^ Tiketovací systém | [[https://​homeproj.cesnet.cz/​projects/​mentat|Mentat@homeproj.cesnet.cz]] | +
-^ Formát balíčků | deb, tar [[https://​alchemist.cesnet.cz/​mentat/​doc/​production/​html/​_doclib/​installation.html|(návod k instalaci)]]| +
-^ Dokumentace | [[https://​alchemist.cesnet.cz/​mentat/​doc/​production/​html/​manual.html|odkaz]] | +
- +
-===== Aktuální architektura systému ===== +
- +
-Následujíci obrázek popisuje aktuální stav architektury systému //Mentat//.  +
- +
-{{ ::​mentat-architecture.png?​nolink |Aktuální stav architektury systému Mentat}} +
- +
-Implementačním jazykem je striktně [[https://​www.python.org/​|Python3]] bez jakýchkoliv pokusů o kompatibilitu se stárnoucím Pythonem verze 2. Systém používá [[https://​www.postgresql.org/​|PostgreSQL]] databázi jak perzistentní úložiště událostí. Systém používá [[https://​idea.cesnet.cz/​en/​index|IDEA]] jako datový model pro popis událostí, který je postavený na [[http://​www.json.org/​|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: +
- +
-  * **mentat-inspector.py**\\ Tento modul umožňuje zpracování [[https://​idea.cesnet.cz/​|IDEA]] zpráv na základě výsledku dané filtrační podmínky. K dispozici je řada akcí, které lze podniknout v případě, že podmínka bude vyhodnocena jako ''​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í. [[https://​alchemist.cesnet.cz/​mentat/​doc/​production/​html/​_doclib/​bin_mentat-inspector.html|(více informací)]] +
-  * **mentat-enricher.py**\\ Tento modul umožňuje obohacování příchozích [[https://​idea.cesnet.cz/​|IDEA]] zpráv o další informace, jako je např. získání cílového abuse kontaktu (pro účely reportování),​ IP geolokace and získání cílového čísla ASN. Implementace dalších obohacovacích submodulů je plánována (hostname/​ip resolving, passive DNS, …) a systém je připraven na vytvoření a použití vlastních obohacovacích pluginů. [[https://​alchemist.cesnet.cz/​mentat/​doc/​production/​html/​_doclib/​bin_mentat-enricher.html|(více informací)]] +
-  * **mentat-storage.py**\\ Tento modul umožňuje uložení příchozích [[https://​idea.cesnet.cz/​|IDEA]] zpráv do databáze ([[https://​www.postgresql.org/​|PostgreSQL]]). [[https://​alchemist.cesnet.cz/​mentat/​doc/​production/​html/​_doclib/​bin_mentat-storage.html|(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: +
- +
-  * **mentat-statistician.py**\\ Tento modul umožňuje statistická zpracování událostí obdržené za definovaný časový interval. V tuto chvíli je nakonfigurován na 5 minutový iterval, za který získá počty událostí podle typu detektory, typu události, klasifikace události, IP adres atd. Tyto statistické reporty jsou ukládány do separátní databáze a pak dále slouží pro rychlé generování souhrnných statistických výpisů za daná časová období. [[https://​alchemist.cesnet.cz/​mentat/​doc/​production/​html/​_doclib/​bin_mentat-statistician.html|(více informací)]] +
-  * **mentat-reporter.py**\\ Tento modul umožňuje distribuovat periodické agregované reporty přímo správcům v příslušných koncových sítích. Více informací o reportéru jakožto službě poskytované sdružením [[https://​www.cesnet.cz/​|CESNET,​ a.l.e]] lze nalézt na oficiální stránce [[https://​csirt.cesnet.cz/​cs/​services/​mentat|služby Mentat]]. [[https://​alchemist.cesnet.cz/​mentat/​doc/​production/​html/​_doclib/​bin_mentat-reporter.html|(více informací)]] +
-  * **mentat-informant.py**\\ Tento modul je kombinací výše popsaného statisticianu a reportéru. Jeho úkolem je posílat pravidelné statistické souhrny o provozu systému a zpracování zpráv. Je určen zejména správcům systému Mentat, ale užitečný může být i pro správce v koncových sítích, kterým poskytne např. měsíční statistické souhrny. [[https://​alchemist.cesnet.cz/​mentat/​doc/​production/​html/​_doclib/​bin_mentat-informant.html|(více informací)]] +
- +
-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í:​ +
- +
-  * **mentat-controller.py**\\ Skript umožňující ovládání nakonfigurované sady démonů/​modulů na daném serveru. [[https://​alchemist.cesnet.cz/​mentat/​doc/​production/​html/​_doclib/​bin_mentat-controller.html|(více informací)]] +
-  * **mentat-backup.py**\\ Konfigurovatelný modul umožňující periodické zálohování databáze. V tuto chvíli se pravidelně provádí plná záloha všech systémových tabulek (uživatelé,​ skupiny …) každý den, zatímco záhoha tabulky [[https://​idea.cesnet.cz/​|IDEA]] zpráv se z důvodů obrovského množství dat dělá pouze inkrementálně. [[https://​alchemist.cesnet.cz/​mentat/​doc/​production/​html/​_doclib/​bin_mentat-backup.html|(více informací)]] +
-  * **mentat-cleanup.py**\\ Konfiguraovatelný modul umožňující periodické číštění/​výmaz databáze a souborů na filesystému. [[https://​alchemist.cesnet.cz/​mentat/​doc/​production/​html/​_doclib/​bin_mentat-cleanup.html|(více informací)]] +
- +
-Konečně poslední důležitou kmponentou systému je webové uživatelské rozhraní:​ +
- +
-  * **Hawat**\\ Konfigurovatelné a jednoduše rozšiřitelné webové uživatelské rozhraní založené na mikroframeworku [[http://​flask.pocoo.org/​docs/​1.0/​|Flask]]. [[https://​alchemist.cesnet.cz/​mentat/​doc/​production/​html/​_doclib/​hawat.html|(více informací)]] +
- +
- +
-===== Architektura modulů ===== +
- +
-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ý [[https://​alchemist.cesnet.cz/​pyzenkit/​doc/​production/​html/​manual.html|PyZenKit]],​ který zajišťuje všechny společné vlastnosti:​ +
- +
-  * Životní cyklus aplikace. +
-  * Načítání,​ slučování a validace konfigurace. +
-  * Démonizace. +
-  * Nastavení logování. +
-  * Databázová abstrakční vrstva. +
-  * Abstrakční vrstva pro práci s IDEA zprávami. +
-  * Statistické zpracování dat. +
-  * WHOIS dotazy, IP geolokace. +
- +
-==== Architektura daemon modulů ==== +
- +
-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:​ +
- +
-{{ ::​mentat-daemon-architecture.png?​nolink ​|Architektura daemon modulu systému Mentat}} +
- +
-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. +
- +
-==== Protokol pro výměnu zpráv ==== +
- +
-To facilitate message exchange between daemon modules a very simple filesystem-based message exchange protocol (aka. *filer protocol*) was designed and implemented. It is inspired again by [[http://​www.postfix.org/​|Postfix MTA]]. +
- +
-The protocol uses designated filesystem directory with following substructure for exchanging the messages: +
- +
-  * **incoming**:​ input queue, only complete messages +
-  * **pending**:​ daemon work directory, messages in progress +
-  * **tmp**: work directory for other processes +
-  * **errors**: messages that caused problems during processing +
- +
-Key requirement for everything to work properly is the **atomic move** operation on filesystem level. This requirement is satisfied on Linux system in case the source and target directories in the move operation are on the same partition. Therefore never put queue subdirectories on different partitions and be cautious when enqueuing new messages. To be safe use following procedure to put new message into the queue: +
- +
-  - create new file in **tmp** subdirectory and write/save its content +
-  - filename is arbitrary, but must be unique within all subdirectories +
-  - when done writing, move/rename the file to **incoming** subdirectory +
-  - move operation **must be atomic**, so all queue subdirectories must be on same partition +
- +
-Following diagram describes the process of placing the message into the queue and the process of fetching the message from the queue by the daemon module: +
- +
-{{ ::​mentat-queue-protocol.png?​nolink |Protokol pro výměnu zpráv}} +
- +
-Blue arrows are filesystem operations performed by the external process, that is placing new message into the queue. It is clear, that according to the procedure described above the message is first placed into the **tmp** and then atomically moved into **incoming**. Red arrows indicate filesystem operations performed by the daemon process itself. By atomically moving the message from **incoming** to **pending** it marks the message as *in progress* and may now begin the processing. When done, the message may be moved to the queue of another daemon module, moved +
-to the **errors** in case of any problems or even deleted permanently (in case the daemon module is last in message processing chain). +
- +
-The atomic move operation from **incoming** to **pending** serves also another purpose, which is locking. When multiple instances of the same daemon module work with the same queue the atomicity of the move operation makes sure that each message will be processed only once. All daemon modules are prepared for this eventuality and are not concerned when messages magically disappear from the queue. +
- +
-==== Architektura webového rozhraní ==== +
- +
-Webového rozhraní systému Mentat má jméno [[https://​alchemist.cesnet.cz/​mentat/​doc/​production/​html/​_doclib/​hawat.html|Hawat]] a je postaveno na vynikajícím microframeworku [[http://​flask.pocoo.org/​docs/​1.0/​|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í. +
- +
-[[http://​flask.pocoo.org/​docs/​1.0/​|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. [[http://​flask.pocoo.org/​docs/​1.0/​blueprints/​|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. +
- +
Poslední úprava:: 03.02.2020 11:27