Bottien pysäyttäminen kirjautumissivulla vaatii kerroksellista puolustusta: estä automaatio jo verkon reunalla, tee kirjautumisesta vaikeampaa skripteille ja reagoi nopeasti poikkeuksiin. Alla konkreettinen, askel-askeleelta -opas joka toimii sekä pienellä että isommalla sivulla — kevyt lisäosattomuus huomioiden.
Miten puolustus toimii käytännössä (priorisoitu järjestys)
-
Estä botit reunalla (CDN / WAF)
-
Rajoita pyyntöjä palvelimella (rate limit)
-
Estä/vaimenna XML-RPC ja muut hyödyttömät rajapinnat
-
Lisää autentikoinnin esivaihe (Basic Auth / IP-sallitukset)
-
Automatisoitu esto (Fail2Ban)
-
Sovellustason rajoitukset (honeypot, transient/Redis throttle)
-
Koveta tilit (2FA, vahvat salasanat, rajoitetut roolit)
-
Lokitus, hälytys ja palautussuunnitelma
Käytännön konfiguraatiot ja esimerkit
-
CDN / WAF (helppo ja tehokas)
-
Ota käyttöön Cloudflare, Fastly tms. laitetasoinen suodatus. Aktivoi:
-
Bot Fight Mode / Bot Protection
-
Rate Limiting (esim. /wp-login.php ja /xmlrpc.php)
-
“Under Attack” mode isommissa hyökkäyksissä
Cloudflaren sääntö: rajoita POST-pyyntöjä wp-login.php:lle tai vaadi JS-tarkistus.
-
-
Nginx-rate limiting (estää massakokeilut ennen PHP:tä)
Lisäänginx.conf
tai vastaavaan:
http {
limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;
server {
location = /wp-login.php {
limit_req zone=login burst=5 nodelay;
include fastcgi_params;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
}
}
Tämä sallii 1 pyynnön/s keskimäärin, 5 piikkiä hetkeä kohden — estää massabottien piikin.
-
Apache: mod_evasive / .htaccess -perusrajoitus
Mod_evasive tai mod_security suosittu tuotannossa. Yksinkertainen .htaccess rajoitus:
<Files wp-login.php>
Order Deny,Allow
Deny from all
Allow from 1.2.3.4
</Files>
(Käytä vain jos sinulla on staattinen hallinta-IP.)
-
Basic Auth wp-adminin edessä (erittäin tehokas)
Nginx:
location ^~ /wp-admin {
auth_basic "Back Office";
auth_basic_user_file /etc/nginx/.htpasswd;
...
}
Apache: .htpasswd
ja AuthType Basic
-säännöt. Tämä estää WordPressin käsittelyä kokonaan ennen kuin botti pääsee läpi.
-
Fail2Ban: automaattinen IP-estäjä
Filter/etc/fail2ban/filter.d/wordpress.conf
(esimerkki):
[Definition]
failregex = <HOST> -.*"(POST|GET).*wp-login.php.*" # tai tunnista 401/302 epäonnistumiset
ignoreregex =
Jail /etc/fail2ban/jail.local
:
[wordpress]
enabled = true
filter = wordpress
action = iptables-multiport[name=wordpress, port="http,https"]
logpath = /var/log/nginx/access.log
maxretry = 5
bantime = 3600
Fail2Ban estää IP:t automaattisesti kun epäonnistumisten määrä ylittää rajan.
-
Estä XML-RPC jos et tarvitse sitä
Nginx:
location = /xmlrpc.php {
return 403;
}
Apache/.htaccess:
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
-
Kevyt sovellustason throttling ilman lisäosia (PHP-transient-esimerkki)
Lisää teemanfunctions.php
tai oma muokkaustiedosto:
function throttle_login_attempts() {
if ( 'POST' !== $_SERVER['REQUEST_METHOD'] ) {
return;
}
if ( strpos( $_SERVER['REQUEST_URI'], 'wp-login.php' ) === false ) {
return;
}
$ip = $_SERVER[’REMOTE_ADDR’];
$key = ’bf_attempts_’ . md5( $ip );
$data = get_transient( $key ) ?: [’count’=>0,’first’=>time()];
if ( $data[’count’] >= 5 && ( time() – $data[’first’] ) < 900 ) {
wp_die( ’Too many login attempts. Try again later.’, ’Too many attempts’, [ ’response’ => 429 ] );
}
if ( ! empty( $_POST[’log’] ) && ! empty( $_POST[’pwd’] ) ) {
$data[’count’]++;
set_transient( $key, $data, 900 );
}
}
add_action( ’init’, ’throttle_login_attempts’ );
Tämä on kevyempi vaihtoehto lisäosille: käyttää WP-transienteja. Redis/Obj-cache parempi suorituskyvylle.
-
Honeypot — piilotettu kenttä bottien ansaksi
Lisää login-lomakkeeseen piilotettu inputhoneypot
. Botit yleensä täyttävät kaiken; käyttäjät eivät näe kenttää. Jos kenttä ei ole tyhjä, blokkaa pyyntö. -
Muuta kirjautumis-URL:ia (ei foolproof, mutta vähentää skannauksia)
Vaihda/wp-login.php
polkua serveritasolla rewrite-säännöllä tai yksinkertaisella routing-korjauksella. Tämä ei ole turvallisuuskerros itsessään, mutta vähentää automaatioskannausten määrää. -
Kaksivaiheinen tunnistus (2FA)
2FA pysäyttää 99 % automaattisista murtautumisista. Voit käyttää kevyttä 2FA-ratkaisua (Google Authenticator -pohjainen) — jos haluat ilman isoja lisäosia, etsi minimal plugin tai käytä hostingin tarjoamaa 2FA:ta. -
Poista käyttäjänimien keräys (user enumeration)
Estä/?author=N
-pyynnöt ja REST API -users endpointit, jotka paljastavat käyttäjätunnuksia. Esimerkiksi:
add_filter( 'rest_endpoints', function( $endpoints ){
if ( isset( $endpoints['/wp/v2/users'] ) ) {
unset( $endpoints['/wp/v2/users'] );
}
return $endpoints;
});
-
Monitorointi ja hälytykset
-
Seuraa lokia reaaliaikaisesti (tail, grep).
-
Aseta yksinkertainen cron-skripti joka laskee epäonnistuneet kirjautumiset ja lähettää sähköpostin/slack-ilmoituksen.
-
Testaa reagointi: simuloitu hyökkäys ja varmista, että Fail2Ban/Cloudflare rajoitukset aktivoituvat.
WP-CLI hyödyllisiä komentoja ylläpitoon
-
Listaa käyttäjät:
wp user list
-
Nollaa salasana:
wp user update 1 --user_pass="UusiVahva123!"
-
Poista epäilyttävä tili:
wp user delete 23 --reassign=1
Nopeat checklist-toimenpiteet (tee nämä heti)
-
Estä XML-RPC, jos et käytä sitä.
-
Ota Cloudflare tai vastaava WAF & Rate Limiting.
-
Asenna ja konfiguroi Fail2Ban tai vastaava.
-
Lisää Nginx/Apache rate limit wp-login.php:lle.
-
Ota Basic Auth tai salli hallinta-IP:t jos mahdollista.
-
Pakota vahvat salasanat ja ota 2FA käyttöön.
-
Seuraa lokit ja testaa palautus- & reagointiprosessi.
Yhteenveto
Parhaat tulokset saat yhdistämällä verkko- ja palvelintason rajoitukset (CDN/WAF, rate limit), automaattisen eston (Fail2Ban) sekä sovellustason kovennuksen (2FA, honeypot, rajoitukset). Älä luota vain yhteen kerrokseen — bottien pysäyttäminen ajoissa perustuu kerrokselliseen puolustukseen ja nopeaan reagointiin.