Dodatkowe zabezpieczenie / utwardzenie WordPressa

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 redaktora 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:

  1. W każdym z powyższych katalogów w pliku .htaccess umieścić:
    Header set X-Robots-Tag "noindex, nofollow"
  2. W pliku robots.txt po User-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);

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

To prevent spam, URLs are not allowed in comments. All comments are moderated and subject to approval.
Aby zapobiec spamowi, adresy URL nie są dozwolone w komentarzach. Wszystkie komentarze są moderowane i podlegają zatwierdzeniu.