jak zabezpieczyć wordpressa

Jak uniknąć ataków na WordPressa – 5 prostych zasad

WordPress to jedna z popularniejszych platform do zarządzania treścią (CMS) nie tylko wśród blogerów, ale również osób uruchamiających własne lub komercyjne serwisy www i sklepy internetowe. Jego popularność sprawia, że jest on również częstym obiektem zainteresowania osób zajmujących się badaniami bezpieczeństwa i poszukiwaniem podatności w kodzie. Za każdym razem gdy taka podatność zostanie znaleziona, a informacja o niej opublikowana cała armia intruzów rusza na poszukiwania w Internecie serwisów pracujących na danej wersji WordPressa. Nie świadczy to wcale o słabości samej platformy, bo jak wiadomo każdy kod zawiera błędy i błędy te prędzej czy później wychodzą na światło dzienne, ale właśnie o jej popularności. Zaznaczyć też należy, że autorzy WordPressa w sposób wzorcowy reagują na zgłoszenia dotyczące błędów w kodzie i w trybie natychmiastowym wypuszczają aktualizacje z poprawkami. Niestety tutaj pojawia się problem, bo najszybsze nawet wypuszczenie aktualizacji na nic się zda, jeżeli nie zostanie ona równie szybko zainstalowana. Dobre praktyki dotyczące zarządzania bezpieczeństwem mówią o konieczności częstego sprawdzania i instalowania aktualizacji używanych systemów. Niestety statystyka pokazuje, że praktyki te zna niekoniecznie każdy, a stosuje się do nich już tylko wąska grupa administratorów. W znalezionej niedawno krytycznej luce dotyczącej WordPressa 4.7.0 i 4.7.1 kryła się możliwość zdalnego zmodyfikowania zawartości serwisu przez atakującego (t.zw. deface). Pomimo szybkiego wypuszczenia aktualizacji do wersji 4.7.2 w tydzień po jej wydaniu nadal miliony serwisów korzystały (i dalej korzystają) ze starych, podatnych na ataki wersji. W zaledwie kilka dni zaatakowanych i zmodyfikowanych zostało ponad 1,5 miliona stron bazujących na WordPressie 4.7.0 i 4.7.1.

Zatem jak zabezpieczyć WordPressa i ustrzec się problemów z bezpieczeństwem swojego serwisu? Poniżej 5 łatwych do implementacji zasad:

Zasada 1- aktualizuj

Jak już wspomniałem we wstępie znalezienie mniej lub bardziej krytycznego błędu to tylko kwestia czasu. Dotyczy to każdego systemu. Dlatego też bezwzględnie zalecane jest jak najczęstsze sprawdzanie i instalowanie aktualizacji. WordPress umożliwia nam włączenie automatycznych aktualizacji, co jest wygodną opcją, zwłaszcza dla osób zarządzających dużą ilością serwisów. Jeżeli na co dzień nie zajmujesz się śledzeniem doniesień dotyczących nowych podatności to zalecam skorzystanie z tej właśnie formy aktualizacji. Po ukazaniu się nowej wersji WordPress sam dokona jej instalacji i poinformuje cię mailowo o tym fakcie. Tobie pozostanie tylko sprawdzenie, czy wszystko działa jak powinno.

Zasada 2 – monitoruj i reaguj

Poza korzystaniem z udokumentowanych podatności bardzo częstym powodem przejęcia serwisu przez intruzów są prymitywne ale skuteczne ataki siłowe i słownikowe na hasła. Warto jest zatem wiedzieć, czy ktoś nie próbuje się logować na nasze konto z dużą częstotliwością w celu odgadnięcia prawidłowego hasła. Nawet stosunkowo silne hasło może w końcu zostać złamane, jeżeli intruz ma możliwość próbować setki tysięcy albo i milionów razy pozostając niezauważonym. I tutaj właśnie z pomocą może nam przyjść wtyczka do WordPressa o nazwie Loginizer. Po jej zainstalowaniu dostajemy do dyspozycji dosyć prosty panel, który pozwoli nam skonfigurować podstawowe zasady bezpieczeństwa. Pierwsza zakładka wyświetla nam zalecane ustawienia uprawnień do plików i porównuje je z aktualnie posiadanymi informując o ewentualnych nieprawidłowościach:

zabezpieczenia plików wordpressa

Tutaj wybieramy też metodę identyfikacji klienta podejmującego próby logowania. Wartosć REMOTE_ADDR będzie dobrym wyborem w ogromniej większości przypadków. W kolejnej zakładce możemy zająć się już ustawieniami konkretnych parametrów związanych ze zliczaniem i blokowaniem prób nieudanego logowania:

zabezpieczanie prób logowania do wordpressa

W pierwszej sekcji okna dostępna jest lista adresów IP, które zostały zablokowane ze względu na przekroczenie maksymalnej, dozwolonej liczby błędnych logowań (Max Retries). Warto tutaj zaglądać aby wiedzieć, czy ktoś nie próbuje poddawać próbie siły naszego hasła. Lockout Time to czas, na który adres IP intruza zostaje zablokowany po przekroczeniu Max Retries. Max Lockouts oznacza natomiast ile razy może nastąpić zablokowanie na Lockout Time zanim użyte zostanie Extended Lockout, czyli rozszerzony czas blokady. Wartość Reset Retries mówi natomiast po jakim czasie resetowany ma być licznik nieudanych prób logowania. W powyższym zrzucie ekranu ustawienia są bardzo restrykcyjne: użytkownik może próbować zalogować się 3 razy, po czym zostanie zablokowany na rok. Jeżeli po roku znowu 3 razy niepoprawnie się zaloguje to zostanie zablokowany na kolejny rok. Aby pozostać niezauważonym musiałby więc podejmować jedną próbę logowania na 13 miesięcy.

W drugiej sekcji tej samej zakładki możemy natomiast ręcznie dodawać adresy IP na whitelistę lub blacklistę:

whitelista i blacklista adresów IP logujących się do wordpressa

W przypadku whitelisty warto jest dodać przynajmniej jeden własny adres IP aby samemu mieć możliwość podejmowania większej ilości prób logowania (komu nie zdarzyło się zapomnieć hasła?).

Zasada 3 – blokuj

Poza śledzeniem i blokowaniem nieudanych prób logowania warto zabezpieczyć sam dostęp do formularza logowania (wp-login.php). W ten sposób ograniczymy możliwość przejęcia serwisu tym, którzy w jakiś sposób znaleźli się już w posiadaniu naszego hasła (podpatrzenie, zgubienie, keylogger, sniffer, atak man in the middle…. możliwości jest całkiem sporo). Przy okazji warto też zabezpieczyć dostęp do dwóch plików: wp-config.php oraz xmlrpc.php. Pierwszy z nich, jak sama nazwa wskazuje, zawiera konfigurację i  co prawda domyślnie nie zwróci żadnej zawartości, ale w przypadku błędnej konfiguracji serwera www mógłby umożliwić odczytanie loginu i hasła do bazy danych. Drugi z nich jest interfejsem API umożliwiającym komunikację z WordPressem zewnętrznym aplikacjom i narzędziom do zarządzania naszym serwisem. Jeżeli więc z takowych nie korzystamy warto jest zablokować dostęp do tego pliku, gdyż często jest on wykorzystywany w atakach siłowych na hasła (np. tam, gdzie nie pozwala na to wtyczka loginizer). W przypadku plików wp-config.php i xmlrpc.php blokujemy zatem całkowicie możliwość dostępu, natomiast w przypadku wp-login.php ograniczamy ją do listy zaufanych adresów IP. Wszystko to robimy umieszczając poniższą zawartość w pliku .htaccess w głównym katalogu naszego WordPressa:

<files xmlrpc.php>
  order allow,deny
  deny from all
</files>

<Files wp-config.php>
    order allow,deny
    deny from all
</Files>
 
<Files wp-login.php>
    order deny,allow
    allow from 10.20.30.40
    allow from 8.8.8.8
    deny from all
</Files>

Adresy IP są oczywiście przykładowe, pamiętaj o ich zamianie. Inaczej stracisz możliwość logowania się do własnego serwisu.

Zasada 4 – zabezpiecz komunikację

Brak szyfrowania ruchu w komunikacji z serwerem to kolejny z najczęstszych powodów kłopotów z bezpieczeństwem WordPressa (i nie tylko). Logowanie się do serwisu poprzez protokół HTTP to proszenie się o kłopoty. Podobnie jak zarządzanie plikami przez FTP czy logowanie się do serwera przez telnet. Wszystkie te protokoły już dawno powinny zostać zastąpione swoimi bezpiecznymi odpowiednikami: HTTPS, SFTP lub SCP i SSH. Zakup certyfikatu SSL to już nie wydatek kilkuset złotych. Można znaleźć oferty za kilka dolarów u zagranicznych dostawców, a nawet darmowe (https://letsencrypt.org/getting-started/).

Zasada 5 – dbaj o poufność

Zapisywanie haseł w formie jawnego tekstu lub zapamiętywanie ich w przeglądarkach internetowych i klientach ftp jest również bardzo częstym powodem kompromitacji serwisów www. Wiele wirusów i koni trojańskich oraz innego szkodliwego oprogramowania potrafi „wyciągnąć” zapamiętane w aplikacjach hasła i przesłać je do intruza. Jedynym miejscem, w którym zapisujemy hasła powinny być dedykowane do tego aplikacje, takie jak np. KeePass.

Co jeszcze?

Opisana wcześniej wtyczka Loginizer w wersji płatnej umożliwia włączenie uwierzytelniania dwuskładnikowego (2FA). W przypadku serwisów, które są dla nas szczególnie istotne lub w których przetwarzamy krytyczne dane jest to na pewno opcja warta rozważenia.

Istnieje również cała gama innych wtyczek wspierających bezpieczeństwo. Należy jednak pamiętać, że wtyczki, podobnie jak sam WordPress również zawierają błędy i mogą stać się celem ataku. Zanim zatem zdecydujemy się na ich instalację warto poczytać opinie, sprawdzić wiarygodność autora wtyczki i dowiedzieć się jak często jest ona aktualizowana. Czym więcej wtyczek w naszej instalacji, tym więcej kodu i tym większa staje się powierzchnia ataku dla potencjalnego intruza.

Jak boleśnie nauczyło mnie moje własne doświadczenie, bezpieczeństwo serwisu www może się okazać również zagrożone z powodu nieodpowiedzialnego podejścia do swoich obowiązków dostawcy usług hostingowych. Dzięki zastosowaniu wszystkich powyższych zasad i wykluczeniu możliwości zaniedbania z mojej strony udało mi się trafić na ślad bardzo poważnego incydentu bezpieczeństwa u mojego hostingodawcy.

 

One comment

  1. Jakiś czas temu nadziałem się na problem o którym piszesz w drugim punkcie. Shackowano moją stronkę bruteforcem. Po tej akcji zacząłem stosować 3 rzeczy:
    – zmiana loginu domyślnego administratora (z admin na np. król_strony)
    – ograniczenie logowania do 3-ech prób (o tym napisałeś)
    – używam do logowania aplikacji Clef (logowanie MFA – umożliwia m.in. wyłączenie standardowego logowania, wymuszenie czasowego wylogowania)

Leave a Reply

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

This site uses Akismet to reduce spam. Learn how your comment data is processed.