Skip to Content

Odoo 19 Community: Web RBL – blokavimo sąrašas atakų srautui savo svetainėse

2026 m. rugsėjo 24 d. pagal
Odoo 19 Community: Web RBL – blokavimo sąrašas atakų srautui savo svetainėse

Šaltinio kodas: github.com/Alex0176/odoo-web-rbl — AGPL-3, laisvai naudojamas.

Kas internete eksploatuoja Odoo serverį, sulaukia lankytojų. Ne kartais, o nuolat. Per septyniolika dienų savo penkiose svetainėse užfiksavome ir išanalizavome 731 297 užklausas. 110 511 iš jų nebuvo lankytojai, o automatizuota spragų, prisijungimo duomenų ir konfigūracijos failų paieška.

Šiame įraše aprašomas Web RBL – atvirojo kodo modulis Odoo 19 Community, kuris šį srautą aptinka, vertina, registruoja ir atmeta – ir kuris blokavimo sąrašą skelbia kaip RBL sąrašą, tai yra tokiu formatu, kurį užkardos ir atvirkštiniai tarpiniai serveriai skaito tiesiogiai. Visi skaičiai gauti realioje veikloje.

Ką modulis gali – funkcijų apžvalga

FunkcijaKą ji daroPateikimas
Šablonų atpažinimasAptinka zondavimus pagal kelią ir plėtinį: .env, .git, konfigūracijos failus, debesų raktus, CI/CD kūrimo instrukcijas, WordPress, PHP, kelio peržengimą (path traversal), duomenų bazių tvarkykles, GraphQL, komandų vykdymą per /api/fs/exec ir panašias sąsajasblokuoti
Trys lygiai kiekvienam šablonuiblokuoti, skaičiuoti arba pranešti – keičiama kiekvienam šablonui, be kodopagal šabloną
SlenksčiaiTiek to paties šablono atitikčių, kol užblokuojama; prisijungimams dešimt10 prisijungimui
Prisijungimo apsaugaNepavykę prisijungimai per formą ir XML-RPC/JSON-RPC, nepavykę sesijų patikrinimai, prieigos prie duomenų bazių tvarkyklės – duomenų bazėje, o ne operatyviojoje atmintyjeįjungta
Botų aptikimas prisijungimeKas ignoruoja laukimo pranešimą po dešimties nesėkmingų bandymų ir toliau belsia, užblokuojamas nedelsiantblokuoti
Elgsenos aptikimasAdresai, kurie per penkias minutes sukuria dvidešimt klaidingų puslapių ir vos vieną rastą puslapį – taigi spėlioja, o ne skaitopranešti
Vertinimas 0–100Kiek tikėtina, kad už adreso slypi užpuolikas? Pagal šablono sunkumą, skirtingų šablonų skaičių, įtartinas dienas, paveiktus domenus ir atitikčių skaičių – su paaiškinimu aiškiu tekstuįjungta
Prisijungimo blokada pagal vertinimąPasiekus nustatomą vertinimą prisijungti draudžiama, svetainė lieka skaitomanuo 40
Įtarimas dėl pavogtų prisijungimo duomenųSėkmingas prisijungimas iš įtartino adreso pranešamas ir, pageidaujant, priskiriamas kaip užduotis — vieną kartą per adresą ir dienąįjungta
Grėsmių sąrašaiIš anksto sukonfigūruoti Tor išėjimo mazgai, Spamhaus DROP, FireHOL Level 1, blocklist.de; bet kurį kitą RBL sąrašą galima įrašyti pagal adresą, kasdienis palyginimas, kiekvienam sąrašui sava pakopapranešti
Be prieigos prie prisijungimoKetvirtoji pakopa sąrašams ir šalims: svetainę galima skaityti, prisijungimo forma ir sąsajos uždarytos — tinkamas atsakas į TorPasirinktinai
Kilmės šalisŠalis pagal kiekvieną atvejį ir adresą per GeoLite2; modulis pats atnaujina duomenų bazę su nemokamu licencijos rakturodyti
Šalių taisyklėsBlokuoti, be prieigos prie prisijungimo, pranešti arba aiškiai leisti — pagal šalį, sąmoningai be numatytosios reikšmėsnėra
Klaidingos konfigūracijosQNAP, Synology, Exchange Autodiscover, ActiveSync, WebDAV/CalDAV/CardDAV atpažįstami, niekada neblokuojami ir su radiniu bei paveikta sritimi įtraukiami į darbo sąrašąpranešti
Užklausa pagal adresąIš radinio, pageidaujant, sukuriama užklausa — tik viena kiekvienam adresui, uždaryta užklausa atidaroma iš naujo, o ne dubliuojamaišjungta
Privalomi puslapiai ir rinkėjaiKanoninis rekvizitų (Impressum) kelias visada pasiekiamas; automatinis svetimų rašybos variantų išbandymas atpažįstamas ir, pageidaujant, blokuojamaspranešti
Baltasis sąrašasAdresai ir tinklai, kurie niekada neblokuojami; kasdien pildomas iš užkardos (VPN priešingų galų) ir iš paskelbtų Googlebot ir Bingbot adresų diapazonųįjungta
Priskyrimas klientuiAtvejis iš kliento tinklo priskiriamas jam — pagal baltąjį sąrašą, niekada neatspėjant rankiniu būduįjungta
Sritis ir identifikatorius pagal atvejįKuri svetainė buvo pasiekta ir su kokiu User-Agent — nė vieno iš jų nėra prieigos žurnaleįjungta
AnalizėDiagrama ir suvestinė pagal visus atvejus: pagal šabloną, dieną, sritį, šalį, adresąįjungta
JaukaZondai gauna išgalvotus atsakymus su canary reikšme; kas ją vėliau pasiekia, tas atsakymus perskaitėišjungta
RBL pateikimasBlokavimo sąrašas kaip paprastas adresų sąrašas arba JSON atskiru, žetonu apsaugotu adresu — skirtas HAProxy, OPNsense ir kiekvienai užkardai, kuri skaito URL sąrašusįjungta

Viskas, kas pristatoma su pranešti, išjungta arba pasirinktinai, yra sąmoninga: kas įjungia blokavimą, tegul tai daro todėl, kad kelias dienas stebėjo, kas į jį patenka — ne todėl, kad tokia buvo numatytoji reikšmė.

Web RBL analizė: atvejai pagal šabloną per septynias dienas

Analizė: atvejai pagal šabloną per septynias dienas. Aukščiausias stulpelis — .env failų paieška.

RBL sąrašai: standartizuotas būdas pateikti blokavimus

RBL reiškia Real-time Blackhole List. Terminas kilęs iš el. pašto pasaulio, kur Spamhaus ir kiti nuo dešimtojo dešimtmečio skelbia piktavališkų siuntėjų adresų sąrašus. Principas labai paprastas ir kaip tik todėl toks paplitęs: vienas adresas eilutėje, prieinamas per HTTP, reguliariai įkeliamas iš naujo. Nėra formato, kurį pirmiausia reikėtų analizuoti, nėra sąsajos, kuriai reikėtų įrankio.

Praktiškai kiekviena užkarda ir kiekvienas atvirkštinis tarpinis serveris gali nuskaityti tokį sąrašą ir iš jo sudaryti taisykles. Gamintojai tai vadina įvairiai, tačiau mechanizmas visur tas pats:

  • OPNsense ir pfSense — URL Table Alias: adresų sąrašas įkeliamas per HTTP, naudojamas kaip aliasas užkardos taisyklėse, atnaujinimas kas valandą arba kasdien
  • HAProxy — ACL failai ir Maps: src -f sperrliste.txt http-request deny taisyklėje, įkeliamas iš naujo per vykdymo API be perkrovimo
  • nginx — geo modulis su įtrauktu adresų failu arba deny nurodymai iš sugeneruoto include failo
  • Fortinet FortiGate — External Block List arba Threat Feed: URL, iš kurio užkarda gauna IP sąrašą ir naudoja jį politikose
  • Palo Alto Networks — External Dynamic List (EDL): tas pats principas, kaip atskiras objekto tipas saugumo politikose
  • Check Point — Custom Intelligence Feeds ir IP Block Lists per URL
  • Cisco Secure Firewall (Firepower) — Security Intelligence Feeds su nuosavais sąrašų šaltiniais
  • Sophos Firewall — Third-Party Threat Feeds: adresų sąrašai iš URL kaip blokavimo taisyklių šaltinis
  • Juniper SRX — Dynamic Address Entries iš šaltinių
  • MikroTik RouterOS — Address Lists, užpildomi skriptu ir fetch iš URL
  • CrowdSec — nuosavi sąrašai kaip šaltinis bouncer'iams kiekvienoje palaikomoje sistemoje

Būtent tokiu formatu Web RBL pateikia savo blokavimo sąrašą. Užkarda meta paketus dar prieš jiems pasiekiant žiniatinklio serverį — ir kartu su jais kiekvieną kitą to paties adreso bandymą, pavyzdžiui, prieiti prie pašto serverio ar VPN vartų.

Abi kryptys, bet tinkamoje vietoje

Šis kelias veikia ir atvirkščiai: į Web RBL galima įrašyti bet kurį RBL sąrašą — URL, viena pakopa, ir viskas. Tor išėjimo mazgai, Spamhaus DROP, FireHOL ir blocklist.de jau sukonfigūruoti, kitus galima pridėti trimis paspaudimais. Modulis išskaido kiekvieną sąrašą į adresų diapazonus ir tikrina kiekvieną užklausą pagal juos per kelias mikrosekundes.

Ir vis dėlto: prasmingiau svetimus sąrašus naudoti užkardoje prieš tai. Dėl trijų priežasčių. Užkarda mato visas paslaugas, ne tik HTTP — adresas iš Spamhaus sąrašo turi būti sustabdytas ir prie pašto serverio, ir prie VPN. Ji meta paketus paketų lygmeniu, dar prieš užmezgant ryšį, ir taip programos serveriui nieko nekainuoja. Ir ji yra vieta, kurioje tokie sąrašai šiaip ar taip prižiūrimi; antra kopija programoje yra antra vieta, kuri gali pasenti.

Kam tuomet dar tinka sąrašai modulyje: tam, ko užkarda nemoka. Ji nepažįsta prisijungimo formos. Web RBL gali adresui iš Tor sąrašo uždrausti prieigą prie prisijungimo, bet vis tiek pateikti svetainę — kas nori skaityti anonimiškai, tam leidžiama; kas nori anonimiškai išbandyti slaptažodžius, tam ne. Ir jis gali pranešti apie sėkmingą prisijungimą iš įtraukto į sąrašą adreso kaip apie įtartiną atvejį. Abiem atvejais sąrašas reikalingas ten, kur vyksta prisijungimas.

Vertinimas vietoj nuojautos

Adresas, kuris kartą paklausė /wp-login.php, yra kažkas kita nei tas, kuris per dvi dienas su penkiais skirtingais šablonais perėjo per tris sritis. Web RBL tai paverčia vertinimu nuo 0 iki 100 — iš to, ką pats matė, be trečiųjų šalių paslaugų ir be užklausų į išorę.

Web RBL įrašas su vertinimu 84 ir pagrindimu

Vienas įrašas: 99 atvejai, vertinimas 84 ir pagrindimas aiškiu tekstu — sunkiausias šablonas, penki skirtingi rimti šablonai, dvi įtartinos dienos, daugiau nei dvidešimt atvejų.

Vertinimas lemia du dalykus. Nuo nustatomos reikšmės prisijungimas draudžiamas — svetainę galima skaityti, bet kas jau ieškojo prisijungimo duomenų, negauna galimybės išbandyti rastų. O sėkmingas prisijungimas iš adreso su vertinimu pranešamas: tada kažkas nebespėliojo, o žinojo. Arba teisėtas naudotojas buvo išvykęs, arba prisijungimo duomenys pateko į svetimas rankas — modulis to nenusprendžia, jis tai pateikia kam nors, kas gali pasiteirauti. Pats slaptažodis tuo metu niekur neliečiamas.

Web RBL blokavimo sąrašas, filtruotas pagal vertinimą nuo 40

Blokavimo sąrašas, filtruotas pagal vertinimą nuo 40: atvejų skaičius, įtartinos dienos, paveiktos sritys ir paskutinis kelias pagal adresą.

Ką saugo Web RBL — apsaugos poveikis išsamiai

1. Prisijungimo duomenys lieka neatrasti

Didžiausia išmatuota atakų klasė ieško ne spragų Odoo, o pamirštų paslapčių. Per septyniolika dienų:

  • 57.721 užklausų dėl .env failų — juose yra duomenų bazės slaptažodžiai, API raktai ir sesijų paslaptys
  • 5.535 užklausos dėl konfigūracijos failų
  • 4.388 užklausos dėl debesijos prisijungimo duomenų: credentials.json, service-account.json, firebase-adminsdk.json, rclone.conf, .git-credentials
  • 2.811 užklausos dėl .git katalogų — kas jį randa, atsisiunčia visą šaltinio kodą su istorija
  • 1.907 užklausos dėl kūrimo instrukcijų, pvz., .github/workflows/deploy.yml arba .gitlab-ci.yml, kuriuose nurodyti registrai ir raktų pavadinimai

Lemiamas veiksnys yra ne užklausų skaičius, o skirtingų adresų skaičius: /credentials.json atėjo iš 98 adresų, /.git-credentials — iš 92. Tai nėra vienas skeneris, o standartinis repertuaras, kuris visame pasaulyje veikia vienu metu.

2. Bandymai prisijungti nueina niekur — visam laikui

Odoo turi savo stabdį nuo slaptažodžių spėliojimo. Jis turi tris ribas, kurios aprašytos paties Odoo šaltinio kode: skaitiklis yra darbo proceso operatyviojoje atmintyje ir kiekvieną kartą perkrovus nustatomas iš naujo, jis tik sulėtina, o ne blokuoja, ir skaičiuoja tik bandymus, kurie pasiekia slaptažodžio patikrą.

Web RBL pasitelkiamas tose pačiose vietose, bet rašo į duomenų bazę. Taigi:

  • Būsena išlieka po kiekvieno perkrovimo ir galioja visiems darbo procesams
  • Fiksuojami abu keliai: prisijungimo forma /web/login ir sąsajos /xmlrpc/2/common bei /jsonrpc
  • Fiksuojami ir bandymai, kurie niekada nepasiekia slaptažodžio patikros — pavyzdžiui, prisijungimai be galiojančio sesijos požymio
  • Nepavykusi prieiga prie duomenų bazių valdytojo įskaitoma; tai yra pats sunkiausias prisijungimo bandymas

Prisijungimų riba nustatyta ties dešimt, ir priežastis yra matavimas: iš devynių nepavykusių prisijungimų per septyniolika dienų dauguma buvo klientų, kurie patys nustatinėjo prieigą kitame įrenginyje ir įvedė neteisingą sritį — vienu atveju savo pačių, tik su brūkšneliu vietoj taško. Blokavimas po pirmo nesėkmingo bandymo būtų ištikęs ne užpuolikus, o klientus jų nustatymo metu.

Kas, priešingai, toliau beldžiasi, nors serveris jau atsakė „prašome truputį palaukti“, tas blokuojamas nedelsiant. Šį pranešimą skaito žmogus ir laukia; kas jį ignoruoja, yra programa. Atskiras šablonas su riba nulis sulaiko būtent šį atvejį ir negali paliesti kolegos: ten patenka tik tas, kas jau turi dešimt nesėkmingų bandymų ir po to tęsia.

3. Ataka serveriui nebekainuoja nieko

Zondas į kelią kaip /@fs/../../.env prieš modulį buvo brangus: Odoo ieško klaidos puslapio, jį sugeneruoja, užkliūva kurdamas adresą už taškų segmentų ir po to žlunga ir ties klaidos puslapio klaidos puslapiu. Du steko žurnalai kiekvienam zondui. Išmatuota 28.401 tokių klaidų per septyniolika dienų, dar 9.467 pasekminių klaidų.

Web RBL įsiterpia į ir.http._match, taigi prieš maršruto paiešką. Atsakas pateikiamas be šablono, be duomenų bazės prieigos, išskyrus blokavimo patikrą, ir be žurnalo eilutės. Patikra pagal baltąjį sąrašą, grėsmių sąrašus ir šalių taisykles vyksta iš spartinančiosios atminties per surikiuotus adresų diapazonus — kelios mikrosekundės, net su daugiau nei trisdešimt tūkstančių diapazonų.

4. Užkarda išmeta užpuoliką, kol jis dar neatvykęs

Blokavimo sąrašas skelbiamas kaip RBL sąrašas, kurį HAProxy ir OPNsense skaito tiesiogiai. Užpuolikas taip visai nebepasiekia žiniatinklio serverio — ir jokios kitos paslaugos to paties kompiuterio. Kartą kaip piktavališka atpažinta prieiga taip saugo visą mašiną atgaline data.

Trys pakopos: blokuoti, skaičiuoti, pranešti

Ne kiekviena užklausa į tuštumą yra ataka. Todėl Web RBL skiria tris pakopas, o pakopą galima perjungti pagal šabloną, neliečiant kodo.

PakopaSukėlusi užklausaPasekmė adresui
blokuotiatmetamablokuojama 24 valandoms, po trijų įtartinų dienų — visam laikui
skaičiuotipraleidžiamatik užfiksuojama, be blokavimo
praneštipraleidžiamaužfiksuojama su radinio tekstu, niekada neblokuojama

Grėsmių sąrašams ir šalims yra ketvirta: be prieigos prie prisijungimo. Svetainę galima skaityti, prisijungimo forma ir sąsajos uždarytos. Tai vidurio kelias visam, kas yra įtartina, bet nebūtinai piktavališka — Tor, duomenų centro diapazonas, šalis be klientų.

Kokios atakos atpažįstamos

Visi šablonai patikrinti su tikru srautu. Skirtingų adresų skaičius sąmoningai pateiktas šalia — jis rodo, ar šablonas pagauna vieną skenerį, ar plačiai paplitusį veikimo būdą.

Atakos klasėUžklausosAdresai
.env nuskaitymas57.721223
PHP zondai12.237256
Kelio perėjimas (path traversal) su vertingu tikslu10.04664
Konfigūracijos failai5.535114
Debesijos prieigos raktai4.388152
WordPress zondai3.366385
.git nuskaitymas2.811255
Odoo žvalgyba (duomenų bazių valdytojas, versijos užklausa)2.500213
DI įrankių grandinės ir komandų vykdymas (/mcp, /api/fs/exec)2.45074
Kūrimo instrukcijos (CI/CD)1.90788
GraphQL galiniai taškai1.87871

Pastebėtina naujausia klasė. /api/fs/exec buvo užklausta 369 kartus iš 54 skirtingų adresų — tai nėra skaitymo prieiga, o bandymas vykdyti komandas. Tokių tikslų prieš dvejus metus nebuvo; jie kilo iš naujų DI įrankių sąsajų ir užduočių eilių. Kas savo gynybą orientuoja tik į WordPress ir PHP, to nė nemato. Vertinime ši klasė atitinkamai daug sveria.

Grėsmių sąrašai ir kilmės šalis

Web RBL grėsmių sąrašai: Tor, Spamhaus DROP, FireHOL, blocklist.de

Keturi sąrašai, 32.851 adresų diapazonas, visi nustatyti tik „pranešti“. Kiekvienas kitas sąrašas yra adresas ir pakopa.

Svetimas sąrašas yra teiginys, kurį pateikia kas nors kitas, dėl mums nežinomų priežasčių, apie srautą, kurio mes niekada nematėme. Jis gali būti klaidingas, pasenęs arba skirtas kitam tikslui: blocklist.de daugiausia renka adresus, kurie kitur bandė spėlioti SSH prisijungimus, o tai žiniatinklio serveriui sako nedaug. Todėl Web RBL svetimus sąrašus laiko atskirai nuo savo blokavimo sąrašo, ir todėl numatytoji reikšmė yra pranešti. O savasis baltasis sąrašas visada laimi: klientas, kurį pažįstame, sveria daugiau nei trečiosios šalies vertinimas.

Kilmės šalis nurodyta prie kiekvieno atvejo ir adreso. Vertinant ji nepakeičiama — bandymas prisijungti iš savo šalies dešimtą valandą ryto yra kažkas kita nei bandymas iš šalies, kurioje neturime nė vieno kliento. Visuotiniam blokavimui ji mažai tinka, ir tai rodo pačių skaičiai: užpuolikai mūsų sąraše daugiausia ėjo iš debesijos diapazonų Belgijoje, Suomijoje ir Nyderlanduose. Blokavimas visiems už vokiškai kalbančio regiono ribų jų nebūtų palietęs — bet būtų palietęs pačių darbuotojus atostogose ir klientus komandiruotėse.

Web RBL šalių taisyklės: pateikiamos tuščios, su paaiškinimu

Šalių taisyklės pateikiamos tuščios, o vaizdas pasako, kodėl.

Klaidingas konfigūracijas pranešti, o ne blokuoti

Dažniausias atvejis realiame sraute yra nei ataka, nei lankytojas, o sugedusi programinė įranga, kuri žiniatinklio serverį palaiko kažkuo kitu:

  • 1.367 QNAP NAS žiniatinklio sąsajos iškvietimų — sinchronizavimo klientas, kurio paskirtis nebesutampa. Vienas vienintelis prievadas beldėsi 962 kartus.
  • 65 Autodiscover užklausos — Outlook, kuris interneto sritį palaiko savo Exchange

Tokie adresai niekada neblokuojami. Blokavimas gedimo nepašalina, jis jį paslepia — ir paliečia tą, kurio įrenginys jau ir taip neteisingai nustatytas. Vietoj to sukuriamas įrašas su radinio tekstu ir paveiktomis sritimis, iš kurio, pageidaujant, automatiškai tampa užklausa: kiekvienam adresui lygiai viena, o jei ji uždaroma ir adresas vėl pasirodo, ta pati užklausa atsidaro iš naujo, o ne sukuriama antra.

Atpažįstami QNAP, Synology, Exchange Autodiscover, ActiveSync bei WebDAV, CalDAV ir CardDAV klientai. Šablonuose nurodomi tikslūs failų pavadinimai ir katalogai, niekada ne tik plėtiniai: Tame pačiame kataloge /cgi-bin/ nekenksmingi sinchronizavimo iškvietimai guli greta klasikinių zondų, tokių kaip printenv.pl.

Baltasis sąrašas: adresai, kurie niekada neblokuojami

Klaidos kaina nėra vienoda visiems adresams. Skeneriui iš duomenų centro klaidingas aliarmas nieko nekainuoja. Su vietovės tunelio kita puse jis kainuoja pačią vietovę.

Todėl yra antras sąrašas, stovintis prieš pirmąjį: adresai ir tinklai, kurie niekada neblokuojami. Jis nieko nenutildo — kas jame yra, vis tiek tikrinamas ir fiksuojamas, tik pasekmė atkrinta. Tuo jis skiriasi nuo išimties užkardoje: ta apakina, šis tik padaro kantresnį.

Jis pildomas kasdien iš dviejų šaltinių: iš pačios užkardos su visomis VPN priešingomis pusėmis, kad naujai sukonfigūruotas tunelis nebūtų priklausomas nuo to, ar kas nors prisimins blokavimo sąrašą — ir iš paskelbtų Google ir Microsoft adresų diapazonų jų tikrintuvams (crawler). Tik taip tikrą Googlebot galima atskirti nuo skenerio, kuris taip vadinasi. Paieškos sistemų niekada negalima blokuoti; kas jas užblokuoja, tas savo svetainę be kelio atgal išima iš indeksavimo.

Čia galioja taisyklė, svarbesnė už patį palyginimą: Tuščias atsakas niekada netrina. Jei šaltinis neatsako, atsako tuščiai arba nesuprantamai, sąrašas lieka nepakeistas. Baltasis sąrašas, kuris sutrikus pats save ištuština, blogiausiu įmanomu momentu nusineša visus tunelius.

Jei baltojo sąrašo įrašas turi klientą, kiekvienas atvejis iš jo tinklo jam priskiriamas. Klaidinga konfigūracija taip iš karto turi kontaktinį asmenį, be to, kad kam nors reikėtų ieškoti adresų sąraše.

Privalomi duomenys ir automatizuoti duomenų rinkėjai

Rekvizitų puslapis (Impressum) nėra paprastas puslapis. Jis turi likti prieinamas žmonėms, nes jo blokavimas sukuria būtent tą pažeidimą, kurio ieško rinkėjas. Kartu tai puslapis, kuriame yra vardas ir adresas — taigi mašininio derliaus rinkimo tikslas.

Austrijos pretenzijų bangos dėl įterptų „Google“ šriftų metu žurnalai parodė, kad laiškai nekilo iš pavienių apsilankymų, o iš automatizuoto visuotinio smūgio: skirtingi, tarpusavyje nesusiję serveriai milisekundžių intervalais.

Web RBL tai sprendžia sumažindamas pakopą, o ne darydamas išimtį. kanoninis kelias /impressum neatitinka jokio šablono ir visada lieka pasiekiamas. Svetimi rašybos variantai, pvz., /impressum.php — kurių Odoo puslapyje negali būti — pranešami, o kas nenori sutikti su mašininiu derliaus rinkimu, perjungia vieną parametrą. sitemap ir robots išimti ir iš principo neblokuojami: juose nėra asmens duomenų, o juos paimti yra kiekvieno paieškos sistemos tikrintuvo užduotis.

Sritis ir identifikatorius: ko trūksta prieigos žurnale

werkzeug prieigos žurnalas nerašo nei pasiekto serverio (host), nei kreipėjo identifikatoriaus. Odoo gauna abu, savaime suprantama — be host jis kelių svetainių atveju išvis negalėtų pasirinkti tinkamos. Tačiau vėliau to nebegalima perskaityti.

Web RBL užfiksuoja abu duomenis pagal atvejį. Tai atsako į du klausimus, kuriems kitaip atsakyti neįmanoma: kuri svetainė kreipiasi per klaidingą konfigūraciją — ir taip, kuriam klientui priklauso sritis — ir ar adresas lanko vieną puslapį, ar visus. Keli tarpusavyje nesusiję to paties adreso domenai yra visuotinio smūgio požymis, ir jie didina vertinimą.

Kiek identifikatorius reiškia, parodė vienos iš mūsų svetainių analizė: daugiau nei septyniasdešimt procentų viso srauto ten teko vienam kreipėjui, paskirstytam per daugiau nei šimtą adresų. Be identifikatoriaus tai būtų atrodę kaip paskirstytas skreperis. Tai buvo GPTBot, OpenAI tikrintuvas — jis nuolat klausė robots.txt ir elgėsi visiškai korektiškai.

Saugumo aspektai išsamiai

1. Proxy atpažinimas — pati pavojingiausia vieta

Jei Odoo veikia už atvirkštinio tarpinio serverio ir proxy_mode nustatytas neteisingai, modulis kiekvienoje užklausoje mato tą patį adresą: tarpinio serverio. Tuomet blokavimas užblokuotų visus lankytojus vienu metu.

Todėl Web RBL prieš kiekvieną blokavimą tikrina, ar adreso nustatymas patikimas. Jis reikalauja proxy_mode kartu su peradresavimo antraštės eilute, atsisako dirbti, jei peradresavimas ateina be proxy_mode, ir atsisako lygiai taip pat esant daugiau nei vienam tarpiniam serveriui. Kilus abejonei, neblokuojama.

2. Savų tinklų niekada

Privatūs adresų diapazonai, loopback, link-local ir CGNAT yra nuolat išimti. Jie jokiomis aplinkybėmis negali patekti į sąrašą, net ir rankiniu būdu. Tas pats galioja svetimiems sąrašams: privatūs ir rezervuoti diapazonai bei absurdiškai dideli tinklai įkeliant atmetami.

3. Paties klaida negali nusinešti svetainės

Visa patikra vykdoma apsaugoje, kuri sulaiko kiekvieną klaidą. Tai, kas čia nepavyksta, užprotokoluojama, o užklausa tęsiama nepakeista. Apsaugos modulis, kuris dėl savo paties klaidos nusineša svetainę, yra blogesnis nei jokio. Visos duomenų bazės užklausos užklausos apdorojimo kelyje be to vykdomos be lankytojo naršyklės kalbos ir be rikiavimo pagal išverstus laukus — lankytojas su neįdiegta kalba neturi sužlugdyti patikros.

4. Stebėti prieš blokuojant

Po įdiegimo įtrauktų į sąrašą adresų blokavimas esant įprastoms užklausoms yra išjungtas. Zondai atmetami ir fiksuojami, viskas kita praleidžiama. Taip kelias dienas galima stebėti, kas iš tikrųjų patenka į sąrašą, kol dar niekas neužblokuotas. Tas pats galioja elgsenos atpažinimui, grėsmių sąrašams ir šalių taisyklėms: pirma pranešti, blokuoti po įvertinimo.

5. Siauri šablonai vietoj plačių tinklų

Klaidingai atpažintas lankytojas kainuoja daugiau nei praleistas zondas. Kiekvienas šablonas todėl turi savo pakopą, kurią galima perjungti pagal šabloną. Vien failo plėtinio retai pakanka: ties .php 14.012 tikrų zondų stoja prieš saują senų nuorodų, ties .asp santykis atvirkščias. Tokie sprendimai turi būti matuojami, o ne spėjami.

6. Rankinis atleidimas išlieka

Kas adresą atleido, turėjo priežastį. Kitas atvejis neatšaukia šio sprendimo tyliai.

7. Sąrašas apsaugotas, bet ne paslaptis

Galinis taškas reikalauja žetono ir be galiojančio žetono atsako 404, o ne 403 — taip adreso buvimas net nepatvirtinamas. Palyginimas vyksta pastoviu laiku (constant-time). Pats sąrašas neturi nieko konfidencialaus: jį sudaro adresai, kurie patys pasibeldė pas mus.

8. Jokių paslapčių apskaitoje

Nepavykus prisijungimui užfiksuojamas bandytas naudotojo vardas, niekada slaptažodis. Prie duomenų bazių valdytojo iš perduotų reikšmių iš viso nieko neskaitoma: ten pačiame priekyje yra pagrindinis slaptažodis, o įrašas blokavimo sąraše keliauja į kiekvieną duomenų bazės atsarginę kopiją. GeoLite2 licencijos raktas yra tik sistemos parametre ir jokioje žurnalo eilutėje.

9. Jauka neišduoda nieko panaudojamo

Pasirinktinai Web RBL atsako į zondus išgalvotu turiniu, kuriame yra unikali canary reikšmė. Kas šią reikšmę vėliau pasiekia, perskaitė suklastotą atsakymą ir pagal jį veikė — klaidingas aliarmas čia neįmanomas. Jaukose nėra panaudojamų duomenų, tikrų kelių ar galiojančių prisijungimo duomenų. Ši funkcija pateikiama išjungta, nes ji keičia išoriškai matomą elgesį.

Ko modulis negali

Jis nepakeičia nei užkardos, nei žiniatinklio programų užkardos (Web Application Firewall). Jis atpažįsta žinomus žvalgymo šablonus keliuose, nepavykusius prisijungimus ir įtartiną elgseną — ne atakas prieš formas, ne bandymus įterpti kodą į parametrus.

Jis taip pat mato tik tai, kas grįžta per HTTP. Ką užpuolikas su pagrobtais duomenų bazės ar pašto dėžutės prieigos duomenimis daro, lieka nematoma — ir kaip tik todėl canary reikšmės yra keliai, o ne prisijungimo duomenys.

Ir jis nepakeičia kruopštumo: modulis, kuris atmeta .env zondus, neapsaugo nuo atsitiktinai pateikto .env failo.

Prieinamumas

Web RBL viešai prieinamas pagal AGPL-3 ir mūsų aplinkoje produkciškai veikia penkiose svetainėse:

github.com/Alex0176/odoo-web-rbl

Modulis reikalauja Odoo 19 Community ir neturi priklausomybių, išskyrus base ir web. Užklausų sistemos integracija neprivaloma ir nereikalauja jokios konkrečios užklausų sistemos; be jos tiesiog nieko neįvyksta. Kilmės šaliai reikia nemokamos MaxMind GeoLite2 duomenų bazės; kai jos nėra, laukas lieka tuščias, o viskas kita veikia nepakitusi.

Toliau: kaip Web RBL telpa į visapusę saugumo architektūrą -- kartu su užkarda, dviejų veiksnių autentifikavimu ir leidimais, su žingsnis po žingsnio instrukcija: Kaip tinkamai derinti Odoo 19 saugumo architektūrą.

Klausimus, pastabas ir klaidų ataskaitas mielai priimame — mieliausia kaip Issue GitHub.