29. srpen 2013
Prevence brute force attack na Wordpress s přetížením serveru
Možná nevíte, že Wordpress má v základní instalaci celkem nevhodné nastavení, které přímo navádí k útoku hrubou silou na prolomení administrátorského účtu: Co je ale ještě horší, tenhle způsob prolomení hesla (brute force attack) formou DDoS útok má za následek totální přetížení serveru.
Chyba 1 - Ve Wordpress útočník neví pouze heslo
Administrace webu běžícího na wordpressu má vždy na stejné URL, tedy doména/wp-admin, výchozí administrátorské jméno je "admin", které je obvykle ponecháno při instalace beze změny. Pro získání přístupu do administrace a plnou kontrolu nad webem má tedy útočník 2 ze 3 indicií. Zná URL, předpokládá výchozí uživatelské jméno a stačí zkoušet všechny možné kombinace hesla, dokud se nestrefí a login neprojde. Tady totiž přichází ke slovu další bezpečnostní opomenutí v návrhu Wordpress.
Chyba 2 - Neomezený počet pokusů na login
Bohužel není nijak omezený počet pokusů na login. Na jeden účet se tak můžete z jedné IP adresy pokoušet přihlásit třeba tisíckrát nebo milionkrát za sebou. Není zde nic takového, jako ochrana X pokusů a třeba na hodinu útrum, nedojde k žádnému dočasnému uzamčení, nebo ignorování pokusů z dané adresy. O brute force attack si tak wordpress weby přímo říkají. A tady přichází třetí zádrhel.
Chyba 3 - Špatný návrh databáze a velké zatížení při spouštění logovacího scriptu
Zatímco uživatelskou přívětivost, jazykové mutace a systém pluginů má wordpress vymyšlené moc pěkně, návrh databázové struktury výmýšleli zřejmě vývojáři databázemi nepolíbení. Tak špatně a neefektivně navrženou databázi má máloco. Pro načtení jedné stránky se musí volat spousta SQL dotazů nad jednou tabulkou, navíc opakovaně, či rekurzivně a dochází k velmi výraznému zatížení databáze. Tuto známou bolístku Wordpressu řeší cachovací pluginy, které zatížení databáze při opakovaném načtení snižují na únosnou mez. Jenže při pokusu o login se cache nevyužije, zatěžuje se databáze a celkově je logovací stránka wordpressu jednou z těch které výkonově server opravdu nepotěší. Což obvykle není pro jednotlivý login až tak podstatné. Problém nastává při útoku.
Brutte force attack shodí server
Ve chvíli kdy začne útočník pomocí DDoS útoku z mnoha IP adres zkoušet login, začíná zatížení serveru a databáze stoupat raketovým tempem, odezva serveru na požadavky se naopak stejně rychlým tempem snižuje k nule. Dochází k zacyklenému restartování http služby z důvodu totálního přetížení a server je tak vytížený, že se na něj nedá připojit ani telnetem.
Prevence přetížení serveru
Vzhledem k špatnému návrhu logovacího scriptu jde udělat jedinou věc, zamezit zavolání PHP scriptu. Apache totiž zvládne o řády víc požadavků na soubor, než spuštění a vygenerování stránky z PHP. Jako prevence je tedy potřeba na úrovni souborů zamezit přístupu k logovacímu formuláři a zavolání přihlašovacího processu.
Toto se provede pomocí .htaccess a .htpassword, což je přiřazení hesla pro daný soubor na úrovni prohlížeče. Není-li zadaný správný login, nikoliv wordpressový, ale pro přístup k souboru, nejdode k zavolání PHP scriptu a máme vyhráno.
Do .htaccess vložte tyto řádky
# Protect wp-login
<Files wp-login.php>
AuthUserFile ~/.htpasswd
AuthName "Chraneny pristup"
AuthType Basic
require user vassupertajnyuzivatel
</Files>
Kde "~/.htpasswd" je cesta k souboru ".htpasswd", takto zapsaný regulární výraz odkazuje na domovský adresář uživatele, v případě víceúrovňových struktur, podadresářůl pro subdomény apod. je třeba tento kus kódu poupravit.
"vassupertajnyuzivatel" může být cokoliv textového si zamanete (třeba franta22). Pouze stejné jméno uživatele musíte dát do .htpasswd souboru. Doporučuji použít třeba tento online generátor .htpaswd, kde si můžete nechat vygenerovat i náhodné heslo a to pak zašifrovat pro .htpasswd
Soubor .htpasswd pak jen nakopírujte do cesty specifkované v AuthUserFile a je to. Při pokusu o přihlášení do administrace na vás nejprve vyskočí browser okénko s žádostí o zadání jména a heslo pro přístup do chráněné sekce. A po správném zadání se Vám zobrazí standardní logovací formulář pro wordpress.
Další bezpečnostní doporučení pro Wordpress
Vzhledem k problematice defaultního nastavené a náchylnosti k brute force útoku jsou ještě následující bezpečnostní doporučení. Ty neřeší primární problém přetížení serveru, ale znesnadňují možné prolomení hesla, pokud by zaheslování na úrovni souborů někdo obešel.
- Změňte si při instalaci výchozího uživatele z "admin" na něco jiného. Pokud už je uživatel admin vytvořen použijte plugin Admin username changer a změňte ho.
- Používejte silná těžko prolomitelná hesla, minimálně pro administrátorské účty
- Omezte počet pokusů o login z neomezeně na nějaké pevně daný počet za určitou dobu. K tomu můžete použít některý z pluginů, doporučovaných přímo na codex.wordpress.com
- Pokud se do administrace připojujete jen z pevně daných IP adress proveďte omezení v .htaccess pouze na konkrétní IP adressy. Bohužel se pak nedá snadno připojit do adminsitrace odněkud jinud.
Další informace můžete nalézt na http://codex.wordpress.org/Brute_Force_Attacks