tavis nörttimaailmassa

EksisONE - artikkeleita ja ohjeita nörttimaailmasta

GeoIP-blokkaus: Mitä se on?

IP-osoite kertoo aina maan. Oikeammin, tietokannoista saadaan useimmiten selvitettyä missä maassa sitä käyttävä yritys tai palvelu toimii. Se ei välttämättä ole sama kuin aidosti yrittävän pyynnön IP-osoite, kiitos VPS:n ja parin muun tekniikan, mutta sillä ei ole väliä. Väliä on pelkästään yhdellä asialla: IP osoite on tehnyt serverille pyynnön tai pyyntöjä ja se tulee määrätystä maasta. Jos käynti on harmiton, niin se voidaan sallia. Jos se on millään tavalla haitallinen, niin se tulee estää. Fail2ban mahdollistaa monta eri tapaa suodattaa IP-osoitteita ja estää sellaiset, jotka tekevät vääriä asioita. Fail2ban tosin vaatii, että ensin tehdään jotain ja vasta sitten estetään. Sen sijaan palomuuri, joka useimmiten virtuaaliservereillä on ufw ja iptables, taasen estää jo ennen yritystä. Kieltää pääsy määrätystä maasta on periaatteellisella tasolla arveluttavaa, mutta usein käytännössä järkevä toimi.

Geo-blokkaus lähtee oletuksesta, että ulkolaisesta IP-osoitteesta saapuva tulee aina pahat mielessä, ilman poikkeuksia. Vaikka ihmiselämässä tietäisikin, että kotimaa ei ole tae mistään, eikä kansallisuutta saisi käyttää milloinkaan ennakkoasenteiden rakentamiseen, niin digimaailma on toisenlainen. Lähtokohtaisesti jokainen muutoin kuin selaimella tehdyn tavallisen http/https-liikenteen kautta suoraan sivustolle saapuvat tulevat pahat mielessä Joko tarkoituksena on varastaa sisältöä, kuten jokainen SEO-yritys tekee, tai sitten yrittää löytää aukkoja ja murtopaikkoja.

Minulla on kiinalaisia käyntejä satoja päivässä. Yksikään heistä ei koskaan näy ns. normaaleina kävijöinä, vaan ainoastaan bottiliikenteenä. Kiinalaiset ihmiset eivät ole sen kummallisempia kuin suomalaiset tai muutkaan, mutta kiinalainen verkkoliikenne sivustoilleni on aina pahantahtoista. Siksi Kiinan estäminen kategorisesti ei ole minulle minkäänlainen moraalinen dilemma.

Joku voi jeesustella, että tiedon täytyy olla vapaata. Niin se onkin, mutta vapaaseen tietoon ei kuulu vapaa hyödyntäminen ja rajoittamaton oikeus yrittää rikkoa paikkoja. Minua ei kiinnosta japaninkielinen tai arabialainen sisältö, koska en osaa edes merkistöä.

Minulla sivustot ovat pelkästään suomeksi, joten voinen olettaa, että iranilainen tai kiinalainen ei suurempaa hyötyä sisällöistäni saa. Sama juttu suurimman osan muun maailman suhteen. Ulkosuomalaisia on joitakin satoja tuhansia ja periaatteessa voisin uhrata heidät, tai sallia Viron ja Pohjoismaat. Joudun siis laittamaan vaakakuppiin kuinka suuressa merkityksessä on missäkin maassa asuvat suomenkieliset suhteessa samasta maasta tulevasta häiriöliikenteestä.

Hollanti ja Sveitsi ovat minulle pieni ongelma. Tiedän, että minulla on molemmista maista muutama kerran viikkossa säännöllisesti käyvä yksittäinen henkilö. Sen lisäksi Hollannin IP-osoitteista tulee kolkuttajia hieman toista sataa viikossa, vähintään. Koska tiedän suomalaiset, niin geo-blokkaus on minulle henkisesti hankala valinta, joten en tee sitä niiden maiden suhteen, joista tiedän tulevan hyötyliikennettä. Mutta – tiedän myös, että jos estän vaikka koko Italian pelkästään sieltä tulevan, aika ajoin massiivisenkin, haittaliikenteen takia, niin samalla estän mahdolliset suomenkieliset kävijät tulevaisuudessa.

Olen pahoillani. Haitta on suurempi ongelma kuin mahdollisesti joskus saapuva kävijä.

Verkkokaupat

Säännöllisesti kuulee väitettävän, että geoblokkaus olisi EU:ssa kielletty. Se ei pidä paikkaansa. Geo-sijainnin mukaan hinnoittelu on kielletty. Ero on selvä. Suomalaiselle, saksalaiselle tai kreikkalaiselle ei saa antaa erilaista nettohintaa, vaan hinta on oltava sama. Sen sijaan haluamistaan maista pääsyn saa kieltää, kuin myös ylipäätään myynnin. Kauppiaalla on oikeus valita asiakkaansa.

Oikeus valita täytyy kuitenkin perustua aitoihin asioihin. Se, että ei myy ruotalaisille, koska he ovat kaikki homoja tai romanialaisille, koska he ovat kaikki varkaita, on yksiselitteisesti laitonta syrjintää. Sen sijaan arvonlisävero on sellainen kriteeri. Tai että myyntituote on leimallisesti kansallista tai kieleen liittyvää.

Koira-aiheisen Katiskan kauppa ei myy kuin suomalaisille Suomessa. Syy on niin yksinkertainen kuin EU:n ALV-järjestelmä, joka on… byrokraattinen hirviö saattaisi olla hyvä luonnehdinta. Ehkä hieman liioittelua, mutta EU:n ALV-ilmoitukset tapahtuvat eri tavalla kuin kotimaiset ja lisää paperitöitä silloinkin, kun ulkosuomalainen ei osta ostanut mitään.

Koska Katiska myy pelkkää palvelua (e-kirjat ovat palvelutuote, ei tuote), niin ALV täytyy olla asiakkaan kohdemaan mukainen. Teknisesti ei ole kovinkaan vaikeaa säätää laskutettavaa ALV:ia maan mukaan, mutta se on yksi maksullinen toiminto lisää, jota on ylläpidettävä. Katiskan tapauksessa se ei ole millään mittarilla järkevää. Joten kauppa tekee itsessään geo-blokkauksen olematta myymättä (lue: olettaa Suomen) ulkomaille. Ja tulli- sekä verorajan takia myös Ahvenanmaa on ulkomaita.

Ylipäätään maailmalla kytevä vastustus geo-blokkauksiin ei perustu ideologiseen käsitykseen, että kaikki netin sisältö täytyy olla kaikille saatavilla kielimuureista riippumatta. Perusta on sama kuin aikoinaan Suomessa Alkon ja Finlandia mainoksissa, jotka estettiin alkoholilain nimissä suomalaisilta.

Hieman samaa taustaa on YLE:n lähetysten rajoittamisessa, mutta siinä, ja vastaavissa, on useimmiten kyse lisenseistä, joilla tekijänoikeuksien omistajat rajoittavat näkyvyyttä. Jatkumo DVD-elokuvien maakoodeille, jotka ovat edelleenkin voimassa. Tilanne on mielenkiintoinen. Verkkokauppa ei saa asettaa hintaeroja maiden välille, mutta elokuvien ja sarjojen levittäjät saavat.

Aito syy geo-blokkauksien vastustamiselle on niinkin masentavan maanläheinen kuin Netflix sekä muut suoratoistopalvelut, jotka tekevät kaikkensa rajoittaakseen maantieteellisin perustein näkyvyyttä. Kun haluaa nähdä elokuvan, jonka näkyvyyden levittäjä on rajoittanut, niin on helppo olla idealistisesti geo-blokkauksia vastaan – ihan vain siksi, että saisi nähtyä haluamansa elokuvan ilman, että joutuu maksamaan ekstraa.

Mitä maita blokattaisiin?

Unohdetaan kaupallisista syistä tehtävät blokkaukset ja keskitytään pelkästään teknisiin syihin: SEO-varastaminen, sisällön varastaminen omaan maksulliseen palveluun. koputtelijat ja murtoyritykset, joista jokainen kasvattaa serverin kuormaa enemmän kuin ihmiskävijät koskaan.

Pahimmat maat Iran ja Kiina ovat helppoja valintoja. Jos joku siellä tarvitsee sivustojeni sisältöä suomeksi, niin käyttäkööt VPN-palvelua. Molemmista maista tulee tolkuttomasti roskaa, jota en siedä sitä vain jonkun mahdollisen yksittäisen kävijän takia. Venäjä onkin jo vaikeampi asia, mutta menkööt samaa tietä. Kuin myös Ranska, josta tulee myös melkoisesti koputtelijoita. Sama Italian kanssa. Itäeuroopasta Romania on hyvin edustettuna negatiivisissa yritelmissä.

Vietnam näkyy myös turhan usein, mutta ehdottomasti suurin osa tulee coccoc-botilta. Kun estää sen user-agentin, niin Vietnamista saapuva roskaliikenne rauhoittuu huomattavasti. Mutta silti Vietnam on tiukasti haittojen TOP-10 listalla.

Korkealla sijoituksella haittojen listalla ovat myös Iso-Britannia, Saksa, USA ja Kanada. Suora seuraus siitä, että noissa kaikissa maissa on isojen pilvipalvelujen serverikeskuksia. Estetäänkö nekin? Sen voi tehdä, mutta silloin on varmistauduttava, että yksikään sivuston palveluista ei yritä ottaa yhteyttä mihinkään noista maista. Ja takaan, että jos sinulla on mikä tahansa API-yhteyttä käyttävä, niin se osuu 99 % todennäköisyydellä johonkin noista maista.

Pilvipalvelut eivät kuitenkaan selitä sitä miksi nimenomaan Saksa ja Ranska ovat niin suhteettoman suuri roskaongelma.

Samalla kun sulkee isot länsimaat, niin sulkulistalle joutuvat myös Google, Bing ja kaikki muutkin hakukoneet. Puhumattakaan Google Analyticsista, jos sitä käytät.

Maailman mittakaavassa Aasia on tolkuton roskaaja. Toki poikkeuksiakin on, kuten Japani, mutta kun ytimessä ovat Kiina, Etelä-Korea ja Vietnam, ja meren toiselta rannalta Filippiineltä tulee myös paljon roskaliikennettä, niin halu sulkea kaikki Aasiaan hiukankaan liittyvät valtiot kasvaa. Turkki on myös ahkerien kolkuttelijoiden ehtymätön lähde.

Fail2banin perusongelma

Fail2banin tarkoitus ei ole estää loputtomiin jotain IP-osoitetta, vaan katkoa terä ahkerilta. Jos erehtyy käyttämään usein suositeltuja tunnin tai muutaman banniaikoja, niin silloin on se ja sama käyttääkö Fail2bannia ylipäätään muuhun kuin DDoS-tyyppisten hyökkäysten estämiseen. Koodarinalkujen botit, puhumattakaan ammatimaisista SEO-rosvoista, eivät väsy eivätkä lopeta. Jos banniaika on jokin muu kuin -1 eli ikuisuus, niin sekunneissa bannin loputtua samat IP-osoitteet ja samat botit ovat taas paikalla.

Olen kuullut mainittavan, että Fail2ban on (virtuaali)serverin tärkein työkalu vähennettäessä roskaliikennettä. Tuo pätee ehkä SSH:ta kolkutteleviin, mutta muutoin tärkein työkalu on kylläkin bad bot-lista, joka pysäyttää turhat yrittelijät jo heti kynnyksellä. Suurin osa yrittäjistä käyttää tunnistettavaa user agentia. Onneksi he ovat noin kädettömiä, koska se helpottaa elämää suunnattomasti.

Loput yrittävät sitten tavallisina selaimina, mutta jos alat rankaisemaan turhiin, tarpeettomiin ja typeriin yrityksiin päästä tiedostoihin ja hakemistoihin, joita ei ole, niin saat estettyä helposti 90 prosenttia roskaliikenteestä. Se loppu 10 prosenttia sitten kaatuu muihin toimenpiteisiin – kuten että muistaa hoitaa päivitykset, käyttää järkeviä salasanoja eikä asenna ihan kaikkea mitä netistä löytää.

Osaa roskaa ei saa koskaan tapettua. Se on hyväksyttävä. Kyse onkin määrän matematiikasta: kun estetään 100 000 pyyntöä päivässä, niin serverin ja sivustojen toiminnalla on aika yksi lysti mitä se jäljelle jäänyt tuhat tekee.

Fail2banin perusongelma on sen perustoiminnallisuus: IP-esto. Se puree niihin muutamiin, jotka tulevat omasta henkilökohtaisesta IP-osoitteestaan. Mutta suurin osa boteista vaihtaa salamana uuteen osoitteeseen, kun käytetystä ei saada haluttua vastausta: joko 404 tai 200. Vaikka IP-avaruus on rajallinen ja siksi ollaan siirtymässä IPv6:een, niin se on silti suuri

Jos käyttää osoitteita haarukassa

  • 255.255.255.0 – 255.255.255.255 eli CIDR-muodossa sama olisi 255.255.255.0/24 niin osoitteita on käytössä 256; jos botti saisi aina kolme yritystä per osoite, niin serveri joutuisi sietämään 3×254=762 yritystä ja Fail2ban bannaisi 256 IP-osoitetta
  • 255.255.0.0 – 255.255.255.255 eli 255.255.0.0/16 niin IP osoitteita löytyy 65536 ja kolkutusyrityksiä tulisi serverille jo 196608 kappaletta

Aktiivisuudellaan pahamaineinen Majesticin MJ12bot tulee ainakin tusinasta IP-avaruudesta. Toki osa niistä ei ole aitoja MJ12botteja (kuka vatipää väärentää itsensä SEO-botiksi?), mutta pointti on siinä, että Fail2ban ei koskaan kykene estämään bottiliikennettä. Se pystyy vain rajaamaan ja hidastamaan. Sen sijaan Nginxin, Apache2:den tai Varnishin estolistat pysäyttävät jokaisen tunnistettavan botin heti tavattaessa.

Fail2ban ei ole palomuuri

GeoIP-eston suhteen Fail2bannissa on selvä puute. Se ei nimittäin onnistu. Jos googletat asiaa, niin löydät kourallisen neuvoja, joista yksikään ei toimi. Tai jos toimii, niin satunnaisesti ja vain erikoistilanteissa. Fail2bannin oma wiki neuvoo ainoastaan tavan nähdä listan blokatuista valtioista IP-osoitteen perusteella ja jopa lisätä maatunniste logeihin – mutta ei miten sen perusteella estettäisiin maa kokonaisuutena.

Fail2bannin Geo-estolla on yksi selvä vaikeus, vaikka sen saisikin toimimaan. Kun GeoIP-blokkaus otetaan käyttöön, niin Fail2ban estää kaiken ja sallitut maat on erikseen sallittava. Joten jos tarkoitus on estää vain Kiina, Iran ja Vietnam, niin aivan kaikki muut maailman maat olisi erikseen sallittava. Eli ei tehdä kieltolistaa, vaan sallittujen lista. Jos sallitaan vain muutama maa, niin ei tuo silloin ole hankalaa – suomalainen serveri tarvitsee moisessa tapauksessa mahdollisesti listan kaikista Pohjoismaista, USA:n, Iso-Britannian, Kanadan ja Saksan.

Fail2ban ei ole palomuuri. Se seuraa erillisiä logeja ja estää IP-osoitteen kerrallaan palomuurissa, kun tehdään ei-haluttuja asioita. Siksi edes koko IP-osoitteen sisältävän osoiteaveruuden estäminen ei onnistu. Tai onnistuu,  mutta käsin. Sitä ei pysty automatisoimaan edes IP-listoilla, koska Fail2banin jailit eivät ymmärrä tehdystä listasta osoitetta CIDR-muodossa malliin 255.255.0.0/16. Käsin komennolla fail2ban-client set jail banip 255.255.0.0/16 toki onnistuu. Kukaan ei halua tehdä listaa, jossa on miljoonia yksittäisiä IP-osoitteita saadakseen estettyä kourallisen maita.

Takaan, että et halua yrittää GeoIP-estämistä keräämällä logeista käsin IP-osoitteita, sen jälkeen whois-tietojen perusteella rakentaa CIDR-osoitteen ja bannata IP-alue käsin sekä samalla pitää erillistä kirjaa minkä alueen on estänyt. Olen tehnyt sitä. Aivan toivotonta ja vie tolkuttomasti aikaa. Joku koodarin alku osaisi varmasti tehdä skriptin tuohon, mutta pointti on siinä, että moista ei kuulu edes yrittää Fail2bannissa.

Fail2ban rankaisee yrityksistä per jailin määräämä asia. Sen tehtävä ei ole olla käyttöliittymä palomuurille, jossa mutkan kautta säädetään mitä kokonaisuuksia estetään.

Palomuuri

Palomuuri on ainoa tapa aidosti estää pääsy serverille. Useimmiten kyseessä on iptables ja sen päällä oleva liittymä ufw. Fail2ban ei itsessään estä mitään, vaan on myös liittymä iptables palomuurille ufw:n kautta – eli liittymän päällä oleva liittymä. Tarkkaan ottaen kyseessä on liittymän päällä olevan liittymän päällä oleva liittymä, koska iptableskin on liittymä kernelin pakettienhallinnalle.

Usein asennetaan palomuuri WordPressille, mutta se on palomuuri vain ja ainoastaan osaan WordPressin toimintaa. Tämä ero on ymmärrettävä. Kun iptables ei päästä ollenkaan serverille, niin WordPressin palomuureissa koputtelija on jo serverillä ja rajoitetaan ainoastaan WordPressiin liittyviä asioita. WordPressin lisäosapalomuurit ovat ylipäätään lähellä hyödytöntä ja niistä on apua vain silloin kun ylläpito ei hoida hommiaan – kuten asentaa omituisia plugineja ja jättää päivitykset tekemättä.

WordPressin palomuuri paikkaa osan korjaamattomien aukkojen ongelmia, ei muuta. Sitä käytettäessä serverin kuorma kuitenkin on ja pysyy. Myös sisällön varastaminen on vapaata riistaa. Tämä tarkoittaa kahta asiaa:

  • webhotelleissa on pakko estää .htaccess -tiedostolla sen minkä pystyy, vaikka .htaccess itsessään on serverille kuorma ja hidaste
  • virtuaaliservereissä on käytettävä aitoa palomuuria webserverillä tehtävän bottieston lisäksi ja Fail2ban siivoaa loput

Miten geo-blokkaus toteutetaan?

Olettaen, että sinulla ei ole omaa IT-osastoa ja laumaa insinöörejä rakentamassa koodia, niin maiden perusteella estäminen onnistuu kahdella tavalla – jotka ovat aidosti saman asian variantteja: kerrotaan iptablesille estettävät IP-osoitteet sen mukaan mihin maahan ne väittävät whois-tietojen perusteella kuuluvansa.

Jompikumpi näistä on se kampi, jolla haluat asian toteuttaa:

Jälkimmäisessä on sivulauseessa mainittu miten maaeston saa toimimaan webhotelleissa.

Pystyt tekemään maaeston myös webpalvelimilla, kuten Nginxillä ja Apachella. Siinä ei ole mitään mieltä, koska silloin asetaan vain taas yksi käyttöliittymä käyttöliitymäkerrostuman päälle.

Mitä seuraavaksi?

Kun olet sulkenut riittävästi maita, niin voit antaa asian olla. Tai sitten seurata esimerkiksi logeista pysyvätkö maat estettyinä. Tämä kertoo kuinka monta estoa Fail2ban on tehnyt maittain sen hetkisen login perusteella:

cat /var/log/fail2ban.log | grep "\] Ban" | sed 's/.*[Bb]an \(.*\)/\1/' | uniq | while read line; do geoiplookup $line; done | sort | uniq -c | sort -nr
  • Jos et ole muuttanut Fail2banin logrotate asetuksia, niin logiin kerätään viikon tiedot, ennenkuin uusi logi pyöräytetään käyntiin. Jos haluat päivittäisen login, ja luultavasti haluat, niin avaa logrotate komennolla nano /etc/logrotate.d/fail2ban ja muuta tällaiseksi:

Toki listan merkitys riippuu aivan mitä Fail2ban seuraa, mutta se antaa kuitenkin kuvan mistä maista kolkutuksia tulee ja onko niiden määrä sellainen, että kannattaa nähdä estämisen vaiva.

Ylipäätään estot kannattaa hieman miettiä, eikä ole olemassa mitään ratkaisua, jossa one size fits all. En tiedä teenkö järkevästi vai en, mutta minulle on vakioitunut tapa, jossa

  1. iptables sallii hakukoneet IP-osoitteiden listan mukaan, ihan varmuudeksi
  2. iptales estää useat maat GeoIP2-tietokannalla; isoista maista sallittuna on USA
  3. Nginx estää bad bot -listalla user agenttien perusteella ja siirtää ne Fail2banille bannattavaksi
  4. Varnish siivoaa osan ns. laittomista pyynnöistä, yleensä urlin perusteella, siirtäen ne Fail2banin bannattavaksi
  5. Fail2ban blokkaa sääntöjen perustella sen mitä logeista löytää
  6. Itse kurkkailen aika ajoin ketkä ovat aiheuttaneet 404-virheitä tai katselleet robots.txt -tiedostoa, ja bannailen sitten käsin Fail2banin kautta

Tuolla olen onnistunut estämään varmasti yli 90 prosenttia turhasta liikenteestä. Itsensä naamioivat SEO-botit pääsevät läpi, plus muut satunnaiset, mutta niillä ei ole enää kokonaisuuden kannalta merkitystä.

Tekee mitä tekee, niin on syytä muistaa sekä oivaltaa, että mikään palomuuriratkaisu ei turvaa, jos jätät etuoven auki jättämällä päivitykset tekemättä tai asentamalla omituisia ohjelmia. Puhumattakaan arvattavasta salasanasta.