Zdrojový kód: github.com/Alex0176/odoo-web-rbl — AGPL-3, voľne použiteľné.
Kto prevádzkuje server Odoo na internete, dostáva návštevy. Nie občas, ale nepretržite. Počas sedemnástich dní sme na našich piatich webových stránkach zaznamenali a vyhodnotili 731.297 požiadaviek. 110.511 z nich neboli návštevníci, ale automatizované hľadanie zraniteľností, prístupových údajov a konfiguračných súborov.
Tento príspevok opisuje Web RBL, open source modul pre Odoo 19 Community, ktorý túto prevádzku rozpoznáva, hodnotí, eviduje a odmieta — a ktorý blokovací zoznam zverejňuje ako zoznam RBL, teda vo formáte, ktorý firewally a reverzné proxy čítajú priamo. Všetky čísla pochádzajú z ostrej prevádzky.
Čo modul dokáže — prehľad funkcií
| Funkcia | Čo robí | Predvolené nastavenie |
|---|---|---|
| Rozpoznávanie vzorov | Rozpoznáva sondovanie podľa cesty a prípony: .env, .git, konfiguračné súbory, kľúče cloudu, build pokyny CI/CD, WordPress, PHP, path traversal, správcovia databáz, GraphQL, vykonávanie príkazov cez /api/fs/exec a podobné rozhrania | blokovať |
| Tri úrovne na vzor | blokovať, počítať alebo hlásiť — prepínateľné pre každý vzor, bez kódu | na vzor |
| Prahy | Toľko zásahov toho istého vzoru, kým sa zablokuje; pre prihlásenia desať | 10 pri prihlásení |
| Obrana prihlásenia | Neúspešné prihlásenia cez formulár aj XML-RPC/JSON-RPC, neúspešné kontroly relácie, prístupy k správcovi databáz — v databáze, nie v operačnej pamäti | zap. |
| Rozpoznávanie botov pri prihlásení | Kto ignoruje hlásenie o čakaní po desiatich neúspešných pokusoch a ďalej klope, je okamžite zablokovaný | blokovať |
| Rozpoznávanie správania | Adresy, ktoré za päť minút vytvoria dvadsať chybových stránok a takmer žiadnu úspešnú stránku — teda hádajú namiesto čítania | hlásiť |
| Hodnotenie 0–100 | Aká je istota, že za adresou stojí útočník? Z vážnosti vzoru, počtu rôznych vzorov, nápadných dní, dotknutých domén a počtu zásahov — s odôvodnením v čitateľnom texte | zap. |
| Blokovanie prihlásenia podľa hodnotenia | Od nastaviteľného hodnotenia je prihlásenie zakázané, webová stránka zostáva čitateľná | od 40 |
| Podozrenie na odcudzené prístupové údaje | Úspešné prihlásenie z podozrivej adresy sa nahlási a na požiadanie pridelí ako úloha — raz na adresu a deň | zap. |
| Zoznamy hrozieb | Výstupné uzly Tor, Spamhaus DROP, FireHOL Level 1 a blocklist.de sú predkonfigurované; každý ďalší zoznam RBL možno pridať zadaním adresy, denné porovnanie, vlastná úroveň pre každý zoznam | hlásiť |
| Bez prístupu k prihláseniu | Štvrtá úroveň pre zoznamy a krajiny: webová stránka zostáva čitateľná, prihlasovací formulár a rozhrania sú uzavreté — správna odpoveď na Tor | Voliteľné |
| Krajina pôvodu | Krajina pre každý zásah a adresu cez GeoLite2; databázu modul aktualizuje sám pomocou bezplatného licenčného kľúča | zobraziť |
| Pravidlá pre krajiny | Blokovať, bez prístupu k prihláseniu, nahlásiť alebo výslovne povoliť — pre každú krajinu, zámerne bez predvoľby | žiadne |
| Chybné konfigurácie | QNAP, Synology, Exchange Autodiscover, ActiveSync a WebDAV/CalDAV/CardDAV sa rozpoznajú, nikdy sa neblokujú a zaradia sa do pracovného zoznamu so zistením a dotknutou doménou | hlásiť |
| Tiket pre každú adresu | Zo zistenia vznikne na požiadanie tiket — presne jeden pre každú adresu, uzavretý tiket sa znova otvorí namiesto zdvojenia | vypnuté |
| Povinné stránky a zberače | Kanonická cesta k tiráži (Impressum) zostáva vždy dostupná; strojové skúšanie cudzích variantov zápisu sa rozpozná a na požiadanie zablokuje | hlásiť |
| Zoznam povolených adries | Adresy a siete, ktoré sa nikdy neblokujú; denne sa dopĺňa z firewallu (protistrany VPN) a zo zverejnených rozsahov adries Googlebota a Bingbota | zap. |
| Priradenie zákazníkovi | Zásah zo siete zákazníka sa priradí jemu — zo zoznamu povolených adries, nikdy nie odhadom ručne | zap. |
| Doména a identifikátor pri každom zásahu | Ktorá webová stránka bola oslovená a s akým User-Agent — oboje v prístupovom protokole chýba | zap. |
| Vyhodnotenie | Graf a pivot cez všetky zásahy: podľa vzoru, dňa, domény, krajiny, adresy | zap. |
| Návnady | Sondy dostanú vymyslené odpovede s kanárikovou hodnotou; kto ju neskôr vyvolá, tie odpovede čítal | vypnuté |
| Poskytovanie RBL | Zoznam blokovaných adries ako čistý zoznam adries alebo JSON na vlastnej adrese chránenej tokenom — pre HAProxy, OPNsense a každý firewall, ktorý číta zoznamy URL | zap. |
Všetko, čo sa dodáva s hodnotou nahlásiť, vypnuté alebo voliteľné, je takto zámerne: Kto zapína blokovanie naostro, má to urobiť preto, že niekoľko dní sledoval, koho zasiahne — nie preto, že to tak chcela predvoľba.
Vyhodnotenie: zásahy podľa vzoru za sedem dní. Najvyšší stĺpec predstavuje vyhľadávanie súborov .env.
Zoznamy RBL: štandardizovaný spôsob poskytovania blokovaní
RBL znamená Real-time Blackhole List. Pojem pochádza zo sveta e-mailov, kde Spamhaus a ďalší od deväťdesiatych rokov zverejňujú zoznamy škodlivých adries odosielateľov. Princíp je nesmierne jednoduchý a práve preto taký rozšírený: jedna adresa na riadok, dostupná cez HTTP, pravidelne načítavaná znova. Žiadny formát, ktorý by bolo treba najprv analyzovať, žiadne rozhranie, na ktoré by bol potrebný nástroj.
Prakticky každý firewall a každý reverzný proxy dokáže takýto zoznam načítať a vytvoriť z neho pravidlá. Výrobcovia to nazývajú rôzne, mechanizmus je všade rovnaký:
- OPNsense a pfSense — URL Table Alias: načítanie zoznamu adries cez HTTP, použitie ako alias v pravidlách firewallu, aktualizácia v hodinovom alebo dennom rytme
- HAProxy — súbory ACL a mapy:
src -f sperrliste.txtv pravidlehttp-request deny, opätovné načítanie cez runtime API bez reštartu - nginx — modul geo so zahrnutým súborom adries alebo príkazy
denyz vygenerovaného súboruinclude - Fortinet FortiGate — External Block List resp. Threat Feed: jedna URL, z ktorej firewall získava zoznam IP adries a používa ho v politikách
- Palo Alto Networks — External Dynamic List (EDL): ten istý princíp, ako samostatný typ objektu v bezpečnostných politikách
- Check Point — Custom Intelligence Feeds a IP Block Lists cez URL
- Cisco Secure Firewall (Firepower) — Security Intelligence Feeds s vlastnými zdrojmi zoznamov
- Sophos Firewall — Third-Party Threat Feeds: zoznamy adries z URL ako zdroj pre blokovacie pravidlá
- Juniper SRX — Dynamic Address Entries z feedov
- MikroTik RouterOS — Address Lists, napĺňané skriptom a
fetchz URL - CrowdSec — vlastné zoznamy ako zdroj pre bouncery na každom podporovanom systéme
Presne v tomto formáte poskytuje Web RBL svoj zoznam blokovaných adries. Firewall zahodí pakety skôr, ako sa dostanú k webovému serveru — a s nimi aj každý ďalší pokus z tej istej adresy, napríklad na poštový server alebo bránu VPN.
Oba smery, ale na správnom mieste
Cesta funguje aj opačne: do Web RBL možno zadať ľubovoľný zoznam RBL — jedna URL, jedna úroveň, hotovo. Výstupné uzly Tor, Spamhaus DROP, FireHOL a blocklist.de sú predkonfigurované, ďalšie pribudnú troma kliknutiami. Modul rozloží každý zoznam na rozsahy adries a každú žiadosť voči nim skontroluje, v priebehu niekoľkých mikrosekúnd.
A predsa: zmysluplnejšie je používať cudzie zoznamy na firewalle pred ním. Z troch dôvodov. Firewall vidí všetky služby, nielen HTTP — adresa zo zoznamu Spamhaus má neuspieť aj na poštovom serveri a vo VPN. Zahadzuje na úrovni paketov, ešte skôr, než vôbec vznikne spojenie, a aplikačný server tak nestojí nič. A je to miesto, kde sa takéto zoznamy tak či onak udržiavajú; druhá kópia v aplikácii je druhé miesto, ktoré môže zastarať.
Načo sú potom zoznamy v module dobré: na to, čo firewall nedokáže. Nepozná prihlasovací formulár. Web RBL môže adrese zo zoznamu Tor odoprieť prístup k prihláseniu a napriek tomu doručiť webovú stránku — kto chce anonymne čítať, môže; kto chce anonymne skúšať hesla, nesmie. A môže úspešné prihlásenie z adresy uvedenej v zozname nahlásiť ako podozrivý prípad. Oboje vyžaduje, aby bol zoznam tam, kde sa prihlásenie odohráva.
Hodnotenie namiesto pocitu
Adresa, ktorá raz požiadala o /wp-login.php,
je niečo iné ako tá, ktorá počas dvoch dní prešla s piatimi rôznymi
vzormi cez tri domény. Web RBL to prepočíta na
hodnotenie od 0 do 100 — z toho, čo sám
zaznamenal, bez cudzej služby a bez dotazu smerom von.
Jeden záznam: 99 zásahov, hodnotenie 84 a odôvodnenie čitateľne — najzávažnejší vzor, päť rôznych vážnych vzorov, dva nápadné dni, vyše dvadsať zásahov.
Hodnotenie rozhoduje o dvoch veciach. Od nastaviteľnej hodnoty je prihlásenie zakázané — webová stránka zostáva čitateľná, ale kto už hľadal prístupové údaje, nedostane možnosť nájdené vyskúšať. A úspešné prihlásenie z adresy s hodnotením sa nahlási: vtedy už niekto nehádal, ale vedel. Buď bol oprávnený používateľ na cestách, alebo sa prístupové údaje stratili — modul to nerozhoduje, predloží to niekomu, kto sa môže opýtať. Samotné heslo sa pritom nikde nedotkne.
Zoznam blokovaných adries, filtrovaný podľa hodnotenia od 40: počet zásahov, nápadné dni, dotknuté domény a posledná cesta pre každú adresu.
Čo Web RBL chráni — ochranný účinok v jednotlivostiach
1. Prístupové údaje zostávajú neobjavené
Najväčšia nameraná trieda útokov nehľadá medzery v Odoo, ale zabudnuté tajomstvá. Za sedemnásť dní:
- 57 721 požiadaviek na súbory
.env— v nich sú heslá k databázam, kľúče API a tajomstvá relácií - 5 535 požiadaviek na konfiguračné súbory
- 4 388 požiadaviek na prístupové údaje do cloudu:
credentials.json,service-account.json,firebase-adminsdk.json,rclone.conf,.git-credentials - 2 811 požiadaviek na adresáre
.git— kto nejaký nájde, stiahne si kompletný zdrojový kód aj s históriou - 1 907 požiadaviek na zostavovacie inštrukcie, ako sú
.github/workflows/deploy.ymlalebo.gitlab-ci.yml, v ktorých sú uvedené registre a názvy kľúčov
Rozhodujúci pritom nie je počet požiadaviek, ale počet
rôznych adries: /credentials.json prišlo
z 98 adries, /.git-credentials z 92. Nejde o
jednotlivý skener, ale o štandardný repertoár, ktorý beží
naraz po celom svete.
2. Pokusy o prihlásenie vyjdú nazmar — trvalo
Odoo má vlastnú brzdu proti skúšaniu hesiel. Má tri hranice, ktoré sú zdokumentované priamo v zdrojovom kóde Odoo: Počítadlo je v pamäti pracovného procesu a pri každom reštarte sa vynuluje, iba spomaľuje, namiesto aby blokovalo, a počíta výlučne pokusy, ktoré sa dostanú až ku kontrole hesla.
Web RBL zasahuje na tých istých miestach, ale zapisuje do databázy. Z toho vyplýva:
- Stav prežije každý reštart a platí pre všetky pracovné procesy
- Zachytávajú sa obe cesty: prihlasovací formulár
/web/logina rozhrania/xmlrpc/2/commona/jsonrpc - Zachytávajú sa aj pokusy, ktoré sa nikdy nedostanú ku kontrole hesla — napríklad prihlásenia bez platného identifikátora relácie
- Neúspešný prístup k správcovi databáz sa započíta; je to vôbec najzávažnejší pokus o prihlásenie
Prah pre prihlásenia je nastavený na desať a dôvodom je jedno meranie: Z deviatich neúspešných prihlásení za sedemnásť dní pochádzala väčšina od zákazníkov, ktorí si zriaďovali prístup sami na ďalšom zariadení a pritom zadali nesprávnu doménu — v jednom prípade vlastnú, len s pomlčkou namiesto bodky. Blokovanie pri prvom neúspešnom pokuse by teda nezasiahlo útočníkov, ale zákazníkov pri nastavovaní.
Kto naopak ďalej klope, hoci server už odpovedal „počkajte chvíľu“, je okamžite zablokovaný. Túto správu prečíta človek a počká; kto ju ignoruje, je program. Samostatný vzor s prahom nula zachytí presne tento prípad a nemôže zasiahnuť kolegu: Dostane sa tam len ten, kto už má za sebou desať neúspešných pokusov a potom pokračuje.
3. Útok už server nič nestojí
Sonda na cestu ako /@fs/../../.env bola pred
modulom drahá: Odoo hľadá chybovú stránku, vykreslí ju, pri
skladaní adresy sa potkne o segmenty s bodkami a následne zlyhá
aj na chybovej stránke chybovej stránky. Dva
výpisy zásobníka na jednu sondu. Namerali sa 28 401 takýchto chýb
za sedemnásť dní, k tomu 9 467 následných chýb.
Web RBL zasahuje do ir.http._match, teda pred
hľadaním cesty. Odpoveď sa vygeneruje bez šablóny, bez prístupu do databázy
nad rámec kontroly blokovania a bez riadku v protokole. Kontrola
voči zoznamu povolených adries, zoznamom hrozieb a pravidlám pre krajiny beží z
vyrovnávacej pamäte nad zoradenými rozsahmi adries — niekoľko
mikrosekúnd, aj pri viac ako tridsiatich tisíc rozsahoch.
4. Firewall vyhodí útočníka skôr, ako dorazí
Zoznam blokovaných adries sa zverejňuje ako zoznam RBL, ktorý HAProxy a OPNsense čítajú priamo. Útočník sa tak k webovému serveru vôbec nedostane — a ani k žiadnej inej službe na tom istom hostiteľovi. Raz rozpoznaný škodlivý prístup tak chráni spätne celý stroj.
Tri úrovne: blokovať, počítať, nahlásiť
Nie každá žiadosť naprázdno je útok. Web RBL preto rozlišuje tri úrovne a úroveň sa dá pre každý vzor prestaviť bez zásahu do kódu.
| Úroveň | Spúšťajúca žiadosť | Dôsledok pre adresu |
|---|---|---|
| blokovať | sa odmietne | zablokovaná na 24 hodín, po troch nápadných dňoch natrvalo |
| počítať | prejde | iba sa zaznamená, bez blokovania |
| nahlásiť | prejde | zaznamená sa s textom zistenia, nikdy sa neblokuje |
Pre zoznamy hrozieb a krajiny existuje štvrtá úroveň: bez prístupu k prihláseniu. Webová stránka zostáva čitateľná, prihlasovací formulár a rozhrania sú uzavreté. Je to stredná cesta pre všetko, čo je podozrivé, ale nemusí byť škodlivé — Tor, rozsah dátového centra, krajina bez zákazníkov.
Ktoré útoky sa rozpoznávajú
Všetky vzory sú overené na reálnej prevádzke. Počet rôznych adries je zámerne uvedený vedľa — ukazuje, či vzor zasahuje jednotlivý skener, alebo rozšírený postup.
| Trieda útoku | Požiadavky | Adresy |
|---|---|---|
Odcudzenie .env | 57.721 | 223 |
| Sondy PHP | 12.237 | 256 |
| Path traversal s lukratívnym cieľom | 10.046 | 64 |
| Konfiguračné súbory | 5.535 | 114 |
| Prístupové kľúče do cloudu | 4.388 | 152 |
| Sondy WordPress | 3.366 | 385 |
Odcudzenie .git | 2.811 | 255 |
| Prieskum Odoo (správca databáz, zisťovanie verzie) | 2.500 | 213 |
Reťazce nástrojov AI a spúšťanie príkazov (/mcp, /api/fs/exec) | 2.450 | 74 |
| Zostavovacie inštrukcie (CI/CD) | 1.907 | 88 |
| Koncové body GraphQL | 1.878 | 71 |
Pozoruhodná je najnovšia trieda. /api/fs/exec
bolo vyžiadané 369-krát z 54 rôznych adries — nejde
o prístup na čítanie, ale o pokus spúšťať príkazy. Takéto
ciele pred dvoma rokmi neexistovali; pochádzajú z rozhraní
nových nástrojov AI a front úloh. Kto svoju obranu zameria iba
na WordPress a PHP, nič z toho nevidí. V hodnotení
táto trieda zodpovedajúco veľa váži.
Zoznamy hrozieb a krajina pôvodu
Štyri zoznamy, 32 851 rozsahov adries, všetky nastavené iba na „nahlásiť“. Každý ďalší zoznam je adresa a úroveň.
Cudzí zoznam je tvrdenie, ktoré vyslovuje niekto iný
z dôvodov, ktoré nepoznáme, o prevádzke, ktorú sme
nikdy nevideli. Môže byť nesprávny, zastaraný alebo určený
na iný účel: blocklist.de zbiera predovšetkým
adresy, ktoré inde skúšali prihlásenia cez SSH, a to
o webovom serveri hovorí máločo. Preto Web RBL vedie cudzie zoznamy
oddelene od vlastného zoznamu blokovaných adries a preto je predvoľbou
nahlásiť. A vlastný zoznam povolených adries vždy vyhráva: Zákazník, ktorého
poznáme, má väčšiu váhu ako posúdenie tretej strany.
Krajina pôvodu je uvedená pri každom zásahu a každej adrese. Na posudzovanie je nenahraditeľná — pokus o prihlásenie z vlastnej krajiny o desiatej predpoludním je niečo iné ako pokus z krajiny, v ktorej nemáme ani jedného zákazníka. Na plošné vylúčenie sa však hodí málo, a hovoria o tom naše vlastné čísla: Útočníci v našom zozname pochádzali prevažne z cloudových rozsahov v Belgicku, Fínsku a Holandsku. Blokovanie všetkého mimo nemecky hovoriacej oblasti by ich nezasiahlo — zato by však zasiahlo vlastných zamestnancov na dovolenke a zákazníkov na služobnej ceste.
Pravidlá pre krajiny sa dodávajú prázdne a zobrazenie hovorí, prečo.
Chybné konfigurácie nahlasovať, nie blokovať
Najčastejším prípadom v reálnej prevádzke nie je ani útok, ani návštevník, ale chybný softvér, ktorý považuje webový server za niečo iné:
- 1 367 volaní webového rozhrania NAS QNAP — synchronizačný klient, ktorého cieľ už nesedí. Jediný port klopal 962-krát.
- 65 dotazov Autodiscover — Outlook, ktorý považuje webovú doménu za svoj Exchange
Takéto adresy sa nikdy neblokujú. Blokovanie chybu neodstráni, len ju zakryje — a zasiahne toho, ktorého zariadenie je už aj tak nesprávne nastavené. Namiesto toho vznikne záznam s textom zistenia a dotknutými doménami, z ktorého sa na požiadanie automaticky vytvorí tiket: pre každú adresu presne jeden, a ak sa uzavrie a adresa sa znova objaví, otvorí sa ten istý tiket znova, namiesto aby vznikol druhý.
Rozpoznávajú sa QNAP, Synology, Exchange Autodiscover, ActiveSync
a tiež klienti WebDAV, CalDAV a CardDAV. Vzory pritom uvádzajú
presné názvy súborov a adresárov, nikdy len prípony:
V tom istom adresári /cgi-bin/ ležia neškodné
synchronizačné volania hneď vedľa klasických sond ako
printenv.pl.
Zoznam povolených adries: adresy, ktoré sa nikdy neblokujú
Cena omylu nie je pri všetkých adresách rovnaká. Pri skeneri z dátového centra falošný poplach nestojí nič. Pri protistrane tunela medzi pobočkami stojí celú pobočku.
Preto existuje druhý zoznam, ktorý stojí pred prvým: adresy a siete, ktoré sa nikdy neblokujú. Nič pritom neumlčí — kto je na ňom, je naďalej kontrolovaný a zaznamenávaný, iba dôsledok odpadá. To je rozdiel oproti výnimke vo firewalle: Tá oslepuje, tento zoznam robí len trpezlivým.
Napĺňa sa denne z dvoch zdrojov: priamo z firewallu s jeho protistranami VPN, aby novozriadený tunel nebol odkázaný na to, že niekto pomyslí na zoznam blokovaných adries — a zo zverejnených rozsahov adries Googlu a Microsoftu pre ich crawlery. Len tak sa dá odlíšiť skutočný Googlebot od skenera, ktorý sa tak volá. Vyhľadávače sa nikdy nesmú blokovať; kto ich vylúči, vyradí svoju stránku z indexovania bez cesty späť.
Pritom platí pravidlo, ktoré je dôležitejšie ako porovnanie: Prázdna odpoveď nikdy nič nevymaže. Ak zdroj neodpovie, odpovie prázdne alebo nezrozumiteľne, zoznam zostane nezmenený. Zoznam povolených adries, ktorý sa pri poruche sám vyprázdni, vezme v najhoršom možnom okamihu so sebou všetky tunely.
Ak je pri zázname v zozname povolených adries uvedený zákazník, každý zásah z jeho siete sa priradí jemu. Chybná konfigurácia tak má okamžite kontaktnú osobu, bez toho, aby niekto musel vyhľadávať adresy.
Povinné údaje a automatizované zberače údajov
Tiráž (Impressum) nie je obyčajná stránka. Musí zostať dostupná pre ľudí, lebo jej blokovanie vytvára presne to porušenie, ktoré zberač hľadá. Zároveň je to stránka, na ktorej je meno a adresa — a teda cieľ strojového zberu.
Pri rakúskej vlne upomienok kvôli vloženým fontom Google ukázali protokoly, že listy nepochádzali z jednotlivých návštev, ale z automatizovaného plošného útoku: rôzne, nesúvisiace hosty v odstupe milisekúnd.
Web RBL to rieši zhoršením stavu namiesto výnimky. Kanonická
cesta /impressum nezodpovedá žiadnemu vzoru a
zostáva vždy dostupná. Cudzie varianty zápisu ako
/impressum.php — ktoré na stránke Odoo
nemôžu existovať — sa nahlásia a kto strojový
zber nechce tolerovať, prestaví jeden parameter.
sitemap a robots sú z toho vyňaté
a v zásade sa nedajú blokovať: Neobsahujú
žiadny osobný údaj a ich získavanie je úlohou každého
crawlera vyhľadávača.
Doména a identifikátor: čo v prístupovom protokole chýba
Prístupový protokol werkzeug nezapisuje ani oslovený host, ani identifikátor volajúceho. Odoo oboje samozrejme dostane — bez hosta by pri viacerých webových stránkach nemohlo vybrať tú správnu. Dodatočne sa to však nedá dohľadať.
Web RBL uchováva oboje pri každom zásahu. To odpovedá na dve otázky, ktoré sa inak zodpovedať nedajú: ktorú webovú stránku chybná konfigurácia oslovuje — a teda, komu doména patrí — a či adresa navštevuje jednu stránku, alebo všetky. Viacero nesúvisiacich domén tej istej adresy je znakom plošného útoku a zvyšuje hodnotenie.
Ako veľa identifikátor znamená, ukázalo vyhodnotenie na jednej z
našich webových stránok: Viac ako sedemdesiat percent celej prevádzky
mal na starosti jediný volajúci, rozložený na viac ako
sto adries. Bez identifikátora by to vyzeralo ako distribuovaný
scraper. Bol to GPTBot, crawler spoločnosti OpenAI
— opakovane sa pýtal na robots.txt a
správal sa úplne korektne.
Bezpečnostné aspekty v jednotlivostiach
1. Rozpoznávanie proxy — vôbec najnebezpečnejšie miesto
Ak Odoo beží za reverzným proxy a proxy_mode
je nastavený nesprávne, modul pri každej žiadosti vidí tú istú adresu:
adresu proxy. Blokovanie by potom vylúčilo všetkých návštevníkov
naraz.
Preto Web RBL pred každým blokovaním kontroluje, či je určenie adresy
spoľahlivé. Vyžaduje proxy_mode spolu s
presmerovacou hlavičkou, odmietne pracovať, ak príde
presmerovanie bez proxy_mode, a rovnako
odmietne pracovať pri viac ako jednom sprostredkujúcom proxy. V pochybnostiach sa neblokuje.
2. Vlastné siete nikdy
Súkromné rozsahy adries, loopback, link-local a CGNAT sú pevne vyňaté. Za žiadnych okolností sa nemôžu ocitnúť v zozname, ani ručne. To isté platí pre cudzie zoznamy: Súkromné a vyhradené rozsahy, ako aj absurdne veľké siete sa pri načítaní zahodia.
3. Vlastná chyba nesmie zhodiť webovú stránku
Celá kontrola beží v zabezpečení, ktoré zachytí každú chybu. Čo sa tu pokazí, zaprotokoluje sa a žiadosť pokračuje nezmenená. Ochranný modul, ktorý pri vlastnej chybe zhodí webovú stránku, je horší ako žiadny. Všetky dotazy v ceste žiadosti navyše bežia bez jazyka prehliadača návštevníka a bez zoradenia podľa prekladaných polí — návštevník s nenainštalovaným jazykom nesmie spôsobiť zlyhanie kontroly.
4. Sledovať pred blokovaním
Po inštalácii je blokovanie adries zo zoznamu pri bežných žiadostiach vypnuté. Sondy sa odmietajú a zaznamenávajú, všetko ostatné prechádza. Tak možno niekoľko dní sledovať, kto sa skutočne ocitne v zozname, skôr ako je niekto vylúčený. To isté platí pre rozpoznávanie správania, zoznamy hrozieb a pravidlá pre krajiny: najprv nahlásiť, blokovať až po zhodnotení.
5. Úzke vzory namiesto širokých sietí
Nesprávne rozpoznaný návštevník je drahší ako prehliadnutá sonda.
Každý vzor preto nesie svoju úroveň a tá sa dá pre každý vzor
prestaviť. Samotná prípona súboru zriedka stačí: Pri
.php stojí 14 012 skutočných sond proti hŕstke
starých odkazov, pri .asp je pomer opačný. Takéto
rozhodnutia treba merať, nie odhadovať.
6. Ručné povolenie zostáva zachované
Kto adresu povolí, mal na to dôvod. Ďalší zásah toto rozhodnutie tíško nezruší.
7. Zoznam je chránený, ale nie je tajomstvom
Koncový bod vyžaduje token a bez platného tokenu odpovedá
kódom 404, nie 403 — existencia
adresy sa tak vôbec nepotvrdí. Porovnanie beží
v konštantnom čase. Samotný zoznam neobsahuje nič dôverné: Pozostáva
z adries, ktoré k nám zaklopali z vlastnej vôle.
8. Žiadne tajomstvá v evidencii
Pri neúspešných prihláseniach sa poznačí skúšané používateľské meno, nikdy nie heslo. Pri správcovi databáz sa z odovzdaných hodnôt nečíta vôbec nič: Na prvom mieste tam stojí hlavné heslo a záznam v zozname blokovaných adries putuje do každej zálohy databázy. Licenčný kľúč pre GeoLite2 je uložený iba v systémovom parametri a v žiadnom riadku protokolu.
9. Návnada neprezradí nič využiteľné
Voliteľne Web RBL odpovedá na sondy vymysleným obsahom, ktorý obsahuje jednoznačnú kanárikovu hodnotu. Kto túto hodnotu neskôr vyvolá, čítal falošnú odpoveď a na jej základe konal — falošný poplach je pritom vylúčený. Návnady neobsahujú žiadne využiteľné údaje, žiadne skutočné cesty a žiadne platné prístupové údaje. Táto funkcia sa dodáva vypnutá, lebo mení správanie viditeľne navonok.
Čo modul nedokáže
Nenahrádza firewall ani Web Application Firewall. Rozpoznáva známe vzory sondovania v cestách, neúspešné prihlásenia a nápadné správanie — nie útoky na formuláre, nie pokusy o vloženie škodlivého kódu do parametrov.
Okrem toho vidí len to, čo sa vráti cez HTTP. Čo útočník s ukradnutými prístupmi do databázy alebo poštovej schránky robí, zostáva neviditeľné — a práve preto sú kanárikove hodnoty cestami a nie prístupovými údajmi.
A nenahrádza starostlivosť: Modul, ktorý
odmieta sondy na .env, neurobí z omylom
zverejneného súboru .env neškodný súbor.
Dostupnosť
Web RBL je verejne dostupný pod licenciou AGPL-3 a u nás beží produkčne na piatich webových stránkach:
github.com/Alex0176/odoo-web-rbl
Modul vyžaduje Odoo 19 Community a nemá žiadne
závislosti okrem base a web. Napojenie
na tikety je voliteľné a nevyžaduje žiadny konkrétny
systém tiketov; bez neho sa jednoducho nič nestane. Krajina
pôvodu potrebuje bezplatnú databázu GeoLite2 od MaxMind;
ak chýba, pole zostane prázdne a všetko ostatné funguje
nezmenene.
Ďalšie čítanie: Ako sa Web RBL zapája do kompletnej bezpečnostnej architektúry -- spolu s firewallom, dvojfaktorovým overením a oprávneniami, vrátane návodu krok za krokom: Správna kombinácia bezpečnostnej architektúry Odoo 19.
Otázky, pripomienky a hlásenia chýb rád prijmeme — najradšej ako issue na GitHube.