---
title: 'Uygulama Düzeyinde Anormallik Tespiti'
source: 'https://academia.sh/tr/kurslar/calisma-zamani-guvenligi/uygulama-duzeyinde-anormallik-tespiti'
course: 'Çalışma Zamanı Güvenliği ve Sır Yönetimi'
language: tr
updated: '2026-08-17T18:06:41+00:00'
license: 'CC BY-SA 4.0'
---

# Uygulama Düzeyinde Anormallik Tespiti

Rol taban çizgisine göre puanlanan yedi oturumun kırk beş dakikalık davranış kaydında koşturulması ve işaretleme eşiğinin dört ayarda karşılaştırılması: sapmanın başladığı dakika ile işaretin düştüğü dakika arasındaki gecikme, o gecikmede dışarı çıkan kayıt sayısı, yavaş sapan iç tehdit oturumu ile fatura dönemindeki meşru analist oturumunun puan farkı ve aynı sızıntının tasarım aşamasında kaç kayıt önce kapatıldığı.

Önceki dört ders isteğe baktı: kural kümesi biçime, hız sayacı sayıya, eşikler hesaba ve adrese,
başlıklar yanıta. Dördü de kararını tek bir istek ya da tek bir yanıt üzerinde verdi. Birinci
dersten beri hiçbir ayarda durdurulamayan kalem de tam bu yüzden kaçtı: iş akışı dışı toplu
indirmenin istekleri tek tek kusursuzdu, kimliği doğrulanmıştı, yetkisi vardı. Yanlış olan tek
şey aynı oturumun isteklerinin **birlikte çizdiği şekildi**.

Bu ders savunmayı isteğin dışına çıkarıp oturumun davranışına taşıyor. Ölçü de değişiyor:
durdurulan istek yerine **gecikme** sayılıyor — sapma başladıktan kaç dakika sonra işaret düşüyor
ve o dakikalarda ne kadar veri dışarı çıkıyor. Bu katman bir isteği engellemez; bir oturumu geç
ya da erken işaretler.

## Taban Çizgisi ve Anormallik Puanı

Aşağıdaki her şey `node` ile kurulan bir modeldir; gerçek bir oturum kaydı okunmuyor ve hiçbir
oturum ele geçirme yöntemi yazılmıyor. Ele geçmiş oturumlar yalnız davranış vektörleriyle,
yani dakikadaki istek, benzersiz uç, kayıt ve ilk kez görülen uç sayısıyla temsil ediliyor.

- **US21.** Yedi oturum, üç rol taban çizgisi ve kırk beş dakikalık pencere kurgusal ölçüm ağına
  aittir. Taban çizgisi otuz günlük olağan davranışın ortalaması olarak veriliyor.
- **US22.** Puan, her özelliğin taban çizgisine oranından türer ve özellik başına sapma payı iki
  birimle sınırlanır. Tavan olmasaydı tek bir uç değer oturumu anında işaretlerdi; gerçek
  puanlama düzeneklerinde de böyle bir doyum vardır.
- **US23.** İşaret, son beş dakikanın puan toplamı eşiği aştığında düşer. Yığın penceresi
  sabittir; değişen tek şey eşiktir.
- **US24.** Meşru oturumlardan ikisi kasten olağan dışıdır: fatura dönemindeki analistin kayıt
  hacmi taban çizgisinin iki buçuk katına çıkıyor, yeni başlayan saha teknisyeninin ise ilk kez
  görülen uç sayısı yüksek. İkisi de yanlış işaret adayıdır.
- **US25.** "Daha erken kapatma aşaması" sütunu her kötü oturum için elle işaretlendi.

```js
// davranis.mjs — kirk bes dakikalik oturum davranis kaydi ve anormallik puanlamasi; model
export const SURE = 45;
export const OZELLIK = ['istek/dk', 'benzersiz uc', 'kayit/dk', 'ilk kez gorulen uc'];
export const AGIRLIK = [1, 1.5, 2, 2.5];
export const TAVAN = 2;   // ozellik basina sapma payi tavani

// rol taban cizgisi: otuz gunluk olagan davranistan cikarilmis ortalama
export const TABAN = {
  abone: [4, 3, 12, 0.2],
  saha: [9, 5, 40, 0.4],
  analist: [6, 7, 300, 0.3],
};

// [oturum, rol, gercek sinif, sapma dakikasi, sapma carpanlari, kac dakikada tam carpan, erken asama]
export const OTURUM = [
  ['abone-3391', 'abone', 'mesru', Infinity, [1, 1, 1, 1], 1, '-'],
  ['saha-12, vardiya', 'saha', 'mesru', Infinity, [1, 1, 1, 1], 1, '-'],
  ['analist-4, fatura donemi', 'analist', 'mesru', 0, [1.2, 1.1, 2.6, 1.3], 4, '-'],
  ['saha-58, yeni baslayan', 'saha', 'mesru', 0, [0.8, 1.8, 0.9, 6.0], 3, '-'],
  ['abone-8842, ele gecmis', 'abone', 'kotu', 12, [3.5, 2.5, 22, 5], 3, 'kod'],
  ['analist-9, ic tehdit', 'analist', 'kotu', 8, [1.4, 1.3, 2.2, 1.5], 12, 'tasarim'],
  ['saha-31, calinan jeton', 'saha', 'kotu', 20, [2.2, 4.4, 3.5, 9], 2, 'yok'],
];

// bir oturumun dakika dakika ozellik vektoru
export function kayit(o) {
  const [, rol, , sapma, carpan, ramp] = o, t0 = TABAN[rol], d = [];
  for (let t = 0; t < SURE; t++) {
    const f = t < sapma ? 0 : Math.min(1, (t - sapma + 1) / ramp);
    d.push(t0.map((b, i) => b * (1 + (carpan[i] - 1) * f)));
  }
  return d;
}

export const puan = (v, rol) =>
  v.reduce((t, x, i) => t + AGIRLIK[i] * Math.min(TAVAN, Math.max(0, x / TABAN[rol][i] - 1)), 0);

export const yigin = (o, pen = 5) => {
  const p = kayit(o).map((v) => puan(v, o[1]));
  return p.map((_, t) => p.slice(Math.max(0, t - pen + 1), t + 1).reduce((x, y) => x + y, 0));
};

// son `pen` dakikanin puan toplami esigi asinca oturum isaretlenir
export function isaretle(o, esik, pen = 5) {
  const d = kayit(o), p = d.map((v) => puan(v, o[1]));
  for (let t = 0; t < SURE; t++) {
    const yig = p.slice(Math.max(0, t - pen + 1), t + 1).reduce((x, y) => x + y, 0);
    if (yig >= esik) {
      const bas = Number.isFinite(o[3]) ? o[3] : 0;
      const kayitSayisi = d.slice(bas, t + 1).reduce((x, v) => x + v[2], 0);
      return { dakika: t, gecikme: t - bas, kayitSayisi: Math.round(kayitSayisi) };
    }
  }
  return null;
}
```

## Kaç Dakika Gecikmeyle

```js
// kosum.mjs — ayni davranis kaydi, degisen tek sey isaretleme esigi
import { SURE, OTURUM, kayit, puan, yigin, isaretle } from './davranis.mjs';

const s = (x, n) => String(x).padStart(n);
console.log(`${OTURUM.length} oturum, ${SURE} dakika, 3 rol taban cizgisi\n`);
console.log(`${'oturum'.padEnd(26)}${s('rol', 9)}${s('sinif', 7)}${s('sapma dk', 10)}` +
  `${s('en yuksek dk puani', 20)}${s('en yuksek yigin', 17)}${s('toplam kayit', 14)}${s('erken asama', 13)}`);
for (const o of OTURUM) {
  const d = kayit(o), p = d.map((v) => puan(v, o[1]));
  console.log(`${o[0].padEnd(26)}${s(o[1], 9)}${s(o[2], 7)}` +
    `${s(Number.isFinite(o[3]) ? o[3] : '-', 10)}${s(Math.max(...p).toFixed(2), 20)}` +
    `${s(Math.max(...yigin(o)).toFixed(1), 17)}` +
    `${s(Math.round(d.reduce((x, v) => x + v[2], 0)), 14)}${s(o[6], 13)}`);
}

console.log(`\n${'esik'.padEnd(6)}${s('isaretlenen kotu', 18)}${s('kacirilan kotu', 16)}` +
  `${s('yanlis isaretlenen', 20)}${s('ortalama gecikme dk', 21)}${s('gecikmede inen kayit', 22)}`);
const K = OTURUM.filter((o) => o[2] === 'kotu'), M = OTURUM.filter((o) => o[2] === 'mesru');
for (const esik of [40, 30, 20, 12]) {
  const ik = K.filter((o) => isaretle(o, esik)), im = M.filter((o) => isaretle(o, esik));
  const g = ik.map((o) => isaretle(o, esik));
  console.log(`${String(esik).padEnd(6)}${s(`${ik.length}/${K.length}`, 18)}` +
    `${s(K.length - ik.length, 16)}${s(`${im.length}/${M.length}`, 20)}` +
    `${s((g.reduce((x, r) => x + r.gecikme, 0) / g.length).toFixed(1), 21)}` +
    `${s(g.reduce((x, r) => x + r.kayitSayisi, 0), 22)}`);
}

for (const esik of [30, 20]) {
  console.log(`\nesik ${esik}, oturum oturum:`);
  console.log(`  ${'oturum'.padEnd(26)}${s('sinif', 7)}${s('isaret dk', 15)}${s('gecikme dk', 12)}` +
    `${s('gecikmede inen kayit', 22)}`);
  for (const o of OTURUM) {
    const r = isaretle(o, esik);
    console.log(`  ${o[0].padEnd(26)}${s(o[2], 7)}${s(r ? r.dakika : 'isaretlenmedi', 15)}` +
      `${s(r ? r.gecikme : '-', 12)}${s(r && o[2] === 'kotu' ? r.kayitSayisi : '-', 22)}`);
  }
}
```

```
7 oturum, 45 dakika, 3 rol taban cizgisi

oturum                          rol  sinif  sapma dk  en yuksek dk puani  en yuksek yigin  toplam kayit  erken asama
abone-3391                    abone  mesru         -                0.00              0.0           540            -
saha-12, vardiya               saha  mesru         -                0.00              0.0          1800            -
analist-4, fatura donemi    analist  mesru         0                4.30             21.5         34380            -
saha-58, yeni baslayan         saha  mesru         0                6.20             31.0          1624            -
abone-8842, ele gecmis        abone   kotu        12               13.25             66.3          8604          kod
analist-9, ic tehdit        analist   kotu         8                4.50             22.5         24840      tasarim
saha-31, calinan jeton         saha   kotu        20               13.20             66.0          4250          yok

esik    isaretlenen kotu  kacirilan kotu  yanlis isaretlenen  ortalama gecikme dk  gecikmede inen kayit
40                   2/3               1                 0/4                  3.0                  1314
30                   2/3               1                 1/4                  2.0                   910
20                   3/3               0                 2/4                  4.7                  7106
12                   3/3               0                 2/4                  3.3                  4556

esik 30, oturum oturum:
  oturum                      sinif      isaret dk  gecikme dk  gecikmede inen kayit
  abone-3391                  mesru  isaretlenmedi           -                     -
  saha-12, vardiya            mesru  isaretlenmedi           -                     -
  analist-4, fatura donemi    mesru  isaretlenmedi           -                     -
  saha-58, yeni baslayan      mesru              5           5                     -
  abone-8842, ele gecmis       kotu             14           2                   540
  analist-9, ic tehdit         kotu  isaretlenmedi           -                     -
  saha-31, calinan jeton       kotu             22           2                   370

esik 20, oturum oturum:
  oturum                      sinif      isaret dk  gecikme dk  gecikmede inen kayit
  abone-3391                  mesru  isaretlenmedi           -                     -
  saha-12, vardiya            mesru  isaretlenmedi           -                     -
  analist-4, fatura donemi    mesru              6           6                     -
  saha-58, yeni baslayan      mesru              3           3                     -
  abone-8842, ele gecmis       kotu             13           1                   276
  analist-9, ic tehdit         kotu             20          12                  6600
  saha-31, calinan jeton       kotu             21           1                   230
```

İlk tablonun iki satırı yan yana okunmalıdır. Fatura dönemindeki meşru analistin en yüksek beş
dakikalık yığını 21,5, iç tehdit oturumunun 22,5. Aradaki fark bir birimdir ve puanlamanın gördüğü
her şey bu farktan ibarettir. İkisi de aynı rolde, taban çizgisinin birkaç katı
hacimle çalışıyor; birinin yaptığı dönem sonu raporu, ötekinin sızdırma. Puanlama bu iki
oturumu ayıramaz, çünkü ayrım davranışta değil **niyettedir** — birinci dersteki kural kümesinin
sınırının aynısı, bir katman yukarıda.

Eşik tablosu bunun sonucunu veriyor. Eşik kırkta hiçbir meşru oturum işaretlenmiyor, ortalama
gecikme üç dakika, ama iç tehdit hiç yakalanmıyor: yığını hiçbir zaman kırka ulaşmıyor. Eşik
otuzda tablo daha da iyi görünür — gecikme iki dakikaya, gecikmede inen kayıt dokuz yüz ona
düşer — ama iç tehdit yine kaçıyor ve yeni başlayan saha teknisyeni yanlış işaretleniyor. İç
tehdidin yakalandığı ilk ayar yirmidir ve orada dört sayının üçü birden kötüleşir: yanlış
işaretlenen oturum ikiye, ortalama gecikme 4,7 dakikaya, gecikmede inen kayıt yedi bin yüz altıya
çıkar.

Oturum bazlı iki liste gecikmenin nereden geldiğini gösteriyor. Ele geçmiş abone oturumu ile
çalınan jeton oturumu hızlı sapıyor ve bir ya da iki dakikada işaretleniyor; ikisinin gecikmede
çıkardığı kayıt iki yüz otuz ile beş yüz kırk arasındadır. İç tehdit ise on iki dakika sonra
işaretleniyor ve o sürede altı bin altı yüz kayıt indiriyor — üç kötü oturumun toplam
gecikme maliyetinin yüzde doksan üçü. Yavaş sapan oturum hem en geç yakalanandır hem de en çok
veri çıkarandır; gecikme ile zarar aynı yönde büyür.

## Gecikmenin Nereye Ait Olduğu

```js
// asama.mjs — ayni sizintiyi daha erken hangi asama, kac kayit onceden kapatir
import { SURE, OTURUM, TABAN, kayit, isaretle } from './davranis.mjs';

const s = (x, n) => String(x).padStart(n);
const bul = (ad) => OTURUM.find((o) => o[0].startsWith(ad));
const tehdit = bul('analist-9'), donem = bul('analist-4'), T = TABAN.analist[2];
const kum = (o) => kayit(o).reduce((a, v) => (a.push((a.at(-1) || 0) + v[2]), a), []);
const fazla = (o, t) => Math.round(kum(o)[t] - T * (t + 1));
const tavanla = (o, tavan) => {
  const k = kum(o), t = k.findIndex((x) => x >= tavan);
  return t < 0 ? { dk: 'kesilmedi', t: SURE - 1 } : { dk: `${t}. dk`, t };
};

console.log(`analist rolunun taban cizgisi ${T} kayit/dk; ${SURE} dakikalik olagan is ${T * SURE} kayit`);
console.log(`ic tehdit oturumu toplam ${Math.round(kum(tehdit).at(-1))} kayit indirdi,` +
  ` taban ustu ${fazla(tehdit, SURE - 1)}\n`);

console.log(`${'onlem'.padEnd(32)}${s('asama', 16)}${s('taban ustu kayit', 18)}${s('mesru bedel', 30)}`);
const e20 = isaretle(tehdit, 20), e40 = isaretle(tehdit, 40);
for (const [a, b, c, d] of [
  ['onlem yok', '-', fazla(tehdit, SURE - 1), '0'],
  ['anormallik esigi 40', 'calisma zamani', e40 ? fazla(tehdit, e40.dakika) : fazla(tehdit, SURE - 1),
    'yanlis isaret yok'],
  ['anormallik esigi 20', 'calisma zamani', fazla(tehdit, e20.dakika),
    `donem analisti ${isaretle(donem, 20).dakika}. dk isaretli`],
  ['rol basina kayit tavani 18000', 'tasarim', fazla(tehdit, tavanla(tehdit, 18000).t),
    `donem analisti ${tavanla(donem, 18000).dk} kesilir`],
  ['toplu cikarma kuyruk isine alinir', 'tasarim', 0, 'toplu is onaya girer'],
]) console.log(`${a.padEnd(32)}${s(b, 16)}${s(c, 18)}${s(d, 30)}`);

console.log(`\n${'tavan'.padEnd(8)}${s('ic tehdit kesildi', 19)}${s('taban ustu kayit', 18)}` +
  `${s('donem analisti kesildi', 24)}${s('kesilen mesru kayit', 21)}`);
for (const tv of [13500, 18000, 25000]) {
  const a = tavanla(tehdit, tv), b = tavanla(donem, tv);
  console.log(`${String(tv).padEnd(8)}${s(a.dk, 19)}${s(fazla(tehdit, a.t), 18)}${s(b.dk, 24)}` +
    `${s(Math.round(kum(donem).at(-1) - kum(donem)[b.t]), 21)}`);
}

console.log(`\n${'kotu oturum'.padEnd(26)}${s('esik 20 gecikme', 17)}${s('erken asama', 13)}${s('orada kapanan', 16)}`);
const NE = { kod: 'ikinci etken', tasarim: 'is akisi', yok: 'yok' };
for (const o of OTURUM.filter((x) => x[2] === 'kotu'))
  console.log(`${o[0].padEnd(26)}${s(`${isaretle(o, 20).gecikme} dk`, 17)}${s(o[6], 13)}${s(NE[o[6]], 16)}`);
```

```
analist rolunun taban cizgisi 300 kayit/dk; 45 dakikalik olagan is 13500 kayit
ic tehdit oturumu toplam 24840 kayit indirdi, taban ustu 11340

onlem                                      asama  taban ustu kayit                   mesru bedel
onlem yok                                      -             11340                             0
anormallik esigi 40               calisma zamani             11340             yanlis isaret yok
anormallik esigi 20               calisma zamani              2700 donem analisti 6. dk isaretli
rol basina kayit tavani 18000            tasarim              7740 donem analisti 23. dk kesilir
toplu cikarma kuyruk isine alinir         tasarim                 0          toplu is onaya girer

tavan     ic tehdit kesildi  taban ustu kayit  donem analisti kesildi  kesilen mesru kayit
13500                27. dk              5220                  18. dk                20280
18000                34. dk              7740                  23. dk                16380
25000             kesilmedi             11340                  32. dk                 9360

kotu oturum                 esik 20 gecikme  erken asama   orada kapanan
abone-8842, ele gecmis                 1 dk          kod    ikinci etken
analist-9, ic tehdit                  12 dk      tasarim        is akisi
saha-31, calinan jeton                 1 dk          yok             yok
```

Üst tablo kaba bir tasarım önleminin çalışma zamanı puanlamasından **daha kötü** olabileceğini
gösteriyor. Rol başına on sekiz binlik bir kayıt tavanı iç tehdidin taban üstü çıkardığı kaydı
yalnız on bir bin üç yüz kırktan yedi bin yedi yüz kırka indiriyor; anormallik eşiği yirmi aynı
kalemi iki bin yedi yüzde durduruyor. Orta tablo tavanın neden bu kadar zayıf kaldığını yazıyor:
tavanı iç tehdidi erken kesecek kadar indirmek gerekir, ama on üç bin beş yüzlük tavan fatura
dönemi analistini on sekizinci dakikada kesip yirmi bin iki yüz seksen meşru kaydı dışarıda
bırakıyor. Sabit bir sayı, dönemsel iş yükü olan bir rolde ayarlanamaz.

Ayarlanabilen şey iş akışının kendisidir. Toplu çıkarma etkileşimli uçtan alınıp onaylı bir
kuyruk işine taşındığında oturumun taban üstü çıkarabileceği kayıt sıfırdır: iç tehdit oturumu o
hacmi üretemez, çünkü etkileşimli uçta o yetenek yoktur. Meşru bedel de daha küçüktür — dönem
analistinin toplu işi kesilmez, onaya girer ve gecikir. Bu, tasarımda bir kez verilen
karardır; her gün eşik ayarlamayı gerektirmez.

Alt tablo üç kötü oturumu ayırıyor. Ele geçmiş abone oturumu bir dakika gecikmeyle
yakalanıyor, ama zaten daha ucuzu vardı: aynı ele geçirmeyi üçüncü ders ikinci etkenle yetmişten
beşe indirmişti. İç tehdit on iki dakika gecikmeyle yakalanıyor ve doğru yeri iş akışıdır.
Çalınan jeton oturumu için ise erken aşama yoktur; jeton geçerlidir, kimlik doğrulaması
başarılıdır ve hiçbir tasarım ya da kod kararı geçerli bir kimlik bilgisini geçersiz kılmaz.
Bu katmanın karşılıksız payı o tek satırdır — ve o satır bile bir dakikalık gecikme taşır.

## Özet

- Fatura dönemindeki meşru analistin en yüksek beş dakikalık yığını 21,5, iç tehdit oturumunun
  22,5. Puanlamanın iki oturum arasında gördüğü fark bir birimdir; ayrım davranışta değil
  niyettedir.
- Eşik 40 ve 30, hiçbir meşru oturumu ya da yalnız birini işaretleyip iç tehdidi kaçırıyor.
  İç tehdidin yakalandığı ilk ayar 20'dir ve orada yanlış işaretlenen oturum 2/4'e, ortalama
  gecikme 4,7 dakikaya, gecikmede inen kayıt 7.106'ya çıkar.
- Hızlı sapan iki oturum 1–2 dakikada işaretlendi ve gecikmede 230–540 kayıt çıkardı. Yavaş
  sapan iç tehdit 12 dakikada işaretlendi ve 6.600 kayıt çıkardı: toplam gecikme maliyetinin
  yüzde 93'ü. Gecikme ile zarar aynı yönde büyür.
- Kaba bir tasarım önlemi çalışma zamanından kötü olabilir: 18.000'lik kayıt tavanı taban üstü
  sızıntıyı 7.740'ta, anormallik eşiği 20 ise 2.700'de durdurdu. 13.500'lük tavan iç tehdidi 27.
  dakikada keserken dönem analistinin 20.280 meşru kaydını da kesiyor.
- Toplu çıkarmanın onaylı kuyruk işine alınması taban üstü kaydı sıfırlıyor ve meşru işi kesmiyor,
  yalnız geciktiriyor. Üç kötü oturumdan biri kod aşamasında (ikinci etken), biri tasarımda (iş
  akışı) kapanıyor; çalınan jeton oturumu için erken aşama yoktur.

## Sonraki Adım

Bu konu istek katmanında ne yakalandığını ve neyin yanlış kesildiğini beş derste saydı: kural
kümesi, hız sınırı, hesap ve adres eşikleri, başlık kapsamı, oturum davranışı. Her derste bir
kalem sınıfı için "burada değil, daha erken kapanırdı" yazıldı ve her derste bir tane de tersi
çıktı — yalnız burada kapatılabilen bir sınıf.

Bu dersin çalınan jeton oturumu tam olarak o sınıftandır ve bıraktığı soru bütün konuyu aşıyor.
O oturum işaretlendi, ama işaretlenmesini gerektiren şey jetonun **hâlâ geçerli olmasıydı**. Beş
dersin savunmaları da aynı varsayıma dayanır: arkalarında duran anahtarlar, jetonlar ve kimlik
bilgileri geçerlidir ve geçerli kaldıkları sürece bu katmanlar davranışa bakmak zorundadır. O kimlik bilgilerinin nerede durduğu, kimin okuyabildiği ve ne kadar
süreyle geçerli kaldığı ise hiç sorulmadı. Sonraki konu bunu sorar ve ilk ölçüsü ömürdür: bir
sırrın geçerli kaldığı süre, açık bıraktığı pencerenin kendisidir.
