Preskoči na sadržaj

Odoo 19 Community: Web RBL – lista za blokiranje napadačkog saobraćaja na vlastitim web-stranicama

24. septembar 2026. by
Odoo 19 Community: Web RBL – lista za blokiranje napadačkog saobraćaja na vlastitim web-stranicama

Izvorni kod: github.com/Alex0176/odoo-web-rbl — AGPL-3, slobodno za korištenje.

Ko god održava Odoo server na internetu, ima posjetioce. Ne povremeno, nego neprestano. Tokom sedamnaest dana na naših pet web-stranica zabilježili smo i analizirali 731.297 zahtjeva. Njih 110.511 nisu poslali posjetioci, nego automatizirani alati u potrazi za ranjivostima, pristupnim podacima i konfiguracijskim datotekama.

Ovaj članak predstavlja Web RBL, modul otvorenog koda za Odoo 19 Community koji prepoznaje, procjenjuje, evidentira i odbija takav saobraćaj — te objavljuje listu blokiranih adresa kao RBL listu, u formatu koji zaštitni zidovi i obrnuti proxy serveri mogu direktno čitati. Svi podaci potječu iz stvarnog rada sistema.

Šta modul može — pregled funkcija

FunkcijaŠta radiPočetna postavka
Prepoznavanje obrazacaPrepoznaje pokušaje ispitivanja prema putanji i ekstenziji: .env, .git, konfiguracijske datoteke, ključeve za oblak, CI/CD upute za izgradnju, WordPress, PHP, prolazak kroz direktorije, alate za upravljanje bazama podataka, GraphQL, izvršavanje naredbi putem /api/fs/exec i sličnih interfejsablokirati
Tri nivoa za svaki obrazacblokirati, brojati ili prijaviti — podesivo za svaki obrazac, bez izmjene kodapo obrascu
PragoviBroj podudaranja s istim obrascem prije blokiranja; za prijave deset10 za prijavu
Zaštita prijaveNeuspjele prijave putem obrasca i XML-RPC/JSON-RPC interfejsa, neuspjele provjere sesije, pristupi alatu za upravljanje bazama podataka — u bazi podataka, a ne u radnoj memorijiuključeno
Prepoznavanje botova pri prijaviKo nakon deset neuspjelih pokušaja zanemari poruku da treba sačekati i nastavi pokušavati, odmah se blokirablokirati
Prepoznavanje ponašanjaAdrese s kojih zahtjevi u pet minuta izazovu dvadeset stranica s greškom i gotovo nijedan uspješan odgovor — što ukazuje na pogađanje umjesto čitanjaprijaviti
Ocjena 0–100Koliko je sigurno da iza adrese stoji napadač? Procjena na osnovu ozbiljnosti obrasca, broja različitih obrazaca, dana sa sumnjivom aktivnošću, pogođenih domena i broja podudaranja — uz jasno obrazloženjeuključeno
Blokiranje prijave prema ocjeniOd podesive ocjene naviše prijava je zabranjena, dok web-stranica ostaje dostupna za čitanjeod 40
Sumnja na ukradene pristupne podatkeUspješna prijava sa sumnjive adrese se prijavljuje i po želji dodjeljuje kao zadatak — jednom po adresi dnevnouključeno
Liste prijetnjiIzlazni čvorovi mreže Tor, Spamhaus DROP, FireHOL Level 1 i blocklist.de unaprijed su podešeni; svaka dodatna RBL lista može se dodati putem adrese, uz svakodnevno usklađivanje i zaseban nivo za svaku listuprijaviti
Bez pristupa prijaviČetvrti nivo za liste i države: web-stranica je dostupna za čitanje, a obrazac za prijavu i interfejsi su zatvoreni — odgovarajuće rješenje za TorOpcija
Država porijeklaDržava za svako podudaranje i adresu putem GeoLite2; modul sam ažurira bazu podataka uz besplatan licencni ključprikazati
Pravila po državamaBlokirati, onemogućiti pristup prijavi, prijaviti ili izričito dozvoliti — za svaku državu, namjerno bez unaprijed zadanih pravilanema
Pogrešne konfiguracijeQNAP, Synology, Exchange-Autodiscover, ActiveSync i WebDAV/CalDAV/CardDAV se prepoznaju, nikada se ne blokiraju i dodaju se na listu za obradu uz nalaz i pogođenu domenuprijaviti
Tiket po adresiOd nalaza se po želji kreira tiket — tačno jedan po adresi; zatvoreni tiket ponovo se otvara umjesto da se kreira duplikatisključeno
Obavezne stranice i sakupljači podatakaKanonska putanja do impresuma uvijek ostaje dostupna; automatizirano isprobavanje drugih varijanti naziva prepoznaje se i po želji blokiraprijaviti
Lista dozvoljenih adresaAdrese i mreže koje se nikada ne blokiraju; lista se svakodnevno dopunjava podacima iz zaštitnog zida (udaljene VPN tačke) i objavljenim rasponima adresa za Googlebot i Bingbotuključeno
Povezivanje s klijentomPodudaranje iz mreže klijenta povezuje se s tim klijentom — na osnovu liste dozvoljenih adresa, nikada ručnim nagađanjemuključeno
Domena i identifikator za svako podudaranjeKojoj je web-stranici pristupljeno i s kojim User-Agentom — oba podatka nedostaju u dnevniku pristupauključeno
AnalizaDijagram i pivot tabela svih podudaranja: po obrascu, danu, domeni, državi i adresiuključeno
MamciAlati za ispitivanje dobijaju izmišljene odgovore s kontrolnom vrijednošću; ko je kasnije zatraži, pročitao je odgovoreisključeno
Objavljivanje RBL listeLista blokiranih adresa kao obična lista adresa ili JSON na zasebnoj adresi zaštićenoj tokenom — za HAProxy, OPNsense i svaki zaštitni zid koji čita liste s URL adresauključeno

Sve što se isporučuje s postavkom prijaviti, isključeno ili Opcija namjerno je tako podešeno: blokiranje treba uključiti nakon nekoliko dana praćenja toga koga bi ono zahvatilo — a ne zato što je tako unaprijed zadano.

Web RBL analiza: podudaranja po obrascu tokom sedam dana

Analiza: podudaranja po obrascu tokom sedam dana. Najviši stubac prikazuje potragu za datotekama .env.

RBL liste: standardiziran način distribucije blokada

RBL je skraćenica za Real-time Blackhole List. Pojam potječe iz svijeta e-pošte, gdje Spamhaus i drugi još od devedesetih objavljuju liste adresa zlonamjernih pošiljalaca. Princip je krajnje jednostavan i upravo zato toliko raširen: jedna adresa po redu, dostupna putem HTTP-a, uz redovno ponovno učitavanje. Nema formata koji prvo treba parsirati ni interfejsa za koji je potreban poseban alat.

Praktično svaki zaštitni zid i svaki obrnuti proxy server može učitati takvu listu i na osnovu nje kreirati pravila. Proizvođači to različito nazivaju, ali mehanizam je svuda isti:

  • OPNsense i pfSense — URL Table Alias: učitavanje liste adresa putem HTTP-a, korištenje kao aliasa u pravilima vatrozida, ažuriranje svakog sata ili jednom dnevno
  • HAProxy — ACL datoteke i Maps: src -f sperrliste.txt u pravilu http-request deny, uz mogućnost ponovnog učitavanja putem API-ja tokom rada, bez ponovnog pokretanja
  • nginx — modul geo s uključenom datotekom adresa ili direktive deny iz generisane datoteke include
  • Fortinet FortiGate — External Block List odnosno Threat Feed: URL s kojeg vatrozid preuzima listu IP adresa i koristi je u pravilima
  • Palo Alto Networks — External Dynamic List (EDL): isti princip, kao zaseban tip objekta u sigurnosnim pravilima
  • Check Point — Custom Intelligence Feeds i IP Block Lists putem URL-a
  • Cisco Secure Firewall (Firepower) — Security Intelligence Feeds s vlastitim izvorima lista
  • Sophos Firewall — Third-Party Threat Feeds: liste adresa s URL-a kao izvor za pravila blokiranja
  • Juniper SRX — Dynamic Address Entries iz feedova
  • MikroTik RouterOS — Address Lists, koje se popunjavaju s URL-a pomoću skripte i naredbe fetch
  • CrowdSec — vlastite liste kao izvor za komponente Bouncer na svakom podržanom sistemu

Web RBL isporučuje svoju listu blokiranih adresa upravo u ovom formatu. Vatrozid odbacuje pakete prije nego što stignu do web servera — a s njima i svaki drugi pokušaj s iste adrese, naprimjer prema mail serveru ili VPN pristupniku.

U oba smjera, ali na pravom mjestu

Postupak funkcioniše i obrnuto: u Web RBL može se dodati bilo koja RBL lista — URL, nivo i gotovo. Izlazni čvorovi mreže Tor, Spamhaus DROP, FireHOL i blocklist.de unaprijed su podešeni, a dodatne liste dodaju se u tri klika. Modul svaku listu razlaže na raspone adresa i provjerava svaki zahtjev prema njima, za svega nekoliko mikrosekundi.

Ipak: smislenije je koristiti vanjske liste na vatrozidu ispred servera. Iz tri razloga. Vatrozid vidi sve servise, a ne samo HTTP — adresi sa Spamhaus liste treba onemogućiti i pristup mail serveru i VPN-u. Odbacuje saobraćaj na nivou paketa, prije nego što se veza uopće uspostavi, pa time ne opterećuje aplikacijski server. Osim toga, takve se liste ionako održavaju na vatrozidu; druga kopija u aplikaciji znači još jedno mjesto na kojem podaci mogu zastarjeti.

Čemu onda još služe liste u modulu: onome što vatrozid ne može. On ne poznaje obrazac za prijavu. Web RBL može adresi s Tor liste onemogućiti pristup prijavi, a ipak prikazati web stranicu — ko želi anonimno čitati, treba to moći; ko želi anonimno isprobavati lozinke, ne treba. Može i prijaviti uspješnu prijavu s adrese na listi kao sumnjiv slučaj. Za oboje je lista potrebna tamo gdje se prijava odvija.

Ocjena umjesto procjene napamet

Adresa koja je jednom zatražila /wp-login.php nije isto što i adresa koja je tokom dva dana isprobala pet različitih obrazaca na tri domene. Web RBL to pretvara u ocjenu od 0 do 100 — na osnovu onoga što je sam zabilježio, bez vanjskog servisa i bez slanja upita izvan sistema.

Web RBL zapis s ocjenom 84 i obrazloženjem

Jedan zapis: 99 pogodaka, ocjena 84 i jasno obrazloženje — najteži obrazac, pet različitih ozbiljnih obrazaca, dva dana sa sumnjivom aktivnošću, više od dvadeset pogodaka.

Ocjena odlučuje o dvije stvari. Od podesive vrijednosti prijava je zabranjena — web stranica ostaje dostupna za čitanje, ali onaj ko je već tražio pristupne podatke ne dobija priliku da isproba pronađene. Prijavljuje se i uspješna prijava s adrese koja ima ocjenu: tada neko više nije pogađao, nego je znao podatke. Ili je ovlašteni korisnik bio na putu ili su pristupni podaci dospjeli u tuđe ruke — modul ne odlučuje o tome, nego slučaj prosljeđuje osobi koja može provjeriti. Pritom se samoj lozinci nigdje ne pristupa.

Web RBL lista blokiranih adresa, filtrirana po ocjeni 40 i više

Lista blokiranih adresa, filtrirana po ocjeni 40 i više: broj pogodaka, dani sa sumnjivom aktivnošću, pogođene domene i posljednja putanja za svaku adresu.

Šta Web RBL štiti — detaljan pregled zaštite

1. Pristupni podaci ostaju neotkriveni

Najveća zabilježena kategorija napada ne traži propuste u Odoou, nego zaboravljene povjerljive podatke. Tokom sedamnaest dana:

  • 57.721 zahtjev za datotekama .env — u njima se nalaze lozinke baza podataka, API ključevi i tajni ključevi sesija
  • 5.535 zahtjeva za konfiguracijskim datotekama
  • 4.388 zahtjeva za pristupnim podacima za cloud: credentials.json, service-account.json, firebase-adminsdk.json, rclone.conf, .git-credentials
  • 2.811 zahtjeva za direktorijima .git — ko pronađe takav direktorij, preuzima kompletan izvorni kod zajedno s historijom
  • 1.907 zahtjeva za uputama za izgradnju softvera kao što su .github/workflows/deploy.yml ili .gitlab-ci.yml, u kojima se nalaze registri i nazivi ključeva

Pritom nije presudan broj zahtjeva, nego broj različitih adresa: zahtjevi za /credentials.json stigli su s 98 adresa, a za /.git-credentials s 92. Nije riječ o jednom skeneru, nego o standardnom skupu postupaka koji se istovremeno koriste širom svijeta.

2. Pokušaji prijave ostaju bez rezultata — trajno

Odoo ima vlastiti mehanizam za usporavanje isprobavanja lozinki. On ima tri ograničenja, dokumentovana u samom izvornom kodu Odooa: brojač se nalazi u radnoj memoriji radnog procesa i vraća se na nulu pri svakom ponovnom pokretanju, samo usporava umjesto da blokira i broji isključivo pokušaje koji stignu do provjere lozinke.

Web RBL djeluje na istim mjestima, ali podatke zapisuje u bazu. To znači:

  • Stanje se čuva i nakon svakog ponovnog pokretanja i važi za sve radne procese
  • Prate se oba načina: obrazac za prijavu /web/login i interfejsi /xmlrpc/2/common i /jsonrpc
  • Bilježe se i pokušaji koji nikada ne stignu do provjere lozinke — naprimjer prijave bez važećeg tokena sesije
  • Broji se i neuspješan pristup upravitelju baza podataka; to je najteži oblik pokušaja prijave

Prag za prijave postavljen je na deset, a razlog su izmjereni podaci: od devet neuspješnih prijava tokom sedamnaest dana, većina je potekla od klijenata koji su sami podešavali pristup na dodatnom uređaju i pritom unijeli pogrešnu domenu — u jednom slučaju vlastitu, samo s crticom umjesto tačke. Blokiranje pri prvom neuspjelom pokušaju tako ne bi pogodilo napadače, nego klijente tokom podešavanja.

Onaj ko, međutim, nastavi pokušavati iako je server već odgovorio „molimo, kratko sačekajte“, blokira se odmah. Čovjek pročita tu poruku i sačeka; ko je ignoriše, program je. Poseban obrazac s pragom nula prepoznaje upravo taj slučaj i ne može pogoditi kolegu: do njega dolazi samo onaj ko već ima deset neuspjelih pokušaja i nakon toga nastavlja.

3. Napad više ne opterećuje server

Prije uvođenja modula, ispitivanje putanje poput /@fs/../../.env bilo je skupo: Odoo traži stranicu greške, renderuje je, pri sastavljanju adrese zapne na segmentima s tačkama, a zatim ne uspije ni prikazati stranicu greške za tu grešku. Dva traga steka po pokušaju ispitivanja. Tokom sedamnaest dana zabilježena je 28.401 takva greška, uz još 9.467 posljedičnih grešaka.

Web RBL djeluje u ir.http._match, dakle prije usmjeravanja. Odgovor se šalje bez predloška, bez pristupa bazi podataka osim provjere blokade i bez zapisa u dnevniku. Provjera prema listi dozvoljenih adresa, listama prijetnji i pravilima za zemlje obavlja se iz predmemorije, preko sortiranih raspona adresa — za nekoliko mikrosekundi, čak i s više od trideset hiljada raspona.

4. Vatrozid zaustavlja napadača prije nego što stigne

Lista blokiranih adresa objavljuje se kao RBL lista koju HAProxy i OPNsense direktno čitaju. Napadač tako više uopće ne dolazi do web servera — niti do bilo kojeg drugog servisa na istom hostu. Jednom prepoznat zlonamjeran pristup tako naknadno štiti cijeli računar.

Tri nivoa: blokirati, brojati, prijaviti

Nije svaki zahtjev za nepostojećim sadržajem napad. Web RBL zato razlikuje tri nivoa, a nivo se može promijeniti za svaki obrazac bez izmjene koda.

NivoZahtjev koji aktivira praviloPosljedica za adresu
blokiratiodbija seblokirana 24 sata, a nakon tri dana sa sumnjivom aktivnošću trajno
brojatipropušta sesamo se evidentira, bez blokiranja
prijavitipropušta seevidentira se s opisom nalaza, nikada se ne blokira

Za liste prijetnji i zemlje postoji i četvrti nivo: bez pristupa prijavi. Web stranica ostaje dostupna za čitanje, a obrazac za prijavu i interfejsi su zatvoreni. To je srednje rješenje za sve što je sumnjivo, ali ne mora biti zlonamjerno — Tor, raspon adresa podatkovnog centra ili zemlja u kojoj nema klijenata.

Koji se napadi prepoznaju

Svi obrasci provjereni su na stvarnom saobraćaju. Broj različitih adresa namjerno je naveden uz njih — pokazuje da li obrazac prepoznaje pojedinačni skener ili rasprostranjen način napada.

Kategorija napadaZahtjeviAdrese
Krađa datoteka .env57.721223
PHP ispitivanja12.237256
Path traversal s vrijednim ciljem10.04664
Konfiguracijske datoteke5.535114
Pristupni ključevi za cloud4.388152
WordPress ispitivanja3.366385
Krađa sadržaja direktorija .git2.811255
Izviđanje Odooa (upravitelj baza podataka, upit o verziji)2.500213
Lanci AI alata i izvršavanje naredbi (/mcp, /api/fs/exec)2.45074
Upute za izgradnju softvera (CI/CD)1.90788
GraphQL krajnje tačke1.87871

Posebno je zanimljiva najnovija kategorija. Putanja /api/fs/exec zatražena je 369 puta s 54 različite adrese — to nije pristup radi čitanja, nego pokušaj izvršavanja naredbi. Takvi ciljevi nisu postojali prije dvije godine; potiču iz interfejsa novih AI alata i redova zadataka. Ko zaštitu usmjeri samo na WordPress i PHP, ništa od toga neće vidjeti. Ova kategorija zato ima odgovarajuće veliku težinu u ocjeni.

Liste prijetnji i zemlja porijekla

Web RBL liste prijetnji: Tor, Spamhaus DROP, FireHOL, blocklist.de

Četiri liste, 32.851 raspon adresa, sve postavljene na „samo prijaviti“. Za svaku dodatnu listu dovoljni su adresa i nivo.

Vanjska lista je tvrdnja koju iznosi neko drugi, iz razloga koje ne znamo, o saobraćaju koji nikada nismo vidjeli. Može biti pogrešna, zastarjela ili namijenjena drugoj svrsi: blocklist.de uglavnom prikuplja adrese koje su drugdje isprobavale podatke za SSH prijavu, a to malo govori o web serveru. Zato Web RBL vodi vanjske liste odvojeno od vlastite liste blokiranih adresa i zato je zadana postavka prijaviti. Vlastita lista dozvoljenih adresa uvijek ima prednost: klijent kojeg poznajemo važniji je od procjene treće strane.

Zemlja porijekla navedena je uz svaki pogodak i svaku adresu. Nezamjenjiva je za procjenu — pokušaj prijave iz vlastite zemlje u deset ujutro nije isto što i pokušaj iz zemlje u kojoj nema nijednog klijenta. Za paušalno blokiranje nije naročito korisna, što pokazuju i naši podaci: napadači na našoj listi uglavnom su dolazili iz cloud raspona u Belgiji, Finskoj i Nizozemskoj. Blokiranje svega izvan njemačkog govornog područja ne bi ih zaustavilo — ali bi zaustavilo vlastite zaposlenike na odmoru i klijente na poslovnom putu.

Web RBL pravila za zemlje: isporučuju se prazna, uz objašnjenje

Pravila za zemlje isporučuju se prazna, a u prikazu je objašnjeno zašto.

Prijaviti pogrešne konfiguracije umjesto blokiranja

Najčešći slučaj u stvarnom saobraćaju nije ni napad ni posjetilac, nego neispravan softver koji web server smatra nečim drugim:

  • 1.367 poziva web interfejsa QNAP NAS uređaja — klijent za sinhronizaciju čije odredište više nije ispravno. S jednog jedinog priključka stigla su 962 pokušaja.
  • 65 Autodiscover upita — Outlook koji web domenu smatra svojim Exchange serverom

Takve adrese nikada se ne blokiraju. Blokada ne otklanja problem, nego ga skriva — i pogađa osobu čiji je uređaj već pogrešno podešen. Umjesto toga nastaje zapis s opisom nalaza i pogođenim domenama, iz kojeg se po želji automatski kreira tiket: tačno jedan po adresi. Ako se zatvori, a adresa ponovo pokaže sumnjivu aktivnost, isti tiket se ponovo otvara umjesto kreiranja drugog.

Prepoznaju se QNAP, Synology, Exchange-Autodiscover, ActiveSync te WebDAV, CalDAV i CardDAV klijenti. Obrasci pritom navode tačne nazive datoteka i direktorija, nikada samo ekstenzije: u istom direktoriju /cgi-bin/ bezazleni pozivi za sinhronizaciju nalaze se odmah uz klasične pokušaje ispitivanja kao što je printenv.pl.

Lista dozvoljenih adresa: adrese koje se nikada ne blokiraju

Cijena greške nije za sve adrese ista. Kod skenera iz data-centra lažni alarm ne košta ništa. Kod protustrane tunela lokacije košta lokaciju.

Zato postoji druga lista koja ima prednost nad prvom: adrese i mreže koje se nikada ne blokiraju. Ona pritom ništa ne prešućuje — adrese na njoj i dalje se provjeravaju i evidentiraju, samo izostaje posljedica. To je razlika u odnosu na izuzetak u vatrozidu: on onemogućava uvid, a ova lista samo daje više strpljenja.

Popunjava se svakodnevno iz dva izvora: iz samog vatrozida, svim adresama drugih strana VPN veza, kako novouspostavljeni tunel ne bi zavisio od toga hoće li se neko sjetiti liste blokiranih adresa — i iz objavljenih raspona adresa kompanija Google i Microsoft za njihove crawlere. Samo se tako pravi Googlebot može razlikovati od skenera koji se tako predstavlja. Pretraživači se nikada ne smiju blokirati; ko im zabrani pristup, svoju stranicu nepovratno uklanja iz indeksiranja.

Pritom vrijedi pravilo koje je važnije od poređenja: Prazan odgovor nikada ne briše. Ako izvor ne odgovori, odgovori prazno ili nerazumljivo, lista ostaje nepromijenjena. Bijela lista koja se pri smetnji sama isprazni u najgorem mogućem trenutku povlači sa sobom sve tunele.

Ako je uz zapis na listi dozvoljenih adresa naveden klijent, svaki pogodak iz njegove mreže pripisuje se njemu. Tako se za pogrešnu konfiguraciju odmah zna kome se obratiti, bez potrebe da neko provjerava adrese.

Obavezni podaci i automatizovani sakupljači podataka

Impresum nije obična stranica. Mora ostati dostupan ljudima jer bi njegovo blokiranje stvorilo upravo onaj prekršaj koji sakupljač traži. Istovremeno, to je stranica na kojoj su navedeni ime i adresa — pa je zato i meta automatizovanog prikupljanja podataka.

Tokom vala pravnih opomena u Austriji zbog ugrađenih Google fontova, zapisi su pokazali da dopisi nisu bili rezultat pojedinačnih posjeta, nego automatizovanog masovnog obilaska: različiti, međusobno nepovezani hostovi posjećivani su u razmacima od nekoliko milisekundi.

Web RBL to rješava snižavanjem nivoa umjesto izuzetkom. Kanonska putanja /impressum ne odgovara nijednom obrascu i uvijek ostaje dostupna. Drugačiji oblici poput /impressum.php — koji ne mogu postojati na Odoo stranici — prijavljuju se, a ko ne želi dopustiti automatizovano prikupljanje, mijenja jedan parametar. sitemap i robots izuzeti su iz toga i nikada se ne mogu blokirati: ne sadrže lične podatke, a njihovo preuzimanje zadatak je svakog crawlera pretraživača.

Domena i identifikacija klijenta: šta nedostaje u dnevniku pristupa

Dnevnik pristupa biblioteke werkzeug ne bilježi ni host kojem je zahtjev upućen ni identifikaciju klijenta koji ga šalje. Odoo, naravno, dobija oboje — bez hosta ne bi mogao odabrati odgovarajuću stranicu kada ih ima više. Međutim, ti se podaci naknadno ne mogu provjeriti.

Web RBL bilježi oba podatka za svaki pogodak. Time se dobijaju odgovori na dva pitanja na koja se inače ne može odgovoriti: kojoj se web stranici obraća pogrešno konfigurisan softver — a time i kojem klijentu pripada domena — te posjećuje li neka adresa jednu stranicu ili sve. Više međusobno nepovezanih domena koje posjećuje ista adresa obilježje su masovnog obilaska i povećavaju ocjenu.

Koliko identifikacija klijenta znači pokazala je analiza jedne naše web stranice: više od sedamdeset posto ukupnog saobraćaja poticalo je od jednog jedinog klijenta, raspoređenog na više od stotinu adresa. Bez identifikacije izgledalo bi kao distribuirani alat za prikupljanje podataka. Bio je to GPTBot, crawler kompanije OpenAI — stalno je tražio robots.txt i ponašao se potpuno ispravno.

Detaljan pregled sigurnosnih aspekata

1. Prepoznavanje proxyja — najopasnija tačka

Ako Odoo radi iza obrnutog proxyja, a proxy_mode nije ispravno podešen, modul pri svakom zahtjevu vidi istu adresu: adresu proxyja. Blokada bi tada svim posjetiocima istovremeno onemogućila pristup.

Zato Web RBL prije svake blokade provjerava je li utvrđivanje adrese pouzdano. Zahtijeva proxy_mode zajedno sa zaglavljem za prosljeđivanje, odbija raditi ako proslijeđeni zahtjev stigne bez postavke proxy_mode, a isto čini i ako postoji više od jednog posredničkog proxyja. U slučaju sumnje ne blokira.

2. Vlastite mreže nikada se ne blokiraju

Privatni rasponi adresa, loopback, link-local i CGNAT trajno su izuzeti. Ni pod kojim okolnostima ne mogu dospjeti na listu, čak ni ručnim unosom. Isto važi i za vanjske liste: privatni i rezervisani rasponi te nerazumno velike mreže odbacuju se pri učitavanju.

3. Vlastita greška ne smije oboriti web stranicu

Cijela provjera odvija se unutar zaštitnog mehanizma koji presreće svaku grešku. Sve što ovdje pođe po zlu bilježi se u dnevnik, a zahtjev nastavlja nepromijenjen. Zaštitni modul koji zbog vlastite greške obori web stranicu gori je od nepostojanja zaštite. Osim toga, svi upiti tokom obrade zahtjeva izvršavaju se bez primjene jezika preglednika posjetioca i bez sortiranja prema prevedenim poljima — posjetilac čiji jezik nije instaliran ne smije izazvati pad provjere.

4. Posmatranje prije blokiranja

Nakon instalacije, blokiranje adresa s liste pri uobičajenim zahtjevima je isključeno. Pokušaji ispitivanja odbijaju se i evidentiraju, a sve ostalo se propušta. Tako se nekoliko dana može pratiti ko zaista dospijeva na listu prije nego što se nekome onemogući pristup. Isto važi za prepoznavanje ponašanja, liste prijetnji i pravila za zemlje: prvo prijavljivanje, a blokiranje nakon pregleda.

5. Precizni obrasci umjesto širokih mreža

Pogrešno označen posjetilac košta više od neprepoznatog pokušaja ispitivanja. Zato svaki obrazac ima svoj nivo, koji se može zasebno promijeniti. Sama ekstenzija datoteke rijetko je dovoljna: kod .php zabilježeno je 14.012 stvarnih pokušaja ispitivanja naspram svega nekoliko starih linkova, dok je kod .asp odnos obrnut. Takve odluke treba zasnivati na mjerenju, a ne na procjeni.

6. Ručno odobrenje ostaje na snazi

Ko odobri neku adresu, imao je razlog za to. Novo prepoznavanje sumnjive aktivnosti ne poništava tu odluku prešutno.

7. Lista je zaštićena, ali nije tajna

Krajnja tačka zahtijeva token i bez važećeg tokena odgovara kodom 404, a ne 403 — time se ni ne potvrđuje postojanje adrese. Poređenje se izvršava u konstantnom vremenu. Sama lista ne sadrži ništa povjerljivo: čine je adrese koje su nam se samoinicijativno obratile.

8. Bez tajnih podataka u evidenciji

Kod neuspjelih prijava bilježi se uneseno korisničko ime, a nikada lozinka. U upravitelju baza podataka iz proslijeđenih vrijednosti ne čita se baš ništa: tamo je na prvom mjestu glavna lozinka, a svaki unos na listi blokiranih adresa završava u svakoj sigurnosnoj kopiji baze podataka. Licencni ključ za GeoLite2 nalazi se samo u sistemskom parametru, nikada u zapisniku.

9. Mamac ne otkriva ništa upotrebljivo

Web RBL po želji može na ispitne zahtjeve odgovarati izmišljenim sadržajem koji sadrži jedinstvenu vrijednost mamca. Ko kasnije zatraži tu vrijednost, pročitao je lažni odgovor i postupio na osnovu njega — lažni alarm je u tom slučaju isključen. Mamci ne sadrže upotrebljive informacije, stvarne putanje ni važeće pristupne podatke. Ova funkcija se isporučuje isključena, jer mijenja ponašanje sistema na način vidljiv izvana.

Šta modul ne može

Ne zamjenjuje vatrozid ni vatrozid za web-aplikacije. Prepoznaje poznate obrasce ispitivanja u putanjama, neuspjele prijave i sumnjivo ponašanje — ali ne i napade na obrasce ili pokušaje ubacivanja zlonamjernog sadržaja u parametre.

Osim toga, vidi samo ono što se vrati putem HTTP-a. Ono što napadač radi s ukradenim pristupnim podacima za bazu podataka ili poštanski sandučić ostaje nevidljivo — upravo zato su vrijednosti mamca putanje, a ne pristupni podaci.

A ne zamjenjuje ni pažljivo postupanje: modul koji odbija zahtjeve za ispitivanje datoteka .env ne čini slučajno objavljenu datoteku .env bezopasnom.

Dostupnost

Web RBL je javno dostupan pod licencom AGPL-3 i kod nas se koristi u produkciji na pet web-stranica:

github.com/Alex0176/odoo-web-rbl

Modul zahtijeva Odoo 19 Community i nema drugih zavisnosti osim base i web. Povezivanje sa sistemom za prijave problema je opcionalno i ne zahtijeva određeni sistem; bez njega se jednostavno ništa ne dešava. Za određivanje zemlje porijekla potrebna je besplatna baza podataka GeoLite2 kompanije MaxMind; ako ona nedostaje, polje ostaje prazno, a sve ostalo radi kao i inače.

Za više informacija: Kako se Web RBL uklapa u cjelovitu sigurnosnu arhitekturu -- zajedno s vatrozidom, dvofaktorskom autentifikacijom i ovlaštenjima, uz upute korak po korak: Kako pravilno kombinovati komponente sigurnosne arhitekture za Odoo 19.

Rado primamo pitanja, komentare i prijave grešaka — najbolje kroz Issue na GitHubu.