Zabezpieczenie serwera PrestaShop: fail2ban, Cloudflare i DDoS

Zabezpieczenie serwera PrestaShop to kilka warstw, które działają razem: aktualny system i PHP, firewall z otwartymi tylko niezbędnymi portami, logowanie SSH wyłącznie kluczem, fail2ban blokujący adresy, które łamią hasła i skanują sklep, limity żądań w nginx oraz Cloudflare przed serwerem — z ochroną przed DDoS, zaporą WAF i filtrem botów. Do tego chroniony panel administracyjny, logi, monitoring i kopie zapasowe. Poniżej wyjaśniamy każdą warstwę po kolei, z przykładami konfiguracji i listą kontrolną na koniec.

Dlaczego serwer sklepu jest celem ataków?

Większość ataków na sklepy internetowe nie jest wymierzona w konkretny sklep. To automaty, które przez całą dobę sprawdzają tysiące adresów: szukają zapomnianych kopii bazy (backup.sql), plików konfiguracyjnych (.env, .git), paneli logowania i modułów ze znanymi podatnościami. Rejestr Friends of Presta regularnie publikuje nowe luki w modułach PrestaShop, a część z nich da się wykorzystać bez logowania. Jak rozpoznać, że sklep został już zaatakowany, opisujemy w artykule Bezpieczeństwo PrestaShop: podatności CVE i objawy ataku.

Serwer jest tu pierwszą linią obrony. Dobrze skonfigurowany odrzuca skanery, zanim dotrą do PHP, ogranicza próby logowania i nie pozwala uruchomić wgranego skryptu. Na naszym serwerze reguła fail2ban dla skanerów w pierwszej godzinie po włączeniu sama zablokowała 8 adresów, które szukały plików .env i paneli WordPressa — w sklepie PrestaShop.

Fundament: system, PHP i firewall

Najlepsza konfiguracja nie pomoże, jeśli serwer działa na oprogramowaniu bez poprawek bezpieczeństwa. Zacznij od podstaw:

ElementCo zrobićDlaczego
Systemwłącz automatyczne aktualizacje bezpieczeństwa (w Ubuntu unattended-upgrades)łatki trafiają na serwer w ciągu doby, bez czekania na administratora
PHPwersja ze wsparciem bezpieczeństwaPHP 8.1 nie dostaje poprawek od końca 2025 r., PHP 8.2 dostaje je tylko do końca 2026 r.
Firewalldomyślnie blokuj ruch przychodzący, otwórz tylko 80, 443 i SSHbaza danych, panele i usługi pomocnicze nie są widoczne z internetu
MySQLnasłuch tylko lokalnie, osobny użytkownik bazy dla sklepuwyciek hasła do bazy nie daje dostępu z zewnątrz
Pliki sklepuosobny użytkownik systemowy, zapis tylko tam, gdzie wymaga PrestaShopskrypt wgrany przez lukę w module nie nadpisze reszty sklepu

Wersja PHP to częsty problem sklepów na PrestaShop 8, który działa najwyżej na PHP 8.1. Przejście na nowsze PHP wymaga aktualizacji sklepu — jak to zrobić bez utraty danych, pokazujemy w poradniku Aktualizacja PrestaShop krok po kroku.

W konfiguracji nginx zablokuj też dostęp do katalogów, które nie powinny być publiczne, i uruchamianie PHP w katalogach na pliki. Oficjalny przykład konfiguracji z dokumentacji PrestaShop odrzuca żądania plików .php w img/ i upload/, pliki ukryte oraz katalogi app, config, classes i vendor. Dzięki temu nawet jeśli ktoś wgra skrypt przez formularz, nie uruchomi go.

Bezpieczne logowanie: SSH i panel PrestaShop

SSH tylko kluczem, bez konta root

Hasło do SSH można zgadnąć, klucza praktycznie nie. W pliku /etc/ssh/sshd_config wyłącz logowanie hasłem i konto root, a dostęp zostaw tylko wybranym użytkownikom:

PasswordAuthentication no
PermitRootLogin no
MaxAuthTries 3
AllowUsers admin sklep

Każdy programista, który pracuje na serwerze, powinien mieć własne konto i własny klucz. Gdy współpraca się kończy, usuwasz jeden klucz, zamiast zmieniać wspólne hasło.

Panel administracyjny PrestaShop

  • Unikalny katalog panelu — instalator PrestaShop nadaje mu losową nazwę. Nie zmieniaj jej na admin i nie publikuj jej w linkach.
  • Osobne konta pracowników w Zaawansowane → Zespół → Pracownicy, bez wspólnych loginów. Konta osób, które już nie pracują przy sklepie, usuwaj od razu.
  • Powiązanie sesji z adresem IP: opcja Sprawdź adres IP cookie w Zaawansowane → Administracja utrudnia przejęcie skradzionego ciasteczka.
  • Dostęp z wybranych adresów: jeśli zespół pracuje ze stałych adresów IP albo przez VPN, ogranicz do nich katalog panelu w nginx. To najskuteczniejsza ochrona przed łamaniem haseł.
  • Drugi składnik logowania: według OWASP uwierzytelnianie wieloskładnikowe to najsilniejsza pojedyncza obrona przed przejęciem konta. Jeśli Twoja wersja sklepu go nie ma, dodaj go modułem albo ogranicz panel adresami IP.

fail2ban: automatyczne blokowanie ataków

fail2ban czyta logi serwera i blokuje w firewallu adresy, które zachowują się jak atakujący: kilka nieudanych logowań, seria żądań do nieistniejących plików, przekroczony limit zapytań. Blokada trwa określony czas, a adres, który wraca, dostaje dłuższą. To prosta i skuteczna ochrona przed łamaniem haseł i skanerami.

Dla serwera ze sklepem PrestaShop przydają się te reguły (jails), dostępne w standardowej instalacji fail2ban:

RegułaCo blokuje
sshdzgadywanie haseł i użytkowników SSH
nginx-http-authłamanie haseł do katalogów chronionych hasłem (np. phpMyAdmin)
nginx-limit-reqadresy, które przekraczają limit żądań ustawiony w nginx
nginx-botsearchskanery szukające paneli i plików, których w sklepie nie ma
recidiveadresy blokowane wielokrotnie — dostają blokadę na wiele dni

Przykładowy fragment pliku /etc/fail2ban/jail.local:

[sshd]
enabled  = true
maxretry = 4
findtime = 10m
bantime  = 1h

[recidive]
enabled  = true
bantime  = 1w

Limit żądań ustawiasz w nginx modułem limit_req. Najważniejsze są adresy, które obciążają serwer albo przyjmują hasła: logowanie klienta, panel, wyszukiwarka. Nginx odpowiada wtedy kodem 429, a fail2ban blokuje adres, który robi to nagminnie.

limit_req_zone $binary_remote_addr zone=login:10m rate=10r/m;

location ~ ^/(pl/logowanie|login)$ {
    limit_req zone=login burst=5 nodelay;
    try_files $uri /index.php?$args;
}

Ważne: za Cloudflare wszystkie żądania przychodzą z adresów Cloudflare. Bez przywrócenia prawdziwego IP klienta w nginx (nagłówek CF-Connecting-IP) fail2ban zablokuje Cloudflare zamiast atakującego, a limity żądań obejmą wszystkich klientów naraz. Blokadę ruchu przechodzącego przez Cloudflare trzeba też przenieść do Cloudflare — fail2ban ma do tego gotowe akcje cloudflare i cloudflare-token.

Cloudflare przed sklepem PrestaShop

Cloudflare działa jak pośrednik między klientami a Twoim serwerem. Gdy rekord DNS sklepu jest „proxied” (pomarańczowa chmurka), odwiedzający widzą adres Cloudflare, a ruch przechodzi przez jego filtry. Co dostajesz już w bezpłatnym planie:

  • Ochronę przed DDoS na warstwach 3, 4 i 7 — według dokumentacji Cloudflare bez limitu wielkości i czasu ataku, na każdym planie.
  • Zaporę WAF z darmowym zestawem reguł zarządzanych (Free Managed Ruleset) i własnymi regułami, np. blokadą krajów, z których nie sprzedajesz, dla panelu administracyjnego.
  • Jedną regułę limitu żądań — warto ją przeznaczyć na logowanie albo wyszukiwarkę.
  • Bot Fight Mode i opcję blokowania botów AI.
  • Cache plików statycznych (obrazy, CSS, JS), który odciąża serwer. Cloudflare domyślnie nie zapisuje stron HTML, i dobrze — koszyk i konto klienta muszą być zawsze aktualne. Nie włączaj „Cache Everything” dla całego sklepu.

Ustaw szyfrowanie Full (strict), żeby połączenie między Cloudflare a serwerem też było szyfrowane i weryfikowane, oraz przywróć w nginx prawdziwe adresy klientów: moduł realip, set_real_ip_from z listą zakresów Cloudflare i real_ip_header CF-Connecting-IP. Bez tego logi, statystyki i blokady pokazują tylko adresy Cloudflare.

Ochrona przed DDoS

Atak DDoS (rozproszona odmowa usługi) to zalanie sklepu ruchem z tysięcy adresów naraz, żeby przestał odpowiadać. Są dwa główne rodzaje:

  • Ataki wolumetryczne (warstwy 3 i 4) — miliony pakietów, które zapychają łącze serwera. Żaden firewall na samym serwerze ich nie zatrzyma, bo łącze jest pełne, zanim pakiety do niego dotrą. Pomaga tylko filtrowanie przed serwerem, np. w Cloudflare.
  • Ataki na aplikację (warstwa 7, HTTP flood) — pozornie zwykłe żądania do kosztownych stron: wyszukiwarki, filtrów, koszyka. Kilkaset na sekundę wystarczy, żeby PHP i baza przestały nadążać. Tu pomagają limity żądań, cache i reguły WAF.

Cloudflare chroni jednak tylko wtedy, gdy atakujący nie zna prawdziwego adresu serwera. Jeśli go zna, wysyła ruch bezpośrednio i omija całą ochronę. Dlatego:

  1. Ukryj adres serwera. Sprawdź wszystkie rekordy DNS: subdomeny typu ftp, mail czy dev bez proxy zdradzają adres. Maile wysyłane z serwera sklepu mają go w nagłówkach — wysyłaj je przez zewnętrzny serwer SMTP.
  2. Zmień adres IP po włączeniu Cloudflare. Stary adres mógł zostać zapisany w historycznych bazach DNS.
  3. Przyjmuj ruch HTTP tylko od Cloudflare. W firewallu otwórz porty 80 i 443 wyłącznie dla zakresów Cloudflare albo włącz Authenticated Origin Pulls, czyli certyfikat, którym Cloudflare potwierdza swoje połączenia.
  4. Odciąż serwer cache. Każdy obrazek i plik CSS podany z Cloudflare to żądanie, które nie trafia do PHP. O cache po stronie sklepu piszemy w poradniku Jak przyspieszyć PrestaShop.
  5. Miej plan na atak. Tryb „I'm Under Attack” w Cloudflare na czas ataku pokazuje każdemu odwiedzającemu krótkie sprawdzenie przeglądarki. Włączasz go jednym przyciskiem.

Wskazówka: limit żądań w nginx i Cloudflare ustaw osobno dla wyszukiwarki i filtrów produktów. To najczęstszy cel ataków HTTP flood na sklepy, bo każde takie zapytanie kosztuje bazę danych znacznie więcej niż zwykła strona.

Boty: dobre, złe i AI

Duża część ruchu w sklepie to boty. Nie wszystkie trzeba blokować:

  • Dobre boty — Googlebot, Bingbot, Google Merchant Center, porównywarki cen. Bez nich sklep znika z wyników i reklam. Uwaga: każdy może podać się za Googlebota. Google zaleca sprawdzanie adresu odwrotnym zapytaniem DNS (nazwa musi kończyć się na googlebot.com, google.com lub googleusercontent.com) i ponownym zapytaniem o ten adres.
  • Złe boty — skanery podatności, boty łamiące hasła, kopiujące ceny i treści, zakładające fałszywe konta. Na nie działają Bot Fight Mode, limity żądań, pułapki na typowe ścieżki skanerów (np. /wp-login.php, /.env) i fail2ban.
  • Boty AI — crawlery zbierające treści dla modeli językowych. Część respektuje robots.txt, ale plik ten jest tylko prośbą, nie blokadą. Jeśli nie chcesz udostępniać treści, włącz w Cloudflare blokowanie botów AI.

Formularze kontaktowe i rejestracji chroń przed spamem testem CAPTCHA, a logowania — limitem prób. Dzięki temu nie musisz blokować całych krajów ani sieci, co mogłoby odciąć prawdziwych klientów.

Logi, monitoring i kopie zapasowe

Zabezpieczenia trzeba widzieć w działaniu. Włącz i przeglądaj:

  • Logi nginx (ruch i błędy) — pokazują skanowanie, nagłe skoki ruchu i błędy 5xx.
  • PHP-FPM slowlog — skrypty, które działają za długo, często pierwszy objaw ataku na wyszukiwarkę albo wadliwego modułu.
  • MySQL slow query log — wolne zapytania do bazy, które przy większym ruchu zatrzymują sklep.
  • Monitoring z zewnątrz — dostępność sklepu co minutę, zasoby serwera, ważność certyfikatu SSL. Alarm ma trafić do osoby, która zareaguje.
  • Kopie zapasowe — codziennie pliki i baza, z kilku dni wstecz, przechowywane także poza samym serwerem. Kopia, której nigdy nie przywrócono, to tylko nadzieja: sprawdź odtworzenie przynajmniej raz.

Jeśli nie wiesz, w jakim stanie jest Twój sklep i serwer, zacznij od audytu bezpieczeństwa sklepu: dostaniesz listę podatności z oceną ryzyka i szacowanym czasem naprawy.

Lista kontrolna zabezpieczenia serwera

ObszarDo sprawdzenia
Aktualizacjeautomatyczne łatki systemu, PHP ze wsparciem, aktualny PrestaShop i moduły
DostępSSH tylko kluczem, bez roota, osobne konta programistów, panel z unikalnym katalogiem
Firewallotwarte tylko 80, 443 i SSH; MySQL niedostępny z zewnątrz
fail2banreguły sshd, nginx-limit-req, nginx-botsearch, recidive
nginxlimity żądań, blokada PHP w img/ i upload/, nagłówki bezpieczeństwa i HSTS
Cloudflareproxy, Full (strict), WAF, Bot Fight Mode, prawdziwe IP klientów w nginx
DDoSukryty adres serwera, ruch HTTP tylko od Cloudflare, plan na tryb „Under Attack”
Kopie i logicodzienne kopie z próbą odtworzenia, slowlog PHP i MySQL, monitoring z alarmem

Nie chcesz zajmować się tym sam? W usłudze Serwer i opieka administracyjna PrestaShop przygotowujemy serwer według tej listy, przenosimy na niego sklep i dbamy o niego na co dzień.

Źródła

Najczęściej zadawane pytania

Czy darmowy plan Cloudflare wystarczy dla sklepu?

Dla większości małych i średnich sklepów tak. Plan Free ma ochronę przed DDoS bez limitu, podstawowy zestaw reguł WAF, jedną regułę limitu żądań i Bot Fight Mode. Płatne plany dają więcej reguł, lepsze wykrywanie botów i wsparcie — przydają się przy dużym ruchu albo częstych atakach.

Czy fail2ban działa za Cloudflare?

Tak, ale wymaga dwóch rzeczy. Nginx musi zapisywać w logach prawdziwy adres klienta z nagłówka CF-Connecting-IP, a blokada musi trafiać do Cloudflare (akcja cloudflare-token), bo ruch przez proxy przychodzi z adresów Cloudflare. Blokada w firewallu serwera nadal działa na SSH i ruch bezpośredni.

Czy zmiana portu SSH zwiększa bezpieczeństwo?

Trochę zmniejsza liczbę automatycznych prób w logach, ale nie chroni przed nikim, kto przeskanuje porty. Prawdziwą ochroną jest logowanie wyłącznie kluczem, brak konta root i fail2ban. Zmiana portu może być dodatkiem, nie zamiennikiem.

Jak sprawdzić, czy to prawdziwy Googlebot?

Wykonaj odwrotne zapytanie DNS dla adresu z logów (np. host 66.249.66.1). Nazwa musi kończyć się na googlebot.com, google.com lub googleusercontent.com, a zapytanie o tę nazwę musi zwrócić ten sam adres. Sama nazwa przeglądarki w logach niczego nie dowodzi, bo łatwo ją podrobić.

Czy na hostingu współdzielonym da się tak zabezpieczyć sklep?

Tylko częściowo. Cloudflare, aktualny PrestaShop, bezpieczne hasła i kopie zapasowe zadziałają wszędzie, ale firewall, fail2ban, konfiguracja nginx i wersje PHP zależą od hostingu. Przy większym sklepie własny serwer VPS daje pełną kontrolę nad zabezpieczeniami i wydajnością.

Chcesz, żeby ktoś zabezpieczył serwer Twojego sklepu i pilnował go na co dzień? Napisz do nas — doradzimy, od czego zacząć.

Produkty z tego wpisu

Wróć do: Blog

Ładowanie...
Powrót do góry