Viime aikoina eri verkoista lähtöisin oleva automatisoitu haitallinen liikenne, bottien massapyynnöt sekä DDoS-tyyppiset hyökkäykset verkkosivustoja ja palveluita vastaan ovat lisääntyneet. Lisäksi erilaiset indeksoijat, AI-botit ja muut automatisoidut asiakkaat voivat aiheuttaa merkittävää kuormitusta.
Joissakin tapauksissa voi myös olla tarpeen rajoittaa verkkosivustolle pääsyä kävijän sijaintimaan perusteella – esimerkiksi jos palvelu on tarkoitettu vain tiettyjen maiden käyttäjille tai jos halutaan vähentää tarpeetonta liikennettä alueilta, joilta todellisia asiakkaita ei odoteta.
Tätä varten olemme lisänneet palvelimillemme GeoIP-pohjaisen maakohtaisen pääsynrajoituksen.
1. GeoIP-rajoituksen lisääminen/käyttöönotto ja esimerkit
2. GeoIP-rajoituksen käyttöönotto ja hakukonerobottien salliminen estetystä maasta
3. Palvelinpuoleisen automaattisen tietoturvamonitorin lisäämä rajoitus
GeoIP-pohjaisen rajoituksen avulla verkkosivustolle pääsy voidaan sallia tai estää kävijän IP-osoitteen sijaintimaan perusteella.
Palvelimillamme GeoIP-maatieto on jo Apache-verkkopalvelimen käytettävissä seuraavan ympäristömuuttujan kautta:
MM_COUNTRY_CODE
Sen arvo on yleensä kaksikirjaiminen ISO-maakoodi, esimerkiksi:
EE = Viro FI = Suomi SE = Ruotsi US = Yhdysvallat CN = Kiina
Tarkempi luettelo löytyy verkkosivulta TÄÄLTÄ, ja ISO-maakoodi löytyy sarakkeesta “Alpha-2 code”!
Asiakkaan ei tarvitse ottaa GeoIP-tietokantaa tai Apache-moduulia erikseen käyttöön. Rajoitukset voidaan lisätä verkkosivuston .htaccess-tiedostoon.
Esimerkiksi Kiinan, Venäjän ja Yhdysvaltojen estäminen:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{ENV:MM_COUNTRY_CODE} ^(CN|RU|US)$ [NC]
RewriteRule ^ - [F,L]
</IfModule>
Tällöin käyttäjät kaikista muista maista pääsevät verkkosivustolle normaalisti.
Esimerkiksi jos verkkosivusto on tarkoitettu vain Viron, Suomen, Latvian, Liettuan ja Ruotsin käyttäjille:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{ENV:MM_COUNTRY_CODE} !^$
RewriteCond %{ENV:MM_COUNTRY_CODE} !^(EE|FI|LV|LT|SE)$ [NC]
RewriteRule ^ - [F,L]
</IfModule>
Ensimmäinen ehto:
RewriteCond %{ENV:MM_COUNTRY_CODE} !^$
on tärkeä. Se estää tilanteen, jossa kaikki kävijät estettäisiin vahingossa, jos GeoIP-tietoa ei ole saatavilla tai palvelussa esiintyy tilapäinen häiriö.
Haluttaessa estetyille kävijöille voidaan näyttää tavallisen ”Forbidden”-viestin sijasta oma virhesivu:
ErrorDocument 403 /geo-blocked.html
Esimerkiksi:
# BEGIN GeoIP Block
<If "reqenv('MM_COUNTRY_CODE') != '' && reqenv('MM_COUNTRY_CODE') !~ m#^(EE|FI|LV|LT|SE)$#">
ErrorDocument 403 /geo-blocked.html
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/geo-blocked\.html$
RewriteRule ^ - [F,L]
</IfModule>
</If>
# END GeoIP Block
Tiedoston geo-blocked.html tulee sijaita verkkosivuston document root -hakemistossa ja sen tulee olla itsessään verkkopalvelimen kautta käytettävissä.
Estetylle pyynnölle palautetaan edelleen HTTP-tila:
403 Forbidden
GeoIP-tunnistus perustuu IP-osoitteiden sijaintitietokantaan eikä ole 100-prosenttisen tarkka. VPN:n, proxyn, mobiilioperaattorin, pilvipalvelun tai muun välittävän verkon käytön yhteydessä tunnistettu maa voi poiketa käyttäjän todellisesta sijainnista.
Maakohtaista estoa tulisi siksi käyttää täydentävänä liikenteen rajoitus- ja tietoturvatoimenpiteenä, ei ehdottomana todisteena käyttäjän fyysisestä sijainnista.
Maakohtaista rajoitusta käytettäessä on huomioitava, että myös hakukoneiden robotit voivat tehdä pyyntöjä maista, joiden liikenne on verkkosivustolla estetty.
Esimerkiksi Googlebot voi tehdä pyyntöjä Yhdysvalloista. Jos US on estetty, tämä voi haitata verkkosivuston indeksointia Googlen hakukoneessa.
Googlebotia ei suositella sallittavaksi pelkästään User-Agent-otsakkeen perusteella, koska tämä arvo voidaan helposti väärentää.
Apache voi tarkistaa Googlebotin alkuperän DNS:n avulla. Esimerkiksi Viron, Suomen, Latvian, Liettuan ja Ruotsin liikenne voidaan sallia ja lisäksi sallia varmennettu Googlebot:
<IfModule mod_authz_core.c>
<IfModule mod_authz_host.c>
<RequireAny>
# Sallitut maat
Require expr "reqenv('MM_COUNTRY_CODE') =~ m#^(EE|FI|LV|LT|SE)$#"
# Jos GeoIP-tulosta ei ole, älä estä kävijää
Require expr "reqenv('MM_COUNTRY_CODE') == ''"
# Varmennettu Googlebot
Require host googlebot.com
</RequireAny>
</IfModule>
</IfModule>
Require host googlebot.com ei tarkista ainoastaan selaimen tai robotin ilmoittamaa nimeä. Apache tekee IP-osoitteelle käänteisen DNS-kyselyn ja tarkistaa tämän jälkeen saadun isäntänimen uudelleen eteenpäin tehtävällä DNS-kyselyllä.
Siksi pelkkä Googlebot User-Agent -otsakkeen väärentäminen ei riitä pääsyn saamiseksi.
HUOM! Tätä asetusta tulee käyttää aikaisemman GeoIP RewriteRule ... [F] -estosäännön sijasta, ei sen lisäksi.
Jos halutaan estää vain tavalliset käyttäjät Yhdysvalloista mutta sallia Googlebot, voidaan käyttää esimerkiksi:
<RequireAny>
Require expr "reqenv('MM_COUNTRY_CODE') != 'US'"
Require expr "reqenv('MM_COUNTRY_CODE') == ''"
Require host googlebot.com
</RequireAny>
Asiakkaan omien .htaccess-sääntöjen lisäksi palvelinpuoleinen tietoturvamonitori voi havaita poikkeuksellisen suuren tai haitallisen liikenteen ja tarvittaessa ottaa käyttöön myös väliaikaisen GeoIP-pohjaisen rajoituksen.
Tällaisen rajoituksen tarkoituksena on vähentää esimerkiksi:
Palvelinpuoleinen rajoitus voidaan kohdistaa tiettyyn verkkotunnukseen tai palveluun, eikä se riipu asiakkaan oman .htaccess-tiedoston sisällöstä.
Tällainen rajoitus voi olla väliaikainen ja sitä voidaan muuttaa tai se voidaan poistaa ongelmallisen liikenteen päätyttyä.
Jos verkkosivuston kävijät saavat odottamatta maakohtaisen 403-virheen, kannattaa tarkistaa verkkotunnuksen tai tilin juurihakemiston .htaccess-tiedostosta, onko sinne lisätty seuraavia rivejä (kohdan “(FI|EE|LT|LV|SE)” sisältö voi olla erilainen, mutta mukana on rivi “# BEGIN automated GeoIP Block”):
# BEGIN automated GeoIP Block
<If "reqenv('MM_COUNTRY_CODE') != '' && reqenv('MM_COUNTRY_CODE') !~ m#^(FI|EE|LT|LV|SE)$#">
ErrorDocument 403 "<div style='text-align:center'><b>403</b> - Access to this website is restricted based on IP geolocation</div>"
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^ - [F,L]
</IfModule>
</If>
# END automated GeoIP Block
Haluttaessa BEGIN- ja END-tagien välistä sisältöä voidaan muuttaa tai se voidaan poistaa kokonaan, kun ongelmatilanne on päättynyt ja verkkosivuston liikenne halutaan jälleen avata myös muualta kuin asetuksissa määritellyistä maista.