Š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
| Funkcija | Ką ji daro | Pateikimas |
|---|---|---|
| Šablonų atpažinimas | Aptinka 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ąsajas | blokuoti |
| Trys lygiai kiekvienam šablonui | blokuoti, skaičiuoti arba pranešti – keičiama kiekvienam šablonui, be kodo | pagal šabloną |
| Slenksčiai | Tiek to paties šablono atitikčių, kol užblokuojama; prisijungimams dešimt | 10 prisijungimui |
| Prisijungimo apsauga | Nepavykę 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 prisijungime | Kas ignoruoja laukimo pranešimą po dešimties nesėkmingų bandymų ir toliau belsia, užblokuojamas nedelsiant | blokuoti |
| Elgsenos aptikimas | Adresai, kurie per penkias minutes sukuria dvidešimt klaidingų puslapių ir vos vieną rastą puslapį – taigi spėlioja, o ne skaito | pranešti |
| Vertinimas 0–100 | Kiek 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 skaitoma | nuo 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šai | Iš 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 pakopa | pranešti |
| Be prieigos prie prisijungimo | Ketvirtoji pakopa sąrašams ir šalims: svetainę galima skaityti, prisijungimo forma ir sąsajos uždarytos — tinkamas atsakas į Tor | Pasirinktinai |
| Kilmės šalis | Šalis pagal kiekvieną atvejį ir adresą per GeoLite2; modulis pats atnaujina duomenų bazę su nemokamu licencijos raktu | rodyti |
| Šalių taisyklės | Blokuoti, be prieigos prie prisijungimo, pranešti arba aiškiai leisti — pagal šalį, sąmoningai be numatytosios reikšmės | nėra |
| Klaidingos konfigūracijos | QNAP, 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 dubliuojama | išjungta |
| Privalomi puslapiai ir rinkėjai | Kanoninis rekvizitų (Impressum) kelias visada pasiekiamas; automatinis svetimų rašybos variantų išbandymas atpažįstamas ir, pageidaujant, blokuojamas | pranešti |
| Baltasis sąrašas | Adresai ir tinklai, kurie niekada neblokuojami; kasdien pildomas iš užkardos (VPN priešingų galų) ir iš paskelbtų Googlebot ir Bingbot adresų diapazonų | įjungta |
| Priskyrimas klientui | Atvejis 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 |
| Jauka | Zondai gauna išgalvotus atsakymus su canary reikšme; kas ją vėliau pasiekia, tas atsakymus perskaitė | išjungta |
| RBL pateikimas | Blokavimo 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ė.
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.txthttp-request denytaisyklėje, įkeliamas iš naujo per vykdymo API be perkrovimo - nginx — geo modulis su įtrauktu adresų failu arba
denynurodymai iš sugeneruotoincludefailo - 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
fetchiš 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ę.
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.
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
.envfailų — 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
.gitkatalogų — kas jį randa, atsisiunčia visą šaltinio kodą su istorija - 1.907 užklausos dėl kūrimo instrukcijų, pvz.,
.github/workflows/deploy.ymlarba.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/loginir sąsajos/xmlrpc/2/commonbei/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.
| Pakopa | Sukėlusi užklausa | Pasekmė adresui |
|---|---|---|
| blokuoti | atmetama | blokuojama 24 valandoms, po trijų įtartinų dienų — visam laikui |
| skaičiuoti | praleidžiama | tik užfiksuojama, be blokavimo |
| pranešti | praleidžiama | už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žklausos | Adresai |
|---|---|---|
.env nuskaitymas | 57.721 | 223 |
| PHP zondai | 12.237 | 256 |
| Kelio perėjimas (path traversal) su vertingu tikslu | 10.046 | 64 |
| Konfigūracijos failai | 5.535 | 114 |
| Debesijos prieigos raktai | 4.388 | 152 |
| WordPress zondai | 3.366 | 385 |
.git nuskaitymas | 2.811 | 255 |
| Odoo žvalgyba (duomenų bazių valdytojas, versijos užklausa) | 2.500 | 213 |
DI įrankių grandinės ir komandų vykdymas (/mcp, /api/fs/exec) | 2.450 | 74 |
| Kūrimo instrukcijos (CI/CD) | 1.907 | 88 |
| GraphQL galiniai taškai | 1.878 | 71 |
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
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.
Š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.