WordPress tarjoaa monipuoliset työkalut käyttäjien hallintaan ja sisällön suojaamiseen. Suosittelemme käyttämään ensisijaisesti WordPressin omia ominaisuuksia – esimerkiksi yksittäisten sivujen salasanasuojausta, käyttäjärooleja tai kaksivaiheista tunnistautumista (2FA).
Jos tarvitset palvelintason rajoituksia tai maakohtaista reititystä, voit hyödyntää Seravon ympäristössä alla esiteltyjä menetelmiä.
IP-osoitteeseen perustuva pääsyn rajoittaminen
Jos sivustolla on staattisia tiedostoja tai hakemistoja (esim. sisäisiä dokumentteja), joiden tulee näkyä vain tietystä verkosta tuleville kävijöille, voit rajoittaa pääsyä IP-osoitteiden perusteella.
Luo uusi konfiguraatiotiedosto /data/wordpress/nginx/ip-restrict.conf:
location ^~ /restricted-section/ {
allow 1.2.3.4;
allow 5.6.7.8;
deny all;
}Ota asetus käyttöön käynnistämällä nginx uudelleen:
wp-restart-nginx
Varoitus: Älä koskaan aseta koko sivuston (location /) kattavia IP-rajoituksia. Koko sivuston estäminen katkaisee Seravon automaattisen valvonnan ja estää ylläpitotoimet. Jos haluat suojata pelkän hallintapaneelin, katso erillinen ohje Rajoita wp-admin pääsy IP-osoitteen perusteella.
Huomioi myös, että IP-osoitteet voivat muuttua (esim. mobiiliverkoissa), eikä IP-pohjainen rajoitus jätä käyttäjäkohtaista kirjautumislokia.
Maakohtainen pääsynhallinta ja uudelleenohjaus (GeoIP)
Seravon palvelinympäristö lisää saapuviin HTTP-pyyntöihin X-Seravo-Geo-Country-Code-otsakkeen, joka sisältää kävijän IP-osoitteeseen perustuvan kaksikirjaimisen ISO-maakoodin (esim. FI, SE, US). Otsakkeen avulla voit ohjata kävijöitä kieliversioihin tai estää liikenteen tietyistä maista.
Vaihtoehto 1: Maakohtainen uudelleenohjaus nginx-tasolla (Suositus)
Palvelintasolla tehty ohjaus on nopein eikä kuormita PHP:tä tai välimuistia. Lisää sääntö esimerkiksi tiedostoon /data/wordpress/nginx/geo-redirect.conf:
# Ohjaa suomalaiset kävijät osoitteeseen esimerkki.fi
if ($http_x_seravo_geo_country_code = "FI") {
return 302 https://esimerkki.fi$request_uri;
}
# Ohjaa ruotsalaiset kävijät osoitteeseen esimerkki.se
if ($http_x_seravo_geo_country_code = "SE") {
return 302 https://esimerkki.se$request_uri;
}
# Estä liikenne tietystä maasta (403 Forbidden)
if ($http_x_seravo_geo_country_code = "XX") {
return 403;
}
Ota muutokset käyttöön komennolla wp-restart-nginx.
Vinkki: Käytä maakohtaisissa ohjauksissa tilapäistä 302-ohjausta pysyvän 301-ohjauksen sijaan, jotta selain ei tallenna ohjausta pysyvästi esimerkiksi matkustavien käyttäjien laitteille.
Vaihtoehto 2: Maakohtainen uudelleenohjaus PHP-koodilla
Jos tarvitset monimutkaisempia ehtoja (esim. evästeiden tai sisäänkirjautumisen tarkistusta), voit lukea otsakkeen PHP:ssä arvolla $_SERVER['HTTP_X_SERAVO_GEO_COUNTRY_CODE']:
<?php
if ( isset( $_SERVER['HTTP_X_SERAVO_GEO_COUNTRY_CODE'] ) ) {
$country = strtoupper( $_SERVER['HTTP_X_SERAVO_GEO_COUNTRY_CODE'] );
switch ( $country ) {
case 'FI':
header( 'Cache-Control: no-store, no-cache, must-revalidate, max-age=0' );
header( 'Location: https://esimerkki.fi', true, 302 );
exit;
case 'SE':
header( 'Cache-Control: no-store, no-cache, must-revalidate, max-age=0' );
header( 'Location: https://esimerkki.se', true, 302 );
exit;
}
}
Huomio välimuistista: Jos teet GeoIP-ohjauksia PHP:llä, lähetä aina Cache-Control: no-store, no-cache -otsake ennen Location-otsaketta. Muuten HTTP-välimuisti voi tallentaa uudelleenohjauksen ja ohjata myös muiden maiden kävijät väärään osoitteeseen.
HTTP-perusautentikointi (Basic Auth)
HTTP-perusautentikointi sopii yksinkertaiseksi lisäsuojaksi staattisille tiedostoille ja hakemistoille. Jos haluat suojata varsinaisia WordPress-sivuja tai -artikkeleita, toteuta suojaus WordPressin omalla salasanasuojauksella tai lisäosalla.
Luo ensin käyttäjätunnukset ja salasanat sisältävä tiedosto htpasswd-työkalulla. Käytä -c-vipua vain ensimmäistä käyttäjää luotaessa (muuten olemassa oleva tiedosto ylikirjoitetaan):
# Luo uusi tiedosto ja ensimmäinen käyttäjä
htpasswd -bc /data/wordpress/nginx/.htpasswd tunnus1 salasana1
# Lisää toinen käyttäjä samaan tiedostoon (ilman -c-vipua)
htpasswd -b /data/wordpress/nginx/.htpasswd tunnus2 salasana2
Aktivoi suojaus halutulle hakemistopolulle luomalla tiedosto /data/wordpress/nginx/htauth.conf:
location ^~ /restricted-section/ {
auth_basic "Suojattu alue";
auth_basic_user_file /data/wordpress/nginx/.htpasswd;
}Ota asetus käyttöön komennolla wp-restart-nginx.
Varoitus: Älä koskaan aseta HTTP-perusautentikointia koko sivustolle (location /), sillä se estää Seravon automaattisen valvonnan toiminnan. Jos haluat piilottaa keskeneräisen sivuston julkisuudelta, katso ohje Onko tilaamani sivusto heti julkinen sekä rakenteilla olevan sivuston piilottaminen.
Dynaamisten WordPress-sivujen rajaaminen PHP:llä
Koska WordPressin kestolinkit (pretty permalinks) reititetään index.php-tiedoston kautta, palvelintason hakemistosäännöt eivät suojaa yksittäisiä WordPress-sivuja tai mukautettuja sisältötyyppejä.
Jos haluat rajata tietyn sivun tai osion vain kirjautuneille käyttäjille teeman functions.php-tiedostossa tai omassa lisäosassa, käytä template_redirect-koukkua. Muista kutsua nocache_headers()-funktiota ennen ohjausta, jotta Seravon HTTP-välimuisti ei tallenna uudelleenohjausta:
<?php
add_action( 'template_redirect', function () {
// Älä rajoita komentorivikomentoja tai tausta-ajoja
if ( wp_doing_cron() || ( defined( 'WP_CLI' ) && WP_CLI ) ) {
return;
}
// Vaadi sisäänkirjautuminen esimerkiksi sivulle /intranet/
if ( is_page( 'intranet' ) && ! is_user_logged_in() ) {
nocache_headers();
auth_redirect(); // Ohjaa kirjautumissivulle ja palauttaa käyttäjän takaisin
}
} );
Jos haluat rajata pääsyn vain tietylle käyttäjäroolille sisäänkirjautumisen lisäksi, korvaa ehto ! is_user_logged_in() esimerkiksi tarkistuksella ! current_user_can( 'edit_posts' ) ja ohjaa luvattomat käyttäjät etusivulle funktiolla wp_safe_redirect( home_url() ); exit;.
Seravon automaattiset pyyntörajoitukset (Rate Limiting)
Tietoturvan ja palvelimen vakauden varmistamiseksi Seravon ympäristössä on käytössä automaattinen pyyntöjen määrän rajoitus (PHP flood protection). Se on mitoitettu niin, ettei se häiritse normaalia sivuston käyttöä.
Rajoitus aktivoituu vain, jos kaikki seuraavat ehdot täyttyvät samanaikaisesti:
Sivustolle tulee yli 200 HTTP-pyyntöä minuutissa.
Pyynnöt kohdistuvat dynaamisiin WordPress/PHP-prosesseihin (eivät välimuistissa oleviin sivuihin).
Kaikki pyynnöt tulevat samasta IP-osoitteesta.
Jos raja ylittyy, palvelin palauttaa tilakoodin 429 Too Many Requests ja kirjaa merkinnän lokiin /data/log/nginx-error.log. Rajoitus ei koske staattisia tiedostoja (kuvat, CSS, JS) eikä HTTP-välimuistista palveltavia sivuja.
Yleisimmät virhetilanteet
Sivusto palauttaa virheen
429 Too Many Requestsintegraation tai lisäosan ajon aikana: Ulkoinen rajapintakutsu, kuvien massatuonti tai välimuistin esilataaja tekee yli 200 PHP-pyyntöä minuutissa samasta IP-osoitteesta. Tarkista pyyntöjen lähde ja osoitteet lokista/data/log/nginx-access.logja harvenna pyyntötahtia.WordPress-sivu ei suojaudu
nginx-pohjaisella Basic Auth -säännöllä: WordPressin kestolinkit (pretty permalinks) reititetäänindex.php-tiedoston kautta, jotennginx-hakemistosääntö ei suojaa virtuaalisia WordPress-osoitteita. Käytä dynaamisille sivuille WordPressin sisäänrakennettua salasanasuojausta tai pääsynhallintalisäosaa.Muutokset
nginx-asetuksissa eivät astu voimaan: Aja muutosten jälkeen aina komentowp-restart-nginxja tyhjennä tarvittaessa välimuisti komennollawp-purge-cache.GeoIP-ohjaus ohjaa kaikki kävijät samaan maaversioon: Jos käytät PHP-pohjaista GeoIP-ohjausta ilman
Cache-Control: no-store-otsaketta, HTTP-välimuisti tallentaa ensimmäisen kävijän saaman uudelleenohjauksen. Lisää PHP-koodiin välimuistin esto tai toteuta ohjaus suoraannginx-tasolla.
Katso myös
Oikein mitoitetut pääsyrajoitukset suojaavat sivuston arkaluontoiset osat ja ohjaavat kansainväliset kävijät oikeaan kieliversioon ilman ylimääräistä kuormitusta. Mikäli tarvitset apua nginx-sääntöjen määrittämisessä tai 429-pyyntörajoitusten selvittämisessä, asiakaspalvelumme auttaa osoitteessa [email protected].
