Zabezpieczanie strony firmowej opartej o CMS WordPress


Dlaczego należy dbać o bezpieczeństwo WordPressa?
Z tego samego powodu dla którego ten poradnik skupia się wyłącznie na rozwiązaniach opartych właśnie o niego. System WordPress jest obecnie najpopularniejszym systemem zarządzania treściami na stronach. Z danych W3Techs wynika, że napędza on już ponad 25% wszystkich witryn w Internecie, pozostawiając inne rozwiązania CMS daleko w tyle.
Nie powinien zatem dziwić fakt, iż jest on również najpopularniejszym celem hakerów - według raportu Sucuri to właśnie WordPress jest najchętniej infekowanym rozwiązaniem CMS (78%).
Kluczem jednak i powodem dla którego stworzyłem ten artykuł, było to zdanie ujęte w raporcie:
„In most instances, the compromises analyzed had little, if anything, to do with the core of the CMS application itself, but more with improper deployment, configuration, and overall maintenance by the webmasters and their hosts.” Co oznacza, że za zdecydowaną większość infekcji odpowiadała niewłaściwa konfiguracja i użytkownie samych CMS-ów, a nie one same.
Dlaczego strony firmowe są infekowane?
Na to pytanie również mam poparcie niedawno wydanym raportem producenta wtyczki zabezpieczającej Wordfence (https://www.wordfence.com/blog/2016/04/hackers-compromised-wordpress-sites/).
Jak widzimy na załączonym wykresie w 25% przypadków zaatakowana strona przestała działać, a w pozostałych przypadkach zainfekowana strona:
- wysyłała SPAM używając naszego serwera,
- tworzyła na naszej stronie SPAM, mający pozycjonować inne strony hakera,
- tworzyła niebezpieczne przekierowania i instalowała wirusy na komputerze użytkownika,
- kradła dane użytkownika.
W każdym z wymienionych działań jesteśmy poszkodowani – zarówno utratą wejść potencjalnych klientów jak i możliwością stracenia zaufania w oczach użytkowników i wyszukiwarki internetowej. Konsekwencją włamania i zainfekowania strony może być zatem obniżenie jej pozycji w Google i dodanie naszej domeny do listy adresów wysyłających niechciane wiadomości – w zależności od działalności hakera.
Zabezpieczanie strony firmowej
Odpowiednie zabezpieczenie strony firmowej powinno być dla nas priorytetem. Sprawdź zatem przedstawione niżej punkty i zweryfikuj swoje dotychczasowe działania. Część poniższych rad nie będziesz w stanie wykonać sam, jednak z pomocą twórcy lub administratora Twojej strony nie będzie to trudne do wykonania.
Miej świadomość w jaki sposób strony oparte na WordPressie są atakowane. Tutaj również dostępne jest świeże opracowanie (https://www.wordfence.com/blog/2016/03/attackers-gain-access-wordpress-sites/), które wskazuje, że główną drogą hakerów do przejęcia kontroli nad stroną są:
- wtyczki,
- słabe hasła,
- sam system WordPress,
- zastosowane motywy
Zapewne powyższe problemy były związane z brakiem stosownych aktualizacji i stosowaniem słabych haseł.
Przejdźmy teraz do właściwej części tego poradnika, czyli jak zabezpieczyć się przed atakiem:
1. Aktualizuj wszystko
System WordPress jest dynamicznym projektem, którego nowe wersje wydawane są regularnie. Zawierają one nie tylko nowe czy ulepszone funkcje systemu ale również poprawki mające na celu zwiększyć jego bezpieczeństwo (od wersji 3.7 WordPress wykonuje automatyczne aktualizacje w tle, jednak wyłącznie w obrębie jednej wersji, tj. z 4.1 na 4.1.1 ale już nie na 4.2) . Nie inaczej jest w przypadku wtyczek i motywów, w których nieustannie odnajdywane są nowe błędy i których regularne aktualizacje są kluczowe dla bezpieczeństwa strony.
2. Wykonuj regularne kopie bezpieczeństwa
Mając wykupione konto hostingowe zapewne możesz liczyć na regularny backup danych swojej strony, jednak jak pokazuje przykład z życia (problemy hostingu 2be.pl) zawsze warto mieć swoją kopię na zapas. Zresztą istnieje stare porzekadło, które głosi: „Ludzie dzielą się na tych co robią backupy i na tych co będą je robić”.
3. Bądź sobą nie adminem
Punkt trochę przewrotnie nazwany, chodzi jednak o to, aby nie korzystać domyślnie z konta administratora, zwłaszcza z nazwą użytkownika „admin”. Dzięki temu ograniczysz możliwość ataków typu brute-force przy standardowym loginie admin. Równocześnie pisząc posty z innego konta (o mniejszych uprawnieniach, np. redaktor) nie narażasz się na poznanie przez hakera nazwy użytkownika z uprawnieniami administracyjnymi.
4. Używaj mądrych haseł
Pierwszą zasadą bezpieczeństwa jest używanie różnych haseł do każdej usługi, z której korzystamy. Dzięki temu zapobiegamy efektowi domino, gdzie raz ujawnione hasło pozwoli na całkowite obnażenie nas z danych. Pamiętaj również, aby tworzone hasła były wystarczająco mocne – są to hasła składające się z kombinacji małych i wielkich liter, liczb i znaków specjalnych. Pamiętaj – bezpieczeństwo WordPressa to również silne hasła do serwera FTP i bazy danych.
5. Korzystaj z antywirusa
Tutaj nie będę się rozpisywał – po prostu lepiej jest uniknąć sytuacji, w której mamy wirusa na komputerze nie wiedząc o tym, równocześnie regularnie przesyłając pliki na nasz serwer.
6. Bądź rozsądny
Pamiętaj, aby zarówno wtyczki jak i szablony pobierać z wiarygodnego źródła dzięki czemu ustrzeżesz się przed samodzielną instalacją złośliwego kodu na stronie. Pamiętaj również, aby zachować umiar w instalowanych wtyczkach, a jeśli danej nie potrzebujesz – odinstaluj ją - w ten sposób odciążasz WordPressa oraz minimalizujesz ryzyko wykorzystania tej wtyczki do ataku.
Dla majsterkowiczów
To porady, które wymagają działań pod maską WordPressa. Po zapoznaniu się z tą listą możesz mieć wrażenie, że zalecenia te są nad wyrost, jednak gdyby tak było to część z nich zapewne nie znalazłaby się w oficjalnej bazie wiedzy w sekcji Hardening WordPress.
1. Wyłącz edycję motywów i wtyczek w kokpicie
Gdy już w jakiś sposób atakujący uzyska dostęp do naszego kokpitu, warto uniemożliwić mu edycję ważnych plików z poziomu panelu Wordpressa. Aby to zrobić, należy w pliku wp-config.php mieć zapisane:
define('DISALLOW_FILE_EDIT', true);
2. Chroń ważne pliki i foldery
Jeżeli nasz serwer obsługuje .htaccess (w większości przypadków TAK) to możesz zapisać dodatkowe instrukcje zabezpieczające przed dostępem do najważniejszych elementów WordPressa:
Zapis w pliku .htaccess, który zabezpieczy nasz plik konfiguracyjny (wp-config.php):
<files wp-config.php>
order allow,deny
deny from all
</files>
Zapis dla folderu /Wp-Content/:
WYJAŚNIENIE: Ten katalog jest kluczowy w każdej instalacji WordPressa, ponieważ to tutaj instalują się i ładują: wtyczki, szablony, wysyłane obrazki. Nieraz na zainfekowanym WordPressie można tutaj znaleźć masę ciekawym plików .php, zatem w celu ochrony tego katalogu warto stworzyć w nim samym dodatkowy pusty plik .htaccess do którego wpiszemy:
Order deny,allow
Deny from all
<Files ~ ".( xml|css|jpe?g|png|gif|js|woff|woff2|ttf)$">
Allow from all
</Files>
Dzięki temu wszystkie pliki z rozszerzeniami innymi niż te wymienione będą blokowane.
Zabezpieczenie pliku xmlrpc.php
<files xmlrpc.php>
order deny,allow
deny from all
</files>
Miej jednak na uwadze, że blokując plik xmlrpc.php uniemożliwiasz korzystania z zewnętrznych rozwiązań, które wykorzystują to API do komunikowania się z Twoim WordPressem (tworzenie i edycja postów, moderacja komentarzy itp.).
3. Chroń plik .htaccess
Tak samo jak pliki WordPressa warto zabezpieczyć, tak sam plik .htaccess warto zabezpieczyć. W tym celu wystarczy dodać do niego zapis:
<files ~ "^.*.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</files>
4. Ogranicz dostęp do panelu logowania WordPressa
Można to zrobić na dwa sposoby.
Pierwszy polega na założeniu hasła na katalog wp-admin, przy czym nie będę tego omawiał jak to zrobić, ponieważ najłatwiej jest to zrobić samemu w panelu hostingu. Wówczas każdorazowo przed dostępem do panelu logowania będzie wymagane podanie dodatkowych danych uwierzytelniających.
Drugi sposób polega na ograniczeniu dostępu do tego katalogu wyłącznie dla wybranych przez nas adresów lub zakresów IP. Aby to zrobić, należy do pliku .htaccess wpisać:
<FilesMatch ^((wp-login|admin).php$)$>
order deny,allow
deny from all
allow from xx.xx.xx.xxx
</FilesMatch>
(gdzie w miejsce „x” podajesz swój adres IP)
Równocześnie wykluczając z tego plik admin-ajax.php, z którego korzystają niektóre wtyczki:
# Allow access to wp-admin/admin-ajax.php
<Files admin-ajax.php>
Order allow,deny
Allow from all
Satisfy any
</Files>
W ten sposób dostęp do panelu logowania będzie dostępny jedynie przez wcześniej zdefiniowane adresy IP. Możesz wpisywać tam kolejne adresy, po prostu dodając kolejne linijki:
allow from xx.xx.xx.xxx
allow from xx.xx.xx.xxx
lub z zakresem, np.:
allow from 77.25.25.*
Ostatni punkt: A co jeśli już jestem zaatakowany?
To jest dobre pytanie, ponieważ znaczna część właścicieli strony nawet nie ma świadomości, że ich strona jest zainfekowana. Dowiadują się o tym za późno: gdy strona dosłownie nurkuje w wynikach wyszukiwania lub zupełnie nie działa.
Niewątpliwie nie jesteśmy specami od zabezpieczeń i nie będziemy w stanie wykryć infekcji, dlatego skupmy się na objawach. Zatem, jeśli strona:
- ładuje się zdecydowanie wolniej niż przedtem,
- zmieniła minimalnie układ treści bez naszej ingerencji,
- nie pozwala na zalogowanie do kokpitu WordPressa.
To są to pierwsze objawy do niepokoju. Aby to zweryfikować masz kilka dróg:
1. Sprawdź jak się wyświetla w wynikach wyszukiwania Twoja strona, np. komendą:
site:www.twoj-adres.pl i sprawdź czy nie wyświetla się przypis: „Ta witryna mogła paść ofiarą ataku hakerów.”.
2. Jeżeli korzystasz z Google Search Console (bo powinieneś!) to zaloguj się do konsoli i sprawdź czy nie pojawiło się jakieś powiadomienie na temat infekcji.
3. Sprawdź kopię strony utworzonej przez Google (w wynikach wyszukiwania to jest zielona strzałka przy adresie strony i przycisk ->Kopia. Jeśli strona jest wykorzystywana do SEO spamu to widziałbyś dodatkowe treści i linki do innych stron.
4. Przeskanuj swoją stronę skanerem online VirusTotal i sprawdź czy wykryje podejrzany kod.
W większości przypadków, na którymś punkcie kontrolnym powinieneś wykryć potencjalną infekcję strony.
Mam nadzieję, że prócz przeczytania tego poradnika zastosujesz się przynajmniej do polowy zaleceń, dzięki czemu znacząco zminimalizujesz ryzyko włamania i zainfekowania strony firmowej. Nie chcę również, abyś po przeczytaniu tego stwierdził, że WordPress jest brzydki i dziurawy, bo tak nie jest. To jest wspaniały i łatwy w obsłudze CMS dla wszystkich.
TL;DR To może widzieć Twój klient, jeśli odpowiednio nie zabezpieczysz strony: