Trwa atak? Skontaktuj się z zespołem reagowania na incydenty

info@angelforce.eu
WordPress

Praktyczna lista kontrolna bezpieczeństwa WordPressa

Dwanaście kroków zabezpieczania WordPressa w rozsądnej kolejności: od aktualizacji i porzuconych wtyczek po 2FA, XML-RPC, kopie zapasowe, integralność plików i WAF.

Także w językach:EnglishTürkçeDeutschFrançaisEspañolItalianoNederlandsEesti

Ilustracja: Praktyczna lista kontrolna bezpieczeństwa WordPressa

Strona na WordPressie jest tak silna, jak jej najsłabsza wtyczka, konto lub kopia zapasowa. Rdzeń WordPressa regularnie otrzymuje wydania bezpieczeństwa; to, co Państwo do niego dodają i jak go utrzymują, zależy od Państwa. Ta lista kontrolna obejmuje najważniejsze zabezpieczenia, mniej więcej w kolejności, w jakiej sami byśmy je wdrażali.

1. Aktualizować rdzeń, wtyczki i motywy

Automatyczne aktualizacje rdzenia w tle istnieją od WordPressa 3.7 i domyślnie obejmują wydania poboczne (minor). Od WordPressa 5.5 można też włączyć automatyczne aktualizacje dla poszczególnych wtyczek i motywów z poziomu panelu administracyjnego.

  • Włączyć automatyczne aktualizacje wtyczek od renomowanych twórców, a pozostałe przeglądać co tydzień.
  • Automatyczne aktualizacje zależą od WP-Cron. Warto sprawdzać błędy w Narzędzia > Zdrowie witryny (Tools > Site Health), ponieważ niedziałający cron oznacza, że aktualizacje po cichu przestają się wykonywać.
  • Zanim zacznie się polegać na automatycznych aktualizacjach, należy upewnić się, że da się je wycofać. Zaleca to również dokumentacja WordPressa.

2. Usunąć porzucone i nieużywane wtyczki

Przewodnik WordPressa dotyczący zabezpieczania (hardening) mówi wprost: wtyczki należy aktualizować, a nieużywane usuwać. Dezaktywacja nie wystarcza, ponieważ kod pozostaje na serwerze.

Katalog wtyczek WordPress.org daje dwa sygnały ostrzegawcze:

  • Żółty komunikat informujący, że wtyczka „nie została przetestowana z 3 ostatnimi głównymi wydaniami WordPressa”.
  • Czerwony komunikat informujący, że wtyczka została zamknięta i nie jest już dostępna do pobrania. Po 60 dniach wyświetlany jest powód, a jednym z wymienionych powodów jest „problem z bezpieczeństwem”.

Zamknięta wtyczka nie będzie otrzymywać aktualizacji przez WordPress.org. Należy ją zastąpić. Nigdy nie należy instalować „nulled”, czyli nielegalnie odblokowanych kopii wtyczek premium, a wtyczki instalować wyłącznie z WordPress.org lub od zaufanych dostawców.

3. Przejrzeć konta administratorów

Należy sporządzić listę wszystkich kont z rolą Administrator i usunąć te, których istnienia nikt nie potrafi wyjaśnić. Za pomocą WP-CLI:

wp user list --role=administrator --fields=ID,user_login,user_email,user_registered

Każda osoba powinna mieć własne imienne konto, nigdy wspólny login admin. Należy przydzielać najniższą rolę, która wystarcza do pracy: większość redaktorów treści nie potrzebuje roli Administrator. Trzeba wymagać silnych, unikalnych haseł, najlepiej przechowywanych w menedżerze haseł.

4. Włączyć uwierzytelnianie dwuskładnikowe

2FA należy włączyć dla każdego administratora. Rdzeń WordPressa nie zawiera 2FA, więc potrzebna jest wtyczka lub dostawca jednokrotnego logowania, który je wymusza. Jeśli wtyczka to obsługuje, warto wybierać metody takie jak klucze bezpieczeństwa lub klucze dostępu (passkeys), a kody odzyskiwania przechowywać w bezpiecznym miejscu.

5. Ograniczyć próby logowania i zdecydować o XML-RPC

Dokumentacja WordPressa wskazuje wp-login.php i xmlrpc.php jako częste cele ataków siłowych (brute force). Zaleca ograniczanie liczby prób logowania na brzegu sieci (WAF lub CDN) albo na serwerze WWW. Wtyczka bezpieczeństwa również może spowalniać logowania, ale działa w PHP, więc rozwiązanie na poziomie serwera lepiej radzi sobie przy dużym ruchu.

Jeśli XML-RPC nie jest używany, należy go wyłączyć. Niektóre aplikacje mobilne i usługi, takie jak Jetpack, go potrzebują, więc najpierw warto to sprawdzić. Filtr xmlrpc_enabled wyłącza tylko metody wymagające uwierzytelnienia. Pingbacki i inne metody bez uwierzytelniania nadal działają. Aby całkowicie wyłączyć XML-RPC, należy zablokować plik na serwerze WWW. Dla nginx:

location = /xmlrpc.php {
    deny all;
}

6. Wyłączyć wbudowany edytor plików

Edytor motywów i wtyczek w kokpicie pozwala każdemu, kto ma sesję administratora, zmieniać kod PHP. Należy go wyłączyć w wp-config.php:

define( 'DISALLOW_FILE_EDIT', true );

Według dokumentacji wp-config.php DISALLOW_FILE_MODS idzie dalej i blokuje również instalowanie i aktualizowanie wtyczek oraz motywów z kokpitu. Należy go używać tylko wtedy, gdy zmiany wdraża się w inny sposób, np. przez Git lub WP-CLI.

7. Przechowywać kopie zapasowe poza serwerem i poza katalogiem głównym strony

Przewodnik dotyczący zabezpieczania zaleca regularne kopie zapasowe zarówno plików, jak i bazy danych, kilka migawek i zaufane miejsce przechowywania. Ich integralność należy chronić szyfrowaniem, zapisanymi skrótami lub nośnikami tylko do odczytu.

Wynikają z tego dwie praktyczne zasady. Kopię zapasową w katalogu głównym strony, np. plik zip w wp-content, może pobrać każdy, kto odgadnie jej nazwę. Kopię na tym samym serwerze może usunąć ten sam atakujący. Co najmniej jedną kopię należy przechowywać w miejscu niedostępnym dla danych logowania strony i przetestować pełne przywracanie.

8. Sprawdzać integralność plików

WP-CLI potrafi porównać pliki z oficjalnymi sumami kontrolnymi WordPress.org bez ładowania WordPressa:

wp core verify-checksums --include-root
wp plugin verify-checksums --all

Pierwsze polecenie wskazuje zmodyfikowane pliki rdzenia, a --include-root ostrzega o nieoczekiwanych plikach w katalogu głównym. Drugie porównuje wtyczki z sumami kontrolnymi WordPress.org, więc pomaga tylko w przypadku wtyczek tam hostowanych. Warto też szukać plików PHP w wp-content/uploads, gdzie normalnie powinny znajdować się wyłącznie pliki multimedialne.

9. Używać użytkownika bazy danych z minimalnymi uprawnieniami

Każda strona powinna mieć własną bazę danych i własnego użytkownika bazy danych z uprawnieniami wyłącznie do tej bazy. Nigdy nie należy łączyć się jako użytkownik root bazy danych.

Przewodnik dotyczący zabezpieczania zauważa, że do codziennej pracy wystarczą SELECT, INSERT, UPDATE i DELETE. Nie zaleca jednak odbierania DROP, ALTER i GRANT, ponieważ wtyczki i duże aktualizacje mogą wymagać zmiany schematu. Jeśli mimo to zostaną odebrane, trzeba mieć przetestowane kopie zapasowe.

10. Ustawić uprawnienia plików

Punktem wyjścia według przewodnika jest 755 dla katalogów i 644 dla plików. Pliki rdzenia, wp-admin i wp-includes powinny być zapisywalne tylko przez Państwa konto użytkownika, a nie przez serwer WWW. Wyjątkiem jest wp-content: serwer WWW musi mieć tam prawo zapisu na potrzeby przesyłanych plików. Dla wp-config.php przewodnik sugeruje 400 lub 440.

find /var/www/example -type d -exec chmod 755 {} \;
find /var/www/example -type f -exec chmod 644 {} \;
chmod 440 /var/www/example/wp-config.php

Przed uruchomieniem tych poleceń należy dostosować ścieżki i właściciela plików do konfiguracji hostingu.

11. Wysyłać nagłówki bezpieczeństwa

Nagłówki takie jak Strict-Transport-Security, Content-Security-Policy, X-Content-Type-Options i Referrer-Policy dodają ochronę po stronie przeglądarki. W miarę możliwości warto ustawiać je na serwerze WWW lub w CDN, a nie przez wtyczkę. Najlepiej zacząć od polityki Content Security Policy w trybie report-only, ponieważ motywy i kreatory stron mogą korzystać ze skryptów inline.

12. Postawić przed stroną WAF

Dokumentacja WordPressa opisuje trzy poziomy: wtyczki bezpieczeństwa filtrujące żądania wewnątrz WordPressa, zaporę na poziomie serwera, taką jak ModSecurity, oraz usługi reverse proxy, które filtrują ruch, zanim dotrze on do serwera. Im dalej od aplikacji odbywa się filtrowanie, tym mniejsze obciążenie trafia do PHP. WAF nie zastępuje aktualizacji. Daje czas między ujawnieniem podatności a wdrożeniem poprawki.

Wersja skrócona

ObszarMinimum
AktualizacjeAutomatyczne aktualizacje poboczne rdzenia włączone, wtyczki przeglądane co tydzień
WtyczkiBrak zainstalowanych wtyczek zamkniętych, porzuconych lub nieużywanych
KontaKonta imienne, niewielu administratorów, 2FA dla nich wszystkich
LogowanieOgraniczanie prób na serwerze lub na brzegu sieci, XML-RPC zablokowany, jeśli nieużywany
Zmiany koduUstawione DISALLOW_FILE_EDIT
Kopie zapasowePoza serwerem, poza katalogiem głównym strony, przywracanie przetestowane
IntegralnośćSumy kontrolne zweryfikowane, brak plików PHP w katalogu uploads
Baza danychJeden użytkownik na stronę, z uprawnieniami tylko do własnej bazy
PrzeglądarkaHSTS i przetestowana CSP
Brzeg sieciWAF lub reverse proxy przed stroną

Od czego zacząć

Warto zacząć od pierwszych czterech punktów. Zajmują niewiele czasu i nie wymagają zmian w hostingu. Następnie warto sprawdzić obecne nagłówki naszym skanerem nagłówków bezpieczeństwa.

Jeśli chcą Państwo, aby ktoś sprawdził to za Państwa, SecAudit skanuje WordPressa w poszukiwaniu złośliwego oprogramowania i web shelli, weryfikuje integralność plików względem oficjalnych sum kontrolnych i przypisuje zainstalowane wtyczki do znanych podatności.

Jak możemy pomóc

SecAudit

Nasz własny produkt. SecAudit skanuje strony na WordPressie w poszukiwaniu złośliwego oprogramowania, podatnego kodu, zmienionych plików i znanych podatności, a wyniki przedstawia w raportach odniesionych do OWASP, RODO i NIS2.

Skaner nagłówków bezpieczeństwa

Ocena nagłówków bezpieczeństwa HTTP, plików cookie i certyfikatu TLS strony, z poprawką dla każdego wyniku.

Napisz do nas
Zespół AngelForce

Artykuł przygotował zespół AngelForce: konsultanci ds. bezpieczeństwa z certyfikatami CEH, LPT Master i CISA, którzy testują, monitorują i chronią systemy organizacji w całej Europie i w Turcji.

Tekst przygotowany z pomocą AI na podstawie publicznych źródeł wymienionych poniżej i sprawdzony przed publikacją przez zespół AngelForce.

Źródła

  1. developer.wordpress.org/advanced-administration/security/hardening/
  2. developer.wordpress.org/advanced-administration/security/brute-force/
  3. developer.wordpress.org/plugins/wordpress-org/alerts-and-warnings/
  4. developer.wordpress.org/reference/hooks/xmlrpc_enabled/
  5. developer.wordpress.org/cli/commands/core/verify-checksums/
  6. wordpress.org/documentation/article/plugins-themes-auto-updates/

Artykuły w temacie: WordPress

Prosimy napisać, co chcą Państwo chronić

Prosimy opisać swoje środowisko i cele. Odpowiemy e-mailem.

Napisz do nas
info@angelforce.eu

AngelForce OÜ · Tallinn, Estonia