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
| Tryb | Działanie |
|---|---|
off | Reguły CRS wyłączone (reguły własne i ochrona botów mogą działać nadal) |
detect | Tylko 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