Izvorni kôd: github.com/Alex0176/odoo-web-rbl — AGPL-3, slobodno za uporabu.
Tko pogoni Odoo poslužitelj na internetu, dobiva posjete. Ne povremeno, nego neprekidno. Tijekom sedamnaest dana na naših pet web-stranica zabilježili smo i analizirali 731.297 zahtjeva. 110.511 od njih nisu bili posjetitelji, nego automatizirano traženje ranjivosti, pristupnih podataka i konfiguracijskih datoteka.
Ovaj članak opisuje Web RBL, open source modul za Odoo 19 Community koji prepoznaje, ocjenjuje, evidentira i odbija taj promet — i koji popis blokiranja objavljuje kao RBL popis, dakle u formatu koji vatrozidi i reverse proxyji izravno čitaju. Svi brojevi potječu iz stvarnog pogona.
Što modul može — funkcije ukratko
| Funkcija | Što radi | Isporuka |
|---|---|---|
| Prepoznavanje uzoraka | Prepoznaje sondiranja prema putanji i nastavku: .env, .git, konfiguracijske datoteke, ključevi za oblak, CI/CD upute za izgradnju, WordPress, PHP, path traversal, upravitelji baza podataka, GraphQL, izvršavanje naredbi putem /api/fs/exec i sličnih sučelja | blokirati |
| Tri razine po uzorku | blokirati, brojati ili prijaviti — podesivo po uzorku, bez kôda | po uzorku |
| Pragovi | Toliko pogodaka istog uzorka prije nego što se blokira; za prijave deset | 10 pri prijavi |
| Obrana prijave | Neuspjele prijave putem obrasca i XML-RPC/JSON-RPC, neuspjele provjere sesije, pristupi upravitelju baza podataka — u bazi podataka, a ne u radnoj memoriji | uključeno |
| Prepoznavanje botova pri prijavi | Tko zanemari poruku o čekanju nakon deset neuspjelih pokušaja i nastavi kucati, odmah se blokira | blokirati |
| Prepoznavanje ponašanja | Adrese koje u pet minuta stvore dvadeset nepostojećih stranica i jedva koju pogođenu stranicu — dakle pogađaju umjesto da čitaju | prijaviti |
| Ocjena 0–100 | Koliko je sigurno da iza adrese stoji napadač? Iz težine uzorka, broja različitih uzoraka, upadljivih dana, pogođenih domena i broja pogodaka — s obrazloženjem običnim tekstom | uključeno |
| Blokada prijave prema ocjeni | Od podesive ocjene prijava je zabranjena, a web-stranica ostaje čitljiva | od 40 |
| Sumnja na ukradene pristupne podatke | Uspješna prijava s upadljive adrese bilježi se i, po želji, dodjeljuje kao zadatak — jednom po adresi i danu | uključeno |
| Popisi prijetnji | Tor izlazni čvorovi, Spamhaus DROP, FireHOL Level 1, blocklist.de unaprijed konfigurirani; svaki dodatni RBL popis može se unijeti putem adrese, dnevna usporedba, zasebna razina za svaki popis | prijaviti |
| Bez pristupa prijavi | Četvrta razina za popise i zemlje: web-stranica ostaje čitljiva, obrazac za prijavu i sučelja su zatvoreni — prikladan odgovor na Tor | Opcija |
| Zemlja podrijetla | Zemlja po pogotku i adresi putem GeoLite2; bazu podataka modul sam održava aktualnom uz besplatan licencni ključ | prikaži |
| Pravila po zemljama | Blokirati, bez pristupa prijavi, prijaviti ili izričito dopustiti — po zemlji, namjerno bez zadane vrijednosti | nema |
| Pogrešne konfiguracije | QNAP, Synology, Exchange Autodiscover, ActiveSync, WebDAV/CalDAV/CardDAV prepoznaju se, nikad se ne blokiraju te se s nalazom i pogođenom domenom unose na radni popis | prijaviti |
| Tiket po adresi | Iz nalaza po želji nastaje tiket — točno jedan po adresi, zatvoreni se ponovno otvara umjesto da se udvostruči | isključeno |
| Obvezne stranice i skupljači | Kanonska putanja impresuma uvijek ostaje dostupna; strojno isprobavanje tuđih načina pisanja prepoznaje se i po želji blokira | prijaviti |
| Popis izuzetaka | Adrese i mreže koje se nikad ne blokiraju; svakodnevno se popunjava iz vatrozida (VPN-protustrane) i iz objavljenih adresnih raspona Googlebota i Bingbota | uključeno |
| Dodjela kupcu | Pogodak iz mreže nekog kupca dodjeljuje se tom kupcu — iz popisa izuzetaka, nikad pogađanjem ručno | uključeno |
| Domena i identifikator po pogotku | Koja je web-stranica pozvana i s kojim User-Agentom — oboje nedostaje u zapisniku pristupa | uključeno |
| Analiza | Dijagram i pivot preko svih pogodaka: po obrascu, danu, domeni, zemlji, adresi | uključeno |
| Mamac | Sonde dobivaju izmišljene odgovore s kanarinac-vrijednošću; tko je kasnije dohvati, pročitao ih je | isključeno |
| RBL isporuka | Popis blokiranih kao čisti popis adresa ili JSON na zasebnoj adresi zaštićenoj tokenom — za HAProxy, OPNsense i svaki vatrozid koji čita popise URL-ova | uključeno |
Sve što se isporučuje s prijavi, isključeno ili opcija namjerno je tako: tko uključi blokadu, neka to učini zato što je nekoliko dana promatrao tko je pogođen — a ne zato što je zadana vrijednost tako htjela.
Analiza: pogoci po obrascu tijekom sedam dana. Najviši stupac je traženje .env datoteka.
RBL popisi: standardizirani način isporuke blokada
RBL znači Real-time Blackhole List. Pojam potječe iz svijeta e-pošte, gdje Spamhaus i drugi od devedesetih objavljuju popise zlonamjernih adresa pošiljatelja. Načelo je vrlo jednostavno i upravo zato tako rašireno: jedna adresa u svakom retku, dostupna putem HTTP-a, redovito iznova učitavana. Nikakav format koji treba prvo parsirati, nikakvo sučelje za koje je potreban alat.
Praktički svaki vatrozid i svaki reverse proxy može pročitati takav popis i iz njega izgraditi pravila. Proizvođači to nazivaju različito, ali je mehanizam svugdje isti:
- OPNsense i pfSense — URL Table Alias: popis adresa učitava se putem HTTP-a, koristi se kao alias u pravilima vatrozida, osvježavanje svakih nekoliko sati ili dnevno
- HAProxy — ACL datoteke i mape:
src -f sperrliste.txtuhttp-request denypravilu, ponovno se učitava putem runtime API-ja bez ponovnog pokretanja - nginx — geo modul s uključenom datotekom adresa ili
denynaredbe iz generiraneincludedatoteke - Fortinet FortiGate — External Block List odnosno Threat Feed: jedan URL iz kojeg vatrozid preuzima IP popis i koristi ga u pravilima
- Palo Alto Networks — External Dynamic List (EDL): isto načelo, kao zasebna vrsta 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 popisa
- Sophos Firewall — Third-Party Threat Feeds: popisi adresa s URL-a kao izvor za pravila blokiranja
- Juniper SRX — Dynamic Address Entries iz feedova
- MikroTik RouterOS — Address Lists, popunjavaju se skriptom i
fetchs URL-a - CrowdSec — vlastiti popisi kao izvor za bouncere na svakom podržanom sustavu
Upravo u tom formatu Web RBL isporučuje svoj popis blokiranih. Vatrozid odbacuje pakete prije nego što stignu do web-poslužitelja — a s njima i svaki drugi pokušaj iste adrese, primjerice prema poslužitelju e-pošte ili VPN pristupniku.
Oba smjera, ali na pravom mjestu
Put funkcionira i obrnuto: u Web RBL može se unijeti bilo koji RBL popis — jedan URL, jedna razina, gotovo. Tor izlazni čvorovi, Spamhaus DROP, FireHOL i blocklist.de unaprijed su konfigurirani, dodatni se dodaju s tri klika. Modul svaki popis razlaže na adresne raspone i provjerava svaki zahtjev prema njima, u nekoliko mikrosekundi.
Pa ipak: smislenije je tuđe popise koristiti na vatrozidu ispred toga. Iz tri razloga. Vatrozid vidi sve usluge, ne samo HTTP — adresa s Spamhaus popisa treba propasti i na poslužitelju e-pošte i na VPN-u. On odbacuje na razini paketa, prije nego što se veza uopće uspostavi, pa aplikacijski poslužitelj ne plaća ništa. I on je mjesto na kojem se takvi popisi ionako održavaju; druga kopija u aplikaciji drugo je mjesto koje može zastarjeti.
Čemu onda služe popisi u modulu: za ono što vatrozid ne može. On ne poznaje obrazac za prijavu. Web RBL može adresi s Tor popisa uskratiti pristup prijavi i svejedno isporučiti web-stranicu — tko želi anonimno čitati, to smije; tko anonimno želi isprobavati lozinke, ne smije. I može prijaviti uspješnu prijavu s adrese s popisa kao sumnjivi slučaj. Oboje zahtijeva popis tamo gdje se prijava odvija.
Ocjena umjesto dojma
Adresa koja je jednom tražila /wp-login.php
nešto je drugo od one koja je u dva dana s pet različitih
obrazaca prošla kroz tri domene. Web RBL to preračunava u
ocjenu od 0 do 100 — iz onoga što je sam
vidio, bez vanjske usluge i bez upita prema van.
Jedan unos: 99 pogodaka, ocjena 84 i obrazloženje uobičajenim jezikom — najteži obrazac, pet različitih ozbiljnih obrazaca, dva upadljiva dana, više od dvadeset pogodaka.
Ocjena odlučuje o dvije stvari. Od podesive vrijednosti nadalje prijava je zabranjena — web-stranica ostaje čitljiva, ali tko je već tražio pristupne podatke, ne dobiva priliku isprobati pronađene. A uspješna prijava s adrese s ocjenom se prijavljuje: tada netko više nije pogađao, nego je znao. Ili je ovlašteni korisnik bio na putu, ili su pristupni podaci izgubljeni — modul to ne odlučuje, nego to iznosi nekome tko može provjeriti. Sama lozinka pritom se nigdje ne dotiče.
Popis blokiranih, filtriran po ocjeni od 40: broj pogodaka, upadljivi dani, pogođene domene i posljednja putanja po adresi.
Što Web RBL štiti — zaštitni učinak u pojedinostima
1. Pristupni podaci ostaju neotkriveni
Najveća izmjerena klasa napada ne traži ranjivosti u Odoo-u, nego zaboravljene tajne. Tijekom sedamnaest dana:
- 57.721 zahtjeva za
.envdatotekama — u njima se nalaze lozinke baza podataka, API ključevi i tajne sesija - 5.535 zahtjeva za konfiguracijskim datotekama
- 4.388 zahtjeva za pristupnim podacima za oblak:
credentials.json,service-account.json,firebase-adminsdk.json,rclone.conf,.git-credentials - 2.811 zahtjeva za
.gitdirektorijima — tko pronađe jedan, preuzima potpuni izvorni kôd zajedno s poviješću - 1.907 zahtjeva za uputama za izgradnju poput
.github/workflows/deploy.ymlili.gitlab-ci.yml, u kojima se nalaze registri i nazivi ključeva
Pritom nije presudan broj zahtjeva, nego broj
različitih adresa: /credentials.json došao je
s 98 adresa, /.git-credentials s 92. To nije
pojedinačni skener, nego standardni repertoar koji se diljem svijeta
vrti istodobno.
2. Pokušaji prijave odlaze u prazno — trajno
Odoo donosi vlastitu kočnicu protiv isprobavanja lozinki. Ima tri granice koje su dokumentirane u samom Odoo izvornom kôdu: brojač se nalazi u radnoj memoriji radnog procesa i resetira se pri svakom ponovnom pokretanju, on samo usporava umjesto da blokira i broji isključivo pokušaje koji dođu do provjere lozinke.
Web RBL djeluje na istim mjestima, ali piše u bazu podataka. Zbog toga vrijedi:
- Stanje preživljava svako ponovno pokretanje i vrijedi za sve radne procese
- Bilježe se oba puta: obrazac za prijavu
/web/logini sučelja/xmlrpc/2/commoni/jsonrpc - Bilježe se i pokušaji koji nikad ne dođu do provjere lozinke — primjerice prijave bez valjanog obilježja sesije
- Neuspjeli pristup upravitelju baza podataka također se broji; to je najteži pokušaj prijave uopće
Prag za prijave postavljen je na deset, a razlog je mjerenje: od devet neuspjelih prijava u sedamnaest dana većina je potjecala od kupaca koji su si sami postavljali pristup na još jednom uređaju i pritom upisali pogrešnu domenu — u jednom slučaju vlastitu, samo s crticom umjesto točke. Blokada pri prvom neuspjelom pokušaju zato ne bi pogodila napadače, nego kupce pri postavljanju.
Tko pak nastavi kucati iako je poslužitelj već odgovorio „molimo kratko pričekajte“, blokira se odmah. Tu poruku čita čovjek i čeka; tko je zanemari, program je. Poseban obrazac s pragom nula hvata upravo ovaj slučaj, a ne može pogoditi kolegu: tamo dospijeva samo tko je već iza sebe ostavio deset neuspjelih pokušaja i nakon toga nastavlja.
3. Napad poslužitelja više ništa ne košta
Sonda na putanju poput /@fs/../../.env prije
modula bila je skupa: Odoo traži stranicu s pogreškom, renderira je, spotakne se
pri izgradnji adrese o segmente s točkama i zatim zakaže i na stranici s pogreškom za stranicu s pogreškom. Dva
zapisa stoga po sondi. Izmjereno je 28.401 takvih pogrešaka
u sedamnaest dana, uz 9.467 posljedičnih pogrešaka.
Web RBL zahvaća u ir.http._match, dakle prije
usmjeravanja. Odgovor se isporučuje bez predloška, bez pristupa bazi podataka
osim provjere blokade i bez retka u zapisniku. Provjera
prema popisu izuzetaka, popisima prijetnji i pravilima po zemljama odvija se iz
međuspremnika preko sortiranih adresnih raspona — nekoliko
mikrosekundi, čak i uz više od trideset tisuća raspona.
4. Vatrozid izbacuje napadača prije nego što stigne
Popis blokiranih objavljuje se kao RBL popis koji HAProxy i OPNsense čitaju izravno. Napadač tako uopće više ne dolazi do web-poslužitelja — niti do bilo koje druge usluge na istom hostu. Pristup koji je jednom prepoznat kao zlonamjeran tako retroaktivno štiti cijeli stroj.
Tri razine: blokirati, brojati, prijaviti
Nije svaki zahtjev u prazno napad. Web RBL zato razlikuje tri razine, a razina se po obrascu može promijeniti bez diranja kôda.
| Razina | Zahtjev koji je pokrenuo reakciju | Posljedica za adresu |
|---|---|---|
| blokirati | odbija se | blokirana 24 sata, nakon tri upadljiva dana trajno |
| brojati | prolazi | samo se evidentira, bez blokade |
| prijaviti | prolazi | evidentira se s tekstom nalaza, nikad se ne blokira |
Za popise prijetnji i zemlje postoji i četvrta: bez pristupa prijavi. Web-stranica ostaje čitljiva, obrazac za prijavu i sučelja su zatvoreni. To je srednji put za sve što je sumnjivo, ali ne mora biti zlonamjerno — Tor, jedan raspon podatkovnog centra, zemlja bez kupaca.
Koji se napadi prepoznaju
Svi su obrasci provjereni na stvarnom prometu. Broj različitih adresa namjerno je naveden uz njih — pokazuje pogađa li obrazac pojedinačni skener ili raširen način djelovanja.
| Klasa napada | Zahtjevi | Adrese |
|---|---|---|
Dohvaćanje .env datoteka | 57.721 | 223 |
| PHP sonde | 12.237 | 256 |
| Path traversal s isplativim ciljem | 10.046 | 64 |
| Konfiguracijske datoteke | 5.535 | 114 |
| Ključevi za pristup oblaku | 4.388 | 152 |
| WordPress sonde | 3.366 | 385 |
Dohvaćanje .git direktorija | 2.811 | 255 |
| Izviđanje Odooa (upravitelj baza podataka, upit o verziji) | 2.500 | 213 |
Lanci AI alata i izvršavanje naredbi (/mcp, /api/fs/exec) | 2.450 | 74 |
| Upute za izgradnju (CI/CD) | 1.907 | 88 |
| GraphQL krajnje točke | 1.878 | 71 |
Najnovija je klasa zanimljiva. /api/fs/exec
zatražen je 369 puta s 54 različite adrese — to nije
pristup za čitanje, nego pokušaj izvršavanja naredbi. Takvih
ciljeva prije dvije godine nije bilo; potječu iz sučelja
novih AI alata i redova zadataka. Tko svoju obranu usmjeri samo
na WordPress i PHP, od toga ne vidi ništa. U
ocjeni ova klasa zato ima veliku težinu.
Popisi prijetnji i zemlja podrijetla
Četiri popisa, 32.851 adresni raspon, svi na „samo prijaviti“. Svaki dodatni popis je jedna adresa i jedna razina.
Tuđi popis je tvrdnja koju netko drugi
iznosi, iz razloga koje ne znamo, o prometu koji
nikad nismo vidjeli. Može biti pogrešan, zastario ili namijenjen
drugoj svrsi: blocklist.de prikuplja uglavnom
adrese koje su drugdje isprobavale SSH prijave, a to
malo govori o web-poslužitelju. Zato Web RBL tuđe popise vodi
odvojeno od vlastitog popisa blokiranih i zato je zadana vrijednost
prijaviti. A vlastiti popis izuzetaka uvijek pobjeđuje: kupac kojeg
poznajemo teži više od procjene treće strane.
Zemlja podrijetla navedena je uz svaki pogodak i svaku adresu. Za ocjenjivanje je nezamjenjiva — pokušaj prijave iz vlastite zemlje u deset sati prijepodne nešto je drugo od pokušaja iz zemlje u kojoj nemamo nijednog kupca. Za paušalno blokiranje je malo prikladna, a to govore i naši vlastiti brojevi: napadači u našem popisu dolazili su pretežno iz oblak-raspona u Belgiji, Finskoj i Nizozemskoj. Blokada svega izvan njemačkog govornog područja njih ne bi pogodila — ali bi pogodila vlastite zaposlenike na odmoru i kupce na poslovnom putu.
Pravila po zemljama isporučuju se prazna, a prikaz kaže zašto.
Pogrešne konfiguracije prijaviti umjesto blokirati
Najčešći slučaj u stvarnom prometu nije ni napad ni posjetitelj, nego neispravan softver koji web-poslužitelj uzima za nešto drugo:
- 1.367 poziva web-sučelja QNAP NAS-a — sinkronizacijski klijent čiji cilj više ne odgovara. Jedan jedini priključak kucao je 962 puta.
- 65 Autodiscover upita — Outlook koji web-domenu smatra svojim Exchangeom
Takve se adrese nikad ne blokiraju. Blokada ne uklanja kvar, nego ga skriva — i pogađa onoga čiji je uređaj ionako pogrešno postavljen. Umjesto toga nastaje unos s tekstom nalaza i pogođenim domenama, iz kojeg po želji automatski nastaje tiket: po adresi točno jedan, a ako se zatvori i adresa ponovno upadne u oči, otvara se isti tiket, umjesto da nastane drugi.
Prepoznaju se QNAP, Synology, Exchange Autodiscover, ActiveSync
te WebDAV, CalDAV i CardDAV klijenti. Obrasci pritom navode
točne nazive datoteka i direktorije, nikad puke nastavke:
U istom direktoriju /cgi-bin/ bezazleni
sinkronizacijski pozivi leže odmah pored klasičnih sondi poput
printenv.pl.
Popis izuzetaka: adrese koje se nikad ne blokiraju
Cijena pogreške nije jednaka za sve adrese. Kod skenera iz podatkovnog centra lažni alarm ne košta ništa. Kod protustrane tunela između lokacija košta lokaciju.
Zato postoji drugi popis koji stoji ispred prvog: adrese i mreže koje se nikad ne blokiraju. Pritom ništa ne utišava — tko se nalazi na njemu, i dalje se provjerava i evidentira, samo posljedica izostaje. To je razlika u odnosu na izuzetak u vatrozidu: on čini slijepim, ovaj samo strpljivim.
Popunjava se svakodnevno iz dva izvora: iz samog vatrozida s pomoću svih VPN protustrana, kako se novo postavljeni tunel ne bi oslanjao na to da netko pomisli na popis blokiranih — i iz objavljenih adresnih raspona Googlea i Microsofta za njihove crawlere. Samo se tako pravi Googlebot može razlikovati od skenera koji se tako naziva. Tražilice se nikad ne smiju blokirati; tko ih isključi, svoju stranicu uklanja iz indeksiranja bez puta natrag.
Pritom vrijedi pravilo koje je važnije od usporedbe: Prazan odgovor nikad ne briše. Ako izvor ne odgovori, vrati prazan ili nerazumljiv odgovor, popis ostaje nepromijenjen. Popis izuzetaka koji se pri smetnji sam isprazni u najgorem mogućem trenutku povlači sve tunele sa sobom.
Ako unos na popisu izuzetaka sadrži kupca, svaki pogodak iz njegove mreže dodjeljuje se njemu. Pogrešna konfiguracija tako odmah ima kontakt osobu, a da nitko ne mora tražiti adrese.
Obvezni podaci i automatizirani skupljači podataka
Impresum nije obična stranica. Mora ostati dostupan ljudima, jer blokada na njemu stvara upravo povredu koju skupljač traži. Istodobno je to stranica na kojoj se nalaze ime i adresa — a time i cilj strojnog žetve.
Kod austrijskog vala opomena zbog uključenih Google fontova zapisnici su pokazali da pisma nisu potjecala iz pojedinačnih posjeta, nego iz automatiziranog masovnog obilaska: različiti, nepovezani hostovi u razmaku od milisekundi.
Web RBL to rješava snižavanjem umjesto izuzetkom. Kanonska
putanja /impressum ne odgovara nijednom obrascu i
uvijek ostaje dostupna. Tuđi načini pisanja poput
/impressum.php — kojih na Odoo stranici ne može
biti — prijavljuju se, a tko ne želi
prihvatiti strojnu žetvu, mijenja jedan parametar.
sitemap i robots iznimka su
i u načelu se ne mogu blokirati: ne sadrže
osobne podatke, a njihovo dohvaćanje zadatak je svakog
crawlera tražilica.
Domena i identifikator: što nedostaje u zapisniku pristupa
Zapisnik pristupa werkzeuga ne bilježi ni pozvani host ni identifikator pozivatelja. Odoo oba, naravno, dobiva — bez hosta ne bi mogao ni odabrati pravu web-stranicu kad ih je više. Naknadno se to, međutim, ne može pročitati.
Web RBL oboje bilježi po pogotku. To odgovara na dva pitanja na koja se inače ne može odgovoriti: koju web-stranicu pogrešna konfiguracija poziva — a time i kojem kupcu domena pripada — te posjećuje li adresa jednu stranicu ili sve. Više nepovezanih domena iste adrese obilježje su masovnog obilaska i povećavaju ocjenu.
Koliko identifikator znači, pokazala je analiza na jednoj od
naših web-stranica: više od sedamdeset posto ukupnog prometa
odnosilo se na jednog jedinog pozivatelja, raspoređenog na više od
stotinu adresa. Bez identifikatora to bi izgledalo kao distribuirani
scraper. Bio je to GPTBot, OpenAI-jev crawler
— stalno je iznova tražio robots.txt i
ponašao se potpuno ispravno.
Sigurnosni aspekti u pojedinostima
1. Prepoznavanje proxyja — najopasnije mjesto uopće
Ako Odoo radi iza reverse proxyja, a proxy_mode
je pogrešno postavljen, modul pri svakom zahtjevu vidi istu adresu:
adresu proxyja. Blokada bi tada istodobno isključila sve
posjetitelje.
Zato Web RBL prije svake blokade provjerava je li određivanje adrese
pouzdano. Zahtijeva proxy_mode zajedno s
zaglavljem za preusmjeravanje, odbija raditi ako preusmjeravanje stigne bez
proxy_mode, a jednako tako odbija i
kod više od jednog posrednog proxyja. U slučaju sumnje ne blokira se.
2. Vlastite mreže nikada
Privatni adresni rasponi, loopback, link-local i CGNAT čvrsto su isključeni. Ni pod kojim uvjetima ne mogu završiti na popisu, čak ni ručno. Isto vrijedi za tuđe popise: privatni i rezervirani rasponi te apsurdno velike mreže odbacuju se pri učitavanju.
3. Vlastita pogreška ne smije povući web-stranicu sa sobom
Cijela provjera odvija se u zaštiti koja hvata svaku pogrešku. Što ovdje pođe po zlu, zapisuje se, a zahtjev nastavlja nepromijenjen. Zaštitni modul koji pri vlastitoj pogrešci povuče web-stranicu sa sobom gori je nego nikakav. Svi upiti na putu zahtjeva odvijaju se i bez jezika preglednika posjetitelja i bez sortiranja po prevedenim poljima — posjetitelj s jezikom koji nije instaliran ne smije srušiti provjeru.
4. Promatrati prije blokiranja
Nakon instalacije blokiranje adresa s popisa kod običnih zahtjeva je isključeno. Sonde se odbijaju i evidentiraju, sve ostalo prolazi. Tako se nekoliko dana može pratiti tko doista završava na popisu, prije nego što netko bude isključen. Isto vrijedi za prepoznavanje ponašanja, popise prijetnji i pravila po zemljama: prvo prijaviti, blokirati nakon procjene.
5. Uski obrasci umjesto širokih mreža
Pogrešno prepoznat posjetitelj skuplji je od propuštene sonde.
Svaki obrazac zato nosi svoju razinu, koja se po obrascu
može promijeniti. Sam nastavak datoteke rijetko je dovoljan: kod
.php stoji 14.012 pravih sondi nasuprot šačici
starih poveznica, kod .asp je omjer obrnut. Takve
odluke treba mjeriti, a ne procjenjivati.
6. Ručno odobrenje ostaje na snazi
Tko adresu odobri, imao je razlog. Daljnji pogodak ne stavlja tu odluku neprimjetno izvan snage.
7. Popis je zaštićen, ali nije tajna
Krajnja točka zahtijeva token i bez valjanog tokena odgovara
s 404, a ne s 403 — time se
postojanje adrese uopće ne potvrđuje. Usporedba se odvija
u konstantnom vremenu. Sam popis ne sadrži ništa povjerljivo: sastoji
se od adresa koje su same pokucale kod nas.
8. Nikakvih tajni u evidenciji
Kod neuspjelih prijava bilježi se pokušano korisničko ime, nikad lozinka. Kod upravitelja baza podataka iz predanih se vrijednosti uopće ništa ne čita: tamo na prvom mjestu stoji glavna lozinka, a unos u popisu blokiranih završava u svakoj sigurnosnoj kopiji baze podataka. Licencni ključ za GeoLite2 nalazi se samo u sistemskom parametru i ni u jednom retku zapisnika.
9. Mamac ne odaje ništa iskoristivo
Po izboru Web RBL odgovara na sonde izmišljenim sadržajem koji sadrži jedinstvenu kanarinac-vrijednost. Tko tu vrijednost kasnije dohvati, pročitao je krivotvoreni odgovor i na temelju njega djelovao — pritom je lažni alarm isključen. Mamci ne sadrže nikakve iskoristive podatke, nikakve prave putanje i nikakve valjane pristupne podatke. Ova se funkcija isporučuje isključena, jer vidljivo mijenja ponašanje prema van.
Što modul ne može
Ne zamjenjuje vatrozid ni Web Application Firewall. Prepoznaje poznate obrasce sondiranja u putanjama, neuspjele prijave i upadljivo ponašanje — ne napade na obrasce, ne pokušaje ubacivanja u parametre.
Osim toga vidi samo ono što se vraća putem HTTP-a. Što napadač s otetim pristupom bazi podataka ili poštanskom sandučiću radi, ostaje nevidljivo — i upravo su zato kanarinac-vrijednosti putanje, a ne pristupni podaci.
I ne zamjenjuje pažnju: modul koji odbija
.env sonde ne čini bezopasnom .env datoteku koja je
neželjeno isporučena.
Dostupnost
Web RBL javno je dostupan pod licencom AGPL-3 i kod nas produktivno radi na pet web-stranica:
github.com/Alex0176/odoo-web-rbl
Modul zahtijeva Odoo 19 Community i nema
ovisnosti osim base i web.
Povezivanje s tiketima je opcionalno i ne zahtijeva određeni
sustav za tikete; bez njega se jednostavno ništa ne događa.
Zemlja podrijetla treba besplatnu GeoLite2 bazu podataka tvrtke MaxMind;
ako nedostaje, polje ostaje prazno, a sve ostalo radi
nepromijenjeno.
Za dalje: Kako Web RBL stane u cjelovitu sigurnosnu arhitekturu -- zajedno s vatrozidom, dvofaktorskom autentifikacijom i ovlastima, uključujući upute korak po korak: Kako ispravno kombinirati sigurnosnu arhitekturu Odoo 19.
Pitanja, primjedbe i izvješća o pogreškama rado primamo — najradije kao issue na GitHubu.