Dużo ludzi pracujących na WordPressie albo zapomina o ochronie wp-admin, albo przerzuca to na wtyczki, uważając, że sprawa jest załatwiona, bo ktoś im powiedział na YT, że tak zabezpieczą się przed hakerami. A prawda jest taka, że wystarczy kilka kroków bez wtyczek, żeby ten najbardziej kluczowy obszar WordPressa zabezpieczyć w znacznym stopniu, zmniejszając potencjalny wektor ataku, co przekłada się na Twój spokojny sen. Poniżej opisuję kilka technik, i żadna nie wymaga instalacji wtyczki, tylko otwartej głowy i chęci nauki. Do dzieła 🙂
CVE „na wp-admin”
Folder wp-admin obok plików takich jak wp-login.php, wp-config.php oraz functions.php jest jednym z najważniejszych obszarów WordPressa, który trzeba utwardzić, czyli wprowadzić zmiany, które poprawią jego bezpieczeństwo. Formalnie nie ma CVE na wp-admin, bo zawsze jest to exploit oznaczony ogólnie dla całego WordPressa, ale jest sporo dziur, które dotyczą wyłącznie jakiegoś pliku w wp-admin. Przykłady takich CVE wrzucam poniżej.
Filozofia 404 + założenia zabezpieczeń
Skoro już mamy ustalone, że jest sporo CVE dotyczących wyłącznie wp-admin, to teraz zajmijmy się założeniem całego artykułu. Jeśli będziemy ograniczać jakiś zasób dla niezaplanowanych gości, to zawsze będzie to kod 404. Wynika to z logicznego wniosku, że bot atakujący dany obszar CMS-a, otrzyma kod 404, więc „pomyśli”, że owego zasobu nie ma i sobie pójdzie. Inaczej może być z kodem 403, bo oznacza to, że bot targetował istniejącą część naszej strony i będzie próbował podjąć inne kroki, żeby się tam dostać.
Po drugie, będziemy manipulować pewnymi danymi, żeby dodatkowo zabezpieczyć folder wp-admin, zakładając, że administrator, który skorzysta z tych rad, będzie trzymał te dane w bezpiecznym miejscu i będą one znane tylko jemu.
Schowaj stronę za Cloudflare
Cloudflare ma dwie znakomite zalety. Jest darmowy i w bardzo dobry sposób chroni przed botami. Mimo, że „przeniesienie” witryny za CF może się wydawać trudne, to w sieci znajdziesz mnóstwo poradników, a taki znajdzie się niebawem na tym blogu (więc warto wracać 😉).
W wielkim uproszczeniu tutaj możesz ochronić wp-admin dwoma metodami. Włączając walkę z botami oraz korzystając z Page Rules, gdzie możesz ustawić specyficzne rekomendacje bezpieczeństwa dokładnie dla tego linku.
Dokumentacja Cloudflare jest dosyć obszerna i czytelnie napisana, więc zakładam, że dasz sobie radę w obsłudze CF, ale na https://community.cloudflare.com/ znajdziesz kilka przykładowych rad, jak dodatkowo chronić wp-admin.
Wyłącz numer wersji WordPressa
To jest rada dotycząca ogólnego bezpieczeństwa WP, ale niektóre ataki na wp-admin dotyczą konkretnych wersji WP, więc ukrycie informacji pomoże. Niektóre boty biegające po sieci dysponują bazą exploitów pod konkretne wersje WP, więc usunięcie aktualnie używanej wersji może im utrudnić zadanie nawet jeśli masz nieaktualną wersję CMS-a.
Standardowymi miejscami, w których jest informacja o aktualnie używanej wersji, są plik readme.html, nagłówek, feed (czyli RSS), oraz w stringach od skryptów i styli. Poniżej wklejam przykładowe kody, które pomogą usunąć wersje w/w miejscach.
Plik readme.html
Kod umieść w pliku .htaccess w głównym folderze strony.
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/readme.html
RewriteRule .* – [R=404,L]
Nagłówek WP, RSS, skrypty i style
Kod umieść w pliku functions PHP w folderze od motywu (pamiętaj pracować na child-theme, bo podczas aktualizacji motywu wszystkie zmiany zostaną nadpisane, czyli de facto usunięte).
remove_action(’wp_head’, 'wp_generator’);
add_filter(’the_generator’, '__return_empty_string’);
function remove_wp_version_strings($src) {
if (strpos($src, 'ver=’)) {
$src = remove_query_arg(’ver’, $src);
}
return $src;
}
add_filter(’style_loader_src’, 'remove_wp_version_strings’, 9999);
add_filter(’script_loader_src’, 'remove_wp_version_strings’, 9999);
Pamiętaj przetestować kod u siebie na stronie!
Dostęp tylko dla zaufanych IP
Możemy ograniczyć dostęp do folderu tylko do zaufanych adresów IP. Fajnie, jeśli mamy stały adres, bo wtedy wystarczy wdrożyć prostą regułkę w pliku .htaccess, ale dzisiaj, w dynamicznych czasach, dynamiczne adresy to norma, więc poniżej pokażę ci, jak możesz wpisać pulę adresów od swojego dostawcy w jednej linijce. Niektórzy operatorzy internetowi publikują zakresy adresów, które mają przyznane, i wtedy wystarczy skopiować najbardziej zbliżone do Twojego IP. Jeśli Twój dostawca nie publikuje takiej listy, to musisz obserwować i dostosować IP w pliku .htaccess (do tego jeszcze wrócimy). Ewentualnie możesz pozyskać taką listę i wymaga to skorzystania z narzędzia ipinfo.io.
Najpierw wejdź na stronę i w czarnej ramce po prawej stronie znajdziesz swój aktualny publiczny adres IP. Skopiuj go i doklej go do adresu witryny ipinfo.io w taki sposób: ipinfo.io/xx.xx.xx.xx, gdzie XX to poszczególne numery. Po wywołaniu adresu pojawią się informacje na temat Twojego adresu IP, w tym kod ASN Twojego dostawcy. Skopiuj go i wklej do okienka po lewej stronie, a po naciśnięciu enter na dole w tabelce.
Przeprowadź sobie taki proces na przykładowym adresie IP z Netii (adres jest przypadkowy). Załóżmy, że już go skopiowałem i żeby odkryć ASN mojego dostawcy wywołałem https://ipinfo.io/77.252.235.34 (normalnie można wejść przez menu, ale to najszybszy sposób). W „Summary” odnalazłem ASN dostawcy AS12741 i po sprawdzeniu informacji w wyszukiwarce otrzymałem w IP Range takie pulę adresów najbliższych mojemu:
77.252.0.0/14 | Netia SA | 262,144 |
77.65.134.0/24 | Netia SA | 256 |
77.65.155.0/24 | TVN S.A. | 256 |
77.65.188.0/24 | Computec S.A. | 256 |
77.65.193.0/24 | Adam Niescierowicz JustNet | 256 |
77.65.209.0/24 | NETWORKS! SP Z O O | 256 |
Od razu odpadają te adresy zarejestrowane na odpowiednie podmioty jak TVN S.A., a my zostawiamy sobie te wyłącznie przypisane Netia S.A. Te adresy np. przypisane pod TVN też należą do operatora Netia, ale biznesowi klienci mogą mieć prawo rejestrowania danej „podsieci” na siebie, stąd można odnieść wrażenie, że mamy adres w TVN-ie.
Reasumując, w tym przypadku mamy dwa zapisy: 77.252.0.0/14 oraz 77.65.134.0/24, i to one wylądują w naszej regule dla dynamicznych adresów od Netii (jeśli w ogóle takie przyznaje, bo to tylko przykład).
Kod dostępu dla jednego stałego adresu IP do wklejenia w plik .htaccess w folderze wp-admin
Order Allow,Deny
Allow from 77.252.235.34
Deny from all
Kod dostępu dla pozyskanej puli IP do wklejenia w plik .htaccess w folderze wp-admin
Order Allow,Deny
Allow from 77.252.0.0/14
Allow from 77.65.134.0/24
Deny from all
Ewentualną drogą do pozyskania potencjalnej listy adresów, jaką będzie przyznawał Ci dostawca internetu, jest obliczenie CIDR korzystając z kalkulatora takiego jak https://mxtoolbox.com/subnetcalculator.aspx, chociaż wydaje mi się, że pozyskanie puli adresów korzystając z ASN jest dla osób nietechnicznych łatwiejsze.
Tak jak pisałem wyżej, można obserwować przyznawane adresy IP, bo czasem jest to najłatwiejsza droga, np. widzisz, że twój adres zmienia się nieznacznie, powiedzmy tylko 3 ostatnie cyfry, wtedy wyliczanie CIDR dla 262 tysięcy adresów jest bez sensu i wystarczy taki zapis w pliku .htaccess, gdzie gwiazdka oznacza dowolny ciąg liczb. W efekcie, jeśli będzie się adres zmieniał wyłącznie pod względem 3 ostatnich znaków, to serwer zawsze cię dopuści do wp-admin.
Order Allow,Deny
Allow from 77.252.235.*
Deny from all
Dla większych zmian można zapisac tak i do wp-admin zostanie dopuszczony użytkownik, którego adres zaczyna się od 77.252…
Order Allow,Deny
Allow from 77.252.*.*
Deny from all
Są jeszcze inne wygodne ale mniej znane formy zapisu, żeby usprawnić korzysanie z wp-admin przy dynamicznym adresie IP, ale nie bedę ich opisywał, żeby nie utrudniać. Podsumowując ten akapit, to możesz pozyskać potencjalna pulę adresów, „obliczyć” ją w kalkulatorze CIDR lub ewentualnie manipulować symbolem wieloznacznym czyli *. Istnieje tez możwliość manpulacji pojedyńczymi znakami, ale wtedy musisz użyć znaku zapytania i przykłądowy adres powinien wyglądac np. tak 77.252.235.5?? W takim przypadku będa się zmieniać tylko dwie ostatnie cyfry adresu ip, dlatego musisz samodzielnie wybrać, która forma bedzie dla ciebie najlepsza.