V poslední době bylo napadeno mnoho webů, kvůli zranitelnosti v API ve WordPressu. Chyba je opravena ve verzi 4.7.2, přesto ale weby na WordPressu jsou často terčem útoků. V článku proto zmíním možnosti, jak si web trochu více zabezpečit.
Nebudu se zde zabývat tím, že by nemělo být jméno pro správce admin, o síle hesel, rozdávání přístupů na potkání, pravidelným aktualizacím apod. Toto beru jako samozřejmost. Jen zmíním, že je dobré při instalaci změnit prefix databázových tabulek. Lze to udělat i později, ale není to tak pohodlné.
Odebrání tagů z head a chyba při přihlašování
Tento krok sice nepomůže zvýšit bezpečnost. Jednotlivé adresy budou stále dostupné, pouze to vyčistí hlavičky. Ale třeba zmizí, jaká verze WP je použita, což může být užitečné.
Následující kód stačí vložit do functions.php dané šablony.
function removeUnnecessaryTagsInHead() { remove_action( 'wp_head', 'wp_generator' ) ; remove_action( 'wp_head', 'wlwmanifest_link' ) ; remove_action( 'wp_head', 'rsd_link' ) ; remove_action( 'template_redirect', 'rest_output_link_header', 11, 0 ); remove_action( 'wp_head', 'wp_oembed_add_discovery_links'); remove_action( 'wp_head', 'rest_output_link_wp_head'); remove_action( 'template_redirect', 'wp_shortlink_header', 11 ); // Odebere odkazy na RSS, nemusí být úplně žádoucí... remove_action( 'wp_head', 'feed_links', 2 ); remove_action( 'wp_head', 'feed_links_extra', 3 ); } add_filter('init', 'removeUnnecessaryTagsInHead');
Špatné jméno nebo heslo
WordPress v základu při vyplnění špatného hesla zobrazí hlášku: Heslo pro jméno xxx není správné. Toto není úplně ideální, takto může uživatel zkoušet, jestli existuje přihlašovací jméno, a poté už jen hádat hesla. Naštěstí lze hlášku přepsat a vracet stále to stejné.
// Zrušíme detailní výpis kde je chyba při přihlašování function no_wordpress_errors() { return 'Chybné údaje!'; } add_filter('login_errors', 'no_wordpress_errors');
Zrušení XML-RPC a JSON API
XML-RPC již je ve WordPressu delší dobu, JSON API nově. Obojí ale umožní programově pracovat s WordPressem a také provádět útoky, proti kterým se hůře brání. Pokud není použita šablona, nebo jiná služba, která tyto API využívá, můžou být vypnuty.
Zatímco XML-RPC API se může vypnout úplně, u JSON API se to nedoporučuje. Pravděpodobně bude využíváno i v samotné administraci, takže jeho zakázáním by mohlo dojít k znefunkčnění nějaké části WordPressu.
Zrušení XML-RPC API
Zrušení lze provést vcelku jednoduše, a to zakázáním přístupu k souboru xmlrpc.php. Pokud ale je využito pingbacků u WP, tak ty jsou tvořeny právě přes XML-RPC. Já je ale nevyužívám, takže XML-RPC vypínám. Následující kód stačí vložit do na začátek souboru .htaccess.
<files xmlrpc.php> order allow,deny deny from all </files>
Zrušení JSON API
Jak bylo řečeno, úplné vypnutí se nedoporučuje. Naštěstí se dá zakázat přístup do API nepřihlášeným uživatelům, stačí vložit do functions.php v šabloně.
function disableNonLoggedUser($allow) { if(!is_user_logged_in()){ return new WP_Error('no_access', 'Not allowed', ['status' => 403 ]); } return $allow; } add_filter( 'rest_authentication_errors', 'disableNonLoggedUser' );
Úplně se dá API odříznout pomocí přesměrování v htaccess. Takto se dají zakázat i jednotlivé části API. Stačí zapsat tyto příkazy do .htaccess. Zde ale pozor, musí být po RewriteEngine On a před RewriteRule, který vše přesměruje na index.php.
# Zakáže celé JSON API RewriteCond %{REQUEST_URI} wp-json/wp [NC,OR] RewriteCond %{REQUEST_URI} wp-json/wp [NC] RewriteRule .* - [F] # Zakáže pouze část API s users a všechny metody s nimi RewriteCond %{REQUEST_URI} wp-json/wp/[^/]+/users [NC,OR] RewriteCond %{REQUEST_URI} wp-json/wp/[^/]+/users [NC] RewriteRule .* - [F]
Změny nastavení WordPressu
Následující úpravy jsou, stejně jako předchozí, charakteru Udělej si sám, pluginy jsou na řadě poté. Přesto by neměl být problém je zvládnout i se základními znalostmi.
Změny konfiguračního souboru
Všechny tyto úpravy se provádí v souboru wp-config.php:
// Zakáže editaci souborů (šablony apod.) přes administraci define('DISALLOW_FILE_EDIT', true); // Povolí automatické aktualizace i majoritních verzí jádra // Toto je na zvážení, jestli opravdu chcete // WordPress nyní provádí aktualizace minoritní automaticky define( 'WP_AUTO_UPDATE_CORE', true ); // Automatická aktualizace pluginů // Rovněž na zváření, jestli to chcete add_filter( 'auto_update_plugin', '__return_true' ); // To samé pro šablony add_filter( 'auto_update_theme', '__return_true' );
Zakázání spouštění PHP skriptů v uploads
Přes WordPress sice PHP soubor nelze nahrát, i tak ale nemusí být od věci spouštění skriptů PHP ve složce uploads zakázat. Stačí vytvořit soubor .htaccess a vložit jej do složky wp-content/uploads/.
<Files *.php> deny from all </Files>
Bezpečnostní pluginy
Nebudu se zde zabývat, který plugin je lepší. Každému sedí něco jiného, takže jen vypíšu ty nejznámější, nechť si každý vybere, co mu sedne.
- WordFence
- iThemes Security - osobní zkušenost
- Sucuri - rozšířen a doporučován
- All In One WP Security & Firewall
Pravidelné aktualizace
Jak jsem říkal, nebudu se zabývat tím, že je nutné provádět aktualizace jak WordPressu, tak pluginů a šablon. Přesto je tu nástroj, který s tímto může pomoct. Zabýval jsem se tímto nástrojem v článku Spravujte všechny WordPress weby z jednoho místa, a rozhodně vám může ulehčit aktualizace všech webů, bez složitého přihlašování do každého z nich.
Problém děravého JSON-API je více popsán na root.cz. Se zkušenosti ohledně zabezpečení WordPressu se můžete podělit v komentářích
K tomuto článku již není možné přidávat další komentáře
Komentáře
Užitečné rady, jak zabezpečit wordpress web jsem našla i tady: http://freshface.cz/zabezpeceni-wordpress-webu-behem-10-minut/