Izvorni kod: github.com/Alex0176/odoo-web-rbl — AGPL-3, slobodno za upotrebu.
Ko na internetu pogoni Odoo server, dobija posete. Ne povremeno, već neprekidno. Tokom sedamnaest dana na naših pet web sajtova beležili smo i analizirali 731.297 zahteva. 110.511 od njih nisu bili posetioci, već automatizovano traženje ranjivosti, pristupnih podataka i konfiguracionih datoteka.
Ovaj članak opisuje Web RBL, open source modul za Odoo 19 Community, koji ovaj saobraćaj prepoznaje, ocenjuje, evidentira i odbija — i koji listu blokiranja objavljuje kao RBL listu, dakle u formatu koji firewall-ovi i reverse proxy-ji neposredno čitaju. Svi brojevi potiču iz stvarnog rada.
Šta modul može — funkcije ukratko
| Funkcija | Šta radi | Isporuka |
|---|---|---|
| Prepoznavanje obrazaca | Prepoznaje sondiranja po putanji i nastavku: .env, .git, konfiguracione datoteke, cloud ključevi, CI/CD uputstva za izgradnju, WordPress, PHP, path traversal, upravljači baza podataka, GraphQL, izvršavanje komandi preko /api/fs/exec i sličnih interfejsa | blokiranje |
| Tri nivoa po obrascu | blokiranje, brojanje ili prijavljivanje — podesivo po obrascu, bez koda | po obrascu |
| Pragovi | Toliko pogodaka istog obrasca pre nego što se blokira; za prijave deset | 10 pri prijavi |
| Odbrana prijave | Neuspele prijave preko maske i XML-RPC/JSON-RPC, neuspele provere sesije, pristupi upravljaču baza podataka — u bazi podataka, a ne u radnoj memoriji | uključeno |
| Prepoznavanje botova na prijavi | Ko ignoriše poruku o čekanju nakon deset neuspelih pokušaja i nastavi da kuca, odmah se blokira | blokiranje |
| Prepoznavanje ponašanja | Adrese koje u pet minuta proizvedu dvadeset pogrešnih stranica i jedva neku pogođenu stranicu — dakle pogađaju umesto da čitaju | prijavljivanje |
| Ocena 0–100 | Koliko je sigurno da iza adrese stoji napadač? Iz težine obrasca, broja različitih obrazaca, upadljivih dana, pogođenih domena i broja pogodaka — sa obrazloženjem običnim tekstom | uključeno |
| Blokada prijave prema oceni | Od podesive ocene prijava je zabranjena, web sajt ostaje čitljiv | od 40 |
| Sumnja na ukradene pristupne podatke | Uspešna prijava sa sumnjive adrese se prijavljuje i, po želji, dodeljuje kao zadatak — jednom po adresi i danu | uključeno |
| Liste pretnji | Tor izlazni čvorovi, Spamhaus DROP, FireHOL Level 1, blocklist.de unapred podešeni; svaka dodatna RBL lista može se uneti preko adrese, dnevno poređenje, poseban nivo za svaku listu | prijavljivanje |
| Bez pristupa prijavi | Četvrti nivo za liste i zemlje: veb-sajt je čitljiv, obrazac za prijavu i interfejsi su zatvoreni — pravi odgovor na Tor | Opcija |
| Zemlja porekla | Zemlja po pogotku i adresi preko GeoLite2; modul sam održava bazu podataka pomoću besplatnog licencnog ključa | prikazati |
| Pravila po zemljama | Blokirati, bez pristupa prijavi, prijaviti ili izričito dozvoliti — po zemlji, namerno bez podrazumevane vrednosti | nijedno |
| Pogrešne konfiguracije | QNAP, Synology, Exchange Autodiscover, ActiveSync, WebDAV/CalDAV/CardDAV se prepoznaju, nikada ne blokiraju i stavljaju se na radnu listu sa nalazom i pogođenim domenom | prijavljivanje |
| Tiket po adresi | Iz nalaza se, po želji, pravi tiket — tačno jedan po adresi, zatvoreni se ponovo otvara umesto da se udvostruči | isključeno |
| Obavezne stranice i skupljači | Kanonska putanja impresuma uvek ostaje dostupna; mašinsko isprobavanje tuđih načina pisanja se prepoznaje i, po želji, blokira | prijavljivanje |
| Lista izuzetaka | Adrese i mreže koje se nikada ne blokiraju; svakodnevno se puni iz zaštitnog zida (VPN protivstrane) i iz objavljenih opsega adresa Googlebota i Bingbota | uključeno |
| Dodela klijentu | Pogodak iz mreže klijenta dodeljuje se njemu — iz liste izuzetaka, nikada pogađanjem ručno | uključeno |
| Domen i oznaka po pogotku | Koji je veb-sajt pozvan, sa kojim User-Agentom — oboje nedostaje u pristupnom zapisniku | uključeno |
| Analiza | Dijagram i pivot po svim pogocima: po obrascu, danu, domenu, zemlji, adresi | uključeno |
| Mamac | Sonde dobijaju izmišljene odgovore sa kanarinom vrednošću; ko je kasnije pozove, pročitao ih je | isključeno |
| RBL isporuka | Lista blokiranih kao čista lista adresa ili JSON na zasebnoj adresi zaštićenoj tokenom — za HAProxy, OPNsense i svaki zaštitni zid koji čita URL liste | uključeno |
Sve što se isporučuje sa prijavi, isključeno ili opcija je tako namerno: ko uključuje blokadu, treba to da učini zato što je nekoliko dana posmatrao ko na nju naleće — a ne zato što je podrazumevana vrednost to tako htela.
Analiza: pogoci po obrascu tokom sedam dana. Najviši stubac je potraga za .env datotekama.
RBL liste: standardizovan način isporuke blokada
RBL znači Real-time Blackhole List. Pojam potiče iz sveta e-pošte, gde Spamhaus i drugi od devedesetih objavljuju liste zlonamernih adresa pošiljalaca. Princip je izuzetno jednostavan i upravo zato tako rasprostranjen: jedna adresa u svakom redu, dostupna preko HTTP-a, redovno ponovo učitavana. Nema formata koji treba prvo analizirati, nema interfejsa za koji je potreban poseban alat.
Praktično svaki zaštitni zid i svaki reverzni proksi može da učita takvu listu i od nje napravi pravila. Proizvođači to nazivaju različito, mehanizam je svuda isti:
- OPNsense i pfSense — URL Table Alias: učitati listu adresa preko HTTP-a, koristiti kao alias u pravilima zaštitnog zida, osvežavanje na svakih nekoliko sati ili dnevno
- HAProxy — ACL datoteke i mape:
src -f sperrliste.txtu praviluhttp-request deny, može se ponovo učitati preko runtime API-ja bez restartovanja - nginx — geo modul sa uključenom datotekom adresa, ili
denynaredbe iz generisaneincludedatoteke - Fortinet FortiGate — External Block List odnosno Threat Feed: jedan URL iz kog zaštitni zid preuzima IP listu i koristi je u politikama
- Palo Alto Networks — External Dynamic List (EDL): isti princip, kao poseban tip objekta u bezbednosnim politikama
- Check Point — Custom Intelligence Feeds i IP Block Lists preko URL-a
- Cisco Secure Firewall (Firepower) — Security Intelligence Feeds sa sopstvenim izvorima lista
- Sophos Firewall — Third-Party Threat Feeds: liste adresa sa URL-a kao izvor za pravila blokiranja
- Juniper SRX — Dynamic Address Entries iz feedova
- MikroTik RouterOS — Address Lists, popunjene skriptom i
fetchsa URL-a - CrowdSec — sopstvene liste kao izvor za bouncere na svakom podržanom sistemu
Upravo u tom formatu Web RBL isporučuje svoju listu blokiranih. Zaštitni zid odbacuje pakete pre nego što stignu do veb-servera — a s njima i svaki drugi pokušaj sa iste adrese, na primer ka mejl serveru ili VPN gejtveju.
Oba smera, ali na pravom mestu
Put funkcioniše i u suprotnom smeru: u Web RBL može da se unese bilo koja RBL lista — jedan URL, jedan nivo, gotovo. Tor izlazni čvorovi, Spamhaus DROP, FireHOL i blocklist.de su unapred podešeni, dodatne se dodaju sa tri klika. Modul razlaže svaku listu na opsege adresa i proverava svaki zahtev prema njima, za nekoliko mikrosekundi.
Pa ipak: smislenije je tuđe liste koristiti na zaštitnom zidu pre toga. Iz tri razloga. Zaštitni zid vidi sve servise, ne samo HTTP — adresa sa Spamhaus liste treba da bude odbijena i na mejl serveru i na VPN-u. On odbacuje na nivou paketa, pre nego što se veza uopšte uspostavi, pa aplikativni server ne plaća ništa. I on je mesto na kome se takve liste ionako održavaju; druga kopija u aplikaciji je drugo mesto koje može da zastari.
Čemu onda služe liste u modulu: za ono što zaštitni zid ne može. On ne poznaje obrazac za prijavu. Web RBL može adresi sa Tor liste uskratiti pristup prijavi i ipak isporučiti veb-sajt — ko želi anonimno da čita, treba to da sme; ko anonimno želi da isprobava lozinke, ne sme. I može da prijavi uspešnu prijavu sa adrese sa liste kao slučaj sumnje. Oboje zahteva listu tamo gde se prijava odvija.
Ocena umesto osećaja
Adresa koja je jednom tražila /wp-login.php
je nešto drugo od one koja je u dva dana sa pet različitih
obrazaca prošla kroz tri domena. Web RBL to preračunava u
ocenu od 0 do 100 — iz onoga što je sam
video, bez tuđeg servisa i bez upita prema spolja.
Jedan unos: 99 pogodaka, ocena 84, i obrazloženje običnim jezikom — najteži obrazac, pet različitih ozbiljnih obrazaca, dva upadljiva dana, preko dvadeset pogodaka.
Ocena odlučuje o dve stvari. Od podesive vrednosti nadalje prijava je zabranjena — veb-sajt ostaje čitljiv, ali ko je već tražio pristupne podatke, ne dobija priliku da pronađene isproba. A uspešna prijava sa adrese sa ocenom se prijavljuje: tada neko više nije pogađao, nego je znao. Ili je ovlašćeni korisnik bio na putu, ili su pristupni podaci nestali — modul to ne odlučuje, već to iznosi pred nekoga ko može da pita. Sama lozinka pritom nigde nije dotaknuta.
Lista blokiranih, filtrirana po oceni od 40: broj pogodaka, upadljivi dani, pogođeni domeni i poslednja putanja po adresi.
Šta Web RBL štiti — zaštitno dejstvo u pojedinostima
1. Pristupni podaci ostaju neotkriveni
Najveća izmerena klasa napada ne traži ranjivosti u Odoo-u, nego zaboravljene tajne. Tokom sedamnaest dana:
- 57.721 zahtev za
.envdatotekama — tamo stoje lozinke baze podataka, API ključevi i tajne sesija - 5.535 zahteva za konfiguracionim datotekama
- 4.388 zahteva za pristupnim podacima za oblak:
credentials.json,service-account.json,firebase-adminsdk.json,rclone.conf,.git-credentials - 2.811 zahteva za
.gitdirektorijumima — ko pronađe jedan, preuzima kompletan izvorni kod zajedno sa istorijom - 1.907 zahteva za uputstvima za izgradnju kao što su
.github/workflows/deploy.ymlili.gitlab-ci.yml, u kojima stoje registri i nazivi ključeva
Presudan nije broj zahteva, nego broj
različitih adresa: /credentials.json je stigao
sa 98 adresa, /.git-credentials sa 92. To nije
pojedinačan skener, nego standardni repertoar koji se širom sveta
odvija istovremeno.
2. Pokušaji prijave odlaze u prazno — trajno
Odoo ima sopstvenu kočnicu protiv isprobavanja lozinki. Ona ima tri granice, koje su dokumentovane u samom Odoo izvornom kodu: brojač se nalazi u radnoj memoriji radnog procesa i resetuje se pri svakom restartovanju, on samo usporava umesto da blokira, i broji isključivo pokušaje koji dospeju do provere lozinke.
Web RBL se nadovezuje na ista mesta, ali upisuje u bazu podataka. Time važi:
- Stanje preživljava svako restartovanje i važi za sve radne procese
- Obuhvaćena su oba puta: obrazac za prijavu
/web/logini interfejsi/xmlrpc/2/commoni/jsonrpc - Obuhvaćeni su i pokušaji koji nikada ne stižu do provere lozinke — na primer prijave bez važeće oznake sesije
- Neuspeo pristup upravljaču baza podataka se takođe broji; to je najteži pokušaj prijave uopšte
Prag za prijave je postavljen na deset, a razlog je merenje: od devet neuspelih prijava u sedamnaest dana većina je potekla od klijenata koji su sami podešavali pristup na još jednom uređaju i pritom upisali pogrešan domen — u jednom slučaju sopstveni, samo sa crticom umesto tačke. Blokada pri prvom neuspelom pokušaju tako ne bi pogodila napadače, nego klijente pri podešavanju.
Ko, međutim, nastavi da kuca iako je server već odgovorio „sačekajte kratko“, biva odmah blokiran. Tu poruku čita čovek i čeka; ko je ignoriše, jeste program. Poseban obrazac sa pragom nula hvata upravo ovaj slučaj, i on ne može pogoditi kolegu: tamo dospeva samo ko iza sebe već ima deset neuspelih pokušaja i posle toga nastavlja.
3. Napad serveru više ništa ne košta
Sonda na putanju kao što je /@fs/../../.env je pre
modula bila skupa: Odoo traži stranicu greške, renderuje je, spotakne se
pri građenju adrese o segmente sa tačkama i potom
neuspe i na stranici greške te stranice greške. Dva
steka zapisa po sondi. Izmereno je 28.401 takvih grešaka
u sedamnaest dana, uz to 9.467 sekundarnih grešaka.
Web RBL zahvata ir.http._match, dakle pre
otkrivanja rute. Odgovor se daje bez šablona, bez pristupa bazi podataka
osim provere blokade i bez reda u zapisniku. Provera
prema listi izuzetaka, listama pretnji i pravilima po zemljama radi iz
keša preko sortiranih opsega adresa — nekoliko
mikrosekundi, čak i kod preko trideset hiljada opsega.
4. Zaštitni zid izbacuje napadača pre nego što stigne
Lista blokiranih se objavljuje kao RBL lista koju HAProxy i OPNsense čitaju neposredno. Napadač tako uopšte ne stiže do veb-servera — niti do bilo kog drugog servisa na istom hostu. Jednom prepoznat zlonameran pristup tako retroaktivno štiti celu mašinu.
Tri nivoa: blokirati, brojati, prijaviti
Nije svaki zahtev u prazno napad. Web RBL zato razlikuje tri nivoa, a nivo se može promeniti po obrascu, bez diranja koda.
| Nivo | Zahtev koji aktivira | Posledica po adresu |
|---|---|---|
| blokirati | biva odbijen | blokirana 24 sata, posle tri upadljiva dana trajno |
| brojati | prolazi | samo se evidentira, bez blokade |
| prijaviti | prolazi | evidentira se sa tekstom nalaza, nikada se ne blokira |
Za liste pretnji i zemlje postoji i četvrti: bez pristupa prijavi. Veb-sajt ostaje čitljiv, obrazac za prijavu i interfejsi su zatvoreni. To je srednji put za sve što je sumnjivo, ali ne mora biti zlonamerno — Tor, opseg data centra, zemlja bez klijenata.
Koji se napadi prepoznaju
Svi obrasci su proveravani na stvarnom saobraćaju. Broj različitih adresa namerno stoji pored — on pokazuje da li obrazac pogađa pojedinačan skener ili rasprostranjen postupak.
| Klasa napada | Zahtevi | Adrese |
|---|---|---|
.env izvlačenje | 57.721 | 223 |
| PHP sonde | 12.237 | 256 |
| Path traversal sa vrednim ciljem | 10.046 | 64 |
| Konfiguracione datoteke | 5.535 | 114 |
| Pristupni ključevi za oblak | 4.388 | 152 |
| WordPress sonde | 3.366 | 385 |
.git izvlačenje | 2.811 | 255 |
| Odoo izviđanje (upravljač baza podataka, upit o verziji) | 2.500 | 213 |
KI lanci alata i izvršavanje komandi (/mcp, /api/fs/exec) | 2.450 | 74 |
| Uputstva za izgradnju (CI/CD) | 1.907 | 88 |
| GraphQL krajnje tačke | 1.878 | 71 |
Najnovija klasa je vredna pažnje. /api/fs/exec
je zatražen 369 puta sa 54 različite adrese — to je
nije pristup za čitanje, nego pokušaj izvršavanja komandi. Takvih
ciljeva pre dve godine nije bilo; potiču iz interfejsa
novih KI alata i redova zadataka. Ko svoju odbranu usmeri samo
na WordPress i PHP, od toga ništa ne vidi. U
ocenjivanju ova klasa shodno tome teško vredi.
Liste pretnji i zemlja porekla
Četiri liste, 32.851 opseg adresa, sve na „samo prijaviti“. Svaka dodatna lista je jedna adresa i jedan nivo.
Tuđa lista je tvrdnja koju neko drugi
iznosi, iz razloga koje ne poznajemo, o saobraćaju koji
nikada nismo videli. Može biti pogrešna, zastarela ili namenjena
drugoj svrsi: blocklist.de prikuplja pre svega
adrese koje su negde drugde isprobavale SSH prijave, a to
malo govori o veb-serveru. Zato Web RBL tuđe liste vodi
odvojeno od sopstvene liste blokiranih, i zato je podrazumevana vrednost
prijaviti. A sopstvena lista izuzetaka uvek pobeđuje: klijent kog
poznajemo teži više od procene trećeg lica.
Zemlja porekla stoji uz svaki pogodak i svaku adresu. Za procenu je nezamenljiva — pokušaj prijave iz sopstvene zemlje u deset prepodne je nešto drugo od pokušaja iz zemlje bez ijednog klijenta. Za paušalno blokiranje vredi malo, a to govore i naši brojevi: napadači u našoj listi dolazili su pretežno iz oblak opsega u Belgiji, Finskoj i Holandiji. Blokada svega izvan nemačkog govornog područja ne bi ih pogodila — ali bi zato pogodila sopstvene zaposlene na odmoru i klijente na poslovnom putu.
Pravila po zemljama isporučuju se prazna, a prikaz kaže zašto.
Pogrešne konfiguracije prijaviti umesto blokirati
Najčešći slučaj u stvarnom saobraćaju nije ni napad ni posetilac, nego neispravan softver koji veb-server misli da je nešto drugo:
- 1.367 poziva veb-interfejsa QNAP NAS-a — sinhronizacioni klijent čiji cilj više nije tačan. Jedan jedini priključak je kucao 962 puta.
- 65 Autodiscover upita — Outlook koji veb-domen smatra svojim Exchange-om
Takve adrese se nikada ne blokiraju. Blokada ne otklanja kvar, ona ga skriva — i pogađa onoga čiji uređaj je ionako pogrešno podešen. Umesto toga nastaje unos sa tekstom nalaza i pogođenim domenima, iz kog po želji automatski nastaje tiket: po adresi tačno jedan, a ako se zatvori i adresa ponovo upadne u oči, isti tiket se ponovo otvara, umesto da nastane drugi.
Prepoznaju se QNAP, Synology, Exchange Autodiscover, ActiveSync
kao i WebDAV, CalDAV i CardDAV klijenti. Obrasci pritom navode
tačna imena datoteka i direktorijume, nikada puke
ekstenzije: u istom direktorijumu /cgi-bin/ nalaze se bezopasni
sinhronizacioni pozivi tik uz klasične sonde kao što je
printenv.pl.
Lista izuzetaka: adrese koje se nikada ne blokiraju
Cena greške nije ista za sve adrese. Kod skenera iz data centra lažni alarm ne košta ništa. Kod protivstrane tunela između lokacija košta lokaciju.
Zato postoji druga lista, koja stoji ispred prve: adrese i mreže koje se nikada ne blokiraju. Ona pritom ništa ne utišava — ko je na njoj, i dalje se proverava i evidentira, samo izostaje posledica. To je razlika u odnosu na izuzetak u zaštitnom zidu: on zaslepljuje, ova samo čini strpljivim.
Puni se svakodnevno iz dva izvora: iz samog zaštitnog zida sa svim VPN protivstranama, da novopodešeni tunel ne bi zavisio od toga da neko pomisli na listu blokiranih — i iz objavljenih opsega adresa Googlea i Microsofta za njihove crawlere. Samo tako se pravi Googlebot može razlikovati od skenera koji se tako predstavlja. Pretraživači se nikada ne smeju blokirati; ko ih blokira, povlači svoju stranicu iz indeksiranja bez puta nazad.
Pritom važi pravilo koje je važnije od poređenja: Prazan odgovor nikada ne briše. Ako izvor ne odgovori, vrati prazno ili nerazumljivo, lista ostaje nepromenjena. Lista izuzetaka koja se pri smetnji sama isprazni, u najgorem mogućem trenutku povlači sa sobom sve tunele.
Ako unos na listi izuzetaka nosi klijenta, svaki pogodak iz njegove mreže mu se dodeljuje. Pogrešna konfiguracija tako odmah ima osobu za kontakt, bez potrebe da neko traži adrese.
Obavezni podaci i automatizovani skupljači podataka
Impresum nije obična stranica. Mora ostati dostupan ljudima, jer blokada na njemu stvara upravo prekršaj koji skupljač traži. Istovremeno je to stranica na kojoj stoje ime i adresa — a time i meta mašinske žetve.
U austrijskom talasu opomena zbog ugrađenih Google fontova zapisnici su pokazali da pisma ne potiču iz pojedinačnih poseta, nego iz automatizovanog masovnog obilaska: različiti, međusobno nepovezani hostovi u razmaku od milisekundi.
Web RBL to rešava snižavanjem umesto izuzetkom. Kanonska
putanja /impressum ne pogađa nijedan obrazac i
uvek ostaje dostupna. Tuđi načini pisanja kao
/impressum.php — koji na Odoo stranici ne
mogu postojati — se prijavljuju, a ko mašinsku žetvu
ne želi da trpi, prebacuje jedan parametar.
sitemap i robots su od toga izuzeti
i načelno se ne mogu blokirati: ne sadrže
lične podatke, a njihovo preuzimanje je zadatak svakog
crawlera pretraživača.
Domen i oznaka: šta nedostaje u pristupnom zapisniku
Pristupni zapisnik werkzeug-a ne beleži ni pozvani host ni oznaku pozivaoca. Odoo oba dobija samo po sebi — bez hosta ne bi mogao, kod više veb-sajtova, uopšte da izabere pravi. Ali naknadno se to ne može pročitati.
Web RBL oba beleži po pogotku. To odgovara na dva pitanja na koja se inače ne može odgovoriti: koji veb-sajt pogrešna konfiguracija poziva — a time i kome klijentu domen pripada — i da li adresa posećuje jednu stranicu ili sve. Više nepovezanih domena iste adrese su obeležje masovnog obilaska, i povećavaju ocenu.
Koliko oznaka znači, pokazala je analiza na jednom od
naših veb-sajtova: preko sedamdeset procenata celokupnog saobraćaja
tamo je otpadalo na jednog jedinog pozivaoca, raspoređenog na više od
stotinu adresa. Bez oznake bi to izgledalo kao distribuirani
scraper. Bio je to GPTBot, crawler kompanije OpenAI
— stalno je ponovo tražio robots.txt i
ponašao se potpuno korektno.
Bezbednosni aspekti u pojedinostima
1. Prepoznavanje proksija — najopasnije mesto uopšte
Ako Odoo radi iza reverznog proksija a proxy_mode
je pogrešno podešen, modul pri svakom zahtevu vidi istu adresu:
adresu proksija. Blokada bi tada istovremeno zaključala
sve posetioce.
Zato Web RBL pre svake blokade proverava da li je utvrđivanje adrese
pouzdano. Zahteva proxy_mode zajedno sa
zaglavljem prosleđivanja, odbija rad ako stigne
prosleđivanje bez proxy_mode, i podjednako ga odbija
kod više od jednog posredničkog proksija. U sumnji se ne
blokira.
2. Sopstvene mreže nikada
Privatni opsezi adresa, loopback, link-local i CGNAT su trajno izuzeti. Ni pod kojim uslovima ne mogu završiti na listi, čak ni ručno. Isto važi za tuđe liste: privatni i rezervisani opsezi kao i apsurdno velike mreže odbacuju se pri učitavanju.
3. Sopstvena greška ne sme povući veb-sajt sa sobom
Cela provera radi unutar zaštite koja hvata svaku grešku. Šta ovde pođe po zlu, beleži se, a zahtev se nastavlja nepromenjen. Zaštitni modul koji pri sopstvenoj grešci povuče veb-sajt sa sobom gori je od nikakvog. Svi upiti na putu zahteva takođe rade bez jezika pregledača posetioca i bez sortiranja po prevedenim poljima — posetilac sa nepodešenim jezikom ne sme da obori proveru.
4. Posmatrati pre blokiranja
Posle instalacije je blokiranje adresa sa liste kod običnih zahteva isključeno. Sonde se odbijaju i evidentiraju, sve ostalo prolazi. Tako se nekoliko dana može pratiti ko zaista završava na listi, pre nego što neko bude zaključan. Isto važi za prepoznavanje ponašanja, liste pretnji i pravila po zemljama: prvo prijaviti, blokirati nakon uvida.
5. Uski obrasci umesto širokih mreža
Pogrešno prepoznat posetilac je skuplji od propuštene sonde.
Svaki obrazac zato nosi svoj nivo, i on se može menjati po obrascu.
Sama ekstenzija datoteke retko je dovoljna: kod
.php stoji 14.012 pravih sondi naspram šačice
starih linkova, kod .asp je odnos obrnut. O takvim
odlukama treba odlučivati merenjem, ne procenom.
6. Ručno odobrenje ostaje na snazi
Ko adresu odobri, imao je razlog. Dalji pogodak ne poništava tu odluku prečutno.
7. Lista je zaštićena, ali nije tajna
Krajnja tačka zahteva token i bez važećeg tokena odgovara
sa 404, a ne sa 403 — postojanje
adrese se time uopšte ne potvrđuje. Poređenje se izvodi
u konstantnom vremenu. Sama lista ne sadrži ništa poverljivo: Sastoji
se od adresa koje su same kucale na naša vrata.
8. Nikakvih tajni u evidenciji
Kod neuspelih prijava beleži se pokušano korisničko ime, nikada lozinka. Kod upravljača baza podataka iz prosleđenih vrednosti se ništa ne čita: tamo na prvom mestu stoji glavna lozinka, a unos u listi blokiranih putuje u svaku rezervnu kopiju baze podataka. Licencni ključ za GeoLite2 stoji samo u sistemskom parametru i ni u jednom redu zapisnika.
9. Mamac ne odaje ništa upotrebljivo
Opciono Web RBL odgovara na sonde izmišljenim sadržajem koji sadrži jedinstvenu kanarinu vrednost. Ko tu vrednost kasnije pozove, pročitao je lažni odgovor i na osnovu njega delovao — lažan alarm je pritom isključen. Mamci ne sadrže nikakve upotrebljive podatke, nikakve stvarne putanje i nikakve važeće pristupne podatke. Ova funkcija se isporučuje isključena, jer menja ponašanje vidljivo spolja.
Šta modul ne može
Ne zamenjuje zaštitni zid niti Web Application Firewall. Prepoznaje poznate obrasce sondiranja u putanjama, neuspele prijave i upadljivo ponašanje — ne napade na obrasce, ne pokušaje ubacivanja u parametre.
Pored toga vidi samo ono što se vraća preko HTTP-a. Šta napadač uradi sa ukradenim pristupima bazi podataka ili poštanskom sandučetu, ostaje neviđeno — i upravo zato su kanarine vrednosti putanje a ne pristupni podaci.
I ne zamenjuje pažnju: Modul koji odbija
.env sonde ne čini bezopasnom slučajno
isporučenu .env datoteku.
Dostupnost
Web RBL je javno dostupan pod AGPL-3 licencom i kod nas radi produktivno na pet veb-sajtova:
github.com/Alex0176/odoo-web-rbl
Modul zahteva Odoo 19 Community i nema
zavisnosti osim base i web. Povezivanje
sa tiketima je opciono i ne zahteva određen
sistem tiketa; bez njega se jednostavno ništa ne dešava. Zemlja
porekla zahteva besplatnu GeoLite2 bazu podataka kompanije MaxMind;
ako nedostaje, polje ostaje prazno, a sve ostalo radi
nepromenjeno.
Dalje čitanje: Kako se Web RBL uklapa u potpunu bezbednosnu arhitekturu -- zajedno sa zaštitnim zidom, dvofaktorskom autentifikacijom i ovlašćenjima, uključujući uputstvo korak po korak: Pravilno kombinovanje bezbednosne arhitekture Odoo 19.
Pitanja, napomene i izveštaje o greškama rado primamo — najradije kao Issue na GitHub-u.