Použitie klientskeho skriptovania je silný nástroj, ktorý je možné použiť, ak je požiadavka na pokročilú konfiguráciu, prípadne rozšírenie existujúcich funkčností aplikácie a nie je možné alebo žiaduce každú požiadavku zahŕňať do novej verzie. Príčin býva v praxi viacero:

– časová náročnosť verzie manažmentu kritických aplikácii – na verzii sa podieľa viacero ľudí, prípadne oddelení;
– nemožnosť dodávať novú verziu často – napríklad u systémov bežiacich 24/7;
– veľký počet zákazníkov s rôznymi požiadavkami, ktorí si prípadne vedia pokročilé konfigurácie spravovať sami alebo požadujú vlastné úpravy, ktoré spravujú vo svojej réžii;
– logické oddelenie pevnej a konfigurovateľnej biznis logiky v aplikácii, ktoré sprehľadňuje architektúru aplikácie a zlepšuje škálovateľnosť.

Tradičným príkladom použitia klientskeho skriptovania je herný priemysel. Video hra môže mať vytvorený základný herný “engine”, ktorý ďalej sprístupňuje objekty a funkcie v aplikácii klientskym skriptom, napríklad keď jednotlivé herné levely sú vytvorené v skriptovacom jazyku. Takéto skripty môže spravovať úplne iný tím. Prípadne ich môže vytvárať s príslušnou dokumentáciou aj pokročilý používateľ.

Ďalším príkladom je vytváranie sieťových pravidiel na firewalle. Klasické konfiguračné súbory vo formáte XML alebo JSON by boli priveľmi limitujúce, je lepšie použiť pokročilejší jazyk podporujúci cykly, podmienky atď…

Raiffeisen Processing Centre (RPC) vyvíja aplikácie pre online platby, kde je jednou z dôležitých požiadaviek spracovanie transakcie v  čo najkratšom čase (do niekoľkých milisekúnd). Na jednotlivých rozhraniach sa vyhodnocujú každú sekundu stovky transakcií (dohromady v celom systéme je to ešte oveľa viac), pričom biznis logika zahŕňa šifrovanie, viacero zápisov do databázy, komunikáciu so systémami tretích strán a podobne.

Jednou z dôležitých funkcií autorizačného systému pre online platby je možnosť automatického zamietnutia podozrivej transakcie. A práve na to je veľmi vhodné využiť klientske skriptovanie. Rôzne typy zneužitia kariet sa rýchlo menia a skripty je potrebné pružne upravovať a nasadzovať, bez reštartu celého systému.

Dnes je na trhu veľa technológii, ktoré umožňujú rozšíriť aplikáciu o skriptovanie. Pre aplikácie písané v .NET je to napríklad Python.NET alebo Jint pre podporu JavaScriptu. Java ekosystém má pokročilý GraalVM, kde je podpora veľmi veľkého množstva jazykov zabezpečená inštalovaním pluginu pre daný jazyk.

Náš autorizačný systém je vytvorený v jazykoch C a C++. Keďže sa jedná o časovo kritické aplikácie, vysoké požiadavky na výkon sú kladené aj na skriptovací jazyk. Z tohto dôvodu sme vybrali jazyk Lua a to konkrétne jeho implementáciu LuaJIT https://luajit.org/.

Je to Just-in-Time kompilovaná implementácia jazyka Lua vo verzii 5.1, čo nám plne postačuje. V prípade potreby je možné niektoré vlastnosti novších verzií emulovať volaním funkcií implementovaných v aplikácii v C. Napríklad bitové operácie z Lua 5.3. V našom prípade to nie je vyžadované.

Autorizačný systém sa použitím knižnice LuaJIT zároveň stáva Just-in-Time kompilátorom pre skripty vyhodnocujúce bezpečnosť transakcií. Pri takto striktne daných podmienkach (C/C++, Just-in-Time kompilovaný jazyk) nie je na výber veľa ďalších možností pre výber skriptovacieho jazyka. Okrem LuaJIT prichádzajú do úvahy:

– Pypy – implementácia Pythonu;
– V8 engine – umožňuje aj Just-in-Time JavaScript, ale jedná sa o obrovský “engine” určený pre úplne iný typ aplikácii.

V prípade, že nie sú na výkon kladené tak vysoké nároky, je možností viacero a okrem Pythonu môže byť zaujímavé použitie JavaScriptu, ktorý ovláda aspoň na základnej úrovni veľa programátorov. https://duktape.org/

Pluginy ako alternatíva k Just-in-Time skriptovaniu
Nie je to naša biznisová prípadová štúdia, ale stojí za to ho spomenúť pre úplnosť. V prípade, že by bol systém predávaný tretej strane, ktorá má záujem výraznejším spôsobom rozširovať funkčnosti systému, môže byť externé skriptovanie nedostatočné, hoci je v Lua možné aj objektové programovanie. V takomto prípade je výhodnejšie do aplikácie dorobiť podporu pre písanie pluginov. Je to samostatná problematika a v C/C++ sa realizuje pomocou “lazy load” dynamických knižníc. Tu je potom dôležité myslieť na veľmi kvalitný návrh stabilných rozhraní , lebo prepisovať a prekompilovať pluginy je oveľa náročnejšie ako modifikovať skripty.

Použitie LuaJIT v kartovom autorizačnom systéme
LuaJIT je pre tento typ systému ideálna voľba. Skompilovaná knižnica zaberá iba cca 0,5MB. Vo všetkých meraniach výkonu má veľmi ďaleko od toho, aby bola úzkym hrdlom aplikácie. Tým sú jednoznačne vstupno výstupné operácie najmä na databáze. LuaJIT poskytuje obojsmernú komunikáciu medzi aplikáciou a skriptami, pričom podporuje FFI (Foreign Function Interface), v štýle jazyka C. Jej integrácia je pomerne jednoduchá, s minimálnymi nárokmi na systémové prostriedky. Samotný jazyk Lua je minimalistický, iba s jedným typom kontajneru – Lua table, ktorý slúži aj ako pole a aj ako mapa. 

Aplikácia volá skripty podľa nasledujúcej schémy:

Schéma: Raiffeisen Processing Centre, 2024

Aplikácia poskytuje Lua skriptom:
– dáta aktuálnej transakcie vrátane bezpečnostných a tokenových dát;
– informácie o nedávnej transakčnej histórii (možnosť hľadania podozrivých opakujúcich sa transakcií).

Lua skripty propagujú do aplikácie:
– logovanie;
– informáciu o vyhodnotení skriptu, či je transakcia podozrivá alebo bezpečná.

Kompilácia skriptov
Kompilácia skriptov prebieha bez reštartu aplikácie poslaním signálu. Pri rekompilácii skriptov dôjde k minimálnemu záseku na niekoľko milisekúnd, pričom aplikácia je škálovaná do mnohých inštancií, ktoré rekompilujú skripty postupne. Keďže je rekompilácia veľmi rýchla a vykonáva sa navyše zvyčajne neskoro večer, kedy je prevádzka rádovo nižšia, sú ďalšie optimalizácie zbytočné. Po rekompilácii sú skripty vyhodnocované porovnateľnou rýchlosťou, ako keby priamou súčasťou kódu. Majú ošetrený „error handling“ a teda nie je možné, aby chybný skript alebo nejaké špecifické dáta spôsobili pád aplikácie. Maximálne dôjde k informácii o chybe v skripte v logu.

Ladenie
Skripty je možné vyladiť offline. Nasimuluje sa ich vstup pomocou ďalšieho Lua skriptu, ktorý prevádza offline testovacie dáta v JSON formáte na dáta, ktoré poskytuje aplikácia. Takto je možné ladiť skripty v rôznych IDE napr. vscode za použitia klasickej Lua a príslušného rozšírenia pre ladenie. Tým je možné vytvárať zložité testovacie scenáre, ktoré sa pomocou POS emulátorov v testovacom prostredí simulujú ťažko. Napríklad sa v pravidle sledujú nejaké časové značky transakcií daného dňa. Toto je možné v JSON dátach off-line veľmi presne nasimulovať.

Bezpečnosť
V našom scenári je bezpečnosť zabezpečená bez dodatočných prostriedkov. API LuaJIT je modulárne a pri jeho nastavení v aplikácii povolíme len to, čo potrebujeme. Napríklad neumožňujeme z Lua skriptov používať systémové volania ako napríklad operácie so súbormi. Navyše naše skripty okrem logovania nevolajú iné aplikačné funkcie a dáta len vyhodnocujú. Všetky dáta sú do Lua skopírované a teda nie je možné poškodiť pôvodné aplikačné dáta či samotnú aplikáciu.

Záver
LuaJIT skripty bežia v našich systémoch niekoľko rokov a za ten čas sa ich naučili zostavovať aj ľudia, ktorí mali minimálne skúsenosti s programovaním. Zároveň odhalili množstvo podozrivých transakcií, ktoré by sa možno dohľadávali spätne po sťažnostiach klienta, alebo kvôli menším sumám, by si to nikto nevšimol. Veríme, že podpora skriptovania, ak je implementovaná správnym spôsobom, môže odbremeniť vývojársky tím od množstva administratívnej práce pri konfigurácii a riešení incidentov a automatizovať mnohé časovo náročné úlohy.


V Raiffeisen Processing Centre (RPC) poskytujeme centralizované služby súvisiace s platobnými kartami.

Sme jednou z najväčších spracovateľských spoločností v regióne pre strednú a východnú Európu, ktorá ročne spracuje 2 miliardy platobných transakcií.

Ako súčasť Raiffeisen Bank International skupiny poskytujeme bezpečné a spoľahlivé kartové služby bankám a vyvíjame platobné riešenia ako digitálna peňaženka, merchant portal, platobná brána a iné.

Na riešeniach pracuje 240+ zamestnancov, 37% tvoria ženy, z ktorých 30% pracuje priamo na technických pozíciách.

Klikni pre viac informácií o Raiffeisen Processing Centre.