wordpress-logoMož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.

  1. 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.
  2. Používejte silná těžko prolomitelná hesla, minimálně pro administrátorské účty
  3. 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
  4. 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

Komentáře   

Jan Nachtigal
0 #1 Jan Nachtigal 2013-08-30 07:15
Používám All in One WP Security - a každý den mi chodí desítky zpráv o zablokovaných IP. Takže díky za další tipy. Vyzkouším.
alf
+1 #2 alf 2013-08-30 08:01
proč tak složitě? stačí přejmenovat složku wp-admin (což je i doporučováno) a problem solved.
Stanislav Duben
0 #3 Stanislav Duben 2013-08-30 08:07
alfe to je pravda i tak to jde řešit, i když si nejsem jistý, vzhledem k tomu jak jsou občas psané některé pluginy, jestli se tím nerozhodí nějaká funkčnost. Každopádně spousta webů má přímo v menu odkaz na administraci, aby se tam přispěvovatelé snadno dostali, protože si ani wp-admin neumí zapamatovat (pravda přejmenování by mohlo něco řešit). Jakmile tu novou cestu robot najde, tak ale opět může začít přetěžovat server. Výhoda tohohle řešení je, že útočník vyvolá jen jeden http request a nespustí php script i kdyby tu novou tajnou url pro administraci našel.
alf
0 #4 alf 2013-08-30 08:41
jo, je pravda, že linky pak nemusí fungovat, každopádně funkčnost zůstane zachována :)

Přidat komentář


Bezpečnostní kód
Obnovit