Moduł 7 · 7.3
Logowanie: hasła, uwierzytelnianie dwuskładnikowe i ataki brute force
Moduł 7: Bezpieczeństwo · Czas czytania: 9 minut
Cel lekcji: Po tej lekcji będą Państwo potrafili zabezpieczyć logowanie do swojej strony za pomocą silnych haseł, uwierzytelniania dwuskładnikowego oraz ograniczenia prób logowania, a także będą Państwo wiedzieć, czym jest xmlrpc.php.
Kluczowe pojęcia: menedżer haseł, fraza hasłowa, unikalne hasło, uwierzytelnianie dwuskładnikowe (2FA, TOTP), passkey, brute force, ograniczenie prób logowania, wp-login.php na adres IP, xmlrpc.php, wyciekające nazwy użytkowników (REST, ?author=), hasła aplikacji
Hasło: długie i unikalne
Dobre hasło ma dwie cechy:
- Długie: długość liczy się bardziej niż nietypowe znaki. Fraza hasłowa złożona z czterech lub pięciu losowych słów (
sito-pingwin-październik-latarnia) jest silniejsza i łatwiejsza do zapamiętania niżH4sl0!. Kampania rządu niderlandzkiego Veilig Internetten zaleca unikalne hasło o długości co najmniej 12 znaków, najlepiej frazę hasłową. - Unikalne: nieużywane nigdzie indziej. Credential stuffing (lekcja 7.1) działa tylko wtedy, gdy ponownie wykorzystuje się hasło.
Nikt nie zapamięta kilkudziesięciu długich, unikalnych haseł. Dlatego warto korzystać z menedżera haseł: programu, który tworzy je, przechowuje i wpisuje za Państwa. Wtedy wystarczy zapamiętać tylko jedno hasło, do samego menedżera, które również warto zabezpieczyć uwierzytelnianiem dwuskładnikowym.
To, czy dane hasło znajduje się w znanym wycieku danych, można sprawdzić na stronie haveibeenpwned.com. Jeśli Państwa adres e-mail znajduje się w wycieku, należy zmienić hasło w każdej usłudze, w której używali Państwo tego samego hasła.
Uwierzytelnianie dwuskładnikowe
Dzięki uwierzytelnianiu dwuskładnikowemu (2FA) przy logowaniu, oprócz hasła, potrzebny jest jeszcze jeden element: zazwyczaj sześciocyfrowy kod z aplikacji na telefonie (aplikacja uwierzytelniająca, zgodna ze standardem TOTP). Włamywacz znający Państwa hasło nadal się wtedy nie zaloguje.
WordPress nie ma wbudowanego uwierzytelniania dwuskładnikowego. Dodaje się je za pomocą wtyczki. Jest ich wiele; prostą opcją jest Two Factor, stworzona przez współtwórców samego WordPressa. Wtyczki bezpieczeństwa również często mają tę funkcję wbudowaną. Przy wyborze warto zwrócić uwagę na:
- aplikacje TOTP i kody zapasowe (na wypadek zgubienia telefonu); kody przesyłane e-mailem są słabsze, ponieważ skrzynka pocztowa również może zostać zhakowana;
- możliwość wymuszenia uwierzytelniania dwuskładnikowego dla administratorów i redaktorów;
- passkeys: logowanie za pomocą odcisku palca, twarzy lub klucza bezpieczeństwa, bez hasła. Istnieją do tego również wtyczki. Passkeys są odporne na phishing, ponieważ działają wyłącznie na prawdziwej stronie.
Uwierzytelnianie dwuskładnikowe warto włączyć również we wszystkim, co znajduje się wokół Państwa strony: w panelu hostingowym, poczcie e-mail, u rejestratora domeny i w menedżerze haseł. Włamywacz, który przejmie Państwa panel hostingowy, nie potrzebuje hasła do WordPressa.
Brute force i ograniczanie prób logowania
Otwarta strona WordPress przez cały dzień otrzymuje próby logowania na wp-login.php, często z nazwą admin i listami popularnych haseł. Z długim hasłem i 2FA nikt się nie zaloguje, ale każda próba kosztuje serwer moc obliczeniową (pełne uruchomienie WordPressa). Przy dużej fali ataków strona staje się wolna.
Sam WordPress nie ogranicza liczby prób. Co pomaga, w kolejności „wczesnego zatrzymywania”:
- Na serwerze: wielu dostawców hostingu blokuje adres IP, który w krótkim czasie wykonuje dużo nieudanych prób, zanim jeszcze uruchomi się WordPress (za pomocą zapory sieciowej lub funkcji serwera WWW). Proszę zapytać swojego dostawcę hostingu, co się dzieje w takiej sytuacji.
- wp-login.php tylko dla Państwa adresu IP: za pomocą kilku linijek w pliku
.htaccess(w przypadku LiteSpeed i Apache):
<Files wp-login.php>
Require ip 192.0.2.10
</Files>Działa to dobrze, jeśli mają Państwo stały adres IP. Jeśli nie (w domu, na telefonie), zablokują Państwo sami sobie dostęp, gdy adres się zmieni. Alternatywą jest dodatkowe hasło na stronie logowania (tzw. „chroniony katalog”, basic authentication) z innym hasłem niż hasło do WordPressa.
- Wtyczka ograniczająca próby logowania: po pięciu nieudanych próbach adres IP zostaje na jakiś czas zablokowany. Działa, ale dopiero gdy WordPress już się uruchomił, więc obciążenie obliczeniowe pozostaje.
Ukrycie lub zmiana nazwy strony logowania (na przykład /moje-logowanie zamiast /wp-login.php) zmniejsza ilość „szumu” w dzienniku zdarzeń. Nie jest to prawdziwe zabezpieczenie, a niektóre wtyczki i motywy oczekują standardowego adresu. Jako dodatek jest to w porządku, ale nigdy zamiast dobrego hasła i 2FA.
xmlrpc.php
xmlrpc.php to stary interfejs z czasów sprzed REST API, za pomocą którego aplikacje i inne strony komunikują się z WordPressem. Jest nadal używany przez niektóre aplikacje, przez Jetpack i przez kilka integracji. Dla większości stron jest zbędny.
Włamywacze lubią xmlrpc.php, ponieważ w jednym żądaniu można wypróbować setki haseł jednocześnie (za pomocą funkcji system.multicall), a ponadto może on być wykorzystywany do ataków na inne strony (pingbacki). Co można zrobić:
- Jeśli go Państwo nie używają: proszę go zablokować. Niektórzy dostawcy hostingu, w tym WebOké, blokują xmlrpc.php domyślnie na serwerze. W przeciwnym razie można to zrobić za pomocą reguły w pliku
.htaccesslub wtyczki bezpieczeństwa. - Jeśli go Państwo używają (na przykład dla aplikacji, która tego potrzebuje): proszę zostawić go otwartego, ale zadbać o silne hasła, 2FA i ograniczenie liczby prób. Nowoczesne aplikacje zazwyczaj korzystają z REST API z hasłem aplikacji (lekcja 3.3).
Wyciekające nazwy użytkowników
W lekcji 3.3 widzieli Państwo, że WordPress pokazuje pochodną nazw użytkowników:
https://example.com/?author=1przekierowuje do/author/<nazwa>/;https://example.com/wp-json/wp/v2/userspokazuje listę slugów wszystkich osób, które coś opublikowały.
Czy to problem? Nazwa użytkownika nie jest hasłem. Przy długim unikalnym haśle i 2FA niewiele to zmienia. Daje to jednak włamywaczowi połowę danych logowania i ułatwia ukierunkowany phishing. Rozsądne środki to:
- nadanie administratorom nazwy użytkownika innej niż ich publiczna nazwa oraz niepublikowanie treści z konta administratora (lekcja 3.3);
- ograniczenie listy użytkowników w REST API za pomocą wtyczki bezpieczeństwa lub kilku linijek kodu, jeśli nie jest ona potrzebna. Proszę nie wyłączać REST API całkowicie: edytor blokowy i wiele wtyczek go potrzebuje.
Hasła aplikacji
Hasła aplikacji (lekcja 3.3) to bezpieczny sposób na nadanie dostępu aplikacji lub systemowi, ale omijają one uwierzytelnianie dwuskładnikowe: aplikacja z hasłem aplikacji nie potrzebuje kodu. Proszę tworzyć je tylko wtedy, gdy jest to konieczne, na koncie z niską rolą, i wycofywać je, gdy integracja przestaje być używana.
Podsumowanie
- Proszę używać długich, unikalnych haseł (fraz hasłowych) w menedżerze haseł.
- Proszę włączyć uwierzytelnianie dwuskładnikowe, za pomocą wtyczki w WordPressie, a także w panelu hostingowym, poczcie i u rejestratora domeny.
- Proszę zatrzymywać próby logowania jak najwcześniej: na serwerze, regułą IP lub dodatkowym hasłem, albo za pomocą wtyczki.
- Proszę zablokować xmlrpc.php, jeśli go Państwo nie używają.
- Wyciekające nazwy użytkowników to nie katastrofa, ale sygnał ostrzegawczy: proszę nie publikować treści jako administrator i ograniczyć listę użytkowników w REST, jeśli nie jest potrzebna.
Quiz
Zadanie
Zadanie A7.3: Co Państwa strona ujawnia podczas logowania? Proszę wpisać adres swojej strony i udowodnić, że to Państwa własna strona (za pomocą kodu zadania, jako rekord TXT lub jako plik). Program sprawdza trzy rzeczy: czy xmlrpc.php zwraca listę funkcji (otwarty) czy jest zablokowany, czy /wp-json/wp/v2/users pokazuje nazwy użytkowników (slugi), oraz dokąd przekierowuje /?author=1. Proszę zaznaczyć, czy potrzebują Państwo xmlrpc.php; jeśli nie, otwarty xmlrpc.php zostanie oznaczony na czerwono. Wyciekające slugi są oznaczone na pomarańczowo wraz z wyjaśnieniem.
Zadanie D7.3: Włączenie uwierzytelniania dwuskładnikowego. Proszę włączyć uwierzytelnianie dwuskładnikowe dla wszystkich administratorów swojej strony WordPress, a także w panelu hostingowym i poczcie e-mail. Proszę zapisać kody zapasowe w menedżerze haseł. Dla każdego elementu proszę zaznaczyć, że jest włączony, i zanotować, jaką metodę Państwo stosują (aplikacja, passkey, e-mail) oraz gdzie znajdują się kody zapasowe. Proszę zanotować również, w jaki sposób dodatkowo chronią Państwo wp-login.php i dlaczego wybrali Państwo taki sposób.
Zadanie D7.3: Włączenie uwierzytelniania dwuskładnikowego
To zadanie wykonuje się samodzielnie, nikt go nie sprawdza. Prosimy zaznaczyć wykonane punkty i oznaczyć zadanie jako wykonane.
Dla administratorów zaleca się raczej aplikację lub klucz dostępu (passkey) niż wyłącznie e-mail. Stały adres IP można dopuścić do wp-login.php; przy zmiennych adresach lepiej sprawdza się ograniczenie liczby prób logowania.
Zaznaczenia i notatki pozostają tylko w tej przeglądarce; nie są nigdzie wysyłane. Po zalogowaniu w Moje kursy zapisywana jest jedynie informacja, że zadanie zostało wykonane.
Więcej informacji
Poniższe artykuły opisują kroki w panelach WebOké; w innych panelach działają one w podobny sposób.
- Instrukcja DirectAdmin 3.7: Bezpieczne hasła i co zrobić w przypadku wycieku hasła
- Weryfikacja dwuetapowa w Moje WebOké oraz konfiguracja aplikacji uwierzytelniającej
- Brak dostępu do xmlrpc.php w WordPressie
- Zabezpieczenie wp-login.php w WordPressie
- Instrukcja DirectAdmin 15.9: Katalogi chronione hasłem
- Bezpieczne logowanie (Veilig Internetten, rząd niderlandzki): https://veiliginternetten.nl/veilig-inloggen/
- Ataki brute force (developer.wordpress.org, w języku angielskim): https://developer.wordpress.org/advanced-administration/security/brute-force/
