Pomimo, że autorzy WordPressa traktują bezpieczeństwo bardzo poważnie, to tak jak w każdym innym systemie istnieją potencjalne problemy związane z bezpieczeństwem, które mogą się pojawić, jeśli nie zostaną podjęte pewne podstawowe środki bezpieczeństwa. Najczęściej polecanym sposobem na dodatkowe zabezpieczenie jest zainstalowanie odpowiedniego pluginu np. Better WP Security. Niestety nie jest to najlepszy sposób na utwardzenie WordPressa. Prawie na pewno, dzięki instalacji dodatkowych wtyczek zwiększymy możliwość ataku (ewentualne podatności w kodzie dodatkowej wtyczki), oraz dodatkowo spowolnimy działanie witryny.
Podstawową kwestią powinno być dbanie o aktualizacje WordPressa jak i wszystkich zainstalowanych wtyczek. Powinniśmy instalować tylko niezbędne wtyczki ‐ mniej kodu to mniejsze prawdopodobieństwo występowania błędów. Należy się co najmniej dwa razy zastanowić przed instalacją wtyczki która nie jest już rozwijana. Można również wprowadzić dodatkowe modyfikacje – zabezpieczenia – które pozwolą ograniczyć wykorzystanie niektóre ewentualnych podatności. Postaram się tutaj opisać możliwe sposoby na dodatkowe utwardzenie naszej witryny.
Zmiana prefiksu tabel WordPressa w bazie danych
Jeśli nazwy tabel w bazie danych zaczynają się od domyślnego prefiksu wp_
to należy zmienić je tak, aby zaczynały się od innego losowego ciągu znaków. Modyfikacja ta utrudni ataki SQL Injection. Zmiana nazw tabel nie stanowi żadnej trudności i sprowadza się do wykonania odpowiednich zapytań SQL:
RENAME TABLE `wp_commentmeta` TO `nowy_prefix_commentmeta`; RENAME TABLE `wp_comments` TO `nowy_prefix_comments`; RENAME TABLE `wp_links` TO `nowy_prefix_links`; RENAME TABLE `wp_options` TO `nowy_prefix_options`; RENAME TABLE `wp_postmeta` TO `nowy_prefix_postmeta`; RENAME TABLE `wp_posts` TO `nowy_prefix_posts`; RENAME TABLE `wp_terms` TO `nowy_prefix_terms`; RENAME TABLE `wp_term_relationships` TO `nowy_prefix_term_relationships`; RENAME TABLE `wp_term_taxonomy` TO `nowy_prefix_term_taxonomy`; RENAME TABLE `wp_usermeta` TO `nowy_prefix_usermeta`; RENAME TABLE `wp_users` TO `nowy_prefix_users`;
Poza tym w pliku wp-config.php
należy zmienić wartość jaka jest przypisywana zmiennej $table_prefix
na nowy prefiks:
$table_prefix = 'nowy_prefix_';
Sama modyfikacja nazw jest jednak niewystarczająca, po niej WordPress nie będzie działał prawidłowo, pojawi się problem z dostępem do panelu administracyjnego. Wyświetlany będzie komunikat błędu: Nie posiadasz wystarczających uprawnień, by wejść na tę stronę
, ewentualnie: You do not have sufficient permissions to access this page
.
W celu usunięcia tego problemu należy dokonać aktualizacji prefiksu na nowy również w zawartości tabel dotyczących użytkownika:
UPDATE nowy_prefix_usermeta SET meta_key = REPLACE( meta_key , 'wp_', 'nowy_prefix_' ); UPDATE nowy_prefix_options SET option_name = 'nowy_prefix_user_roles' WHERE option_name = 'wp_user_roles';
Zmiana ID użytkownika z 1 na inna wartość
Jeśli w tabeli prefix_users
jakiś z użytkowników ma przypisane ID równe 1 lub inną początkowa wartość warto dokonać zmiany tego ID na jakąś losowa liczbę. W tym celu należy wykonać poniższe zapytania SQL:
UPDATE prefix_users SET ID = 777 WHERE ID = 1; UPDATE prefix_usermeta SET user_id = 777 WHERE user_id = 1;
Zamiast 777
wstawiamy losowa liczbę.
Obniżenie uprawnień użytkownika
Do czynności związanych z publikacją treści nie jest wymagane posiadania konta z uprawnieniami administracyjnymi. Wykorzystywanie uprawnień większych niż potrzebne jest elementem obniżającym bezpieczeństwo. Jeśli więc do edycji treści używamy konta administracyjnego należy rozważyć obniżenie jego uprawnień do poziomu redaktor
a i stworzenie dodatkowego konta używanego tylko do administracji WordPressem. Wszystkie te czynności można wykonać w panelu administracyjnym.
Ograniczenie dostępu do panelu administracyjnego
Często witryny postawione na WordPressie są celem ataków polegających na zgadywaniu haseł. Oprócz zachowania tak elementarnych zasad jak używanie trudnych do złamania haseł, nieużywanie popularnych loginów (admin, Admin, administrator, test, root) warto dodatkowo ograniczyć dostęp do panelu administracyjnego do wybranych adresów IP lub wymagać podania dodatkowego loginu i hasła.
W tym celu pliku .htaccess
znajdującym się w głównym katalogu witryny należy dopisać:
<Files wp-login.php> AuthType Basic AuthUserFile /sciezka/do/pliku/.htpasswd AuthName "Strefa zabroniona" Satisfy Any <Limit GET POST> Order Deny,Allow Deny from all Allow from 123.123.123.123 Require valid-user </Limit> </Files>
Wpis ten można powielić także w pliku wp-admin/.htaccess
ograniczając przez to dostęp do wszystkich plików w katalogu wp-admin
. Zamiast pojedynczego adresu IP można zdefiniować zakres adresów, da się też podać wiele adresów/zakresów powielając linię Allow from ...
.
Plik z danymi autoryzacyjnymi (.htpasswd
) można stworzyć programem htpasswd:
htpasswd -c .htpasswd nazwa_uzytkownika
lub w ostateczności za pomocą jakiejś ze stron www umożliwiających wygenerowanie takiego pliku.
Zabezpieczenie katalogów „systemowych” przed indeksowaniem
Pliki w katalogach „systemowych” WordPressa (/wp-admin
, /wp-includes
, /wp-content/plugins
, /wp-content/themes
, …) nie powinny być indeksowane przez roboty wyszukiwarek internetowych i tak zwykle jest. Czasami może się zdarzyć, że robot sieciowy trafi do któregoś z tych katalogów i pliki pojawią się w indeksie wyszukiwarki. Da się jednak przed tym zabezpieczyć. Cel ten możemy osiągnąć w dwojaki sposób:
- W każdym z powyższych katalogów w pliku
.htaccess
umieścić:Header set X-Robots-Tag "noindex, nofollow"
- W pliku
robots.txt
poUser-agent: *
dopisać:Disallow: /wp-admin/ Disallow: /wp-includes/ Disallow: /wp-content/plugins Disallow: /wp-content/themes
Każdy z tych sposobów ma swoje wady i zalety. Wpisując blokowane katalogi w pliku robots.txt
ujawniamy ich istnienie – można pobrać ten plik i zobaczyć jego zawartość. Z drugiej strony ten kto wie, że dana witryna działa w oparciu o WordPressa (nie trudno to sprawdzić) wie również o istnieniu tych katalogów. Sposób ten nie ma żadnego wpływu na wydajności witryny. Korzystając z drugiego sposobu nie ujawniamy blokowanych katalogów, jednak minimalnie wydłuża on czas dostępu do wszystkich treści w tych katalogach. Serwer www uzyskując dostęp do pliku położonego w danym katalogu musi dodatkowo odczytać i przetworzyć pliki .htaccess
znajdujące się w katalogu z plikiem jak i we wszystkich nadrzędnych katalogach.
Wyłączenie edycji plików PHP w panelu
Za pomocą panelu administracyjnego WordPressa istnieje możliwość ręcznej edycji plików PHP, jednak opcja ta jest zbędna i wnosi dodatkowe ryzyko. Można więc ją wyłączyć. W tym celu w pliku wp-config.php
należy dopisać
define('DISALLOW_FILE_EDIT', true);