Jak zabezpieczyć WordPressa?

Wykorzystaj uwierzytelnianie dwuskładnikowe.

Dobrym sposobem zapobiegania części ataków jest uwierzytelnianie dwuskładnikowe (ang. Two Factor Authentication, 2FA), w którym użytkownik podczas logowania musi podać dane składające się z dwóch różnych komponentów. Musi podać drugą informację, bądź wykonać dodatkową operację. Co równie ważne, drugi element przekazywany jest innym kanałem lub sposobem. Obecnie bardzo często przykład tej metody spotykany jest np. w bankowości elektronicznej. Cel realizowany jest poprzez wysyłkę SMS, kod z aplikacji, token z urządzenia, itp. Dlaczego to takie istotne przeczytasz w punkcie ‘Potwierdzaj, że to Ty.’ artykułu ‘Jak chronić swój e-biznes przed atakiem.’.

W WordPressie bardzo łatwo wdrożyć 2FA, istnieją gotowe rozwiązania. Możesz zainstalować którąś z wtyczek, która udostępni na Twojej stronie usługę o tej samej nazwie. Sama aplikacja wykonawcza dostępna jest na Android i iOS, więc rozwiązanie nie będzie zbytnio utrudniało życia. Z poziomu instalacji wtyczek odszukaj rozwiązania na hasło ‘Google Authenticator’ i zainstaluj wybrane w swoim WordPressie.

Google Authenticator

Po zainstalowaniu wtyczki przejdź do jej konfiguracji i aktywuj uwierzytelnienie dla swojego konta. Następnie pobierz i zainstaluj aplikację Google Authenticator na swoim telefonie. Wypełnij formularz dodawania nowego konta, postępując wg instrukcji aplikacji. Powiąż wtyczkę z aplikacją, np. używając kodu QR. We wtyczce wygeneruj kod i zeskanuj go w aplikacji. Po akceptacji, przy próbie ponownego uwierzytelnienia w formularzu logowania pojawi się jeszcze jedno pole, w którym każdorazowo będziesz mógł wpisać kod z aplikacji na telefonie. Dzięki temu, do Twojego WordPressa będzie mogła zalogować się jedynie osoba, która poza parą login/hasło będzie w stanie podać aktualny kod z aplikacji.

Zabezpiecz panel administracyjny.

Złamanie dostępu do kokpitu WordPressa może narobić bardzo dużo szkody. Jednym ze sposobów na zabezpieczenie katalogu ‘wp admin’ jest zastosowanie osobnego hasła. W ten sposób dostępu do panelu będą w rzeczywistości chronić dwa hasła – hasło logowania i hasło dostępu do panelu administratora.
W przypadku otwartej możliwości rejestracji użytkowników, zabezpiecz w ten sposób przynajmniej część administracyjną. Np. w pliku ‘.htaccess’ w katalogu ‘wp-admin’ dodaj (jeśli nie ma tam takiego pliku, stwórz go):

AuthType Basic
AuthGroupFile /dev/null
AuthName " Dostep zabroniony "
AuthUserFile /sciezka-do-hasla/.htpasswd
require valid-user
<FilesMatch "admin-ajax\.php|admin-post\.php">
 Order allow,deny
 Allow from all
 Satisfy any
</FilesMatch>

W przypadku hostingu, który oferuje Ci cPanel, dodaj w tym pliku również tę linię:

RewriteCond %{REQUEST_FILENAME} !\.shtml$

Plik ‘.htpasswd’ powinien znajdować się poza głównym katalogiem strony i powyżej, w pozycji ‘AuthUserFile’ musisz podać prawidłową ścieżkę do niego. Narzędzia online do generowania haseł dla plików ‘.htaccess’ znajdziesz w Sieci, a jednym z przykładów jest Online Tools: .htaccess Password Generator.

Jak poprawnie włączyć SSL, a jak tego nie robić.

Implementacja SSL zapewnia dużo większy poziom bezpieczeństwa podczas przesyłania danych pomiędzy użytkownikami przeglądarek a serwerem, utrudniając dostęp do przesyłanych treści. Otrzymanie samego certyfikatu SSL nie jest trudne, a koszt nie jest wysoki. Często jest to bezpłatny element pakietów hostingowych. Certyfikat SSL spowoduje też, że Twoja strona znajdzie się wyżej w wynikach Google oraz może pozytywnie wpłynąć na szybkość ładowania strony. Zakładam, że nie masz tutaj wątpliwości, więc skupmy się na kwestii prawidłowego włączenia szyfrowania w WordPressie. Możesz to zrobić dwojako, ale drugi ze sposobów niestety nie jest poprawny, choć dużo łatwiejszy, więc lepiej go unikaj.

Na początek rozważmy zalecaną sytuację, w której od samego początku używasz SSL (‘https://…’), już na etapie instalacji WordPressa. Zostanie Ci jedynie zmuszenie serwera, żeby zawsze kierował na szyfrowaną wersję witryny, a dokonasz tego dodając do pliku ‘.htaccess’, w głównym katalogu Twojego WordPressa, następującą regułę:

RewriteEngine On
RewriteCond %{REQUEST_URI} !\.well-known/acme-challenge / ten wiersz usuń, jeśli nie korzystasz z bezpłatnego certyfikatu Let’s Encrypt
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Nieco trudniej będzie, jeśli nie korzystałeś z SSL od początku, od samej instalacji. Wówczas musisz nie tylko uruchomić szyfrowanie na serwerze, dodać ww. regułę do ‘.htaccess’, ale jeszcze musisz poprawić linki w bazie danych WordPressa. Przed zmianą działał on bowiem na takiej zasadzie, że wszystkie linki (np. do grafik) zapisywał w postaci ‘http://…’. Doszłoby więc do sytuacji, w której część strony będzie przesyłana w postaci zaszyfrowanej, ale pozostanie dziura w postaci częściowo otwartej transmisji.

Zmiany tej możesz dokonać na dwa sposoby. Pierwszym z nich jest ręczne ‘dłubanie’ w bazie danych, odszukiwanie wszystkich takich linków i zamiana ich na ‘https://…’. Możesz też skorzystać z wtyczki w rodzaju ‘Better Search Replace’, która poprawi wszystkie linki za Ciebie. Przed użyciem wtyczki wykonaj kopie zapasową, a po dokonaniu i weryfikacji zmian usuń wtyczkę, aby utrzymać porządek.

Drugi ze sposobów niestety nie jest poprawny – choć dużo łatwiejszy – więc lepiej go unikaj. Mimo, że znajdziesz wiele poradników, w których go polecają. Tutaj natomiast wspomnę o nim tylko dlatego, abyś wiedział jak nie powinieneś tego robić. Jest nim instalacja wtyczki ‘Really Simple SSL’, dzięki której włączenie SSL polega na kliknięciu jednego przycisku. Jest to jednak bardzo złudne uproszczenie i pomija kilka aspektów, które mogą spowodować problem. Oszczędzę Ci szczegółów technicznych, weź natomiast pod uwagę, że wtyczka może znacząco spowolnić szybkość ładowania strony. Działa bowiem w taki sposób, że podczas każdej odsłony strony próbuje odnaleźć nieprawidłowy link i wówczas go podmienia. Czyli, nie dość, że opóźnia przesyłanie, to jeszcze tuszuje dziurę w systemie ochrony.

Wyłącz edycję plików.

Wyłącz możliwość edycji plików w panelu administracyjnym. Złośliwe wtyczki lub skrypty mogą za pomocą wbudowanego edytora dokonać zmian w kodzie, narazić witrynę na malware. Do pliku ‘wp-config.php’ dodaj następującą linię:

define('DISALLOW_FILE_EDIT', true);

Zapanuj nad rejestracją użytkowników.

Wyłącz możliwość rejestracji, jeśli nie jest potrzebna do działania witryny, ponieważ formularz rejestracyjny może być furtką do przejęcia kontroli: ‘Ustawienia ogólne’ -> odhacz ‘Każdy może się zarejestrować’. Natomiast w przypadku, gdy zależy Ci na możliwości rejestrowania nowych użytkowników, zadbaj o zabezpieczenia przed zagrożeniami, związanymi z rejestracją. Nie dopuść, aby możliwa była masowa, zautomatyzowana rejestracja.

Wyłącz komentarze, jeżeli są zbędne.

Oczywiście nie zawsze będzie to możliwe, ale jeśli tylko prowadzisz witrynę, w której nie jest Ci potrzebny wbudowany system komentarzy, wyłącz go. Dzięki temu nie narazisz się na ataki DoS (Denial of Service), czyli sztucznego przeciążenia. Pamiętaj jednak, że jedynym skutecznym sposobem wyłączenia komentarzy, jest jednoczesna blokada ich dla anonimowych użytkowników, wraz z zablokowaną rejestracją.

Enumerowanie użytkowników.

W uproszczeniu enumeracja użytkowników to proces wyszukiwania ich kont, poprzez wykorzystanie błędów w systemie. Wpisując w przeglądarce URL w rodzaju: https://twoj-wordpress.pl/author/<login>, zostaną wyświetlane wpisy tego autora. Wiedząc o tym, a także znając login użytkownika, atakujący może chcieć wykorzystać podatność. A sam login można również ustalić, przekazując w adresie URL parametr ‘author=X’. WordPress wówczas sprawdzi, czy istnieje użytkownik o takim ID, a jeżeli tak, to przekieruje na adres, w którym zwróci login użytkownika: https://twoj-wordpress.pl/author/nowak/.

Dobrą praktyką jest niedopuszczanie do enumerowania loginów użytkowników danej aplikacji, chociażby po to, aby nie ułatwiać działań nieuprawnionego dostępu. Zabezpieczeniem może być kod dodany do pliku ‘.htaccess’:

RewriteCond %{QUERY_STRING} ^author=([0-9]*)
RewriteRule ^ /? [L,R=301]

Dodatkowo warto przyjąć zasadę i pilnować, aby loginy były inne, niż pseudonimy autorów oraz zawierały  znaki specjalne. Dzięki temu nie zostaną ujawnione w wynikach wyszukiwania lub mapach strony.

Dane dostępowe do innych usług.

                W niektórych przypadkach, być może będziesz musiał skorzystać z wtyczki, która łączy się z jakimś zewnętrznym systemem. Przykładem tutaj może być wtyczka do backupów, która ma automatycznie przesyłać archiwa na jakiś zewnętrzny dysk. Albo wtyczka do wysyłania e-maili za pomocą SMTP, łącząca się ze wskazanym serwerem poczty. W takiej sytuacji pamiętaj proszę, że ew. włamanie do Twojego WordPressa, automatycznie naraża na niebezpieczeństwo również tę usługę trzecią, ponieważ może nastąpić przejęcie danych. Zazwyczaj niespecjalnie masz szansę uchronić się przed takim zagrożeniem, bo przecież jesteś uzależniony od konfiguracji samej wtyczki. Możesz natomiast zminimalizować ew. szkody.
Nie używaj zatem kont, które wykorzystujesz do jakichkolwiek innych celów, stwórz dedykowane.
Dzięki temu ew. utrata takiego konta nie będzie aż tak dotkliwa.

Dostęp do XML-RPC.

Wyłącz XML-RPC (pingback, aplikacje mobilne), jeżeli z niego nie korzystasz, dodając do pliku ‘.htaccess’:

<Files xmlrpc.php>
 Order deny,allow
 Deny from all
</Files>

Wyłącz REST API.

Wyłącz REST API, które umożliwia dostęp do najważniejszych elementów WordPressa, jeżeli tylko nie jest Ci potrzebna ta funkcjonalność. W tym celu możesz użyć wtyczki ‘Disable REST API’.

Sprawdź uprawnienia katalogów.

Sprawdź uprawnienia katalogów, które powinny mieć ustawione uprawnienia 755 lub 750, a pliki 644 lub 640. Plik ‘wp-config.php’ powinien mieć 600. Uprawnienia możesz zmieniać np. korzystając np. z menedżera plików.

Użyj pliku ‘.htaccess’ do zabezpieczenia katalogów.

Ukryj pliki, których nikt nie powinien podejrzeć. W pliku ‘.htaccess’ dopisz na początku:

<FilesMatch "wp-config.*\.php|\.htaccess|readme\.html">
 Order allow,deny
 Deny from all
</FilesMatch>

W katalogu ‘wp-includes’ dodaj lub uzupełnij plik ‘.htaccess’ o zawartości:

<FilesMatch "\.(?i:php)$">
 Order allow,deny
 Deny from all
</FilesMatch>
<Files ms-files.php>
 Allow from all
</Files>
<Files wp-tinymce.php>
 Allow from all
</Files>

W katalogu ‘wp-content/uploads/’ dodaj plik lub uzupełnij ‘.htaccess’ o zawartości:

<FilesMatch "\.(?i:php)$">
 Order allow,deny
 Deny from all
</FilesMatch>

Bieżąca administracja WordPressem.

Pamiętaj o aktualizacjach.

Banał? Zdziwiłbyś się ile osób o nim zapomina. Aktualizacje, oprócz ulepszeń funkcjonalności, obejmują poprawę zabezpieczeń, poprzez naprawę błędów i eliminację luk w zabezpieczeniach. Pamiętaj więc o regularnej aktualizacji WordPressa oraz wszystkich swoich wtyczek i szablonów. Szczególnie, gdy aktualizacja dotyczy kwestii bezpieczeństwa. Nie musisz rzucać wszystkiego innego, jeśli nowa wersja motywu lub wtyczki wprowadza drobne poprawki funkcjonalne, możesz zaczekać na dogodny moment. Nie ignoruj natomiast tych ważnych, gdy dotyczą bezpieczeństwa, wykonuj je możliwie jak najszybciej.

Dobrym nawykiem jest zadbanie o kopię bezpieczeństwa przed każdą aktualizacją, na wypadek wystąpienia jakiegoś błędu. Szczególnie, gdy Twoja strona jest złożona i rozbudowana. Pamiętaj również, aby zawsze sprawdzać witrynę po aktualizacjach automatycznych. Upewnij się, że aktualizacja przebiegła efektywnie i przy okazji niczego nie zepsuła.

Pamiętaj o kopiach zapasowych.

Wydawałoby się, że kolejna oczywistość? Niestety nie dla wszystkich. A jest to istotna sprawa, na wypadek udanego ataku na stronę, który może spowodować nieodwracalne uszkodzenie zawartości witryny. W takiej sytuacji posiadanie kopii zapasowej może okazać się jedynym sposobem, aby przywrócić utraconą zawartość. W przypadku witryn WordPress istnieje wiele opcji wykonania kopii zapasowej, część z nich opisujemy w innym artykule niniejszego poradnika.

Instaluj wtyczki i motywy tylko ze sprawdzonych źródeł.

Czasem bywa tak, że nie wystarcza nawet tak ogromna ilość wtyczek i motywów, dostępnych z oficjalnego repozytorium. Internet dostarcza wiele innych stron, oferujących kolejne możliwości.
I tutaj niestety czai się kolejne zagrożenie, ponieważ nie ma żadnej pewności, czy wtyczka lub motyw nie zawiera złośliwego kodu. W oficjalnym repozytorium znajdują się te rozwiązania, które przeszły proces weryfikacji. Decydując się więc na rozwiązanie zewnętrzne, powinieneś zadbać o przeprowadzenie analizy kodu pod kątem bezpieczeństwa. W przeciwnym razie narażasz się na potencjalne zagrożenie, szczególnie, jeśli jest to rozwiązanie bezpłatne. W przypadku tych komercyjnych, teoretycznie zagrożenie jest mniejsze, ale również nie ufaj w ciemno. Sprawdź przynajmniej, czy dostawca wygląda na wiarygodnego, a w Sieci nie ma żadnych wątków, ujawniających błędy bezpieczeństwa. I, pod żadnym pozorem, bez żadnego wyjątku, nigdy nie instaluj niczego, co pochodzi z niepewnego lub anonimowego źródła.

Niezależnie od powyższego, zawsze staraj się zweryfikować, czy wtyczka jest rozwijana, czy też została  porzucona i nikt nie poprawi ew. błędów.

Usuwaj zbędne wtyczki i motywy.

                Niezaktualizowane lub nieużywane wtyczki lub motywy, to jedna z częstszych przyczyn włamań do WordPressa. Nie pozostawiaj więc śmietnika i w tym obszarze, ale pamiętaj, że nie wystarczy samo wyłączenie. Dopóki taka wtyczka znajduje się w strukturach WordPressa, dopóty może być wykorzystana jako furtka. Ta sama zasada dotyczy motywów. Raczej rzadko zdarza się sytuacja, gdy używanych jest jednocześnie kilka szablonów, więc usuń te zbędne, niech nie kuszą.

Przyglądaj się kontom użytkowników.

                W sytuacji, gdy dopuszczasz możliwość rejestracji kont, regularnie przeglądaj ich listę, np. pod kątem dziwnych zapisów. Każda pozycja, która nie powinna się tam znaleźć lub, która nie odpowiada przyjętemu schematowi, powinna wzbudzać Twoją czujność. Niektóre rodzaje infekcji wykorzystują możliwość rejestracji konta, a następnie próbują wykonać jakiś kolejny krok przy ich użyciu.

Otoczenie jest równie ważne.

Pilnuj wszystkiego, co ‘dotyka’ WordPressa.

Pamiętaj, że sam WordPress, to nie wszystko. Np. co z tego, że skutecznie ochronisz CMS’a, jeśli za chwilę zalogujesz się z komputera, w którym czeka jakieś zagrożenie, potrafiące przedostać się dalej?
Albo Ty sam prześlesz mu to zagrożenie, wraz z wgrywanym plikiem? Czy też, w Twoim komputerze ktoś zainstalował sobie ‘lornetkę’, przez którą podpatruje wszystkie ruchy, z wpisywaniem haseł włącznie? Niektóre wirusy potrafią wykraść z komputera hasła z przestarzałych wersji innych programów, a następnie wykorzystać je do zainfekowania strony. Pamiętaj, że faktyczna siła każdego łańcucha zależy od jego najsłabszego oczka. Zapoznaj się proszę z artykułem ‘Jak chronić swój e-biznes przed atakiem.’, który również znajdziesz w tym poradniku. I stosuj wskazane tam porady na każdym kroku. Pamiętaj, że bezpieczeństwo, skuteczna ochrona, to cały i notorycznie stosowany proces, obejmujący wszystkie elementy danej struktury.

Panuj nad dostępami do Twoich usług.

Rozwijając witrynę, być może będziesz korzystał z usług firm/osób trzecich. Może to mieć miejsce np. w ramach współpracy z grafikiem, innymi redaktorami, specjalistami od SEO, itd.
W sytuacji, gdy pozwolisz na dostęp do samego WordPressa (lub jakiejkolwiek innej usługi), pamiętaj o posprzątaniu po zakończeniu prac. Po prostu zmień hasła dostępowe, a najlepiej usuń zbędne konta.
W artykule nt. RODO przeczytasz, że i tak powinieneś zadbać o tego typu procedury, więc tym bardziej o nich pamiętaj.

Tego robić nie musisz.

Wtyczki od zabezpieczeń.

Jak widzisz, całkiem sporo jest rzeczy, które można wykonać, aby zwiększyć bezpieczeństwo WordPressa. W dodatku, niestety nie jest to katalog zamknięty i dany raz na zawsze, otoczenie jest zmienne. Są również takie rzeczy, których nie należy robić mimo, iż poleca je wiele nieświadomych osób.

                Jak już wiesz, są to wszelkiego rodzaju wtyczki – kombajny bezpieczeństwa, ponieważ niewiele wnoszą, a jednocześnie dają złudne poczucie bezpieczeństwa i są kolejną potencjalną dziurą. W jednym z raportów, na dziesięć najbardziej dziurawych wtyczek, znalazły się dwa tego typu kombajny: ‘wordfence’ i ‘better-wp-security’. Zapewne od tego czasu wiele zmieniło się, niewykluczone również, że na lepsze, ale należy pamiętać, że ochrona to proces, nie działanie na zasadzie ‘kliknij i zapomnij’.

Zmiana domyślnych ścieżek.

                W wielu miejscach Sieci znajdziesz poradę, aby zmienić domyślne ścieżki do wtyczek i motywów WordPressa, czyli ‘wp-content/plugins’ i ‘wp-content/themes’. Niestety niewiele to da, ponieważ bardzo łatwo ustalić nową ścieżkę, chociażby poprzez analizę plików Java Script lub CSS.

Ukrywanie zbędnych informacji.

                Wiele osób poleca również ukrycie informacji nt. wersji WordPressa, np. poprzez usunięcie z kodu strony znacznika generator. Niestety, taka zmiana niewiele da, ponieważ ta informacja nikogo nie interesuje. Roboty szukają dziur, a nie znaczników.

Testowanie zabezpieczeń.

Sam skanuj swoją stronę.

Regularnie skanuj swoją witrynę, np. za pomocą bezpłatnego skanera online lub narzędzia WPScan. Istnieją też wtyczki służące takim celom, jak np. ‘Plugin Inspector’, która pokaże podejrzane elementy kodu, do dalszej analizy.

Śledź w Sieci informacje dot. bezpieczeństwa WordPress’a i staraj się wyciągać z nich wnioski.

Potrzebujesz pomocy?

Potrzebujesz dodatkowej pomocy lub porady? Serdecznie zapraszamy do kontaktu z naszą Pomocą Techniczną.

Serdecznie zapraszamy również na naszego bloga, gdzie znajdziesz m.in. mnóstwo porad dotyczących hostingu, serwerów, obsługi stron WWW i e-commerce. W szczególności do sekcji: https://blog.servizza.com -> ‘Polecane artykuły’.

Polub też proszę nasze profile w social mediach, abyśmy mieli szansę Cię poinformować o nowych publikacjach (linki w menu) :).