---
title: 'Uygulamaya Özgü Tespit Senaryoları'
source: 'https://academia.sh/tr/kurslar/uygulama-tespit-ve-uyumluluk/uygulamaya-ozgu-tespit-senaryolari'
course: 'Tespit, Müdahale ve Uyumluluk'
language: tr
updated: '2026-08-17T18:06:41+00:00'
license: 'CC BY-SA 4.0'
---

# 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.

Ö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ı

```js
// 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.

```js
// 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.
