Pirmkods: github.com/Alex0176/odoo-web-rbl — AGPL-3, brīvi izmantojams.
Kas internetā darbina Odoo serveri, tam nāk viesi. Ne reizēm, bet nepārtraukti. Septiņpadsmit dienu laikā mēs savās piecās tīmekļa vietnēs esam reģistrējuši un izvērtējuši 731 297 pieprasījumus. 110 511 no tiem nebija apmeklētāji, bet automatizēta ievainojamību, piekļuves datu un konfigurācijas failu meklēšana.
Šis raksts apraksta Web RBL – atvērtā koda moduli Odoo 19 Community, kas šo datplūsmu atpazīst, novērtē, reģistrē un noraida – un kas bloķēšanas sarakstu publicē kā RBL sarakstu, tātad formātā, ko ugunsmūri un reverse proxy lasa tieši. Visi skaitļi nāk no reālas ekspluatācijas.
Ko modulis spēj – funkciju pārskats
| Funkcija | Ko tā dara | Piegāde |
|---|---|---|
| Šablonu atpazīšana | Atpazīst zondēšanu pēc ceļa un paplašinājuma: .env, .git, konfigurācijas faili, mākoņa atslēgas, CI/CD būvēšanas instrukcijas, WordPress, PHP, ceļa šķērsošana, datubāzu pārvaldnieks, GraphQL, komandu izpilde caur /api/fs/exec un līdzīgām saskarnēm | bloķēt |
| Trīs līmeņi katram šablonam | bloķēt, skaitīt vai ziņot – katram šablonam pārslēdzams, bez koda | katram šablonam |
| Sliekšņi | Cik trāpījumu viena šablona gadījumā, pirms tiek bloķēts; pieteikšanās gadījumā desmit | 10 pieteikšanās gadījumā |
| Pieteikšanās aizsardzība | Neizdevušās pieteikšanās caur veidlapu un XML-RPC/JSON-RPC, neizdevušās sesiju pārbaudes, piekļuves datubāzu pārvaldniekam – datubāzē, nevis operatīvajā atmiņā | ieslēgts |
| Botu atpazīšana pieteikšanās vietā | Kas ignorē gaidīšanas paziņojumu pēc desmit neveiksmīgiem mēģinājumiem un turpina klauvēt, tiek bloķēts nekavējoties | bloķēt |
| Uzvedības atpazīšana | Adreses, kas piecās minūtēs rada divdesmit kļūdainas lapas un gandrīz nevienu trāpījuma lapu – tātad minēšana, nevis lasīšana | ziņot |
| Vērtējums 0–100 | Cik droši ir, ka aiz adreses stāv uzbrucējs? No šablona smaguma, dažādu šablonu skaita, izteiktām dienām, skartajiem domēniem un trāpījumu skaita – ar pamatojumu vienkāršā tekstā | ieslēgts |
| Pieteikšanās bloķēšana pēc vērtējuma | No iestatāma vērtējuma pieteikšanās ir aizliegta, tīmekļa vietne paliek lasāma | no 40 |
| Aizdomas par nozagtiem piekļuves datiem | Veiksmīga pieteikšanās no aizdomīgas adreses tiek paziņota un pēc vēlēšanās piešķirta kā uzdevums — reizi par adresi un dienu | ieslēgts |
| Apdraudējumu saraksti | Tor izejas mezgli, Spamhaus DROP, FireHOL Level 1, blocklist.de ir jau sakonfigurēti; jebkuru citu RBL sarakstu var pievienot pēc adreses, ikdienas salīdzināšana, katram sarakstam sava pakāpe | ziņot |
| Nav piekļuves pieteikšanās lapai | Ceturtā pakāpe sarakstiem un valstīm: tīmekļa vietni var lasīt, pieteikšanās forma un saskarnes ir slēgtas — piemērota atbilde Tor tīklam | Opcija |
| Izcelsmes valsts | Valsts pie katra trāpījuma un adreses, izmantojot GeoLite2; moduļa datubāzi atjaunina pats ar bezmaksas licences atslēgu | rādīt |
| Valstu noteikumi | Bloķēt, liegt piekļuvi pieteikšanās lapai, ziņot vai skaidri atļaut — katrai valstij atsevišķi, apzināti bez noklusējuma | nav |
| Kļūdainas konfigurācijas | QNAP, Synology, Exchange Autodiscover, ActiveSync, WebDAV/CalDAV/CardDAV tiek atpazīti, nekad netiek bloķēti un ar konstatējumu un skarto domēnu tiek ievietoti darba sarakstā | ziņot |
| Biļete par adresi | No konstatējuma pēc vēlēšanās rodas biļete — tieši viena par adresi; slēgta biļete tiek atvērta no jauna, nevis dublēta | izslēgts |
| Obligātās lapas un vācēji | Kanoniskais impresuma ceļš vienmēr paliek pieejams; automatizēta svešu rakstības variantu izmēģināšana tiek atpazīta un pēc vēlēšanās bloķēta | ziņot |
| Baltais saraksts | Adreses un tīkli, kas nekad netiek bloķēti; saraksts katru dienu papildinās no ugunsmūra (VPN pretpunkti) un no Googlebot un Bingbot publicētajiem adrešu diapazoniem | ieslēgts |
| Klientu piesaiste | Trāpījums no klienta tīkla tiek piesaistīts šim klientam — no baltā saraksta, nekad ne uz minējumu pamata | ieslēgts |
| Domēns un identifikators pie katra trāpījuma | Kura tīmekļa vietne tika izsaukta un ar kādu User-Agent — abu piekļuves žurnālā trūkst | ieslēgts |
| Izvērtējums | Diagramma un pivot pārskats par visiem trāpījumiem: pēc šablona, dienas, domēna, valsts, adreses | ieslēgts |
| Ēsma | Zondes saņem izdomātas atbildes ar kanārijvērtību; kas to vēlāk atver, tas atbildes ir izlasījis | izslēgts |
| RBL piegāde | Bloķēšanas saraksts kā tīrs adrešu saraksts vai JSON atsevišķā, ar token aizsargātā adresē — HAProxy, OPNsense un jebkuram ugunsmūrim, kas nolasa URL sarakstus | ieslēgts |
Viss, kas tiek piegādāts ar ziņot, izslēgts vai opcija, ir tā darīts apzināti: kas bloķēšanu ieslēdz, lai to dara tāpēc, ka dažas dienas ir vērojis, kas tajā iekļūst — nevis tāpēc, ka noklusējums tā noteica.
Izvērtējums: trāpījumi pa šabloniem septiņu dienu laikā. Augstākā josla ir .env failu meklēšana.
RBL saraksti: standartizēts veids, kā piegādāt bloķēšanas
RBL nozīmē Real-time Blackhole List. Šis jēdziens nāk no e-pasta pasaules, kur Spamhaus un citi kopš deviņdesmitajiem gadiem publicē sarakstus ar ļaunprātīgām sūtītāju adresēm. Princips ir neticami vienkāršs un tieši tāpēc tik izplatīts: viena adrese rindā, pieejama pa HTTP, regulāri ielādēta no jauna. Nav formāta, kas vispirms jāparsē, nav saskarnes, kurai vajadzīgs rīks.
Praktiski katrs ugunsmūris un katrs reversais starpniekserveris var nolasīt šādu sarakstu un izveidot no tā noteikumus. Ražotāji to dēvē dažādi, mehānisms visur ir tas pats:
- OPNsense un pfSense — URL Table Alias: adrešu saraksts tiek ielādēts pa HTTP, izmantots kā aliass ugunsmūra noteikumos, atjaunināšana ik stundu vai katru dienu
- HAProxy — ACL faili un Maps:
src -f sperrliste.txthttp-request denynoteikumā, pārlādējams darbības laikā ar API bez restartēšanas - nginx — geo modulis ar iekļautu adrešu failu vai
denydirektīvas no ģenerētaincludefaila - Fortinet FortiGate — External Block List jeb Threat Feed: URL, no kura ugunsmūris iegūst IP sarakstu un izmanto to politikās
- Palo Alto Networks — External Dynamic List (EDL): tas pats princips, kā atsevišķs objekta tips drošības politikās
- Check Point — Custom Intelligence Feeds un IP Block Lists pa URL
- Cisco Secure Firewall (Firepower) — Security Intelligence Feeds ar pašu saraksta avotiem
- Sophos Firewall — Third-Party Threat Feeds: adrešu saraksti no URL kā avots bloķēšanas noteikumiem
- Juniper SRX — Dynamic Address Entries no feed avotiem
- MikroTik RouterOS — Address Lists, aizpildīti ar skriptu un
fetchno URL - CrowdSec — pašu saraksti kā avots bouncer komponentiem katrā atbalstītajā sistēmā
Tieši šajā formātā Web RBL piegādā savu bloķēšanas sarakstu. Ugunsmūris noraida paketes, pirms tās sasniedz tīmekļa serveri — un līdz ar tām arī katru citu tās pašas adreses mēģinājumu, piemēram, uz pasta serveri vai VPN vārteju.
Abi virzieni, bet pareizā vieta
Ceļš darbojas arī pretējā virzienā: Web RBL var ievadīt jebkuru RBL sarakstu — viens URL, viena pakāpe, gatavs. Tor izejas mezgli, Spamhaus DROP, FireHOL un blocklist.de ir jau sakonfigurēti, citus var pievienot ar trim klikšķiem. Modulis sadala katru sarakstu adrešu diapazonos un pārbauda katru pieprasījumu pret tiem dažās mikrosekundēs.
Un tomēr: lietderīgāk ir svešus sarakstus izmantot ugunsmūrī šim modulim pa priekšu. Trīs iemeslu dēļ. Ugunsmūris redz visus pakalpojumus, ne tikai HTTP — adresei no Spamhaus saraksta jāatduras arī pie pasta servera un VPN. Tas noraida paketu līmenī, pirms savienojums vispār izveidojas, un lietojumprogrammas serverim tas neprasa neko. Un tā ir vieta, kur šādi saraksti tāpat tiek uzturēti; otra kopija lietojumprogrammā ir otra vieta, kas var novecot.
Kam tad saraksti modulī ir noderīgi: tam, ko ugunsmūris nespēj. Tas nepazīst pieteikšanās formu. Web RBL var adresei no Tor saraksta liegt piekļuvi pieteikšanās lapai, tomēr piegādāt tīmekļa vietni — kas vēlas anonīmi lasīt, tam tas jāļauj; kas anonīmi vēlas izmēģināt paroles, tam nē. Un tas var ziņot par veiksmīgu pieteikšanos no sarakstā iekļautas adreses kā par aizdomu gadījumu. Abiem vajadzīgs saraksts tur, kur notiek pieteikšanās.
Vērtējums, nevis nojauta
Adrese, kas vienreiz ir pieprasījusi /wp-login.php,
ir kas cits nekā tā, kas divās dienās ar piecām dažādām
šablonu kombinācijām ir apmeklējusi trīs domēnus. Web RBL to pārrēķina
vērtējumā no 0 līdz 100 — no tā, ko pats ir
redzējis, bez svešiem pakalpojumiem un bez vaicājumiem uz āru.
Viens ieraksts: 99 trāpījumi, vērtējums 84 un pamatojums vienkāršā tekstā — smagākais šablons, pieci dažādi nopietni šabloni, divas aizdomīgas dienas, vairāk nekā divdesmit trāpījumu.
Vērtējums nosaka divas lietas. No iestatāmas vērtības pieteikšanās ir aizliegta — tīmekļa vietne paliek lasāma, bet kas jau meklējis piekļuves datus, tas nesaņem iespēju izmēģināt atrastos. Un veiksmīga pieteikšanās no adreses ar vērtējumu tiek paziņota: tad kāds vairs nav minējis, bet zinājis. Vai nu likumīgais lietotājs bija ceļā, vai piekļuves dati ir nozagti — modulis to neizlemj, bet nodod tam, kas var painteresēties. Pati parole tajā nekur netiek aiztikta.
Bloķēšanas saraksts, filtrēts pēc vērtējuma no 40: trāpījumu skaits, aizdomīgās dienas, skartie domēni un pēdējais ceļš pa adresēm.
Ko Web RBL aizsargā — aizsardzības efekts sīkāk
1. Piekļuves dati paliek neatklāti
Lielākā izmērītā uzbrukumu klase nemeklē Odoo ievainojamības, bet atstātus noslēpumus. Septiņpadsmit dienu laikā:
- 57 721 pieprasījumi pēc
.envfailiem — tur atrodas datubāzu paroles, API atslēgas un sesiju noslēpumi - 5 535 pieprasījumi pēc konfigurācijas failiem
- 4 388 pieprasījumi pēc mākoņa piekļuves datiem:
credentials.json,service-account.json,firebase-adminsdk.json,rclone.conf,.git-credentials - 2 811 pieprasījumi pēc
.gitdirektorijām — kas tādu atrod, lejupielādē pilnu pirmkodu ar vēsturi - 1 907 pieprasījumi pēc būvēšanas instrukcijām, piemēram,
.github/workflows/deploy.ymlvai.gitlab-ci.yml, kur ir norādīti reģistri un atslēgu nosaukumi
Izšķirošs nav pieprasījumu skaits, bet
dažādu adrešu skaits: /credentials.json nāca
no 98 adresēm, /.git-credentials no 92. Tas nav
viens skeneris, bet standarta repertuārs, kas visā pasaulē darbojas
vienlaikus.
2. Pieteikšanās mēģinājumi aiziet tukšumā — pastāvīgi
Odoo ir sava bremze pret paroļu izmēģināšanu. Tai ir trīs ierobežojumi, kas ir dokumentēti pašā Odoo pirmkodā: skaitītājs atrodas darba procesa operatīvajā atmiņā un tiek atiestatīts pie katras restartēšanas, tas tikai aizkavē, nevis bloķē, un tas skaita tikai mēģinājumus, kas nonāk līdz paroles pārbaudei.
Web RBL pieslēdzas tajās pašās vietās, bet raksta datubāzē. Tādējādi ir spēkā:
- Stāvoklis pārdzīvo katru restartēšanu un ir spēkā visiem darba procesiem
- Tiek uzskaitīti abi ceļi: pieteikšanās forma
/web/loginun saskarnes/xmlrpc/2/commonun/jsonrpc - Tiek uzskaitīti arī mēģinājumi, kas nekad nenonāk līdz paroles pārbaudei — piemēram, pieteikšanās bez derīga sesijas pazīmes
- Neizdevusies piekļuve datubāzu pārvaldniekam tiek ieskaitīta; tas ir smagākais pieteikšanās mēģinājums vispār
Pieteikšanās slieksnis ir desmit, un iemesls ir mērījums: no deviņām neizdevušām pieteikšanās septiņpadsmit dienās lielākā daļa nāca no klientiem, kuri paši iestatīja piekļuvi vēl vienā ierīcē un ievadīja nepareizu domēnu — vienā gadījumā savējo, tikai ar defisi punkta vietā. Bloķēšana pie pirmā neveiksmīgā mēģinājuma būtu skārusi nevis uzbrucējus, bet klientus iestatīšanas laikā.
Kas turpretī turpina klauvēt, kaut gan serveris jau ir atbildējis “lūdzu, drīz mēģiniet vēlreiz”, tiek bloķēts nekavējoties. Šo ziņojumu lasa cilvēks un gaida; kas to ignorē, ir programma. Atsevišķs šablons ar slieksni nulle noķer tieši šo gadījumu, un tas nevar skart kolēģi: tur nonāk tikai tas, kam jau ir desmit neveiksmīgi mēģinājumi un kas pēc tam turpina.
3. Uzbrukums serverim vairs neko neizmaksā
Zonde uz ceļu, piemēram, /@fs/../../.env, pirms
moduļa bija dārga: Odoo meklē kļūdas lapu, renderē to, paklūp
adreses veidošanā pie punktu segmentiem un tādēļ
neizdodas arī ar kļūdas lapas kļūdas lapu. Divi
steka žurnāli uz vienu zondi. Septiņpadsmit dienās tika izmērītas 28 401 šāda kļūda,
klāt 9 467 secīgas kļūdas.
Web RBL iejaucas ir.http._match, tātad pirms
ceļa noteikšanas. Atbilde tiek sniegta bez veidnes, bez piekļuves datubāzei
uz bloķēšanas pārbaudes pusi un bez žurnāla rindas. Pārbaude
pret balto sarakstu, apdraudējumu sarakstiem un valstu noteikumiem notiek no
kešatmiņas pa sakārtotiem adrešu diapazoniem — dažas
mikrosekundes, arī ar vairāk nekā trīsdesmit tūkstošiem diapazonu.
4. Ugunsmūris izmet uzbrucēju, pirms tas ir ieradies
Bloķēšanas saraksts tiek publicēts kā RBL saraksts, ko HAProxy un OPNsense nolasa tieši. Uzbrucējs tādējādi vispār nesasniedz tīmekļa serveri — un arī nevienu citu pakalpojumu uz tā paša resursdatora. Vienreiz kā ļaunprātīga atpazīta piekļuve tādējādi aizsargā arī visu iekārtu ar atpakaļejošu spēku.
Trīs pakāpes: bloķēt, skaitīt, ziņot
Ne katrs pieprasījums tukšumā ir uzbrukums. Tāpēc Web RBL izšķir trīs pakāpes, un pakāpi var mainīt katram šablonam, neskarot kodu.
| Pakāpe | Izraisošais pieprasījums | Sekas adresei |
|---|---|---|
| bloķēt | tiek noraidīts | bloķēta uz 24 stundām, pēc trim aizdomīgām dienām — pastāvīgi |
| skaitīt | tiek izpildīts | tikai uzskaitīts, bez bloķēšanas |
| ziņot | tiek izpildīts | uzskaitīts ar konstatējuma tekstu, nekad netiek bloķēts |
Apdraudējumu sarakstiem un valstīm ir ceturtā: nav piekļuves pieteikšanās lapai. Tīmekļa vietne paliek lasāma, pieteikšanās forma un saskarnes ir slēgtas. Tas ir vidusceļš visam, kas ir aizdomīgs, bet nav obligāti ļaunprātīgs — Tor, kāds datu centra diapazons, valsts bez klientiem.
Kādi uzbrukumi tiek atpazīti
Visi šabloni ir pārbaudīti pret reālu datplūsmu. Dažādu adrešu skaits tiek apzināti norādīts blakus — tas parāda, vai šablons trāpa vienam skenerim vai plaši izplatītai rīcībai.
| Uzbrukumu klase | Pieprasījumi | Adreses |
|---|---|---|
.env nolasīšana | 57.721 | 223 |
| PHP zondes | 12.237 | 256 |
| Ceļa traversēšana ar vērtīgu mērķi | 10.046 | 64 |
| Konfigurācijas faili | 5.535 | 114 |
| Mākoņa piekļuves atslēgas | 4.388 | 152 |
| WordPress zondes | 3.366 | 385 |
.git nolasīšana | 2.811 | 255 |
| Odoo izlūkošana (datubāzu pārvaldnieks, versijas vaicājums) | 2.500 | 213 |
MI rīku ķēdes un komandu izpilde (/mcp, /api/fs/exec) | 2.450 | 74 |
| Būvēšanas instrukcijas (CI/CD) | 1.907 | 88 |
| GraphQL galapunkti | 1.878 | 71 |
Ievērības cienīga ir jaunākā klase. /api/fs/exec
tika pieprasīts 369 reizes no 54 dažādām adresēm — tā
nav lasīšanas piekļuve, bet mēģinājums izpildīt komandas. Šādu
mērķu pirms diviem gadiem nebija; tie nāk no jaunu MI rīku
saskarnēm un uzdevumu rindām. Kas savu aizsardzību vērš tikai
uz WordPress un PHP, tam par to nekas nav zināms. Vērtējumā
šī klase attiecīgi smagi nosver.
Apdraudējumu saraksti un izcelsmes valsts
Četri saraksti, 32 851 adrešu diapazons, visi uz “tikai ziņot”. Katrs cits saraksts ir viena adrese un viena pakāpe.
Svešs saraksts ir apgalvojums, ko izvirza kāds cits
tādu iemeslu dēļ, kurus mēs nezinām, par datplūsmu, ko mēs
nekad neesam redzējuši. Tas var būt nepareizs, novecojis vai paredzēts
citam mērķim: blocklist.de galvenokārt vāc
adreses, kas citur ir izmēģinājušas SSH pieteikšanos, un tas
var maz pateikt par tīmekļa serveri. Tāpēc Web RBL tur svešus sarakstus
atsevišķi no savējā bloķēšanas saraksta, un tāpēc noklusējums ir
ziņot. Un paša baltais saraksts vienmēr uzvar: klients, ko
mēs pazīstam, sver vairāk nekā trešās personas vērtējums.
Izcelsmes valsts ir pie katra trāpījuma un katras adreses. Vērtēšanai tā ir neaizvietojama — pieteikšanās mēģinājums no savas valsts pulksten desmitos no rīta ir kas cits nekā tāds no valsts, kurā nav neviena klienta. Vispārējai bloķēšanai tā ir maz piemērota, un to apliecina paši skaitļi: uzbrucēji mūsu sarakstā nāca pārsvarā no mākoņa diapazoniem Beļģijā, Somijā un Nīderlandē. Bloķēšana visam ārpus vācu valodas telpas tos nebūtu skārusi — toties pašu darbiniekus atvaļinājumā un klientus komandējumā.
Valstu noteikumi tiek piegādāti tukši, un skats paskaidro, kāpēc.
Kļūdainas konfigurācijas ziņot, nevis bloķēt
Biežākais gadījums reālajā datplūsmā nav ne uzbrukums, ne apmeklētājs, bet bojāta programmatūra, kas tīmekļa serveri uzskata par kaut ko citu:
- 1 367 QNAP NAS tīmekļa saskarnes izsaukumi — sinhronizācijas klients, kura mērķis vairs nav pareizs. Viens vienīgs pieslēgums klauvēja 962 reizes.
- 65 Autodiscover vaicājumi — Outlook, kas tīmekļa domēnu uzskata par savu Exchange
Šādas adreses nekad netiek bloķētas. Bloķēšana defektu neizlabo, bet to slēpj — un skar to, kura ierīce jau tā ir nepareizi iestatīta. Tā vietā rodas ieraksts ar konstatējuma tekstu un skartajiem domēniem, no kura pēc vēlēšanās automātiski rodas biļete: tieši viena par adresi, un ja tā tiek aizvērta un adrese atkal kļūst pamanāma, tā pati biļete atveras no jauna, nevis rodas otra.
Tiek atpazīti QNAP, Synology, Exchange Autodiscover, ActiveSync
un WebDAV, CalDAV un CardDAV klienti. Šabloni norāda
precīzus failu nosaukumus un direktorijas, nekad ne tikai paplašinājumus:
Tajā pašā direktorijā /cgi-bin/ nekaitīgie
sinhronizācijas izsaukumi atrodas tieši blakus klasiskām zondēm, piemēram,
printenv.pl.
Baltais saraksts: adreses, kas nekad netiek bloķētas
Kļūdas cena nav visām adresēm vienāda. Skeneram no datu centra viltus trauksme neko neizmaksā. filiāles tuneļa pretpunktam tā izmaksā visu filiāli.
Tāpēc ir otrs saraksts, kas stāv pirms pirmā: adreses un tīkli, kas nekad netiek bloķēti. Tas neko neklusina — kas tajā ir, tas turpina tikt pārbaudīts un uzskaitīts, tikai sekas atkrīt. Tā ir atšķirība no izņēmuma ugunsmūrī: tas padara aklu, šis tikai padara pacietīgu.
To katru dienu papildina no diviem avotiem: no paša ugunsmūra ar visiem VPN pretpunktiem, lai no jauna iestatīts tunelis nebūtu atkarīgs no tā, vai kāds padomā par bloķēšanas sarakstu — un no Google un Microsoft publicētajiem adrešu diapazoniem to rāpuļprogrammām. Tikai tā var atšķirt īstu Googlebot no skenera, kas sevi tā dēvē. Meklētājprogrammas nekad nedrīkst tikt bloķētas; kas tās bloķē, tas savu lapu izņem no indeksēšanas bez atpakaļceļa.
Šeit ir spēkā noteikums, kas ir svarīgāks par salīdzināšanu: Tukša atbilde nekad nedzēš. Ja avots neatbild, atbild tukši vai nesaprotami, saraksts paliek nemainīgs. Baltais saraksts, kas traucējuma gadījumā iztukšojas pats, sliktākajā iedomājamā brīdī paņem līdzi visus tuneļus.
Ja baltā saraksta ierakstam ir piesaistīts klients, katrs trāpījums no viņa tīkla tiek piesaistīts viņam. Kļūdainai konfigurācijai tādējādi uzreiz ir kontaktpersona, un nevienam nav jāmeklē adreses uzziņās.
Obligātā informācija un automatizēti datu vācēji
Impresums nav parasta lapa. Tam jāpaliek cilvēkiem pieejamam, jo bloķēšana uz tā rada tieši to pārkāpumu, ko vācējs meklē. Reizē tā ir lapa, kurā ir vārds un adrese — un tādējādi mašīnveida ražas novākšanas mērķis.
Austrijas brīdinājuma vēstuļu vilnī par iekļautiem Google fontiem žurnāli parādīja, ka vēstules nenāca no vienreizējiem apmeklējumiem, bet no automatizēta vispārēja uzbrukuma: dažādi, savā starpā nesaistīti resursdatori ar milisekunžu intervālu.
Web RBL to risina ar pazeminātu pakāpi, nevis izņēmumu. Kanoniskais
ceļš /impressum neatbilst nevienam šablonam un
vienmēr paliek pieejams. Svešas rakstības variantus, piemēram,
/impressum.php — kuru Odoo lapā
nevar būt — tiek paziņoti, un kas mašīnveida ražas
novākšanu nevēlas pieņemt, tas pārslēdz vienu parametru.
sitemap un robots no tā ir izņemti
un principā nav bloķējami: tie nesatur
nekādu personas datu informāciju, un to ielāde ir katras
meklētājprogrammas rāpuļprogrammas uzdevums.
Domēns un identifikators: kā trūkst piekļuves žurnālā
werkzeug piekļuves žurnāls neraksta ne izsaukto resursdatoru, ne izsaucēja identifikatoru. Odoo abus saņem protams — bez resursdatora tas vairāku tīmekļa vietņu gadījumā vispār nevarētu izvēlēties pareizo. Bet vēlāk to nolasīt nevar.
Web RBL abus saglabā pie katra trāpījuma. Tas atbild uz diviem jautājumiem, uz kuriem citādi atbildēt nevar: kuru tīmekļa vietni kļūdaina konfigurācija izsauc — un tātad, kuram klientam domēns pieder — un vai adrese apmeklē vienu lapu vai visas. Vairāki savā starpā nesaistīti viena un tā paša adreses domēni ir vispārējā uzbrukuma pazīme, un tie paaugstina vērtējumu.
Cik daudz identifikators nozīmē, parādīja kādas
mūsu tīmekļa vietnes izvērtējums: vairāk nekā septiņdesmit procentu visas datplūsmas
tur nāca no viena vienīga izsaucēja, sadalīta pa vairāk nekā
simts adresēm. Bez identifikatora tas būtu izskatījies kā izkliedēts
skrāpētājs. Tas bija GPTBot, OpenAI
rāpuļprogramma — tā atkal un atkal pieprasīja robots.txt un
uzvedās pilnīgi korekti.
Drošības aspekti sīkāk
1. Starpniekservera noteikšana — vispār bīstamākā vieta
Ja Odoo darbojas aiz reversā starpniekservera un proxy_mode
ir iestatīts nepareizi, modulis pie katra pieprasījuma redz vienu un to pašu adresi:
starpniekservera adresi. Bloķēšana tad vienlaikus bloķētu
visus apmeklētājus.
Tāpēc Web RBL pirms katras bloķēšanas pārbauda, vai adreses noteikšana
ir uzticama. Tas pieprasa proxy_mode kopā ar
pāradresēšanas galveni, atsakās strādāt, ja pāradresēšana
ienāk bez proxy_mode, un atsakās
tāpat, ja ir vairāk nekā viens starpposma starpniekserveris. Šaubu gadījumā netiek
bloķēts.
2. Pašu tīklus nekad
Privātie adrešu diapazoni, loopback, link-local un CGNAT ir pastāvīgi izņemti. Tie nekādos apstākļos nevar nonākt sarakstā, arī ne ar roku. Tas pats attiecas uz svešiem sarakstiem: privātie un rezervētie diapazoni, kā arī absurdi lieli tīkli tiek noraidīti ielasīšanas laikā.
3. Pašu kļūda nedrīkst aizvest līdzi tīmekļa vietni
Visa pārbaude darbojas aizsargblokā, kas noķer katru kļūdu. Kas šeit noiet greizi, tiek reģistrēts, un pieprasījums turpina darbu nemainīts. Aizsardzības modulis, kas pie savas kļūdas aizved līdzi tīmekļa vietni, ir sliktāks par nekādu. Visi vaicājumi pieprasījuma ceļā turklāt darbojas bez apmeklētāja pārlūka valodas un bez kārtošanas pēc tulkotiem laukiem — apmeklētājs ar neuzstādītu valodu nedrīkst likt pārbaudei neizdoties.
4. Novērot pirms bloķēšanas
Pēc instalēšanas sarakstā iekļauto adrešu bloķēšana pie parastiem pieprasījumiem ir izslēgta. Zondes tiek noraidītas un uzskaitītas, viss pārējais tiek izpildīts. Tā var dažas dienas lasīt līdzi, kas patiesībā nonāk sarakstā, pirms kāds tiek bloķēts. Tas pats attiecas uz uzvedības atpazīšanu, apdraudējumu sarakstiem un valstu noteikumiem: vispirms ziņot, bloķēt pēc apskates.
5. Šauri šabloni, nevis plaši tīkli
Kļūdaini atpazīts apmeklētājs ir dārgāks par nepamanītu zondi.
Katram šablonam tāpēc ir sava pakāpe, un to var mainīt katram šablonam.
Faila paplašinājuma vien reti pietiek: pie
.php ir 14 012 īstas zondes pret saujiņu
veco saišu, pie .asp attiecība ir pretēja. Šādi
lēmumi jāmēra, nevis jānovērtē.
6. Ar roku piešķirta atļauja paliek spēkā
Kas adresi atļauj, tam bija iemesls. Vēl viens trāpījums šo lēmumu klusējot neatceļ.
7. Saraksts ir aizsargāts, bet nav noslēpums
Galapunkts pieprasa token un bez derīga token atbild
ar 404, nevis ar 403 — adreses
esamība tādējādi vispār netiek apstiprināta. Salīdzināšana notiek
konstantā laikā. Pats saraksts nesatur neko konfidenciālu: tas
sastāv no adresēm, kas pašas ir pie mums pieklauvējušas.
8. Nekādu noslēpumu uzskaitē
Pie neizdevušām pieteikšanās tiek atzīmēts mēģinātais lietotājvārds, nekad ne parole. Pie datubāzu pārvaldnieka no nodotajām vērtībām netiek nolasīts nekas: tur pašā priekšā ir galvenā parole, un ieraksts bloķēšanas sarakstā nonāk katrā datubāzes rezerves kopijā. GeoLite2 licences atslēga ir tikai sistēmas parametrā un nevienā žurnāla rindā.
9. Ēsma neatklāj neko izmantojamu
Pēc izvēles Web RBL atbild uz zondēm ar izdomātu saturu, kas satur nepārprotamu kanārijvērtību. Kas šo vērtību vēlāk atver, ir izlasījis viltoto atbildi un pēc tam rīkojies — viltus trauksme tādējādi ir izslēgta. Ēsmas nesatur nekādu izmantojamu informāciju, nekādus īstus ceļus un nekādus derīgus piekļuves datus. Šī funkcija tiek piegādāta izslēgta, jo tā maina uzvedību uz āru redzamā veidā.
Ko modulis nespēj
Tas neaizstāj ne ugunsmūri, ne tīmekļa lietojumprogrammu ugunsmūri. Tas atpazīst zināmus zondēšanas šablonus ceļos, neizdevušās pieteikšanās un aizdomīgu uzvedību — nevis uzbrukumus formām, nevis ievadīšanas mēģinājumus parametros.
Turklāt tas redz tikai to, kas atgriežas pa HTTP. Ko uzbrucējs ar nozagtām datubāzes vai pastkastes piekļuvēm dara, paliek neredzams — un tieši tāpēc kanārijvērtības ir ceļi, nevis piekļuves dati.
Un tas neaizstāj rūpību: modulis, kas
noraida .env zondes, nepadara nekaitīgu kļūdaini
piegādātu .env failu.
Pieejamība
Web RBL ir publiski pieejams ar AGPL-3 licenci un mums darbojas produktīvi piecās tīmekļa vietnēs:
github.com/Alex0176/odoo-web-rbl
Modulim vajadzīgs Odoo 19 Community, un tam nav
atkarību, izņemot base un web.
Biļešu sistēmas pieslēgums ir izvēles un neprasa konkrētu
biļešu sistēmu; bez tādas vienkārši nekas nenotiek.
Izcelsmes valstij vajadzīga bezmaksas MaxMind GeoLite2 datubāze;
ja tās nav, lauks paliek tukšs un viss pārējais darbojas
nemainīti.
Turpmākai lasīšanai: Kā Web RBL iekļaujas pilnā drošības arhitektūrā -- kopā ar ugunsmūri, divfaktoru autentifikāciju un atļaujām, ieskaitot soli pa solim instrukciju: Odoo 19 drošības arhitektūras pareiza kombinēšana.
Jautājumus, piezīmes un kļūdu ziņojumus mēs labprāt pieņemam — vislabāk kā issue GitHub.