Ders 02 / 09
Uygulamaya Özgü Tespit Senaryoları
900 oturumluk bir olay akışında 18 kötüye kullanım oturumu dört tespit senaryosuyla aranıyor. Tek tek eşik taraması her ölçüde aynı takası veriyor: reddedilen yetki eşiği 3'te 364 yanlış uyarı ve 211 mesai dışı uyandırma, 25'te sıfır yanlış ama sıfır yakalama. Dört senaryo birlikte seçildiğinde 25 yanlış uyarı bütçesi 18 oturumun 8'ini, 180 bütçesi 18'ini yakalıyor — ikincisi 30 günde 101 gece uyandırması demek. Bölge dışı okuma alanı yazılmadığında aynı bütçede yakalanan 15'ten 13'e iniyor.
İçindekiler
Önceki ders kaydı olaydan sonra sorgulayan tarafı ölçtü: on altı sorunun kaçının cevabı şemada vardı. Aynı kayıtların ikinci bir işi daha var — soruyu doğuran olayı, olay sürerken haber vermek. Uygulama düzeyinde bu iş, ağ düzeyindekine benzemez. Kötüye kullanan taraf geçerli bir oturumla, geçerli uç noktalara, çoğu zaman olumlu yetki kararı alarak istek yapar; anormal olan protokol değil, iş kuralının ölçtüğü bir sayıdır.
Bu ders o sayıların üzerine kurulan tespit senaryolarını kurgu bir olay akışında koşturur. Tespit hattının mimarisi, olayların normalleştirilmesi ve bağıntı kuralı Güvenlik Operasyonları ve Olay Müdahalesi kursunda ölçülmüştü; burada tekrarlanmaz, girdi olur. Ölçülen tek şey eşik seçiminin iki bedelidir: kaç kötüye kullanım oturumu kaçıyor ve kaç kez boşuna uyandırılıyor.
- UM7. Olay akışı kurgudur: abone portalında 30 günde 900 oturum, dört rol ve dört kötüye kullanım sınıfı. Sayılar tohumu görünen bir üreteçten gelir.
- UM8. Tespit senaryosu, tek bir uygulama ölçüsü üzerine kurulan eşik kuralıdır. Ölçüler iş mantığından okunur: oturumda okunan farklı abone kaydı, reddedilen yetki kararı sayısı, aynı istemci adresinden denenen farklı hesap ve hesabın yetkili bölgesi dışında okunan kayıt.
- UM9. Bir uyarı gerçek sayılır ancak oturum kötüye kullanım oturumuysa; değilse yanlış uyarıdır. Mesai saatleri 08–18 kabul edilir; bu aralığın dışındaki yanlış uyarı bir uyandırmadır ve ayrı sayılır.
- UM10. Normal oturumların yüzde sekizi “gün sonu toplu işi” gibi ağır kuyruk üretir. Bu kuyruk hiçbir kuralın kaldıramadığı örtüşmenin kaynağıdır.
- UM11. Bölge dışı okuma ölçüsü, önceki dersin şemasında olmayan bir alana dayanır. Alan yazılmazsa senaryo kurulamaz; bu, kayıt tasarımının tespit tarafındaki karşılığıdır.
Tek Ölçüde Eşik Taraması
// akis.mjs — uygulama olay akisi uretilir ve is mantigina dayali tespit senaryolari // esik esik kosturulur. MODELDIR: oturumlar da kotuye kullanim da kurgudur. export const TOHUM = 20260418, OTURUM = 900, GUN = 30; const uretec = (t) => { let s = t >>> 0; return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; }; const r = uretec(TOHUM); // v < 0.08 olan oturum "gun sonu toplu isi" gibi normal ama agir bir kuyruk uretir. const say = (ort, u, v = 1) => Math.round(ort * (0.35 + 1.3 * u) * (v < 0.08 ? 3.5 : 1)); // Rol = hesabin normal is hacmi. Entegrasyon hesabi normalde de yuksek hacimlidir. const ROL = [ { ad: "abone temsilcisi", pay: 0.42, okuma: 12, ret: 2.4, adres: 1.4, bolge: 0.3 }, { ad: "saha teknisyeni", pay: 0.28, okuma: 6, ret: 3.0, adres: 1.2, bolge: 0.5 }, { ad: "entegrasyon hesabi", pay: 0.12, okuma: 140, ret: 1.0, adres: 2.2, bolge: 2.5 }, { ad: "abone", pay: 0.18, okuma: 1, ret: 1.6, adres: 1.6, bolge: 0.0 }, ]; const rolSec = (u) => { let t = 0; for (const x of ROL) { t += x.pay; if (u < t) return x; } return ROL.at(-1); }; // Kotuye kullanim sinifi = oturumun hangi olcusunu normalin disina tasidigi. export const KOTU = [ { ad: "toplu okuma", adet: 6, uygula: (o, u) => { o.okuma = say(300, u); } }, { ad: "yetki tarama", adet: 4, uygula: (o, u) => { o.ret = say(18, u); } }, { ad: "bolge disi sizinti", adet: 5, uygula: (o, u) => { o.bolge = say(12, u); } }, { ad: "hesap devralma", adet: 3, uygula: (o, u) => { o.adres = say(6, u); } }, ]; export const OTURUMLAR = Array.from({ length: OTURUM }, (_, i) => { const rol = rolSec(r()), saat = Math.floor(r() * 24), kuyruk = r(); return { i, rol: rol.ad, saat, kotu: null, okuma: say(rol.okuma, r(), kuyruk), ret: say(rol.ret, r(), kuyruk), adres: say(rol.adres, r(), kuyruk), bolge: say(rol.bolge, r(), kuyruk) }; }); for (const k of KOTU) for (let n = 0; n < k.adet; n++) { const o = OTURUMLAR[Math.floor(r() * OTURUM)]; o.kotu = k.ad; k.uygula(o, r()); } export const KOTU_TOPLAM = OTURUMLAR.filter((o) => o.kotu).length; // Senaryo = tek bir uygulama olcusu uzerine kurulan esik kurali. export const SENARYO = [ { ad: "farkli kayit okuma", olcu: "okuma", hedef: "toplu okuma", esik: [40, 80, 150, 260] }, { ad: "reddedilen yetki", olcu: "ret", hedef: "yetki tarama", esik: [3, 6, 12, 25] }, { ad: "adres basina hesap", olcu: "adres", hedef: "hesap devralma", esik: [2, 3, 5, 7] }, { ad: "bolge disi okuma", olcu: "bolge", hedef: "bolge disi sizinti", esik: [2, 4, 8, 12] }, ]; const mesaiDisi = (o) => o.saat < 8 || o.saat >= 18; export function kosuf(s, t) { const uyari = OTURUMLAR.filter((o) => o[s.olcu] >= t); const yanlis = uyari.filter((o) => !o.kotu); return { esik: t, uyari: uyari.length, gercek: uyari.filter((o) => o.kotu).length, hedefYakalanan: uyari.filter((o) => o.kotu === s.hedef).length, hedefToplam: KOTU.find((k) => k.ad === s.hedef).adet, yanlis: yanlis.length, uyandirma: yanlis.filter(mesaiDisi).length }; } export const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join(""); if (import.meta.url === `file://${process.argv[1]}`) { console.log(`model (tohum ${TOHUM}): ${OTURUM} oturum, ${GUN} gun, ` + `${KOTU_TOPLAM} kotuye kullanim oturumu`); console.log("rol dagilimi: " + ROL.map((x) => `${x.ad} ${OTURUMLAR.filter((o) => o.rol === x.ad).length}`).join(", ")); const y = gen([20, 7, 7, 10, 8, 11, 12]); console.log("\n" + y(["senaryo", "esik", "uyari", "kacirilan", "gercek", "yanlis+", "uyandirma"])); for (const s of SENARYO) for (const t of s.esik) { const o = kosuf(s, t); console.log(y([s.ad, t, o.uyari, o.hedefToplam - o.hedefYakalanan, o.gercek, o.yanlis, o.uyandirma])); } }
model (tohum 20260418): 900 oturum, 30 gun, 18 kotuye kullanim oturumu rol dagilimi: abone temsilcisi 388, saha teknisyeni 229, entegrasyon hesabi 120, abone 163 senaryo esik uyari kacirilan gercek yanlis+ uyandirma farkli kayit okuma 40 149 0 7 142 83 farkli kayit okuma 80 110 0 7 103 60 farkli kayit okuma 150 58 1 6 52 29 farkli kayit okuma 260 10 2 4 6 5 reddedilen yetki 3 377 0 13 364 211 reddedilen yetki 6 49 0 5 44 28 reddedilen yetki 12 17 0 4 13 6 reddedilen yetki 25 0 4 0 0 0 adres basina hesap 2 467 0 12 455 261 adres basina hesap 3 115 0 6 109 65 adres basina hesap 5 43 1 4 39 25 adres basina hesap 7 20 2 2 18 14 bolge disi okuma 2 127 0 5 122 68 bolge disi okuma 4 41 0 5 36 21 bolge disi okuma 8 7 2 3 4 3 bolge disi okuma 12 3 4 1 2 1
Dört senaryo da aynı biçimi çiziyor: eşik yükseldikçe kaçırılan artıyor, yanlış uyarı düşüyor. İlginç olan bu eğrinin nerede durduğudur. Reddedilen yetki senaryosunun 3 eşiği 377 uyarı üretiyor ve bunların 364’ü yanlış; 211’i mesai dışında geliyor, yani 30 günde 211 gece uyandırması. Aynı senaryonun 25 eşiği sıfır yanlış uyarı verir ve dört kötüye kullanım oturumunun dördünü birden kaçırır. Bir ucunda kimsenin okumadığı bir uyarı akışı, öbür ucunda hiç uyarı vermeyen bir kural var; ikisi de aynı kuralın iki ayarıdır.
Farklı kayıt okuma senaryosu, örtüşmenin neden ayar hatasından gelmediğini gösteriyor. Entegrasyon hesapları normal işlerinde ortalama 140 farklı kayıt okur; toplu okuma yapan kötüye kullanım oturumu ortalama 300 okur. İki dağılım örtüşür. Eşik 260’a çekildiğinde yanlış uyarı 6’ya iner ama altı toplu okuma oturumunun ikisi kaçar. Örtüşmeyi doğuran şey aracın kalitesi değil, normalin kendisidir: aynı ölçüde meşru olarak yüksek çalışan bir rol vardır ve o rolü kuraldan çıkarmak, kötüye kullanımın en kolay saklanacağı yeri kuralın dışında bırakmak demektir.
Bölge dışı okuma senaryosu bu tabloda ayrı durur. Ölçüsü bir hacim değil bir kural ihlalidir: hesabın yetkili bölgesi dışındaki kayda dokunması. Bu yüzden 8 eşiğinde yalnız 4 yanlış uyarıyla üç sızıntı oturumu yakalar; aynı akışta adres başına hesap ölçüsü dört gerçek uyarı için 39 yanlış uyarı öder. Ayrım kuralın sıkılığından değil ölçünün seçiminden gelir: bir iş kuralına dayanan ölçü, normal ile anormali dağılımın kuyruğunda değil tanımında ayırır. Kuyruğa hâlâ bağımlıdır — 12 eşiğinde beş oturumun dördü kaçar — ama aynı ayrım gücünü çok daha ucuza verir.
Ağır kuyruk aynı olguyu bütün rollere yayar. Oturumların yüzde sekizi normal ama üç buçuk kat yoğun bir gün sonu işi yapar. Adres başına hesap senaryosunun 2 eşiğinde 467 oturum uyarı üretiyor — akışın yarısından fazlası. Bu eşik “duyarlı” değildir; ölçünün ayrım gücünün bulunmadığı bir noktada durur ve kuralın çıktısını rastgele bir nüfus örneklemine çevirir.
Eşikleri Birlikte Seçmek
Senaryolar tek tek ayarlanmaz. Nöbetteki kişiye dört kuralın çıktısı birlikte gider; bedel de birlikte doğar.
// esik.mjs — dort senaryonun esikleri birlikte secilir: yanlis uyari butcesi altinda // en cok kotuye kullanim oturumu yakalayan esik takimi aranir. MODELDIR. import { OTURUMLAR, SENARYO, KOTU, KOTU_TOPLAM, gen } from "./akis.mjs"; const mesaiDisi = (o) => o.saat < 8 || o.saat >= 18; function takim(esikler, senaryolar = SENARYO) { const uyari = OTURUMLAR.filter((o) => senaryolar.some((s, j) => o[s.olcu] >= esikler[j])); const yanlis = uyari.filter((o) => !o.kotu); return { uyari: uyari.length, yakalanan: uyari.filter((o) => o.kotu).length, yanlis: yanlis.length, uyandirma: yanlis.filter(mesaiDisi).length, sinif: KOTU.map((k) => uyari.filter((o) => o.kotu === k.ad).length) }; } function enIyi(butce, senaryolar = SENARYO) { const listeler = senaryolar.map((s) => s.esik); let en = null; const gez = (j, secim) => { if (j === listeler.length) { const o = takim(secim, senaryolar); if (o.yanlis > butce) return; if (!en || o.yakalanan > en.o.yakalanan || (o.yakalanan === en.o.yakalanan && o.yanlis < en.o.yanlis)) en = { secim: [...secim], o }; return; } for (const t of listeler[j]) gez(j + 1, [...secim, t]); }; gez(0, []); return en; } const y = gen([9, 18, 8, 12, 12, 10, 12, 15]); console.log(y(["butce", "secilen esikler", "uyari", "yakalanan", "kacirilan", "yanlis+", "uyandirma", "yanlis/gercek"])); for (const b of [25, 50, 100, 180, 400]) { const e = enIyi(b); console.log(y([b, e.secim.join(" "), e.o.uyari, `${e.o.yakalanan}/${KOTU_TOPLAM}`, KOTU_TOPLAM - e.o.yakalanan, e.o.yanlis, e.o.uyandirma, (e.o.yanlis / e.o.yakalanan).toFixed(1)])); } const tam = enIyi(100), sinif = KOTU.map((k, i) => `${k.ad} ${tam.o.sinif[i]}/${k.adet}`); console.log(`\nbutce 100'deki takimin sinif dagilimi: ${sinif.join(", ")}`); // bolge alani yazilmiyorsa dorduncu senaryo hic kurulamaz. const uc = SENARYO.slice(0, 3), uce = enIyi(100, uc); console.log(`bolge alani olmadan ayni butcede: yakalanan ${uce.o.yakalanan}/${KOTU_TOPLAM}, ` + `bolge disi sizintidan ${uce.o.sinif[2]}/${KOTU[2].adet}`); // Alanin bedeli onceki dersin modelinden: 42e6 olay/gun, uygulama denetim kaydi payi 0.18, // gunluk 9.55 GB ve 600 GB butce (surum alani eklenmis sema). const GUN_OLAY = 42e6, PAY = 0.18, TABAN = 9.55248e9, BUTCE = 600e9, BOLGE_BAYT = 14; const yeni = TABAN + GUN_OLAY * PAY * BOLGE_BAYT; console.log(`bolge alani ${BOLGE_BAYT} bayt: gunluk ${(TABAN / 1e9).toFixed(2)} GB -> ` + `${(yeni / 1e9).toFixed(2)} GB (yuzde ${((yeni / TABAN - 1) * 100).toFixed(1)}), ` + `saklama ${Math.floor(BUTCE / TABAN)} -> ${Math.floor(BUTCE / yeni)} gun`);
butce secilen esikler uyari yakalanan kacirilan yanlis+ uyandirma yanlis/gercek 25 260 25 7 8 29 8/18 10 21 17 2.6 50 260 12 5 8 56 13/18 5 43 27 3.3 100 260 12 5 4 87 15/18 3 72 43 4.8 180 80 12 3 4 191 18/18 0 173 101 9.6 400 80 12 3 4 191 18/18 0 173 101 9.6 butce 100'deki takimin sinif dagilimi: toplu okuma 4/6, yetki tarama 4/4, bolge disi sizinti 5/5, hesap devralma 2/3 bolge alani olmadan ayni butcede: yakalanan 13/18, bolge disi sizintidan 2/5 bolge alani 14 bayt: gunluk 9.55 GB -> 9.66 GB (yuzde 1.1), saklama 62 -> 62 gun
Tablo eşik seçiminin bir ayar değil bir satın alma olduğunu yazıyor. On sekiz oturumun tamamını yakalayan bir takım vardır ve fiyatı bellidir: 173 yanlış uyarı ve 30 günde 101 gece uyandırması, yani her gece ortalama 3,4 kez. Yakalanan oturum başına 9,6 yanlış uyarı düşer. Aynı akışta 100 bütçeli takım 18’in 15’ini yakalar ve uyandırmayı 43’e indirir; üç oturum kaçar. Hangisinin doğru olduğu bu tablodan okunmaz — okunacak olan, her iki kararın da bir sayı karşılığında verildiğidir. Bütçe 180’den 400’e çıkarıldığında satır değişmez; ölçünün ayrım gücü tükenmiştir ve daha çok yanlış uyarıya razı olmak artık hiçbir şey yakalatmaz.
Sınıf dağılımı ikinci bir ayrım getiriyor. Bütçe 100’deki takım yetki taramanın dördünü de, bölge dışı sızıntının beşini de yakalar; kaçırdığı üç oturum toplu okuma ve hesap devralma sınıflarındandır — yani normalin en geniş olduğu ölçülerde. Kaçırılan oturum sayısı bir toplamdır; hangi sınıftan kaçtığı ayrı bilgidir ve karar ancak o ayrıntıyla verilir.
Son iki satır bu dersi öncekine bağlıyor. Bölge dışı okuma senaryosu, önceki dersin şemasında bulunmayan bir alana dayanır. Alan yazılmadığında senaryo hiçbir eşikte kurulamaz: aynı bütçede yakalanan 15’ten 13’e iner ve beş sızıntı oturumunun yalnız ikisi, başka ölçülerde tesadüfen yüksek çıktığı için görülür. Kayıtta olmayan bir alan, bir tespit senaryosunun eşiğini değil varlığını ortadan kaldırır. Alanın kayıt bedeli küçüktür — günlük hacimde yüzde 1,1 artış, saklamada bir günün altında bir kayıp. Asıl bedeli başka yerdedir: kural, hesabın yetkili bölge listesini gerektirir; bu liste bir personel atama verisidir ve kayıt kümesine dördüncü bir kişisel veri kalemi olarak girer.
Özet
- Uygulamaya özgü tespit, protokol anormalliğine değil iş kuralının ölçtüğü bir sayıya bakar: okunan farklı kayıt, reddedilen yetki, adres başına hesap, bölge dışı okuma.
- Her eşik aynı takası verir ve iki uç da işlevsizdir: reddedilen yetki eşiği 3’te 364 yanlış uyarı ve 211 uyandırma, 25’te sıfır yanlış ve dört oturumun dördü birden kaçırılmış.
- Örtüşmenin kaynağı aracın kalitesi değil normalin kendisidir: entegrasyon hesapları meşru olarak yüksek hacimlidir ve oturumların yüzde sekizi ağır kuyruk üretir.
- Eşikler birlikte seçilir ve fiyat birlikte doğar: 18 oturumun tamamı 173 yanlış uyarı ve 30 günde 101 uyandırmayla, 15’i 72 yanlış uyarı ve 43 uyandırmayla yakalanır.
- Kaçırılan oturumun sayısı kadar sınıfı da bilgidir: kaçan üç oturum normalin en geniş olduğu iki ölçüdendir.
- Kayıtta olmayan alan senaryonun eşiğini değil varlığını kaldırır: bölge alanı yazılmadığında yakalanan 15’ten 13’e iner, bedeli ise yüzde 1,1 hacim ve dördüncü bir kişisel veri kalemidir.
Sonraki Adım
Bu dersin sonunda elde bir uyarı vardır ve uyarı doğrudur: bir oturum abone kayıtlarını yetkisiz okumuştur. Uyarının ilk dakikasında sorulacak sorular öncekilerden farklıdır, çünkü artık cevap bir raporu değil bir kararı besler — hesap kapatılacak mı, hangi abonelerin verisi görülmüştür, sızma nereden başlamıştır. Sonraki ders bu uygulama ihlali senaryosunda müdahale adımlarını koşturur ve tek bir şeyi ölçer: hangi adım hangi kayda ihtiyaç duyuyor, o kayıt yoksa adım kaç dakika uzuyor ve hangi adım hiç tamamlanamıyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.