Näin estät botit murtautumasta kirjautumissivulleBottien 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)

  1. Estä botit reunalla (CDN / WAF)

  2. Rajoita pyyntöjä palvelimella (rate limit)

  3. Estä/vaimenna XML-RPC ja muut hyödyttömät rajapinnat

  4. Lisää autentikoinnin esivaihe (Basic Auth / IP-sallitukset)

  5. Automatisoitu esto (Fail2Ban)

  6. Sovellustason rajoitukset (honeypot, transient/Redis throttle)

  7. Koveta tilit (2FA, vahvat salasanat, rajoitetut roolit)

  8. Lokitus, hälytys ja palautussuunnitelma

Käytännön konfiguraatiot ja esimerkit

  1. 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.

  1. 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.

  1. 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.)

  1. 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.

  1. 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.

  1. 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>

  1. Kevyt sovellustason throttling ilman lisäosia (PHP-transient-esimerkki)
    Lisää teeman functions.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.

  1. Honeypot — piilotettu kenttä bottien ansaksi
    Lisää login-lomakkeeseen piilotettu input honeypot. Botit yleensä täyttävät kaiken; käyttäjät eivät näe kenttää. Jos kenttä ei ole tyhjä, blokkaa pyyntö.

  2. 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ää.

  3. 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.

  4. 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;
});

  1. 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)

  1. Estä XML-RPC, jos et käytä sitä.

  2. Ota Cloudflare tai vastaava WAF & Rate Limiting.

  3. Asenna ja konfiguroi Fail2Ban tai vastaava.

  4. Lisää Nginx/Apache rate limit wp-login.php:lle.

  5. Ota Basic Auth tai salli hallinta-IP:t jos mahdollista.

  6. Pakota vahvat salasanat ja ota 2FA käyttöön.

  7. 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.

💬
Bloggaaja vinkkaa 🌐