Audit trigger PL/Python
Obsah článku:
Audit v jazyku PL/Python
Jedná sa o ďalšiu formu audit tiggera, tentokrát však v PL jazyku Python. Log sa ukladá do dočasného súboru v TMP vo formáte JSON. Vytvoríme tiež trigger, ktorý bude zasielať informácie cez socketový server na UDP porte 9999. Ktoré odchytíme pomocou jednoduchého programu(ang. UDP listener), vytvorenom v jazyku Python.
SQL DUMP
Download SQL
Štruktúra DB - Diagram
Vytvorenie zjednodušenej tabuľky
|
|
PL/Python funkcia
Vytvoríme funkciu, ktorá bude zapisovať logy do súboru. Ide o najjednoduchšiu formu ako permanentne zapisovať vykonané zmeny v DB.
Tento trigger najprv skontroluje, či funkcia už nie je definovaná v miestom adresári funkcie SD[]. Vzhľadom k tomu, že rovnaký trigger môže byt použitý pod rozličným umiestnením logovacieho súboru, log funkcia je uložená pod kľúčom skonštruovaným ako Python n-tica (tuple) z argumentov trigger funkcie v príkaze CREATE TRIGGER. Nie je možné používať TD[„args“] zoznam ako kľúč, pretože ten musí byt nemenný (immutable), a tým Python list nie je, ale n-tica (tuple) áno. Pokiaľ kľúč nie je prítomný, čo by znamenalo, že toto je prvé volanie triggera, musíme vytvoriť vhodnú funkciu a uložiť ho.
Pre UDP log vytvoríme UDP socket pre zápis. Následne definujeme funkciu, ktorá odovzdáva informácie socketu. Vytvoríme tiež dva argumenty pre trigger ako predvolené argumenty pre túto funkciu. Jedná sa o najpohodlnejší spôsob ako v Pythone vytvoriť uzáver (closure – takéto funkcie majú prístup k premenným mimo vlastnú definíciu).
Pre log do súboru jednoducho otvoríme požadovaný súbor v režime pripojenia (append a+) a vytvoríme log funkciu, ktorá zapisuje správu do tohoto súboru a následne vyprázdni zápis (flush). Vďaka čomu sú dáta zapísané okamžite, a nie o nejaký čas neskôr, ak by sa napríklad zaplnila vyrovnávacia pamäť. Funkcia vytvorená v oboch prípadoch je uložená v SD[tuple(TD[“args”])].
V ďalšej časti pripravíme a uložíme plán dopytov (query plan) pre získanie ďalších dát, ktoré chceme logovať a uložiť do SD[‘env_plan’]. Po čom zavoláme pripravenú funkciu (logfunc = SD[args]) a získame riadok ďalších dát logu:
env_info_row = plpy.execute(SD[‘env_plan’])[0].
Nakoniec konvertujeme všetky dáta do JSON objektu (log_msg = json.dumps({…})) a následne použijeme logovaciu funkciu pre zápis do log súboru logfunc(log_msg).
JSON Trigger
Všetky zmeny v tabuľke ako INSERT, UPDATE alebo DELETE sú zaznamenané v /tmp/test.json.log. Vlastníkom súboru je zvyčajne užívateľ, na ktorom beží PostgreSQL server, štandardne postgres. Pre prezretie a prácu na súbore musíme byt prihlásený ako užívateľ postgres alebo root. Samozrejme je možné pozmeniť práva vytvoreného log súboru pomocou príkazu chmod.
Trigger pre socket server
Pokiaľ chceme testovať UDP log, musíme definovať ďalší trigger s rozličnými argumentmi. Samozrejme budeme potrebovať niečo, čo dokáže načúvať na danom porte. Pre tieto účely použijeme program UDP Listener.
Python UDP listener
Program v jazyku Python, ktorý dokáže načúvať na danom porte. Stačí ho spustiť a program sám vypíše všetky UDP pakety prijaté na štandardný výstup (STDOUT).
Test
Po vložený dát do tabuľky test sa aktivujú (spustia) oba triggery.
Log v JSON
JSON (JavaScript Object Notation) sa v posledných rokoch stal jedným z nepoužívanejších formátov pre výmenu dat na Webe. JSON sa objavil, keď sa na webe pre výmenu dát používal prevážne formát XML. Ten v očiach javascriptových vývojárov trpel niektorými nedostatkami, napr. práca s ním bola zložitá (bolo nutné používať „neohrabaný“ DOM, riešiť prítomnosť uzlov obsahujúcich iba biele znaky apod.). A tak napriek tomu, že pri zápise celých dokumentov JSON nemôže (a ani nemá) formátu XML konkurovať, v zápise krátkych štrukturovaných dát vymieňaných webovými aplikáciami konkurenčný boj vyhral JSON. PostgreSQL od verzie 9.2 podporuje tento formát a dokáže tak konkurovať aj databázam určeným pre správu dokumentov. K dispozícií sú ja nové vstavané funkcie PostgreSQL pre správu nerelačného typu JSON, napr. funkcie slúžiace k parsovaniu JSONu – json_to_record a json_to_recordset.
Vsetky zmeny sa uložia do JSON suboru
Log zobrazený programom UDP listener
Sockety môžno chápať ako jeden z prostriedkov pre komunikáciu medzi procesmi. Od iných komunikačných prostriedkov sa líši predovšetkým tím, že komunikujúce procesy nemusia byť na rovnakom počítači. Čo sa týka terminológie, tak komunikáciu si možno prestaviť ako rúru, cez ktorú tečú dáta, pričom socket je pomenovanie pre ich konce. Pri komunikácií si každý proces vytvorí svoj socket a nastaví jeho parametre tak, aby pomocou neho mohol komunikovať so socketom iného procesu (na inom počítači). V tomto prípade používame protokol UDP. Ten slúži k prenášaniu krátkych blokov dát, u ktorých nie je zaistené ich doručenie a ani poradie v akom budú doručené. Výhodou tohoto druhu komunikácie je rýchlosť – nemusí sa nadväzovať žiadne spojenie a nepotvrdzuje sa, či dáta skutočne prišli.
Zdroje:
https://www.zdrojak.cz/clanky/json-jednotny-format-pro-vymenu-dat/