Bezpieczeństwo WP: zabezpieczenie wp-admin | zmiana adresu logowania, limit logowań, XML-RPC

Zabezpieczenie wp-admin to ustawienia, które blokują ataki brute force na panel administracyjny i ekran logowania WordPressa. Analiza logów dostępu serwera Nginx + Apache, na którym działa kilka witryn na WordPressie, pokazała, że automatyczne żądania do xmlrpc.php napływały dalej także po zmianie adresu logowania, dlatego wprowadzono również limit żądań na poziomie serwera.
1️⃣ Dlaczego wp-admin i wp-login.php są celem ataków
To, że adres panelu WordPressa jest powszechnie znany, jest słabym punktem, ale możesz to zrównoważyć, wzmacniając zabezpieczenia. Każda witryna na WordPressie używa tego samego /wp-admin/ i [wp-login.php], a po otwarciu /wp-admin/ bez zalogowania trafiasz na ekran logowania [wp-login.php].
Ataki przychodzą jako brute force – na tym ekranie logowania raz za razem wpisuje się nazwy użytkownika i hasła. Dlatego w zabezpieczeniu wp-admin blokowanie prób logowania jest ważniejsze niż ukrywanie adresu.
2️⃣ Zmiana adresu logowania: co daje, a czego nie
Gdy zmienisz adres logowania wtyczką bezpieczeństwa, domyślny [wp-login.php] zaczyna zwracać błąd 404, więc automatyczne ataki uderzające w domyślny adres nie docierają nawet do ekranu logowania. Nowy adres trzeba osobno przekazać każdemu, kto ma konto administratora.
Ta metoda wymaga niewiele pracy, ale jeśli zapomnisz nowy adres, nie wejdziesz do panelu administracyjnego i trzeba będzie wyłączyć wtyczkę, zmieniając nazwę jej folderu przez FTP albo w menedżerze plików. Jeśli witryną zarządza kilka osób, warto zapisać adres w jednym miejscu.
3️⃣ Limit prób logowania i uwierzytelnianie dwuskładnikowe
Nawet po zmianie adresu logowania, gdy nowy adres wycieknie, próby odgadnięcia hasła trwają dalej. Rdzeń WordPressa nie ogranicza nieudanych logowań – niezależnie od tego, ile razy wpiszesz złe hasło, ten sam ekran logowania otwiera się ponownie.
Wtyczka ograniczająca próby logowania blokuje na pewien czas IP, które przekroczy ustaloną liczbę prób, a uwierzytelnianie dwuskładnikowe nawet przy poprawnym haśle wymaga jeszcze kodu z aplikacji uwierzytelniającej w telefonie. Włączając uwierzytelnianie dwuskładnikowe, zachowaj też kody zapasowe na wypadek utraty telefonu.
4️⃣ Zamknięcie xmlrpc.php
[xmlrpc.php] to drugie wejście, które przyjmuje nazwę użytkownika i hasło bez ekranu logowania, a metodą [system.multicall] można w jednym żądaniu sprawdzić wiele haseł.
W logach dostępu serwera Nginx + Apache, na którym działa kilka witryn na WordPressie, 13 października między 0:00 a 9:50 do [xmlrpc.php] trafiło 2250 żądań POST. Przyszły z 22 adresów IP, a User-Agent podszywał się pod Jetpack i WordPress.com.
Jeśli nie korzystasz z aplikacji mobilnej WordPressa ani z wtyczki Jetpack, zablokuj żądania do [xmlrpc.php] w konfiguracji Nginx albo użyj opcji wyłączenia XML-RPC we wtyczce bezpieczeństwa.
# W bloku server — odrzucanie żądań do xmlrpc.php
location = /xmlrpc.php {
deny all;
}Z tym ustawieniem wszystkie żądania GET i POST do [xmlrpc.php] kończą się kodem 403, zanim dotrą do PHP. Wyłączenie XML-RPC we wtyczce bezpieczeństwa odrzuca tylko żądania wymagające logowania, a plik dalej odpowiada, więc żeby ograniczyć też uruchamianie PHP, lepiej zablokować go w Nginx.
5️⃣ Blokada na serwerze: dostęp administratora tylko z wybranych IP i limit żądań
Jeśli zarządzasz witryną tylko ze stałego IP, najpewniejszą metodą jest dopuszczenie w Nginx do [wp-login.php] i /wp-admin/ wyłącznie tego IP. Nie sprawdza się to tam, gdzie IP w domu lub w biurze często się zmienia.
Może się wydawać, że wystarczy zablokować cały /wp-admin/, ale funkcje po stronie odwiedzających, takie jak wyszukiwarka czy koszyk, często wysyłają żądania do [admin-ajax.php], więc ten plik musi zostać otwarty.
# W bloku server — nad blokiem location obsługującym PHP
location = /wp-login.php {
allow 203.0.113.10; # Twoje stałe IP do zarządzania
deny all;
# Poniżej skopiuj ustawienia bloku location obsługującego PHP
}Otwarcie [wp-login.php] z innego IP niż wskazane daje 403, a ze wskazanego IP otwiera się ekran logowania. W bloku location trzeba bez zmian przenieść ustawienia PHP witryny (fastcgi_pass itd.), aby ekran logowania działał prawidłowo.
Jeśli nie możesz ustalić stałego IP, możesz nałożyć limit żądań na żądania PHP od niezalogowanych odwiedzających; proces ustawienia go na 30 na minutę, aby automatyczne żądania nie zajmowały zasobów serwera, opisano w artykule Ostrzeżenie php-fpm max_children poświęconym temu zagadnieniu.
# Blok http — liczenie per IP tylko żądań bez ciasteczka logowania
map $http_cookie $php_anon_key {
default $binary_remote_addr;
"~*wordpress_logged_in" "";
}
limit_req_zone $php_anon_key zone=php_anon:10m rate=30r/m;
# W bloku location obsługującym PHP
limit_req zone=php_anon burst=60 nodelay;
limit_req_status 429;Gdy jedno niezalogowane IP wysyła żądania PHP jedno po drugim, przetwarzane są do 61. włącznie, a potem zwracany jest kod 429; żądania z ciasteczkiem logowania nie są liczone. Jeśli pamięć podręczna stron odpowiada bez udziału PHP, zwykli odwiedzający przeglądający strony nie trafiają na ten limit.
Wtyczka bezpieczeństwa
5 najlepszych wtyczek bezpieczeństwa WordPress
Pięć popularnych wtyczek bezpieczeństwa zestawionych w tabeli porównawczej.
Logowanie
Reset zapomnianego hasła administratora
Jak zmienić hasło w profilu i jak je zresetować, gdy je zapomnisz.
Narzędzia
Generator losowych haseł
Narzędzie tworzące hasła o długości 6–30 znaków z wielkich i małych liter, cyfr oraz znaków specjalnych.
ℹ️ Informacja o linkach partnerskich
Treści tej witryny zawierają linki partnerskie. Jeśli odwiedzający kupi produkt lub usługę przez taki link, witryna otrzymuje od sprzedawcy prowizję. Kwota płacona przy tym przez kupującego (podczas promocji spada↓) nie wzrasta. Podane ceny, rabaty i dostępność odnoszą się do chwili pisania i mogą różnić się od stanu faktycznego, dlatego przed zakupem sprawdź je u sprzedawcy. Produkty wybieramy i oceniamy według własnych kryteriów, a prowizja nie wpływa ani na kolejność prezentacji, ani na treść ocen.