22. modulBiztonság a gyakorlatban: DDoS, WAF, botok, Turnstile
Cloudflare for Devs · 22. modul

Biztonság a gyakorlatban: DDoS, WAF, botok, Turnstile

A 9. modul rétegábrája megmutatta, mi fut a kérésed előtt. Itt a gyakorlat következik: mit állíts be induláskor, mit csinálj támadás alatt, hogyan írsz saját WAF-szabályt, és hogyan teszed be a Turnstile-t a Nuxt-űrlapjaidba.

22.1DDoS: mit kell tenned? (Kevesebbet, mint gondolnád)

A hálózati és alkalmazásrétegű DDoS-védelem alapból aktív minden proxyzott zónán, konfiguráció és külön díj nélkül. Ez nem marketingmondat: a legtöbb támadás úgy zajlik le, hogy észre sem veszed — legfeljebb utólag látod a grafikonon. Amit érdemes tudnod:

HelyzetMit csinálj
Normál üzemsemmit — a managed DDoS-szabályok futnak. Legfeljebb nézd meg havonta a Security Analytics-et, hogy lásd a mintát.
Gyanús forgalmi csúcsSecurity Events: honnan jön (ország, ASN, IP), milyen útvonalra, milyen user agenttel? Ebből születik a célzott szabály.
Aktív, zavaró támadáscélzott custom rule (blokk vagy managed challenge) a támadás mintájára — ez a pontos eszköz.
Nagy baj, nincs idő elemezni„I'm Under Attack" mód: minden látogató kap egy rövid ellenőrző oldalt. Durva eszköz (rontja a UX-et, töri az API-hívásokat), átmenetileg használd, és csak a weboldalon — az API-alútvonalakat vedd ki alóla Configuration Rule-lal.
Amit az AWS-ről hozol, és itt elmarad: nincs Shield Advanced-előfizetés, nincs „skálázzuk fel az ALB-t, mert támadnak", és nincs az a rémálom, hogy a támadás költséget generál az autoscaling miatt. A blokkolt kérés nem éri el a Workered, tehát nem is számláz (9. modul) — ez a modell egyik legkellemesebb tulajdonsága.

22.2WAF: mit kapcsolj be induláskor?

Sorrendben, az első naptól:

  1. Managed Rules — a Cloudflare kezelt szabálykészlete (OWASP-jellegű támadási minták: SQL-injection, XSS, ismert CVE-k). Kapcsold be, majd figyeld pár napig log-módban, mielőtt blokkolásra állítod: a saját appod is generálhat olyan kérést, ami mintára illik (különösen JSON-testű API-knál).
  2. Rate limiting rules a kritikus végpontokra — a 9. modulban láttad a login-példát. Amit érdemes védeni: /api/auth/*, jelszó-visszaállítás, regisztráció, keresés, export.
  3. Bot Fight Mode (vagy a magasabb csomagokban Super Bot Fight Mode) — az egyszerű, automatizált forgalom kiszűrésére.
  4. Custom rules a saját üzleti szabályaidra — lásd lent.

Saját szabályok, amiket egy SaaS-nak érdemes felvennie

CélFeltétel (kifejezés-nyelven, vázlatosan)Akció
Admin-felület védelmehttp.request.uri.path contains "/admin" és nem a te IP-tartományodblokk (vagy még jobb: Cloudflare Access, 9. modul)
Régi API-verzió kivezetésehttp.request.uri.path contains "/api/v1/"blokk vagy átirányítás
Nem várt HTTP-metódushttp.request.method in {"TRACE" "TRACK"}blokk
Ország-korlátozás (ha az üzlet indokolja)ip.geoip.country not in {"HU" "DE" "AT"} és /api/managed challenge
Scraper-mintagyanús user agent + magas kérésszámmanaged challenge
Webhook-végpont zárása/webhooks/stripe és nem a Stripe ASN/IP-tartományablokk (az aláírás-ellenőrzés mellé, 19. modul)
Két hiba, amit sokan elkövetnek:azonnal blokkolásra állítani a managed rules-t, és aztán csodálkozni, hogy a saját integrációs partnereid 403-at kapnak — mindig log-módban kezdj; ② a WAF-ot használni jogosultság-kezelésre. Az IP-alapú admin-védelem jobb a semminél, de nem helyettesíti a rendes autentikációt (17. modul) — az IP hamisítható-változik, és a belső támadó ellen semmit nem ér.

22.3Security Events — a hibakeresés helye

Amikor egy felhasználó azt írja, hogy „nem tudok belépni" vagy „503-at kapok", és a Workers-logokban semmi nincs (9. modul), akkor a kérés valószínűleg el sem jutott a kódodig. A Security Events (Security Analytics) mutatja meg:

Innen két irány van: ha valós támadás, finomítod a szabályt; ha false positive (a saját forgalmad akadt fenn), akkor kivételt veszel fel — például egy skip szabállyal az adott útvonalra és a konkrét managed rule ID-ra. Ez a napi biztonsági rutin nagy része.

22.4Turnstile: CAPTCHA a felhasználó zaklatása nélkül

A Turnstile a reCAPTCHA-alternatíva: a legtöbb valódi felhasználónak semmit nem kell megoldania (nincs tűzoltócsap-kattintgatás), a védelem a böngésző-jelekből és viselkedésből dolgozik. Ingyenes, és nem a Google-nek adja az adataidat — ami EU-s ügyfeleknél önmagában érv.

Kliensoldal (Nuxt)

components/TurnstileWidget.vue (vázlat)
<template>
  <div ref="el"></div>
</template>

<script setup>
const el = ref();
const emit = defineEmits(["verified"]);

onMounted(() => {
  // a Turnstile script betöltése után:
  window.turnstile.render(el.value, {
    sitekey: useRuntimeConfig().public.turnstileSiteKey,
    callback: (token) => emit("verified", token),   // ezt küldjük a szervernek
  });
});
</script>

Szerveroldali validáció — ez a lényegi rész

A kliensről érkező token önmagában semmit nem jelent: a szervernek kell ellenőriznie a Cloudflare-nél. Enélkül a widget csak díszlet, amit egy szkript megkerül.

server/utils/turnstile.ts
export async function verifyTurnstile(env, token: string, ip?: string) {
  const form = new FormData();
  form.append("secret", env.TURNSTILE_SECRET_KEY);   // secret! (12. modul)
  form.append("response", token);
  if (ip) form.append("remoteip", ip);

  const res = await fetch(
    "https://challenges.cloudflare.com/turnstile/v0/siteverify",
    { method: "POST", body: form }
  );
  const data = await res.json();
  return data.success === true;
}
server/api/auth/register.post.ts — használat
export default defineEventHandler(async (event) => {
  const { env, cf } = event.context.cloudflare;
  const body = await readBody(event);

  const ip = getHeader(event, "cf-connecting-ip");
  if (!(await verifyTurnstile(env, body.turnstileToken, ip))) {
    throw createError({ statusCode: 400, message: "Ellenőrzés sikertelen" });
  }

  // … innentől a rendes regisztrációs logika (17. modul)
});
Hová tedd a Turnstile-t? Regisztráció, jelszó-visszaállítás, kapcsolatfelvételi űrlap, „hívjatok vissza" jellegű lead-űrlapok, és minden olyan végpont, ami emailt küld vagy erőforrást foglal anonim felhasználó kérésére. Ahová ne: a bejelentkezésre általában nem érdemes (rontja a UX-et minden belépésnél) — ott a rate limiting a jobb eszköz, és csak gyanús mintánál (sok hibás próbálkozás) kérj kihívást. A token egyszer használatos és rövid életű: ha a felhasználó sokáig tölti ki az űrlapot, kérj újat.

22.5A védelmi rétegek együtt — mikor melyik?

FenyegetésElsődleges védelemKiegészítés
Volumetrikus DDoSautomatikus DDoS-védelemUnder Attack mód végszükségben
Brute force (login)rate limiting rule (zóna)fiókonkénti számláló DO-val (7. modul), lockout
Scrapingbot-védelem + rate limitTurnstile a belépési pontokon
Bot-regisztráció, spamTurnstileemail-megerősítés, domain-szűrés
Ismert támadási minták (SQLi, XSS)WAF managed rulesparaméterezett lekérdezések a kódban (5. modul!)
Üzleti kvóta-túllépésDO-limiter (7. modul)AI-nál spend limit (15b. modul)
Belső eszközökCloudflare AccessTunnel (21. modul), nem publikus origin
Adatszivárgás tenantok közta kódod (17., 18. modul)ezt semmilyen WAF nem védi ki
A legfontosabb mondat a modulban: az utolsó sor. A platform-védelem a külső támadót fogja meg — a tenant-izolációt, a jogosultság-ellenőrzést és a cache-kulcsokat te írod meg, és ott a WAF nem segít. A biztonsági munkád nagyobbik fele továbbra is a kódodban van; a platform azt veszi le a válladról, ami nem az üzleti logikád (14. modul zárógondolatához hasonlóan: ne várd, hogy egy termék megoldja azt, ami tervezési kérdés).

22.6Ellenőrizd magad

  1. Mit kell beállítanod a DDoS-védelemhez, és mikor avatkozz be kézzel?
    Válasz

    Alapból semmit — a managed DDoS-szabályok minden proxyzott zónán futnak. Kézi beavatkozás akkor kell, ha zavaró, célzott támadás megy: a Security Eventsből azonosított minta alapján custom rule; végszükségben Under Attack mód, de csak átmenetileg és az API-útvonalak kivételével.

  2. Miért kezdj log-módban a managed WAF-szabályokkal?
    Válasz

    Mert a saját forgalmad is illeszkedhet a mintákra (JSON-testű API-k, szokatlan paraméterek), és azonnali blokkolás mellett a partnereid vagy a saját integrációid kapnak 403-at. Néhány nap log-mód után látod a false positive-okat, és skip-szabállyal kezeled őket.

  3. A felhasználó hibát jelez, de a Workers-logokban semmi. Hol nézed meg, mi történt?
    Válasz

    Security Events: ott látszik, melyik szabály (managed, custom, rate limit) milyen akcióval fogta meg a kérést, és milyen jellemzőkkel (IP, ország, ASN, user agent, path). A blokkolt kérés el sem éri a Workert, ezért nincs a log-jaidban.

  4. Elég a Turnstile widget beillesztése az űrlapba?
    Válasz

    Nem — a widget csak tokent ad. A szervernek ellenőriznie kell a tokent a siteverify végponton a titkos kulccsal (és érdemes átadni a cf-connecting-ip-t). Szerveroldali validáció nélkül a widget megkerülhető.

  5. Melyik fenyegetés ellen NEM véd a platform biztonsági rétege?
    Válasz

    A tenantok közti adatszivárgás ellen: azt a te kódod dönti el (tenant-szűrés a lekérdezésekben, cache-kulcsok, jogosultság-ellenőrzés — 17. és 18. modul). A WAF a külső támadót fogja, nem a hibás üzleti logikát.

Előző21. modul — A hálózati réteg: DNS, TLS, szabályok, kérés-életciklus Következő 23. modul — Email: küldés, fogadás, kézbesíthetőség