Skip to Content

Odoo 19 Community: Web RBL – blokovací zoznam pre útočnú prevádzku na vlastných webových stránkach

24. septembra 2026 pomocou
Odoo 19 Community: Web RBL – blokovací zoznam pre útočnú prevádzku na vlastných webových stránkach

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 vzorovRozpozná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é rozhraniablokovať
Tri úrovne na vzorblokovať, počítať alebo hlásiť — prepínateľné pre každý vzor, bez kóduna vzor
PrahyToľko zásahov toho istého vzoru, kým sa zablokuje; pre prihlásenia desať10 pri prihlásení
Obrana prihláseniaNeú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ätizap.
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ávaniaAdresy, ktoré za päť minút vytvoria dvadsať chybových stránok a takmer žiadnu úspešnú stránku — teda hádajú namiesto čítaniahlásiť
Hodnotenie 0–100Aká 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 textezap.
Blokovanie prihlásenia podľa hodnoteniaOd 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 hroziebVý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ý zoznamhlá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 TorVoliteľné
Krajina pôvoduKrajina pre každý zásah a adresu cez GeoLite2; databázu modul aktualizuje sám pomocou bezplatného licenčného kľúčazobraziť
Pravidlá pre krajinyBlokovať, bez prístupu k prihláseniu, nahlásiť alebo výslovne povoliť — pre každú krajinu, zámerne bez predvoľbyžiadne
Chybné konfigurácieQNAP, 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énouhlásiť
Tiket pre každú adresuZo zistenia vznikne na požiadanie tiket — presne jeden pre každú adresu, uzavretý tiket sa znova otvorí namiesto zdvojeniavypnuté
Povinné stránky a zberačeKanonická cesta k tiráži (Impressum) zostáva vždy dostupná; strojové skúšanie cudzích variantov zápisu sa rozpozná a na požiadanie zablokujehlásiť
Zoznam povolených adriesAdresy a siete, ktoré sa nikdy neblokujú; denne sa dopĺňa z firewallu (protistrany VPN) a zo zverejnených rozsahov adries Googlebota a Bingbotazap.
Priradenie zákazníkoviZásah zo siete zákazníka sa priradí jemu — zo zoznamu povolených adries, nikdy nie odhadom ručnezap.
Doména a identifikátor pri každom zásahuKtorá webová stránka bola oslovená a s akým User-Agent — oboje v prístupovom protokole chýbazap.
VyhodnotenieGraf a pivot cez všetky zásahy: podľa vzoru, dňa, domény, krajiny, adresyzap.
NávnadySondy dostanú vymyslené odpovede s kanárikovou hodnotou; kto ju neskôr vyvolá, tie odpovede čítalvypnuté
Poskytovanie RBLZoznam 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 URLzap.

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.

Web RBL vyhodnotenie: zásahy podľa vzoru za sedem dní

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.txt v pravidle http-request deny, opätovné načítanie cez runtime API bez reštartu
  • nginx — modul geo so zahrnutým súborom adries alebo príkazy deny z vygenerovaného súboru include
  • 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 fetch z 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.

Záznam Web RBL s hodnotením 84 a odôvodnením

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 Web RBL, filtrovaný podľa hodnotenia od 40

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.yml alebo .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/login a rozhrania /xmlrpc/2/common a /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 odmietnezablokovaná na 24 hodín, po troch nápadných dňoch natrvalo
počítaťprejdeiba sa zaznamená, bez blokovania
nahlásiťprejdezaznamená 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 útokuPožiadavkyAdresy
Odcudzenie .env57.721223
Sondy PHP12.237256
Path traversal s lukratívnym cieľom10.04664
Konfiguračné súbory5.535114
Prístupové kľúče do cloudu4.388152
Sondy WordPress3.366385
Odcudzenie .git2.811255
Prieskum Odoo (správca databáz, zisťovanie verzie)2.500213
Reťazce nástrojov AI a spúšťanie príkazov (/mcp, /api/fs/exec)2.45074
Zostavovacie inštrukcie (CI/CD)1.90788
Koncové body GraphQL1.87871

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

Zoznamy hrozieb Web RBL: Tor, Spamhaus DROP, FireHOL, blocklist.de

Š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 Web RBL: dodané prázdne, s vysvetlením

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.