{"id":173946,"date":"2026-08-18T17:20:21","date_gmt":"2026-08-18T15:20:21","guid":{"rendered":"https:\/\/fotc.com\/?p=173946"},"modified":"2026-08-18T17:20:23","modified_gmt":"2026-08-18T15:20:23","slug":"mire-megerkezik-a-szamla-mar-tul-keso-igy-epitettunk-koltseganomalia-detektort-a-google-cloudhoz","status":"publish","type":"post","link":"https:\/\/fotc.com\/hu\/blog\/mire-megerkezik-a-szamla-mar-tul-keso-igy-epitettunk-koltseganomalia-detektort-a-google-cloudhoz\/","title":{"rendered":"Mire meg\u00e9rkezik a sz\u00e1mla, m\u00e1r t\u00fal k\u00e9s\u0151. \u00cdgy \u00e9p\u00edtett\u00fcnk k\u00f6lts\u00e9ganom\u00e1lia-detektort a Google Cloudhoz"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">2026 tavasz\u00e1n k\u00e9t c\u00e9g is ugyanannak a t\u00e1mad\u00e1si t\u00edpusnak esett \u00e1ldozatul: ellopott hiteles\u00edt\u0151 adatok, idegen API-kulcsok \u00e9s egy hatalmas Gemini-fogyaszt\u00e1st tartalmaz\u00f3 sz\u00e1mla. Az els\u0151 incidens f\u00e9lmilli\u00f3 eur\u00f3s sz\u00e1ml\u00e1val z\u00e1rult. A m\u00e1sodik, k\u00e9t h\u00f3nappal k\u00e9s\u0151bb, egy m\u00e1r a monitoringunk alatt \u00e1ll\u00f3 k\u00f6rnyezetet \u00e9rt, \u00e9s n\u00e9h\u00e1ny \u00f3r\u00e1n bel\u00fcl meg\u00e1ll\u00edtottuk. Ez az \u00edr\u00e1s arr\u00f3l sz\u00f3l, mit \u00e9p\u00edtett\u00fcnk e k\u00e9t d\u00e1tum k\u00f6z\u00f6tt, \u00e9s mi\u00e9rt nem az anom\u00e1li\u00e1k felismer\u00e9se volt a legnehezebb, hanem annak eld\u00f6nt\u00e9se, mikor kell val\u00f3ban riasztani.<\/p>\n\n\n\n<h2 id=\"h-felmillio-euro-harom-nap-alatt\" class=\"wp-block-heading\">F\u00e9lmilli\u00f3 eur\u00f3 h\u00e1rom nap alatt<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">2026 m\u00e1jusa. Egy nagy technol\u00f3giai c\u00e9gcsoport, amely t\u00f6bbek k\u00f6z\u00f6tt e-kereskedelmi \u00e9s streaming platformokat \u00fczemeltet, szinte csak jelk\u00e9pes m\u00e9rt\u00e9kben haszn\u00e1lja a Google Cloudot. A f\u0151 infrastrukt\u00far\u00e1juk m\u00e1shol m\u0171k\u00f6dik; a GCP csup\u00e1n perif\u00e9rikus rendszereknek ad otthont, amelyek havonta nagyj\u00e1b\u00f3l<strong> 500 doll\u00e1ros<\/strong> k\u00f6lts\u00e9get jelentenek.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A h\u00f3nap k\u00f6zep\u00e9n a c\u00e9g t\u00e1rsszervez\u0151je egy \u00f3ri\u00e1si, sz\u00e9les k\u00f6rben beharangozott tech-esem\u00e9nynek. A teljes m\u00e9rn\u00f6ki csapat a helysz\u00ednen van, \u00e9s  nyakig \u00fclnek a munk\u00e1ban.Pontosan ezekben a napokban csap le valaki egy r\u00e9gi szolg\u00e1ltat\u00e1si fi\u00f3k kisziv\u00e1rgott kulcs\u00e1ra: az egyik projektben Editor szintre emeli a jogosults\u00e1gait, bekapcsolja a Vertex AI-t, \u00e9s elind\u00edtja a modellfuttat\u00e1sokat a Gemini 1.5 Pro-n. Nem teszt jellegr\u0151l van sz\u00f3, hanem ipari l\u00e9pt\u00e9k\u0171 haszn\u00e1latr\u00f3l.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A m\u00e1jus 14. \u00e9s 16. k\u00f6z\u00f6tti GCP-haszn\u00e1lat sz\u00e1ml\u00e1ja el\u00e9ri az <strong>500 960 eur\u00f3t<\/strong>. A c\u00e9g havi k\u00f6lts\u00e9gvet\u00e9s\u00e9nek ezerszerese p\u00f6rg\u00f6tt el mind\u00f6ssze h\u00e1rom nap alatt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A dolog legf\u00e1jdalmasabb pontja, hogy a riaszt\u00e1sok pap\u00edron m\u0171k\u00f6dtek. A Google m\u00e1r m\u00e1jus 14-\u00e9n \u00e9rtes\u00edt\u00e9st k\u00fcld\u00f6tt a gyan\u00fas haszn\u00e1latr\u00f3l \u00e9s az \u00e1tlag feletti k\u00f6lt\u00e9sr\u0151l. Csakhogy az els\u0151 k\u00f6lts\u00e9gkeret-riaszt\u00e1s \u2013 az 500 doll\u00e1ros \u00e1tlaghoz k\u00e9pest \u2013 abszol\u00fat \u00e9rt\u00e9kben m\u00e9g \u00e1rtalmatlannak t\u0171n\u0151 \u00f6sszegr\u0151l sz\u00f3lt. Azok az emberek pedig, akiknek el kellett volna olvasniuk, \u00e9ppen a sz\u00ednpadon \u00e1lltak.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A reakci\u00f3 m\u00e1jus 17-\u00e9n indult el teljes g\u0151zzel, \u00e9s tank\u00f6nyvbe ill\u0151 volt: a fi\u00f3kokat le\u00e1ll\u00edtott\u00e1k, a k\u00e1rt\u00e9kony IAM-be\u00e1ll\u00edt\u00e1sokat t\u00f6r\u00f6lt\u00e9k, a projektet \u00edr\u00e1sv\u00e9dett m\u00f3dba \u00fczemm\u00f3dba z\u00e1rolt\u00e1k az incidenselemz\u00e9shez, a teljes szervezetben pedig \u00faj biztons\u00e1gi szab\u00e1lyzatokat l\u00e9ptettek \u00e9letbe. A vizsg\u00e1lat meger\u0151s\u00edtette, hogy adat nem sziv\u00e1rgott ki, \u00e9s a k\u00e1r egyetlen projektre korl\u00e1toz\u00f3dott. \u00c1m a sz\u00e1ml\u00e1l\u00f3 \u00edgy is f\u00e9lmilli\u00f3 eur\u00f3n\u00e1l \u00e1llt meg.<\/p>\n\n\n\n<style data-wp-block-html=\"css\">\n:root {\n    --red-50:#FDEBE6; --red-100:#FBD2C6; --red-400:#EA5528; --red-500:#E33203; --red-600:#C22B03; --red-700:#9B2202;\n    --blue-50:#E6F2FF; --blue-100:#CCE5FF; --blue-300:#66AFFF; --blue-500:#007BFF; --blue-600:#0069D9; --blue-700:#0056B3;\n    --sky-100:#DEF3FE; --sky-500:#17A2B8;\n    --ink-900:#212529; --ink-800:#343A40; --ink-700:#495057; --ink-600:#6C757D; --ink-500:#868E96;\n    --ink-300:#CED4DA; --ink-200:#DEE2E6; --ink-100:#E9ECEF; --ink-50:#F8F9FA; --white:#FFFFFF;\n    --green-500:#28A745; --amber-500:#FFC107; --danger-500:#DC3545;\n    --font-sans:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif;\n    --font-mono:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;\n    --shadow-xs:0 1px 2px rgba(11,27,43,.06);\n    --shadow-sm:0 1px 3px rgba(11,27,43,.08),0 1px 2px rgba(11,27,43,.04);\n    --shadow-md:0 6px 16px rgba(11,27,43,.08);\n    --shadow-lg:0 14px 32px rgba(11,27,43,.10);\n    --shadow-brand:0 12px 28px rgba(227,50,3,.26);\n    --ease:cubic-bezier(.2,0,0,1);\n  }\n  figure.chart { background:var(--white); border:1px solid var(--ink-200); border-radius:16px; padding:24px; margin:30px 0; box-shadow:var(--shadow-sm); }\n  figure.chart figcaption { margin-bottom:4px; }\n  figure.chart .f-title { font-size:16px; font-weight:700; color:var(--ink-900); }\n  figure.chart .f-sub { font-size:13px; color:var(--ink-500); margin-top:3px; }\n  .console { background:#1b1d21; border-radius:12px; padding:16px 16px 8px; margin-top:16px; }\n  .console-head { display:flex; justify-content:space-between; align-items:baseline; gap:14px; flex-wrap:wrap; padding:2px 6px 12px; border-bottom:1px solid #33363b; margin-bottom:6px; }\n  .console-head .range { font-size:12px; color:#9aa0a6; }\n  .console-head .big { font-size:17px; font-weight:700; color:#e8eaed; font-family:var(--font-mono); }\n  .console-head .delta { font-size:12.5px; font-weight:600; color:#f28b45; }\n  .chart-svg { width:100%; height:auto; display:block; }\n  .chart-note { font-size:12.5px; color:var(--ink-500); margin-top:14px; }\n  details.datatable { margin-top:12px; font-size:13px; }\n  details.datatable summary { cursor:pointer; color:var(--ink-600); font-weight:600; }\n  details.datatable table { border-collapse:collapse; margin-top:10px; }\n  details.datatable td, details.datatable th { border:1px solid var(--ink-200); padding:5px 10px; text-align:right; }\n  details.datatable th { background:var(--ink-50); font-weight:600; color:var(--ink-800); }\n  .tip { position:fixed; z-index:90; pointer-events:none; background:var(--ink-900); color:#fff; font-size:12.5px; padding:7px 11px; border-radius:8px; box-shadow:var(--shadow-lg); opacity:0; transition:opacity .1s; white-space:nowrap; }\n<\/style>\n\n<script class=\"newscripwt\">\njQuery(function($) {\n  function seededNoise(i, base, spread) {\n    const x = Math.sin(i * 12.9898) * 43758.5453;\n    return base + (x - Math.floor(x) - 0.5) * spread;\n  }\n  const CHARTS = {\n    chartMay: {\n      month: \"m\u00e1j\", daysInMonth: 31,\n      base: 16, spread: 9,\n      spikes: { 13: 292000, 14: 168000, 15: 41000 },\n      spikeLabels: { 13: \"\u2248\u20ac292k\" },\n      gridMax: 300000, gridStep: 100000,\n      fmtAxis: v => v === 0 ? \"\u20ac0\" : \"\u20ac\" + (v \/ 1000) + \"k\",\n      fmtTip: v => v >= 1000 ? \"\u2248\u20ac\" + Math.round(v \/ 1000) + \"k\" : \"\u2248\u20ac\" + Math.round(v),\n    },\n    chartJul: {\n      month: \"j\u00fal\", daysInMonth: 31,\n      base: 20, spread: 10,\n      spikes: { 15: 33251, 16: 650 },\n      spikeLabels: { 15: \"\u2248$33.3k\" },\n      gridMax: 40000, gridStep: 10000,\n      fmtAxis: v => v === 0 ? \"$0\" : \"$\" + (v \/ 1000) + \"k\",\n      fmtTip: v => v >= 1000 ? \"\u2248$\" + (Math.round(v \/ 100) \/ 10).toLocaleString(\"hu-HU\") + \"k\" : \"\u2248$\" + Math.round(v),\n    },\n  };\n  const tip = document.getElementById(\"tip\");\n  const NS = \"http:\/\/www.w3.org\/2000\/svg\";\n  const el = (tag, attrs) => {\n    const e = document.createElementNS(NS, tag);\n    for (const [k, v] of Object.entries(attrs)) e.setAttribute(k, v);\n    return e;\n  };\n  function renderConsoleChart(id) {\n    const svg = document.getElementById(id);\n    const cfg = CHARTS[id];\n    if (!svg || !cfg) return;\n    const W = 860, H = 250;\n    const M = { top: 18, right: 10, bottom: 30, left: 64 };\n    const plotW = W - M.left - M.right, plotH = H - M.top - M.bottom;\n    const n = cfg.daysInMonth;\n    const gap = 5;\n    const bw = (plotW - gap * (n - 1)) \/ n;\n    for (let g = 0; g <= cfg.gridMax; g += cfg.gridStep) {\n      const y = M.top + plotH - (g \/ cfg.gridMax) * plotH;\n      svg.appendChild(el(\"line\", { x1: M.left, x2: M.left + plotW, y1: y, y2: y, stroke: \"#3c4043\", \"stroke-width\": 1 }));\n      const t = el(\"text\", { x: M.left - 10, y: y + 4, \"text-anchor\": \"end\", \"font-size\": 11, fill: \"#9aa0a6\" });\n      t.textContent = cfg.fmtAxis(g);\n      svg.appendChild(t);\n    }\n    for (let i = 0; i < n; i++) {\n      const v = cfg.spikes[i] !== undefined ? cfg.spikes[i] : Math.max(2, seededNoise(i, cfg.base, cfg.spread));\n      const x = M.left + i * (bw + gap);\n      const h = Math.max(1.5, (v \/ cfg.gridMax) * plotH);\n      const y = M.top + plotH - h;\n      const bar = el(\"rect\", { x, y, width: bw, height: h, rx: 1.5, fill: \"#669df6\" });\n      svg.appendChild(bar);\n      if (!(cfg.spikeLabels == null || cfg.spikeLabels[i] == null)) {\n        const t = el(\"text\", { x: Math.min(Math.max(x + bw \/ 2, M.left + 40), W - 50), y: Math.max(y - 7, 12), \"text-anchor\": \"middle\", \"font-size\": 11.5, \"font-weight\": 700, fill: \"#e8eaed\" });\n        t.textContent = cfg.spikeLabels[i];\n        svg.appendChild(t);\n      }\n      if (i % 3 === 0) {\n        const t = el(\"text\", { x: x + bw \/ 2, y: M.top + plotH + 18, \"text-anchor\": \"middle\", \"font-size\": 9.5, fill: \"#9aa0a6\" });\n        t.textContent = (i + 1) + \" \" + cfg.month;\n        svg.appendChild(t);\n      }\n      const hit = el(\"rect\", { x: x - gap \/ 2, y: M.top, width: bw + gap, height: plotH, fill: \"transparent\" });\n      hit.addEventListener(\"mousemove\", (e) => {\n        if (!tip) return;\n        tip.textContent = (i + 1) + \" \" + cfg.month + \" \u00b7 \" + cfg.fmtTip(v);\n        tip.style.left = e.clientX + 14 + \"px\";\n        tip.style.top = e.clientY - 10 + \"px\";\n        tip.style.opacity = 1;\n        bar.setAttribute(\"opacity\", \"0.8\");\n      });\n      hit.addEventListener(\"mouseleave\", () => { if (tip) tip.style.opacity = 0; bar.removeAttribute(\"opacity\"); });\n      svg.appendChild(hit);\n    }\n  }\n  renderConsoleChart(\"chartMay\");\n  renderConsoleChart(\"chartJul\");\n});\n<\/script>\n\n<div class=\"tip\" id=\"tip\" role=\"presentation\"><\/div>\n\n<figure class=\"chart\">\n  <figcaption>\n    <div class=\"f-title\">\u00cdgy n\u00e9z ki mindez a sz\u00e1ml\u00e1z\u00e1si konzolban<\/div>\n    <div class=\"f-sub\">Napi fi\u00f3kk\u00f6lts\u00e9g, 2026. m\u00e1jus (illusztr\u00e1ci\u00f3, val\u00f3s nagys\u00e1grendekkel)<\/div>\n  <\/figcaption>\n  <div class=\"console\">\n    <div class=\"console-head\">\n      <div><div class=\"range\">2026. m\u00e1jus 1\u201331. \u00b7 teljes k\u00f6lts\u00e9g<\/div><div class=\"big\">\u2248 \u20ac501 000<\/div><\/div>\n      <div class=\"delta\">~\u00d71000 n\u00f6veked\u00e9s egy tipikus h\u00f3naphoz k\u00e9pest<\/div>\n    <\/div>\n    <svg id=\"chartMay\" class=\"chart-svg\" viewBox=\"0 0 860 250\" role=\"img\" aria-label=\"Bar chart of daily cost in May\"><line x1=\"64\" x2=\"850\" y1=\"220\" y2=\"220\" stroke=\"#3c4043\" stroke-width=\"1\"><\/line><text x=\"54\" y=\"224\" text-anchor=\"end\" font-size=\"11\" fill=\"#9aa0a6\">\u20ac0<\/text><line x1=\"64\" x2=\"850\" y1=\"152.66\" y2=\"152.66\" stroke=\"#3c4043\" stroke-width=\"1\"><\/line><text x=\"54\" y=\"156.66\" text-anchor=\"end\" font-size=\"11\" fill=\"#9aa0a6\">\u20ac100k<\/text><line x1=\"64\" x2=\"850\" y1=\"85.33\" y2=\"85.33\" stroke=\"#3c4043\" stroke-width=\"1\"><\/line><text x=\"54\" y=\"89.33\" text-anchor=\"end\" font-size=\"11\" fill=\"#9aa0a6\">\u20ac200k<\/text><line x1=\"64\" x2=\"850\" y1=\"18\" y2=\"18\" stroke=\"#3c4043\" stroke-width=\"1\"><\/line><text x=\"54\" y=\"22\" text-anchor=\"end\" font-size=\"11\" fill=\"#9aa0a6\">\u20ac300k<\/text><rect x=\"64\" y=\"218.5\" width=\"20.5\" height=\"1.5\" rx=\"1.5\" fill=\"#669df6\"><\/rect><text x=\"74.2\" y=\"238\" text-anchor=\"middle\" font-size=\"9.5\" fill=\"#9aa0a6\">1 m\u00e1j<\/text><rect x=\"395.7\" y=\"23.38\" width=\"20.5\" height=\"196.6\" rx=\"1.5\" fill=\"#669df6\"><\/rect><text x=\"405.9\" y=\"16.38\" text-anchor=\"middle\" font-size=\"11.5\" font-weight=\"700\" fill=\"#e8eaed\">\u2248\u20ac292k<\/text><rect x=\"421.2\" y=\"106.88\" width=\"20.5\" height=\"113.12\" rx=\"1.5\" fill=\"#669df6\"><\/rect><rect x=\"446.7\" y=\"192.39\" width=\"20.5\" height=\"27.6\" rx=\"1.5\" fill=\"#669df6\"><\/rect><text x=\"457\" y=\"238\" text-anchor=\"middle\" font-size=\"9.5\" fill=\"#9aa0a6\">16 m\u00e1j<\/text><\/svg>\n  <\/div>\n  <p class=\"chart-note\">Egy \u00e1tlagos nap ezen a fi\u00f3kon tizen-egyn\u00e9h\u00e1ny eur\u00f3, \u00edgy ezen a sk\u00e1l\u00e1n ezek az oszlopok egyszer\u0171en l\u00e1thatatlanok. Ez nem egy val\u00f3di konzol k\u00e9perny\u0151k\u00e9pe.<\/p>\n  <details class=\"datatable\">\n    <summary>A diagram adatai (t\u00e1bl\u00e1zat)<\/summary>\n    <table>\n      <tbody>\n        <tr><th>Nap<\/th><th>tipikus<\/th><th>m\u00e1jus 14.<\/th><th>m\u00e1jus 15.<\/th><th>m\u00e1jus 16.<\/th><\/tr>\n        <tr><th>K\u00f6lts\u00e9g<\/th><td>\u2248 \u20ac16<\/td><td>\u2248 \u20ac292 000<\/td><td>\u2248 \u20ac168 000<\/td><td>\u2248 \u20ac41 000<\/td><\/tr>\n      <\/tbody>\n    <\/table>\n  <\/details>\n<\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Az eset megfigyel\u00e9se alapj\u00e1n h\u00e1rom kulcsprobl\u00e9m\u00e1t azonos\u00edtottunk, amelyek egyenesen a backlogunkba ker\u00fcltek:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A statikus k\u00f6lts\u00e9gkeret-riaszt\u00e1sok vakok az alacsony k\u00f6lt\u00e9s\u0171 k\u00f6rnyezetekben, mert a sz\u00e1zal\u00e9kosan gigantikus n\u00f6veked\u00e9s kezdetben elhanyagolhat\u00f3 \u00f6sszegnek t\u0171nik.<\/li>\n\n\n\n<li>A vissza\u00e9l\u00e9sekr\u0151l sz\u00f3l\u00f3 \u00e9rtes\u00edt\u00e9sek kiz\u00e1r\u00f3lag a k\u00f6rnyezet tulajdonos\u00e1hoz jutnak el. Az alapbe\u00e1ll\u00edt\u00e1sok mellett a sz\u00e1ml\u00e1z\u00e1si partner ebb\u0151l semmit sem l\u00e1t, am\u00edg az \u00fcgyf\u00e9l maga nem jelentkezik.<\/li>\n\n\n\n<li>Ebben az esetben nem l\u00e9tezett semmilyen automatikus biztos\u00edt\u00e9k, amely megakad\u00e1lyozta volna ezt a fogyaszt\u00e1st.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Elhat\u00e1roztuk, hogy \u00fcgyfeleinkn\u00e9l az ilyen incidenseket els\u0151k\u00e9nt mi vessz\u00fck \u00e9szre, nem a sz\u00e1mla. \u00cdgy sz\u00fcletett a <strong>Cloud Cost Sentinel<\/strong>.<\/p>\n\n\n\n<h2 id=\"h-a-koltseg-biztonsagi-jelzes\" class=\"wp-block-heading\">A k\u00f6lts\u00e9g biztons\u00e1gi jelz\u00e9s<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A szakma m\u00e1r el is nevezte a jelens\u00e9get: ez az <strong>LLMjacking<\/strong>.  Az ellopott felh\u0151-hiteles\u00edt\u0151 adatok nem adatlop\u00e1sra szolg\u00e1lnak, hanem a dr\u00e1ga nyelvi modell-API-k t\u00f6meges, gyakran tov\u00e1bb\u00e9rt\u00e9kes\u00edtett fogyaszt\u00e1s\u00e1ra. A sz\u00e1mla az \u00e1ldozatn\u00e1l marad. A nyilv\u00e1nosan dokument\u00e1lt esetek a p\u00e1r tucat doll\u00e1rt\u00f3l a t\u00f6bb t\u00edzezer doll\u00e1ros k\u00e1rig terjednek egy\u00e9ni fejleszt\u0151k \u00e9s kisebb csapatok eset\u00e9ben. Az itt le\u00edrt v\u00e1llalatok nem egyedi \u00e1ldozatok voltak, csak a k\u00f6vetkez\u0151 c\u00e9lpontok egy profin ki\u00e9p\u00edtett g\u00e9pezetben.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ez\u00e9rt kezelj\u00fck az FOTC-n\u00e9l a folyamatosan \u00e9rkez\u0151 haszn\u00e1lati \u00e9s k\u00f6lts\u00e9gadatokat ugyan\u00fagy, ahogyan a SecOps a logokat: folyamatos elemz\u00e9s alatt \u00e1ll\u00f3 adatfolyamk\u00e9nt. A hirtelen k\u00f6lts\u00e9gn\u00f6veked\u00e9snek szinte mindig technikai oka van, \u00e9s ezen okok jelent\u0151s r\u00e9sze konkr\u00e9t biztons\u00e1gi incidens:<\/p>\n\n\n\n<style data-wp-block-html=\"css\">\n:root {\n    --red-50:#FDEBE6; --red-100:#FBD2C6; --red-400:#EA5528; --red-500:#E33203; --red-600:#C22B03; --red-700:#9B2202;\n    --blue-50:#E6F2FF; --blue-100:#CCE5FF; --blue-300:#66AFFF; --blue-500:#007BFF; --blue-600:#0069D9; --blue-700:#0056B3;\n    --sky-100:#DEF3FE; --sky-500:#17A2B8;\n    --ink-900:#212529; --ink-800:#343A40; --ink-700:#495057; --ink-600:#6C757D; --ink-500:#868E96;\n    --ink-300:#CED4DA; --ink-200:#DEE2E6; --ink-100:#E9ECEF; --ink-50:#F8F9FA; --white:#FFFFFF;\n    --green-500:#28A745; --amber-500:#FFC107; --danger-500:#DC3545;\n    --font-sans:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif;\n    --font-mono:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;\n    --shadow-xs:0 1px 2px rgba(11,27,43,.06);\n    --shadow-sm:0 1px 3px rgba(11,27,43,.08),0 1px 2px rgba(11,27,43,.04);\n    --shadow-md:0 6px 16px rgba(11,27,43,.08);\n    --shadow-lg:0 14px 32px rgba(11,27,43,.10);\n    --shadow-brand:0 12px 28px rgba(227,50,3,.26);\n    --ease:cubic-bezier(.2,0,0,1);\n  } \n  .chips { display:grid; grid-template-columns:repeat(auto-fit,minmax(230px,1fr)); gap:12px; margin:26px 0 8px; }\n  .chip { display:flex; align-items:center; gap:11px; background:var(--ink-50); border:1px solid var(--ink-100); border-radius:12px; padding:13px 15px; font-size:14.5px; font-weight:600; color:var(--ink-800); }\n  .chip .ico { width:34px; height:34px; flex-shrink:0; display:flex; align-items:center; justify-content:center; border-radius:99px; background:var(--red-50); color:var(--red-500); }\n  .chip .ico svg { width:16px; height:16px; }\n<\/style>\n\n<div class=\"chips\">\n  <div class=\"chip\"><span class=\"ico\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"7.5\" cy=\"15.5\" r=\"4.5\"><\/circle><path d=\"M10.5 12.5L20 3m-3 0h3v3\"><\/path><\/svg><\/span>Kisziv\u00e1rgott API- vagy szolg\u00e1ltat\u00e1sfi\u00f3k-kulcs<\/div>\n  <div class=\"chip\"><span class=\"ico\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"8\" r=\"4\"><\/circle><path d=\"M4 21a8 8 0 0116 0\"><\/path><\/svg><\/span>Elt\u00e9r\u00edtett munkamenet vagy felhaszn\u00e1l\u00f3i fi\u00f3k<\/div>\n  <div class=\"chip\"><span class=\"ico\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\"><\/rect><path d=\"M9 1v3M15 1v3M9 20v3M15 20v3M1 9h3M1 15h3M20 9h3M20 15h3\"><\/path><\/svg><\/span>Kriptob\u00e1ny\u00e1szat \u00e9s a sz\u00e1m\u00edt\u00e1si kapacit\u00e1s tov\u00e1bb\u00e9rt\u00e9kes\u00edt\u00e9se<\/div>\n  <div class=\"chip\"><span class=\"ico\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"3\"><\/circle><path d=\"M12 5V3M12 21v-2M5 12H3m18 0h-2M6.3 6.3 4.9 4.9m14.2 14.2-1.4-1.4M6.3 17.7l-1.4 1.4M19.1 4.9l-1.4 1.4\"><\/path><\/svg><\/span>Hib\u00e1s konfigur\u00e1ci\u00f3 vagy rossz automatiz\u00e1l\u00e1s<\/div>\n  <div class=\"chip\"><span class=\"ico\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M13 2L3 14h8l-1 8 10-12h-8l1-8z\"><\/path><\/svg><\/span>Kontroll\u00e1latlan tesztk\u00f6rnyezetek<\/div>\n  <div class=\"chip\"><span class=\"ico\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M12 19V5M5 12l7-7 7 7\"><\/path><\/svg><\/span>V\u00e1ratlan sk\u00e1l\u00e1z\u00f3d\u00e1s egy telep\u00edt\u00e9s ut\u00e1n<\/div>\n<\/div>\n\n\n\n<h2 id=\"h-architektura-a-szamlazasi-exporttol-a-pagerdutyig\" class=\"wp-block-heading\">Architekt\u00fara: a sz\u00e1ml\u00e1z\u00e1si exportt\u00f3l a PagerDutyig<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">T\u00f6bb sz\u00e1z Google Cloud sz\u00e1ml\u00e1z\u00e1si fi\u00f3kot kezel\u00fcnk. Mindegyikr\u0151l teljes sz\u00e1ml\u00e1z\u00e1si adatexport k\u00e9sz\u00fcl egy particion\u00e1lt BigQuery-t\u00e1bl\u00e1ba. Egy\u00e9bk\u00e9nt ez az egyetlen dolog, amit a rendszer megk\u00f6vetel egy adott k\u00f6rnyezett\u0151l. Ezen az alapon m\u0171k\u00f6dik a detektor: egy kis er\u0151forr\u00e1s-ig\u00e9ny\u0171 Cloud Run alkalmaz\u00e1s, amit egy automatikus id\u0151z\u00edt\u0151 kapcsol be s\u0171r\u0171 id\u0151k\u00f6z\u00f6nk\u00e9nt.<\/p>\n\n\n\n<style data-wp-block-html=\"css\">\n:root {\n    --red-50:#FDEBE6; --red-100:#FBD2C6; --red-400:#EA5528; --red-500:#E33203; --red-600:#C22B03; --red-700:#9B2202;\n    --blue-50:#E6F2FF; --blue-100:#CCE5FF; --blue-300:#66AFFF; --blue-500:#007BFF; --blue-600:#0069D9; --blue-700:#0056B3;\n    --sky-100:#DEF3FE; --sky-500:#17A2B8;\n    --ink-900:#212529; --ink-800:#343A40; --ink-700:#495057; --ink-600:#6C757D; --ink-500:#868E96;\n    --ink-300:#CED4DA; --ink-200:#DEE2E6; --ink-100:#E9ECEF; --ink-50:#F8F9FA; --white:#FFFFFF;\n    --green-500:#28A745; --amber-500:#FFC107; --danger-500:#DC3545;\n    --font-sans:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif;\n    --font-mono:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;\n    --shadow-xs:0 1px 2px rgba(11,27,43,.06);\n    --shadow-sm:0 1px 3px rgba(11,27,43,.08),0 1px 2px rgba(11,27,43,.04);\n    --shadow-md:0 6px 16px rgba(11,27,43,.08);\n    --shadow-lg:0 14px 32px rgba(11,27,43,.10);\n    --shadow-brand:0 12px 28px rgba(227,50,3,.26);\n    --ease:cubic-bezier(.2,0,0,1);\n  }\n  .arch { display: flex; flex-direction: column; align-items: stretch; gap: 0; max-width: 420px; margin: 34px auto 10px; }\n  .arch-col { background:var(--white); border:1px solid var(--ink-200); border-radius:16px; padding:18px; box-shadow:var(--shadow-sm); }\n  .arch-col h4 { font-size:13px; text-transform:uppercase; letter-spacing:.08em; color:var(--blue-600); margin-bottom:12px; }\n  .arch-item { font-size:13.5px; color:var(--ink-700); background:var(--ink-50); border:1px solid var(--ink-100); border-radius:9px; padding:8px 11px; margin-bottom:8px; line-height:1.4; }\n  .arch-item:last-child { margin-bottom:0; }\n  .arch-item b { color:var(--ink-900); font-weight:600; display:block; }\n  .arch-arrow { display:flex; align-items:center; align-self: center; color:var(--blue-500); }\n  .arch-arrow svg { width:22px; height:22px; }\n<\/style>\n\n<div class=\"arch\" role=\"img\" aria-label=\"Architekt\u00fara-diagram: sz\u00e1ml\u00e1z\u00e1si exportok a BigQueryben, a detektor Cloud Runon, d\u00f6nt\u00e9si r\u00e9teg, reakci\u00f3csatorn\u00e1k\">\n  <div class=\"arch-col\">\n    <h4>Adatok<\/h4>\n    <div class=\"arch-item\"><b>Sz\u00e1ml\u00e1z\u00e1si exportok<\/b>t\u00f6bb sz\u00e1z fi\u00f3k, szabv\u00e1nyos GCP-export<\/div>\n    <div class=\"arch-item\"><b>BigQuery<\/b>bet\u00f6lt\u00e9si id\u0151 szerint particion\u00e1lt t\u00e1bl\u00e1k<\/div>\n  <\/div>\n  <div class=\"arch-arrow\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M12 5v14M6 13l6 6 6-6\"><\/path><\/svg><\/div>\n  <div class=\"arch-col\">\n    <h4>Detekt\u00e1l\u00e1s<\/h4>\n    <div class=\"arch-item\"><b>Detektor (Cloud Run)<\/b>r\u00f6vid, szab\u00e1lyos ciklus (Pub\/Sub push)<\/div>\n    <div class=\"arch-item\"><b>4 ablakos lek\u00e9rdez\u00e9s<\/b>napi \u00b7 \u00f3r\u00e1nk\u00e9nti \u00b7 \u00faj fi\u00f3kok \u00b7 havi el\u0151rejelz\u00e9s<\/div>\n  <\/div>\n  <div class=\"arch-arrow\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M12 5v14M6 13l6 6 6-6\"><\/path><\/svg><\/div>\n  <div class=\"arch-col\">\n    <h4>D\u00f6nt\u00e9s<\/h4>\n    <div class=\"arch-item\"><b>Kritikuss\u00e1g + k\u00fcsz\u00f6b\u00e9rt\u00e9kek<\/b>a fi\u00f3k kontextus\u00e1ban, telep\u00edt\u00e9senk\u00e9nti param\u00e9terekkel<\/div>\n    <div class=\"arch-item\"><b>Esem\u00e9ny \u00e1llapota<\/b>hold \u00b7 deduplik\u00e1ci\u00f3 \u00b7 cooldown \u00b7 autoclose<\/div>\n  <\/div>\n  <div class=\"arch-arrow\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M12 5v14M6 13l6 6 6-6\"><\/path><\/svg><\/div>\n  <div class=\"arch-col\">\n    <h4>Reakci\u00f3<\/h4>\n    <div class=\"arch-item\"><b>Google Chat + CRM<\/b>riaszt\u00e1si k\u00e1rtya \u00e9s feladat az \u00fcgyf\u00e9lmenedzsernek<\/div>\n    <div class=\"arch-item\"><b>PagerDuty<\/b>kritikus esem\u00e9nyek eszkal\u00e1l\u00e1sa<\/div>\n    <div class=\"arch-item\"><b>Dashboard<\/b>Cloud Run IAP m\u00f6g\u00f6tt, k\u00e9tnyelv\u0171<\/div>\n  <\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Minden komponens \u00e1llapotmentes. A rendszer egyetlen \u00e1llapota a BigQuerybe vissza\u00edrt detekt\u00e1l\u00e1si el\u0151zm\u00e9ny. Ez hajtja a dashboardot \u00e9s az \u00fajra\u00e9rtes\u00edt\u00e9si d\u00f6nt\u00e9seket. A riaszt\u00e1sok hozz\u00e1nk is befutnak, nem csak az \u00fcgyf\u00e9lhez.<\/p>\n\n\n\n<h2 id=\"h-negy-kerdes-amelyet-minden-elemzesi-ciklusban-felteszunk-az-adatoknak\" class=\"wp-block-heading\">N\u00e9gy k\u00e9rd\u00e9s, amelyet minden elemz\u00e9si ciklusban feltesz\u00fcnk az adatoknak<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Minden anom\u00e1liat\u00edpus m\u00e1s k\u00e9rd\u00e9s, m\u00e1s referenciaablakkal. A k\u00f6z\u00f6s nevez\u0151 itt az, hogy minden fi\u00f3kot kiz\u00e1r\u00f3lag a saj\u00e1t el\u0151zm\u00e9nyeivel vet\u00fcnk \u00f6ssze. A konkr\u00e9t hat\u00e1r\u00e9rt\u00e9kek, az id\u0151ablakok hossza \u00e9s a minim\u00e1lis \u00f6sszeghat\u00e1rok k\u00f6rnyezetenk\u00e9nt egyedileg \u00e1ll\u00edthat\u00f3 param\u00e9terek \u2013 ez\u00e9rt sem r\u00e9szletezz\u00fck \u0151ket itt sz\u00e1mszer\u0171en.<\/p>\n\n\n\n<style data-wp-block-html=\"css\">\n:root {\n    --red-50:#FDEBE6; --red-100:#FBD2C6; --red-400:#EA5528; --red-500:#E33203; --red-600:#C22B03; --red-700:#9B2202;\n    --blue-50:#E6F2FF; --blue-100:#CCE5FF; --blue-300:#66AFFF; --blue-500:#007BFF; --blue-600:#0069D9; --blue-700:#0056B3;\n    --sky-100:#DEF3FE; --sky-500:#17A2B8;\n    --ink-900:#212529; --ink-800:#343A40; --ink-700:#495057; --ink-600:#6C757D; --ink-500:#868E96;\n    --ink-300:#CED4DA; --ink-200:#DEE2E6; --ink-100:#E9ECEF; --ink-50:#F8F9FA; --white:#FFFFFF;\n    --green-500:#28A745; --amber-500:#FFC107; --danger-500:#DC3545;\n    --font-sans:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif;\n    --font-mono:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;\n    --shadow-xs:0 1px 2px rgba(11,27,43,.06);\n    --shadow-sm:0 1px 3px rgba(11,27,43,.08),0 1px 2px rgba(11,27,43,.04);\n    --shadow-md:0 6px 16px rgba(11,27,43,.08);\n    --shadow-lg:0 14px 32px rgba(11,27,43,.10);\n    --shadow-brand:0 12px 28px rgba(227,50,3,.26);\n    --ease:cubic-bezier(.2,0,0,1);\n  } \n  .table-scroll { overflow-x:auto; -webkit-overflow-scrolling:touch; }\n  .table-scroll .det-table { min-width:560px; }\n  .det-table { width:100%; border-collapse:separate; border-spacing:0; margin:26px 0 8px; font-size:14.5px; box-shadow:var(--shadow-sm); border-radius:16px; overflow:hidden; border:1px solid var(--ink-200); }\n  .det-table th { background:var(--ink-900); color:#fff; text-align:left; font-size:12.5px; text-transform:uppercase; letter-spacing:.07em; padding:13px 16px; font-weight:600; }\n  .det-table td { padding:14px 16px; border-top:1px solid var(--ink-100); vertical-align:top; color:var(--ink-700); background:var(--white); }\n  .det-table td:first-child { font-weight:600; color:var(--ink-900); white-space:nowrap; }\n  .det-table tr:nth-child(even) td { background:var(--ink-50); }\n<\/style>\n\n<div class=\"table-scroll\">\n  <table class=\"det-table\">\n    <thead><tr><th>Detektor<\/th><th>K\u00e9rd\u00e9s<\/th><th>Referenciapont<\/th><\/tr><\/thead>\n    <tbody>\n      <tr><td>Napi (z-score)<\/td><td>Elt\u00e9r-e a tegnapi vagy a mai k\u00f6lts\u00e9g a norm\u00e1t\u00f3l?<\/td><td>Az elm\u00falt napok g\u00f6rd\u00fcl\u0151 id\u0151ablaka, az aktu\u00e1lis nap figyelmen k\u00edv\u00fcl hagy\u00e1s\u00e1val; riaszt\u00e1s a statisztikailag jelent\u0151s elt\u00e9r\u00e9sr\u0151l egy minim\u00e1lis \u00f6sszeghat\u00e1r felett.<\/td><\/tr>\n      <tr><td>\u00d3r\u00e1nk\u00e9nti kiugr\u00e1s<\/td><td>Drasztikusan dr\u00e1g\u00e1bb-e ez az \u00f3ra a szok\u00e1sosn\u00e1l?<\/td><td>A fi\u00f3k \u00f3r\u00e1nk\u00e9nti profilja az ut\u00f3bbi napokb\u00f3l; riaszt\u00e1s az adott \u00f3ra tipikus k\u00f6lts\u00e9g\u00e9nek t\u00f6bbsz\u00f6r\u00f6s\u00e9n\u00e9l<\/td><\/tr>\n      <tr><td>\u00daj fi\u00f3k<\/td><td>Sokat k\u00f6lt-e azonnal egy frissen l\u00e9trehozott fi\u00f3k?<\/td><td>El\u0151zm\u00e9ny n\u00e9lk\u00fcli fi\u00f3k, amely azonnal magas k\u00f6lt\u00e9st gener\u00e1l; a vissza\u00e9l\u00e9s egyik leger\u0151sebb jele<\/td><\/tr>\n      <tr><td>Havi el\u0151rejelz\u00e9s<\/td><td>Merre tart ez a h\u00f3nap?<\/td><td>H\u00f3nap eleji extrapol\u00e1ci\u00f3 az el\u0151z\u0151 h\u00f3napok t\u00fckr\u00e9ben; riaszt\u00e1s, ha az el\u0151rejelz\u00e9s l\u00e1that\u00f3an elszalad<\/td><\/tr>\n    <\/tbody>\n  <\/table>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">A napi detektor sz\u00edve egyetlen ablakos BigQuery-lek\u00e9rdez\u00e9s, \u00e9s a megval\u00f3s\u00edt\u00e1snak \u00e9pp ez a r\u00e9sze a legegyszer\u0171bb. Az igazi \u00f6sszetetts\u00e9g a r\u00e9szletekben rejlik: az aktu\u00e1lis nap sz\u00e1nd\u00e9kosan kimarad a baseline-b\u00f3l (Hogy mi\u00e9rt? Mindj\u00e1rt kider\u00fcl\u2026), az ablakokat \u00e9s k\u00fcsz\u00f6b\u00f6ket val\u00f3s adatokhoz kell hangolni, magukban az adatokban pedig sosem szabad vakon megb\u00edzni, sem a teljess\u00e9g\u00fckben, sem a szerkezet\u00fckben. Els\u0151re tal\u00e1n sz\u0151rsz\u00e1lhasogat\u00e1snak t\u0171nik, de kor\u00e1bban mindegyikbe belefutottunk m\u00e1r.<\/p>\n\n\n\n<h2 id=\"h-julius-ugyanaz-a-tamadastipus-mas-befejezes\" class=\"wp-block-heading\">J\u00falius: ugyanaz a t\u00e1mad\u00e1st\u00edpus, m\u00e1s befejez\u00e9s<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">K\u00e9t h\u00f3nappal a m\u00e1jusi incidens ut\u00e1n ugyanez a t\u00e1mad\u00e1si forgat\u00f3k\u00f6nyv csapott le az egyik \u00fcgyfel\u00fcnkre, egy kis mobilalkalmaz\u00e1s-st\u00fadi\u00f3ra. Ez a k\u00f6rnyezet ekkor m\u00e1r a Cloud Cost Sentinel fel\u00fcgyelete alatt \u00e1llt. A t\u00f6rt\u00e9net szinte k\u00f6zhelyesen indult: az egyik fejleszt\u0151 le akart t\u00f6lteni egy n\u00e9pszer\u0171 eszk\u00f6zt, \u00e9s r\u00e1kattintott egy szponzor\u00e1lt keres\u00e9si tal\u00e1latra. A weboldal hitelesnek t\u0171nt, ahogyan maga a telep\u00edt\u0151program is. A h\u00e1tt\u00e9rben viszont egy olyan adatlop\u00f3 (stealer) k\u00e1rtev\u0151 rejt\u0151z\u00f6tt, amelyet t\u00f6bbek k\u00f6z\u00f6tt a Bitdefender \u00e9s a Trend Micro nyilv\u00e1nosan dokument\u00e1lt. Hi\u00e1ba volt a fi\u00f3kon MFA, semmit sem \u00e9rt, mert ez a malware-t\u00edpus egy m\u00e1r bejelentkezett g\u00e9p belsej\u00e9b\u0151l dolgozik. Olyan munkamenetet t\u00e9r\u00edt el, ahol az azonos\u00edt\u00e1s m\u00e1r kor\u00e1bban sikeresen megt\u00f6rt\u00e9nt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">J\u00falius 4-\u00e9n este az ellopott hiteles\u00edt\u0151 adatokkal egy szkript jelentkezett be egy n\u00e9metorsz\u00e1gi hosting-szerverr\u0151l. A t\u00f6bb \u00e9ves Firebase-egy\u00fcttm\u0171k\u00f6d\u00e9s ut\u00e1n a fi\u00f3knak tucatnyi projektben volt Editor szerepk\u00f6re, ami a Google Cloudban t\u00f6bbek k\u00f6z\u00f6tt API-k enged\u00e9lyez\u00e9s\u00e9nek \u00e9s kulcsok l\u00e9trehoz\u00e1s\u00e1nak jog\u00e1t jelenti. Az automatizmusnak <strong>3 perc 16 m\u00e1sodpercre<\/strong> volt sz\u00fcks\u00e9ge, hogy v\u00e9gigmenjen a projekteken, \u00e9s 16 enged\u00e9lyezett API-t, 9 szolg\u00e1ltat\u00e1sfi\u00f3kot \u00e9s 28 kulcsot hagyjon maga ut\u00e1n. Azt\u00e1n tizenk\u00e9t napra csend lett. A kulcsok ott lapultak \u00e9s kiv\u00e1rtak.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">J\u00falius 16-\u00e1n 13:45-kor a kulcsok \u00e9letre keltek, \u00e9s az \u00f6sszes projektben egyszerre indult be a t\u00f6meges Gemini-fogyaszt\u00e1s. <strong>Hajnali 4:30-kor<\/strong>, amint a nap els\u0151 adatai be\u00e9rtek a sz\u00e1ml\u00e1z\u00e1si exportba, a rendszer azonnal riasztott. A CRITICAL k\u00e1rtya \u00edgy n\u00e9zett ki: j\u00f3val \u00f6tsz\u00e1z feletti z-score, t\u00edzezrel\u00e9kek helyett t\u00edzezer sz\u00e1zal\u00e9kokban m\u00e9rt n\u00f6veked\u00e9s, a szolg\u00e1ltat\u00e1sonk\u00e9nti bont\u00e1sban pedig gyakorlatilag a teljes n\u00f6vekm\u00e9ny egyetlen t\u00e9telb\u0151l sz\u00e1rmazott: a Gemini API-b\u00f3l, egy ezen a fi\u00f3kon kor\u00e1bban egy\u00e1ltal\u00e1n nem haszn\u00e1lt szolg\u00e1ltat\u00e1sb\u00f3l. Az eszkal\u00e1ci\u00f3 kiment.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ez az \u00fcgyf\u00e9l nem vette ig\u00e9nybe \u00e1lland\u00f3 t\u00e1mogat\u00e1sunkat, \u00e9s nem adott jogosults\u00e1gokat a k\u00f6rnyezet\u00e9hez, \u00edgy a szerep\u00fcnk a riaszt\u00e1sn\u00e1l \u00e9s az eszkal\u00e1ci\u00f3n\u00e1l v\u00e9get \u00e9rt. A vissza\u00e9l\u00e9st csak \u0151 maga tudta blokkolni. Az \u00fcgyf\u00e9l csapata a nap elej\u00e9n vette fel a fonalat: 08:20 k\u00f6r\u00fcl a forgalom visszat\u00e9rt a baseline-hoz, 12:40-re pedig az idegen kulcsok \u00e9s szolg\u00e1ltat\u00e1sfi\u00f3kok elt\u0171ntek az \u00f6sszes projektb\u0151l.<\/p>\n\n\n\n<style data-wp-block-html=\"css\">\n:root {\n    --red-50:#FDEBE6; --red-100:#FBD2C6; --red-400:#EA5528; --red-500:#E33203; --red-600:#C22B03; --red-700:#9B2202;\n    --blue-50:#E6F2FF; --blue-100:#CCE5FF; --blue-300:#66AFFF; --blue-500:#007BFF; --blue-600:#0069D9; --blue-700:#0056B3;\n    --sky-100:#DEF3FE; --sky-500:#17A2B8;\n    --ink-900:#212529; --ink-800:#343A40; --ink-700:#495057; --ink-600:#6C757D; --ink-500:#868E96;\n    --ink-300:#CED4DA; --ink-200:#DEE2E6; --ink-100:#E9ECEF; --ink-50:#F8F9FA; --white:#FFFFFF;\n    --green-500:#28A745; --amber-500:#FFC107; --danger-500:#DC3545;\n    --font-sans:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif;\n    --font-mono:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;\n    --shadow-xs:0 1px 2px rgba(11,27,43,.06);\n    --shadow-sm:0 1px 3px rgba(11,27,43,.08),0 1px 2px rgba(11,27,43,.04);\n    --shadow-md:0 6px 16px rgba(11,27,43,.08);\n    --shadow-lg:0 14px 32px rgba(11,27,43,.10);\n    --shadow-brand:0 12px 28px rgba(227,50,3,.26);\n    --ease:cubic-bezier(.2,0,0,1);\n  }\n  figure.chart { background:var(--white); border:1px solid var(--ink-200); border-radius:16px; padding:24px; margin:30px 0; box-shadow:var(--shadow-sm); }\n  figure.chart figcaption { margin-bottom:4px; }\n  figure.chart .f-title { font-size:16px; font-weight:700; color:var(--ink-900); }\n  figure.chart .f-sub { font-size:13px; color:var(--ink-500); margin-top:3px; }\n  .console { background:#1b1d21; border-radius:12px; padding:16px 16px 8px; margin-top:16px; }\n  .console-head { display:flex; justify-content:space-between; align-items:baseline; gap:14px; flex-wrap:wrap; padding:2px 6px 12px; border-bottom:1px solid #33363b; margin-bottom:6px; }\n  .console-head .range { font-size:12px; color:#9aa0a6; }\n  .console-head .big { font-size:17px; font-weight:700; color:#e8eaed; font-family:var(--font-mono); }\n  .console-head .delta { font-size:12.5px; font-weight:600; color:#f28b45; }\n  .chart-svg { width:100%; height:auto; display:block; }\n  .chart-note { font-size:12.5px; color:var(--ink-500); margin-top:14px; }\n  details.datatable { margin-top:12px; font-size:13px; }\n  details.datatable summary { cursor:pointer; color:var(--ink-600); font-weight:600; }\n  details.datatable table { border-collapse:collapse; margin-top:10px; }\n  details.datatable td, details.datatable th { border:1px solid var(--ink-200); padding:5px 10px; text-align:right; }\n  details.datatable th { background:var(--ink-50); font-weight:600; color:var(--ink-800); }\n<\/style>\n\n<figure class=\"chart\">\n  <figcaption>\n    <div class=\"f-title\">Ugyanaz a n\u00e9zet, a m\u00e1sodik incidens<\/div>\n    <div class=\"f-sub\">Napi fi\u00f3kk\u00f6lts\u00e9g, 2026. j\u00falius (illusztr\u00e1ci\u00f3, val\u00f3s nagys\u00e1grendekkel)<\/div>\n  <\/figcaption>\n  <div class=\"console\">\n    <div class=\"console-head\">\n      <div><div class=\"range\">2026. j\u00falius 1\u201327. \u00b7 teljes k\u00f6lts\u00e9g<\/div><div class=\"big\">$33 921,19<\/div><\/div>\n      <div class=\"delta\">+3070% n\u00f6veked\u00e9s az el\u0151z\u0151 id\u0151szakhoz k\u00e9pest<\/div>\n    <\/div>\n    <svg id=\"chartJul\" class=\"chart-svg\" viewBox=\"0 0 860 250\" role=\"img\" aria-label=\"Bar chart of daily cost in July\"><line x1=\"64\" x2=\"850\" y1=\"220\" y2=\"220\" stroke=\"#3c4043\" stroke-width=\"1\"><\/line><text x=\"54\" y=\"224\" text-anchor=\"end\" font-size=\"11\" fill=\"#9aa0a6\">$0<\/text><line x1=\"64\" x2=\"850\" y1=\"169.5\" y2=\"169.5\" stroke=\"#3c4043\" stroke-width=\"1\"><\/line><text x=\"54\" y=\"173.5\" text-anchor=\"end\" font-size=\"11\" fill=\"#9aa0a6\">$10k<\/text><line x1=\"64\" x2=\"850\" y1=\"119\" y2=\"119\" stroke=\"#3c4043\" stroke-width=\"1\"><\/line><text x=\"54\" y=\"123\" text-anchor=\"end\" font-size=\"11\" fill=\"#9aa0a6\">$20k<\/text><line x1=\"64\" x2=\"850\" y1=\"68.5\" y2=\"68.5\" stroke=\"#3c4043\" stroke-width=\"1\"><\/line><text x=\"54\" y=\"72.5\" text-anchor=\"end\" font-size=\"11\" fill=\"#9aa0a6\">$30k<\/text><line x1=\"64\" x2=\"850\" y1=\"18\" y2=\"18\" stroke=\"#3c4043\" stroke-width=\"1\"><\/line><text x=\"54\" y=\"22\" text-anchor=\"end\" font-size=\"11\" fill=\"#9aa0a6\">$40k<\/text><rect x=\"64\" y=\"218.5\" width=\"20.5\" height=\"1.5\" rx=\"1.5\" fill=\"#669df6\"><\/rect><text x=\"74.2\" y=\"238\" text-anchor=\"middle\" font-size=\"9.5\" fill=\"#9aa0a6\">1 j\u00fal<\/text><rect x=\"446.7\" y=\"52.08\" width=\"20.5\" height=\"167.9\" rx=\"1.5\" fill=\"#669df6\"><\/rect><text x=\"457\" y=\"45.08\" text-anchor=\"middle\" font-size=\"11.5\" font-weight=\"700\" fill=\"#e8eaed\">\u2248$33.3k<\/text><text x=\"457\" y=\"238\" text-anchor=\"middle\" font-size=\"9.5\" fill=\"#9aa0a6\">16 j\u00fal<\/text><\/svg>\n  <\/div>\n  <p class=\"chart-note\">A fi\u00f3k baseline-ja napi k\u00f6r\u00fclbel\u00fcl 20 doll\u00e1r. Egyetlen nap akt\u00edv vissza\u00e9l\u00e9s el\u00e9g volt ahhoz, hogy t\u00f6bbsz\u00f6r\u00f6sen t\u00fall\u00e9pje a fi\u00f3k eg\u00e9sz \u00e9ves \u00f6sszk\u00f6lt\u00e9s\u00e9t. Ez nem az \u00fcgyf\u00e9l konzolj\u00e1nak k\u00e9perny\u0151k\u00e9pe.<\/p>\n  <details class=\"datatable\">\n    <summary>A diagram adatai (t\u00e1bl\u00e1zat)<\/summary>\n    <table>\n      <tbody><tr><th>Nap<\/th><th>tipikus<\/th><th>j\u00falius 16.<\/th><th>j\u00falius 17.<\/th><\/tr>\n      <tr><th>K\u00f6lts\u00e9g<\/th><td>\u2248 $20<\/td><td>\u2248 $33 250<\/td><td>\u2248 $650<\/td><\/tr>\n    <\/tbody><\/table>\n  <\/details>\n<\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Amikor az export lez\u00e1rta a napot, a sz\u00e1ml\u00e1l\u00f3 harminch\u00e1romezer doll\u00e1rn\u00e1l \u00e1llt meg, az elt\u00e9r\u00e9s pedig 842 sigm\u00e1ra n\u0151tt. A nap a fi\u00f3k norm\u00e1lis \u00e9rt\u00e9k\u00e9nek 906-szoros\u00e1val z\u00e1rult. Az id\u0151vonalon ez \u00edgy n\u00e9z ki: a fogyaszt\u00e1s 13:45 ut\u00e1n indult, a riaszt\u00e1s 4:30-kor ment ki, mert ennyi id\u0151be telt, m\u00edg az adatok be\u00e9rtek a sz\u00e1ml\u00e1z\u00e1si exportba, a t\u00f6bbi pedig a kliens reakci\u00f3ideje volt. P\u00e9ntek volt. A m\u00e1jusi t\u00f6rt\u00e9net el\u00e9g pontosan megmutatja, mi t\u00f6rt\u00e9nt volna, ha ez a fogyaszt\u00e1s csendben v\u00e9gigdolgozza a h\u00e9tv\u00e9g\u00e9t. Ahol nemcsak eszkal\u00e1ci\u00f3s felhatalmaz\u00e1sunk, hanem reag\u00e1l\u00e1si jogosults\u00e1gunk is van, ez a n\u00e9h\u00e1ny \u00f3ra percekre zsugorodhat.<\/p>\n\n\n\n<style data-wp-block-html=\"css\">\n:root {\n    --red-50:#FDEBE6; --red-100:#FBD2C6; --red-400:#EA5528; --red-500:#E33203; --red-600:#C22B03; --red-700:#9B2202;\n    --blue-50:#E6F2FF; --blue-100:#CCE5FF; --blue-300:#66AFFF; --blue-500:#007BFF; --blue-600:#0069D9; --blue-700:#0056B3;\n    --sky-100:#DEF3FE; --sky-500:#17A2B8;\n    --ink-900:#212529; --ink-800:#343A40; --ink-700:#495057; --ink-600:#6C757D; --ink-500:#868E96;\n    --ink-300:#CED4DA; --ink-200:#DEE2E6; --ink-100:#E9ECEF; --ink-50:#F8F9FA; --white:#FFFFFF;\n    --green-500:#28A745; --amber-500:#FFC107; --danger-500:#DC3545;\n    --font-sans:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif;\n    --font-mono:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;\n    --shadow-xs:0 1px 2px rgba(11,27,43,.06);\n    --shadow-sm:0 1px 3px rgba(11,27,43,.08),0 1px 2px rgba(11,27,43,.04);\n    --shadow-md:0 6px 16px rgba(11,27,43,.08);\n    --shadow-lg:0 14px 32px rgba(11,27,43,.10);\n    --shadow-brand:0 12px 28px rgba(227,50,3,.26);\n    --ease:cubic-bezier(.2,0,0,1);\n  }  \n  .callout { border-left:4px solid var(--red-500); background:var(--red-50); border-radius:0 12px 12px 0; padding:18px 22px; margin:28px 0; font-size:16px; color:var(--ink-800); }\n<\/style>\n\n<div class=\"callout\">Min\u00e9l kor\u00e1bban jut el egy k\u00f6lts\u00e9ganom\u00e1lia a megfelel\u0151 emberhez, ann\u00e1l kisebb a k\u00fcl\u00f6nbs\u00e9g egy \u201efurcsas\u00e1g a dashboardon\u201d \u00e9s egy hatjegy\u0171 sz\u00e1mla k\u00f6z\u00f6tt.<\/div>\n\n\n\n<style data-wp-block-html=\"css\">\n:root {\n    --red-50:#FDEBE6; --red-100:#FBD2C6; --red-400:#EA5528; --red-500:#E33203; --red-600:#C22B03; --red-700:#9B2202;\n    --blue-50:#E6F2FF; --blue-100:#CCE5FF; --blue-300:#66AFFF; --blue-500:#007BFF; --blue-600:#0069D9; --blue-700:#0056B3;\n    --sky-100:#DEF3FE; --sky-500:#17A2B8;\n    --ink-900:#212529; --ink-800:#343A40; --ink-700:#495057; --ink-600:#6C757D; --ink-500:#868E96;\n    --ink-300:#CED4DA; --ink-200:#DEE2E6; --ink-100:#E9ECEF; --ink-50:#F8F9FA; --white:#FFFFFF;\n    --green-500:#28A745; --amber-500:#FFC107; --danger-500:#DC3545;\n    --font-sans:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif;\n    --font-mono:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;\n    --shadow-xs:0 1px 2px rgba(11,27,43,.06);\n    --shadow-sm:0 1px 3px rgba(11,27,43,.08),0 1px 2px rgba(11,27,43,.04);\n    --shadow-md:0 6px 16px rgba(11,27,43,.08);\n    --shadow-lg:0 14px 32px rgba(11,27,43,.10);\n    --shadow-brand:0 12px 28px rgba(227,50,3,.26);\n    --ease:cubic-bezier(.2,0,0,1);\n  }  \n  .stats { display:grid; grid-template-columns:repeat(4,1fr); gap:16px; margin:56px auto; max-width:1000px; }\n  .stat { background:var(--white); border:1px solid var(--ink-200); border-radius:16px; padding:22px 24px; box-shadow:var(--shadow-sm); }\n  .stat b { display:block; font-size:26px; font-weight:700; color:var(--red-500); line-height:1.1; letter-spacing:-.01em; }\n  .stat span { display:block; font-size:13.5px; color:var(--ink-600); margin-top:7px; line-height:1.45; }\n  @media (max-width:960px) {\n    .stats { grid-template-columns:repeat(2,1fr); }\n  }\n  @media (max-width:560px) {\n    .stats { grid-template-columns:1fr 1fr; gap:10px; }\n    .stat b { font-size:23px; }\n  }\n<\/style>\n\n<div class=\"stats\" role=\"group\" aria-label=\"A k\u00e9t incidens legfontosabb sz\u00e1mai\">\n  <div class=\"stat\"><b>501 000 \u20ac<\/b><span>a m\u00e1jusi incidens h\u00e1rom napj\u00e1nak k\u00f6lts\u00e9ge<\/span><\/div>\n  <div class=\"stat\"><b>3 perc 16 mp<\/b><span>ennyi ideig tartott a projektek automatikus \u00e1tv\u00e9tele j\u00faliusban: 28 API-kulcs, 9 szolg\u00e1ltat\u00e1sfi\u00f3k<\/span><\/div>\n  <div class=\"stat\"><b>\u00d7906<\/b><span>a detektor \u00e1ltal \u00e9szlelt napi k\u00f6lts\u00e9gn\u00f6veked\u00e9s (z-score 842)<\/span><\/div>\n  <div class=\"stat\"><b>04:30<\/b><span>ebben az \u00e9jszakai id\u0151pontban \u00e9rkezett meg a j\u00faliusi incidens els\u0151 CRITICAL k\u00e1rty\u00e1ja a csapathoz<\/span><\/div>\n<\/div>\n\n\n\n<style data-wp-block-html=\"css\">\n:root {\n    --red-50:#FDEBE6; --red-100:#FBD2C6; --red-400:#EA5528; --red-500:#E33203; --red-600:#C22B03; --red-700:#9B2202;\n    --blue-50:#E6F2FF; --blue-100:#CCE5FF; --blue-300:#66AFFF; --blue-500:#007BFF; --blue-600:#0069D9; --blue-700:#0056B3;\n    --sky-100:#DEF3FE; --sky-500:#17A2B8;\n    --ink-900:#212529; --ink-800:#343A40; --ink-700:#495057; --ink-600:#6C757D; --ink-500:#868E96;\n    --ink-300:#CED4DA; --ink-200:#DEE2E6; --ink-100:#E9ECEF; --ink-50:#F8F9FA; --white:#FFFFFF;\n    --green-500:#28A745; --amber-500:#FFC107; --danger-500:#DC3545;\n    --font-sans:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif;\n    --font-mono:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;\n    --shadow-xs:0 1px 2px rgba(11,27,43,.06);\n    --shadow-sm:0 1px 3px rgba(11,27,43,.08),0 1px 2px rgba(11,27,43,.04);\n    --shadow-md:0 6px 16px rgba(11,27,43,.08);\n    --shadow-lg:0 14px 32px rgba(11,27,43,.10);\n    --shadow-brand:0 12px 28px rgba(227,50,3,.26);\n    --ease:cubic-bezier(.2,0,0,1);\n  }\n  .band { background:var(--ink-900); color:#fff; padding:40px 15px; position:relative; overflow:hidden; margin:80px 0; }\n  .band::before { content:\"\"; position:absolute; inset:0; background-image:linear-gradient(rgba(255,255,255,.04) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.04) 1px,transparent 1px); background-size:52px 52px; -webkit-mask-image:radial-gradient(at 30% 0%,#000,transparent 78%); mask-image:radial-gradient(at 30% 0%,#000,transparent 78%); pointer-events:none; }\n  .band .wrap { position:relative; }\n  .band h2 { color:#fff; font-size:clamp(26px,3vw,36px); margin:14px 0 16px; }\n  .band .prose > p { color:rgba(255,255,255,.72); }\n  .band strong { color:#fff; }\n  .flow { display:grid; grid-template-columns:1fr auto 1fr auto 1fr; gap:12px; align-items:stretch; margin:36px 0 14px; }\n  .phase { border-radius:14px; padding:18px; background:rgba(255,255,255,.05); border:1px solid rgba(255,255,255,.14); }\n  .phase .tag { display:inline-block; font-size:11px; font-weight:700; letter-spacing:.07em; text-transform:uppercase; padding:4px 11px; border-radius:999px; margin-bottom:11px; }\n  .phase p { font-size:13.5px; color:rgba(255,255,255,.72); line-height:1.5; }\n  .phase p b { color:#fff; font-weight:500; }\n  .phase--alert .tag { background:var(--red-400); color:#fff; }\n  .phase--hold .tag { background:var(--amber-500); color:#3A2F00; }\n  .phase--close .tag { background:#5DD879; color:#062D11; }\n  .flow-arrow { display:flex; align-items:center; color:var(--blue-300); }\n  .flow-arrow svg { width:20px; height:20px; }\n  .flow-branch { margin-top:6px; border:1px dashed rgba(102,175,255,.5); border-radius:12px; padding:14px 18px; font-size:13.5px; color:rgba(255,255,255,.82); }\n  .flow-branch b { color:var(--blue-300); }\n<\/style>\n\n<section class=\"band\">\n  <div class=\"wrap\">\n    <div class=\"prose\">\n      <h2>A riaszt\u00e1s, amely \u00f6nmag\u00e1t oltotta ki<\/h2>\n      <p>A j\u00faliusi incidens m\u00e1sodik napj\u00e1n a fi\u00f3k m\u00e9g mindig <strong>14,2 ezer doll\u00e1rt \u00e9getett naponta<\/strong>. A mi z-score-unk pedig erre a napra\u2026 <strong>1,1<\/strong> lett. Statisztikailag? Semmi \u00e9rdekes, lehet tov\u00e1bbmenni.<\/p>\n      <p>Az ok: a g\u00f6rd\u00fcl\u0151 id\u0151ablaknak volt ideje <strong>be\u00e9p\u00edteni a cs\u00facsnapot a saj\u00e1t baseline-j\u00e1ba<\/strong>. A g\u00f6rd\u00fcl\u0151 \u00e1tlag 20 doll\u00e1rr\u00f3l t\u00f6bb ezerre ugrott, a sz\u00f3r\u00e1s az egekbe sz\u00e1llt, \u00e9s a folyamatban l\u00e9v\u0151 incidens kezdett az \u00faj norm\u00e1lisnak t\u0171nni. Egy kritikus riaszt\u00e1s figyelmeztet\u00e9ss\u00e9 degrad\u00e1lta mag\u00e1t, mik\u00f6zben a k\u00f6lt\u00e9s egyetlen centtel sem cs\u00f6kkent.<\/p>\n      <p>Az els\u0151 jav\u00edt\u00e1s statisztikai volt: ki kell z\u00e1rni az anom\u00e1li\u00e1s napokat a baseline-b\u00f3l, k\u00e9t l\u00e9p\u00e9sben sz\u00e1molva azt. Nem m\u0171k\u00f6d\u00f6tt. Az incidens m\u00e1sodik napja m\u00e1r alacsony z-score-ral rendelkezett, \u00edgy megmenek\u00fclt az outlier z\u00e1szl\u00f3t\u00f3l, a harmadik napt\u00f3l kezdve pedig \u00fajb\u00f3l megfert\u0151zte a teljes id\u0151ablakot. Csak a visszavon\u00e1s ut\u00e1n \u00e9rtett\u00fck meg, hogy nem a megfelel\u0151 ellenf\u00e9llel harcolunk: <strong>ez nem statisztikai probl\u00e9ma, hanem a riaszt\u00e1s \u00e9letciklus\u00e1nak probl\u00e9m\u00e1ja<\/strong>. A riaszt\u00e1s egy \u00e1llapot, nem egyetlen esem\u00e9ny.<\/p>\n    <\/div>\n\n    <div class=\"flow\" role=\"img\" aria-label=\"Egy riaszt\u00e1si epiz\u00f3d \u00e9letciklusa: riaszt\u00e1s, hold a k\u00f6vetkez\u0151 napokban, autoclose a csendes id\u0151szak ut\u00e1n\">\n      <div class=\"phase phase--alert\">\n        <span class=\"tag\">Riaszt\u00e1s \u00b7 0. nap<\/span>\n        <p><b>Az incidens bejelez.<\/b> K\u00e1rtya a Chatben, feladat a CRM-ben, a kritikusokn\u00e1l PagerDuty is. Z\u00e1r\u00e1s a detekt\u00e1l\u00e1si el\u0151zm\u00e9nyekbe.<\/p>\n      <\/div>\n      <div class=\"flow-arrow\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M5 12h14M13 6l6 6-6 6\"><\/path><\/svg><\/div>\n      <div class=\"phase phase--hold\">\n        <span class=\"tag\">Hold \u00b7 a k\u00f6vetkez\u0151 napok<\/span>\n        <p><b>A severity az als\u00f3 korl\u00e1t.<\/b> A megm\u00e9rgezett z-score nem tudja degrad\u00e1lni a riaszt\u00e1st vagy duplik\u00e1tumot ind\u00edtani. Csend, kiv\u00e9ve ha az incidens val\u00f3ban eszkal\u00e1l\u00f3dik.<\/p>\n      <\/div>\n      <div class=\"flow-arrow\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M5 12h14M13 6l6 6-6 6\"><\/path><\/svg><\/div>\n      <div class=\"phase phase--close\">\n        <span class=\"tag\">Autoclose \u00b7 a csend ut\u00e1n<\/span>\n        <p><b>AAz incidens el\u00fcl.<\/b> N\u00e9h\u00e1ny riaszt\u00e1smentes nap ut\u00e1n a k\u00e1rtya elt\u0171nik a dashboardr\u00f3l. Egy \u00fajabb eszkal\u00e1ci\u00f3 \u00faj  incidenst nyit, saj\u00e1t id\u0151vonallal.<\/p>\n      <\/div>\n    <\/div>\n    <div class=\"prose\">\n      <div class=\"flow-branch\"><b>A hold alatt \u00fajra\u00e9rtes\u00edt\u00e9si szab\u00e1ly \u00e9rv\u00e9nyes:<\/b> \u00faj k\u00e1rtya csak akkor jelenik meg, ha a severity n\u0151, vagy ha az anom\u00e1lia egy\u00e9rtelm\u0171en m\u00e9ly\u00fcl az utols\u00f3 riaszt\u00e1shoz k\u00e9pest (z-score vagy \u00f6sszeg). A n\u00f6veked\u00e9si k\u00fcsz\u00f6b\u00f6t adatokb\u00f3l \u00e1ll\u00edtottuk be, nem meg\u00e9rz\u00e9sb\u0151l: a sz\u00e1ml\u00e1z\u00e1si export a riaszt\u00e1s ut\u00e1n m\u00e9g sok \u00f3r\u00e1n \u00e1t \u201efelt\u00f6lti\u201d a napot, \u00edgy a t\u00fal \u00e9rz\u00e9keny k\u00fcsz\u00f6b reggeli duplik\u00e1tumokat termelt. Ennek kellemes hozat\u00e9ka, hogy a n\u00f6vekv\u0151 incidens term\u00e9szetes, m\u00e9rtani l\u00e9pt\u00e9k\u0171 ritk\u00edt\u00e1st (backoff) kap.<\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n\n\n<h2 id=\"h-nem-minden-anomalia-tamadas\" class=\"wp-block-heading\">Nem minden anom\u00e1lia t\u00e1mad\u00e1s<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ne feledj\u00fck azonban, hogy a rendszer nem kiz\u00e1r\u00f3lag biztons\u00e1gi incidenseken \u00e9l. Egy nap az egyik \u00e1ltalunk monitorozott fi\u00f3k napi k\u00f6lts\u00e9ge a norma 7,6-szoros\u00e1ra n\u0151tt. A riaszt\u00e1s kiment, a CRM-feladat eljutott az \u00fcgyf\u00e9lmenedzserhez, \u0151 pedig tizen-egyn\u00e9h\u00e1ny percen bel\u00fcl meger\u0151s\u00edtette az \u00fcgyf\u00e9llel, hogy ez egy tervezett modelltan\u00edt\u00e1s volt a Vertex AI-on. Az epiz\u00f3dot egyetlen kattint\u00e1ssal eln\u00e9m\u00edtott\u00e1k a nap v\u00e9g\u00e9ig, megtartva a kritikus eszkal\u00e1ci\u00f3t. Az \u00fcgyf\u00e9l a t\u00e9ny ut\u00e1n egy \u00f3r\u00e1val kapott egy \u201eEz a tietek?\u201d k\u00e9rd\u00e9st, a k\u00f6vetkez\u0151 havi sz\u00e1ml\u00e1n szerepl\u0151 meglepet\u00e9s helyett. Egy olyan rendszer, amely nem tudja gyorsan megk\u00fcl\u00f6nb\u00f6ztetni a v\u00e1rhat\u00f3t a rosszindulat\u00f3t\u00f3l, arra tan\u00edtja az embereket, hogy figyelmen k\u00edv\u00fcl hagyj\u00e1k a riaszt\u00e1sokat, ez pedig egyenes \u00fat a m\u00e1jusi eset megism\u00e9tl\u0151d\u00e9s\u00e9hez.<\/p>\n\n\n\n<h2 id=\"h-aprosagok-amik-csak-eles-kornyezetben-jonnek-elo\" class=\"wp-block-heading\">Apr\u00f3s\u00e1gok, amik csak \u00e9les k\u00f6rnyezetben j\u00f6nnek el\u0151<\/h2>\n\n\n\n<style data-wp-block-html=\"css\">\n:root {\n    --red-50:#FDEBE6; --red-100:#FBD2C6; --red-400:#EA5528; --red-500:#E33203; --red-600:#C22B03; --red-700:#9B2202;\n    --blue-50:#E6F2FF; --blue-100:#CCE5FF; --blue-300:#66AFFF; --blue-500:#007BFF; --blue-600:#0069D9; --blue-700:#0056B3;\n    --sky-100:#DEF3FE; --sky-500:#17A2B8;\n    --ink-900:#212529; --ink-800:#343A40; --ink-700:#495057; --ink-600:#6C757D; --ink-500:#868E96;\n    --ink-300:#CED4DA; --ink-200:#DEE2E6; --ink-100:#E9ECEF; --ink-50:#F8F9FA; --white:#FFFFFF;\n    --green-500:#28A745; --amber-500:#FFC107; --danger-500:#DC3545;\n    --font-sans:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif;\n    --font-mono:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;\n    --shadow-xs:0 1px 2px rgba(11,27,43,.06);\n    --shadow-sm:0 1px 3px rgba(11,27,43,.08),0 1px 2px rgba(11,27,43,.04);\n    --shadow-md:0 6px 16px rgba(11,27,43,.08);\n    --shadow-lg:0 14px 32px rgba(11,27,43,.10);\n    --shadow-brand:0 12px 28px rgba(227,50,3,.26);\n    --ease:cubic-bezier(.2,0,0,1);\n  }\n  .lessons { display:grid; grid-template-columns:repeat(2,1fr); gap:16px; margin:30px 0 10px; }\n  .lesson { background:var(--white); border:1px solid var(--ink-200); border-radius:16px; padding:22px; box-shadow:var(--shadow-sm); transition:transform .2s var(--ease), box-shadow .2s var(--ease); }\n  .lesson:hover { transform:translateY(-3px); box-shadow:var(--shadow-md); }\n  .lesson h4 { font-size:16px; margin-bottom:8px; }\n  .lesson p { font-size:14px; color:var(--ink-600); line-height:1.55; }\n  @media (max-width:960px) {\n    .lessons { grid-template-columns:1fr; }\n  }\n<\/style>\n\n<div class=\"lessons\">\n  <div class=\"lesson\"><h4>A kontextus n\u00e9lk\u00fcli sz\u00e1mok hazudnak<\/h4><p>Ugyanaz az \u00f6sszeg az egyik k\u00f6rnyezetben zaj, a m\u00e1sikban a h\u00f3nap incidense. A nyers sz\u00e1mmal \u00f6sszehasonl\u00edtott k\u00fcsz\u00f6b a gyakorlatban \u201e1000 b\u00e1rmit\u201d jelent. Ez\u00e9rt minden \u00e9rt\u00e9ket az adott fi\u00f3k, annak l\u00e9pt\u00e9ke \u00e9s el\u0151zm\u00e9nyei kontextus\u00e1ba helyez\u00fcnk, \u00e9s az embereknek az \u00f6sszegeket abban a form\u00e1ban mutatjuk meg, ahogyan a sz\u00e1ml\u00e1kr\u00f3l ismerik.<\/p><\/div>\n  <div class=\"lesson\"><h4>Az adatok csendben romlanak el<\/h4><p>A k\u00fcl\u00f6nb\u00f6z\u0151 forr\u00e1sokb\u00f3l \u00e9s id\u0151szakokb\u00f3l sz\u00e1rmaz\u00f3 sz\u00e1ml\u00e1z\u00e1si adatok elrendez\u00e9s\u00fckben \u00e9s t\u00edpusaikban elt\u00e9rhetnek. Az a k\u00f3d, amely felt\u00e9telezi, hogy mindenhol ugyanaz, nem omlik \u00f6ssze semmilyen hib\u00e1val, csak csendben felcser\u00e9li a sz\u00e1mokat. Egy olyan rendszerben, amelyben az embereknek b\u00edzniuk kell, ez a legrosszabb hibat\u00edpus, \u00edgy n\u00e1lunk semmilyen felt\u00e9telez\u00e9s nem alap\u00e9rtelmezett az adatokr\u00f3l.<\/p><\/div>\n  <div class=\"lesson\"><h4>A riaszt\u00e1si f\u00e1radts\u00e1g is egyfajta ad\u00f3ss\u00e1g<\/h4><p>Minden felesleges riaszt\u00e1s cs\u00f6kkenti az \u00f6sszes k\u00f6vetkez\u0151kbe vetett bizalmat. Ez\u00e9rt a rendszer a spam elleni biztos\u00edt\u00e9kok eg\u00e9sz sor\u00e1t tartalmazza: deduplik\u00e1ci\u00f3t, cooldownokat, n\u00e9m\u00edt\u00e1st \u00e9s az epiz\u00f3dok automatikus lej\u00e1rati idej\u00e9t. Jelekre tervez\u00fcnk, nem volumenre.<\/p><\/div>\n  <div class=\"lesson\"><h4>A sz\u00e1ml\u00e1z\u00e1si adatok k\u00e9sve \u00e9rkeznek<\/h4><p>Az export sok \u00f3r\u00e1n \u00e1t \u201et\u00f6ltheti fel\u201d a napot. A j\u00faliusi k\u00e1rtya 4:30-kor a nap v\u00e9gs\u0151 z\u00e1r\u00e1s\u00e1n\u00e1l t\u00f6bbsz\u00f6r\u00f6sen alacsonyabb \u00f6sszeget mutatott, a sz\u00e1ml\u00e1l\u00f3 pedig m\u00e9g j\u00f3val a forgalom blokkol\u00e1sa ut\u00e1n is emelkedett. A rendszernek tudnia kell ezt, k\u00fcl\u00f6nben a k\u00e9sve \u00e9rkez\u0151 adatokat eszkal\u00e1ci\u00f3nak tekinten\u00e9, \u00e9s ok n\u00e9lk\u00fcl riasztan\u00e1 az embereket.<\/p><\/div>\n<\/div>\n\n\n\n<h2 id=\"h-egy-motor-ket-mukodesi-mod\" class=\"wp-block-heading\">Egy motor, k\u00e9t m\u0171k\u00f6d\u00e9si m\u00f3d<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ugyanaz az architekt\u00fara ma k\u00e9t m\u0171k\u00f6d\u00e9si m\u00f3dban fut.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Az els\u0151 a menedzselt szolg\u00e1ltat\u00e1s.<\/strong> Az \u00fcgyf\u00e9l k\u00f6rnyezet\u00e9t bevonjuk a monitoringunkba, a riaszt\u00e1sok p\u00e1rhuzamosan jutnak el a mi csapatunkhoz \u00e9s az \u00fcgyf\u00e9lhez, az anom\u00e1li\u00e1t egy adott \u00fcgyf\u00e9lmenedzser oszt\u00e1lyozza \u00e9s kezeli, \u00e9s ahol jogosults\u00e1gunk van, k\u00f6zvetlen\u00fcl reag\u00e1lunk az egyszer\u0171 eszkal\u00e1ci\u00f3 helyett. A j\u00faliusi t\u00f6rt\u00e9net megmutatja, hol h\u00faz\u00f3dik ez a hat\u00e1r: jogosults\u00e1gok n\u00e9lk\u00fcl m\u00e9g a legjobb detekt\u00e1l\u00e1s is a k\u00f6rnyezet tulajdonos\u00e1nak felh\u00edv\u00e1s\u00e1val v\u00e9gz\u0151dik.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A m\u00e1sodik m\u00f3d k\u00f6zvetlen\u00fcl a fel\u00e9p\u00edt\u00e9sb\u0151l k\u00f6vetkezik.<\/strong> Mivel a motor \u00e1llapotmentes \u00e9s kiz\u00e1r\u00f3lag a BigQuerybe t\u00f6rt\u00e9n\u0151 szabv\u00e1nyos sz\u00e1ml\u00e1z\u00e1si exportra t\u00e1maszkodik, b\u00e1rmilyen Google Cloud k\u00f6rnyezetben fel\u00e1ll\u00edthat\u00f3, m\u00e9g olyanban is, amelyet napi szinten nem mi \u00fczemeltet\u00fcnk. Egy ilyen telep\u00edt\u00e9sn\u00e9l a riaszt\u00e1sok k\u00f6r\u00e9t a teljes sz\u00e1ml\u00e1z\u00e1si fi\u00f3kr\u00f3l a projektek n\u00e9zet\u00e9re sz\u0171k\u00edtj\u00fck. Minden csapat a saj\u00e1t projektjeinek anom\u00e1li\u00e1it l\u00e1tja, saj\u00e1t k\u00fcsz\u00f6b\u00f6kkel \u00e9s \u00e9rtes\u00edt\u00e9si csatorn\u00e1kkal. A Chat, az e-mail vagy a webhook a rendszer szemsz\u00f6g\u00e9b\u0151l cser\u00e9lhet\u0151 adapterek. Minden m\u00e1s, az SQL-ablakokt\u00f3l az epiz\u00f3d \u00e9letciklus\u00e1ig, mindk\u00e9t m\u00f3dban azonos m\u00f3don m\u0171k\u00f6dik.<\/p>\n\n\n\n<h2 id=\"h-mit-jelent-ez-az-on-kornyezetere-nezve\" class=\"wp-block-heading\">Mit jelent ez az \u00d6n k\u00f6rnyezet\u00e9re n\u00e9zve<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ak\u00e1r saj\u00e1t megold\u00e1st fejleszt, ak\u00e1r nem, n\u00e9h\u00e1ny alapelv k\u00f6zvetlen\u00fcl alkalmazhat\u00f3. A kiindul\u00e1si alapnak a t\u00e9nyleges haszn\u00e1lati mint\u00e1zatokon kell alapulnia, \u00e9s fi\u00f3konk\u00e9nt k\u00fcl\u00f6n kell meghat\u00e1rozni, hiszen egy univerz\u00e1lis hat\u00e1r\u00e9rt\u00e9k minden k\u00f6rnyezetre csup\u00e1n ill\u00fazi\u00f3. A riaszt\u00e1soknak teljes \u00e9letciklust kell lefedni\u00fck: a v\u00e1rakoztat\u00e1s, a duplik\u00e1ci\u00f3mentes\u00edt\u00e9s \u00e9s az automatikus lez\u00e1r\u00e1s hi\u00e1ny\u00e1ban a rendszer hetek alatt elvesz\u00edti a hiteless\u00e9g\u00e9t. A statisztika csup\u00e1n felder\u00edt, a d\u00f6nt\u00e9s a kontextus \u2013 vagyis az anom\u00e1lia adott \u00fcgyf\u00e9lhez, felel\u0151sh\u00f6z \u00e9s szolg\u00e1ltat\u00e1shoz rendel\u00e9se \u2013 alapj\u00e1n sz\u00fcletik meg. V\u00e9g\u00fcl a legegyszer\u0171bb, m\u00e9gis legfontosabb igazs\u00e1g: a k\u00f6lts\u00e9g val\u00f3j\u00e1ban biztons\u00e1gi adat. A p\u00e9nz\u00fcgy havonta egyszer n\u00e9z r\u00e1, a fel\u00fcgyeletnek viszont meg\u00e1ll\u00e1s n\u00e9lk\u00fcl futnia kell.<\/p>\n\n\n\n<style data-wp-block-html=\"css\">\n:root {\n    --red-50:#FDEBE6; --red-100:#FBD2C6; --red-400:#EA5528; --red-500:#E33203; --red-600:#C22B03; --red-700:#9B2202;\n    --blue-50:#E6F2FF; --blue-100:#CCE5FF; --blue-300:#66AFFF; --blue-500:#007BFF; --blue-600:#0069D9; --blue-700:#0056B3;\n    --sky-100:#DEF3FE; --sky-500:#17A2B8;\n    --ink-900:#212529; --ink-800:#343A40; --ink-700:#495057; --ink-600:#6C757D; --ink-500:#868E96;\n    --ink-300:#CED4DA; --ink-200:#DEE2E6; --ink-100:#E9ECEF; --ink-50:#F8F9FA; --white:#FFFFFF;\n    --green-500:#28A745; --amber-500:#FFC107; --danger-500:#DC3545;\n    --font-sans:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif;\n    --font-mono:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;\n    --shadow-xs:0 1px 2px rgba(11,27,43,.06);\n    --shadow-sm:0 1px 3px rgba(11,27,43,.08),0 1px 2px rgba(11,27,43,.04);\n    --shadow-md:0 6px 16px rgba(11,27,43,.08);\n    --shadow-lg:0 14px 32px rgba(11,27,43,.10);\n    --shadow-brand:0 12px 28px rgba(227,50,3,.26);\n    --ease:cubic-bezier(.2,0,0,1);\n  }  \n  .callout { border-left:4px solid var(--red-500); background:var(--red-50); border-radius:0 12px 12px 0; padding:18px 22px; margin:28px 0; font-size:16px; color:var(--ink-800); }\n  .callout--blue { border-left-color:var(--blue-500); background:var(--blue-50); }\n<\/style>\n\n<div class=\"callout callout--blue\">Az els\u0151 ciklusban \u00e9szlelt k\u00f6lts\u00e9ganom\u00e1lia egy k\u00e9rd\u00e9s az \u00fcgyf\u00e9lhez. A sz\u00e1ml\u00e1n \u00e9szlelt anom\u00e1lia vita a felh\u0151szolg\u00e1ltat\u00f3val \u00e9s elvesz\u00edtett \u00e1rr\u00e9s.<\/div>\n","protected":false},"excerpt":{"rendered":"<p>2026 tavasz\u00e1n k\u00e9t c\u00e9g is ugyanannak a t\u00e1mad\u00e1si t\u00edpusnak esett \u00e1ldozatul: ellopott hiteles\u00edt\u0151 adatok, idegen API-kulcsok \u00e9s egy hatalmas Gemini-fogyaszt\u00e1st tartalmaz\u00f3 sz\u00e1mla. Az els\u0151 incidens f\u00e9lmilli\u00f3 eur\u00f3s sz\u00e1ml\u00e1val z\u00e1rult. A m\u00e1sodik, k\u00e9t h\u00f3nappal k\u00e9s\u0151bb, egy m\u00e1r a monitoringunk alatt \u00e1ll\u00f3 k\u00f6rnyezetet \u00e9rt, \u00e9s n\u00e9h\u00e1ny \u00f3r\u00e1n bel\u00fcl meg\u00e1ll\u00edtottuk. Ez az \u00edr\u00e1s arr\u00f3l sz\u00f3l, mit \u00e9p\u00edtett\u00fcnk e&#8230;<\/p>\n","protected":false},"author":40,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","footnotes":""},"categories":[561],"tags":[],"class_list":["post-173946","post","type-post","status-publish","format-standard","hentry","category-google-cloud-platform-hu"],"_links":{"self":[{"href":"https:\/\/fotc.com\/hu\/wp-json\/wp\/v2\/posts\/173946","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fotc.com\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fotc.com\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fotc.com\/hu\/wp-json\/wp\/v2\/users\/40"}],"replies":[{"embeddable":true,"href":"https:\/\/fotc.com\/hu\/wp-json\/wp\/v2\/comments?post=173946"}],"version-history":[{"count":0,"href":"https:\/\/fotc.com\/hu\/wp-json\/wp\/v2\/posts\/173946\/revisions"}],"wp:attachment":[{"href":"https:\/\/fotc.com\/hu\/wp-json\/wp\/v2\/media?parent=173946"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fotc.com\/hu\/wp-json\/wp\/v2\/categories?post=173946"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fotc.com\/hu\/wp-json\/wp\/v2\/tags?post=173946"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}