Přejít na obsah

Odoo 19 Community: Web RBL – blokovací seznam pro útočný provoz na vlastních webových stránkách

24. září 2026 od
Odoo 19 Community: Web RBL – blokovací seznam pro útočný provoz na vlastních webových stránkách

Zdrojový kód: github.com/Alex0176/odoo-web-rbl — AGPL-3, volně použitelné.

Kdo provozuje server Odoo na internetu, dostává návštěvy. Ne občas, ale nepřetržitě. Za sedmnáct dní jsme na našich pěti webových stránkách zaznamenali a vyhodnotili 731 297 požadavků. 110 511 z nich nebyli návštěvníci, ale automatizované vyhledávání slabých míst, přístupových údajů a konfiguračních souborů.

Tento příspěvek popisuje Web RBL, open-source modul pro Odoo 19 Community, který tento provoz rozpoznává, hodnotí, eviduje a odmítá — a který blokovací seznam zveřejňuje jako seznam RBL, tedy ve formátu, který firewally a reverzní proxy čtou přímo. Všechna čísla pocházejí z ostrého provozu.

Co modul umí — přehled funkcí

FunkceCo děláPři dodání
Rozpoznávání vzorůRozpoznává sondování podle cesty a přípony: .env, .git, konfigurační soubory, cloudové klíče, sestavovací instrukce CI/CD, WordPress, PHP, procházení cest (path traversal), správce databází, GraphQL, spouštění příkazů přes /api/fs/exec a podobná rozhraníblokovat
Tři stupně na vzorblokovat, počítat nebo hlásit — přepínatelné u každého vzoru, bez kódupodle vzoru
PrahyTolik zásahů téhož vzoru, než dojde k zablokování; u přihlášení deset10 u přihlášení
Obrana přihlášeníNeúspěšná přihlášení přes formulář i XML-RPC/JSON-RPC, neúspěšné kontroly relace, přístupy ke správci databází — v databázi, nikoli v operační pamětizapnuto
Rozpoznávání botů při přihlášeníKdo ignoruje čekací hlášení po deseti neúspěšných pokusech a dál buší, je okamžitě zablokovánblokovat
Rozpoznávání chováníAdresy, které za pět minut vyvolají dvacet chybových stránek a téměř žádnou nalezenou stránku — tedy hádají místo čteníhlásit
Hodnocení 0–100Jak jisté je, že za adresou stojí útočník? Ze závažnosti vzoru, počtu různých vzorů, nápadných dnů, dotčených domén a počtu zásahů — s odůvodněním v prostém textuzapnuto
Blokování přihlášení podle hodnoceníOd nastavitelného hodnocení je přihlášení zakázáno, webová stránka zůstává čitelnáod 40
Podezření na odcizené přístupové údajeÚspěšné přihlášení z nápadné adresy je nahlášeno a na přání přiřazeno jako úkol — jednou na adresu a denzapnuto
Seznamy hrozebVýstupní uzly Tor, Spamhaus DROP, FireHOL Level 1, blocklist.de jsou předkonfigurované; každý další RBL seznam lze přidat podle adresy, denní porovnání, pro každý seznam vlastní úroveňhlásit
Žádný přístup k přihlášeníČtvrtá úroveň pro seznamy a země: web zůstává čitelný, přihlašovací formulář a rozhraní jsou uzavřeny — správná odpověď na TorVolba
Země původuZemě u každého záznamu a adresy prostřednictvím GeoLite2; databázi si modul sám aktualizuje pomocí bezplatného licenčního klíčezobrazit
Pravidla pro zeměBlokovat, žádný přístup k přihlášení, hlásit, nebo výslovně povolit — pro každou zemi, záměrně bez výchozího nastavenížádná
Chybné konfiguraceQNAP, Synology, Exchange Autodiscover, ActiveSync, WebDAV/CalDAV/CardDAV jsou rozpoznány, nikdy blokovány a spolu s nálezem a dotčenou doménou zařazeny do pracovního seznamuhlásit
Tiket na adresuZ nálezu se na přání stane tiket — právě jeden na adresu, uzavřený tiket se znovu otevře místo zdvojenívyp.
Povinné stránky a sběračeKanonická cesta k impresu zůstává vždy dostupná; strojové zkoušení cizích zápisů je rozpoznáno a na přání blokovánohlásit
Seznam výjimekAdresy a sítě, které se nikdy neblokují; denně se plní z firewallu (protistrany VPN) a z publikovaných rozsahů adres Googlebotu a Bingbotuzapnuto
Přiřazení zákazníkoviZáznam ze sítě zákazníka je přiřazen jemu — ze seznamu výjimek, nikdy odhadem od rukyzapnuto
Doména a identifikace u každého záznamuJaký web byl oslovén a s jakým User-Agentem — obojí v přístupovém protokolu chybízapnuto
VyhodnoceníGraf a kontingenční tabulka přes všechny záznamy: podle vzoru, dne, domény, země, adresyzapnuto
NávnadaSondy dostávají vymyšlené odpovědi s kanárkovou hodnotou; kdo si ji později vyžádá, ty odpovědi přečetlvyp.
Poskytování RBLBlokovací seznam jako čistý seznam adres nebo JSON na vlastní adrese chráněné tokenem — pro HAProxy, OPNsense a každý firewall, který čte seznamy URLzapnuto

Vše, co se dodává s volbou hlásit, vyp. nebo volba, je takto záměrně: Kdo zapíná ostrou blokaci, má to udělat proto, že několik dní sledoval, koho zasáhne — nikoli proto, že to tak chtělo výchozí nastavení.

Vyhodnocení Web RBL: záznamy podle vzoru za sedm dní

Vyhodnocení: záznamy podle vzoru za sedm dní. Nejvyšší sloupec představuje vyhledávání souborů .env.

Seznamy RBL: standardizovaný způsob, jak poskytovat blokace

RBL znamená Real-time Blackhole List. Pojem pochází ze světa e-mailu, kde Spamhaus a další od devadesátých let publikují seznamy škodlivých adres odesílatelů. Princip je neobyčejně jednoduchý, a právě proto tak rozšířený: jedna adresa na řádek, dostupné přes HTTP, pravidelně znovu načítané. Žádný formát, který je třeba nejdřív zpracovat, žádné rozhraní, pro které by byl potřeba nástroj.

Prakticky každý firewall a každý reverzní proxy dokáže takový seznam načíst a vytvořit z něj pravidla. Výrobci to nazývají různě, mechanismus je všude stejný:

  • OPNsense a pfSense — URL Table Alias: načíst seznam adres přes HTTP, použít jej jako alias v pravidlech firewallu, aktualizace po hodinách nebo po dnech
  • HAProxy — soubory ACL a Maps: src -f sperrliste.txt v pravidle http-request deny, lze znovu načíst přes runtime API bez restartu
  • nginx — modul geo s vloženým souborem adres, nebo příkazy deny z vygenerovaného souboru include
  • Fortinet FortiGate — External Block List resp. Threat Feed: URL, ze které firewall získává seznam IP adres a používá jej v politikách
  • Palo Alto Networks — External Dynamic List (EDL): stejný princip, jako samostatný typ objektu v bezpečnostních politikách
  • Check Point — Custom Intelligence Feeds a IP Block Lists přes URL
  • Cisco Secure Firewall (Firepower) — Security Intelligence Feeds s vlastními zdroji seznamů
  • Sophos Firewall — Third-Party Threat Feeds: seznamy adres z URL jako zdroj pro blokovací pravidla
  • Juniper SRX — Dynamic Address Entries z feedů
  • MikroTik RouterOS — Address Lists, plněné skriptem a příkazem fetch z URL
  • CrowdSec — vlastní seznamy jako zdroj pro bouncery na každém podporovaném systému

Přesně v tomto formátu poskytuje Web RBL svůj blokovací seznam. Firewall zahodí pakety dřív, než se dostanou k webovému serveru — a s nimi i každý další pokus téže adresy, například o poštovní server nebo bránu VPN.

Obě cesty, ale na správném místě

Tato cesta funguje i opačně: Do Web RBL lze zadat libovolný RBL seznam — jedna URL, jedna úroveň, hotovo. Výstupní uzly Tor, Spamhaus DROP, FireHOL a blocklist.de jsou předkonfigurované, další přibudou třemi kliknutími. Modul rozloží každý seznam na rozsahy adres a každý požadavek proti nim ověřuje, během několika mikrosekund.

A přesto: Smysluplnější je používat cizí seznamy na firewallu vpředu. Ze tří důvodů. Firewall vidí všechny služby, nejen HTTP — adresa ze seznamu Spamhaus má neuspět i na poštovním serveru a na VPN. Zahazuje na úrovni paketů, ještě než vůbec vznikne spojení, a aplikační server tím nestojí nic. A je to místo, kde se takové seznamy stejně udržují; druhá kopie v aplikaci je druhé místo, které může zastarat.

K čemu jsou seznamy v modulu dobré: pro to, co firewall neumí. Nezná přihlašovací formulář. Web RBL může adrese ze seznamu Tor odepřít přístup k přihlášení a přesto doručit web — kdo chce číst anonymně, smí; kdo chce anonymně zkoušet hesla, nesmí. A může úspěšné přihlášení z adresy na seznamu nahlásit jako podezřelý případ. Obojí vyžaduje, aby byl seznam tam, kde se přihlašuje.

Hodnocení místo pocitu

Adresa, která se jednou zeptala na /wp-login.php, je něco jiného než ta, která za dva dny prošla pěti různými vzory přes tři domény. Web RBL to převádí na skóre od 0 do 100 — z toho, co sám viděl, bez cizí služby a bez dotazu navenek.

Záznam Web RBL se skóre 84 a odůvodněním

Jeden záznam: 99 zásahů, skóre 84 a odůvodnění běžným jazykem — nejzávažnější vzor, pět různých závažných vzorů, dva nápadné dny, přes dvacet zásahů.

Skóre rozhoduje o dvou věcech. Od nastavitelné hodnoty je přihlášení zakázáno — web zůstává čitelný, ale kdo už hledal přístupové údaje, nedostane příležitost nalezené vyzkoušet. A úspěšné přihlášení z adresy se skóre je nahlášeno: Tehdy nějaký člověk už nehádal, ale věděl. Buď byl oprávněný uživatel na cestách, nebo se přístupové údaje ztratily — modul to nerozhoduje, předloží to někomu, kdo se může zeptat. Samotné heslo se přitom nikde nedotkne.

Blokovací seznam Web RBL, filtrovaný podle skóre od 40

Blokovací seznam filtrovaný podle skóre od 40: počet zásahů, nápadné dny, dotčené domény a poslední cesta u každé adresy.

Co Web RBL chrání — ochranný účinek podrobně

1. Přístupové údaje zůstávají neobjeveny

Největší naměřená třída útoků nehledá mezery v Odoo, ale zapomenutá tajemství. Za sedmnáct dní:

  • 57.721 požadavků na soubory .env — v nich jsou hesla k databázím, klíče API a tajemství relací
  • 5.535 požadavků na konfigurační soubory
  • 4.388 požadavků na přístupové údaje do cloudu: credentials.json, service-account.json, firebase-adminsdk.json, rclone.conf, .git-credentials
  • 2.811 požadavků na adresáře .git — kdo nějaký najde, stáhne si kompletní zdrojový kód včetně historie
  • 1.907 požadavků na sestavovací předpisy jako .github/workflows/deploy.yml nebo .gitlab-ci.yml, v nichž jsou registry a názvy klíčů

Rozhodující přitom není počet požadavků, ale počet různých adres: /credentials.json přišlo z 98 adres, /.git-credentials z 92. To není jeden skener, ale standardní repertoár, který běží celosvětově současně.

2. Pokusy o přihlášení vyjdou naprázdno — trvale

Odoo má vlastní brzdu proti zkoušení hesel. Má tři meze, které jsou ve zdrojovém kódu Odoo samotném dokumentovány: Počitadlo je v operační paměti pracovního procesu a při každém restartu se vynuluje, pouze zpomaluje, místo aby blokovalo, a počítá výhradně pokusy, které se dostanou až ke kontrole hesla.

Web RBL zasahuje na týchž místech, ale zapisuje do databáze. Tím platí:

  • Stav přežije každý restart a platí napříč všemi pracovními procesy
  • Zachyceny jsou obě cesty: přihlašovací formulář /web/login a rozhraní /xmlrpc/2/common a /jsonrpc
  • Zachyceny jsou i pokusy, které nikdy nedojdou ke kontrole hesla — například přihlášení bez platného identifikátoru relace
  • Neúspěšný přístup ke správci databází se počítá také; je to vůbec nejzávažnější pokus o přihlášení

Práh pro přihlášení je nastaven na deset a důvodem je měření: Z devíti neúspěšných přihlášení za sedmnáct dní pocházela většina od zákazníků, kteří si přístup sami nastavovali na dalším zařízení a přitom zadali špatnou doménu — v jednom případě vlastní, jen s pomlčkou místo tečky. Blokace při prvním neúspěšném pokusu by tak nezasáhla útočníky, ale zákazníky při nastavování.

Kdo naopak dál klepe, ačkoli server už odpověděl „prosím, chvíli počkejte“, je blokován okamžitě. Tuto zprávu si přečte člověk a počká; kdo ji ignoruje, je program. Vlastní vzor s prahem nula zachytí právě tento případ a nemůže zasáhnout žádného kolegu: Dostane se tam jen ten, kdo už má za sebou deset neúspěšných pokusů a poté pokračuje.

3. Útok už server nic nestojí

Sonda na cestu jako /@fs/../../.env byla před modulem drahá: Odoo hledá chybovou stránku, vykreslí ji, zakopne při sestavování adresy o segmenty s tečkami a selže potom i na chybové stránce chybové stránky. Dva výpisy zásobníku na každou sondu. Naměřeno bylo 28.401 takových chyb za sedmnáct dní a k tomu 9.467 následných chyb.

Web RBL zasahuje v ir.http._match, tedy před hledáním cesty. Odpověď vznikne bez šablony, bez přístupu k databázi nad rámec kontroly blokace a bez řádku v protokolu. Kontrola proti seznamu výjimek, seznamům hrozeb a pravidlům zemí běží z mezipaměti přes seřazené rozsahy adres — několik mikrosekund, i při více než třiceti tisících rozsahů.

4. Firewall vyhodí útočníka, dřív než dorazí

Blokovací seznam je publikován jako RBL seznam, který HAProxy a OPNsense čtou přímo. Útočník se tak k webovému serveru vůbec nedostane — a ani k žádné jiné službě na tomtéž hostiteli. Jednou rozpoznaný škodlivý přístup tak chrání zpětně celý stroj.

Tři úrovně: blokovat, počítat, hlásit

Ne každý požadavek naprázdno je útok. Web RBL proto rozlišuje tři úrovně a úroveň lze změnit pro každý vzor, aniž by se sáhlo na kód.

ÚroveňSpouštěcí požadavekNásledek pro adresu
blokovatje odmítnutblokována na 24 hodin, po třech nápadných dnech trvale
počítatprojdejen zaznamenán, žádná blokace
hlásitprojdezaznamenán s textem nálezu, nikdy není blokována

Pro seznamy hrozeb a země existuje čtvrtá: žádný přístup k přihlášení. Web zůstává čitelný, přihlašovací formulář a rozhraní jsou uzavřeny. To je střední cesta pro vše, co je podezřelé, ale nemusí být škodlivé — Tor, rozsah datového centra, země bez zákazníků.

Jaké útoky se rozpoznávají

Všechny vzory jsou ověřeny na skutečném provozu. Počet různých adres je záměrně uveden vedle — ukazuje, zda vzor zasahuje jednotlivý skener, nebo rozšířený postup.

Třída útokuPožadavkyAdresy
Odčerpání .env57.721223
Sondy PHP12.237256
Path traversal s lukrativním cílem10.04664
Konfigurační soubory5.535114
Přístupové klíče do cloudu4.388152
Sondy WordPress3.366385
Odčerpání .git2.811255
Průzkum Odoo (správce databází, dotaz na verzi)2.500213
Řetězce nástrojů AI a spouštění příkazů (/mcp, /api/fs/exec)2.45074
Sestavovací předpisy (CI/CD)1.90788
Koncové body GraphQL1.87871

Pozoruhodná je nejnovější třída. /api/fs/exec bylo vyžádáno 369krát z 54 různých adres — to není čtecí přístup, ale pokus o spuštění příkazů. Takové cíle před dvěma lety neexistovaly; pocházejí z rozhraní nových nástrojů AI a front úloh. Kdo svou obranu zaměří jen na WordPress a PHP, nic z toho nevidí. Ve skóre má tato třída odpovídající váhu.

Seznamy hrozeb a země původu

Seznamy hrozeb Web RBL: Tor, Spamhaus DROP, FireHOL, blocklist.de

Čtyři seznamy, 32.851 rozsahů adres, všechny nastaveny jen na „hlásit“. Každý další seznam je jedna adresa a jedna úroveň.

Cizí seznam je tvrzení, které sestavil někdo jiný z důvodů, které neznáme, o provozu, který jsme nikdy neviděli. Může být chybný, zastaralý nebo určený pro jiný účel: blocklist.de sbírá především adresy, které jinde zkoušely hesla k SSH, a to o webovém serveru říká málo. Proto Web RBL vede cizí seznamy oddělené od vlastního blokovacího seznamu a proto je výchozí nastavení hlásit. A vlastní seznam výjimek vždy vyhrává: Zákazník, kterého známe, váží víc než odhad třetí strany.

Země původu je uvedena u každého záznamu a každé adresy. Pro posuzování je nenahraditelná — pokus o přihlášení z vlastní země v deset dopoledne je něco jiného než pokus ze země, kde nemáme jediného zákazníka. K plošnému vyloučení se hodí málo, a říkají to naše vlastní čísla: Útočníci v našem seznamu pocházeli převážně z cloudových rozsahů v Belgii, Finsku a Nizozemsku. Blokace všeho mimo německy mluvící oblast by je nezasáhla — zato by zasáhla vlastní zaměstnance na dovolené a zákazníky na služební cestě.

Pravidla zemí ve Web RBL: dodávána prázdná, s vysvětlením

Pravidla zemí se dodávají prázdná a zobrazení říká, proč.

Chybné konfigurace hlásit, ne blokovat

Nejčastějším případem ve skutečném provozu není ani útok, ani návštěvník, ale vadný software, který považuje webový server za něco jiného:

  • 1.367 přístupů na webové rozhraní NAS od QNAP — synchronizační klient, jehož cíl už nesedí. Jediná přípojka klepala 962krát.
  • 65 dotazů Autodiscover — Outlook, který považuje webovou doménu za svůj Exchange

Takové adresy se nikdy neblokují. Blokace závadu neodstraní, jen ji skryje — a zasáhne toho, jehož zařízení je už tak špatně nastaveno. Místo toho vznikne záznam s textem nálezu a dotčenými doménami, z něhož se na přání automaticky stane tiket: na adresu právě jeden, a pokud je uzavřen a adresa se znovu objeví, otevře se tentýž tiket znovu, místo aby vznikl druhý.

Rozpoznány jsou QNAP, Synology, Exchange Autodiscover, ActiveSync a také klienti WebDAV, CalDAV a CardDAV. Vzory přitom uvádějí přesné názvy souborů a adresáře, nikdy pouhé přípony: V témže adresáři /cgi-bin/ leží neškodná synchronizační volání hned vedle klasických sond jako printenv.pl.

Seznam výjimek: adresy, které se nikdy neblokují

Cena omylu není u všech adres stejná. U skeneru z datového centra falešný poplach nestojí nic. U protistrany tunelu pobočky stojí celou pobočku.

Proto existuje druhý seznam, který stojí před prvním: Adresy a sítě, které se nikdy neblokují. Nic přitom neztlumí — kdo na něm je, je dál kontrolován a zaznamenáván, jen následek odpadá. To je rozdíl oproti výjimce ve firewallu: Ta oslepuje, tento seznam dělá jen trpělivým.

Plní se denně ze dvou zdrojů: z firewallu samotného s kompletními protistranami VPN, aby nově zřízený tunel nebyl odkázán na to, že někdo pomyslí na blokovací seznam — a z publikovaných rozsahů adres Googlu a Microsoftu pro jejich crawlery. Jen tak lze skutečného Googlebota odlišit od skeneru, který se tak nazývá. Vyhledávače se nikdy nesmějí blokovat; kdo je vyloučí, vyřadí svůj web z indexace bez cesty zpět.

Přitom platí pravidlo, které je důležitější než porovnání: Prázdná odpověď nikdy nic nemaže. Pokud zdroj neodpoví, odpoví prázdně nebo nesrozumitelně, seznam zůstane beze změny. Seznam výjimek, který se při poruše sám vyprázdní, v nejhorším myslitelném okamžiku vezme s sebou všechny tunely.

Pokud záznam seznamu výjimek nese zákazníka, je každý záznam z jeho sítě přiřazen jemu. Chybná konfigurace má tak okamžitě kontaktní osobu, aniž by někdo musel dohledávat adresy.

Povinné údaje a automatizovaní sběrači dat

Impresum není běžná stránka. Musí zůstat dostupné pro lidi, neboť jeho blokace vytváří právě ten přestupek, který sběrač hledá. Zároveň je to stránka, na které je jméno a adresa — a tím cíl strojové sklizně.

Při rakouské vlně upozornění na porušení kvůli vloženým písmům Google ukázaly protokoly, že dopisy nepocházely z jednotlivých návštěv, ale z automatizovaného plošného průchodu: různé, nesouvisející hostitele v rozestupech milisekund.

Web RBL to řeší snížením úrovně místo výjimky. Kanonická cesta /impressum nespadá pod žádný vzor a zůstává vždy dostupná. Cizí zápisy jako /impressum.php — které na stránce Odoo neexistují — jsou hlášeny, a kdo nechce strojovou sklizeň strpět, přepne jeden parametr. sitemap a robots jsou z toho vyňaty a principiálně neblokovatelné: Neobsahují žádný osobní údaj a jejich stahování je úkolem každého crawleru vyhledávačů.

Doména a identifikace: co v přístupovém protokolu chybí

Přístupový protokol werkzeug nezapisuje ani oslovený hostitel, ani identifikaci volajícího. Odoo obojí samozřejmě dostává — bez hostitele by u více webů nemohlo vybrat to správné. Dodatečně to ale zjistit nelze.

Web RBL uchovává obojí u každého záznamu. To odpovídá na dvě otázky, na které by se jinak odpovědět nedalo: který web chybná konfigurace oslovuje — a tím i kterému zákazníkovi doména patří — a zda adresa navštěvuje jednu stránku, nebo všechny. Více nesouvisejících domén téže adresy je znakem plošného průchodu a zvyšují skóre.

Jak velký význam identifikace má, ukázalo vyhodnocení na jednom z našich webů: Přes sedmdesát procent veškerého provozu připadalo tam na jediného volajícího, rozloženého přes více než stovku adres. Bez identifikace by to vypadalo jako rozptýlený scraper. Byl to GPTBot, crawler OpenAI — opakovaně se dotazoval na robots.txt a choval se naprosto správně.

Bezpečnostní aspekty podrobně

1. Rozpoznání proxy — vůbec nejnebezpečnější místo

Pokud Odoo běží za reverzním proxy a proxy_mode je nastaven chybně, vidí modul u každého požadavku tutéž adresu: adresu proxy. Blokace by pak zablokovala všechny návštěvníky najednou.

Proto Web RBL před každou blokací ověřuje, zda je určení adresy spolehlivé. Vyžaduje proxy_mode spolu s hlavičkou předávání, odmítne pracovat, pokud přijde předání bez proxy_mode, a odmítne ji stejně při více než jednom mezilehlém proxy. V případě pochybností se neblokuje.

2. Vlastní sítě nikdy

Privátní rozsahy adres, loopback, link-local a CGNAT jsou pevně vyňaty. Za žádných okolností se nemohou ocitnout na seznamu, ani ručně. Totéž platí pro cizí seznamy: Privátní a rezervované rozsahy i absurdně velké sítě se při načítání zahazují.

3. Vlastní chyba nesmí strhnout web s sebou

Celá kontrola běží v jištění, které zachytí každou chybu. Co se zde pokazí, se zaprotokoluje a požadavek pokračuje beze změny. Ochranný modul, který při vlastní chybě strhne web s sebou, je horší než žádný. Všechny dotazy v cestě požadavku navíc běží bez jazyka prohlížeče návštěvníka a bez řazení podle přeložených polí — návštěvník s nenainstalovaným jazykem nesmí kontrolu zmařit.

4. Pozorovat dřív, než se zablokuje

Po instalaci je blokování adres na seznamu u běžných požadavků vypnuto. Sondy jsou odmítány a zaznamenávány, vše ostatní projde. Tak lze několik dní sledovat, kdo skutečně na seznam přijde, než někdo bude vyloučen. Totéž platí pro rozpoznávání chování, seznamy hrozeb a pravidla zemí: nejdřív hlásit, blokovat až po zvážení.

5. Úzké vzory místo širokých sítí

Chybně rozpoznaný návštěvník je dražší než přehlédnutá sonda. Každý vzor proto nese svou úroveň a ta je pro každý vzor měnitelná. Samotná přípona souboru zřídka stačí: U .php stojí 14.012 skutečných sond proti hrstce starých odkazů, u .asp je poměr opačný. Taková rozhodnutí je třeba měřit, ne odhadovat.

6. Ruční povolení zůstává v platnosti

Kdo adresu povolí, měl k tomu důvod. Další záznam toto rozhodnutí potichu nepřebije.

7. Seznam je chráněn, ale není tajemstvím

Koncový bod vyžaduje token a bez platného tokenu odpoví kódem 404, nikoli 403 — existence adresy se tak vůbec nepotvrzuje. Porovnání probíhá v konstantním čase. Samotný seznam neobsahuje nic důvěrného: Skládá se z adres, které si k nám samy přišly zaklepat.

8. Žádná tajemství v evidenci

U neúspěšných přihlášení se zaznamená pokusné uživatelské jméno, nikdy heslo. U správce databází se z předaných hodnot nečte vůbec nic: Právě tam stojí na prvním místě hlavní heslo a záznam v blokovacím seznamu putuje do každé zálohy databáze. Licenční klíč pro GeoLite2 je uložen jen v systémovém parametru a v žádném řádku protokolu.

9. Návnada neprozradí nic využitelného

Volitelně Web RBL odpovídá na sondy vymyšleným obsahem, který obsahuje jednoznačnou kanárkovou hodnotu. Kdo tuto hodnotu později vyžádá, ten přečetl padělanou odpověď a podle ní jednal — falešný poplach je tu vyloučen. Návnady neobsahují žádné využitelné údaje, žádné skutečné cesty a žádné platné přístupové údaje. Tato funkce se dodává vypnutá, neboť navenek viditelně mění chování.

Co modul neumí

Nenahrazuje firewall ani Web Application Firewall. Rozpoznává známé sondovací vzory v cestách, neúspěšná přihlášení a nápadné chování — ne útoky na formuláře, ne pokusy o vložení škodlivého kódu do parametrů.

Vidí navíc jen to, co přijde zpět přes HTTP. Co útočník s ukradenými přístupy k databázi nebo poštovní schránce dělá, zůstává neviditelné — a právě proto jsou kanárkové hodnoty cesty a ne přístupové údaje.

A nenahrazuje pečlivost: Modul, který odmítá sondy .env, neučiní nebezpečným o nic méně omylem zveřejněný soubor .env.

Dostupnost

Web RBL je veřejně dostupný pod licencí AGPL-3 a u nás běží produkčně na pěti webech:

github.com/Alex0176/odoo-web-rbl

Modul vyžaduje Odoo 19 Community a nemá žádné závislosti kromě base a web. Napojení na tikety je volitelné a nevyžaduje žádný konkrétní systém tiketů; bez něj se prostě nic neděje. Země původu vyžaduje bezplatnou databázi GeoLite2 od MaxMind; pokud chybí, pole zůstane prázdné a vše ostatní pracuje beze změny.

Další čtení: Jak Web RBL zapadá do úplné bezpečnostní architektury -- spolu s firewallem, dvoufázovým ověřením a oprávněními, včetně návodu krok za krokem: Jak správně zkombinovat bezpečnostní architekturu Odoo 19.

Dotazy, připomínky a hlášení chyb rádi přijmeme — nejraději jako issue na GitHubu.