Platforma

Zapora WAF, ochrona botów i statyczny IP

WAF z regułami OWASP CRS (Coraza), reguły własne, ochrona logowania przed botami i dedykowany statyczny adres IP ruchu wychodzącego.

Bezpieczeństwo → WAF włącza przed bramką API projektu zaporę aplikacyjną opartą o Coraza i zestaw reguł OWASP Core Rule Set (Apache-2.0). Ruch REST, Auth, GraphQL, Functions i Realtime jest sprawdzany pod kątem SQL injection, XSS, path traversal, RCE i skanerów, zanim dotrze do bazy.

Tryby i poziom paranoi

TrybDziałanie
offReguły CRS wyłączone (reguły własne i ochrona botów mogą działać nadal)
detectTylko loguje zdarzenia — żądanie przechodzi. Zacznij tutaj, żeby wychwycić fałszywe alarmy
blockŻądanie przekraczające próg anomalii dostaje HTTP 403 (WAF_BLOCKED)

Poziom paranoi 1-4 (domyślnie 1) zwiększa liczbę reguł i ryzyko fałszywych alarmów. Próg anomalii (domyślnie 5) to suma punktów reguł, po której żądanie jest blokowane. Treść żądania jest analizowana do limitu 128 KB; ruch Storage (/storage/v1/) pomija analizę treści, żeby nie spowalniać wgrywania plików.

Wyjątki reguł

Gdy reguła daje fałszywy alarm (np. pole z tekstem zawierającym fragmenty SQL), dodaj wyjątek: prefiks ścieżki + id reguł CRS (900000-999999), np. /rest/v1/todos → 942350. Id reguły znajdziesz w zdarzeniach WAF.

Reguły własne

  • lista dozwolonych adresów IP/CIDR (omijają całą zaporę) i zablokowanych IP/CIDR,
  • blokada lub lista dozwolonych krajów (kod ISO-2) — geolokalizacja: IP Geolocation by DB-IP (DB-IP Lite, licencja CC-BY 4.0),
  • blokada User-Agent (podciąg lub /regex/), pustego UA i znanych skanerów (sqlmap, nikto, nmap…),
  • maksymalny rozmiar żądania (HTTP 413).

Zdarzenia i wykresy

Zakładka zdarzeń pokazuje id reguły, opis, zredagowane dopasowane dane (adresy e-mail, długie tokeny i numery są maskowane, nagłówki Authorization/Cookie nigdy nie są zapisywane), adres IP, kraj, ścieżkę i akcję (zablokowane / wykryte / limit / ban). Wykresy pokazują liczbę żądań, zablokowanych, wykrytych, limitów i banów oraz najczęstsze reguły, adresy IP i ścieżki. Przy nagłym wzroście ataków wysyłamy powiadomienie „Wykryto atak na API projektu”.

Ochrona botów (logowanie)

Dla /auth/v1/token, /otp, /verify i /recover działa adaptacyjny limit na adres IP (domyślnie 30/min na logowanie i 10/min na OTP) — im więcej nieudanych prób z danego IP, tym mniejszy budżet. Po N nieudanych próbach (domyślnie 10 w 10 minut) adres dostaje automatyczny ban na endpointy Auth (domyślnie 15 min; powtórni sprawcy dostają podwójnie dłuższy, maks. 24 h). Ban zdejmiesz przyciskiem Odblokuj w panelu, przez API, CLI lub MCP; możesz też zbanować adres ręcznie (ban ręczny blokuje całe API).

CAPTCHA: klucze Cloudflare Turnstile / hCaptcha ustawiasz w Auth → Ochrona przed atakami (GOTRUE_SECURITY_CAPTCHA_*); panel WAF pokazuje, czy jest włączona. Wymusza token captcha przy logowaniu i rejestracji.

Statyczny adres IP ruchu wychodzącego

Domyślnie ruch wychodzący Twoich Edge Functions, pg_net w bazie i Workerów wychodzi ze wspólnego adresu serwera. Włączenie Bezpieczeństwo → Statyczny IP przypina go do dedykowanego publicznego adresu, który możesz dodać do allowlist partnerów. Adres widać w panelu. Test z workera:

curl -s https://ifconfig.me/ip   # zwraca adres widoczny w panelu

Dotyczy komponentów uruchomionych na serwerze bazodanowym projektu (nie na dedykowanym serwerze workerów).

Cennik

  • Zapora OWASP CRS (tryb detect lub block): 39 zł netto / mies. za projekt, plan Pro lub wyższy.
  • Statyczny adres IP: 15 zł netto / mies. za projekt (plan Pro+), naliczane godzinowo.
  • Ochrona botów, reguły IP/kraj/User-Agent i limity rozmiaru są w cenie każdego planu.

Ograniczenia

  • Za zaporą nie znajdują się trasy /workers/v1/… ani Sites.
  • Awaria serwera WAF nie wyłącza API: ruch automatycznie wraca bezpośrednio do bramki projektu (fail-open).
  • Odpowiedzi nie są analizowane — WAF chroni ruch przychodzący.

API, MCP i CLI

curl -X PUT https://host.ulewicz.space/api/v1/projects/<ref>/security/waf \
  -H "Authorization: Bearer $HOSTBASE_TOKEN" -H "Content-Type: application/json" \
  -d '{"mode":"block","paranoia":1,"bot":{"enabled":true},"rules":{"block_countries":["RU"]}}'

GET    /api/v1/projects/<ref>/security/waf/events?limit=100&kind=crs
GET    /api/v1/projects/<ref>/security/waf/stats?hours=24
GET|POST /api/v1/projects/<ref>/security/waf/bans      DELETE .../bans/<ip>
GET|PUT  /api/v1/projects/<ref>/security/egress        { "enabled": true }

MCP: get_waf, set_waf, list_waf_events, get_waf_stats, list_waf_bans, ban_ip, unban_ip, get_static_egress, set_static_egress.

hostbase waf set --mode detect --bot on
hostbase waf set --mode block --paranoia 2 --exclude /rest/v1/todos=942350 --block-country RU
hostbase waf events --kind crs --limit 50
hostbase waf bans list
hostbase waf bans unban 203.0.113.7
hostbase egress enable