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í
| Funkce | Co 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 vzor | blokovat, počítat nebo hlásit — přepínatelné u každého vzoru, bez kódu | podle vzoru |
| Prahy | Tolik zásahů téhož vzoru, než dojde k zablokování; u přihlášení deset | 10 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ěti | zapnuto |
| 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án | blokovat |
| 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–100 | Jak 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 textu | zapnuto |
| 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 den | zapnuto |
| Seznamy hrozeb | Vý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 Tor | Volba |
| Země původu | Země 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íče | zobrazit |
| 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é konfigurace | QNAP, 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 seznamu | hlásit |
| Tiket na adresu | Z 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če | Kanonická cesta k impresu zůstává vždy dostupná; strojové zkoušení cizích zápisů je rozpoznáno a na přání blokováno | hlásit |
| Seznam výjimek | Adresy a sítě, které se nikdy neblokují; denně se plní z firewallu (protistrany VPN) a z publikovaných rozsahů adres Googlebotu a Bingbotu | zapnuto |
| Přiřazení zákazníkovi | Záznam ze sítě zákazníka je přiřazen jemu — ze seznamu výjimek, nikdy odhadem od ruky | zapnuto |
| Doména a identifikace u každého záznamu | Jaký 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ě, adresy | zapnuto |
| Návnada | Sondy dostávají vymyšlené odpovědi s kanárkovou hodnotou; kdo si ji později vyžádá, ty odpovědi přečetl | vyp. |
| Poskytování RBL | Blokovací seznam jako čistý seznam adres nebo JSON na vlastní adrese chráněné tokenem — pro HAProxy, OPNsense a každý firewall, který čte seznamy URL | zapnuto |
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í: 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.txtv pravidlehttp-request deny, lze znovu načíst přes runtime API bez restartu - nginx — modul geo s vloženým souborem adres, nebo příkazy
denyz vygenerovaného souboruinclude - 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
fetchz 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.
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 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.ymlnebo.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/logina rozhraní/xmlrpc/2/commona/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žadavek | Následek pro adresu |
|---|---|---|
| blokovat | je odmítnut | blokována na 24 hodin, po třech nápadných dnech trvale |
| počítat | projde | jen zaznamenán, žádná blokace |
| hlásit | projde | zaznamená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 útoku | Požadavky | Adresy |
|---|---|---|
Odčerpání .env | 57.721 | 223 |
| Sondy PHP | 12.237 | 256 |
| Path traversal s lukrativním cílem | 10.046 | 64 |
| Konfigurační soubory | 5.535 | 114 |
| Přístupové klíče do cloudu | 4.388 | 152 |
| Sondy WordPress | 3.366 | 385 |
Odčerpání .git | 2.811 | 255 |
| Průzkum Odoo (správce databází, dotaz na verzi) | 2.500 | 213 |
Řetězce nástrojů AI a spouštění příkazů (/mcp, /api/fs/exec) | 2.450 | 74 |
| Sestavovací předpisy (CI/CD) | 1.907 | 88 |
| Koncové body GraphQL | 1.878 | 71 |
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
Č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í 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.