Velký průvodce bezpečností WordPressu

Jako každý open source, se WordPress potýká s útoky a bezpečnost není radno podceňovat. Doby, kdy byl internet doménou nadšenců jsou dávno pryč a z “onlinu” se stal regulérní podnikatelský obor. 

A stejně tak, jako si na sklad zboží dáte mříže a bezpečnostní dveře, musíte si ochránit svůj virtuální majetek.

Zabezpečení WordPressu se dá rozdělit do několika tématických skupin a my se jim budeme všem věnovat. 

Protože každý web, nebo e-shop musí být někde umístěn, hosting je nezbytnou součástí provozování stránek. Hostingové společnosti mají vlastní postupy, jak zabezpečit jejich servery před napadením a těm se věnovat nebudeme. V čem se nabídky hostingových společností liší můžete zjistit v magazínu https://vseohostingu.cz/.

O WordPressu koluje řada mýtů a jedním z nich je to, že je špatně zabezpečený. To není pravda. Jádro je pravidelně aktualizováno a jakmile je nalezena nějaká chyba, velmi rychle je vydána záplata. Za dobu, co se WordPressu věnuji, jsem ještě neslyšel o webu, který by byl napaden, pomocí chyby v jádru. 

Vždy, když dojde na hacknutí webu, jsou na vině slabá hesla, používání jednoho hesla pro různé služby, chyby v pluginech a šablonách, neodborné používání. Jak příklad může sloužit mnoho napadených webů, které měly nainstalovány Revolution Slider.

Obsah článku

Uživatelé a přihlášení

Bezpečná hesla

I když budete věnovat pozornost tomu, aby jste používali ty nejnovější pluginy a poslední verzi WordPressu, tak celé vaše snažení může zmařit použití slabých hesel.

Rychlost, s jakou je dnes možné provádět slovníkové útoky je neuvěřitelná a prolomení jednoduchého hesla je otázkou několika minut. 

Bohužel, uživatelé jsou pohodlní a nechce se jim používat silná, ale obtížně zapamatovatelná hesla. Což vede k tomu, že si stěžují a provozovatelé e-shopů často požadují, nastavit možnost použití slabého hesla. 

I kdyby vás lákalo vyjít klientovi, nebo uživatelům vstříc, tak to nedělejte. Chráníte svoje podnikání a proto nikdy nepovolujte použití slabého hesla. Existuje na to filtr woocommerce_min_password_strenght, ale zmiňuji jen pro úplnost a pokud jej najdete v kódu webu, který přebíráte do správy, tak to smažte. Sice budou mít uživatele nepohodlí, ale vy o dost klidnější spánek.

V základním nastavení WordPress generuje při vytvoření uživatele silné heslo:

Bohužel vám dovolí použít i slabé heslo, ale musíte jej povolit:

Nepříjemné je, že v kódu editace uživatelského účtu není možnost, jak checkbox odebrat, můžete jej pouze skrýt, pomocí css, nebo odstranit pomocí javascriptu.

No Weak Passwords

Pro větší jistotu, můžete použít plugin No weak password, který neřeší povolení slabého hesla, ale kontroluje použité heslo, proti seznamu slabých hesel, uložených v souboru, který plugin obsahuje. Bohužel, plugin neumožňuje soubor rozšiřovat, po aktualizaci se vždy přemaže.

WC Password Strength Settings

Pluginy, jako jsou WooCommerce, vytváří vlastní přihlašovací formuláře a nepoužívají výchozí formulář WordPressu. Pro jistotu, že uživatelé nemohou zadávat jednoduchá hesla, můžete použít tento plugin, jenž vám umožní nastavit úroveň obtížnosti hesla a hlášky které se u registračního WooCommerce formuláře budou zobrazovat.

Odhlášení neaktivních uživatelů

Pokaždé, když se přihlásíte do WordPressu, vytvoří se cookie, která má nastavenou platnost na dva dny. Poté vyprší. V případě, že při přihlášení zaškrtnete volbu “Pamatuj si mě”, je cookie platná dva týdny. 

Čím déle je uživatel přihlášen, tím větší je bezpečnostní riziko. Přestože není nijak velké, je reálné. Počtem uživatelů, kteří se do vašeho webu přihlašují, riziko roste. Proto je vhodné, nastavit pro neaktivní uživatele expiraci přihlášení. Sice to bude menší nepohodlí, ale bezpečnost je důležitá. 

A protože ve WordPressu na všechno existuje plugin i pro odhlášení neaktivních uživatelů takový máme. Samozřejmě, dalo by se to vyřešit pomocí kódu, ale to není úplně cílem tohoto článku.

Inactive Logout

Poměrně jednoduché nastavení vám nabídne vložení textu, jenž se bude zobrazovat jako upozornění před odhlášením a možnost nastavení doby, po jaké bude uživatel odhlášen.

Výborným prvkem je možnost nastavit dobu pro odhlášení pro různé role. Dokonce si můžete nastavit, kam je po odhlášení přesměrujete, což například u zákazníků e-shopu může být vcelku důležité.

Rozšíření přihlašovacího formuláře

Součástí zabezpečení přihlašovacího formuláře, může být jeho rozšíření o bezpečnostní prvek. Běžně to bývá ReCaptcha, přidání kontrolní otázky, nebo HoneyPot. V podstatě všechny tyto postupy mají za úkol, odfiltrovat strojové útoky na přihlašovací, nebo registrační formulář a zabránit tak uhodnutí hesla uživatele.

HoneyPot

HoneyPot je v zjednodušeně řečeno pastička na roboty.

Rozšíří vám registrační a přihlašovací formulář o pole, které je pro návštěvníka skryté, ale je pojmenováno tak, že ho robot považuje za vyžadovanou součást formuláře. Tím, že ho vyplní, dojde k zablokování registrace, nebo přihlášení. Přestože se jedná o poměrně triviální ochranu, dokáže odfiltrovat ty nejběžnější a méně sofistikované boty.

Bezpečnostní otázka

S tím se asi setkal každý, kdo si někde zakládal e-mail, nebo se registroval do nějaké služby – bezpečnostní otázka

Vybrali jste si ze seznamu možných otázek a k nim jste vyplnili příslušnou odpověď. Stejně jako u HoneyPotu, jde o ztížení možnosti prolomení uživatelova hesla, tentokrát pomocí odpovědi na otázku. Zvyšuje se tak počet kombinací, které musí robot vyzkoušet, než se u podaří uspět.

ReCaptcha

Jedna z nejznámějších ochran jakéhokoliv formuláře je ReCaptcha. Ať to je již checkbox . Nejsem robot, nebo výběr obrázků z nabídky, Google nám umožňuje využívat jeho technologii na ochranu před spammery a útočníky. Pro implementaci reCaptcha do WordPressu je k dispozici řada free pluginů, jen si musíte vybrat ten, který vám bude vyhovovat. Systém pak bude vyhodnocovat, zda jde o přihlášení reálného uživatele, nebo o automatický útok. 

Nic není absolutně dokonalé a jak HoneyPot i ReCaptcha jsou prolomitelné, ale stále jste ve větším bezpečí, když jeden z těchto prvků budete používat, než když nebudete. 

Omezení počtu nesprávného přihlášení

Všechny útoky na přihlašovací formulář, mají jedno společné. Útočník se snaží opakovaně dosáhnout výsledku. Proto by jedním ze základních prvků zabezpečení WordPressu, mělo být omezení počtu opakovaných přihlášení. Někdy to může být pro uživatele nepříjemné, ale nedá se nic dělat, je to jedna z nejlepších ochran. Pokaždé, když se někdo pokusí vícekrát neúspěšně přihlásit, plugin jej na nějakou dobu zablokuje. 

Samozřejmě, že blokaci lze obejít pomocí proxy a změnou IP adresy, ale omezení počtu přihlášení odfiltruje většinu automatizovaných útoků. Většina bezpečnostních pluginů již tuto možnost obsahuje, takže není vždy nutné instalovat samostatný plugin.

Omezení přihlášení na e-mailovou adresu

Když už se probíráme pluginy, které mají případnému útočníkovi ztížit život, nemůžeme zapomenout na plugin, jenž vynucuje přihlášení pomocí e-mailu uživatele. 

Při běžném přihlášení se můžete přihlásit svým uživatelským jménem, nebo heslem. Jedním z postupů při útoku je pokus o získání uživatelského jména – když víte, že uživatel existuje, můžete se zaměřit na prolomení hesla. Jakmile vynutíte přihlášení pomocí e-mailu, tak zase o kousek zvýšíte pravděpodobnost, že k prolomení nedojde.

Korektní info u nesprávného přihlášení

To co vidíte na screenu je přihlašovací formulář, pokud zadáte špatné údaje. Té červené hlášce nahoře se říká login hints a vypisuje případné chyby při přihlášení. V tomto případě je v pořádku, protože říká, že jeden z údajů je špatný. Nejsem si jist, zda to je již součástí WordPressu, ale na některých webech se mi po zadání špatného hesla, zobrazila hláška – zadané heslo není správné. To napoví případnému útočníkovi, že našel uživatele a usnadní mu to práci. 

Proto si zkontrolujte, že se váš přihlašovací formulář chová správně a případně použijte snippet, který hlášku upraví – https://gist.github.com/Musilda/3c907412948dbd079d1b1cc5ebe4482e

Změna přihlašovací url

Jeden z nejúčinnějších způsobů ochrany, vzhledem k poměru náročnost/výkon. Jednoduchý plugin, který změní přihlašovací url, v podstatě znemožní většinu pokusí o prolomení přihlášení a podobných útoků. Navíc, máme výhodu v tom, že čeština není dominantní jazyk a pokud použijeme pro označení url nějaké české slovo v kombinaci s čísly, bude velmi těžké přihlašovací url vůbec najít. Neříkám, že to je nemožné, ale valná většina útoků necílí na konkrétní web, ale brouzdají internetem a hledají otevřená vrátka. A když ta vrátka nenajdou, nemohou zaútočit. Velmi efektivní způsob ochrany.

Dvoufaktorové přihlášení

Vyšší úrovní ochrany přihlášení uživatele do WordPressu je dvoufaktorové přihlášení. Dá se říci, že každý administrátor na webu, s kterým to myslíte vážně, by měl mít nastavené dvoufaktorové přihlášení. Funguje to tak, že se do mobilního telefonu stáhnete aplikaci – já používám Google Authenticator a při každém přihlášení musíte zadat kód, který se vám v aplikaci vytvoří. Přestože existuje několik pluginů, které to ve WordPressu umožní, vzhledem k tomu, že používám WordFence, nastavuji si dvoufaktor tam. 

Nevýhodou je, že každý admin musí mít svůj účet a přístup se nedá sdílet. V každém případě je dvoufaktorové přihlášení dobrou volbou v zabezpečení webu.

Odstranění uživatele admin

Možná se vám to bude zdát jako automatické, ale odstranění uživatele admin, není až tak automatické. Celkem běžně dostávám přístupy do WordPressu pro admina. Ono to není nic proti ničemu, ale každý robot automaticky zkouší login admina. Tím že jej odstraníte, ztížíte možnost prolomení hesla. Jednoduchá záležitost, která by se měla dělat po každé instalaci, nebo převzetí webu do správy. Zabere to chvilku a máte klid.

Nastavení odpovídajících rolí

Co se týká bezpečnosti obecně, platí, že slabým místem jsou vaši uživatelé. Každý administrátor by měl mít představu, jaká oprávnění mají určité uživatelské role a jak je má případně upravit. Není nic horšího, když z neznalosti, nebo zlého úmyslu, vám nějaký uživatel web poškodí. Vždy je třeba zvážit, kam má mít přístup například manager obchodu, kam redaktor a kam šéfredaktor.

User role editor

Když se dostanete do situace, že budete potřebovat řešit oprávnění podrobněji, je nejlepší použít některý z pluginů, které jsou k dispozici. Na to, abyste nastavovali oprávnění pomocí kódu, musíte mít opravdu velký přehled. 

User role editor vám umožní upravovat oprávnění pro stávající role, nebo pro role, které vytvoříte.

WordPress, pluginy a šablony

V předchozí části jsem se věnoval především bezpečnosti přihlášení do WordPressu, což je jedno z často propíraných témat, ale ještě větší diskuzi vyvolává bezpečnost WordPressu obecně. 

Vydávají se články, e-booky, návody na téma bezpečnost, v diskuzích se píše, že někdo má hacknutý WordPress web a vždy se kolem toho objeví komentáře typu:

  • WordPress je děravý
  • Nejlepší ochranou je WordPress nepoužívat 
  • a podobně. 

Já samozřejmě budu WordPress hájit, z několika důvodů:

  1. Je to nejpoužívanější systém, počet napadených webů bude v absolutních číslech nejvyšší. 
  2. Jde o Open source, ke kódu má přístup kdokoliv a chybu v něm může také nalézt kdokoliv. Bezpečností problémy se nevyhýbají žádnému Open Source řešení. 
  3. WordPress je jen jádro a na něm postavené weby používají deseti tisíce různých šablon a pluginů, jenž jsou napsány vývojáři s různou kvalitou.
  4. Pokud se nejedná o opuštěný projekt, je většinou v řádech dní vydána oprava. 

Přesto si musíme být vědomi rizik, jaké při používání vznikají a na základní věci se chci zaměřit v této části. 

WordPress a jeho aktualizace

Jádro WordPressu je neustále udržováno a bezpečnostní aktualizace jsou vydávány poměrně rychle. Zde najdete seznam aktualizací od roku 2003 – https://codex.wordpress.org/WordPress_Versions

Zajímavé na seznamu je to, že například 30. října 2020 byly vydány aktualizace pro verze 5.5.3, 5.4.4, 5.3.6 a další. Jednalo se o bezpečnostní aktualizaci a opravy byly vydány i pro starší verze, aby se mohly aktualizovat i weby, které nejedou na nejnovějším WordPressu.

A v tuto chvíli začnu opakovat mantru, která se ponese celou touto částí – aktualizace. 

Aktuální WordPress je nezbytný k tomu, aby váš web někdo nenapadl. Mimo to ale jsou odstraňovány různé nalezené chyby a přidávány nové funkce. Zároveň vývojáři pluginů a šablon upravují své produkty a respektují vývoj jádra. 

Poměrně běžná praxe útočníků je scanování webů napříč internetem a vyhledávání instalací se známými zranitelnostmi. A pokud takovou používáte, je to jak otevřené dveře s pozváním. Dřív nebo později si na vašem webu někdo smlsne.

Šablony

Nejprve si odbudeme část s aktualizacemi. Stejně jako u jádra, je nezbytné šablony pravidelně aktualizovat. Bez aktualizace hrozí, že již opravené bezpečnostní chyby, vy bude mít stále na webu. 

Častým důvodem pro neaktualizování šablony, bývají úpravy, které v ní někdo udělal. WordPress proto obsahuje mechanismus child theme, kdy úpravy můžete dělat v ní a rodičovská šablona je nedotčená a může se pravidelně a bezpečně aktualizovat. 

Co je child theme se můžete dočíst v článku https://musilda.cz/child-theme-ve-wordpress/. 

Jak si ale vybrat šablonu, která je bezpečná? 

Stačí dodržet několik věcí:

  • zdroj – stahujte a kupujte šablony jen z ověřených zdrojů
  • ověřte si, zda není šablona opuštěná a jak dlouho je od posledního komentáře v fóru podpory
  • projděte si recenze
  • zkontrolujte, zda šablona podporuje verze WordPressu, PHP a pluginů, které budete používat

Zdroje šablony – ověřený zdroj je takový vágní pojem, ale například WordPress.org je spolehlivý zdroj, protože, než je šablona do repositáře vložena, projde kontrolou, která se na bezpečnost také zaměřuje. Každá šablona z tohoto zdroje musí splňovat předem stanovené podmínky, viz. například Theme developer handbook – https://developer.wordpress.org/themes/theme-security/data-sanitization-escaping/

U jiných zdrojů je to již trošku složitější, protože co developer, to jiné postupy, jiná kvalita. Je třeba rozlišovat marketplaces a konkrétní developery. Když vám někdo řekne, že na ThemeForest najdete kvalitní šablony, tak je to pravda, protože schvalovací proces si vzal postupy z WordPress.org, ale nejsou tak pečliví, jak by bylo potřeba. Také si musíte uvědomit, že se to šablonu od šablony liší, protože na ThemeForest prodává řada vývojářů. 

Konkrétně tam věnujte pozornost tomu, jak developer reaguje a kdy vyšla poslední aktualizace. 

V tomto směru je lepší mít vybranou firmu, s kterou jste spokojeni a používat jejich šablony. Pak se pravděpodobně nedočkáte překvapení. 

Zjednodušeně řečeno, že pokud použijete na váš web šablonu, jako je Astra, GeneratePress a podobně, vedle nešlápnete. Stále ale platí – sledovat aktualizace. Nebo si na to někoho najmout – s tím vám mohu pomoci, pokud potřebujete někoho na pravidelnou správu, napište mi – musilda@musilda.cz

U šablon na míru je to daleko snažší, pokud v ní není nějaký opravdu špatně napsaný a neošetřený script, většinou si takové šablony útočník ani nevšímá, respektive s ní neztrácí čas. Je jednodušší proskenovat internet a hledat šablony, které obsahují zranitelnou verzi nějakého scriptu, než hledat díru v custom kódu. 

Co ale dělat, pokud chcete mít opravdu jistotu? 

  • můžete si objednat někoho na penetrační testy
  • necháte někoho udělat code review
  • pro kutily – podíváte se sami co vlastně používáte

První dva body jsou poměrně finančně náročné a pro menší weby nemají smysl. Tam bych opravdu vybral ověřenou šablonu a dál to neřešil. Pro ty co se rádi ve webu hrabou tady je plugin Theme Check

Theme Check plugin

Tento plugin se používá, pokud vytváříte šablony pro WordPress.org. Kontroluje, zda šablona obsahuje všechny náležitosti a zda nepoužívá potencionálně nebezpečné postupy. 

Detaily najdete zde https://make.wordpress.org/themes/handbook/review/required/theme-check-plugin/

Přestože plugin vyjede report s chybami, neberte to jako dogma a ne vše musíte mít na sto procent opraveno. Řada věcí je také jen upozorněním. 

Pro ukázku jsem jej nainstaloval na e-shop, kde je rodičovská šablona Astra – https://wpastra.com/ a k ní udělaná child šablona.

Výsledek testu:

Na první pokus šablona prošla, protože Astra je kvalitní a bezproblémová. Pokud by v šabloně byly nějaké problémy, plugin by to přehledně vypsal.

Pluginy

Pluginy, možná ještě více, než šablony, ovlivňují fungování a bezpečnost WordPressu. 

Na rozdíl od šablon, mohou ovlivňovat nejen vzhled webu, ale i jeho chování a chování administrace. Což znamená, že špatně napsaný plugin, s bezpečnostní chybu, bude otevřenými dveřmi do vašeho webu. 

Obecně platí, že více používané pluginy, jsou lépe udržované a případné záplaty se objevují celkem rychle.

Aktualizace pluginů

Aktualizace pluginů je takové schizofrenní téma, protože je někdy těžké najít správné vyvážení mezi bezpečností webu a udržením funkčnosti. 

Mantra všech článků o zabezpečení WordPressu je – aktualizujte, aktualizujte a aktualizujte. Jenže, pokud aktualizujete okamžitě po vydání nové verze pluginu, tak u obsáhlejších produktů, jako je například WooCommerce, se může stát, že vám něco přestane fungovat. Proto já například po vydání nové aktualizace čekám několik dní, zda se v rychlém sledu neobjeví další, menší aktualizace. Takže aktualizovat ano, ale s rozumem.

Pročítejte si informace o aktualizaci. V případě, že je označena, jako bezpečnostní, neváhejte. 

A zároveň aktualizujte pravidelně. Ono se vám to vyplatí. mám ve správě řadu webů, které fungují bez větších problémů několik let, protože případné problémy jsou minimální. Když na web rok nesáhnete, nebo nemáte někoho, kdo jej pravidelně udržuje, případná obnova/oprava vás bude stát více, než zaplatíte za pravidelnou správu

Kromě aktualizace pluginů z vaší strany, je dobré se před instalací, nebo po nějaké době používání, podívat se, jak je na tom s aktualizacemi vývojář. Na obrázku je plugin, který nebyl aktualizován šest let a to je v onlinu opravdu dlouhá doba. 

Možná, že ten plugin funguje dobře a není na něm co aktualizovat, ale pravděpodobnost toho, že tam bude nějaká bezpečnostní díra je nezanedbatelná. Pokud nejste programátor, nemůžete posoudit, zda je plugin bezpečný

Proto se vždy dívejte na tyto informace, mohou vám pomoci v rozhodování, zda plugin použít, či ne.

Nepoužívat Nulled pluginy a šablony

Velká část dostupných pluginů a šablon je zdarma. Některé z nich fungují na freemium principu, kdy zdarma je základ a za vylepšenou verzi si musíte zaplatit. Hodně z nich je placených rovnou. 

A protože WordPress je šířen pod licencí GPL, která je taková jaká je, umožňuje to vzít plugin, či šablonu, upravit jej (v tomto případě odstranit kontrolu licence) a pak jej dále distribuovat. Buď za nějaký mírný poplatek, nebo zcela zdarma. 

Je to v podstatě parazitování na práci jiných, ale licence to umožňuje. Bohužel, k takovým produktům nedostanete podporu a velmi často se stává, že kromě příznivé ceny, vám takový vykuk přibalí do kódu backdoor a vy si vlastně dobrovolně instalujete něco, co umožní útočníkovi přístup, jen kvůli tomu, aby jste ušetřili pár dolarů. 

Takže jedním z kroků pro zabezpečení webu je nepoužívat neoriginální pluginy.

Odstranění nepoužívaných pluginů

Poměrně často se setkávám s tím, že ne webu jsou nainstalované pluginy, o kterých nikdo neví, proč tam jsou, nebo na co se používali. Jsou to “jednorázové” pluginy, jako například Regenerate thumbnails, nebo pluginy, jenž někdo zkoušel (nemusí to být majitel webu, ale třeba nějaký webmaster) a neodinstaloval.

Většinou nejsou aktualizované a proto zvyšují riziko toho, že v nich bude nějaká díra, kterou vám tam záškodník vleze. Nejhorší jsou nulled pluginy, stažené na vyzkoušení a ponechané svému osudu. 

Takže mazat a mazat. Když to nepotřebuji, dám to pryč.

Nahrazení zastaralých pluginů

U pluginů, které se sice používají, ale vývojář je již aktivně nevyvíjí, je třeba se rozhodnout, zda je opravdu nezbytně potřebujete, či za ně neexistuje adekvátní náhrada.

SSL a HTTPS

Internetový protokol HTTPS a SSL certifikáty jsou s námi již poměrně dlouho a většina webů je má nasazené. 

Co je HTTPS a k čemu slouží?

Jde o šifrovaný protokol, který zabezpečuje komunikaci mezi serverem, kde máte web a internetovým prohlížečem. Pokud používáte tento protokol, veškerá komunikace je asymetricky šifrována a “přečíst” si ji mohou jen strany, které mají k dispozici odpovídající klíče. 

SSL certifikát

SSL certifikát je takové osvědčení o tom, že jste důvěryhodný zdroj a že jste to opravdu vy. Prohlížeč i server tak mají jistotu, že komunikují se správným zdrojem a ne s někým, kdo se za vás vydává. Zároveň SSL protokol umožní výměnu šifrovacích klíčů a samotné zašifrování komunikace. 

To že používáte bezpečné spojení, poznáte podle zámečku, který se objeví v adresním řádku, vedle adresy webu. 

To jak získat SSL certifikát a zprovoznit HTTPS na WordPressu je popsáno v řadě článků a návodů, které lehce dohledáte. Samotné nasazení by mělo být naprostou samozřejmostí a žádný nový web by se bez HTTPS neměl spouštět.

V případě, že máte SSL certifikát a HTTPS a přesto vám prohlížeč ukazuje, že nepoužíváte zabezpečené spojení, může se jednat o mixed content problém, což znamená, že na webu máte url, které stahují zdroje z http adresy. WordPress totiž ukládá absolutní url a po změně protokolu, budou v databázi uloženy staré adresy a ty způsobují problém. Stačí projít databázi a vše upravit. Můžete k tomu použít plugin https://cs.wordpress.org/plugins/better-search-replace/

Zálohy a dočasné soubory

Zálohování

Zálohování je kritická část zabezpečení vašeho webu. Můžete dělat cokoliv a přesto se vám může do systému někdo nabourat. Může to být přes slabé heslo některého z uživatelů a problém je na světě. 

Pravidelná záloha vám umožní jednoduše obnovit data a minimalizovat škody. Zkrátka, zálohování by měl mít nastavené každý web. 

Pro zálohování existuje celá řada pluginů, jenž vám s tím pomůžou. 

Bohužel, vytváření záloh může být i bezpečnostní problém. Ve většině pluginu, jako je například Updraft, si můžete zvolit, kam chcete soubory se zálohou uložit. Může to být do cloudu, k vám do počítače a v neposlední řadě i na FTP. 

A tady může vzniknout problém, kdy při špatné konfiguraci, můžete ukládat soubory se zálohou do veřejně přístupné složky. Tam se k ní může dostat kdokoliv a ze zálohy zjistit citlivé informace. Neznamená to samozřejmě, že zálohu každý najde, ale riziko tu je. 

Zkontrolujte tedy, zda je možné k souboru zálohy přistoupit, nebo zálohujte mimo FTP vašeho webu.

Dočasné soubory

Podobně, jako soubory záloh, mohou být dočasné soubory ve špatné lokaci, bezpečnostním rizikem. 

Řekněme, že admin používá pro úpravu souborů nějaký textový editor a ten z nějakého důvodu spadne, je tu poměrně velká šance, že zůstanou zachovány i dočasné soubory. 

Například editor Vim, ukládá dočasné soubory s příponou ext. V případě, že je server špatně nakonfigurovaný a dočasný soubor bude ve veřejně dostupné složce, je relativně snadné jej přečíst. Proto by měla být složka a soubory v ní, veřejně nepřístupné.

Změna složky pro soubor debug.log

Debug log je výborná pomůcka pro vývojáře. Pokud je aktivní, ukládají se do něj všechna upozornění na chyba a problémy při vykonávání PHP ve WordPressu. Programátor tak může zjistit, proč vám spadne platba na pokladně, nebo proč máte na stránce jen bílou barvu. 

Problém je ale v tom, že pro útočníka může soubor obsahovat velmi zajímavé a citlivé informace, které nechceme, aby získal. Správný postup by měl být, že po dokončení úprav se debug log deaktivuje a hlavně se soubor smaže. Na což se dost často zapomíná. 

Naštěstí od verze WordPressu 5.1, je možné, změnit umístění souboru.

V zápisu

define( ‘WP_DEBUG_LOG’, true ); 

použijete místo true path složky do které chcete log umístit. Tím případným “hledačům” ztížíte práci, i když tam ten soubor zapomenete. 

Odebrání git souborů

Podobně, jako oba předchozí případy, i git soubory v pluginech a šablonách, mohou být případným bezpečnostním problémem. 

Co jsou git soubory?

Jedná se o soubory, které si ukládá verzovací systém. Jsou to záznamy o všech změnách v souborech a jsou využívány vývojáři. V žádném případě by se neměly dostat na produkční web, protože jsou určeny jen pro vývoj a práci v týmu programátorů. 

Přesto se to děje. a když si představíte, že v té složce je kompletní kód i s historií, tak to je bezpečnostní problém jak hrom. V případě, že si myslíte, že to je nějaká marginální záležitost, doporučuji tento skvělý článek https://lynt.cz/blog/globalni-scan-otevrenych-git-repozitaru/

WordPress Security Keys

Jednoduše řečeno, WordPress security keys a salts jsou komplikovaná hesla, o poměrně značné délce, která obsahují speciální znaky a které je velmi složité prolomit. 

Jsou používány pro lepší zakódování údajů v cookies a přihlašovacích údajů. Díky tomu, jsou data ochráněna další bezpečnostní vrstvou, pokud tedy nedojde k získání přístupu k souboru wp_config.php, kde jsou uložena, jinou cestou. 

Definování security keys a salts

Jak je uvedeno v předchozím odstavci, jsou tato data uložena v souboru wp_config.php jako konstanty a uživatel s nimi nemusí nijak pracovat. 

V souboru máme celkem 4 keys a 4 salts

  • AUTH_KEY
  • SECURE_AUTH_KEY
  • LOGGED_IN_KEY
  • NONCE_KEY
  • AUTH_SALT
  • SECURE_AUTH_SALT
  • LOGGED_IN_SALT
  • NONCE_SALT

V případě, že používáte vlastní způsob instalace a například kopírujete připravené soubory, měli byste údaje pro každý web změnit. Důležité je to z toho důvodu, aby jeden kompromitovaný web, neohrozil další. 

WordPress keys generator 

Protože vymýšlet dloooouhý řetězec, plný speciálních znaků, by bylo celkem komplikované, můžete použít online generátor na této adrese https://api.wordpress.org/secret-key/1.1/salt/

Vygenerovaný kód pak jen překopírujete do souboru wp_config.php

Salt shaker

Samozřejmě, každý kód lze prolomit, když máte dostatek času, případně se může útočník dostat k údajům z config souboru (třeba ze zapomenuté zálohy). Cílem zabezpečení je co nejvíce zkomplikovat získání citlivých údajů. A u keys a salts můžeme využít plugin, který nám, v předem určeném intervalu přegeneruje řetězce, takže i kdyby nějak unikly, druhý den už nebudou platná. Plugin najdete na WordPress.org – https://wordpress.org/plugins/salt-shaker/

WP Config

WP config je z hlediska bezpečnosti ten nejdůležitější soubor, který v instalaci WordPressu je. A zároveň je i nejužitečnější. Obsahuje přístupy do databáze a security keys. Navíc je do něj možné zapsat definice, jenž vám s bezpečností pomohou. 

Protože obsahuje citlivé údaje, jedním ze způsobu ochrany, je přemístění těchto údajů na jiné místo.

Přesunutí wp-config souboru

Jedním ze způsobů, jak více zabezpečit konfigurační soubor, je přesun mimo root složku WordPressu (root složkou je myšlena složka, obsahující soubory WordPressu).

V původním souboru necháte jen definici ABSPATH a přidáte vložení souboru, který je umístěn mimo root WordPressu. Dejte pozor na to, že u některých hostingů, je nadřazená složka také veřejná a soubor raději dejte do vlastní podsložky.

Tento způsob zabezpečení konfiguračního souboru má své příznivce i odpůrce. Někdo říká, že to máte udělat vždy, někdo zase tvrdí, že to nemá reálně žádný přínos. V každém případě tím nic nepokazíte. 

Změna prefixu databáze

Tabulky v databázi WordPressu mají vlastní prefix. Při výchozí instalaci to je wp_. To znamená, že každá posts tabulka se jmenuje wp_posts. Protože to je veřejně známá informace, útočník, který se zkouší dostat do databáze, zná názvy tabulek. 

Proto je běžnou praxí, prefix měnit. Když instalujete WordPress, tak zde máte předvyplněnou hodnotu wp_ ve formuláři. Stačí ji změnit a nic více dělat nemusíte. 

Jakmile již máte WordPress nainstalován, změna prefixu je trošku komplikovanější

Můžete jej změnit “ručně”, což znamená, přepsat hodnotu v souboru wp_config.php a pak v databázi přejmenovat všechny tabulky

Nebo můžete použít plugin Brozzme DB Prefix & Tool Adons

Ten vám umožní z administrace poměrně jednoduše změnit prefix databáze. Najdete jej zde https://wordpress.org/plugins/brozzme-db-prefix-change/

Pamatujte – zálohovat, zálohovat, zálohovat. Ne vždy se všechno povede a ne vždy pluginy udělají přesně to co tvrdí. 

Automatické aktualizace – jádro

Jako core, neboli jádro, označujeme soubory WordPressu, které jsou obsaženy v rootu a ve složkách wp-includes a wp-admin. A pomocí definice v configu, můžeme povolit automatické aktualizace jádra. 

Protože se WordPress stále vyvíjí a zároveň se odstraňují případné bezpečnostní chyby, jsou aktualizace rozděleny do tří typů:

  1. vývojové aktualizace – jsou dostupné pouze, když jste v development režimu
  2. minor aktualizace – údržba a bezpečnost
  3. major aktualizace

První typ nás nezajímá, je určen pro vývojáře, kteří testují nové funkce. Pro povolení automatických aktualizací jsou pro nás důležité minor a major aktualizace. 

V komunitě kolem WordPressu, dochází neustále k testování zranitelnosti jádra a v případě, že je nějaká chyba objevena, dojde k její opravě. 

Pak je vydána minor aktualizace, protože neobsahuje žádné vylepšení, nebo nově přidané funkce. To je doménou major aktualizací. A pokud by vás zmátlo číslování verzí, zde je příklad minor aktualizace:

Objeví se bezpečnostní problém a vy máte nainstalován WordPress verze 5.7. – minor aktualizace bude mít číslo 5.7.1.

V případě, že máte nainstalovánu starší verzi, například 5.5. – minor aktualizace bude mít číslo 5.5.1.

Důvodem je ochránění všech podporovaných verzí WordPressu, ne jen těch aktuálních. 

Vysvětluji to protože, když budete povolovat automatické aktualizace jádra, musíte se rozhodnout, zda je chcete povolit pro oboje, nebo jen pro minor. Osobně doporučuji jen minor a jen v případě, že se o web nestaráte denně, nebo na to nemáte webmastera, 

Povolení automatických aktualizací jádra:

define( ‘WP_AUTO_UPDATE_CORE’, true );

Povolení automatických aktualizací jádra pro minor verze:

define( ‘WP_AUTO_UPDATE_CORE’, ‘minor’ );

Výhodou minor automatických aktualizací, je, že i když nebudete jádro aktualizovat na vyšší major verzi, při bezpečnostním problému se vám automaticky zaktualizuje na bezpečnou verzi. 

Vypnutí editoru souborů v administraci WordPressu

Administrace WordPressu obsahuje editor souborů šablon a pluginů. Pomocí něj, můžete zasahovat do kódu a měnit jej. Přestože jej také někdy použiji – především, když je třeba udělat rychlá oprava a není přístup na FTP, měl by být z bezpečnostních důvodů zakázán

Když pomineme to, že nezkušený uživatel může pomocí překlepu v souboru shodit celý web (už to by měl být dostatečný důvod), tak je to poměrně velké bezpečností riziko, v případě, že máte web, kde umožňujete registraci uživatelů. V různých pluginech se objevují čas od času chyby, které umožní uživateli změnit si oprávnění. 

Jakmile se dostane k editoru, nic mu nebrání v zapsání škodlivého kódu do šablony, nebo pluginu. 

Pro vypnutí editoru stačí do wp_config.php přidat řádek:

define( ‘DISALLOW_FILE_MODS’, true );

Následně pak již v podmenu pluginů a vzhledu, nenajdete položku editor. 

Automatická aktualizace šablon a pluginů

Automatická aktualizace šablon a pluginů z hlediska bezpečnosti je technika, jenž není použitelná pro každého. Z mého pohledu je ve většině případů nepoužitelná pro většinu webů. Ekosystém WordPressu je natolik chaotický, že nemůžete nikdy předem vědět, zda vám aktualizace nezboří web. Takže, pokud máte blog, kde používáte defaultní šablonu, máte tam seo plugin a třeba dalších pět hojně používaných pluginů, tak ano, ale osobně bych to neriskoval

Přesto nemůže být tato možnost opominuta. 

WordPress od verze 5.5 umožňuje administrátorům zapnout automatickou aktualizaci šablona a pluginů přímo z administrace. Takže nemusíte řešit kód a stačí jen u každé šablony a pluginu aktualizaci povolit.

Samozřejmě, že i toto lze vyřešit pomocí kódu a to použitím filtrů, které umí tuto možnost vypnout, nebo zapnout. Kromě aktualizace šablon a pluginů uvádím i filtr pro povolení automatické aktualizace překladů

add_filter( ‘auto_update_theme’, ‘__return_true’);
add_filter( ‘auto_update_plugin’, ‘__return_true’);
add_filter( ‘auto_update_translation’, ‘__return_true’);

Přestože automatické aktualizace jsou uváděny jako zvýšení zabezpečení webu, já je nepoužívám. Riziko, že vám web nebude fungovat je příliš velké a to riziko za to nestojí. Jediná vyjímka jsou minor aktualizace jádra. 

Zakázání procházení a indexace složek

Možnost procházení složek webu není moc obvyklá, přesto se u některých webů může vyskytnout. To co vidíte na obrázku, je veřejně přístupná složka uploads. Což je špatně z několika důvodů. Správně máte vidět něco takového:

Což znamená, že do složky se z prohlížeče nedostanete. Toto je sice složka uploads, neměl by to být významný bezpečnostní problém, ale ostatní složky, již ano. Když totiž někdo bude schopen zobrazit obsah složky, může scanovat web, zda se v něm nenachází nějaký soubor obsahující zranitelnost. Většina takových útoků probíhá automatizovaně a vy si ani nemusíte být vědomi toho, že se vám někdo prohrabuje webem. 

Když pominu to, že se jedná o bezpečnostní riziko, tak druhou nepříjemnou věcí je, že někdo zvenku, zjistí co máte uloženo na webu. Což může být i Google.

Podívejte se na výsledky vyhledávání, kolik pdf souborů indexuje – https://bit.ly/2UrSWSG

To nemusí být úplně špatně, pokud vám nevadí, že jsou soubory veřejně.

Jak tomu zabránit? 

Nastavení na serveru – ideální záležitost, například cPanel vám umožňuje vypnout přístup do určitých složek.

Htaccess – druhá nejlepší možnost je upravit soubor htaccess tak, že na konec souboru přidáte řádek: 

Options - Indexes

Pluginem – většina bezpečnostních pluginů tohle umí a není problém to nastavit.  

V každém případě, toto by měl mít již v základu vyřešen hosting, nebo ten, kdo vám poskytuje místo na serveru. Když se budete spoléhat na to, že “se to přidá” do htaccess, dřív nebo později na to někde zapomenete.

Blokování Rest API

Rest API ve WordPressu je super věc. Na druhou stranu, umožňuje získat výpis uživatelů a ten pak v dalším kroku využije útočník k pokusu o prolomení hesla. 

Problémem se získáním seznamu uživatelů se podrobně zabýval Vláďa Smitka a na svém Gistu uveřejnil kód, který citlivá data zobrazí jen uživateli se správným oprávněním https://gist.github.com/lynt-smitka/2e61c7eb545ab6a162fbc57f17b3adae

Druhou možností je zakázat Rest API úplně. To ale nelze vždy, jen u webů, které Rest API vůbec nepoužívají a třeba u e-shopů to prostě nejde

Vypnout Rest API můžete pomocí kódu:

add_filter( ‘rest_authentications_errors’, function( $result ){
       return new WP_Error('rest_not_logged_in',
            __( 'You are not currently logged in.' ),
            array( 'status' => 401 )
       ); 
} 

Tím budete každému říkat, že není přihlášen a request se neprovede. 

Protože WordPress má pluginy na všechno, tak i pro vypnutí Rest API můžete použít plugin z WordPress.org – https://cs.wordpress.org/plugins/disable-wp-rest-api/

V každém případě, si deaktivaci řádně rozmyslete, protože pokud používáte nějaké propojení na třetí strany, mohou oni Rest API vyžadovat a čím dál více pluginů jej začíná používat i v rámci webu.

Blokace XMLRPC

XMLRPC je systém, který umožňuje vzdálenou práci s WordPressem. Některé aplikace pro publikaci článků jej využívají pro vkládání obsahu na web. Osobně jsem to nikdy nevyužil. Myslím si, že v současné době je lepší používat Rest API a přes XMLRPC jde dost automatizovaných útoků, které hledají slabé místo ve vašem webu. 

Takže, pokud XMLRPC nepotřebujete, deaktivujte jej. 

Můžete jej vypnout jednoduchým pluginem Manage XML RPC, který najdete na WordPress.org – https://wordpress.org/plugins/manage-xml-rpc/

Nebo můžete do htaccess přidat direktivu:

# Block WordPress xmlrpc.php requests
<Files xmlrpc.php>
order deny,allow
deny from all
allow from 123.123.123.123
</Files>

A samozřejmě, že WordPress má i na toto filtr, pro použití v kódu:

add_filter('xmlrpc_enabled', '__return_false');

Za mne, je lepší XMLRPC na každém webu vypínat, pokud jej nějaký plugin vysloveně nevyžaduje. 

Ztížení rozeznání instalace WordPressu, nebo verze pluginů

Prvním krokem, při útoku na stránky, je rozeznat, na jakém systému běží. V případě WordPressu to je poměrně jednoduché. Tím že útočník zjistí, že jde o WordPress, může nasadit některý z připravených útoků. 

  • prolomení hesla pomocí přihlašovacího formuláře
  • hledání šablon a pluginů, u kterých je známá zranitelnost a nejsou aktualizovány
  • to samé u jádra WordPressu
  • a další výše popsané….

Většina těchto útoků není nijak cílená, jde spíše o plošné skenování, kdy je váš web v nějaké databázi WordPress webů a pouze se hledá, zda není někde skulinka. 

Výborný příklad byla zranitelnost v pluginu Revolution Slider, který je v řadě šablon a mohli jste si být jisti, že pokud jste jej nezaktualizovali, během několika dní vám někdo web hacknul. 

Útočník zjistil, že váš web jede na WordPressu, zkontroloval, zda máte nainstalovaný Revolution Slider a jakou verzi. a by jste měli problém. 

Samozřejmě, že nejlepší ochrana je aktualizace, ale existují postupy a pluginy, které se snaží útočníkům ztížit práci tím, že skrývají známky toho, že jde o WordPress. 

To je sice reálně téměř nemožné, ale přesto to můžete ocenit v honbě za bezpečnějším webem

Seznam všeho, co můžete skrýt a jak, by přesáhl rozsah tohoto článku, proto jen to nejpoužívanější :

  • odebrání verze WordPressu z kódu webu
  • odstranění wlwmanifest meta
  • odstranění rsd_link meta
  • odebrání emoji
  • odstranění pinback tagu
  • změny obvyklých url a cest, jako jsou wp-admin, wp-content, wp-includes, uploads a dalších
  • minifikace html, css a javascriptu

V podstatě jde o odebrání všech známek, že jde o WordPress. Ovšem, jde to jen do určité míry. Stačí jeden request na Rest API url a je jasné, že jde o WordPress (pokud tedy není plně blokováno). Sice je možné url wp-json/wp/v2/ modifikovat, ale pouze z části, kdy lze změnit url prefix wp-json, pomocí filtru rest_url_prefix. Část wp/v2/  zůstává stejná, protože jde o namespace. 

Když už se rozhodnete, že chcete schovat co nejvíce známe přítomnosti WordPressu, můžete použít plugin WP Hide – https://wordpress.org/plugins/wp-hide-security-enhancer/, případně jeho premium verzi – https://www.wp-hide.com/

Bezpečnostní pluginy

Všechny kapitoly tohoto článku se týkaly jednotlivých bezpečnostních problémů. Odkazované pluginy řešily většinou jeden konkrétní problém. Na závěr chci ještě přidat několik pluginů, které jsou poněkud komplexnější a z nichž osobně využívám WordFence

Používám především kvůli dvoufaktorové autorizaci při přihlášení a přehlednému scanu. Trošku náročnější na server – https://wordpress.org/plugins/wordfence/

Původně Better WP Security, přejmenovaný na iThemes Security. Občas jsem míval problém s tím, že když se přežene nastavení, tak se do adminu nedostane ani ten kdo má – https://wordpress.org/plugins/better-wp-security/

Komplexní plugin, obsahující téměř vše co potřebujete k zabezpečení webu. Kdybych nepoužíval WordFence, zvolili bych zřejmě All in One – https://wordpress.org/plugins/all-in-one-wp-security-and-firewall/

Velmi dobrý plugin, především z hlediska ochrany proti spamu. Kdyby to z toho nějak vypreparovali, používal bych to v kombinaci s WordFence – https://wordpress.org/plugins/wp-simple-firewall/

Závěr

Přestože se dá určitě udělat více, po zabezpečení vašeho webu, došli jsme na konec. Pluginů pro zabezpečení také najdete daleko více, ale snažil jsem se doporučovat ty, které jsem již vyzkoušel.

Najměte si nás

Pokud potřebujete pomoci se zabezpečení, odvirování WordPressu, nebo jen s údržbou vašeho webu, já i mí kolegové vám budeme nápomocni. Stačí napsat na musilda@musilda.cz, co přesně potřebujete.

About The Author

Zajímá mne Wordpress, responsivní šablony a zkrátka vše kolem tohoto skvělého redakčního systému.

Související články

2 Comments

  1. Jarda Majer

    Díky za rozsáhly článek na toto téma, určíte některé tipy využiju.

    Osobně nejvíce používám WordFence, nahrazuje několik zmíněných pluginu v jednom. Zkusím se podívat co vše umí All in One Security And Firewall podle tvého doporučení.

    Ať se daří.

    Odpověď
  2. Pingback: Jak přidat reCAPTCHA do přihlašovacího formuláře - Musilda.cz

Přidejte komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *