Siirry sisältöön

Odoo 19 Community: Web RBL – estolista hyökkäysliikenteelle omilla verkkosivuilla

24. syyskuuta 2026 kirjoittanut
Odoo 19 Community: Web RBL – estolista hyökkäysliikenteelle omilla verkkosivuilla

Lähdekoodi: github.com/Alex0176/odoo-web-rbl — AGPL-3, vapaasti käytettävissä.

Se, joka ylläpitää Odoo-palvelinta internetissä, saa vieraita. Ei satunnaisesti vaan taukoamatta. Seitsemäntoista päivän aikana olemme kirjanneet viidellä verkkosivustollamme ylös ja analysoineet 731 297 pyyntöä. 110 511 niistä ei ollut kävijöitä, vaan automatisoitua haavoittuvuuksien, tunnistetietojen ja konfiguraatiotiedostojen etsintää.

Tämä artikkeli kuvaa Web RBL:n, avoimen lähdekoodin moduulin Odoo 19 Communitylle, joka tunnistaa tämän liikenteen, arvioi sen, kirjaa sen ja torjuu sen — ja joka julkaisee estolistan RBL-listana, eli muodossa, jonka palomuurit ja käänteiset välityspalvelimet (Reverse Proxy) lukevat suoraan. Kaikki luvut ovat peräisin tuotantokäytöstä.

Mitä moduuli osaa — toiminnot yhdellä silmäyksellä

ToimintoMitä se tekeeToimitus
MallintunnistusTunnistaa luotaukset polusta ja päätteestä: .env, .git, konfiguraatiotiedostot, pilviavaimet, CI/CD-rakennusohjeet, WordPress, PHP, polun läpikäynti (Path Traversal), tietokannan hallintatyökalut, GraphQL, komentojen suoritus polun /api/fs/exec ja vastaavien rajapintojen kauttaestä
Kolme tasoa mallia kohdenestä, laske tai ilmoita — muutettavissa mallikohtaisesti, ilman koodiamallikohtainen
KynnysarvotNäin monta saman mallin osumaa ennen kuin estetään; kirjautumisille kymmenen10 kirjautumisessa
Kirjautumisen torjuntaEpäonnistuneet kirjautumiset lomakkeen ja XML-RPC/JSON-RPC:n kautta, epäonnistuneet istuntotarkistukset, pääsyt tietokannan hallintatyökaluun — tietokannassa, ei keskusmuistissapäällä
Bottitunnistus kirjautumisessaSe, joka ohittaa odotusilmoituksen kymmenen epäonnistuneen yrityksen jälkeen ja jatkaa koputtamista, estetään välittömästiestä
Käyttäytymisen tunnistusOsoitteet, jotka tuottavat viidessä minuutissa kaksikymmentä virhesivua ja tuskin yhtään osumasivua — eli arvaavat lukemisen sijaanilmoita
Arvio 0–100Kuinka varmaa on, että osoitteen takana on hyökkääjä? Mallin vakavuudesta, eri mallien määrästä, poikkeavista päivistä, kohteena olevista toimialueista ja osumien määrästä — perusteluineen selkokielelläpäällä
Kirjautumisen esto arvion perusteellaSäädettävästä arviosta alkaen kirjautuminen on kielletty, verkkosivusto pysyy luettavana40:stä alkaen
Epäilys varastetuista tunnistetiedoistaOnnistunut kirjautuminen epäilyttävästä osoitteesta ilmoitetaan ja halutessa osoitetaan tehtäväksi — kerran osoitetta ja päivää kohdenpäällä
UhkaluettelotTor-poistumissolmut, Spamhaus DROP, FireHOL Level 1 ja blocklist.de on esimääritetty; mikä tahansa muu RBL-luettelo voidaan lisätä osoitteella, päivittäinen vertailu, kullekin luettelolle oma tasoilmoita
Ei pääsyä kirjautumiseenNeljäs taso luetteloille ja maille: verkkosivusto on luettavissa, kirjautumislomake ja rajapinnat ovat kiinni — oikea vastaus Tor-verkolleValinnainen
AlkuperämaaMaa jokaiselle osumalle ja osoitteelle GeoLite2:n avulla; moduuli päivittää tietokannan itse maksuttoman lisenssiavaimen avullanäytä
MaasäännötEstä, ei pääsyä kirjautumiseen, ilmoita tai nimenomaisesti salli — maakohtaisesti, tarkoituksella ilman oletusarvoaei mitään
VirhemäärityksetQNAP, Synology, Exchange Autodiscover, ActiveSync ja WebDAV/CalDAV/CardDAV tunnistetaan, ei koskaan estetä, ja ne viedään työlistalle havaintoineen ja kyseisine verkkotunnuksineenilmoita
Tiketti osoitetta kohdenHavainnosta tehdään halutessa tiketti — täsmälleen yksi osoitetta kohden, suljettu tiketti avataan uudelleen sen sijaan, että syntyisi kaksoiskappalepois
Pakolliset sivut ja keräilijätKanoninen yhteystietosivun (Impressum) polku pysyy aina tavoitettavissa; vieraiden kirjoitusasujen koneellinen kokeilu tunnistetaan ja halutessa estetäänilmoita
Sallittujen luetteloOsoitteet ja verkot, joita ei koskaan estetä; täyttyy päivittäin palomuurista (VPN-vastapäät) sekä Googlebotin ja Bingbotin julkaisemista osoitealueistapäällä
Asiakkaan yhdistäminenAsiakkaan verkosta tullut osuma yhdistetään asiakkaaseen — sallittujen luettelon perusteella, ei koskaan käsin arvatenpäällä
Verkkotunnus ja tunniste osumaa kohdenMihin verkkosivustoon pyyntö kohdistui ja millä User-Agentilla — kumpaakaan ei löydy käyttölokistapäällä
AnalyysiKaavio ja pivot-taulukko kaikista osumista: kuvion, päivän, verkkotunnuksen, maan ja osoitteen mukaanpäällä
HoukuteLuotaimet saavat keksittyjä vastauksia, joissa on kanariaarvo; kuka sen myöhemmin hakee, on lukenut nepois
RBL-jakeluEstoluettelo pelkkänä osoiteluettelona tai JSON-muodossa omassa, tokenilla suojatussa osoitteessa — HAProxylle, OPNsenselle ja jokaiselle palomuurille, joka lukee URL-luetteloitapäällä

Kaikki, mikä toimitetaan tilassa ilmoita, pois tai valinnainen, on tarkoituksella niin: sen, joka ottaa eston käyttöön, tulee tehdä se siksi, että on seurannut tilannetta muutaman päivän ja nähnyt, kuka siihen jää — ei siksi, että oletusasetus sen määräsi.

Web RBL -analyysi: osumat kuvion mukaan seitsemän päivän ajalta

Analyysi: osumat kuvion mukaan seitsemän päivän ajalta. Korkein palkki on .env-tiedostojen etsintä.

RBL-luettelot: standardoitu tapa jakaa estoja

RBL tulee sanoista Real-time Blackhole List. Käsite on peräisin sähköpostimaailmasta, jossa Spamhaus ja muut ovat julkaisseet 1990-luvulta lähtien luetteloita haitallisista lähettäjäosoitteista. Periaate on mahdollisimman yksinkertainen ja juuri siksi niin yleinen: yksi osoite riviä kohden, haettavissa HTTP:llä, ladataan säännöllisesti uudelleen. Ei muotoa, jota pitäisi ensin jäsentää, ei rajapintaa, johon tarvittaisiin jokin työkalu.

Käytännössä jokainen palomuuri ja jokainen käänteinen välityspalvelin (reverse proxy) osaa lukea tällaisen luettelon ja rakentaa siitä sääntöjä. Valmistajat nimeävät asian eri tavoin, mutta mekanismi on kaikkialla sama:

  • OPNsense ja pfSense — URL Table Alias: osoiteluettelon lataus HTTP:llä, käyttö aliaksena palomuurisäännöissä, päivitys tunti- tai päiväväleillä
  • HAProxy — ACL-tiedostot ja Maps: src -f sperrliste.txt http-request deny -säännössä, ladattavissa uudelleen ajonaikaisen rajapinnan kautta ilman uudelleenkäynnistystä
  • nginx — geo-moduuli liitetyn osoitetiedoston kanssa tai deny-käskyt luodusta include-tiedostosta
  • Fortinet FortiGate — External Block List eli Threat Feed: URL, josta palomuuri hakee IP-luettelon ja käyttää sitä käytännöissä
  • Palo Alto Networks — External Dynamic List (EDL): sama periaate, omana objektityyppinään tietoturvakäytännöissä
  • Check Point — Custom Intelligence Feeds ja IP Block Lists URL:n kautta
  • Cisco Secure Firewall (Firepower) — Security Intelligence Feeds omilla luettelolähteillä
  • Sophos Firewall — Third-Party Threat Feeds: URL:stä haettavat osoiteluettelot estosääntöjen lähteenä
  • Juniper SRX — Dynamic Address Entries syötteistä
  • MikroTik RouterOS — Address Lists, täytetään skriptillä ja fetch-komennolla URL:stä
  • CrowdSec — omat luettelot lähteenä bouncereille jokaisessa tuetussa järjestelmässä

Juuri tässä muodossa Web RBL toimittaa estoluettelonsa. Palomuuri hylkää paketit ennen kuin ne saavuttavat verkkopalvelimen — ja niiden mukana jokaisen muun saman osoitteen yrityksen, esimerkiksi sähköpostipalvelimeen tai VPN-yhdyskäytävään.

Molempiin suuntiin, mutta oikeassa paikassa

Tie toimii myös toiseen suuntaan: Web RBL:ään voi lisätä minkä tahansa RBL-luettelon — yksi URL, yksi taso, valmis. Tor-poistumissolmut, Spamhaus DROP, FireHOL ja blocklist.de on esimääritetty, lisää tulee kolmella napsautuksella. Moduuli purkaa jokaisen luettelon osoitealueiksi ja tarkistaa jokaisen pyynnön niitä vasten muutamassa mikrosekunnissa.

Ja silti: järkevämpää on käyttää vieraita luetteloita palomuurissa sen edellä. Kolmesta syystä. Palomuuri näkee kaikki palvelut, ei vain HTTP:tä — Spamhaus-luettelon osoitteen tulee epäonnistua myös sähköpostipalvelimella ja VPN:ssä. Se hylkää pakettitasolla, ennen kuin yhteyttä edes muodostuu, ja säästää siten sovelluspalvelimen kuormalta. Ja se on paikka, jossa tällaisia luetteloita muutenkin ylläpidetään; toinen kopio sovelluksessa on toinen paikka, joka voi vanhentua.

Mihin luetteloita moduulissa sitten tarvitaan: siihen, mihin palomuuri ei pysty. Se ei tunne kirjautumislomaketta. Web RBL voi evätä Tor-luettelon osoitteelta pääsyn kirjautumiseen ja silti toimittaa verkkosivuston — se, joka haluaa lukea nimettömänä, saa tehdä niin; se, joka haluaa kokeilla salasanoja nimettömänä, ei. Ja se voi ilmoittaa luetellun osoitteen onnistuneen kirjautumisen epäilyttäväksi. Molemmat edellyttävät luetteloa siellä, missä kirjautuminen tapahtuu.

Arviointi vaistojen sijaan

Osoite, joka on kerran kysynyt polkua /wp-login.php, on eri asia kuin osoite, joka on kahtena päivänä käynyt viiden eri kuvion kautta kolmen verkkotunnuksen läpi. Web RBL laskee tämän arvosanaksi 0–100 — sen perusteella, minkä se on itse nähnyt, ilman ulkopuolista palvelua ja ilman ulkoisia kyselyitä.

Web RBL -merkintä, arvosana 84 ja perustelu

Yksi merkintä: 99 osumaa, arvosana 84 ja perustelu selkokielellä — vakavin kuvio, viisi eri vakavaa kuviota, kaksi epäilyttävää päivää, yli kaksikymmentä osumaa.

Arvosana ratkaisee kaksi asiaa. Säädettävästä arvosta alkaen kirjautuminen on kielletty — verkkosivusto pysyy luettavana, mutta se, joka on jo etsinyt tunnuksia, ei saa mahdollisuutta kokeilla löytämiään. Ja osoitteen onnistunut kirjautuminen, jolla on arvosana, ilmoitetaan: silloin joku ei ole enää arvannut, vaan tiennyt. Joko oikeutettu käyttäjä oli liikkeellä tai tunnukset ovat joutuneet vääriin käsiin — moduuli ei ratkaise sitä, vaan antaa asian jollekulle, joka voi kysyä. Itse salasanaan ei kosketa missään vaiheessa.

Web RBL -estoluettelo, suodatettu arvosanalla 40 alkaen

Estoluettelo suodatettuna arvosanalla 40 alkaen: osumien määrä, epäilyttävät päivät, kohteena olleet verkkotunnukset ja kunkin osoitteen viimeisin polku.

Mitä Web RBL suojaa — suojausvaikutus yksityiskohtaisesti

1. Tunnukset pysyvät löytymättä

Suurin mitattu hyökkäysluokka ei etsi Odoon aukkoja, vaan unohtuneita salaisuuksia. Seitsemäntoista päivän aikana:

  • 57 721 pyyntöä .env-tiedostoihin — niissä on tietokannan salasanoja, API-avaimia ja istuntosalaisuuksia
  • 5 535 pyyntöä määritystiedostoihin
  • 4 388 pyyntöä pilvipalvelun tunnuksiin: credentials.json, service-account.json, firebase-adminsdk.json, rclone.conf, .git-credentials
  • 2 811 pyyntöä .git-hakemistoihin — sen löytävä lataa koko lähdekoodin historioineen itselleen
  • 1 907 pyyntöä rakennusohjeisiin, kuten .github/workflows/deploy.yml tai .gitlab-ci.yml, joissa mainitaan rekisterit ja avainten nimet

Ratkaisevaa ei ole pyyntöjen määrä, vaan eri osoitteiden määrä: /credentials.json tuli 98 osoitteesta, /.git-credentials 92:sta. Kyse ei ole yksittäisestä skannerista, vaan vakioohjelmistosta, joka pyörii maailmanlaajuisesti samanaikaisesti.

2. Kirjautumisyritykset menevät hukkaan — pysyvästi

Odoossa on oma jarrunsa salasanojen kokeilua vastaan. Sillä on kolme rajaa, jotka on dokumentoitu itse Odoon lähdekoodiin: laskuri sijaitsee työprosessin keskusmuistissa ja nollautuu jokaisessa uudelleenkäynnistyksessä, se vain viivästää eikä estä, ja se laskee vain yritykset, jotka pääsevät salasanan tarkistukseen asti.

Web RBL tarttuu samoihin kohtiin, mutta kirjoittaa tietokantaan. Näin ollen pätee:

  • Tila säilyy jokaisen uudelleenkäynnistyksen yli ja on voimassa kaikissa työprosesseissa
  • Huomioon otetaan molemmat reitit: kirjautumislomake /web/login ja rajapinnat /xmlrpc/2/common ja /jsonrpc
  • Huomioon otetaan myös yritykset, jotka eivät koskaan pääse salasanan tarkistukseen asti — esimerkiksi kirjautumiset ilman kelvollista istuntotunnistetta
  • Epäonnistunut pääsy tietokannan hallintaan lasketaan mukaan; se on kaikkein vakavin kirjautumisyritys

Kirjautumisten kynnys on kymmenen, ja syynä on mittaus: yhdeksästä epäonnistuneesta kirjautumisesta seitsemäntoista päivän aikana suurin osa tuli asiakkailta, jotka olivat itse ottamassa käyttöön pääsyä toisella laitteella ja kirjoittivat väärän verkkotunnuksen — yhdessä tapauksessa oman verkkotunnuksensa, mutta pisteen sijasta yhdysviivalla. Esto ensimmäisestä epäonnistuneesta yrityksestä ei olisi osunut hyökkääjiin, vaan asiakkaisiin käyttöönoton aikana.

Se, joka sen sijaan jatkaa koputtamista, vaikka palvelin on jo vastannut ”odota hetki”, estetään heti. Tämän viestin lukee ihminen ja odottaa; ohjelma ohittaa sen. Oma kuvio, jonka kynnys on nolla, nappaa juuri tämän tapauksen, eikä se voi osua kollegaan: sinne päätyy vain se, jolla on jo kymmenen epäonnistunutta yritystä takanaan ja joka sen jälkeen jatkaa.

3. Hyökkäys ei maksa palvelimelle enää mitään

Luotain polkuun kuten /@fs/../../.env oli ennen moduulia kallis: Odoo etsii virhesivun, renderöi sen, kompastuu osoitteen rakentamisessa piste-segmentteihin ja epäonnistuu siten myös virhesivun virhesivun kohdalla. Kaksi pinojälkilokia luotainta kohden. Seitsemäntoista päivän aikana mitattiin 28 401 tällaista virhettä, lisäksi 9 467 seuraamusvirhettä.

Web RBL puuttuu kohtaan ir.http._match, siis ennen reitin etsintää. Vastaus annetaan ilman mallipohjaa, ilman tietokantayhteyttä estotarkistusta pidemmälle ja ilman lokiriviä. Tarkistus sallittujen luetteloa, uhkaluetteloita ja maasääntöjä vasten tehdään välimuistista lajiteltujen osoitealueiden avulla — muutama mikrosekunti, vielä yli kolmenkymmenentuhannen alueen kohdalla.

4. Palomuuri heittää hyökkääjän ulos ennen kuin tämä ehtii perille

Estoluettelo julkaistaan RBL-luettelona, jonka HAProxy ja OPNsense lukevat suoraan. Hyökkääjä ei siten enää tavoita verkkopalvelinta — eikä mitään muutakaan palvelua samalla isännällä. Kerran haitalliseksi tunnistettu pääsyyritys suojaa näin taannehtivasti koko koneen.

Kolme tasoa: estä, laske, ilmoita

Kaikki tyhjään osuvat pyynnöt eivät ole hyökkäyksiä. Web RBL erottaa siksi kolme tasoa, ja tason voi vaihtaa kuviokohtaisesti koskematta koodiin.

TasoLaukaisseen pyynnön kohtaloSeuraus osoitteelle
estähylätäänestetty 24 tunniksi, kolmen epäilyttävän päivän jälkeen pysyvästi
laskepäästetään läpivain kirjataan, ei estoa
ilmoitapäästetään läpikirjataan havaintotekstin kanssa, ei koskaan estetä

Uhkaluetteloille ja maille on olemassa neljäs: ei pääsyä kirjautumiseen. Verkkosivusto pysyy luettavana, kirjautumislomake ja rajapinnat ovat kiinni. Se on keskitie kaikelle, mikä on epäilyttävää mutta ei välttämättä haitallista — Tor, jokin datakeskusalue, maa, jossa ei ole asiakkaita.

Mitkä hyökkäykset tunnistetaan

Kaikki kuviot on testattu todellista liikennettä vasten. Eri osoitteiden määrä on tarkoituksella rinnalla — se osoittaa, osuuko kuvio yksittäiseen skanneriin vai yleiseen toimintatapaan.

HyökkäysluokkaPyynnötOsoitteet
.env-poiminta57.721223
PHP-luotaimet12.237256
Polkujen läpikäynti (path traversal) kannattavalla kohteella10.04664
Määritystiedostot5.535114
Pilvipalvelun käyttöavaimet4.388152
WordPress-luotaimet3.366385
.git-poiminta2.811255
Odoon tiedustelu (tietokannan hallinta, versiokysely)2.500213
Tekoälytyökaluketjut ja komentojen suoritus (/mcp, /api/fs/exec)2.45074
Rakennusohjeet (CI/CD)1.90788
GraphQL-päätepisteet1.87871

Huomionarvoinen on uusin luokka. /api/fs/exec pyydettiin 369 kertaa 54 eri osoitteesta — se ei ole lukuyritys, vaan yritys suorittaa komentoja. Tällaisia kohteita ei ollut kaksi vuotta sitten; ne ovat peräisin uusien tekoälytyökalujen rajapinnoista ja tehtäväjonoista. Se, joka kohdistaa puolustuksensa vain WordPressiin ja PHP:hen, ei näe niistä mitään. Arvosanassa tämä luokka painaa vastaavasti paljon.

Uhkaluettelot ja alkuperämaa

Web RBL -uhkaluettelot: Tor, Spamhaus DROP, FireHOL, blocklist.de

Neljä luetteloa, 32 851 osoitealuetta, kaikki tilassa ”vain ilmoita”. Jokainen lisäluettelo on yksi osoite ja yksi taso.

Vieras luettelo on väite, jonka joku toinen esittää syistä, joita emme tunne, liikenteestä, jota emme ole koskaan nähneet. Se voi olla väärä, vanhentunut tai tarkoitettu toiseen käyttöön: blocklist.de kerää lähinnä osoitteita, jotka ovat muualla kokeilleet SSH-kirjautumisia, ja se kertoo verkkopalvelimesta vähän. Siksi Web RBL pitää vieraat luettelot erillään omasta estoluettelostaan, ja siksi oletusarvo on ilmoita. Ja oma sallittujen luettelo voittaa aina: tuntemamme asiakas painaa enemmän kuin kolmannen osapuolen arvio.

Alkuperämaa näkyy jokaisessa osumassa ja jokaisessa osoitteessa. Arvioinnissa se on korvaamaton — kirjautumisyritys omasta maasta kello kymmenen aamupäivällä on eri asia kuin yritys maasta, jossa ei ole yhtään asiakasta. Yleiseen ulosulkemiseen se ei sovellu juuri lainkaan, ja sen kertovat omat lukumme: luettelomme hyökkääjät tulivat pääosin pilvialueilta Belgiassa, Suomessa ja Alankomaissa. Esto kaikelle saksankielisen alueen ulkopuolelta ei olisi osunut heihin — mutta olisi osunut omiin työntekijöihin lomalla ja asiakkaisiin työmatkalla.

Web RBL -maasäännöt: toimitetaan tyhjinä, selityksen kanssa

Maasäännöt toimitetaan tyhjinä, ja näkymä kertoo, miksi.

Virhemääritykset ilmoitetaan eikä estetä

Yleisin tapaus todellisessa liikenteessä ei ole hyökkäys eikä kävijä, vaan viallinen ohjelmisto, joka pitää verkkopalvelinta jonakin toisena:

  • 1 367 kutsua QNAP-NAS-laitteen verkkorajapintaan — synkronointiasiakas, jonka kohde ei enää täsmää. Yksi ainoa liittymä koputti 962 kertaa.
  • 65 Autodiscover-kyselyä — Outlook, joka pitää verkkotunnusta Exchange-palvelimenaan

Tällaisia osoitteita ei koskaan estetä. Esto ei korjaa vikaa, vaan piilottaa sen — ja osuu siihen, jonka laite on jo valmiiksi väärin asetettu. Sen sijaan syntyy merkintä havaintotekstin ja kohteena olleiden verkkotunnusten kanssa, josta halutessa tulee automaattisesti tiketti: osoitetta kohden täsmälleen yksi, ja jos se suljetaan ja osoite tulee uudelleen esiin, sama tiketti avautuu uudelleen sen sijaan, että syntyisi toinen.

Tunnistettavia ovat QNAP, Synology, Exchange Autodiscover, ActiveSync sekä WebDAV-, CalDAV- ja CardDAV-asiakkaat. Kuviot nimeävät tarkat tiedostonimet ja hakemistot, eivät koskaan pelkkiä päätteitä: Samassa /cgi-bin/-hakemistossa vaarattomat synkronointikutsut ovat aivan perinteisten luotainten, kuten printenv.pl, vieressä.

Sallittujen luettelo: osoitteet, joita ei koskaan estetä

Erehdyksen hinta ei ole kaikille osoitteille sama. Datakeskuksesta tulevan skannerin kohdalla väärä hälytys ei maksa mitään. Toimipisteen tunnelin vastapään kohdalla se maksaa koko toimipisteen.

Siksi on olemassa toinen luettelo, joka on ensimmäisen edellä: osoitteet ja verkot, joita ei koskaan estetä. Se ei mykistä mitään — se, joka on luettelossa, tarkistetaan ja kirjataan edelleen, vain seuraus jää pois. Tämä on ero palomuurin poikkeuksesta: se tekee sokeaksi, tämä vain kärsivälliseksi.

Se täytetään päivittäin kahdesta lähteestä: itse palomuurista kaikkine VPN-vastapäineen, jotta uuden tunnelin toimivuus ei ole kiinni siitä, että joku muistaa estoluettelon — ja Googlen ja Microsoftin julkaisemista osoitealueista niiden indeksointirobooteille. Vain siten oikean Googlebotin voi erottaa skannerista, joka esiintyy sellaisena. Hakukoneita ei saa koskaan estää; se, joka sulkee ne ulos, poistaa sivustonsa indeksoinnista ilman paluutietä.

Tässä pätee sääntö, joka on vertailua tärkeämpi: Tyhjä vastaus ei koskaan poista mitään. Jos lähde ei vastaa, vastaa tyhjää tai käsittämätöntä, luettelo pysyy ennallaan. Sallittujen luettelo, joka tyhjenee itsestään häiriön sattuessa, vie pahimpana mahdollisena hetkenä kaikki tunnelit mukanaan.

Jos sallittujen luettelon merkinnällä on asiakas, jokainen hänen verkostaan tuleva osuma yhdistetään hänelle. Virhemäärityksellä on siten heti yhteyshenkilö, eikä kenenkään tarvitse hakea osoitteita ylös.

Pakolliset tiedot ja automatisoidut tiedonkerääjät

Yhteystietosivu (Impressum) ei ole tavallinen sivu. Sen täytyy pysyä ihmisten tavoitettavissa, sillä sen esto luo juuri sen rikkomuksen, jota keräilijä etsii. Samalla se on sivu, jolla nimi ja osoite ovat — ja siten koneellisen sadonkorjuun kohde.

Itävallassa upotettujen Google-fonttien vuoksi liikkeelle lähteneen vaatimuskirjeiden aallon yhteydessä lokit osoittivat, etteivät kirjeet johtuneet yksittäisistä käynneistä, vaan automatisoidusta laajasta ryntäyksestä: eri, toisiinsa liittymättömiä isäntiä millisekuntien välein.

Web RBL ratkaisee tämän alentamalla tasoa poikkeuksen sijaan. Kanoninen polku /impressum ei osu mihinkään kuvioon ja pysyy aina tavoitettavissa. Vieraat kirjoitusasut, kuten /impressum.php — joita Odoo-sivustolla ei voi olla — ilmoitetaan, ja se, joka ei halua hyväksyä koneellista sadonkorjuuta, vaihtaa yhtä parametria. sitemap ja robots on rajattu tämän ulkopuolelle ja niitä ei periaatteessa voi estää: ne eivät sisällä henkilötietoja, ja niiden hakeminen on jokaisen hakukoneen indeksointirobotin tehtävä.

Verkkotunnus ja tunniste: mikä käyttölokista puuttuu

Werkzeugin käyttöloki ei kirjaa ylös kutsuttua isäntää eikä kutsujan tunnistetta. Odoo saa molemmat tietysti — ilman isäntää se ei voisi valita useasta verkkosivustosta oikeaa. Jälkikäteen niitä ei kuitenkaan voi enää lukea.

Web RBL tallentaa molemmat jokaisesta osumasta. Se vastaa kahteen kysymykseen, joihin ei muuten saa vastausta: mihin verkkosivustoon virhemääritys kohdistuu — ja siten kenelle asiakkaalle verkkotunnus kuuluu — ja käykö osoite yhdellä sivulla vai kaikilla. Saman osoitteen useat toisiinsa liittymättömät verkkotunnukset ovat laajan ryntäyksen tunnusmerkki, ja ne nostavat arvosanaa.

Kuinka paljon tunniste merkitsee, osoitti yhden verkkosivustomme analyysi: yli seitsemänkymmentä prosenttia koko liikenteestä tuli siellä yhdeltä ainoalta kutsujalta, jakautuneena yli sadalle osoitteelle. Ilman tunnistetta se olisi näyttänyt hajautetulta skraperilta. Kyseessä oli GPTBot, OpenAI:n indeksointirobotti — se kysyi yhä uudelleen tiedostoa robots.txt ja käyttäytyi täysin oikein.

Tietoturvanäkökohdat yksityiskohtaisesti

1. Välityspalvelimen tunnistus — kaikkein vaarallisin kohta

Jos Odoo toimii käänteisen välityspalvelimen takana ja proxy_mode on asetettu väärin, moduuli näkee jokaisessa pyynnössä saman osoitteen: välityspalvelimen osoitteen. Esto sulkisi silloin kaikki kävijät ulos samanaikaisesti.

Siksi Web RBL tarkistaa ennen jokaista estoa, onko osoitteen määritys luotettava. Se edellyttää proxy_mode-asetusta yhdessä edelleenlähetysotsakkeen kanssa, kieltäytyy toimimasta, jos edelleenlähetys tulee ilman proxy_mode-asetusta, ja kieltäytyy yhtä lailla, jos välityspalvelimia on useampi kuin yksi. Epäselvässä tapauksessa ei estetä.

2. Omia verkkoja ei koskaan

Yksityiset osoitealueet, loopback, link-local ja CGNAT on suljettu pysyvästi pois. Ne eivät voi missään olosuhteissa päätyä luetteloon, ei edes käsin. Sama pätee vieraisiin luetteloihin: yksityiset ja varatut alueet sekä järjettömän suuret verkot hylätään luettaessa.

3. Oma virhe ei saa viedä verkkosivustoa mukanaan

Koko tarkistus suoritetaan suojauksessa, joka nappaa jokaisen virheen. Se, mikä menee tässä pieleen, kirjataan lokiin, ja pyyntö jatkaa muuttumattomana. Suojausmoduuli, joka omassa virhetilanteessaan vie verkkosivuston mukanaan, on pahempi kuin ei mitään. Kaikki pyyntöpolun kyselyt suoritetaan lisäksi ilman kävijän selainkieltä ja ilman käännettyjen kenttien mukaista lajittelua — kävijä, jolla on asentamaton kieli, ei saa pystyä kaatamaan tarkistusta.

4. Seuranta ennen estoa

Asennuksen jälkeen luetteloitujen osoitteiden esto tavallisissa pyynnöissä on poistettu käytöstä. Luotaimet hylätään ja kirjataan, kaikki muu menee läpi. Näin voi seurata muutaman päivän, kuka todella päätyy luetteloon, ennen kuin ketään suljetaan ulos. Sama pätee käyttäytymisen tunnistukseen, uhkaluetteloihin ja maasääntöihin: ensin ilmoita, estä vasta harkinnan jälkeen.

5. Tarkat kuviot laajojen verkkojen sijaan

Väärin tunnistettu kävijä on kalliimpi kuin ohi mennyt luotain. Siksi jokaisella kuviolla on oma tasonsa, ja se on vaihdettavissa kuviokohtaisesti. Pelkkä tiedostopääte riittää harvoin: kun .php-päätteellä on 14 012 oikeaa luotainta ja kourallinen vanhoja linkkejä, .asp-päätteellä suhde on päinvastainen. Tällaiset päätökset kuuluvat mitattaviksi, ei arvattaviksi.

6. Käsin tehty vapautus pysyy voimassa

Se, joka vapauttaa osoitteen, on tehnyt sen syystä. Uusi osuma ei kumoa tätä päätöstä äänettömästi.

7. Luettelo on suojattu, mutta ei salaisuus

Päätepiste vaatii tokenin ja vastaa ilman kelvollista tokenia koodilla 404, ei 403 — osoitteen olemassaoloa ei siten vahvisteta lainkaan. Vertailu tapahtuu vakioajassa. Luettelo itsessään ei sisällä mitään luottamuksellista: se koostuu osoitteista, jotka ovat omasta aloitteestaan koputtaneet ovellemme.

8. Ei salaisuuksia kirjanpidossa

Epäonnistuneista kirjautumisista kirjataan yritetty käyttäjänimi, ei koskaan salasanaa. Tietokannan hallinnan kohdalla annetuista arvoista luetaan ei yhtään mitään: siellä ensimmäisenä on pääsalasana, ja estoluettelon merkintä päätyy jokaiseen tietokannan varmuuskopioon. GeoLite2:n lisenssiavain on vain järjestelmäparametrissa eikä missään lokirivillä.

9. Houkute ei paljasta mitään hyödynnettävää

Valinnaisesti Web RBL vastaa luotaimille keksityllä sisällöllä, joka sisältää yksiselitteisen kanariaarvon. Se, joka hakee tämän arvon myöhemmin, on lukenut väärennetyn vastauksen ja toiminut sen perusteella — väärä hälytys on tällöin poissuljettu. Houkutteet eivät sisällä hyödynnettäviä tietoja, eivät oikeita polkuja eivätkä kelvollisia tunnuksia. Tämä toiminto toimitetaan pois päältä, koska se muuttaa ulospäin näkyvää käyttäytymistä.

Mitä moduuli ei osaa

Se ei korvaa palomuuria eikä Web Application Firewallia. Se tunnistaa tunnetut tiedustelukuviot poluissa, epäonnistuneet kirjautumiset ja poikkeavan käyttäytymisen — ei hyökkäyksiä lomakkeisiin eikä parametreihin kohdistuvia injektioyrityksiä.

Se näkee lisäksi vain sen, mikä tulee takaisin HTTP:n kautta. Mitä hyökkääjä tekee anastetuilla tietokanta- tai postilaatikkotunnuksilla, jää näkymättömiin — ja juuri siksi kanariaarvot ovat polkuja eivätkä tunnuksia.

Eikä se korvaa huolellisuutta: moduuli, joka hylkää .env-luotaimet, ei tee vahingossa toimitetusta .env-tiedostosta vaaratonta.

Saatavuus

Web RBL on julkisesti saatavilla AGPL-3-lisenssillä ja toimii meillä tuotannossa viidellä verkkosivustolla:

github.com/Alex0176/odoo-web-rbl

Moduuli edellyttää Odoo 19 Communityä, eikä sillä ole riippuvuuksia lukuun ottamatta base- ja web-moduuleja. Tikettiyhteys on valinnainen eikä vaadi mitään tiettyä tikettijärjestelmää; ilman sitä ei yksinkertaisesti tapahdu mitään. Alkuperämaa tarvitsee MaxMindin maksuttoman GeoLite2-tietokannan; jos se puuttuu, kenttä jää tyhjäksi ja kaikki muu toimii muuttumattomana.

Lue lisää: Miten Web RBL sopii kokonaisvaltaiseen tietoturva-arkkitehtuuriin -- yhdessä palomuurin, kaksivaiheisen todennuksen ja käyttöoikeuksien kanssa, vaihe vaiheelta etenevine ohjeineen: Odoo 19 -tietoturva-arkkitehtuurin oikea yhdistäminen.

Otamme mielellämme vastaan kysymyksiä, huomautuksia ja virheraportteja — mieluiten GitHubin issueina.