---
title: 'Güvenlik Operasyonları ve Olay Müdahalesi'
source: 'https://academia.sh/tr/kurslar/guvenlik-operasyonlari'
language: tr
updated: '2026-08-17T04:40:01+00:00'
license: 'CC BY-SA 4.0'
lessons: 22
outcomes:
    - 'Günlük kaynaklarını merkezî bir tespit hattına bağlar ve kaynaktan karara kaç adım geçtiğini sayar'
    - 'Olay müdahale yaşam döngüsünü yürütür ve erken ile geç kararın iki yönlü bedelini ölçer'
    - 'Adli inceleme adımlarını uçuculuk sırası ve gözetim zinciriyle uygular'
---

# Güvenlik Operasyonları ve Olay Müdahalesi

Fark etme ile durdurma arasındaki sürenin ölçülmesi: operasyon merkezinin vardiya düzeni ve devir noktasında kaybolan kalem, çok kaynaklı günlük toplama ve normalleştirmede eşlenemeyen alan, bağıntı kurallarının birleştirdiği ve kaçırdığı olay, ağ akış verisiyle tespit, yanlış pozitif ile yanlış negatifin aynı anda azaltılamadığı eşik noktası, tespit mühendisliğinin kapsadığı teknik sayısı, hipotez temelli tehdit avcılığı, gösterge ve davranış temelli istihbarat beslemeleri, yinelenen müdahalenin otomatikleştirilmesi, hazırlıktan çıkarılan derslere olay müdahale yaşam döngüsü, erken ve geç sınırlamanın kalem farkı, bildirim yükümlülüğü, delil bütünlüğü ve gözetim zinciri, uçuculuk sırası, zaman çizelgesi birleştirme ve saat kayması.

## Tespit Altyapısı

Fark etme ile sınırlama arasındaki sürenin hattını kurar: vardiya kapasitesi ve devir noktasında birleşmeyen vaka, üç biçimdeki günlüğün tek şemaya normalleştirilmesi ve eşlenemeyen alan, bağıntı kuralının birleştirdiği ve kaçırdığı olay, içerik olmadan ağ akış verisiyle yanıtlanabilen soru, yanlış pozitif ile kaçırılanın aynı anda azaltılamadığı eşik noktası, iki kural sürümünün kapsadığı teknik sayısı, hipotez başına elenen kalem, gösterge ile davranışın ömür farkı ve yinelenen müdahalenin otomatikleştirilmesi.

### Güvenlik Operasyon Merkezi

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/guvenlik-operasyon-merkezi

Kurgu bir hatta düşen 273 uyarı üç kişilik vardiyaya karşı ölçülür: günün işi 1.506 dakika, kapasite 1.440 dakika; yirmi dört saati eşit bölen plan 64 uyarıya hiç baktırmıyor ve medyan beklemeyi 222 dakikaya çıkarıyor, yoğunluğa yaslanan plan sekiz saati kapsamasız bırakıp bunu 13 uyarıya ve 83 dakikaya indiriyor. 26 vakanın 19'u devir noktasını aşıyor; devir notu boşken 19 vaka hiç birleşmiyor ve medyan vaka kararı 987 dakika, altı kalemlik notta birleşmeyen sıfıra iniyor ve medyan 273 dakikaya düşüyor, on iki kalemde ise devir 72 dakika yiyip hiç bakılmayan uyarıyı 26'ya çıkarıyor.

Bir önceki kurs on sekiz derste her savunma adımının geride kaç kayıt bıraktığını saydı. O sayım
sessiz bir varsayım taşıyordu: kaydın okunduğu. Bu kurs varsayımı kaldırır ve kaydı okuyan yapıyı
ölçer. Ölçü birimi de değişir — sayılan şey artık kayıt sayısı değil, **süredir**. Olayın
gerçekleşmesi ile onun bir uyarı olarak görülmesi arasında geçen süreye **fark etme süresi** (time
to detect), görüldükten sonra durdurulmasına kadar geçen süreye **sınırlama süresi** (time to
contain) denir. Kursun bütün ölçümleri bu ikisinden birine bağlanır.

Güvenlik operasyon merkezi bir oda değil, bir kapasite ve bir devir düzenidir. Bu ders o düzenin
iki sayısını çıkarır: kaç saatlik pencerede kaç uyarı kime düşüyor ve vardiya değişiminde kaç
kalem kayboluyor. Nöbet politikası — kimin çağrılacağı, hangi eşikte yükseltileceği — DevOps
Gözlemlenebilirlik kursunda ölçülmüştü; burada ölçülen şey çağrı değil, sürekli bir hattın
kapasitesidir.

- **TA1.** Bölgesel ölçüm ağı **kurgudur**: sayaç toplayıcılar, abone portalı ve şube uçları
  kayıtlarını merkezî bir hatta gönderir. Hat günde 273 uyarı üretir. Sayılar ve süreler
  **veridir**, ölçüm değildir.
- **TA2.** Merkez üç kişiliktir, kişi başına sekiz saatlik vardiya. Günlük kapasite
  3 × 8 × 60 = 1.440 analist-dakikadır.
- **TA3.** Uyarı beş türdendir. Her türün iki sayısı vardır: ortalama inceleme dakikası ve **olayın
  gerçekleşmesi ile kaydın hatta düşmesi arasındaki dakika**.
- **TA4.** Bir analist aynı anda tek uyarı inceler ve vardiyası biterken tamamlayamayacağı işi
  almaz. Nöbette kimse yoksa uyarı bekler.
- **TA5.** Vaka, aynı kurgu aktöre ait ve 30–240 dakikaya yayılan 2–5 uyarıdır. Bu bağ **kayıtta
  yazılı değildir**; analistin belleğindedir.
- **TA6.** Devir notu kalem başına iki dakika tutar ve devralan analistin inceleme kapasitesinden
  düşer.

#### Bir Günün Akışı ve İki Vardiya Planı

```js
// vardiya.mjs — kurgu uyari akisi ve uc kisilik vardiya duzeni. MODELDIR.
// Bolgesel olcum agi kurgudur; gercek kurum, adres ve olay adi yoktur.
// Uretec kendi yazilmistir, tohum asagida gorunur.
export const TOHUM = 20260401;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r = uretec(TOHUM);
const tam = (n) => Math.floor(r() * n);

// Saat basina uyari sayisi (kurgu veri, olcum degil): is saatlerinde yogun.
const YOGUNLUK = [4, 3, 3, 2, 2, 3, 6, 11, 18, 22, 24, 21,
                  19, 23, 25, 22, 17, 12, 9, 7, 6, 5, 5, 4];
// [tur, yuzde pay, ortalama inceleme dakikasi, olay ile kaydin dusmesi arasindaki dakika]
const TUR = [["kimlik-dogrulama", 34, 3, 1], ["ag-akisi", 26, 4, 5],
             ["uc-nokta", 22, 8, 2], ["veri-erisimi", 12, 11, 12],
             ["yonetim-duzlemi", 6, 6, 9]];

export const UYARI = [];
for (const [s, n] of YOGUNLUK.entries())
  for (let k = 0; k < n; k++) {
    let p = tam(100), t = TUR[0];
    for (const kalem of TUR) { if (p < kalem[1]) { t = kalem; break; } p -= kalem[1]; }
    UYARI.push({ id: UYARI.length, varis: s * 60 + tam(60), tur: t[0],
      is: Math.max(1, t[2] + tam(5) - 2), gecik: t[3] });
  }
UYARI.sort((a, b) => a.varis - b.varis);

// Vardiya plani: [ad, baslangic saati, bitis saati]. Uc kisi, kisi basina sekiz saat.
export const PLAN = {
  "esit bolunmus": [["N1", 0, 8], ["N2", 8, 16], ["N3", 16, 24]],
  "yogunluga yasli": [["N1", 6, 14], ["N2", 10, 18], ["N3", 14, 22]],
};

// Kuyruk benzetimi: bir uyari ancak nobetteki bir analist bosaldiginda incelenir.
export function kosturt(vardiyalar, hazirlik = []) {
  const bos = vardiyalar.map(([, b], i) => b * 60 + (hazirlik[i] || 0));
  const bit = vardiyalar.map(([, , s]) => s * 60);
  const sonuc = [];
  for (const u of UYARI) {
    let en = -1;
    for (const [i, v] of bos.entries()) {
      const bas = Math.max(v, u.varis);
      if (bas + u.is > bit[i]) continue;            // vardiya biterken yeni is alinmaz
      if (en < 0 || bas < Math.max(bos[en], u.varis)) en = i;
    }
    if (en < 0) { sonuc.push({ ...u, analist: null, bekleme: null }); continue; }
    const bas = Math.max(bos[en], u.varis);
    bos[en] = bas + u.is;
    sonuc.push({ ...u, analist: vardiyalar[en][0], bekleme: bas - u.varis, kapanis: bos[en] });
  }
  return sonuc;
}

const dk = (v) => v.slice().sort((a, b) => a - b)[Math.floor(v.length / 2)];
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]}`) {
  const yz = gen([18, 12, 16, 13, 14, 13]), yt = gen([18, 8, 12, 14]);
  console.log(`model (tohum ${TOHUM}): ${UYARI.length} uyari, toplam ` +
    `${UYARI.reduce((a, u) => a + u.is, 0)} dakika inceleme isi; ` +
    `uc analistin kapasitesi 3 x 8 x 60 = 1440 dakika`);
  console.log(yt(["tur", "uyari", "kayit gec.", "inceleme dk"]));
  for (const [ad, , , g] of TUR) {
    const l = UYARI.filter((u) => u.tur === ad);
    console.log(yt([ad, l.length, `${g} dk`, l.reduce((a, u) => a + u.is, 0)]));
  }
  console.log();
  console.log(yz(["plan", "kapsamasiz", "hic bakilmayan", "medyan bek.", "en uzun bek.",
    "30 dk asan"]));
  for (const [ad, v] of Object.entries(PLAN)) {
    const s = kosturt(v), bakilan = s.filter((u) => u.analist !== null);
    const kapsanan = new Set(v.flatMap(([, b, e]) =>
      Array.from({ length: e - b }, (_, i) => b + i)));
    console.log(yz([ad, `${24 - kapsanan.size} saat`, s.length - bakilan.length,
      dk(bakilan.map((u) => u.bekleme)), Math.max(...bakilan.map((u) => u.bekleme)),
      bakilan.filter((u) => u.bekleme > 30).length]));
  }
  console.log("\nyogunluga yasli planda analist basina dusen (kurgu gun):");
  const s2 = kosturt(PLAN["yogunluga yasli"]), y2 = gen([8, 8, 10, 12, 14]);
  console.log(y2(["analist", "uyari", "is dakika", "bos dakika", "en uzun bek."]));
  for (const [ad, b, e] of PLAN["yogunluga yasli"]) {
    const l = s2.filter((u) => u.analist === ad), is = l.reduce((a, u) => a + u.is, 0);
    console.log(y2([ad, l.length, is, (e - b) * 60 - is, Math.max(...l.map((u) => u.bekleme))]));
  }
}
```

```
model (tohum 20260401): 273 uyari, toplam 1506 dakika inceleme isi; uc analistin kapasitesi 3 x 8 x 60 = 1440 dakika
tur                  uyari  kayit gec.   inceleme dk
kimlik-dogrulama       104        1 dk           308
ag-akisi                68        5 dk           271
uc-nokta                53        2 dk           439
veri-erisimi            39       12 dk           430
yonetim-duzlemi          9        9 dk            58

plan                kapsamasiz  hic bakilmayan  medyan bek.  en uzun bek.   30 dk asan
esit bolunmus           0 saat              64          222           477          161
yogunluga yasli         8 saat              13           83           363          260

yogunluga yasli planda analist basina dusen (kurgu gun):
analist    uyari is dakika  bos dakika  en uzun bek.
N1            85       480           0           363
N2            86       480           0           101
N3            89       479           1           127
```

İlk satır dersin sınırını veriyor: günün işi 1.506 dakika, kapasite 1.440 dakika. Doluluk yüzde
yüzü aşıyor ve bu, hiçbir vardiya düzeninin kurtaramayacağı bir açıktır. Ama açığın **nereye
düştüğü** düzene bağlıdır ve iki plan bunu ters yönlerde gösteriyor.

Tür tablosu ilk sütunu veriyor: kaydın olaydan kaç dakika sonra düştüğü. Kimlik doğrulama kaydı bir
dakikada geliyor, veri erişimi kaydı on iki dakikada. Bu, hattın hiç bilmediği bir gecikmedir —
kayıt hatta düştüğünde olay zaten on iki dakika önce olmuştur ve kuyruk ondan sonra başlar.

Yirmi dört saati eşit bölen plan **kapsamayı** tam sağlıyor: kapsamasız saat sıfır. Karşılığında 64
uyarıya hiç bakılmıyor ve medyan bekleme 222 dakika. Neden açıktır: gece vardiyası saatte üç uyarı
alıp boş bekliyor, gündüz vardiyası saatte yirmi beş uyarıyla karşılaşıp kuyruğu büyütüyor.
**Kapsama bir kapasite ölçüsü değildir.** Nöbette birinin bulunması, o kişinin o saatteki yükü
karşılayabildiği anlamına gelmez.

Yoğunluğa yaslanan plan sekiz saati tümüyle kapsamasız bırakıyor — 22:00 ile 06:00 arasında hiç
kimse yok. Buna karşılık hiç bakılmayan uyarı 64'ten 13'e, medyan bekleme 222'den 83 dakikaya
iniyor. İki sütun ters yönde hareket ediyor: otuz dakikayı aşan uyarı 161'den 260'a **çıkıyor**.
Bunun nedeni sayının tanımıdır — eşit bölünmüş planda 64 uyarı hiç incelenmediği için hiçbir
bekleme sütununa girmiyor. Kaybolan kalem ortalamayı iyileştirir.

Son tablo üç analistin de dolu olduğunu söylüyor: boş dakika 0, 0 ve 1. Yük dengeli dağılmış
görünüyor, ama en uzun bekleme sütunu bunun ne pahasına olduğunu yazıyor. N1'in devraldığı bir uyarı
363 dakika kuyrukta beklemiş; gece düşen kayıt sabah altıya kadar kimsenin önünde değildir. Fark
etme süresi bu modelde üç parçadan oluşur ve üçü de tabloda ayrı ayrı okunuyor: kaydın olaydan kaç
dakika sonra düştüğü, kuyrukta kaç dakika beklediği ve incelemenin kaç dakika sürdüğü.

#### Devir Noktasında Birleşmeyen Vaka

Kuyruk süresi tek başına eksik bir ölçüdür, çünkü kararın uyarı başına verildiğini varsayar. Gerçek
karar çoğu zaman **birden çok uyarının birlikte okunmasıyla** verilir ve o bağı kuran şey bu modelde
analistin belleğidir. Vardiya değişimi tam olarak o belleğin sıfırlandığı andır.

```js
// devir.mjs — vardiya devrinde birlesmeden kalan vaka ve devir notunun bedeli. MODELDIR.
import { UYARI, PLAN, kosturt } from "./vardiya.mjs";

const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r2 = uretec(760413);

// Vaka: ayni kurgu aktore ait, 30-240 dakikaya yayilan 2-5 uyari. Bagi analist kurar;
// kayitta yazili degildir. Kok uyarilar tohumla secilir.
const alinmis = new Set();
export const VAKA = [];
for (const u of UYARI) {
  if (alinmis.has(u.id) || r2() > 0.16 || VAKA.length === 26) continue;
  const grup = [u.id]; alinmis.add(u.id);
  for (const v of UYARI)
    if (!alinmis.has(v.id) && grup.length < 2 + Math.floor(r2() * 4) &&
        v.varis > u.varis + 30 && v.varis < u.varis + 240) { grup.push(v.id); alinmis.add(v.id); }
  VAKA.push(grup);
}

const V = PLAN["yogunluga yasli"];
const SON = V.map(([, , e]) => e * 60);

function gun(sinir) {
  const s = kosturt(V, [2 * sinir, 2 * sinir, 2 * sinir]);   // kalem basina iki dakika devir
  const d = new Map(s.map((u) => [u.id, u]));
  const tek = [], devir = [];
  for (const g of VAKA) {
    const kalem = g.map((i) => d.get(i));
    const gorulen = kalem.filter((u) => u.analist !== null);
    const kim = [...new Set(gorulen.map((u) => u.analist))];
    if (kim.length === 1 && gorulen.length === kalem.length)
      tek.push({ g, karar: Math.max(...kalem.map((u) => u.kapanis)) });
    else devir.push({ g, sinirIndeks: kim.length ? V.findIndex(([a]) => a === kim[0]) : 2,
      ilk: Math.min(...kalem.map((u) => u.varis)),
      son: Math.max(...gorulen.map((u) => u.kapanis), 0) });
  }
  let tasinan = 0, kalan = 0, korKalem = 0;
  for (const i of [0, 1, 2]) {
    const liste = devir.filter((v) => v.sinirIndeks === i).sort((a, b) => a.ilk - b.ilk);
    for (const [j, v] of liste.entries())
      if (j < sinir) { tasinan++; v.karar = Math.max(v.son, SON[i]) + 3; }
      else { kalan++; korKalem += v.g.length; v.karar = 1800; }   // ertesi gun 06:00
  }
  const sure = [...tek, ...devir]
    .map((v) => v.karar - Math.min(...v.g.map((i) => d.get(i).varis - d.get(i).gecik)))
    .sort((a, b) => a - b);
  return { tek: tek.length, devir: devir.length, tasinan, kalan, korKalem,
    devirDk: 6 * sinir, bakilmayan: s.filter((u) => u.analist === null).length,
    medyan: sure[Math.floor(sure.length / 2)] };
}

const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const yz = gen([12, 12, 10, 12, 12, 11, 16, 12]);
console.log(`${VAKA.length} vaka var, ${VAKA.reduce((a, g) => a + g.length, 0)} uyari ` +
  `iceriyor; bagi kuran sey analistin bellegidir, kayitta yazili degildir`);
console.log(`bir vardiyada tek basina kapanan vaka ${gun(0).tek}, ` +
  `devir noktasini asan vaka ${gun(0).devir}`);
console.log();
console.log(yz(["not siniri", "devri asan", "tasinan", "birlesmeyen", "kayan uyari",
  "devir dk", "hic bakilmayan", "medyan vaka"]));
for (const sinir of [0, 2, 4, 6, 12]) {
  const g = gun(sinir);
  console.log(yz([`${sinir} vaka`, g.devir, g.tasinan, g.kalan, g.korKalem, g.devirDk,
    g.bakilmayan, `${g.medyan} dk`]));
}
```

```
26 vaka var, 128 uyari iceriyor; bagi kuran sey analistin bellegidir, kayitta yazili degildir
bir vardiyada tek basina kapanan vaka 7, devir noktasini asan vaka 19

not siniri    devri asan   tasinan birlesmeyen kayan uyari   devir dk  hic bakilmayan medyan vaka
0 vaka                19         0          19          94          0              13      987 dk
2 vaka                18         6          12          59         12              15      528 dk
4 vaka                18        12           6          29         24              18      436 dk
6 vaka                18        18           0           0         36              18      273 dk
12 vaka               20        20           0           0         72              26      285 dk
```

Yirmi altı vakanın yalnız yedisi tek bir vardiyada kapanıyor; **on dokuzu devir noktasını aşıyor**.
Bu oran modelin bir sonucu değil, sürelerin aritmetiğidir: bir vaka en çok dört saate yayılıyor,
vardiya sekiz saat, kuyruk beklemesi de eklendiğinde bir vakanın iki analiste düşmesi olağan hâle
geliyor.

Devir notu boşken 19 vaka hiç birleşmiyor. Bu, o vakaların uyarılarının **incelenmediği** anlamına
gelmez — 94 uyarının hepsi tek tek açılıp tek tek kapanıyor. Kaybolan şey uyarı değil, uyarılar
arasındaki bağdır ve bağ olmadan her uyarı tek başına önemsiz görünür. Medyan vaka kararı 987
dakikaya, yani on altı saate çıkıyor.

Not sınırını altı kaleme çıkarmak birleşmeyen vakayı sıfırlıyor ve medyanı 273 dakikaya indiriyor.
Bedeli tabloda yazılı: 36 analist-dakika devir toplantısına gidiyor ve hiç bakılmayan uyarı 13'ten
18'e çıkıyor. On iki kalemde ise eğri döner — birleşmeyen vaka zaten sıfırdır, devir 72 dakika yer,
hiç bakılmayan uyarı 26'ya fırlar ve medyan 273'ten 285 dakikaya **geri çıkar**. Karar süresini
kısaltmak için harcanan kapasite, bir noktadan sonra karar süresini uzatır.

İki yönlü bedel bu tabloda birlikte okunuyor. Geç kararın bedeli, on altı saat boyunca vakanın
açık kalmasıdır; bu sürede kaç kaleme daha erişildiği bu modelde yazılı değildir ve sonraki
derslerde sayılacaktır. Erken kararın bedeli ise kapasitedir: devre ayrılan her dakika bir uyarının
hiç açılmaması demektir.

#### Özet

- Kurgu hattın günlük işi 1.506 dakika, üç kişilik vardiyanın kapasitesi 1.440 dakikadır; doluluk
  yüzde yüzü aştığında düzen açığı kapatmaz, yalnız nereye düşeceğini belirler.
- Yirmi dört saati eşit bölen plan kapsamasız saati sıfırlıyor ama 64 uyarıya hiç baktırmıyor ve
  medyan beklemeyi 222 dakikaya çıkarıyor; kapsama bir kapasite ölçüsü değildir.
- Yoğunluğa yaslanan plan sekiz saati kapsamasız bırakıp hiç bakılmayanı 13'e, medyan beklemeyi 83
  dakikaya indiriyor; otuz dakikayı aşan uyarının 161'den 260'a çıkması, kaybolan kalemin
  ortalamayı iyileştirmesindendir.
- Yirmi altı vakanın 19'u devir noktasını aşıyor; devir notu boşken hiçbiri birleşmiyor, 94 uyarı
  tek tek kapanıyor ve medyan vaka kararı 987 dakikada kalıyor.
- Altı kalemlik devir notu birleşmeyen vakayı sıfırlayıp medyanı 273 dakikaya indiriyor; on iki
  kalemde devir 72 dakika yiyor, hiç bakılmayan uyarı 26'ya çıkıyor ve medyan 285 dakikaya geri
  dönüyor.

#### Sonraki Adım

Devir notunun yaptığı iş, bir analistin belleğindeki bağı yazıya geçirmekti. O bağı en baştan
kayıtta kurmak, yani iki uyarının aynı aktöre ait olduğunu makinenin görebilmesi, bu dersin
modelinde varsayılmıştı. Gerçekte varsayılamaz: sayaç toplayıcının kaydı ile abone portalının kaydı
aynı kişiyi farklı alan adlarıyla, farklı zaman biçimiyle ve farklı ayrıntı düzeyiyle yazar. Sonraki
ders üç ayrı biçimdeki kurgu günlüğü tek şemaya oturtur ve kursun ölçü birimini kurar: kaç alan
eşleniyor, kaç alan hiçbir karşılığa oturmuyor ve eşlenemeyen alan hangi soruyu yanıtsız bırakıyor.

### Günlük Toplama ve Normalleştirme

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/gunluk-toplama-ve-normallestirme

Üç ayrı biçimdeki kurgu günlük tek şemaya normalleştirilir ve eşlenemeyen alan sayılır: 24 kaynak alanının 15'i sekiz alanlık şemaya oturuyor, 9'u artık kalıyor; ağ akışı kaydında dört şema alanı boş ve 404 kaydın hiçbirinde aktör yok. Kaynaklar aynı olayı 1, 5 ve 8 dakika sonra yazıyor. Aktör alanını iki ara tablo dolduruyor: 139 yönetim düzlemi kaydının 115'i hesaba çevriliyor, 24'ü çevrilemiyor; beş dakikalık pencerede 404 akış kaydının 190'ına aktör atanıyor, 212'si boş kalıyor, altmış dakikada atama 208'e çıkarken belirsiz kayıt 2'den 39'a fırlıyor. İki kaynakta iz bırakan 26 olayın 21'i toplanıyor, bir dakikalık pencerede hiçbiri toplanmıyor.

Bir önceki dersin devir notu, analistin belleğindeki bağı yazıya geçiriyordu. O bağın en baştan
kayıtta bulunması, yani iki uyarının aynı aktöre ait olduğunun makine tarafından görülebilmesi, önceki
derste varsayılmıştı. Bu ders varsayımı kaldırır ve kursun ölçü birimini kurar.

Ölçü şudur: bir kaydın hangi alanı ortak şemaya oturuyor, hangi alanı oturmuyor ve **oturmayan
alanın yerine ne konuyor**. Kaynak envanteri Uç Nokta ve Sistem Sertleştirme kursunda sayılmıştı;
burada envanter bir girdidir. Sayılan şey kaynağın varlığı değil, **birbirine bağlanabilirliğidir**.

- **TA7.** Bölgesel ölçüm ağında üç günlük kaynağı vardır: bir bulut yönetim düzlemi kaydı, uç
  noktaların süreç oluşturma kaydı ve ağ akış verisi. Üçü de **kurgudur**; adresler yönlendirilmeyen
  kurgu bloklardandır.
- **TA8.** Hedef şema sekiz alanlıdır: zaman, kaynak, konak, adres, aktör, eylem, hedef, sonuç. Bir
  kaynağın dolduramadığı alan `null` kalır ve **sayılır**.
- **TA9.** Bir kaynak alanı üç durumdan birindedir: şemaya **eşlenir**, şemada karşılığı olmadığı
  için **artık** kalır, ya da şema alanı hiçbir kaynak alanından doldurulamadığı için **boş** kalır.
- **TA10.** Kayıt, olayın gerçekleştiği anda değil, kaynağın yazdığı anda oluşur. Model bu farkı
  kaynak başına veri olarak verir: uç noktada 1, ağ akışında 5, yönetim düzleminde 8 dakika.
- **TA11.** Otuz kurgu olay birden çok kaynakta iz bırakır. Bu bağ **modelin bilgisidir**; hiçbir
  günlük satırına yazılmaz.
- **TA12.** Aktör kimliği üç kaynakta üç biçimdedir: portal kimliği, etki alanı hesabı ve yalnız
  adres. Ara tablolar günlükte değil, varlık envanterindedir.

#### Üç Biçim, Tek Şema

```js
// kaynak.mjs — uc ayri bicimdeki kurgu gunluk uretilir ve tek semaya normallestirilir.
// MODELDIR. Adresler RFC1918 kurgu bloklarindandir; gercek kurum ve konak yoktur.
export const TOHUM = 20260402;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r = uretec(TOHUM);
const tam = (n) => Math.floor(r() * n);
const sec = (d) => d[tam(d.length)];

export const KONAK = Array.from({ length: 60 }, (_, i) => `uc-${101 + i}`);
export const HESAP = Array.from({ length: 40 }, (_, i) => `sh-${201 + i}`);
export const ADRES = KONAK.map((_, i) => `10.40.${1 + (i % 3)}.${10 + i}`);
// Portal kimligi: 28 hesabin karsiligi var, alti tanesinin (servis kimligi) hic yok.
const PORTAL = [...HESAP.slice(0, 28).map((_, i) => `ab-${4401 + i}`),
                ...Array.from({ length: 6 }, (_, i) => `ab-${4429 + i}`)];
const EYLEM = ["nesne.oku", "nesne.yaz", "yetki.degistir", "anahtar.kullan"];
const YOL = ["/opt/olcum/toplayici", "/usr/bin/arsivle", "/opt/olcum/dogrulayici"];

// Hedef sema: sekiz alan. Her kaynak bunun bir bolumunu doldurur.
export const SEMA = ["t", "kaynak", "konak", "adres", "aktor", "eylem", "hedef", "sonuc"];
// [kaynak, bicim, kaynak alani, semaya eslenen kaynak alani, varis gecikmesi dk, cozunurluk]
export const KAYNAK = [["yonetim-duzlemi", "json", 8, 6, 8, "1 ms"],
                       ["uc-nokta", "anahtar=deger", 8, 5, 1, "1 s"],
                       ["ag-akisi", "csv", 8, 4, 5, "1 s"]];

const GUN = Date.UTC(2026, 3, 2);
const iso = (ms) => new Date(GUN + ms).toISOString();
export const yd = [], un = [], aa = [];      // uc ham gunluk, uc ayri bicim
const etiketli = { yd: [], un: [], aa: [] }; // modelin dogrusu; gunluk satirina YAZILMAZ

// Ortak olay: ayni is kalemi birden cok kaynakta iz birakir. Model bunu bilir, hat bilmez.
export const ORTAK = [];
for (let k = 0; k < 30; k++) {
  const i = tam(KONAK.length), h = HESAP[tam(28)];
  ORTAK.push({ t: 3600e3 + tam(50000e3), konak: KONAK[i], adres: ADRES[i], hesap: h,
    portal: PORTAL[HESAP.indexOf(h)], uc: r() < 0.8, ag: r() < 0.9, yd: r() < 0.7 });
}
const yaz = (o, e) => {
  if (o.yd) { yd.push({ ts: iso(o.t + 480e3 + tam(9000)), actor: { id: o.portal,
      type: "kullanici" }, op: sec(EYLEM), target: `kova/olcum/${tam(900)}`,
    result: r() < 0.9 ? "izin-verildi" : "reddedildi", srcIp: o.adres,
    requestId: `q${tam(1e5)}` }); etiketli.yd.push(e); }
  if (o.uc) { un.push(`zaman=${Math.floor((GUN + o.t + 60e3 + tam(9000)) / 1000)} ` +
    `konak=${o.konak} olay=surec-olusturma kullanici=${o.hesap} pid=${1000 + tam(9000)} ` +
    `ust=${400 + tam(600)} yol=${sec(YOL)} ` +
    `karma=${tam(1e9).toString(16).padStart(8, "0")}`); etiketli.un.push(e); }
  if (o.ag) { aa.push([Math.floor((GUN + o.t + 300e3 + tam(9000)) / 1000), 1 + tam(60),
    o.adres, `10.90.2.${10 + tam(40)}`, sec([443, 8443, 5671]), "giden", 400 + tam(9e5),
    5 + tam(900)].join(",")); etiketli.aa.push(e); }
};
ORTAK.forEach((o, i) => yaz(o, i));
// Arka plan trafigi: ortak olayla iliskisiz kayitlar.
for (let k = 0; k < 480; k++) {
  const i = tam(KONAK.length);
  yaz({ t: tam(86400e3), konak: KONAK[i], adres: ADRES[i], hesap: sec(HESAP),
    portal: sec(PORTAL), uc: r() < 0.45, ag: r() < 0.75, yd: r() < 0.25 }, -1);
}

// Normallestirme: her kaynak icin bir eslestirici. Doldurulamayan alan null kalir.
export const normal = {
  "yonetim-duzlemi": (s) => { const o = JSON.parse(s);
    return { t: Date.parse(o.ts), kaynak: "yonetim-duzlemi", konak: null, adres: o.srcIp,
      aktor: o.actor.id, eylem: o.op, hedef: o.target, sonuc: o.result }; },
  "uc-nokta": (s) => { const a = Object.fromEntries(s.split(" ").map((p) => p.split("=")));
    return { t: Number(a.zaman) * 1000, kaynak: "uc-nokta", konak: a.konak, adres: null,
      aktor: a.kullanici, eylem: a.olay, hedef: a.yol, sonuc: null }; },
  "ag-akisi": (s) => { const [b, , ka, he, p] = s.split(",");
    return { t: Number(b) * 1000, kaynak: "ag-akisi", konak: null, adres: ka, aktor: null,
      eylem: null, hedef: `${he}:${p}`, sonuc: null }; },
};
export const HAM = { "yonetim-duzlemi": yd.map((o) => JSON.stringify(o)), "uc-nokta": un,
                     "ag-akisi": aa };
const ETIKETLI = { "yonetim-duzlemi": etiketli.yd, "uc-nokta": etiketli.un,
                   "ag-akisi": etiketli.aa };
const hepsi = Object.entries(HAM).flatMap(([k, l]) =>
  l.map((s, i) => [normal[k](s), ETIKETLI[k][i]])).sort((a, b) => a[0].t - b[0].t);
export const OLAY = hepsi.map((x) => x[0]);
export const ETIKET = hepsi.map((x) => x[1]);   // ortak olay indeksi ya da -1; hat GORMEZ

if (import.meta.url === `file://${process.argv[1]}`) {
  const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
    : String(v).padEnd(B[0]))).join("");
  const yz = gen([18, 15, 8, 7, 14, 12, 11, 13, 14]);
  console.log(`model (tohum ${TOHUM}): ${OLAY.length} kayit, ${SEMA.length} alanlik sema`);
  for (const k of ["yonetim-duzlemi", "uc-nokta", "ag-akisi"]) console.log(HAM[k][0]);
  console.log();
  console.log(yz(["kaynak", "bicim", "kayit", "alan", "eslenen alan", "artik alan",
    "bos sema", "zaman coz.", "aktarim gec."]));
  for (const [ad, bicim, alan, esl, gec, coz] of KAYNAK) {
    const ornek = normal[ad](HAM[ad][0]);
    const dolu = SEMA.filter((a) => a !== "kaynak" && ornek[a] !== null).length;
    console.log(yz([ad, bicim, HAM[ad].length, alan, esl, alan - esl,
      SEMA.length - 1 - dolu, coz, `${gec} dk`]));
  }
  const t = KAYNAK.reduce((a, k) => a + k[2], 0), e = KAYNAK.reduce((a, k) => a + k[3], 0);
  console.log(`\ntoplam ${t} kaynak alani: ${e} tanesi semaya esleniyor, ` +
    `${t - e} tanesi artik kaliyor; aktor alani ag akisinda hicbir kayitta yok`);
}
```

```
model (tohum 20260402): 787 kayit, 8 alanlik sema
{"ts":"2026-04-02T10:26:21.519Z","actor":{"id":"ab-4401","type":"kullanici"},"op":"yetki.degistir","target":"kova/olcum/888","result":"izin-verildi","srcIp":"10.40.1.22","requestId":"q96644"}
zaman=1775125160 konak=uc-113 olay=surec-olusturma kullanici=sh-201 pid=4052 ust=405 yol=/usr/bin/arsivle karma=3718b893
1775125395,7,10.40.1.22,10.90.2.18,5671,giden,120991,443

kaynak                      bicim   kayit   alan  eslenen alan  artik alan   bos sema   zaman coz.  aktarim gec.
yonetim-duzlemi              json     139      8             6           2          1         1 ms          8 dk
uc-nokta            anahtar=deger     244      8             5           3          2          1 s          1 dk
ag-akisi                      csv     404      8             4           4          4          1 s          5 dk

toplam 24 kaynak alani: 15 tanesi semaya esleniyor, 9 tanesi artik kaliyor; aktor alani ag akisinda hicbir kayitta yok
```

Üç örnek satır üç ayrı dünya gösteriyor. Yönetim düzlemi kaydı iç içe geçmiş bir nesne yazıyor ve
aktörü `actor.id` yolunda saklıyor. Uç nokta kaydı düz `anahtar=deger` çiftleri yazıyor ve aktörü
`kullanici` diye adlandırıyor. Ağ akış kaydı ise başlıksız bir virgüllü satırdır: **alan adı kaydın
içinde yoktur**, yalnız sıradadır. İlk sütunun zaman olduğunu bilen tek şey ayrıştırıcıdır.

Yirmi dört kaynak alanının 15'i şemaya oturuyor, 9'u artık kalıyor. Artık alan tam bir kayıp
değildir — ham kayıt saklanır — ama ortak şema üzerinden **sorgulanamaz**; süreç kimliği ya da bayt
sayısı şemada yer bulmadığı için hiçbir bağıntı kuralı onu ölçüt olarak kullanamaz.

Asıl kayıp `bos sema` sütunundadır. Ağ akış kaydında dört şema alanı boştur: konak, aktör, eylem ve
sonuç. Bunların içinde en ağırı aktördür, çünkü kursun bütün bağıntı işlemi aktör ekseninde
yürüyecektir. **404 akış kaydının hiçbirinde kimin yaptığı yazmaz.** Uç nokta kaydında sonuç alanı
boştur: bir sürecin çalıştığı yazılır, izin verilip verilmediği yazılmaz.

Son iki sütun zamanın iki ayrı sorununu ayırıyor. Çözünürlük iki kaynağın olayları saniyeye
yuvarlaması demektir; aynı saniyedeki iki kaydın sırası kaybolur. Yazma gecikmesi daha
belirleyicidir: aynı olay uç noktada bir, ağ akışında beş, yönetim düzleminde sekiz dakika sonra
kayda geçer. Hat üç kaydı **yedi dakikaya yayılmış** görür ve yayılmanın gerçek mi aktarımdan mı
geldiğini ayırt edemez.

#### Eşlenemeyen Alanı Doldurmak

Aktör alanı boş bırakılamaz, çünkü boş kalırsa üç kaynak birbirine hiç bağlanmaz. Doldurmanın iki
yolu vardır ve ikisi de günlüğün dışındaki bir tabloya dayanır: portal kimliğini hesaba çeviren
statik bir eşleme ve adresi konağa, konağı da o andaki oturuma bağlayan zamana duyarlı bir arama.

```js
// birlestir.mjs — eslenemeyen aktor alani ara tablolarla doldurulur, sonra kayitlar toplanir.
import { OLAY, ETIKET, ORTAK, KONAK, ADRES, HESAP } from "./kaynak.mjs";

// Ara tablolar model verisidir: gunlukte yoktur, varlik envanterinden gelir.
const adresKonak = new Map(ADRES.map((a, i) => [a, KONAK[i]]));
const portalHesap = new Map(HESAP.slice(0, 28).map((h, i) => [`ab-${4401 + i}`, h]));

const uc = OLAY.filter((o) => o.kaynak === "uc-nokta");
// Ag akisi kaydinda aktor yok: adres konaga, konak da +/- W dakikalik pencerede
// uc nokta kaydindaki hesaba baglanmaya calisilir.
function aktorAta(pencere) {
  const cozum = new Array(OLAY.length).fill(null);
  let atanan = 0, belirsiz = 0, bos = 0, portalCevrilen = 0;
  for (const [i, o] of OLAY.entries()) {
    if (o.kaynak === "uc-nokta") { cozum[i] = o.aktor; continue; }
    if (o.kaynak === "yonetim-duzlemi") {
      cozum[i] = portalHesap.get(o.aktor) || null;
      if (cozum[i]) portalCevrilen++;
      continue;
    }
    const k = adresKonak.get(o.adres);
    const aday = [...new Set(uc.filter((u) => u.konak === k &&
      Math.abs(u.t - o.t) <= pencere * 60e3).map((u) => u.aktor))];
    if (aday.length === 1) { cozum[i] = aday[0]; atanan++; }
    else if (aday.length > 1) belirsiz++;
    else bos++;
  }
  return { cozum, atanan, belirsiz, bos, portalCevrilen };
}

// Aktor alani dolu kayitlar hesap ekseninde, W dakikalik bosluk kuralina gore kumelenir.
function kumele(cozum, pencere) {
  const grup = new Map();
  for (const [i, a] of cozum.entries()) if (a) (grup.get(a) || grup.set(a, []).get(a)).push(i);
  const kume = [];
  for (const [, l] of grup) {
    let s = [l[0]];
    for (const i of l.slice(1)) {
      if (OLAY[i].t - OLAY[s[s.length - 1]].t <= pencere * 60e3) s.push(i);
      else { kume.push(s); s = [i]; }
    }
    kume.push(s);
  }
  const cok = kume.filter((s) => new Set(s.map((i) => OLAY[i].kaynak)).size >= 2);
  const toplanan = new Set(), karisik = cok.filter((s) => {
    const e = new Set(s.map((i) => ETIKET[i]).filter((x) => x >= 0));
    for (const x of e) if (s.filter((i) => ETIKET[i] === x).length >= 2) toplanan.add(x);
    return e.size >= 2;
  });
  const ucKaynak = [...toplanan].filter((x) =>
    cok.some((s) => new Set(s.filter((i) => ETIKET[i] === x)
      .map((i) => OLAY[i].kaynak)).size === 3)).length;
  return { kume: cok.length, toplanan: toplanan.size, ucKaynak, karisik: karisik.length };
}

const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const yz = gen([12, 11, 11, 9, 9, 15, 13, 11]);
const ag = OLAY.filter((o) => o.kaynak === "ag-akisi").length;
console.log(`${OLAY.length} normallestirilmis kayit; ${ag} ag akisi kaydinin aktor alani bos, ` +
  `${OLAY.filter((o) => o.kaynak === "yonetim-duzlemi").length} yonetim duzlemi kaydinda ` +
  `aktor portal kimligi olarak yaziyor`);
const ikiUstu = ORTAK.filter((o) => [o.uc, o.ag, o.yd].filter(Boolean).length >= 2).length;
console.log(`modelin bildigi ortak olay ${ORTAK.length}, bunlarin ${ikiUstu} tanesi en az iki ` +
  `kaynakta iz birakiyor (hat bunu gormez)`);
console.log();
console.log(yz(["pencere", "aktor atn.", "belirsiz", "bos", "kume", "toplanan olay",
  "uc kaynakli", "karisik"]));
for (const p of [1, 5, 15, 60]) {
  const a = aktorAta(p), k = kumele(a.cozum, p);
  console.log(yz([`${p} dk`, a.atanan, a.belirsiz, a.bos, k.kume, `${k.toplanan}/${ikiUstu}`,
    k.ucKaynak, k.karisik]));
}
const a5 = aktorAta(5);
console.log(`\nportal kimligi hesaba cevrilen yonetim duzlemi kaydi: ${a5.portalCevrilen}; ` +
  `cevrilemeyen ${OLAY.filter((o) => o.kaynak === "yonetim-duzlemi").length - a5.portalCevrilen}`);
console.log(`aktor alani dolu kayit ${a5.cozum.filter(Boolean).length}/${OLAY.length}`);
```

```
787 normallestirilmis kayit; 404 ag akisi kaydinin aktor alani bos, 139 yonetim duzlemi kaydinda aktor portal kimligi olarak yaziyor
modelin bildigi ortak olay 30, bunlarin 26 tanesi en az iki kaynakta iz birakiyor (hat bunu gormez)

pencere      aktor atn.   belirsiz      bos     kume  toplanan olay  uc kaynakli    karisik
1 dk                  3          0      401        3           0/26            0          0
5 dk                190          2      212      184          21/26           13          1
15 dk               195          7      202      179          21/26           13          1
60 dk               208         39      157      145          20/26           12          1

portal kimligi hesaba cevrilen yonetim duzlemi kaydi: 115; cevrilemeyen 24
aktor alani dolu kayit 549/787
```

Statik eşleme kolay olanıdır ve o bile tam değildir: 139 yönetim düzlemi kaydının 115'i bir hesaba
çevriliyor, **24'ü çevrilemiyor**. Karşılığı olmayan altı portal kimliği servis kimliğidir ve
envanterde bir kişiye bağlı değildir. Bu 24 kayıt şemada aktör alanı dolu görünür, ama içindeki
değer öteki iki kaynakla hiçbir zaman eşleşmez — dolu bir alan boş bir alandan daha yanıltıcıdır.

Zamana duyarlı arama ise doğrudan pencereye bağlıdır ve tablo pencerenin iki yönlü etkisini
gösteriyor. Bir dakikalık pencerede 404 akış kaydının yalnız 3'üne aktör atanabiliyor; kaynakların
yazma gecikmeleri 1 ve 5 dakika olduğu için akış kaydı ile uç nokta kaydı arasında zaten dört dakika
vardır. Beş dakikaya çıkıldığında atama 190'a fırlıyor. Altmış dakikada atama yalnız 18 kayıt daha
kazanıyor, buna karşılık **belirsiz kayıt 2'den 39'a çıkıyor**: pencere genişledikçe aynı konakta
birden çok hesabın oturumu görünür oluyor ve hangisinin akışı olduğu söylenemez hâle geliyor.

Son iki sütun ölçünün karşılığını veriyor. En az iki kaynakta iz bırakan 26 kurgu olayın beş
dakikalık pencerede 21'i toplanıyor, 13'ü üç kaynağın hepsiyle birlikte. Bir dakikalık pencerede
**hiçbiri** toplanmıyor — bu sıfır, verinin eksikliğinden değil, kaynakların farklı anlarda
yazmasından geliyor. Toplanamayan beş olayın beşinde de **uç nokta kaydı yoktur**; geriye kalan ağ
akışı ve yönetim düzlemi kayıtları arasında üç dakika vardır, yani pencere sorun değildir. Engel
şudur: ağ akışı kaydının aktör alanı boştur ve onu dolduran eşleme uç nokta kaydından gelir.

Karışık küme sayısı birde kalıyor: bu modelde pencereyi genişletmenin bedeli yanlış birleştirme
değil, belirsizliktir. Yoğun bir ortamda o sütun büyür.

#### Özet

- Üç kaynağın 24 alanının 15'i sekiz alanlık şemaya eşleniyor, 9'u artık kalıyor; artık alan
  saklanır ama ortak şema üzerinden sorgulanamaz, bu yüzden hiçbir kurala ölçüt olamaz.
- Ağ akış kaydında dört şema alanı boştur ve en ağırı aktördür: 404 kaydın hiçbirinde kimin yaptığı
  yazmaz. Uç nokta kaydında sonuç alanı boştur.
- Aynı olay uç noktada 1, ağ akışında 5, yönetim düzleminde 8 dakika sonra kayda geçiyor; hat üç
  kaydı yedi dakikaya yayılmış görür ve yayılmanın gerçek mi aktarımdan mı olduğunu ayıramaz.
- Portal kimliğini hesaba çeviren statik eşleme 139 kaydın 115'ini çeviriyor, 24'ünü çeviremiyor;
  karşılığı olmayan servis kimliklerinde aktör alanı dolu görünür ama hiçbir şeyle eşleşmez.
- Pencere iki yönlü çalışıyor: bir dakikada 3 atama ve toplanan olay sıfır, beş dakikada 190 atama
  ve 21/26, altmış dakikada 208 atama ama belirsiz kayıt 2'den 39'a çıkıyor.

#### Sonraki Adım

Bu derste kümeleme tek ölçütle yapıldı: aynı aktör ve bir zaman penceresi. Bu ölçüt 184 küme üretti
ve bunların yalnız 21'i modelin bildiği bir olaya karşılık geliyor; geri kalanı aynı hesabın gün
içindeki olağan işidir. Bir güvenlik bilgi ve olay yönetimi sistemi kümelemeyi böyle yapmaz; koşul
dizisi yazar — hangi kaynaktan hangi alan, hangi sırayla, hangi sayıdan sonra. Sonraki ders bu
derste normalleştirilmiş akışın üzerine bir bağıntı kuralı koşturur ve iki sayı çıkarır: kural kaç
olayı tek uyarıda birleştiriyor ve birleştirdiklerinin dışında **neyi hiç görmüyor**.

### Güvenlik Bilgi ve Olay Yönetimi

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/guvenlik-bilgi-ve-olay-yonetimi

Üç koşullu bir bağıntı kuralı 3.083 kayıtlık kurgu bir olay akışında koşturulur: kural 10 uyarı üretiyor ve bu uyarılar 161 ham olayı birleştiriyor, uyarı başına 16,1 olay. Beş kurgu kampanyanın üçü yakalanıyor; biri eşiğin altında kaldığı, biri üçüncü adımı yalnız ağ akışında bıraktığı için hiç görünmüyor. Huni 3.083 kayıttan 12 adaya, 12 adaydan 10 uyarıya, 10 uyarıdan 3 karara iniyor ve ilk kaydın düşmesinden 43 dakika sürüyor. Eşik, pencere ve gecikme taramasında hiçbir ayar beş kampanyanın beşini birden getirmiyor; en iyi satır 4/5 ve 1 yanlış pozitif.

Bir önceki derste kümeleme tek ölçütle yapılmıştı: aynı aktör ve bir zaman penceresi. O ölçüt 184
küme üretti ve bunların yalnız 21'i modelin bildiği bir olaya karşılık geliyordu. Bir güvenlik
bilgi ve olay yönetimi sistemi kümelemeyi böyle yapmaz; **koşul dizisi** yazar — hangi kaynaktan
hangi alan, hangi sırayla, hangi sayıdan sonra.

Bu ders normalleştirilmiş bir akışın üzerine böyle bir kural koşturur ve iki sayı çıkarır: kural
kaç ham olayı tek uyarıda birleştiriyor ve birleştirdiklerinin dışında neyi hiç görmüyor. Aşağıdaki
akış bir **modeldir** ve olaylar yalnız **kayıt olarak** girer; hiçbir yerde bir saldırı adımının
nasıl yapıldığı yazmaz. **Bir hesap kümesine tekrarlı parola denemesi, yazılı yetki ve tanımlı
kapsam olmadan hem yasadışı hem meslek dışıdır**; burada denemenin bıraktığı kayıt ölçülür.

- **TA13.** Akış bir günü kapsar: 120 personel hesabı, 6 servis kimliği ve dört olay türü. Servis
  kimliği yetki değiştiremez, bu yüzden o kayıt onda **hiç yoktur**.
- **TA14.** Beş kurgu kampanya kayıt dizisi olarak verilir. Etiket modelin doğrusudur ve **akışa
  yazılmaz**; kural onu göremez.
- **TA15.** Bağıntı kuralı K1 üç koşulludur: aynı aktörde `P` dakika içinde en az `E` başarısız
  kayıt, ardından bir başarılı, ardından `G` dakika içinde bir yetki değişikliği.
- **TA16.** Bir uyarının **kanıtı**, kuralın onu üretirken tuttuğu ham olay kümesidir. Birleşme
  ölçüsü bu kümenin büyüklüğüdür.
- **TA17.** Zincirin sabit gecikmeleri model verisidir: aktarım ve normalleştirme 3 dakika, uyarı
  kuyruğu 14 dakika, analist incelemesi uyarı başına 9 dakika.

#### Bir Bağıntı Kuralının Durum Makinesi

```js
// akis.mjs — kurgu olay akisi ve bir baginti kuralinin durum makinesi. MODELDIR.
// Olaylar KAYIT olarak girer; saldiri adimi degil, adimin biraktigi kayit modellenir.
export const TOHUM = 20260403;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r = uretec(TOHUM);
const tam = (n) => Math.floor(r() * n);
const HESAP = Array.from({ length: 120 }, (_, i) => `sh-${301 + i}`);
const SERVIS = Array.from({ length: 6 }, (_, i) => `sv-${11 + i}`);

const ham = [];        // {dakika, aktor, tur, etiket} — etiket modelin dogrusudur
const ek = (t, a, tur, e) => ham.push({ t: Math.round(t), aktor: a, tur, etiket: e });
const kez = (n, f) => { for (let k = 0; k < n; k++) f(); };

// Arka plan: gunluk olagan is. Servis kimligi yetki degistiremez, o kayit onda hic yok.
for (const h of HESAP) {
  kez(2 + tam(6), () => ek(tam(1440), h, "kimlik.basarili", "olagan"));
  kez(tam(9), () => ek(tam(1440), h, "kimlik.basarisiz", "olagan"));
  kez(tam(4), () => ek(tam(1440), h, "yetki.degistir", "olagan"));
  kez(4 + tam(14), () => ek(tam(1440), h, "akis.giden", "olagan"));
}
for (const h of SERVIS) {
  kez(6 + tam(10), () => ek(tam(1440), h, "kimlik.basarili", "olagan"));
  kez(tam(20), () => ek(tam(1440), h, "kimlik.basarisiz", "olagan"));
  kez(20 + tam(40), () => ek(tam(1440), h, "akis.giden", "olagan"));
}
// Yogun parola sifirlama: esigi asan mesru kume, ardindan giris ve yetki isi.
for (const h of HESAP.slice(0, 9)) {
  let t = 420 + tam(600);
  kez(6 + tam(5), () => ek(t += 1 + r() * 3, h, "kimlik.basarisiz", "sifirlama"));
  ek(t += 12, h, "kimlik.basarili", "sifirlama");
  if (r() < 0.55) ek(t + 5 + tam(30), h, "yetki.degistir", "sifirlama");
}
// Bes kurgu kampanya: [ad, aktor, basarisiz kayit sayisi, ucuncu adimin turu, gecikme dk].
// Yalnizca KAYIT dizisi verilir; yontem anlatilmaz.
const KAMPANYA = [["k1", HESAP[8], 40, "yetki.degistir", 25],
  ["k2", HESAP[21], 22, "yetki.degistir", 48], ["k3", HESAP[55], 61, "yetki.degistir", 9],
  ["k4", SERVIS[2], 33, "akis.giden", 20],     // ucuncu adim yalniz ag akisinda
  ["k5", HESAP[96], 4, "yetki.degistir", 35]]; // basarisizlik esigin altinda
for (const [ad, h, n, ucuncu, gecikme] of KAMPANYA) {
  let t = 60 + tam(1200);
  kez(n, () => ek(t += 0.4 + r() * 1.2, h, "kimlik.basarisiz", ad));
  ek(t += 3, h, "kimlik.basarili", ad);
  ek(t + gecikme, h, ucuncu, ad);
}
ham.sort((a, b) => a.t - b.t);
export const OLAY = ham.map(({ t, aktor, tur }) => ({ t, aktor, tur }));
export const ETIKET = ham.map((o) => o.etiket);   // hat bunu GORMEZ
export const AD = KAMPANYA.map(([a]) => a);

// Baginti kurali K1 (durum makinesi): ayni aktorde P dakika icinde >=E basarisiz kayit,
// ardindan bir basarili, ardindan G dakika icinde bir yetki degisikligi.
export function K1({ esik = 5, pencere = 30, gecikme = 60 } = {}) {
  const durum = new Map(), uyari = [], aday = new Set(), gecen = new Set();
  for (const [i, o] of OLAY.entries()) {
    const d = durum.get(o.aktor) || { bas: [], acik: null, kanit: [] };
    durum.set(o.aktor, d);
    if (o.tur === "kimlik.basarisiz") {
      d.bas = d.bas.filter((x) => OLAY[x].t > o.t - pencere).concat(i);
      if (d.bas.length >= esik) aday.add(o.aktor);
    } else if (o.tur === "kimlik.basarili" && d.bas.length >= esik) {
      d.acik = o.t; d.kanit = [...d.bas, i]; gecen.add(o.aktor);
    } else if (o.tur === "yetki.degistir" && d.acik !== null && o.t - d.acik <= gecikme) {
      uyari.push({ aktor: o.aktor, t: o.t, kanit: [...d.kanit, i] });
      d.acik = null; d.bas = [];
    }
  }
  return { uyari, aday: aday.size, gecen: gecen.size };
}
export const yakalayan = (u, ad) => u.find((x) => x.kanit.some((i) => ETIKET[i] === ad));
export const yanlisPozitif = (u) => u.filter((x) => !x.kanit.some((i) => AD.includes(ETIKET[i])));

if (import.meta.url === `file://${process.argv[1]}`) {
  const s = K1(), birlesen = s.uyari.reduce((a, u) => a + u.kanit.length, 0);
  console.log(`model (tohum ${TOHUM}): ${OLAY.length} olay, ${HESAP.length} personel ve ` +
    `${SERVIS.length} servis hesabi, ${KAMPANYA.length} kurgu kampanya (kayit olarak)`);
  console.log(`K1 (esik 5 / pencere 30 dk / gecikme 60 dk): ${s.uyari.length} uyari; ` +
    `bu uyarilar ${birlesen} ham olayi birlestiriyor, olay basina ` +
    `${(birlesen / s.uyari.length).toFixed(1)}`);
  const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
    : String(v).padEnd(B[0]))).join("");
  const yz = gen([11, 9, 18, 11, 15, 32]);
  console.log();
  console.log(yz(["kampanya", "kayit", "ucuncu adim", "yakalandi", "birlesen olay",
    "gorulmeme nedeni"]));
  for (const [ad, , n, ucuncu] of KAMPANYA) {
    const u = yakalayan(s.uyari, ad);
    console.log(yz([ad, n + 2, ucuncu, u ? "evet" : "hayir", u ? u.kanit.length : 0,
      u ? "-" : ucuncu === "akis.giden" ? "ucuncu adim yalniz ag akisinda"
        : "basarisizlik esigin altinda"]));
  }
  console.log(`\naday aktor ${s.aday}, ikinci kosulu gecen ${s.gecen}, uyari ` +
    `${s.uyari.length}; bunlarin ${yanlisPozitif(s.uyari).length} tanesi hicbir kampanya ` +
    `kaydi icermiyor`);
}
```

```
model (tohum 20260403): 3083 olay, 120 personel ve 6 servis hesabi, 5 kurgu kampanya (kayit olarak)
K1 (esik 5 / pencere 30 dk / gecikme 60 dk): 10 uyari; bu uyarilar 161 ham olayi birlestiriyor, olay basina 16.1

kampanya       kayit       ucuncu adim  yakalandi  birlesen olay                gorulmeme nedeni
k1                42    yetki.degistir       evet             32                               -
k2                24    yetki.degistir       evet             24                               -
k3                63    yetki.degistir       evet             32                               -
k4                35        akis.giden      hayir              0  ucuncu adim yalniz ag akisinda
k5                 6    yetki.degistir      hayir              0     basarisizlik esigin altinda

aday aktor 12, ikinci kosulu gecen 12, uyari 10; bunlarin 7 tanesi hicbir kampanya kaydi icermiyor
```

Birleşme oranı kuralın en görünür işidir: 10 uyarı 161 ham olayı topluyor, uyarı başına 16,1 kayıt.
Analistin önüne 161 satır değil, 10 kalem geliyor ve her kalemin altında kanıt kümesi duruyor. Bu,
bir önceki dersteki 184 kümenin yerine geçen sayıdır ve kuralın **var olma nedenidir**.

Üçüncü sütun bir ayrıntıyı gösteriyor: k3'ün 63 kaydı var ama uyarıda yalnız 32 olay birleşiyor.
Otuz dakikalık pencere daha eski başarısızlıkları düşürüyor, çünkü sayaç kayan penceredir. Kanıt
kümesi olayın tamamı değil, **kuralın gördüğü bölümüdür**; inceleme sırasında geri kalanı elle
aranır.

Alt iki satır dersin asıl sonucudur. k5 eşiğin altında kalıyor: dört başarısız kayıt beş eşiğini
geçmiyor ve kural hiç uyanmıyor. k4 ise farklı bir nedenle görünmüyor — üçüncü adımı bir yetki
değişikliği değil, giden bir ağ bağlantısıdır ve kuralın üçüncü koşulu o türü hiç sormaz. Servis
kimliğinde yetki değişikliği kaydı **hiçbir zaman oluşmaz**; kural bu aktörde tanım gereği
tetiklenemez.

Bu iki satır bir önceki dersin ölçüsüne doğrudan bağlanır. Kural yalnız şemada bulunan alanları
sorabilir; k4'ün üçüncü kaydı ortak şemaya oturuyor ama kuralın koşul dizisinde o türe yer yoktur.
Eksiklik kaynağın toplanmamasından değil, kuralın **hangi alanı sorduğundan** gelir ve bu ayrım
tespit kapsamının sayılmasında belirleyicidir.

Son satır bedeli veriyor: 10 uyarının 7'si hiçbir kampanya kaydı içermiyor. Bunların çoğu yoğun
parola sıfırlama kümesidir — eşiği aşan meşru başarısızlık, ardından giriş, ardından olağan bir
yetki işi. Kuralın koşul dizisi bu diziyi kampanyadan ayırt edemez, çünkü ikisi de aynı üç kaydı
aynı sırayla bırakır.

#### Kayıttan Karara: Huni ve Dakika

```js
// huni.mjs — kayittan karara giden zincir: her adimda kac aday eleniyor, kac dakika ekleniyor.
import { OLAY, K1, AD, yakalayan, yanlisPozitif } from "./akis.mjs";

// Zincirin sabit gecikmeleri model VERISIDIR, olcum degil (dakika).
const AKTARIM = 3, KUYRUK = 14, INCELEME = 9;
const s = K1(), yp = yanlisPozitif(s.uyari);
// Kuralin ucuncu adimi beklemek zorunda kaldigi ortalama sure.
const bekleme = s.uyari.reduce((a, u) =>
  a + (u.t - OLAY[u.kanit[u.kanit.length - 2]].t), 0) / s.uyari.length;

const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const yh = gen([32, 12, 10, 13]);
console.log(`${OLAY.length} ham olay, ${s.uyari.length} uyari, ` +
  `${s.uyari.length - yp.length} tanesi bir kampanya kaydi iceriyor`);
console.log();
console.log(yh(["adim", "kalan aday", "elenen", "eklenen dk"]));
const adim = [["ham kayit", OLAY.length, 0], ["aktarim ve normallestirme", OLAY.length, AKTARIM],
  ["kosul 1: 5 basarisiz / 30 dk", s.aday, 0], ["kosul 2: ardindan basarili", s.gecen, 0],
  ["kosul 3: 60 dk icinde yetki", s.uyari.length, Math.round(bekleme)],
  ["uyari kuyrugu", s.uyari.length, KUYRUK],
  ["analist incelemesi", s.uyari.length - yp.length, INCELEME]];
let onceki = OLAY.length, toplam = 0;
for (const [ad, kalan, dk] of adim) {
  toplam += dk;
  console.log(yh([ad, kalan, onceki - kalan, dk]));
  onceki = kalan;
}
console.log(`toplam: ${OLAY.length} kayittan ${s.uyari.length - yp.length} karara, ` +
  `ilk kaydin dusmesinden ${toplam} dakika sonra`);

const yz = gen([7, 10, 10, 8, 8, 12, 13, 13]);
console.log();
console.log(yz(["esik", "pencere", "gecikme", "aday", "uyari", "yakalanan", "yanlis poz.",
  "inceleme dk"]));
for (const [esik, pencere, gecikme] of [[5, 30, 60], [3, 30, 60], [8, 30, 60],
    [5, 5, 60], [3, 5, 60], [5, 30, 15], [5, 30, 240]]) {
  const k = K1({ esik, pencere, gecikme });
  const y = AD.filter((a) => yakalayan(k.uyari, a)).length;
  const n = yanlisPozitif(k.uyari).length;
  console.log(yz([esik, `${pencere} dk`, `${gecikme} dk`, k.aday, k.uyari.length,
    `${y}/${AD.length}`, n, n * INCELEME]));
}
```

```
3083 ham olay, 10 uyari, 3 tanesi bir kampanya kaydi iceriyor

adim                              kalan aday    elenen   eklenen dk
ham kayit                               3083         0            0
aktarim ve normallestirme               3083         0            3
kosul 1: 5 basarisiz / 30 dk              12      3071            0
kosul 2: ardindan basarili                12         0            0
kosul 3: 60 dk icinde yetki               10         2           17
uyari kuyrugu                             10         0           14
analist incelemesi                         3         7            9
toplam: 3083 kayittan 3 karara, ilk kaydin dusmesinden 43 dakika sonra

esik      pencere   gecikme    aday   uyari   yakalanan  yanlis poz.  inceleme dk
5           30 dk     60 dk      12      10         3/5            7           63
3           30 dk     60 dk      18      11         4/5            7           63
8           30 dk     60 dk      10       8         3/5            5           45
5            5 dk     60 dk       4       2         2/5            0            0
3            5 dk     60 dk      12       5         4/5            1            9
5           30 dk     15 dk      12       6         1/5            5           45
5           30 dk    240 dk      12      11         3/5            8           72
```

Huninin ilk satırı bütün elemeyi tek adımda yapıyor: birinci koşul 3.083 olayı 12 adaya indiriyor.
İkinci koşul **hiçbir şey elemiyor** — eşiği aşan on iki aktörün hepsi eninde sonunda giriyor.
Kuralı dar tutan şey, sanıldığı gibi üç koşulun art arda gelmesi değil, birinci koşuldur; ikinci
koşul yalnız zincirin başlangıcını işaretler.

Dakika sütunu daha az bilinen bir maliyeti gösteriyor. Üçüncü koşulun eklediği 17 dakika bir işlem
gecikmesi değildir — kural **beklemek zorundadır**, çünkü üçüncü kaydın gelip gelmeyeceği ancak
gecikme penceresi dolduğunda bilinir. Toplam 43 dakika bu kuralın fark etme süresidir ve
17'si kuralın kendi tanımından, 14'ü kuyruktan, 9'u incelemeden gelir. Aktarım ve normalleştirmenin payı yalnız 3 dakikadır; hattı
hızlandırmaya çalışan bir çalışmanın kazanabileceği en fazla süre budur.

Alt tablo parametrelerin sınırını çiziyor. Eşiği üçe çekmek k5'i getiriyor ve yakalanan 4/5 oluyor,
ama aday sayısı 12'den 18'e çıkıyor. Pencereyi beş dakikaya daraltmak yanlış pozitifi sıfırlıyor ve
inceleme yükünü 63 dakikadan sıfıra indiriyor — karşılığında k2 kayboluyor, çünkü onun kayıtları
otuz dakikalık pencereye yayılmıştır. En iyi satır eşik 3 ile pencere 5'in birleşimidir: 4/5 ve tek
yanlış pozitif.

Hiçbir satır 5/5 vermiyor. k4 her ayarda görünmez kalır, çünkü eksik olan eşik ya da pencere değil
**kaynaktır**: üçüncü adımın kaydı yalnız ağ akış verisindedir ve K1 o türü hiç sormaz. Parametre
taraması bir kuralın **kendi tanımının dışına** çıkamaz.

#### Özet

- Üç koşullu bağıntı kuralı 3.083 ham olayı 10 uyarıya indiriyor ve bu uyarılar 161 olayı
  birleştiriyor; uyarı başına 16,1 kayıt analistin önüne tek kalem olarak geliyor.
- Kanıt kümesi olayın tamamı değildir: k3'ün 63 kaydından uyarıya yalnız 32'si giriyor, çünkü sayaç
  kayan penceredir ve daha eskileri düşürür.
- Beş kampanyanın üçü yakalanıyor; k5 eşiğin altında kalıyor, k4 üçüncü adımını yalnız ağ akışında
  bıraktığı için kuralın tanımı gereği hiç görünmüyor.
- On uyarının 7'si hiçbir kampanya kaydı içermiyor; yoğun parola sıfırlama kümesi kampanyayla aynı
  üç kaydı aynı sırayla bıraktığı için koşul dizisi ikisini ayıramıyor.
- Kayıttan karara 43 dakika geçiyor ve bunun 17'si kuralın üçüncü adımı beklemesinden, 14'ü
  kuyruktan, 9'u incelemeden gelir; aktarım ve normalleştirmenin payı 3 dakikadır.

#### Sonraki Adım

k4'ün üçüncü adımı hiçbir kimlik ya da yönetim kaydında yoktu; yalnız giden bir bağlantı olarak, ağ
akış verisinde vardı. O kaynak öteki ikisinden yapı olarak ayrılır: bir akış kaydı bağlantının
**içeriğini** yazmaz, yalnız kimin kiminle, ne kadar süreyle ve kaç bayt konuştuğunu yazar. Sonraki
ders bu kısıtı ölçüye çevirir — içerik olmadan hangi soru yanıtlanabiliyor, hangisi yanıtlanamıyor
ve şifreli bir bağlantıda meta veriden okunabilen düzen, kaç kalemi öteki kaynakların hiç görmediği
bir eksende ayırıyor.

### Ağ Akış Verisi

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/ag-akis-verisi

2.979 kurgu akış kaydı üzerinde yalnız meta veriye bakan dört ölçüt koşturulur: düzenli aralık 7 çift işaretliyor ve 6'sı sayaç aktarımı, çıkış oranı 23 işaretliyor ve 22'si gecelik yedekleme, yeni hedef 7 işaretliyor ve 6'sı yeni iş kalemi, uzun oturum 6 işaretliyor ve 5'i yönetim oturumu. Dört kurgu kalemin dördü de işaretleniyor, ama toplam 43 çiftin 39'u meşrudur. Aynı kayıt kümesine sorulan on sorunun 6'sı yalnız meta veriden yanıtlanıyor; ne gönderildiği, hangi hesabın yaptığı, isteğin kabul edilip edilmediği ve hangi sürecin başlattığı yanıtsız kalıyor. İşaretlenenlerin tümü kesilirse 630 akış ve 8,8 GB meşru iş durur.

Bir önceki dersin k4 kalemi hiçbir kimlik ya da yönetim kaydında görünmüyordu; üçüncü adımı yalnız
giden bir bağlantı olarak, ağ akış verisinde vardı. O kaynak öteki ikisinden **yapı olarak** ayrılır.
Bir akış kaydı bağlantının içeriğini yazmaz; kimin kiminle, hangi kapıda, ne kadar süreyle ve kaç
bayt konuştuğunu yazar.

Bu ders o kısıtı ölçüye çevirir. Soru "akış verisi yararlı mıdır" değil, **içerik olmadan hangi
sorunun yanıtlanabildiğidir** — ve bunun karşılığında kaç meşru bağlantının işaretlendiğidir. Aşağıdaki
kayıt kümesi bir **modeldir**; dış adresler belgeleme için ayrılmış bloklardan seçilmiştir ve gerçek
bir uca karşılık gelmez.

- **TA18.** Akış kaydının yedi alanı vardır: zaman, konak, hedef, kapı, süre, giden bayt, gelen bayt.
  **İçerik alanı yoktur** ve bu bir yapılandırma eksikliği değil, kaynağın tanımıdır.
- **TA19.** Kurgu ağda dört meşru trafik biçimi bulunur: personel gezinmesi, sayaç toplayıcıların
  on beş dakikalık aktarımı, gecelik yedekleme ve uzun yönetim oturumları.
- **TA20.** Dört kurgu kalem yalnız **kayıt olarak** verilir: düzenli aralıklı bağlantı dizisi,
  yüksek çıkış oranlı aktarım, taban çizgisinde bulunmayan hedef ve tek uzun oturum.
- **TA21.** Ölçüt bir `(konak, hedef, kapı)` üçlüsü üzerinde çalışır ve yalnız meta veriye bakar.
  Etiket modelin doğrusudur, kayda yazılmaz.
- **TA22.** Taban çizgisi, önceki günlerde görülmüş `(hedef, kapı)` ikililerinin kümesidir ve model
  verisi olarak verilir.

#### Meta Veriye Bakan Dört Ölçüt

```js
// akisveri.mjs — kurgu ag akis kayitlari ve yalniz meta veriye bakan dort olcut. MODELDIR.
// Dis adresler belgeleme icin ayrilmis bloklardandir; gercek uc ve kurum yoktur.
export const TOHUM = 20260404;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r = uretec(TOHUM);
const tam = (n) => Math.floor(r() * n);

const UC = Array.from({ length: 40 }, (_, i) => `uc-${101 + i}`);
const TOPLAYICI = Array.from({ length: 6 }, (_, i) => `tp-${11 + i}`);
const IC = Array.from({ length: 8 }, (_, i) => `10.90.1.${20 + i}`);
const DIS = Array.from({ length: 30 }, (_, i) => `198.51.100.${10 + i}`);

// Akis kaydi: baglantinin ICERIGI yoktur. Yalniz kim, kimle, ne kadar, ne sure.
const ham = [];
const ek = (t, konak, hedef, port, sure, giden, gelen, etiket) =>
  ham.push({ t: Math.round(t), konak, hedef, port, sure, giden, gelen, etiket });

// Personel gezinmesi: gelen bayt giden bayttan cok buyuk, hedef degisken.
for (const u of UC)
  for (let k = 0, n = 30 + tam(60); k < n; k++)
    ek(tam(1440), u, DIS[tam(30)], 443, 1 + tam(90), 800 + tam(9000),
      20000 + tam(900000), "gezinme");
// Sayac toplayicilar: on bes dakikada bir ic hedefe kucuk ve DUZENLI aktarim.
for (const [j, tp] of TOPLAYICI.entries())
  for (let t = j * 2; t < 1440; t += 15)
    ek(t, tp, IC[j % 8], 5671, 2 + tam(3), 40000 + tam(4000), 900 + tam(400), "olcum-aktarimi");
// Gecelik yedekleme: buyuk giden, dusuk gelen, gunde bir kez.
for (const u of UC.slice(0, 22))
  ek(120 + tam(120), u, IC[6], 8443, 40 + tam(40), 3e8 + tam(2e8), 5000 + tam(4000), "yedekleme");
// Uzun yonetim oturumlari.
for (const u of UC.slice(0, 5)) ek(540 + tam(120), u, IC[7], 22, 150 + tam(180),
  90000 + tam(50000), 300000 + tam(200000), "yonetim-oturumu");

// Dort kurgu kalem. Yalnizca KAYIT verilir; yontem anlatilmaz.
const KALEM = ["d1-duzenli-aralik", "d2-cikis-orani", "d3-yeni-hedef", "d4-uzun-oturum"];
for (let t = 30, k = 0; k < 96; k++, t += 15)                       // d1
  ek(t + (r() < 0.5 ? 0 : 1), UC[7], "203.0.113.24", 443, 1 + tam(2), 1200 + tam(400),
    600 + tam(300), KALEM[0]);
for (let k = 0, t = 800; k < 12; k++)                               // d2
  ek(t += 4 + tam(9), UC[19], "203.0.113.31", 443, 20 + tam(40), 4e7 + tam(2e7),
    3000 + tam(2000), KALEM[1]);
for (let k = 0; k < 3; k++)                                         // d3
  ek(1010 + k * 7, UC[31], "203.0.113.9", 9443, 3 + tam(6), 9000 + tam(4000),
    12000 + tam(9000), KALEM[2]);
ek(300, UC[24], IC[3], 8443, 415, 2200000, 6100000, KALEM[3]);      // d4
// Yeni is kalemi: uc mesru dis hedef gun icinde ilk kez goruluyor.
for (const [j, u] of UC.slice(30, 36).entries())
  for (let k = 0, n = 2 + tam(5); k < n; k++)
    ek(600 + tam(500), u, `192.0.2.${40 + (j % 3)}`, 443, 2 + tam(30), 3000 + tam(9000),
      40000 + tam(300000), "yeni-is-kalemi");
ham.sort((a, b) => a.t - b.t);
export const AKIS = ham.map(({ etiket, ...a }, i) => ({ ...a, i }));
export const ETIKET = ham.map((a) => a.etiket);   // modelin dogrusu; olcutler GORMEZ

// Taban cizgisi: onceki gunlerde gorulmus (hedef, port) ikilileri (model verisi).
export const TABAN = new Set([...IC.flatMap((h) => [`${h}|5671`, `${h}|8443`, `${h}|22`]),
  ...DIS.map((h) => `${h}|443`), "203.0.113.24|443", "203.0.113.31|443"]);

// Dort olcut: yalniz meta veriye bakar, icerige degil.
const ciftler = () => {
  const m = new Map();
  for (const a of AKIS) {
    const k = `${a.konak}|${a.hedef}|${a.port}`;
    (m.get(k) || m.set(k, []).get(k)).push(a);
  }
  return m;
};
export const OLCUT = {
  "duzenli aralik": () => [...ciftler()].filter(([, l]) => {
    if (l.length < 12) return false;
    const d = l.slice(1).map((a, i) => a.t - l[i].t);
    const o = d.reduce((x, y) => x + y, 0) / d.length;
    return o > 0 && Math.sqrt(d.reduce((x, y) => x + (y - o) ** 2, 0) / d.length) / o < 0.15;
  }),
  "cikis orani": () => [...ciftler()].filter(([, l]) => {
    const g = l.reduce((x, a) => x + a.giden, 0), a = l.reduce((x, b) => x + b.gelen, 0);
    return g > 5e6 && g / a > 20;
  }),
  "yeni hedef": () => [...ciftler()].filter(([k]) => {
    const [, h, p] = k.split("|");
    return !TABAN.has(`${h}|${p}`);
  }),
  "uzun oturum": () => [...ciftler()].filter(([, l]) => l.some((a) => a.sure > 120)),
};

if (import.meta.url === `file://${process.argv[1]}`) {
  const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
    : String(v).padEnd(B[0]))).join("");
  const yz = gen([16, 12, 10, 13, 34]);
  console.log(`model (tohum ${TOHUM}): ${AKIS.length} akis kaydi, ` +
    `${new Set(AKIS.map((a) => a.konak)).size} konak; kayitta icerik alani yok`);
  console.log(`ornek: ${JSON.stringify(AKIS[ETIKET.indexOf(KALEM[0])])}`);
  console.log();
  console.log(yz(["olcut", "isaretlenen", "kalem", "yanlis poz.", "yanlis pozitifin kaynagi"]));
  for (const [ad, f] of Object.entries(OLCUT)) {
    const l = f();
    const et = ([, x]) => ETIKET[x[0].i];
    const dogru = l.filter((c) => KALEM.includes(et(c)));
    const yp = l.filter((c) => !KALEM.includes(et(c)));
    console.log(yz([ad, l.length, dogru.map((c) => et(c).slice(0, 2)).join(",") || "-",
      yp.length, [...new Set(yp.map(et))].join(", ") || "-"]));
  }
  const hepsi = new Set(Object.values(OLCUT).flatMap((f) => f().map(([, x]) => ETIKET[x[0].i])
    .filter((e) => KALEM.includes(e))));
  const toplam = Object.values(OLCUT).reduce((a, f) => a + f().length, 0);
  console.log(`\ndort kurgu kalemin ${hepsi.size} tanesi en az bir olcutle isaretleniyor; ` +
    `dort olcut toplam ${toplam} cift isaretliyor`);
}
```

```
model (tohum 20260404): 2979 akis kaydi, 46 konak; kayitta icerik alani yok
ornek: {"t":31,"konak":"uc-108","hedef":"203.0.113.24","port":443,"sure":1,"giden":1402,"gelen":676,"i":70}

olcut            isaretlenen     kalem  yanlis poz.          yanlis pozitifin kaynagi
duzenli aralik             7        d1            6                    olcum-aktarimi
cikis orani               23        d2           22                         yedekleme
yeni hedef                 7        d3            6                    yeni-is-kalemi
uzun oturum                6        d4            5                   yonetim-oturumu

dort kurgu kalemin 4 tanesi en az bir olcutle isaretleniyor; dort olcut toplam 43 cift isaretliyor
```

Örnek kayıt dersin sınırını gösteriyor: yedi alan var ve hiçbiri ne taşındığını söylemiyor. Buna
karşılık dört ölçüt dört kurgu kalemin **dördünü de** işaretliyor. İçerik görülmeden bir düzen
görülebilir; ölçülen şey içeriğin kendisi değil, bağlantının **şeklidir**.

Şeklin ayırt edici gücü ise düşüktür ve tablonun son iki sütunu bunu yazıyor. Düzenli aralık ölçütü
yedi çift işaretliyor, altısı sayaç toplayıcıların on beş dakikalık aktarımıdır. Aynı düzenlilik —
sabit aralık, küçük ve eşit boyutlu paketler — bu ağın **normal işidir**; kurgu kalem tam olarak
normal işin şekline sahiptir. Çıkış oranı ölçütü daha da kötüdür: yirmi üç çiftin yirmi ikisi
gecelik yedeklemedir.

Yeni hedef ölçütü altı meşru kalemi işaretliyor, çünkü üç yeni iş bağlantısı da gün içinde ilk kez
görülüyor. Bir ayrıntı burada önemlidir: d1 kaleminin hedefi taban çizgisinde **vardır**, yani yeni
hedef ölçütü onu hiç görmez. Dört kalemin dördünü birden yakalayan tek bir ölçüt yoktur; kapsama
dört ölçütün birleşiminden gelir ve o birleşim 43 çift işaretler.

#### İçerik Olmadan Yanıtlanan Soru

```js
// soru.mjs — akis kaydinin yanitlayabildigi ve yanitlayamadigi sorular, sonra kesme bedeli.
import { AKIS, ETIKET, TABAN, OLCUT } from "./akisveri.mjs";

const cift = AKIS.filter((a) => ETIKET[a.i] === "d1-duzenli-aralik");
const bayt = (n) => (n > 1e9 ? `${(n / 1e9).toFixed(1)} GB` : `${(n / 1e6).toFixed(1)} MB`);
const ortanca = (v) => v.slice().sort((a, b) => a - b)[Math.floor(v.length / 2)];
// Her soru bir islev: akis kaydindan yanit uretebiliyorsa yaniti, uretemiyorsa null doner.
const SORU = [
  ["hangi iki uc konustu", (l) => `${l[0].konak} -> ${l[0].hedef}:${l[0].port}`],
  ["kac kez baglandi", (l) => `${l.length} kez`],
  ["hangi araliklarla", (l) => `${ortanca(l.slice(1).map((x, i) => x.t - l[i].t))} dk`],
  ["ne kadar veri gitti", (l) => bayt(l.reduce((a, x) => a + x.giden, 0))],
  ["ne kadar surdu", (l) => `en cok ${Math.max(...l.map((x) => x.sure))} dk`],
  ["hedef daha once gorulmus mu",
    (l) => (TABAN.has(`${l[0].hedef}|${l[0].port}`) ? "evet" : "hayir")],
  ["ne gonderildi", () => null],
  ["hangi hesap yapti", () => null],
  ["istek kabul edildi mi", () => null],
  ["hangi surec baslatti", () => null],
];
const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const ys = gen([30, 16, 28]);
console.log(`d1 kalemi: ${cift.length} akis kaydi. Ayni kayit kumesine on soru soruluyor.`);
console.log();
console.log(ys(["soru", "yanitlanabilir", "yanit"]));
for (const [ad, f] of SORU) {
  const y = f(cift);
  console.log(ys([ad, y === null ? "hayir" : "evet", y === null ? "-" : y]));
}
const acik = SORU.filter(([, f]) => f(cift) !== null).length;
console.log(`\non sorunun ${acik} tanesi yalniz meta veriden yanitlaniyor, ` +
  `${SORU.length - acik} tanesi baska kaynak istiyor`);

// Erken karar: yalniz akis olcutune bakip baglanti kesilirse kesilen mesru is.
const KAYNAK = { "olcum-aktarimi": ["sayac toplama durur", 0], "yedekleme": ["gecelik yedek", 0],
  "yeni-is-kalemi": ["yeni is baglantisi", 0], "yonetim-oturumu": ["yonetim erisimi", 0] };
const isaret = new Map();
for (const [, f] of Object.entries(OLCUT))
  for (const [k, l] of f()) if (!isaret.has(k)) isaret.set(k, l);
let mesruCift = 0, mesruKayit = 0, mesruBayt = 0;
for (const [, l] of isaret) {
  const e = ETIKET[l[0].i];
  if (!KAYNAK[e]) continue;
  mesruCift++; mesruKayit += l.length;
  mesruBayt += l.reduce((a, x) => a + x.giden + x.gelen, 0);
  KAYNAK[e][1]++;
}
const yk = gen([22, 10, 30]);
console.log(`\nisaretlenen ayri cift ${isaret.size}, bunlarin ${mesruCift} tanesi mesru; ` +
  `kesilirse ${mesruKayit} akis ve ${bayt(mesruBayt)} durur`);
console.log(yk(["kesilen is turu", "cift", "duran is"]));
for (const [e, [ne, n]] of Object.entries(KAYNAK)) console.log(yk([e, n, ne]));
```

```
d1 kalemi: 96 akis kaydi. Ayni kayit kumesine on soru soruluyor.

soru                            yanitlanabilir                       yanit
hangi iki uc konustu                      evet  uc-108 -> 203.0.113.24:443
kac kez baglandi                          evet                      96 kez
hangi araliklarla                         evet                       15 dk
ne kadar veri gitti                       evet                      0.1 MB
ne kadar surdu                            evet                 en cok 2 dk
hedef daha once gorulmus mu               evet                        evet
ne gonderildi                            hayir                           -
hangi hesap yapti                        hayir                           -
istek kabul edildi mi                    hayir                           -
hangi surec baslatti                     hayir                           -

on sorunun 6 tanesi yalniz meta veriden yanitlaniyor, 4 tanesi baska kaynak istiyor

isaretlenen ayri cift 43, bunlarin 39 tanesi mesru; kesilirse 630 akis ve 8.8 GB durur
kesilen is turu             cift                      duran is
olcum-aktarimi                 6           sayac toplama durur
yedekleme                     22                 gecelik yedek
yeni-is-kalemi                 6            yeni is baglantisi
yonetim-oturumu                5               yonetim erisimi
```

Soru tablosu akış verisinin sınırını sayıya çeviriyor: on sorunun altısı yanıtlanıyor, dördü
yanıtsız kalıyor. Yanıtlananlar tek başına bir **karar** vermeye yetmez. `uc-108` on beş dakikada bir
aynı hedefe 96 kez bağlanmış ve toplam 0,1 megabayt göndermiş; bu tanım hem yinelenen bir denetim
isteğine hem de başka bir şeye uyar. Ayrımı yapacak alanlar — hangi hesap, hangi süreç, istek kabul
edildi mi — akış kaydında **yoktur**.

Yanıtsız dört sorunun her biri belirli bir kaynağı adlandırır. Hangi hesabın yaptığı sorusu ikinci
dersteki adres eşlemesini gerektirir ve o eşleme beş dakikalık pencerede 404 kaydın 190'ına yanıt
verebiliyordu. Hangi sürecin başlattığı sorusu uç nokta kaydını, isteğin kabul edilip edilmediği
sorusu yönetim düzlemi kaydını ister. Akış verisi bir **karar kaynağı değil, bir yönlendirme
kaynağıdır**: hangi konağa ve hangi zaman aralığına bakılacağını söyler.

Son tablo erken kararın bedelini yazıyor. İşaretlenen 43 çiftin 39'u meşrudur ve tümü kesilirse 630
akış ile 8,8 gigabayt iş durur. Bu, düz bir sayı değildir: kesilenlerin altısı sayaç toplama
aktarımıdır ve bu aktarım durduğunda ölçüm verisi merkeze hiç ulaşmaz. Yirmi iki çift gecelik
yedeklemedir; bir gün yedeksiz kalmak, kursun ilerleyen bölümünde kurtarma kararını doğrudan
etkileyen bir kayıptır.

#### Özet

- Akış kaydının yedi alanı vardır ve içerik alanı yoktur; buna karşın yalnız şekle bakan dört ölçüt
  dört kurgu kalemin dördünü de işaretliyor.
- Ayırt edicilik düşüktür: düzenli aralık 7 çiftin 6'sında sayaç aktarımını, çıkış oranı 23 çiftin
  22'sinde gecelik yedeklemeyi, yeni hedef 7 çiftin 6'sında yeni iş bağlantısını işaretliyor.
- Tek bir ölçüt dört kalemin dördünü birden yakalamıyor; d1'in hedefi taban çizgisinde bulunduğu
  için yeni hedef ölçütü onu hiç görmez, kapsama dört ölçütün birleşiminden gelir.
- On sorunun 6'sı yalnız meta veriden yanıtlanıyor; ne gönderildiği, hangi hesabın yaptığı, isteğin
  kabul edilip edilmediği ve hangi sürecin başlattığı dört soru başka kaynak ister.
- İşaretlenen 43 çiftin 39'u meşrudur; tümü kesilirse 630 akış ve 8,8 gigabayt iş durur, bunun altı
  çifti sayaç toplama aktarımıdır.

#### Sonraki Adım

Bu dersin dört ölçütü sabit eşiklerle çalıştı ve sonuç 43 işaretin 39'unun meşru çıkmasıydı.
Eşikleri sıkılaştırmak akla gelen ilk düzeltmedir: değişim katsayısını 0,15 yerine 0,05 yapmak,
çıkış oranını yirmi yerine iki yüz istemek. Sonraki ders bunu bir tarama olarak koşturur ve iki
eğriyi aynı eksende çizer — eşik sıkılaştıkça yanlış pozitif düşer, ama kaçırılan yükselir. Ölçülen
şey hangi eşiğin doğru olduğu değil, iki eğrinin **kesişmediği** noktadır: kurgu kalemlerin
puanlarıyla meşru işin puanlarının üst üste bindiği bantta hiçbir eşik ikisini birden azaltamaz ve o
bandın kaç kalem içerdiği sayılabilir.

### Yanlış Pozitif ve Yanlış Negatif

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/yanlis-pozitif-ve-yanlis-negatif

900 aday kalemin 20'si kurgu kalemdir ve dört öznitelikten çıkan puanların dağılımları 37–88 bandında üst üste biner: bu bantta 157 meşru ve 17 kurgu kalem vardır, hiçbir eşik ikisini birden ayıramaz. Eşik 40'ta yanlış pozitif 124 ve kaçırılan 1, eşik 80'de yanlış pozitif 1 ve kaçırılan 11; toplam hatayı en aza indiren 70 eşiğinde bile 4 yanlış pozitif ve 4 kaçırılan kalır. Günde 144 analist-dakikalık bütçe eşiği 72'ye çiviliyor: 16 uyarı, 7 kaçırılan kalem ve 42 erişilen ek kalem. Beşinci bir öznitelik bandı 49–75'e ve 15 meşru ile 7 kaleme daraltıyor, bütçe eşiğini 66'ya çekiyor, ama sıfır-sıfır veren eşik yine yok.

Bir önceki dersin dört ölçütü sabit eşiklerle çalıştı ve 43 işaretin 39'u meşru çıktı. Akla gelen
ilk düzeltme eşikleri sıkılaştırmaktır: değişim katsayısını 0,15 yerine 0,05 istemek, çıkış oranını
yirmi yerine iki yüz istemek. Bu ders o düzeltmeyi bir **tarama** olarak koşturur ve iki eğriyi aynı
eksende çizer.

Sonuç tek bir eşiğin doğru olup olmadığı değildir. Sayılan şey, iki dağılımın üst üste bindiği
banttır: o bantta bulunan kalemler için hiçbir eşik hem yanlış pozitifi hem kaçırılanı azaltamaz.
Bu, kursun geri kalanının üzerine kurulduğu ölçümdür. Aşağıdaki puan dağılımı bir **modeldir**;
puanlar kurgu özniteliklerden türetilir, gerçek bir ölçüm değildir.

- **TA23.** Aday kümesi 900 kalemdir: 880 meşru iş, 20 kurgu kalem. Etiket modelin doğrusudur ve
  puanlamaya girmez.
- **TA24.** Puan dört öznitelikten ağırlıklı toplamla çıkar: düzenlilik, çıkış oranı, hedef
  yeniliği ve saat dışılık. Ağırlıklar model verisidir.
- **TA25.** İki dağılım da **kuyrukludur**: bazı meşru kalemler yüksek puan alır, bazı kurgu
  kalemler düşük. Bu, modelin bir kusuru değil, dersin konusudur.
- **TA26.** Örtüşme bandı, en düşük kurgu kalem puanı ile en yüksek meşru puan arasındaki
  aralıktır. Bandın dışındaki kalemler her eşikte doğru sınıflanır.
- **TA27.** Bedel iki yönlüdür ve ikisi de model verisiyle sayılır: uyarı başına 9 dakika inceleme,
  kaçırılan kalem başına gün sonuna kadar erişilen 6 ek kalem, bu kurala ayrılan günlük 144
  analist-dakika.

#### Puan Dağılımı ve Eşik Taraması

```js
// esik.mjs — aday kalemler puanlanir, esik taranir ve ortusme bandi sayilir. MODELDIR.
export const TOHUM = 20260405;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r = uretec(TOHUM);

// Dort oznitelik, her biri 0-1 arasi. Agirliklar model verisidir.
export const AGIRLIK = { duzenlilik: 0.30, cikisOrani: 0.30, hedefYeniligi: 0.25, saatDisi: 0.15 };
const dusuk = () => r() ** 3;            // mesru kalem: cogu dusuk, kuyrugu var
const yuksek = () => 1 - r() ** 3;       // kurgu kalem: cogu yuksek, kuyrugu var

export const puanla = (o) => Math.round(100 *
  Object.entries(AGIRLIK).reduce((a, [k, w]) => a + w * o[k], 0));

export const ADAY = [];
for (let k = 0; k < 880; k++)
  ADAY.push({ duzenlilik: dusuk(), cikisOrani: dusuk(), hedefYeniligi: dusuk(),
    saatDisi: dusuk(), etiket: "mesru" });
for (let k = 0; k < 20; k++)
  ADAY.push({ duzenlilik: yuksek(), cikisOrani: yuksek(), hedefYeniligi: yuksek(),
    saatDisi: yuksek(), etiket: "kalem" });
for (const o of ADAY) o.puan = puanla(o);
ADAY.sort((a, b) => a.puan - b.puan);

export const mesru = ADAY.filter((o) => o.etiket === "mesru");
export const kalem = ADAY.filter((o) => o.etiket === "kalem");
export const tara = (esik) => ({
  esik,
  yanlisPozitif: mesru.filter((o) => o.puan >= esik).length,
  kacirilan: kalem.filter((o) => o.puan < esik).length,
  uyari: ADAY.filter((o) => o.puan >= esik).length,
});

if (import.meta.url === `file://${process.argv[1]}`) {
  const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
    : String(v).padEnd(B[0]))).join("");
  const yz = gen([8, 9, 15, 13, 13, 12]);
  console.log(`model (tohum ${TOHUM}): ${ADAY.length} aday kalem, ${kalem.length} tanesi ` +
    `kurgu kalem; puan dort oznitelikten agirlikli toplamla cikiyor`);
  console.log(`mesru puan araligi ${mesru[0].puan}-${mesru[mesru.length - 1].puan}, ` +
    `kurgu kalem araligi ${kalem[0].puan}-${kalem[kalem.length - 1].puan}`);
  const yd = gen([16, 10, 14]);
  console.log();
  console.log(yd(["puan araligi", "mesru", "kurgu kalem"]));
  for (let a = 0; a < 100; a += 20) {
    const ic = (l) => l.filter((o) => o.puan >= a && o.puan < a + 20).length;
    console.log(yd([`${a}-${a + 19}`, ic(mesru), ic(kalem)]));
  }
  console.log();
  console.log(yz(["esik", "uyari", "yanlis pozitif", "kacirilan", "toplam hata", "kesinlik"]));
  for (const e of [10, 20, 30, 40, 50, 60, 70, 80]) {
    const t = tara(e);
    console.log(yz([e, t.uyari, t.yanlisPozitif, t.kacirilan,
      t.yanlisPozitif + t.kacirilan,
      t.uyari ? `${Math.round(100 * (t.uyari - t.yanlisPozitif) / t.uyari)}%` : "-"]));
  }
  // Ortusme bandi: en dusuk kurgu kalem puani ile en yuksek mesru puan arasi.
  const alt = kalem[0].puan, ust = mesru[mesru.length - 1].puan;
  const bandM = mesru.filter((o) => o.puan >= alt && o.puan <= ust).length;
  const bandK = kalem.filter((o) => o.puan >= alt && o.puan <= ust).length;
  console.log(`\nortusme bandi ${alt}-${ust}: bu bantta ${bandM} mesru ve ${bandK} kurgu kalem ` +
    `var; hicbir esik ikisini birden ayiramaz`);
  const en = [...Array(101).keys()].map(tara)
    .reduce((a, b) => (b.yanlisPozitif + b.kacirilan < a.yanlisPozitif + a.kacirilan ? b : a));
  console.log(`toplam hatayi en aza indiren esik ${en.esik}: yanlis pozitif ` +
    `${en.yanlisPozitif}, kacirilan ${en.kacirilan}; sifir-sifir veren esik yok`);
}
```

```
model (tohum 20260405): 900 aday kalem, 20 tanesi kurgu kalem; puan dort oznitelikten agirlikli toplamla cikiyor
mesru puan araligi 0-88, kurgu kalem araligi 37-97

puan araligi         mesru   kurgu kalem
0-19                   357             0
20-39                  399             1
40-59                  108             2
60-79                   15             8
80-99                    1             9

esik        uyari yanlis pozitif    kacirilan  toplam hata    kesinlik
10            766            746            0          746          3%
20            543            523            0          523          4%
30            302            282            0          282          7%
40            143            124            1          125         13%
50             74             56            2           58         24%
60             33             16            3           19         52%
70             20              4            4            8         80%
80             10              1           11           12         90%

ortusme bandi 37-88: bu bantta 157 mesru ve 17 kurgu kalem var; hicbir esik ikisini birden ayiramaz
toplam hatayi en aza indiren esik 70: yanlis pozitif 4, kacirilan 4; sifir-sifir veren esik yok
```

Dağılım tablosu dersin bütün konusunu beş satırda veriyor. Meşru kalemlerin 756'sı 40'ın altında,
kurgu kalemlerin 19'u 40'ın üstündedir; bu, puanın işe yaradığı anlamına gelir. Ama üçüncü ve
dördüncü satırlar iki dağılımın aynı kutuları paylaştığını gösteriyor: 40–59 aralığında 108 meşru
kalemle 2 kurgu kalem, 60–79 aralığında 15 meşru kalemle 8 kurgu kalem yan yana durur. Bu
satırlarda puan bir ayrım üretmez.

Eşik taraması aynı gerçeği karar diliyle yazıyor ve arada hiç düz bir bölge yoktur. Eşik 40'ta 124
yanlış pozitif ve 1 kaçırılan; eşik 80'de 1 yanlış pozitif ve 11 kaçırılan. Eşiği düşürmek
kaçırılanı azaltır ve inceleme yükünü büyütür; yükseltmek incelemeyi hafifletir ve kaçırılanı
büyütür. **Aradaki geçiş süreklidir**; iki sayının ikisini birden sıfıra indiren bir nokta yoktur.

Nedeni ikinci satırda yazılı: meşru puanlar 0 ile 88 arasında, kurgu kalem puanları 37 ile 97
arasındadır. Bu iki aralık 37–88 arasında **üst üste biner** ve o bantta 157 meşru kalem ile 17
kurgu kalem bulunur. Bir eşik bandın içinde nereye konursa konsun, altında kalan kurgu kalemleri
kaçırır ve üstünde kalan meşru kalemleri işaretler. Bandın dışındaki 726 kalem her eşikte doğru
sınıflanır; ölçülen belirsizlik yalnız bant kadardır.

Kesinlik sütunu bir başka yanılgıyı düzeltiyor. Eşik 10 için kesinlik yüzde 3 çıkıyor: uyarıların yüzde
98'i meşru iştir. Eşik 80'de kesinlik yüzde 90'a çıkar ama kaçırılan 11'e fırlar. Kesinlik tek
başına bir kalite ölçüsü değildir, çünkü **hiç uyarı üretmeyen bir kural** için tanımsızdır ve az
uyarı üreten her kural yüksek kesinlik gösterir.

#### Bütçe Eşiği ve Bandı Daraltmak

Toplam hatayı en aza indiren eşik 70'tir ve orada 4 yanlış pozitif ile 4 kaçırılan kalır. Ancak bu
seçim pratikte yapılmaz, çünkü 70 eşiği 20 uyarı üretir ve her uyarı analist zamanı ister. Çalışma
noktasını doğruluk değil, kapasite belirler.

```js
// nokta.mjs — esigin iki yonlu bedeli dakika olarak, sonra besinci oznitelikle bant.
import { ADAY, tara } from "./esik.mjs";

// Model verisi (olcum degil): inceleme dakikasi, kacirilan kalemin gun sonuna kadar
// eristigi ek kalem sayisi ve bu kurala ayrilan gunluk analist dakikasi.
const INCELEME = 9, EK_KALEM = 6, BUTCE = 144;
const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const yz = gen([8, 8, 13, 12, 15, 13]);
console.log(`gunluk butce ${BUTCE} analist-dakika, uyari basina inceleme ${INCELEME} dakika; ` +
  `kacirilan her kalem gun sonuna kadar ${EK_KALEM} ek kaleme erisiyor (model verisi)`);
console.log();
console.log(yz(["esik", "uyari", "inceleme dk", "kacirilan", "erisilen kalem", "butceye"]));
for (const e of [40, 50, 60, 70, 80, 90]) {
  const t = tara(e);
  console.log(yz([e, t.uyari, t.uyari * INCELEME, t.kacirilan, t.kacirilan * EK_KALEM,
    t.uyari * INCELEME <= BUTCE ? "sigiyor" : "sigmiyor"]));
}
const sigan = [...Array(101).keys()].map(tara).filter((t) => t.uyari * INCELEME <= BUTCE);
const secim = sigan[0];
console.log(`\nbutceye sigan en dusuk esik ${secim.esik}: ${secim.uyari} uyari, ` +
  `${secim.kacirilan} kacirilan kalem, ${secim.kacirilan * EK_KALEM} erisilen ek kalem`);

// Besinci oznitelik: kimlik kaynaginda eslesen kayit var mi. Ayirt edici ama kusursuz degil.
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r2 = uretec(880517);
const AG2 = { duzenlilik: 0.21, cikisOrani: 0.21, hedefYeniligi: 0.18,
  saatDisi: 0.10, eslesmeyenKimlik: 0.30 };
const ADAY2 = ADAY.map((o) => ({ ...o,
  eslesmeyenKimlik: (o.etiket === "kalem" ? r2() < 0.8 : r2() < 0.03) ? 1 : 0 }));
for (const o of ADAY2) o.puan = Math.round(100 *
  Object.entries(AG2).reduce((a, [k, w]) => a + w * o[k], 0));

const bant = (liste) => {
  const m = liste.filter((o) => o.etiket === "mesru"), k = liste.filter((o) => o.etiket === "kalem");
  const alt = Math.min(...k.map((o) => o.puan)), ust = Math.max(...m.map((o) => o.puan));
  const say = (l) => l.filter((o) => o.puan >= alt && o.puan <= ust).length;
  // Calisma noktasi: butceye sigan EN DUSUK esik.
  const en = [...Array(101).keys()].map((e) => ({ e, n: liste.filter((o) => o.puan >= e).length,
    yp: m.filter((o) => o.puan >= e).length, kc: k.filter((o) => o.puan < e).length }))
    .find((x) => x.n * INCELEME <= BUTCE);
  return { alt, ust, m: say(m), k: say(k), en };
};
const yb = gen([18, 9, 16, 16, 13, 13]);
console.log();
console.log(yb(["puanlama", "bant", "banttaki mesru", "banttaki kalem", "butce esigi",
  "yp / kacan"]));
for (const [ad, liste] of [["dort oznitelik", ADAY], ["bes oznitelik", ADAY2]]) {
  const b = bant(liste);
  console.log(yb([ad, `${b.alt}-${b.ust}`, b.m, b.k, b.en.e, `${b.en.yp} / ${b.en.kc}`]));
}
console.log(`\nbesinci oznitelik banttaki kalem sayisini dusuruyor ama bandi kapatmiyor; ` +
  `sifir yanlis pozitif ve sifir kacirilan veren esik iki puanlamada da yok`);
```

```
gunluk butce 144 analist-dakika, uyari basina inceleme 9 dakika; kacirilan her kalem gun sonuna kadar 6 ek kaleme erisiyor (model verisi)

esik       uyari  inceleme dk   kacirilan erisilen kalem      butceye
40           143         1287           1              6     sigmiyor
50            74          666           2             12     sigmiyor
60            33          297           3             18     sigmiyor
70            20          180           4             24     sigmiyor
80            10           90          11             66      sigiyor
90             3           27          17            102      sigiyor

butceye sigan en dusuk esik 72: 16 uyari, 7 kacirilan kalem, 42 erisilen ek kalem

puanlama               bant  banttaki mesru  banttaki kalem  butce esigi   yp / kacan
dort oznitelik        37-88             157              17           72        3 / 7
bes oznitelik         49-75              15               7           66        1 / 5

besinci oznitelik banttaki kalem sayisini dusuruyor ama bandi kapatmiyor; sifir yanlis pozitif ve sifir kacirilan veren esik iki puanlamada da yok
```

Bütçe sütunu eşik seçimini elden alıyor. Toplam hatayı en aza indiren 70 eşiği 180 dakika inceleme
ister ve 144 dakikalık bütçeye sığmaz. Sığan en düşük eşik 72'dir; orada 16 uyarı incelenir, 7 kurgu
kalem kaçar ve model verisine göre bu 7 kalem gün sonuna kadar 42 ek kaleme erişir. **Eşiği seçen
şey doğruluk değil, analist dakikasıdır.**

İki yönlü bedelin birimleri farklıdır ve bu, karşılaştırmayı zorlaştıran asıl güçlüktür. Sol taraf
dakikadır ve doğrudan ödenir: 40 eşiğinde 1.287 dakika, yani dokuz kişilik bir günden fazla. Sağ
taraf kalemdir ve gecikmeli ödenir: 90 eşiğinde 17 kaçırılan kalem, 102 erişilen ek kalem. İkisini
aynı eksende toplamak ancak bir kalemin kaç dakikaya karşılık geldiği yazılırsa mümkündür ve o sayı
teknik değil, kurumsal bir karardır.

Son tablo tek gerçek çıkış yolunu gösteriyor: bandı daraltmak. Beşinci öznitelik — kalemin kimlik
kaynağında eşleşen bir kaydının bulunmaması — bandı 37–88'den 49–75'e, banttaki meşru kalemi
157'den 15'e, banttaki kurgu kalemi 17'den 7'ye indiriyor. Bütçe eşiği 72'den 66'ya iner ve o
noktada yanlış pozitif 3'ten 1'e, kaçırılan 7'den 5'e düşer. **İki sayı aynı anda iyileşiyor**,
çünkü değişen şey eşik değil, puanın kendisidir.

Beşinci özniteliğin de bir bedeli vardır ve o bedel ikinci derste ölçülmüştü. "Kimlik kaynağında
eşleşen kayıt yok" diyebilmek için önce eşlemenin denenmiş olması gerekir; o eşleme beş dakikalık
pencerede kayıtların bir bölümüne yanıt verebiliyordu ve kalanında sonuç belirsizdi. Belirsiz kalan
kalemde bu öznitelik doldurulamaz. Yani bandı daraltan iyileştirme, hattın **daha önce ölçülmüş bir
eksikliğine** dayanır ve o eksiklik büyüdükçe iyileştirme küçülür.

Yine de bant kapanmıyor. Beşinci öznitelik kurgu kalemlerin yüzde 80'inde bulunuyor, meşru
kalemlerin yüzde 3'ünde de bulunuyor; kalan örtüşme bu iki oranın doğrudan sonucudur. Sıfır yanlış
pozitif ve sıfır kaçırılan veren eşik iki puanlamada da yoktur ve daha fazla öznitelik eklemek bandı
daraltır, kapatmaz.

#### Özet

- 900 aday kalemin puanları 37–88 bandında örtüşüyor; o bantta 157 meşru ve 17 kurgu kalem vardır
  ve hiçbir eşik ikisini birden ayıramaz. Bandın dışındaki 726 kalem her eşikte doğru sınıflanır.
- Eşik 40'ta 124 yanlış pozitif ve 1 kaçırılan, eşik 80'de 1 yanlış pozitif ve 11 kaçırılan çıkıyor;
  toplam hatayı en aza indiren 70 eşiğinde bile 4 ve 4 kalıyor.
- Kesinlik tek başına kalite ölçüsü değildir: az uyarı üreten her kural yüksek kesinlik gösterir,
  eşik 80'de kesinlik yüzde 90 iken kaçırılan 11'dir.
- Çalışma noktasını doğruluk değil bütçe seçiyor: 144 analist-dakikaya sığan en düşük eşik 72'dir
  ve orada 7 kurgu kalem kaçarak 42 ek kaleme erişiyor.
- Beşinci öznitelik bandı 49–75'e, banttaki meşru kalemi 15'e ve kurgu kalemi 7'ye indiriyor; bütçe
  eşiğinde yanlış pozitif 3'ten 1'e, kaçırılan 7'den 5'e düşüyor, ama sıfır-sıfır veren eşik yok.

#### Sonraki Adım

Bandı daraltan şey eşik ayarı değil, yeni bir öznitelikti — yani puanlamanın kendisinin
değişmesiydi. Bu, bir kuralın ayarlanması değil, **yeniden yazılmasıdır** ve düzenli yapılan bir
iştir. Sonraki ders o işi bir döngü olarak ele alır: bir kural kümesinin iki sürümünü aynı teknik
listesine karşı koşturur ve kapsanan teknik sayısını karşılaştırır. Ölçü orada kaç kural yazıldığı
değil, taktik ve teknik matrisinin kaç gözünün en az bir kuralla kapsandığı, kaçının hiç
kapsanmadığı ve kapsandığı yazılan gözlerin kaçında kuralın hiç ateşlenemeyeceğidir — çünkü o gözün
kaynağı hattın hiç toplamadığı bir yerdedir.

### Tespit Mühendisliği

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/tespit-muhendisligi

Sekiz taktik sütunu ve 26 teknik satırı olan kurgu bir sınıflandırma matrisinde iki kural sürümü karşılaştırılır: sürüm 1'in 6 kuralı 11 tekniği kapsıyor ama yalnız 8'i ateşlenebilir, 15 teknik hiç kapsanmıyor; sürüm 2'nin 11 kuralı 24 tekniği kapsıyor, 19'u ateşlenebilir, hiç kapsanmayan 2'ye iniyor. 51 kurgu örnek üzerinde sürüm 1 10 örnek yakalıyor, sürüm 2 30; kaçırmanın nedeni ayrıştırıldığında kural yokluğu 32'den 3'e inerken kaynak yokluğu 4'ten 11'e çıkıyor. Ek 220 dakikalık yazma işi örnek başına 11 dakikaya geliyor, günlük yanlış pozitif 30'dan 27'ye düşüyor ama inceleme yükü 360 dakikadan 513 dakikaya çıkıyor.

Bir önceki derste bandı daraltan şey eşik ayarı değil, yeni bir öznitelikti — yani puanlamanın
kendisinin değişmesi. Bu, bir kuralın ayarlanması değil **yeniden yazılmasıdır** ve düzenli yapılan
bir iştir. Tespit mühendisliği o işin adıdır: kural yaz, koştur, kaçırdığını ölç, düzelt.

Döngünün ölçüsü kaç kural yazıldığı olamaz, çünkü kural sayısı ne kapsamayı ne de doğruluğu verir.
Bu ders ölçüyü bir sınıflandırma matrisi üzerinden kurar. Matris **yapısıyla** ele alınır: sütunlar
taktik, satırlar tekniktir; buradaki teknikler ve izleri **kurgudur** ve gerçek bir sınıflandırma
çalışmasının içeriğine karşılık gelmez.

- **TA28.** Matriste 8 taktik sütunu ve 26 teknik satırı vardır. Her teknik satırı, izinin hangi
  kaynağa düştüğüyle etiketlidir.
- **TA29.** Bir teknik üç durumdan birindedir: izi **toplanan** bir kaynağa düşer, izi toplanmayan
  bir kaynağa düşer, ya da **hiçbir kaynakta iz bırakmaz**. Son iki durumda kural yazılabilir ama
  ateşlenemez.
- **TA30.** Kural bir veya birkaç tekniği kapsar. Her kuralın üç sayısı vardır: yazma ve ayarlama
  dakikası, duyarlılık, günlük yanlış pozitif. Üçü de model verisidir.
- **TA31.** **Kapsanan** teknik, en az bir kuralın hedeflediği tekniktir. **Ateşlenebilir kapsama**,
  bunun kaynağı toplanan alt kümesidir. İkisi arasındaki fark kağıt üstünde kalan kapsamadır.
- **TA32.** Örnek kümesi tekniklerin kurgu örneklerinden oluşur ve iki sürüm için **aynıdır**;
  karşılaştırmanın anlamı buna bağlıdır.

#### Matriste Kapsama ve İki Sürüm

```js
// kapsam.mjs — taktik ve teknik matrisinde iki kural surumunun kapsamasi. MODELDIR.
// Matris yapisiyla ele alinir: sutunlar taktik, satirlar teknik. Teknikler kurgudur.
export const TAKTIK = [["ilk erisim", 3], ["calistirma", 4], ["kalicilik", 4],
  ["yetki yukseltme", 3], ["kimlik bilgisi elde etme", 4], ["kesif", 3],
  ["yanal hareket", 3], ["sizdirma", 2]];

// Her teknigin izi hangi kaynakta duser: K kimlik, U uc nokta, A ag akisi,
// Y yonetim duzlemi, S toplanMAYAN sunucu uygulama gunlugu, - hicbir kaynakta iz yok.
const IZ = "KUS UAUY U-UA KYS K-UY AAU S-K AA".replace(/ /g, "").split("");
export const TEKNIK = [];
for (const [taktik, n] of TAKTIK)
  for (let k = 0; k < n; k++) {
    const i = TEKNIK.length;
    TEKNIK.push({ id: `t${String(i + 1).padStart(2, "0")}`, taktik, iz: IZ[i] });
  }
// Hatta toplanan kaynaklar (model verisi). S kaynagi vardir ama toplanmamaktadir.
export const TOPLANAN = new Set(["K", "U", "Y", "A"]);

// Kural: [ad, kapsadigi teknik indeksleri, yazma+ayarlama dakikasi, duyarlilik, gunluk yanlis poz.]
export const SURUM1 = [["s1", [0, 2], 90, 0.8, 3], ["s2", [6, 8], 120, 0.7, 5],
  ["s3", [12, 16], 150, 0.6, 4], ["s4", [20, 23], 90, 0.75, 2],
  ["s5", [1, 13], 180, 0.5, 9], ["s6", [4], 240, 0.4, 7]];
export const SURUM2 = [["s1", [0, 2], 30, 0.85, 2], ["s2", [6, 8], 40, 0.8, 2],
  ["s3", [12, 16], 40, 0.7, 2], ["s4", [20, 23], 20, 0.8, 1],
  ["s5", [1, 13, 17], 60, 0.6, 3], ["s7", [3, 9], 150, 0.7, 3],
  ["s8", [5, 10, 14], 210, 0.65, 4], ["s9", [18, 21], 180, 0.55, 3],
  ["s10", [7, 11], 120, 0.5, 2], ["s11", [24, 25], 90, 0.6, 2],
  ["s12", [15, 19], 150, 0.45, 3]];

export function kapsama(kurallar) {
  const kapsanan = new Set(kurallar.flatMap(([, l]) => l));
  const say = (f) => [...kapsanan].filter((i) => f(TEKNIK[i].iz)).length;
  return { kapsanan, atesle: new Set([...kapsanan].filter((i) => TOPLANAN.has(TEKNIK[i].iz))),
    toplanmayan: say((z) => z === "S"), izsiz: say((z) => z === "-"),
    hic: TEKNIK.length - kapsanan.size,
    dakika: kurallar.reduce((a, k) => a + k[2], 0),
    yp: kurallar.reduce((a, k) => a + k[4], 0) };
}

if (import.meta.url === `file://${process.argv[1]}`) {
  const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
    : String(v).padEnd(B[0]))).join("");
  const yt = gen([26, 8, 10, 12, 12]);
  const k1 = kapsama(SURUM1), k2 = kapsama(SURUM2);
  console.log(`matris: ${TAKTIK.length} taktik sutunu, ${TEKNIK.length} teknik satiri; ` +
    `${TEKNIK.filter((t) => t.iz === "S").length} teknigin kaynagi toplanmiyor, ` +
    `${TEKNIK.filter((t) => t.iz === "-").length} teknigin hicbir kaynakta izi yok`);
  console.log();
  console.log(yt(["taktik", "teknik", "surum 1", "surum 2", "izi olmayan"]));
  for (const [taktik] of TAKTIK) {
    const l = TEKNIK.filter((t) => t.taktik === taktik);
    const say = (s) => l.filter((t) => s.has(TEKNIK.indexOf(t))).length;
    console.log(yt([taktik, l.length, say(k1.kapsanan), say(k2.kapsanan),
      l.filter((t) => !TOPLANAN.has(t.iz)).length]));
  }
  const yk = gen([10, 8, 12, 15, 14, 10, 16, 11]);
  console.log();
  console.log(yk(["surum", "kural", "kapsanan", "ateslenebilir", "kaynagi yok",
    "izi yok", "hic kapsanmaz", "yazma dk"]));
  for (const [ad, k, l] of [["surum 1", k1, SURUM1], ["surum 2", k2, SURUM2]])
    console.log(yk([ad, l.length, `${k.kapsanan.size}/${TEKNIK.length}`,
      `${k.atesle.size}/${TEKNIK.length}`, k.toplanmayan, k.izsiz, k.hic, k.dakika]));
}
```

```
matris: 8 taktik sutunu, 26 teknik satiri; 3 teknigin kaynagi toplanmiyor, 3 teknigin hicbir kaynakta izi yok

taktik                      teknik   surum 1     surum 2 izi olmayan
ilk erisim                       3         3           3           1
calistirma                       4         2           3           0
kalicilik                        4         1           4           1
yetki yukseltme                  3         2           3           1
kimlik bilgisi elde etme         4         1           4           1
kesif                            3         1           3           0
yanal hareket                    3         1           2           2
sizdirma                         2         0           2           0

surum        kural    kapsanan  ateslenebilir   kaynagi yok   izi yok   hic kapsanmaz   yazma dk
surum 1          6       11/26           8/26             2         1              15        870
surum 2         11       24/26          19/26             3         2               2       1090
```

Taktik tablosu ilk bulguyu veriyor: sürüm 1'in kapsaması **eşit dağılmamıştır**. İlk erişim satırının
üçü de kapsanıyor, sızdırma satırının hiçbiri kapsanmıyor. Bu, tespit yazımının doğal eğilimidir —
kolay kural, alanları ayırt edici olan kaynakta yazılır ve o kaynak genellikle zincirin başındadır.
Sonuç bir kapsama haritasında değil, **kaçırılan kalemlerde** görünür. Sızdırma satırının boş
kalması, o taktiğin önemsiz görülmesinden değil, izinin ağ akış verisinde bulunmasından ve o
kaynakta ayırt edici bir kural yazmanın dördüncü derste ölçülmüş güçlüğünden gelir.

Alt tablodaki iki sütun arasındaki fark dersin ana kavramıdır. Sürüm 1 on bir tekniği kapsıyor ama
yalnız sekizi ateşlenebilir: üç teknikte kural vardır ve hiçbir zaman tetiklenmez. Bunların ikisinde
kaynak vardır ama hatta toplanmıyor, birinde teknik hiçbir kaynakta iz bırakmıyor. "Yirmi altı
tekniğin on birini kapsıyoruz" cümlesi bu ayrım yazılmadığında **yanlış bir cümledir**.

Sürüm 2 kapsamayı 24'e, ateşlenebilir kapsamayı 19'a çıkarıyor ve hiç kapsanmayanı 15'ten 2'ye
indiriyor. Kalan iki tekniğin biri hiçbir kaynakta iz bırakmadığı için kapsanamaz; öteki
kapsanabilirdi ama sürüm 1'deki bir kural döngüde **kaldırıldı**. Yazma işi 870 dakikadan 1.090
dakikaya çıktı; bu sayı yeni kuralların yanı sıra eski kuralların ayarlanmasını da içerir ve ilk
dört kuralın ikinci sürümdeki dakikaları belirgin biçimde düşüktür, çünkü ayarlamak yazmaktan
ucuzdur.

#### Sürümleri Aynı Örnek Kümesinde Koşturmak

```js
// dongu.mjs — iki kural surumu kurgu ornek kumesinde kosturulur; kacirmanin nedeni ayrilir.
import { TEKNIK, TOPLANAN, SURUM1, SURUM2, kapsama } from "./kapsam.mjs";

const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const INCELEME = 9;
// Kurgu ornek kumesi: her teknikten 0-4 ornek. Ornek sayisi VERIDIR.
const ORNEK = [];
{
  const r = uretec(20260406);
  for (const [i] of TEKNIK.entries())
    for (let k = 0, n = Math.floor(r() * 5); k < n; k++) ORNEK.push({ teknik: i, z: r() });
}

function kostur(kurallar) {
  const k = kapsama(kurallar);
  const sonuc = { yakalanan: 0, kuralYok: 0, kaynakYok: 0, duyarlilik: 0 };
  const atesleyen = new Set(), pay = new Map(kurallar.map(([ad]) => [ad, 0]));
  for (const o of ORNEK) {
    const kapsayan = kurallar.filter(([, l]) => l.includes(o.teknik));
    if (kapsayan.length === 0) { sonuc.kuralYok++; continue; }
    if (!TOPLANAN.has(TEKNIK[o.teknik].iz)) { sonuc.kaynakYok++; continue; }
    const en = Math.max(...kapsayan.map(([, , , d]) => d));
    if (o.z < en) {
      sonuc.yakalanan++;
      kapsayan.forEach(([ad]) => { atesleyen.add(ad); pay.set(ad, pay.get(ad) + 1); });
    } else sonuc.duyarlilik++;
  }
  const olu = kurallar.filter(([ad]) => !atesleyen.has(ad)).map(([ad, l]) => {
    const tk = l.filter((i) => !TOPLANAN.has(TEKNIK[i].iz)).length;
    const orn = ORNEK.filter((o) => l.includes(o.teknik)).length;
    return `${ad} (${l.length} teknik, ${tk} tanesinin kaynagi yok, ${orn} ornek)`;
  });
  return { ...sonuc, yp: k.yp, dakika: k.dakika, olu, pay,
    inceleme: (sonuc.yakalanan + k.yp) * INCELEME };
}

const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const yz = gen([10, 8, 11, 11, 12, 13, 13, 13]);
console.log(`kurgu ornek kumesi: ${ORNEK.length} ornek, ${TEKNIK.length} teknige dagilmis`);
console.log();
console.log(yz(["surum", "ornek", "yakalanan", "kural yok", "kaynak yok", "duyarlilik",
  "yanlis poz.", "inceleme dk"]));
const [a, b] = [SURUM1, SURUM2].map(kostur);
for (const [ad, s] of [["surum 1", a], ["surum 2", b]])
  console.log(yz([ad, ORNEK.length, s.yakalanan, s.kuralYok, s.kaynakYok, s.duyarlilik,
    s.yp, s.inceleme]));
console.log(`\nhic ateslenmeyen kural — surum 1: ${a.olu.join(", ") || "yok"}; ` +
  `surum 2: ${b.olu.join(", ") || "yok"}`);
console.log(`surum 2 ek ${b.dakika - a.dakika} dakika yazma isiyle ` +
  `${b.yakalanan - a.yakalanan} ek ornek yakaliyor: ornek basina ` +
  `${Math.round((b.dakika - a.dakika) / (b.yakalanan - a.yakalanan))} dakika`);
console.log(`gunluk yanlis pozitif ${a.yp} -> ${b.yp}, gunluk inceleme ` +
  `${a.inceleme} -> ${b.inceleme} dakika`);

const yp = gen([8, 9, 13, 12, 12, 11, 17]);
console.log("\nsurum 2 kural bazinda:");
console.log(yp(["kural", "teknik", "kaynagi yok", "yakaladigi", "gunluk yp", "yazma dk",
  "ornek basina dk"]));
for (const [ad, l, dk, , fp] of SURUM2) {
  const n = b.pay.get(ad);
  console.log(yp([ad, l.length, l.filter((i) => !TOPLANAN.has(TEKNIK[i].iz)).length, n, fp, dk,
    n ? Math.round(dk / n) : "-"]));
}
```

```
kurgu ornek kumesi: 51 ornek, 26 teknige dagilmis

surum        ornek  yakalanan  kural yok  kaynak yok   duyarlilik  yanlis poz.  inceleme dk
surum 1         51         10         32           4            5           30          360
surum 2         51         30          3          11            7           27          513

hic ateslenmeyen kural — surum 1: s6 (1 teknik, 0 tanesinin kaynagi yok, 1 ornek); surum 2: s9 (2 teknik, 1 tanesinin kaynagi yok, 3 ornek)
surum 2 ek 220 dakika yazma isiyle 20 ek ornek yakaliyor: ornek basina 11 dakika
gunluk yanlis pozitif 30 -> 27, gunluk inceleme 360 -> 513 dakika

surum 2 kural bazinda:
kural      teknik  kaynagi yok  yakaladigi   gunluk yp   yazma dk  ornek basina dk
s1              2            1           1           2         30               30
s2              2            1           4           2         40               10
s3              2            0           3           2         40               13
s4              2            0           3           1         20                7
s5              3            1           4           3         60               15
s7              2            0           5           3        150               30
s8              3            0           1           4        210              210
s9              2            1           0           3        180                -
s10             2            0           3           2        120               40
s11             2            0           5           2         90               18
s12             2            1           1           3        150              150
```

Kaçırmanın üç nedeni ayrı sütunlarda duruyor ve döngünün ne yaptığını tam olarak bu ayrım gösteriyor.
Sürüm 1'de 41 kaçırmanın 32'si kural yokluğundandır; sürüm 2'de bu sayı 3'e iner. Buna karşılık
kaynak yokluğu 4'ten 11'e **çıkar**. Bu artış bir gerileme değildir: kural yazıldıkça, kaçırmanın
nedeni kural eksikliğinden kaynak eksikliğine kayar. İkinci sütun tükendiğinde geriye kalan sayı
kural yazarak azaltılamaz; toplama kararı gerektirir.

Duyarlılık sütunu üçüncü nedeni tutuyor: kural var, kaynak var, ama örnek kuralın eşiğini geçmedi.
Bu sayı 5'ten 7'ye çıkıyor, çünkü sürüm 2 daha çok tekniği kapsıyor ve yeni kuralların duyarlılığı
düşüktür. Bir kural kümesini büyütmek, kaçırmanın **dağılımını** değiştirir; her nedeni birden
küçültmez. Üç sütunun üçü de ayrı bir işe karşılık gelir: birincisi kural yazmayı, ikincisi toplama
kararını, üçüncüsü bir önceki dersteki eşik ve öznitelik çalışmasını gerektirir. Aynı sayıyı
"kaçırılan" diye tek sütunda toplamak, hangi işin yapılacağını belirsiz bırakır.

Ölü kural satırı bakımın gizli kalemidir. Sürüm 1'de s6 hiç ateşlenmedi ve o kural 240 dakika yazma
işi tüketmişti; sürüm 2'de s9 hiç ateşlenmedi ve kapsadığı iki teknikten birinin kaynağı zaten
toplanmıyor. Ölü kural bir kapsama tablosunda **kapsanan** olarak görünür, bir uyarı listesinde hiç
görünmez ve her sürüm yükseltmesinde yeniden gözden geçirilir.

Döngünün faturası şudur: ek 220 dakikalık yazma işi 20 ek örnek yakalıyor, örnek başına 11 dakika.
Günlük yanlış pozitif 30'dan 27'ye iniyor — kural sayısı neredeyse ikiye katlandığı hâlde düşüyor,
çünkü sürüm 1'in en gürültülü kuralı kaldırıldı. Ama günlük inceleme yükü 360 dakikadan 513 dakikaya
çıkıyor: doğru tespitin de bir inceleme maliyeti vardır ve iyi bir kural kümesi vardiyayı
rahatlatmaz, **doldurur**.

Kural bazındaki son tablo ortalamanın gizlediğini açıyor. Örnek başına dakika sütunu 7 ile 210
arasında değişiyor: s4 yirmi dakikalık ayarlamayla üç örnek yakalıyor, s8 iki yüz on dakikalık
yazma işiyle bir örnek. İkisi de kapsama tablosunda birer satırdır ve orada aynı görünürler.
Kapsamayı ölçü almak bu yüzden yetmez; **kapsanan gözün kaç örnek getirdiği** ayrı bir sayıdır.

Aynı tabloda `kaynagi yok` sütunu beş kuralda sıfırdan büyüktür. Bu kurallar iki teknik kapsadıkları
hâlde yalnız birinde ateşlenebilir; kapsama sayımına iki, ateşlenebilir sayıma bir katkı verirler.
En uç örnek s9'dur: iki teknik, biri toplanmayan kaynakta, gün boyu sıfır yakalama, 180 dakika
yazma işi. Bir kuralın iyi ya da kötü olduğu ancak koşturulduktan sonra söylenebilir ve koşturmanın
kendisi bu döngünün asıl adımıdır.

#### Özet

- Kapsanan teknik ile ateşlenebilir kapsama ayrı sayılır: sürüm 1 on bir tekniği kapsıyor ama
  yalnız sekizi ateşlenebilir, üçünde kural vardır ve hiçbir zaman tetiklenmez.
- Kapsama taktikler arasında eşit dağılmıyor; sürüm 1 ilk erişim satırının üçünü de kapsarken
  sızdırma satırının hiçbirini kapsamıyor.
- Sürüm 2 kapsamayı 24'e, ateşlenebilir kapsamayı 19'a çıkarıyor ve hiç kapsanmayanı 15'ten 2'ye
  indiriyor; kalan ikiden biri hiçbir kaynakta iz bırakmadığı için kapsanamaz.
- Kural yazıldıkça kaçırmanın nedeni kayıyor: kural yokluğu 32'den 3'e inerken kaynak yokluğu 4'ten
  11'e çıkıyor ve o sayı kural yazarak azaltılamaz.
- Ek 220 dakikalık yazma işi örnek başına 11 dakikaya geliyor; günlük yanlış pozitif 30'dan 27'ye
  düşerken inceleme yükü 360 dakikadan 513 dakikaya çıkıyor.
- Kural bazında verim 7 ile 210 dakika arasında değişiyor ve kapsama tablosunda bu fark görünmez;
  s9 iki tekniği kapsadığı hâlde hiç ateşlenmiyor ve 180 dakikalık yazma işi karşılıksız kalıyor.

#### Sonraki Adım

Sürüm 2'den sonra 51 örneğin 21'i hâlâ kaçıyor ve bunların 11'i hiçbir kuralın ulaşamayacağı yerde:
kaynağı toplanmayan ya da hiç iz bırakmayan tekniklerde. Kural yazmak bu sayıyı azaltmaz, çünkü
kural ancak sorabildiği alanı sorar. Sonraki ders başka bir yoldan gider: kuraldan değil,
**hipotezden** başlar. Bir hipotez veri kümesine bir soru sorar ve yanıtı bir uyarı değil, elenen
kalem sayısıdır. Ölçü orada hipotez başına kaç kalemin elendiği, kaç hipotezin sıfır sonuç verdiği
ve elenen kalemlerin kaçının yeni bir kurala dönüştüğüdür.

### Tehdit Avcılığı

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/tehdit-avciligi

12.910 kayıtlık kurgu bir telemetri kümesinde altı hipotez koşturulur ve hipotez başına elenen kalem sayılır: h1 üç adımda 12.906 kaydı eleyip 4 kalem bırakıyor, h4 iki adımda 6 kalem, h3 283 kalem bırakıp incelenemez hâle geliyor; h2, h5 ve h6 hiçbir kurgu kalem bulmuyor ama 370 kalemi taban çizgisine yazıyor. Toplam 1.691 dakikalık arama iki kurgu kalem buluyor, kalem başına 846 dakika; kural yazmada örnek başına 11 dakikaydı. Altı hipotezin ikisi günlük on uyarı sınırının altında kaldığı için kurala dönüşüyor, dördü sınırı aşıyor ya da boş dönüyor.

Bir önceki dersin ikinci sürümünden sonra 51 örneğin 21'i hâlâ kaçıyordu ve bunların 11'i hiçbir
kuralın ulaşamayacağı yerdeydi. Kural yazmak o sayıyı azaltmaz, çünkü kural ancak sorabildiği alanı
sorar ve ancak yazıldığı biçimi arar. Tehdit avcılığı başka bir yerden başlar: kuraldan değil,
**hipotezden**.

Hipotez bir uyarı üretmez; bir soru sorar ve yanıtı elenen kalem sayısıdır. Bu ders altı hipotezi
kurgu bir telemetri kümesi üzerinde koşturur ve üç sayı çıkarır: hipotez başına kaç kalem eleniyor,
kaç hipotez sıfır sonuç veriyor ve elenenlerin kaçı kurala dönüşebiliyor. Aşağıdaki kümede iki kurgu
kalem yalnız **kayıt olarak** gömülüdür; hiçbir yerde bir saldırı adımının nasıl yapıldığı yazmaz.
**Kendi ortamı dışında bir sistemde bu tür bir arama, yazılı yetki ve tanımlı kapsam olmadan hem
yasadışı hem meslek dışıdır.**

- **TA33.** Telemetri kümesi bir günü kapsar: 12.910 kayıt, 192 konak, 90 personel ve 8 servis
  kimliği. Kayıt bir süreç çalıştırma olayını ve ona bağlı giden aktarımı taşır.
- **TA34.** Taban çizgisi, her yolun olağan üst sürecidir. Kayıtların yüzde üçünde üst süreç bu
  eşleşmenin dışındadır; bu, modelin kusuru değil, gerçek ortamdaki gürültünün karşılığıdır.
- **TA35.** Hipotez sıralı süzgeçlerden oluşur. Her süzgeç kümeyi daraltır ve **kaç kalemi elediği
  ayrı ayrı sayılır**.
- **TA36.** İki kurgu kalem yalnız kayıt olarak gömülüdür ve etiketleri süzgeçlere girmez. İkisi de
  bir önceki dersin kural kümesinin kapsamadığı davranışlardır.
- **TA37.** Maliyet iki kalemdir: hipotez başına arama dakikası ve kalan kalem başına 2 dakika
  inceleme. Bir hipotez, kalan kalem sayısı günlük on uyarı sınırının altındaysa kurala dönüşebilir.

#### Altı Hipotez, Altı Huni

```js
// avcilik.mjs — kurgu telemetri kumesi ve alti hipotezin adim adim eledigi kalem. MODELDIR.
export const TOHUM = 20260407;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r = uretec(TOHUM);
const tam = (n) => Math.floor(r() * n);
const sec = (d) => d[tam(d.length)];

const KONAK = [...Array.from({ length: 180 }, (_, i) => `uc-${101 + i}`),
               ...Array.from({ length: 12 }, (_, i) => `tp-${11 + i}`)];
const HESAP = Array.from({ length: 90 }, (_, i) => `sh-${201 + i}`);
const SERVIS = Array.from({ length: 8 }, (_, i) => `sv-${11 + i}`);
// Taban cizgisi: her yolun olagan ust sureci (model verisi).
const CIFT = [["/usr/bin/olcum-istemci", "/sbin/servis-yonetici"],
  ["/usr/bin/arsivle", "/usr/bin/zamanlayici"],
  ["/opt/olcum/toplayici", "/opt/olcum/denetleyici"],
  ["/usr/bin/rapor", "/usr/bin/zamanlayici"],
  ["/opt/portal/istemci", "/usr/bin/oturum"],
  ["/usr/bin/yedekle", "/usr/bin/zamanlayici"],
  ["/usr/bin/kabuk", "/usr/bin/oturum"]];
export const TABAN = new Set(CIFT.map(([y, u]) => `${u}|${y}`));
const TOPLAYICI_YOL = ["/opt/olcum/toplayici", "/usr/bin/arsivle", "/usr/bin/yedekle"];

// Kayit: bir surec calistirma olayi ve ona bagli giden aktarim (kurgu).
export const KAYIT = [];
const ek = (o, etiket) => KAYIT.push({ ...o, etiket });
for (let k = 0; k < 12000; k++) {
  const konak = sec(KONAK);
  const yol = konak.startsWith("tp-") ? sec(TOPLAYICI_YOL) : sec(CIFT)[0];
  // Yuzde uc kayitta ust surec olagan disi eslesiyor: gercek ortamdaki gurultu.
  const ust = r() < 0.03 ? sec(CIFT)[1] : CIFT.find(([y]) => y === yol)[1];
  ek({ konak, hesap: r() < 0.06 ? sec(SERVIS) : sec(HESAP), yol, ust,
    saat: 7 + tam(12), imzali: r() < 0.97, disHedef: r() < 0.22,
    bayt: 1000 + tam(200000) }, "olagan");
}
// Gece koslari: zamanlanmis mesru isler.
for (let k = 0; k < 900; k++) {
  const yol = sec(["/usr/bin/yedekle", "/usr/bin/arsivle"]);
  ek({ konak: sec(KONAK), hesap: sec(SERVIS), yol, ust: "/usr/bin/zamanlayici",
    saat: r() < 0.5 ? tam(6) : 20 + tam(4), imzali: true, disHedef: r() < 0.1,
    bayt: 2e6 + tam(4e8) }, "gece-kosusu");
}
// Iki kurgu kalem, yalnizca KAYIT olarak verilir.
for (let k = 0; k < 4; k++)
  ek({ konak: "uc-137", hesap: "sh-244", yol: "/usr/bin/kabuk", ust: "/usr/bin/oturum",
    saat: 2 + k, imzali: false, disHedef: true, bayt: 40000 + tam(20000) }, "a1");
for (let k = 0; k < 6; k++)
  ek({ konak: `tp-${11 + k}`, hesap: "sv-13", yol: "/usr/bin/rapor",
    ust: "/opt/olcum/denetleyici", saat: 13, imzali: true, disHedef: false,
    bayt: 8000 + tam(4000) }, "a2");

// Hipotez: [ad, adimlar (etiket + suzgec), arama ve inceleme dakikasi]
const cokMakine = (l) => {
  const m = new Map();
  for (const o of l) {
    const a = `${o.ust}|${o.yol}`;
    (m.get(a) || m.set(a, new Set()).get(a)).add(o.konak);
  }
  return l.filter((o) => m.get(`${o.ust}|${o.yol}`).size >= 5);
};
export const HIPOTEZ = [
  ["h1 imzasiz ikili, ofis disi, dis hedef", [
    ["imzasiz", (l) => l.filter((o) => !o.imzali)],
    ["ofis disi saat", (l) => l.filter((o) => o.saat < 7 || o.saat >= 19)],
    ["dis hedef", (l) => l.filter((o) => o.disHedef)]], 75],
  ["h2 servis kimligiyle kabuk", [
    ["servis kimligi", (l) => l.filter((o) => o.hesap.startsWith("sv-"))],
    ["kabuk yolu", (l) => l.filter((o) => o.yol.endsWith("kabuk"))]], 40],
  ["h3 taban disi ust-yol, bes+ makine", [
    ["taban disi cift", (l) => l.filter((o) => !TABAN.has(`${o.ust}|${o.yol}`))],
    ["bes+ makine", cokMakine]], 90],
  ["h4 toplayicida beklenmeyen yol", [
    ["toplayici konak", (l) => l.filter((o) => o.konak.startsWith("tp-"))],
    ["taban disi yol", (l) => l.filter((o) => !TOPLAYICI_YOL.includes(o.yol))]], 60],
  ["h5 gece buyuk giden aktarim", [
    ["ofis disi saat", (l) => l.filter((o) => o.saat < 7 || o.saat >= 19)],
    ["10 MB ustu", (l) => l.filter((o) => o.bayt > 1e7)],
    ["dis hedef", (l) => l.filter((o) => o.disHedef)]], 55],
  ["h6 imzasiz ikili zamanlayicidan", [
    ["imzasiz", (l) => l.filter((o) => !o.imzali)],
    ["zamanlayici ust", (l) => l.filter((o) => o.ust === "/usr/bin/zamanlayici")]], 45],
];

export function kostur([, adimlar]) {
  let l = KAYIT, huni = [KAYIT.length];
  for (const [, f] of adimlar) { l = f(l); huni.push(l.length); }
  return { kalan: l, huni,
    kalem: [...new Set(l.map((o) => o.etiket))].filter((e) => e.startsWith("a")) };
}

if (import.meta.url === `file://${process.argv[1]}`) {
  const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
    : String(v).padEnd(B[0]))).join("");
  const yz = gen([38, 8, 12, 10, 10, 12]);
  console.log(`model (tohum ${TOHUM}): ${KAYIT.length} kayit, ` +
    `${new Set(KAYIT.map((o) => o.konak)).size} konak; iki kurgu kalem kayit olarak gomulu`);
  console.log();
  console.log(yz(["hipotez", "adim", "elenen", "kalan", "dakika", "kalem"]));
  for (const h of HIPOTEZ) {
    const s = kostur(h);
    console.log(yz([h[0], h[1].length, KAYIT.length - s.kalan.length, s.kalan.length, h[2],
      s.kalem.join(",") || "-"]));
  }
  const h1 = HIPOTEZ[0], s1 = kostur(h1);
  console.log(`\n${h1[0]} — adim adim huni:`);
  const yh = gen([22, 10, 10]);
  console.log(yh(["adim", "kalan", "elenen"]));
  console.log(yh(["baslangic", s1.huni[0], "-"]));
  for (const [i, [ad]] of h1[1].entries())
    console.log(yh([ad, s1.huni[i + 1], s1.huni[i] - s1.huni[i + 1]]));
}
```

```
model (tohum 20260407): 12910 kayit, 192 konak; iki kurgu kalem kayit olarak gomulu

hipotez                                   adim      elenen     kalan    dakika       kalem
h1 imzasiz ikili, ofis disi, dis hedef       3       12906         4        75          a1
h2 servis kimligiyle kabuk                   2       12800       110        40           -
h3 taban disi ust-yol, bes+ makine           2       12627       283        90          a2
h4 toplayicida beklenmeyen yol               2       12904         6        60          a2
h5 gece buyuk giden aktarim                  3       12816        94        55           -
h6 imzasiz ikili zamanlayicidan              2       12744       166        45           -

h1 imzasiz ikili, ofis disi, dis hedef — adim adim huni:
adim                       kalan    elenen
baslangic                  12910         -
imzasiz                      378     12532
ofis disi saat                 4       374
dis hedef                      4         0
```

Huni tablosu avcılığın gerçek işini gösteriyor. h1'in ilk süzgeci 12.532 kaydı eliyor ve geriye 378
bırakıyor; ikinci süzgeç 374'ünü daha eliyor. **Üçüncü süzgeç hiçbir şey elemiyor** — kalan dört
kaydın hepsi zaten dış hedefe gidiyordu. Bu, hipotezin üçüncü koşulunun bu veri kümesinde gereksiz
olduğunu söyler ve kurala dönüştürülürken çıkarılabilir. Bir hipotezi koşturmanın çıktısı yalnız
bulunan kalem değil, **hangi koşulun işe yaradığıdır**.

Altı hipotezin ikisi kullanılabilir bir sonuç veriyor: h1 dört, h4 altı kalem bırakıyor ve ikisi de
elle incelenebilir. h3 aynı kurgu kalemi buluyor ama 283 kalemin içinde; bir hipotezin doğru olması
onu yararlı yapmaz, çünkü kalanı inceleyecek zaman yoksa bulgu bulunmamış sayılır. h3 ile h4 aynı
kurgu kalemi ayrı yollardan buluyor ve aradaki fark yalnızca ilk süzgecin dayandığı bilgidir: h4
toplayıcı makinelerin dar bir yol listesi olduğunu biliyor, h3 bilmiyor.

Üç hipotez hiçbir kurgu kalem bulmuyor. h2 "servis kimliğiyle kabuk çalıştırma" arıyor ve 110 kayıt
buluyor; bu, hipotezin **yanlışlandığı** anlamına gelir — o davranış bu kurgu ortamda olağandır.
h6'nın 166 kaydı imzasız ikililerin zamanlayıcıdan çalıştırılmasıdır ve aynı şeyi söyler.

Elenen kalem sayısı hipotezin kalitesini tek başına vermez. h6 ile h1 aynı ilk süzgeci kullanıyor ve
aynı 378 kaydı bırakıyor; ayrıldıkları yer ikinci süzgeçtir. h1 zamanı soruyor ve 4 kalem bırakıyor,
h6 üst süreci soruyor ve 166 kalem. İki hipotez aynı veriye aynı maliyetle bakıyor; farkı yaratan
şey **ikinci sorunun ortamda ne kadar seyrek olduğudur** ve bu, hipotez yazılırken bilinemez,
ancak koşturulduktan sonra ölçülür.

#### Maliyet, Sıfır Sonucun Değeri ve Kurala Dönüşme

```js
// verim.mjs — hipotez basina maliyet, sifir sonucun degeri ve kurala donusme olcutu.
import { KAYIT, HIPOTEZ, kostur } from "./avcilik.mjs";

// Model verisi: kalan kalem basina inceleme dakikasi ve bir kuralin gunluk uyari siniri.
const KALEM_DK = 2, KURAL_SINIRI = 10;
const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const yz = gen([40, 9, 9, 11, 13, 8, 15]);
const s = HIPOTEZ.map((h) => ({ h, ...kostur(h) }));
console.log(yz(["hipotez", "elenen", "kalan", "arama dk", "inceleme dk", "kalem", "kurala uygun"]));
let toplamDk = 0, bulunan = new Set();
for (const x of s) {
  const inc = x.kalan.length * KALEM_DK;
  toplamDk += x.h[2] + inc;
  x.kalem.forEach((k) => bulunan.add(k));
  console.log(yz([x.h[0], KAYIT.length - x.kalan.length, x.kalan.length, x.h[2], inc,
    x.kalem.join(",") || "-", x.kalan.length <= KURAL_SINIRI ? "evet" : "hayir"]));
}
const bosuna = s.filter((x) => x.kalem.length === 0);
console.log(`\ntoplam ${toplamDk} dakika avcilik, ${bulunan.size} kurgu kalem bulundu: ` +
  `kalem basina ${Math.round(toplamDk / bulunan.size)} dakika`);
console.log(`${bosuna.length} hipotez hicbir kalem bulamadi ama ` +
  `${bosuna.reduce((a, x) => a + x.kalan.length, 0)} kalemi taban cizgisine yaziyor; ` +
  `bu kalemler bir daha ayni hipotezle elenmez`);

// Kurala donusme: gunluk uyari sinirinin altinda kalan hipotez kural olur.
const aday = s.filter((x) => x.kalan.length <= KURAL_SINIRI);
const yk = gen([40, 14, 19, 13]);
console.log();
console.log(yk(["kural adayi hipotez", "gunluk uyari", "aylik inceleme dk", "kalem turu"]));
for (const x of aday)
  console.log(yk([x.h[0], x.kalan.length, x.kalan.length * KALEM_DK * 30,
    x.kalem.join(",")]));
console.log(`\n${s.length} hipotezin ${aday.length} tanesi kurala donusuyor; ` +
  `${s.length - aday.length} tanesi gunluk uyari sinirini asiyor ya da bos donuyor`);
console.log(`avcilikta kalem basina ${Math.round(toplamDk / bulunan.size)} dakika, ` +
  `kural yazmada ornek basina 11 dakika; avcilik pahali olani bulur`);
```

```
hipotez                                    elenen    kalan   arama dk  inceleme dk   kalem   kurala uygun
h1 imzasiz ikili, ofis disi, dis hedef      12906        4         75            8      a1           evet
h2 servis kimligiyle kabuk                  12800      110         40          220       -          hayir
h3 taban disi ust-yol, bes+ makine          12627      283         90          566      a2          hayir
h4 toplayicida beklenmeyen yol              12904        6         60           12      a2           evet
h5 gece buyuk giden aktarim                 12816       94         55          188       -          hayir
h6 imzasiz ikili zamanlayicidan             12744      166         45          332       -          hayir

toplam 1691 dakika avcilik, 2 kurgu kalem bulundu: kalem basina 846 dakika
3 hipotez hicbir kalem bulamadi ama 370 kalemi taban cizgisine yaziyor; bu kalemler bir daha ayni hipotezle elenmez

kural adayi hipotez                       gunluk uyari  aylik inceleme dk   kalem turu
h1 imzasiz ikili, ofis disi, dis hedef               4                240           a1
h4 toplayicida beklenmeyen yol                       6                360           a2

6 hipotezin 2 tanesi kurala donusuyor; 4 tanesi gunluk uyari sinirini asiyor ya da bos donuyor
avcilikta kalem basina 846 dakika, kural yazmada ornek basina 11 dakika; avcilik pahali olani bulur
```

Maliyet tablosunun asıl bilgisi inceleme sütununda. h3'ün arama maliyeti 90 dakikadır ama
bıraktığı 283 kalemin incelenmesi 566 dakika ister — hipotezin toplam bedeli 656 dakikadır ve
bunun yüzde seksen altısı daraltmanın yetersizliğinden gelir. Bir hipotezi ucuzlatmanın yolu daha
hızlı aramak değil, **daha dar sormaktır**.

Toplam 1.691 dakika iki kurgu kalem buluyor: kalem başına 846 dakika. Bir önceki derste kural yazma
örnek başına 11 dakikaya geliyordu. İki sayı doğrudan karşılaştırılamaz ve karşılaştırmanın yönü
şudur: kural, **daha önce görülmüş** olanı ucuza yakalar; avcılık, hiçbir kuralın sorabileceği
biçimde yazılmamış olanı pahalıya bulur. İki kurgu kalemin ikisi de bir önceki dersin kural
kümesinin kapsamadığı davranışlardır.

Sıfır sonuç veren üç hipotez boşa gitmiş sayılmaz. Bunlar 370 kalemi taban çizgisine yazıyor: servis
kimliğinin kabuk çalıştırması, imzasız ikilinin zamanlayıcıdan gelmesi ve gece büyük aktarım yapması
bu ortamda **olağandır** ve bir daha aynı hipotezle elenmeleri gerekmez. Avcılığın çıktısı bulgular
değil, ortamın haritasıdır ve harita her koşumda büyür.

Kural adayı tablosu döngüyü kapatıyor. h1 günde 4, h4 günde 6 uyarı üretir; ikisi de on uyarı
sınırının altındadır ve aylık inceleme yükleri 240 ile 360 dakikadır. Kalan dört hipotez kurala
dönüşemez: h3 günde 283 uyarı üretirdi, ötekiler ise hiç kalem içermeyen bir kural olurdu. Bir
hipotezin kurala dönüşmesi doğruluğuna değil, **hacmine** bağlıdır.

#### Özet

- Hipotez bir uyarı değil, elenen kalem sayısı üretir: h1 üç adımda 12.906 kaydı eleyip 4 kalem,
  h4 iki adımda 6 kalem bırakıyor ve ikisi de elle incelenebilir.
- h1'in üçüncü süzgeci hiçbir şey elemiyor; koşturmanın çıktısı bulunan kalem kadar hangi koşulun
  işe yaramadığıdır ve o koşul kurala dönüşürken çıkarılabilir.
- h3 doğru kurgu kalemi buluyor ama 283 kalemin içinde bırakıyor; kalanı inceleyecek zaman yoksa
  bulgu bulunmamış sayılır.
- Sıfır sonuç veren üç hipotez 370 kalemi taban çizgisine yazıyor; bu davranışların olağan olduğu
  kanıtlanmış olur ve aynı hipotezle bir daha elenmeleri gerekmez.
- Toplam 1.691 dakikalık arama iki kurgu kalem buluyor, kalem başına 846 dakika; kural yazma örnek
  başına 11 dakikaydı ve kural yalnız daha önce görülmüş olanı yakalar.
- Altı hipotezin ikisi günlük on uyarı sınırının altında kaldığı için kurala dönüşüyor; dönüşme
  ölçütü doğruluk değil, hacimdir.

#### Sonraki Adım

Bu dersin altı hipotezi de ortamın kendi verisinden çıktı: taban çizgisi, olağan üst süreç, olağan
saat. Hiçbiri "başkalarında ne görüldüğü" bilgisini kullanmadı. O bilgi dışarıdan gelir ve iki ayrı
biçimde gelir: tek tek göstergeler — bir adres, bir karma, bir ad — ve davranış tanımları. İkisi
aynı şey gibi görünür ama **ömürleri** birbirinden farklıdır. Sonraki ders bu farkı ölçer: bir
gösterge kaç gün geçerli kalıyor, bir davranış tanımı kaç ay; besleme büyüdükçe eşleşme oranı nasıl
değişiyor ve saklama maliyeti nereden geliyor.

### Tehdit İstihbaratı

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/tehdit-istihbarati

900 göstergelik kurgu bir besleme ile 12 davranış tanımı 90 günlük pencerede ömür ekseninde karşılaştırılır: adres göstergesinin medyan ömrü 5 gün, dosya karması 2 gün, ad 15 gün; davranış tanımının medyan ömrü 358 gündür. Doksanıncı günde eklenmiş 900 göstergenin yalnız 72'si geçerli, 828'i ölüdür. 60 kurgu temasın gösterge listesiyle 5'i eşleşiyor, 28'inde gösterge o gün listede henüz yok, 27'sinde ömrü dolmuş. Saklamayı 3 günden 90 güne çıkarmak yakalananı 2'den 5'e taşırken ölü eşleşmeyi 2'den 190'a çıkarıyor ve incelemeyi 36 dakikadan 1.755 dakikaya. Davranış tanımları 27 temas yakalıyor, ölü eşleşme üretmiyor; kalem başına yakalama binde 5,6'ya karşı binde 2.250.

Bir önceki dersin altı hipotezi ortamın kendi verisinden çıktı: taban çizgisi, olağan üst süreç,
olağan saat. Hiçbiri "başkalarında ne görüldüğü" bilgisini kullanmadı. O bilgi dışarıdan gelir ve
iki ayrı biçimde gelir — tek tek **göstergeler** ve **davranış tanımları**.

İkisi bir listede yan yana durduğunda aynı şey gibi görünür; ikisi de "şuna bak" der. Ayrıldıkları
yer **ömürdür**. Bir gösterge belirli bir değerdir ve o değer değişince kullanılamaz hâle gelir; bir
davranış tanımı bir yöntemi tarif eder ve yöntem değişmedikçe geçerli kalır. Bu ders farkı gün ve ay
cinsinden sayar. Aşağıdaki besleme bir **modeldir**; hiçbir sağlayıcı, kaynak ya da kampanya adı
geçmez ve ömür değerleri veridir.

- **TA38.** Besleme 900 gösterge taşır: 420 adres, 380 dosya karması, 100 ad. Her göstergenin
  eklendiği gün ve bir ömrü vardır.
- **TA39.** Ömür üstel dağılımdan çekilir; ortalamalar türe göre 6, 3 ve 21 gündür. Bu sayılar
  **model verisidir**.
- **TA40.** Bir adres göstergesinin ömrü dolduğunda değer başka bir yere **yeniden atanabilir**.
  Model bu olasılığı adreste 0,55, adda 0,10 ve dosya karmasında 0 alır.
- **TA41.** Davranış tanımı 12 kalemdir ve ömrü ay ölçüsündedir. Yeniden atanma söz konusu değildir,
  çünkü tarif edilen şey bir değer değil bir yöntemdir.
- **TA42.** Altmış kurgu temas olayı bir göstergeye ve bir güne bağlıdır. Temasların yüzde 15'inin
  hiçbir davranış tanımı yoktur.

#### Göstergenin Ömrü

```js
// besleme.mjs — gosterge beslemesinin omru ve 90 gunluk pencerede eslesme. MODELDIR.
// Besleme saglayicisi, kaynak ya da kampanya adi YOKTUR; turler kurgudur.
export const TOHUM = 20260408;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r = uretec(TOHUM);
const tam = (n) => Math.floor(r() * n);
export const GUN = 90;

// [tur, kalem sayisi, ortalama omur gun, omru dolunca yeniden atanma olasiligi]
const TUR = [["adres", 420, 6, 0.55], ["dosya karmasi", 380, 3, 0], ["ad", 100, 21, 0.1]];
export const GOSTERGE = [];
for (const [tur, n, omur, atanma] of TUR)
  for (let k = 0; k < n; k++)
    GOSTERGE.push({ tur, eklendi: tam(GUN), omur: Math.max(1, Math.round(-omur * Math.log(1 - r()))),
      atanir: r() < atanma });

// Davranis tanimi: bir yontemi tarif eder, tek bir degeri degil. Omru ay olcusundedir.
export const DAVRANIS = Array.from({ length: 12 }, (_, i) => ({
  id: `d${i + 1}`, eklendi: tam(GUN), omur: 120 + tam(420), kapsam: 30 + tam(60) }));

// Kurgu temas olaylari: her biri bir gostergeye ve bir gune baglidir.
export const TEMAS = Array.from({ length: 60 }, () => ({
  gun: tam(GUN), g: tam(GOSTERGE.length),
  d: r() < 0.85 ? tam(DAVRANIS.length) : -1 }));   // yuzde 15'inin davranis tanimi yok

export const gecerli = (x, gun) => gun >= x.eklendi && gun <= x.eklendi + x.omur;
const ortanca = (v) => v.slice().sort((a, b) => a - b)[Math.floor(v.length / 2)];

if (import.meta.url === `file://${process.argv[1]}`) {
  const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
    : String(v).padEnd(B[0]))).join("");
  const yt = gen([16, 9, 13, 14, 16]);
  console.log(`model (tohum ${TOHUM}): ${GOSTERGE.length} gosterge, ${DAVRANIS.length} davranis ` +
    `tanimi, ${GUN} gunluk pencere, ${TEMAS.length} kurgu temas`);
  console.log();
  console.log(yt(["tur", "kalem", "medyan omur", "ort. omur", "yeniden atanan"]));
  for (const [tur] of TUR) {
    const l = GOSTERGE.filter((g) => g.tur === tur);
    console.log(yt([tur, l.length, `${ortanca(l.map((g) => g.omur))} gun`,
      `${(l.reduce((a, g) => a + g.omur, 0) / l.length).toFixed(1)} gun`,
      l.filter((g) => g.atanir).length]));
  }
  console.log(yt(["davranis tanimi", DAVRANIS.length, `${ortanca(DAVRANIS.map((d) => d.omur))} gun`,
    `${(DAVRANIS.reduce((a, d) => a + d.omur, 0) / DAVRANIS.length).toFixed(1)} gun`, 0]));

  const yo = gen([16, 10, 16, 10, 13]);
  console.log();
  console.log(yo(["omur araligi", "adres", "dosya karmasi", "ad", "toplam pay"]));
  for (const [alt, ust] of [[1, 2], [3, 7], [8, 14], [15, 30], [31, 9999]]) {
    const ic = (l) => l.filter((g) => g.omur >= alt && g.omur <= ust).length;
    const hep = ic(GOSTERGE);
    console.log(yo([ust > 999 ? `${alt}+ gun` : `${alt}-${ust} gun`,
      ic(GOSTERGE.filter((g) => g.tur === "adres")),
      ic(GOSTERGE.filter((g) => g.tur === "dosya karmasi")),
      ic(GOSTERGE.filter((g) => g.tur === "ad")),
      `%${(100 * hep / GOSTERGE.length).toFixed(1)}`]));
  }

  const yg = gen([8, 12, 15, 12, 18]);
  console.log();
  console.log(yg(["gun", "eklenmis", "gecerli gost.", "olu gost.", "gecerli davranis"]));
  for (const g of [0, 15, 30, 45, 60, 89]) {
    const ge = GOSTERGE.filter((x) => gecerli(x, g)).length;
    const ek = GOSTERGE.filter((x) => x.eklendi <= g).length;
    console.log(yg([g, ek, ge, ek - ge, DAVRANIS.filter((x) => gecerli(x, g)).length]));
  }
  const yakalanan = TEMAS.filter((t) => gecerli(GOSTERGE[t.g], t.gun));
  const erken = TEMAS.filter((t) => t.gun < GOSTERGE[t.g].eklendi);
  console.log(`\n${TEMAS.length} temasin ${yakalanan.length} tanesi gosterge listesiyle ` +
    `eslesiyor; ${erken.length} tanesinde gosterge o gun listede henuz yok, ` +
    `${TEMAS.length - yakalanan.length - erken.length} tanesinde gostergenin omru dolmus`);
}
```

```
model (tohum 20260408): 900 gosterge, 12 davranis tanimi, 90 gunluk pencere, 60 kurgu temas

tur                 kalem  medyan omur     ort. omur  yeniden atanan
adres                 420        5 gun       6.6 gun             239
dosya karmasi         380        2 gun       3.0 gun               0
ad                    100       15 gun      22.5 gun              11
davranis tanimi        12      358 gun     317.4 gun               0

omur araligi         adres   dosya karmasi        ad   toplam pay
1-2 gun                126             220        15        %40.1
3-7 gun                156             129        16        %33.4
8-14 gun                96              31        18        %16.1
15-30 gun               38               0        28         %7.3
31+ gun                  4               0        23         %3.0

gun         eklenmis  gecerli gost.   olu gost.  gecerli davranis
0                  9              9           0                 0
15               142             58          84                 3
30               285             77         208                 4
45               455             77         378                 6
60               622             73         549                 8
89               900             72         828                12

60 temasin 5 tanesi gosterge listesiyle eslesiyor; 28 tanesinde gosterge o gun listede henuz yok, 27 tanesinde gostergenin omru dolmus
```

İlk tablo ömür farkını doğrudan veriyor: dosya karmasının medyan ömrü iki gün, adresin beş gün,
adın on beş gün. Davranış tanımının medyan ömrü 358 gündür — aynı eksende gösterge türüne göre
**yirmi dört ile yüz seksen kat** arası uzun. Bu, davranış tanımının daha iyi olduğu anlamına
gelmez; iki kalemin **aynı listede aynı işlemle** yönetilemeyeceği anlamına gelir.

Ömür dağılımı tablosu ortalamanın gizlediğini açıyor. Beslemenin yüzde 40'ı bir ya da iki gün
içinde ölüyor ve bu bölümün büyük çoğunluğu dosya karmasıdır: 380 karmanın 220'si iki günden kısa
ömürlüdür ve hiçbiri on beş günü geçmez. Adlar ters uçtadır — 100 adın 51'i on beş günden uzun
yaşar. Üç tür aynı listede taşınırsa, listenin tamamı için tek bir saklama süresi seçmek üç türden
en az ikisini yanlış yönetir.

Dağılımın bu biçimi bir işlem kararına da bağlanır: kalemlerin yüzde 73'ü bir haftadan kısa ömürlü
olduğu için beslemeyi günde bir kez almak, kalemlerin önemli bir bölümünü **hiç geçerli olmadığı bir
anda** listeye eklemek demektir. Beslemenin alınma sıklığı, kalemin ömrüyle aynı ölçekte olmadıkça,
liste boyutu artar ama kapsama artmaz.

İkinci tablo listenin nasıl davrandığını gösteriyor. Doksanıncı günde 900 göstergenin tamamı
eklenmiştir ama yalnız 72'si geçerlidir; 828'i ölüdür. Liste doğrusal büyür, geçerli bölümü ise
otuzuncu günden sonra 72–77 arasında **düz kalır**. Bir gösterge beslemesinin boyutu onun gücüyle
ilgili bir sayı değildir; güç, o listede o gün hâlâ geçerli olan kalem sayısıdır.

Son satır ilk sonucu veriyor: 60 temasın yalnız 5'i gösterge listesiyle eşleşiyor. Kaçırmanın iki
nedeni neredeyse eşit paylaşıyor — 28 temasta gösterge o gün listede **henüz yoktur**, 27 temasta
ömrü **dolmuştur**. Birinci sayı beslemenin gecikmesini, ikinci sayı göstergenin kısa ömrünü ölçer
ve ikisi ayrı işlerdir: birincisi daha hızlı besleme, ikincisi daha uzun ömürlü bir ölçüt ister.

#### Saklama Süresi ve Davranışla Karşılaştırma

```js
// omur.mjs — saklama suresi taramasi, olu gostergenin yanlis pozitifi ve davranisla karsilastirma.
import { GOSTERGE, DAVRANIS, TEMAS, GUN, gecerli } from "./besleme.mjs";

const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const INCELEME = 9, BAKIM_KALEM = 0.2, BAKIM_DAVRANIS = 30;

// Bir gosterge listede eklendi..eklendi+S gunleri arasinda tutulur.
// Omru dolduktan sonra listede kalirsa ve deger yeniden atanmissa mesru trafikle eslesir.
function tarama(S) {
  const r = uretec(4413571);
  let yp = 0, liste = 0;
  for (const g of GOSTERGE) {
    liste += Math.min(S, GUN - g.eklendi);
    for (let d = g.eklendi + g.omur + 1; d <= Math.min(g.eklendi + S, GUN - 1); d++)
      if (g.atanir && r() < 0.02) yp++;
  }
  const yakalanan = TEMAS.filter((t) => {
    const g = GOSTERGE[t.g];
    return t.gun >= g.eklendi && t.gun <= g.eklendi + Math.min(S, g.omur);
  }).length;
  return { liste: Math.round(liste / GUN), yakalanan, yp,
    bakim: Math.round(GOSTERGE.length * BAKIM_KALEM) };
}

const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const yz = gen([24, 14, 16, 16, 14, 13]);
console.log(yz(["besleme / saklama", "liste boyu", "yakalanan temas", "olu eslesme",
  "inceleme dk", "bakim dk"]));
for (const S of [3, 7, 14, 30, 90]) {
  const t = tarama(S);
  console.log(yz([`gosterge, ${S} gun`, t.liste, `${t.yakalanan}/${TEMAS.length}`, t.yp,
    (t.yakalanan + t.yp) * INCELEME, t.bakim]));
}
const dav = TEMAS.filter((t) => t.d >= 0 && gecerli(DAVRANIS[t.d], t.gun)).length;
const tanimsiz = TEMAS.filter((t) => t.d < 0).length;
console.log(yz(["davranis tanimi", DAVRANIS.length, `${dav}/${TEMAS.length}`, 0,
  dav * INCELEME, DAVRANIS.length * BAKIM_DAVRANIS]));

const en = [3, 7, 14, 30, 90].map(tarama);
console.log(`\ngosterge listesinde saklama 3 gunden 90 gune cikinca yakalanan ` +
  `${en[0].yakalanan} -> ${en[4].yakalanan}, olu eslesme ${en[0].yp} -> ${en[4].yp}`);
console.log(`${TEMAS.length} temasin ${tanimsiz} tanesinin davranis tanimi hic yok; ` +
  `${TEMAS.length - dav - tanimsiz} tanesinde tanim var ama temas gununde henuz eklenmemis`);
const kalemBasi = (n, k) => (n / k * 1000).toFixed(1);
console.log(`kalem basina yakalama (binde): gosterge ` +
  `${kalemBasi(en[4].yakalanan, GOSTERGE.length)}, davranis ` +
  `${kalemBasi(dav, DAVRANIS.length)}`);
```

```
besleme / saklama           liste boyu yakalanan temas     olu eslesme   inceleme dk     bakim dk
gosterge, 3 gun                     30            2/60               2            36          180
gosterge, 7 gun                     68            4/60              13           153          180
gosterge, 14 gun                   131            4/60              45           441          180
gosterge, 30 gun                   255            5/60             101           954          180
gosterge, 90 gun                   451            5/60             190          1755          180
davranis tanimi                     12           27/60               0           243          360

gosterge listesinde saklama 3 gunden 90 gune cikinca yakalanan 2 -> 5, olu eslesme 2 -> 190
60 temasin 10 tanesinin davranis tanimi hic yok; 23 tanesinde tanim var ama temas gununde henuz eklenmemis
kalem basina yakalama (binde): gosterge 5.6, davranis 2250.0
```

Saklama taraması beşinci dersin eğrisini başka bir eksende tekrarlıyor. Saklamayı üç günden doksan
güne çıkarmak yakalananı 2'den 5'e taşıyor; aynı adımda ölü eşleşme 2'den 190'a, inceleme yükü 36
dakikadan 1.755 dakikaya çıkıyor. **Üç ek yakalama için 188 ek yanlış eşleşme** ödeniyor ve bunun
neredeyse tamamı — 190 ölü eşleşmenin 185'i — ömrü dolmuş adres göstergelerinin yeniden atanmış
değerlerle çakışmasından gelir. Bu satır
şunu söyler: bir gösterge listesinin en pahalı bölümü, temizlenmemiş bölümüdür.

Otuz ile doksan gün arasında yakalanan sabit kalıyor ama ölü eşleşme 101'den 190'a çıkıyor. Bu
aralıkta saklamayı uzatmak **hiçbir şey kazandırmaz** ve maliyeti neredeyse iki katına çıkarır.
Bir beslemenin saklama süresi, beslemenin ömür dağılımından okunur; kalemlerin çoğu bir haftada
ölüyorsa listeyi otuz gün tutmanın karşılığı yoktur. Liste boyu sütunu aynı şeyi başka bir birimle
söylüyor: üç günlük saklamada ortalama liste 30 kalem, doksan günlükte 451 kalemdir ve bu on beş
katlık büyüme karşılığında yakalanan yalnız 2'den 5'e çıkar.

Davranış satırı ölçünün asıl sonucudur. On iki kalem 27 temas yakalıyor, ölü eşleşme üretmiyor ve
243 dakika inceleme istiyor — 900 kalemlik gösterge listesi 5 temas yakalayıp 1.755 dakika
istiyordu. Kalem başına yakalama binde 5,6'ya karşı binde 2.250'dir. Bakım dakikası davranış
tarafında daha yüksektir (360'a karşı 180), çünkü bir davranış tanımını gözden geçirmek bir değeri
listeden silmekten çok daha uzun sürer; ama o bakım **on iki kalem içindir**, dokuz yüz için değil.

Bu karşılaştırma iki beslemenin birbirinin yerine geçtiği anlamına gelmez. Gösterge, eşleştiğinde
**kesin** bir eşleşmedir: bir değer ya listede vardır ya yoktur ve inceleme birkaç dakikada biter.
Davranış tanımı bir tarif olduğu için eşleşmesi de bir yorum gerektirir ve bu dersin modelinde
inceleme süresi ikisi için de eşit alınmıştır — gerçekte davranış eşleşmesinin incelemesi daha
uzundur. Ölçünün söylediği şey şudur: **aynı bakım dakikası davranış tarafında daha çok temas
karşılar** ve gösterge tarafı ancak beslemenin gecikmesi ömürden kısa olduğunda işe yarar.

Davranış tarafının da kaçırdığı vardır ve son satır onu yazıyor: 60 temasın 10'unun hiçbir davranış
tanımı yoktur, 23'ünde tanım vardır ama temas gününde henüz eklenmemiştir. İkinci sayı gösterge
tarafındaki gecikmenin karşılığıdır ve davranış tanımları daha yavaş yazıldığı için orada daha
büyüktür. Bir davranış tanımı uzun ömürlüdür, ama **geç doğar**.

#### Özet

- Gösterge ömrü gün, davranış tanımı ömrü ay ölçüsündedir: medyan 2–15 güne karşı 358 gün; ikisi
  aynı listede aynı işlemle yönetilemez.
- Doksanıncı günde eklenmiş 900 göstergenin yalnız 72'si geçerlidir; liste doğrusal büyürken geçerli
  bölümü otuzuncu günden sonra düz kalır.
- 60 temasın yalnız 5'i gösterge listesiyle eşleşiyor; 28'inde gösterge henüz eklenmemiş, 27'sinde
  ömrü dolmuştur ve bu iki neden iki ayrı iş gerektirir.
- Saklamayı 3 günden 90 güne çıkarmak yakalananı 2'den 5'e taşırken ölü eşleşmeyi 2'den 190'a,
  incelemeyi 36 dakikadan 1.755 dakikaya çıkarıyor; 30 ile 90 gün arasında yakalanan hiç artmıyor.
- On iki davranış tanımı 27 temas yakalıyor ve ölü eşleşme üretmiyor; kalem başına yakalama binde
  5,6'ya karşı binde 2.250'dir.
- Davranış tanımı geç doğar: 60 temasın 23'ünde tanım vardır ama temas gününde henüz eklenmemiştir,
  10'unun hiçbir tanımı yoktur.

#### Sonraki Adım

Sekiz ders boyunca hattın her adımı sayıldı: kaynaklar birleştirildi, kurallar yazıldı, eşik seçildi,
hipotez koşturuldu ve dışarıdan gelen bilgi ömür ekseninde ayrıldı. Ortaya çıkan sayıların hepsi aynı
yere bakıyor — analist dakikası. Sekizinci derste doksan günlük saklama 1.755 dakika, altıncı derste
ikinci sürüm günde 513 dakika istedi ve birinci derste günlük kapasite 1.440 dakikaydı. Bu derslerin
hiçbirinde uyarının **doğru** çıkmasından sonrası ele alınmadı. Sonraki ders konuyu kapatır ve
yinelenen müdahalenin otomatikleştirilmesini iki sayıyla birlikte ölçer: kazanılan dakika ve yanlış
otomatik eylemin bedeli.

### Yanıt Otomasyonu

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/yanit-otomasyonu

Sekiz yinelenen müdahale yordamı günde 158 kalem ve 1.215 dakika elle iş üretiyor; tam otomasyon bunu 281 dakikaya indiriyor ama günde 2,65 yanlış otomatik eylem ve 457 dakika bedel getiriyor, net kazanç 477 dakika. Üç yordam tam otomasyonda net eksi veriyor: hesap kilitleme -4, adres engelleme -72, uç nokta yalıtımı -72 dakika. İnsan onaylı kip 715 dakika net ve sıfır yanlış eylem veriyor; yordam başına en iyi kip seçildiğinde günlük net 870 dakikaya çıkıyor ve 3.120 dakikalık yazma işi 4 günde geri ödeniyor. Kesilen meşru iş kaleminin dakika karşılığı 90 alındığında tam otomasyon 1x yanlış oranında -60 dakikaya düşüyor.

Sekiz ders boyunca hattın her adımı sayıldı ve ortaya çıkan sayıların hepsi aynı yere baktı: analist
dakikası. Birinci derste günlük kapasite 1.440 dakikaydı; altıncı derste ikinci kural sürümü günde
513 dakika, sekizinci derste doksan günlük saklama 1.755 dakika istedi. Bu ders konuyu kapatır ve
dakikayı geri kazanmanın tek yolunu ölçer: yinelenen işi makineye vermek.

Ölçü tek yönlü değildir. Otomatikleştirilen her müdahale, uyarı yanlış çıktığında **kendiliğinden**
yanlış bir eylem yapar ve o eylemin iki bedeli vardır: geri alınması ve bu sürede kesilen meşru iş.
Aşağıdaki yordam envanteri bir **modeldir**; sıklıklar, süreler ve oranlar veridir, ölçüm değildir.

- **TA43.** Sekiz yinelenen yordam vardır ve günde toplam 158 kalem üretir. Her yordamın elle süresi,
  otomatik süresi ve bir kereye mahsus yazma süresi vardır.
- **TA44.** Otomasyon kapsamı 1'den küçüktür: bir yordamın kalemlerinin bir bölümü her zaman elle
  ele alınır, çünkü girdisi eksiktir.
- **TA45.** Üç kip vardır. **Elle**: her kalem insan tarafından. **Onaylı**: makine hazırlar, insan
  kalem başına 1,5 dakikada onaylar. **Tam**: makine hazırlar ve uygular.
- **TA46.** Yanlış otomatik eylem yalnız tam kipte oluşur; model onaylı kipte insanın **hepsini**
  yakaladığını varsayar. Bu iyimser bir varsayımdır ve gerçek bir hatta ölçülmelidir.
- **TA47.** Yanlış eylemin bedeli iki kalemdir: geri alma dakikası ve kesilen meşru iş kalemi. İkinci
  kalemin dakika karşılığı model verisidir ve teknik değil kurumsal bir karardır.

#### Yordam Envanteri ve Otomasyonun Kazandırdığı

```js
// yordam.mjs — yinelenen mudahale yordamlari, otomatiklestirme kazanci ve geri odeme. MODELDIR.
// Sayilar VERIDIR, olcum degil; yordamlar bolgesel olcum agi icin kurgudur.
// [ad, gunluk sayi, elle dk, otomatik dk, yazma dk, otomasyon kapsami, yanlis eylem orani,
//  yanlis eylemin geri alinma dk, yanlis eylemin kestigi mesru is kalemi]
export const YORDAM = [
  ["gosterge sorgulama", 62, 4, 0.2, 240, 1.00, 0.000, 0, 0],
  ["dosya karmasi sorgulama", 38, 5, 0.2, 180, 1.00, 0.000, 0, 0],
  ["kullanici dogrulama sorusu", 21, 9, 2.0, 420, 0.85, 0.030, 12, 1],
  ["kimlik oturumu sonlandirma", 14, 11, 1.0, 360, 0.80, 0.060, 25, 2],
  ["hesap kilitleme", 9, 12, 1.0, 300, 0.75, 0.080, 40, 3],
  ["adres engelleme", 7, 16, 1.5, 480, 0.70, 0.110, 55, 6],
  ["uc nokta yalitimi", 4, 34, 3.0, 600, 0.60, 0.140, 120, 9],
  ["gunluk toplama istegi", 3, 26, 4.0, 540, 0.90, 0.010, 30, 0],
];
// Kesilen mesru is kaleminin dakika karsiligi (kurumsal karar, model verisi).
export const KALEM_DK = 35;

export const elleDk = (y) => y[1] * y[2];
export function otomasyon(y, kip) {
  const [, n, elle, oto, yazma, kapsam, yanlisOran, geriAlma, kesilen] = y;
  const otoPay = kip === "elle" ? 0 : kapsam;
  const onay = kip === "onayli" ? 1.5 : 0;          // insan onayi kalem basina 1,5 dakika
  const isDk = n * (otoPay * (oto + onay) + (1 - otoPay) * elle);
  const yanlis = kip === "tam" ? n * otoPay * yanlisOran : 0;
  const bedel = yanlis * (geriAlma + kesilen * KALEM_DK);
  return { isDk, yanlis, bedel, net: elleDk(y) - isDk - bedel, yazma: kip === "elle" ? 0 : yazma };
}

if (import.meta.url === `file://${process.argv[1]}`) {
  const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
    : String(v).padEnd(B[0]))).join("");
  const yz = gen([28, 9, 11, 13, 13, 12, 13]);
  const toplamElle = YORDAM.reduce((a, y) => a + elleDk(y), 0);
  console.log(`${YORDAM.length} yinelenen yordam, gunde ` +
    `${YORDAM.reduce((a, y) => a + y[1], 0)} kalem; elle toplam ${toplamElle} dakika ` +
    `(birinci dersteki gunluk kapasite 1440 dakikaydi)`);
  console.log();
  console.log(yz(["yordam", "gunluk", "elle dk", "tam oto. dk", "yanlis eylem", "gunluk net",
    "geri odeme"]));
  for (const y of YORDAM) {
    const t = otomasyon(y, "tam");
    console.log(yz([y[0], y[1], elleDk(y), Math.round(t.isDk), t.yanlis.toFixed(2),
      Math.round(t.net), t.net > 0 ? `${Math.ceil(y[4] / t.net)} gun` : "hicbir zaman"]));
  }
  const t = YORDAM.map((y) => otomasyon(y, "tam"));
  console.log(`\ntam otomasyonda gunluk net kazanc ` +
    `${Math.round(t.reduce((a, x) => a + x.net, 0))} dakika, gunde ` +
    `${t.reduce((a, x) => a + x.yanlis, 0).toFixed(2)} yanlis otomatik eylem, ` +
    `bedeli ${Math.round(t.reduce((a, x) => a + x.bedel, 0))} dakika`);
  console.log(`toplam yazma isi ${YORDAM.reduce((a, y) => a + y[4], 0)} dakika`);
}
```

```
8 yinelenen yordam, gunde 158 kalem; elle toplam 1215 dakika (birinci dersteki gunluk kapasite 1440 dakikaydi)

yordam                         gunluk    elle dk  tam oto. dk yanlis eylem  gunluk net   geri odeme
gosterge sorgulama                 62        248           12         0.00         236        2 gun
dosya karmasi sorgulama            38        190            8         0.00         182        1 gun
kullanici dogrulama sorusu         21        189           64         0.54         100        5 gun
kimlik oturumu sonlandirma         14        154           42         0.67          48        8 gun
hesap kilitleme                     9        108           34         0.54          -4 hicbir zaman
adres engelleme                     7        112           41         0.54         -72 hicbir zaman
uc nokta yalitimi                   4        136           62         0.34         -72 hicbir zaman
gunluk toplama istegi               3         78           19         0.03          59       10 gun

tam otomasyonda gunluk net kazanc 477 dakika, gunde 2.65 yanlis otomatik eylem, bedeli 457 dakika
toplam yazma isi 3120 dakika
```

İlk satır kursun ilk dersine bağlanıyor: sekiz yordam günde 1.215 dakika elle iş üretiyor ve o
dersteki üç kişilik vardiyanın toplam kapasitesi 1.440 dakikaydı. Yinelenen müdahale, kapasitenin
yüzde 84'ünü yiyor; birinci derste 64 uyarıya hiç bakılmamasının bir nedeni budur.

Tablonun ilk iki satırı otomasyonun kolay tarafıdır. Gösterge ve dosya karması sorgulama hiçbir şeyi
değiştirmez, yalnız veri getirir; yanlış eylem oranı sıfırdır ve otomatikleştirilmeleri günde 418
dakika kazandırır. İki yordamın yazma işi bir ya da iki günde geri ödenir. **Değiştiren değil,
getiren yordamda otomasyonun bedeli yoktur.**

Alt üç satır dersin asıl sonucudur. Hesap kilitleme, adres engelleme ve uç nokta yalıtımı tam
otomasyonda **net eksi** verir: sırasıyla -4, -72 ve -72 dakika. Uç nokta yalıtımına bakmak yeter —
günde yalnız 4 kalem, elle 136 dakika, otomatikle 62 dakika, yani 74 dakika kazanç. Ama günde 0,34
yanlış yalıtım oluyor ve her biri 120 dakika geri alma ile 9 meşru iş kalemi kesiyor. Kesilen
kalemin 35 dakika sayıldığı bir kurumda bu, günde 146 dakikadır. Kazanç 74, bedel 146.

Yanlış eylem oranının nereden geldiği de bu konuda ölçülmüştü. Beşinci derste bütçeye sığan eşikte
16 uyarının 3'ü yanlış pozitifti; bir yordam o uyarılara bağlanırsa yanlış eylem oranı doğrudan
kuralın kesinliğidir. Otomasyon, tespitin kesinliğini **eyleme çevirir**: yanlış pozitif elle
çalışıldığında yalnız inceleme dakikası harcarken, otomatik çalıştığında meşru iş keser. Aynı
kesinlik iki kipte iki ayrı birimle ödenir.

Yanlış eylem oranı ile yordamın yıkıcılığı bu modelde birlikte artıyor ve bu bir raslantı değildir:
bir eylem ne kadar çok şeyi durduruyorsa girdisi de o kadar karmaşıktır. Otomatikleştirilmesi en
çekici görünen yordamlar — en uzun sürenler — otomatikleştirilmesi en pahalı olanlardır.

#### Üç Kip ve Kırılma Noktası

```js
// kip.mjs — uc kip karsilastirmasi, secmeli kip ve kirilma noktasi taramasi.
import { YORDAM, KALEM_DK, elleDk, otomasyon } from "./yordam.mjs";

const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const toplamElle = YORDAM.reduce((a, y) => a + elleDk(y), 0);
const kipToplam = (kip) => YORDAM.reduce((a, y) => {
  const t = otomasyon(y, kip);
  return { isDk: a.isDk + t.isDk, yanlis: a.yanlis + t.yanlis, bedel: a.bedel + t.bedel,
    net: a.net + t.net, yazma: a.yazma + t.yazma };
}, { isDk: 0, yanlis: 0, bedel: 0, net: 0, yazma: 0 });

const yz = gen([12, 11, 13, 13, 12, 11, 13]);
console.log(yz(["kip", "is dk", "yanlis eylem", "bedel dk", "net dk", "yazma dk", "geri odeme"]));
for (const kip of ["elle", "onayli", "tam"]) {
  const t = kipToplam(kip);
  console.log(yz([kip, Math.round(t.isDk), t.yanlis.toFixed(2), Math.round(t.bedel),
    Math.round(t.net), t.yazma, t.net > 0 ? `${Math.ceil(t.yazma / t.net)} gun` : "-"]));
}

// Secmeli kip: her yordam icin net kazanci en yuksek olan kip.
const secim = YORDAM.map((y) => {
  const en = ["elle", "onayli", "tam"]
    .map((k) => ({ k, ...otomasyon(y, k) }))
    .reduce((a, b) => (b.net > a.net ? b : a));
  return { y, en };
});
const ys = gen([28, 12, 12, 15, 16]);
console.log("\nyordam basina en iyi kip:");
console.log(ys(["yordam", "kip", "net dk", "yanlis eylem", "kesilen kalem"]));
for (const { y, en } of secim)
  console.log(ys([y[0], en.k, Math.round(en.net), en.yanlis.toFixed(2),
    (en.yanlis * y[8]).toFixed(2)]));
const net = secim.reduce((a, s) => a + s.en.net, 0);
const yazma = secim.reduce((a, s) => a + s.en.yazma, 0);
console.log(`\nsecmeli kipte gunluk net ${Math.round(net)} dakika (elle ${toplamElle} dakikaydi), ` +
  `yazma isi ${yazma} dakika, geri odeme ${Math.ceil(yazma / net)} gun`);

// Kirilma noktasi: yanlis eylem orani ve kesilen kalemin dakika karsiligi degisirse.
const yk = gen([14, 14, 14, 16, 14]);
console.log("\ntam otomasyonda kirilma noktasi:");
console.log(yk(["yanlis carpani", "kalem dk 10", "kalem dk 35", "kalem dk 90", "artida yordam"]));
for (const c of [0.25, 0.5, 1, 2, 4]) {
  const hesap = (kd) => YORDAM.reduce((a, y) => {
    const [, n, , , , kapsam, oran, geri, kesilen] = y;
    const t = otomasyon(y, "tam");
    const yanlis = n * kapsam * oran * c;
    return a + (elleDk(y) - t.isDk - yanlis * (geri + kesilen * kd));
  }, 0);
  const artida = YORDAM.filter((y) => {
    const [, n, , , , kapsam, oran, geri, kesilen] = y;
    const t = otomasyon(y, "tam");
    return elleDk(y) - t.isDk - n * kapsam * oran * c * (geri + kesilen * KALEM_DK) > 0;
  }).length;
  console.log(yk([`${c}x`, Math.round(hesap(10)), Math.round(hesap(35)), Math.round(hesap(90)),
    `${artida}/${YORDAM.length}`]));
}
```

```
kip               is dk yanlis eylem     bedel dk      net dk   yazma dk   geri odeme
elle               1215         0.00            0           0          0            -
onayli              500         0.00            0         715       3120        5 gun
tam                 281         2.65          457         477       3120        7 gun

yordam basina en iyi kip:
yordam                               kip      net dk   yanlis eylem   kesilen kalem
gosterge sorgulama                   tam         236           0.00            0.00
dosya karmasi sorgulama              tam         182           0.00            0.00
kullanici dogrulama sorusu           tam         100           0.54            0.54
kimlik oturumu sonlandirma        onayli          95           0.00            0.00
hesap kilitleme                   onayli          64           0.00            0.00
adres engelleme                   onayli          64           0.00            0.00
uc nokta yalitimi                 onayli          71           0.00            0.00
gunluk toplama istegi                tam          59           0.03            0.00

secmeli kipte gunluk net 870 dakika (elle 1215 dakikaydi), yazma isi 3120 dakika, geri odeme 4 gun

tam otomasyonda kirilma noktasi:
yanlis carpani   kalem dk 10   kalem dk 35     kalem dk 90 artida yordam
0.25x                    881           820             686           8/8
0.5x                     827           705             437           7/8
1x                       721           477             -60           5/8
2x                       508            20           -1054           4/8
4x                        81          -894           -3041           4/8
```

Üç kip tablosu beklenmedik bir sıra veriyor: **onaylı kip tam otomasyondan daha çok kazandırıyor**.
Tam otomasyon iş süresini 281 dakikaya indiriyor, onaylı kip 500 dakikada bırakıyor; ama tam
otomasyon 457 dakikalık bir bedel taşıyor ve net kazanç 477'de kalırken onaylı kipte 715 oluyor. İki
yüz on dokuz dakikalık ek onay işi, dört yüz elli yedi dakikalık yanlış eylem bedelini önlüyor.

Doğru cevap tek bir kip seçmek değil, yordam başına seçmektir. İkinci tablo bunu yapıyor: veri
getiren dört yordam tam otomasyona, değiştiren dört yordam onaylı kipe düşüyor. Günlük net 870
dakikaya çıkıyor — elle yapılan 1.215 dakikanın yüzde 72'si — ve 3.120 dakikalık yazma işi **dört
günde** geri ödeniyor. Kesilen meşru iş kalemi sütunu bu seçimde günde 0,54'tür; tam otomasyonda
günde 2,65 yanlış eylem ve çok daha fazla kesilen kalem vardı.

Son tablo iki bilinmeyene karşı duyarlılığı gösteriyor ve kursun ölçüsünü kapatıyor. Yanlış eylem
oranı dörde katlanırsa, kesilen kalem 10 dakika sayıldığında tam otomasyon hâlâ artıdadır (81
dakika); 35 dakika sayıldığında -894, 90 dakika sayıldığında -3.041 olur. Aynı hat, aynı yordamlar,
aynı yanlış oranı — sonucu tersine çeviren tek şey, **kesilen meşru işin kaç dakika sayıldığıdır**.
O sayı bir güvenlik ölçütü değildir ve güvenlik ekibi tarafından verilemez.

Sağ sütun bir başka şey söylüyor: yanlış oranı dört katına çıksa bile sekiz yordamın dördü artıda
kalır. Bunlar veri getiren yordamlardır ve yanlış eylem oranları zaten sıfıra yakındır.
Otomasyonun güvenli bölgesi, **hiçbir şeyi değiştirmeyen** işlerdir; değiştiren her işte karar,
kazanılan dakika ile kesilen meşru işin karşılaştırılmasına iner.

#### Özet

- Sekiz yinelenen yordam günde 158 kalem ve 1.215 dakika elle iş üretiyor; bu, birinci dersteki
  1.440 dakikalık günlük kapasitenin yüzde 84'üdür.
- Veri getiren yordamlarda otomasyonun bedeli yoktur: gösterge ve dosya karması sorgulama günde 418
  dakika kazandırıyor ve yazma işi bir ya da iki günde geri ödeniyor.
- Değiştiren yordamların üçü tam otomasyonda net eksi veriyor; uç nokta yalıtımında kazanç 74
  dakika, günde 0,34 yanlış yalıtımın bedeli 146 dakikadır.
- Onaylı kip tam otomasyondan daha çok kazandırıyor: 715'e karşı 477 dakika, çünkü 219 dakikalık ek
  onay işi 457 dakikalık yanlış eylem bedelini önlüyor.
- Yordam başına kip seçildiğinde günlük net 870 dakikaya çıkıyor ve 3.120 dakikalık yazma işi dört
  günde geri ödeniyor; kesilen meşru iş kalemi günde 0,54'e iniyor — tam otomasyonda günde 2,65
  yanlış eylem ve çok daha fazla kesilen kalem vardı.
- Kesilen meşru işin dakika karşılığı 10 yerine 90 alındığında tam otomasyon 1x yanlış oranında
  -60 dakikaya düşer; bu sayı teknik değil kurumsal bir karardır.

#### Sonraki Adım

Bu konu bir hat kurdu ve her adımını saydı: kaynaklar tek şemaya oturtuldu ve eşlenemeyen alan
sayıldı, bağıntı kuralı koşturuldu ve kaçırdığı yazıldı, eşik taramasında yanlış pozitif ile
kaçırılanın aynı anda azaltılamadığı bant ölçüldü, kural sürümleri karşılaştırıldı, hipotezler
koşturuldu, besleme ömür ekseninde ayrıldı ve yinelenen müdahale otomatikleştirildi. Sayıların hepsi fark etme süresine, yani
uyarının **doğru** çıktığı andan **öncesine** aitti; sınırlama süresi hiç ölçülmedi.

Doğru çıktıktan sonrası hiç yazılmadı. Bu dersin onaylı kipinde kimin onayladığı, uç nokta
yalıtımının hangi yetkiyle uygulandığı, dokuz meşru iş kalemi kesildiğinde kimin karar verdiği ve
karardan sonra kimin bilgilendirildiği modelde birer sayı olarak duruyor — kurumda ise birer rol,
birer yetki sınırı ve birer adım dizisidir. Bir sonraki konu, **Olay Müdahalesi**, tam olarak bunu
ele alır: hazırlıktan tanımlamaya, sınırlamadan temizleme ve kurtarmaya kadar hangi adımın kim
tarafından, hangi yetkiyle ve hangi sürede atılacağı.

## Olay Müdahalesi

Fark etme ile sınırlama arasındaki sürenin kalem cinsinden ölçülmesi: hazırlık kalemlerinin karar zincirinden kaç dakika düşürdüğü, olayın doğrulanması ve kapsam yarıçapının kaçırdığı varlık, aynı olayda erken ve geç sınırlamanın kalem farkı, kalıcılığın tutunma noktası cinsinden kaldırılması, yeniden bulaşma riski ekseninde denetimli kurtarma, kanıt ve kapsam ekseninde çıkarılan dersler, süre ve paydaş sayısı olarak bildirim yükümlülüğü.

### Hazırlık

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/hazirlik

Hazırlığın kalem olarak sayılması: on iki hazırlık kaleminin uyarıdan karara giden altı adımlık zinciri 470 dakikadan 182 dakikaya indirmesi, sınırlama anını 656'dan 368'e ve erişilen kalemi 13'ten 9'a çekmesi, varlık envanterinin eksikliğinin tek başına 49 dakika eklemesi, iletişim ağacının kişi-saat başına 5,00 dakika kazandırmasına karşılık adli toplama hazırlığının 0,11 dakikada kalması ve ön onaylı yetkinin yılda 103 dakika kazandırırken 233 meşru iş kalemi kesmesi.

Önceki konu tespit hattını kurdu: kaynaklar toplandı, normalleştirildi, bağıntı kuralları yazıldı,
eşik tarandı ve yinelenen müdahale otomatikleştirildi. Konunun bıraktığı soru şuydu: uyarı **doğru**
çıktığında ne olacak. Hat bir uyarıyı doğru üretti; bundan sonra sayılan şey artık kuralın kalitesi
değil, uyarının düştüğü an ile erişimin durduğu an arasındaki **süre**dir.

Bu konu boyunca ölçü birimi ikilidir: **dakika** ve **kalem**. Fark etme süresi tespit hattının
çıktısıdır ve bu konuda girdi olarak verilir. Ölçülen şey **sınırlama süresidir** — uyarıdan
erişimin durmasına kaç dakika geçtiği ve o dakikalarda kaç kaleme erişildiği. Hazırlık, bu sürenin
tek tek sayılabilir bileşenidir: bir plan, bir yetki matrisi ya da bir iletişim ağacı ya olayın
başladığı gün hazırdır ya da olay sırasında yazılır. İkincisi dakika ekler.

#### Uyarıdan Karara Zincir

Örnek, kurslar boyunca sürdürülen kurgu **bölgesel ölçüm ağıdır**: şube toplayıcıları, doğrulayıcı,
faturalama, abone portalı ve iş emri servisleri; üç kişilik bir vardiya. Olay da kayıtlar da
kurgudur; gerçek bir kurum, adres ya da olay yoktur.

**OM1:** Uyarı, olayın başlangıcından 186 dakika sonra düşer ve doğrudur; bu değer tespit hattından
gelen girdidir. **OM2:** Erişim eğrisi on dört kalemden oluşur; her kalem belirli bir dakikada
erişilebilir hale gelir ve o kalem bir daha kapanmaz. Eğri **veridir**, ölçüm değil; saldırı tarafına
ait hiçbir adım dizisi yazılmaz, yalnız hangi kaleme kaçıncı dakikada erişildiği verilir. **OM3:**
Uyarıdan sınırlamaya giden zincir altı adımdır: doğrulama, kapsam, yetki, karar, seçim, uygulama.
Her adımın **hazırlıksız** bir taban dakikası vardır. **OM4:** On iki hazırlık kalemi vardır; hazır
olan kalem etkilediği adımın dakikasını bir çarpanla kısaltır, eksik olan kalem hiçbir şey yapmaz —
adım tabanda kalır. **OM5:** Her hazırlık kaleminin yıllık bakım bedeli kişi-saattir. **OM6:**
Sınırlama uygulandığı anda erişim durur; o ana kadar erişilmiş kalem sayısı geç kararın bedelidir.

```js
// hazirlik/model.mjs — olay mudahale hazirligi modeli: gercek bir olay kaydi yok. Erisim
// egrisi, zincir adimlari ve hazirlik kalemleri veri yapisidir; sureler kurgu verilerdir.

export const UYARI = 186;              // uyarinin dustugu dakika (tespit hattinin ciktisi)
// erisim egrisi: [dakika, kalem adi] — kalem o dakikada erisilir hale gelir (veri)
export const ERISIM = [
  [0, "toplayici-03 uzerinde calistirma"], [26, "toplayici-03 yerel kimlik deposu"],
  [58, "dogrulayici-01 hizmet hesabi"], [95, "toplayici-07"], [134, "toplayici-11"],
  [171, "dogrulayici-02"], [214, "faturalama okuma ucu"], [263, "abone portali kopyasi"],
  [318, "is emri kuyrugu"], [372, "saha dizustu yonetim kanali"],
  [441, "yedek deposu listeleme"], [505, "fatura arsivi disari aktarma"],
  [588, "ikinci bolge toplayici kumesi"], [676, "yonetim konsolu okuma"]];
export const kalem = (dk) => ERISIM.filter(([t]) => t <= dk).length;

// zincir adimi: ad, hazirliksiz taban dakika
export const ADIM = [["dogrulama", 68], ["kapsam", 124], ["yetki", 96],
  ["karar", 82], ["secim", 54], ["uygulama", 46]];

// hazirlik kalemi: ad, etkiledigi adimlar, adim carpani, yillik bakim kisi-saati
export const HAZIRLIK = [
  ["mudahale plani", ["secim"], 0.55, 16], ["yetki matrisi", ["yetki"], 0.45, 8],
  ["iletisim agaci", ["karar"], 0.50, 6], ["varlik envanteri", ["kapsam"], 0.55, 24],
  ["kayit kaynagi haritasi", ["dogrulama"], 0.50, 12],
  ["yedek erisim kanali", ["uygulama"], 0.75, 10],
  ["on onayli sinirlama yetkisi", ["yetki"], 0.55, 4],
  ["kimlik mudahale yordami", ["secim"], 0.65, 14],
  ["adli toplama hazirligi", ["uygulama"], 0.90, 18],
  ["dis mudahale destegi", ["karar"], 0.85, 5],
  ["masa basi tatbikati", ADIM.map(([a]) => a), 0.88, 30],
  ["geri getirme sinamasi", ["uygulama"], 0.85, 22]];

// hazir kalem kumesiyle zincirin adim dakikalari ve toplami
export function zincir(hazir) {
  const dk = Object.fromEntries(ADIM);
  for (const [ad, adimlar, carpan] of HAZIRLIK)
    if (hazir.includes(ad)) for (const a of adimlar) dk[a] *= carpan;
  const toplam = Math.round(Object.values(dk).reduce((s, v) => s + v, 0));
  return { dk, toplam, sinirlama: UYARI + toplam, kalem: kalem(UYARI + toplam) };
}

export const TUM = HAZIRLIK.map(([a]) => a);
export const KISMI = ["mudahale plani", "yetki matrisi", "iletisim agaci",
  "varlik envanteri", "kayit kaynagi haritasi", "yedek erisim kanali"];

// yillik uyari kumesi: 24 dogrulanmis uyarinin 6'si gercek olay (veri)
export const UYARI_YIL = 24, GERCEK_YIL = 6, KESILEN_SAATLIK = 26;
```

Ölçüm dosyası zinciri üç hazırlık düzeyinde koşturur, sonra tam kümeden kalemleri tek tek çıkarıp
her birinin eksikliğinin kaç dakika eklediğini sayar.

```js
// hazirlik/olc.mjs — hazirlik kalemi hazirken karar kac dakika kisaliyor, eksik kalem
// kac dakika ve kac erisilen kalem ekliyor, on onayli yetkinin iki yonlu bedeli ne.
import { UYARI, ADIM, HAZIRLIK, TUM, KISMI, zincir, kalem,
  UYARI_YIL, GERCEK_YIL, KESILEN_SAATLIK } from "./model.mjs";

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));
const t0 = process.hrtime.bigint();

const D = { hazirliksiz: zincir([]), kismi: zincir(KISMI), tam: zincir(TUM) };
console.log(`uyari ${UYARI}. dakikada dustu; ${HAZIRLIK.length} hazirlik kalemi, ` +
  `${ADIM.length} zincir adimi`);

console.log("\n1. uyaridan karara zincir (dakika)");
const A = [-24, 14, 10, 10];
yaz(A, "adim", "hazirliksiz", "kismi (6)", "tam (12)");
for (const [ad] of ADIM)
  yaz(A, ad, ...Object.values(D).map((r) => r.dk[ad].toFixed(0)));
yaz(A, "toplam", ...Object.values(D).map((r) => r.toplam));
yaz(A, "sinirlama dakikasi", ...Object.values(D).map((r) => r.sinirlama));
yaz(A, "erisilen kalem", ...Object.values(D).map((r) => `${r.kalem}/14`));
yaz(A, "yillik kisi-saat", ...Object.entries({ hazirliksiz: [], kismi: KISMI, tam: TUM })
  .map(([, k]) => HAZIRLIK.filter(([a]) => k.includes(a))
    .reduce((s, h) => s + h[3], 0)));

console.log("\n2. kalem eksikken zincire eklenen dakika (tam kumeden tek tek cikarilir)");
const B = [-28, 11, 10, 12, 14, 15];
yaz(B, "eksik kalem", "toplam dk", "+dakika", "sinirlama", "yillik s-saat", "dakika/s-saat");
const t = D.tam;
const sirali = HAZIRLIK.map((h) => [h, zincir(TUM.filter((a) => a !== h[0]))])
  .sort((x, y) => y[1].toplam - x[1].toplam);
for (const [h, r] of sirali)
  yaz(B, h[0], r.toplam, "+" + (r.toplam - t.toplam), r.sinirlama, h[3],
    ((r.toplam - t.toplam) / h[3]).toFixed(2));
yaz(B, "(hicbiri eksik degil)", t.toplam, "-", `${t.sinirlama} (${t.kalem}/14)`,
  HAZIRLIK.reduce((s, h) => s + h[3], 0), "-");

console.log("\n3. on onayli sinirlama yetkisinin iki yonu (yilda " +
  `${UYARI_YIL} dogrulanmis uyari, ${GERCEK_YIL} gercek olay)`);
const C = [-34, 10, 12, 13];
yaz(C, "kosum", "yetki dk", "yil kazanc", "yil kesilen");
for (const [ad, kume] of [["on onay yok", TUM.filter((a) => a !== "on onayli sinirlama yetkisi")],
    ["on onay var", TUM],
    ["on onay var, kayit haritasi yok", TUM.filter((a) => a !== "kayit kaynagi haritasi")]]) {
  const r = zincir(kume), onay = kume.includes("on onayli sinirlama yetkisi");
  const kazanc = onay ? GERCEK_YIL * (zincir(kume.filter((a) =>
    a !== "on onayli sinirlama yetkisi")).dk.yetki - r.dk.yetki) : 0;
  const kesilen = onay ? (UYARI_YIL - GERCEK_YIL) * (r.dk.dogrulama / 60) * KESILEN_SAATLIK : 0;
  yaz(C, ad, r.dk.yetki.toFixed(0), kazanc.toFixed(0) + " dk", kesilen.toFixed(0) + " kalem");
}

console.log("\n4. sinirlama dakikasi tarandiginda erisilen kalem");
const E = [-16, 9, 9, 9, 9, 9, 9];
const tara = [200, 280, 362, 470, 560, 656];
yaz(E, "sinirlama dk", ...tara);
yaz(E, "erisilen kalem", ...tara.map((d) => `${kalem(d)}/14`));

const ms = Number(process.hrtime.bigint() - t0) / 1e6;   // ham olcum basilmaz, bant denetlenir
console.log(`\nuc duzey ve ${HAZIRLIK.length} marjinal kosum 500 ms bandinda: ` +
  (ms < 500 ? "evet" : "hayir"));
```

```
uyari 186. dakikada dustu; 12 hazirlik kalemi, 6 zincir adimi

1. uyaridan karara zincir (dakika)
adim                       hazirliksiz kismi (6)  tam (12)
dogrulama                           68        34        30
kapsam                             124        68        60
yetki                               96        43        21
karar                               82        41        31
secim                               54        30        17
uygulama                            46        35        23
toplam                             470       251       182
sinirlama dakikasi                 656       437       368
erisilen kalem                   13/14     10/14      9/14
yillik kisi-saat                     0        76       169

2. kalem eksikken zincire eklenen dakika (tam kumeden tek tek cikarilir)
eksik kalem                   toplam dk   +dakika   sinirlama yillik s-saat  dakika/s-saat
varlik envanteri                    231       +49         417            24           2.04
iletisim agaci                      212       +30         398             6           5.00
kayit kaynagi haritasi              212       +30         398            12           2.50
yetki matrisi                       207       +25         393             8           3.13
masa basi tatbikati                 207       +25         393            30           0.83
on onayli sinirlama yetkisi         199       +17         385             4           4.25
mudahale plani                      196       +14         382            16           0.88
kimlik mudahale yordami             191        +9         377            14           0.64
yedek erisim kanali                 189        +7         375            10           0.70
dis mudahale destegi                187        +5         373             5           1.00
geri getirme sinamasi               186        +4         372            22           0.18
adli toplama hazirligi              184        +2         370            18           0.11
(hicbiri eksik degil)               182         -  368 (9/14)           169              -

3. on onayli sinirlama yetkisinin iki yonu (yilda 24 dogrulanmis uyari, 6 gercek olay)
kosum                               yetki dk  yil kazanc  yil kesilen
on onay yok                               38        0 dk      0 kalem
on onay var                               21      103 dk    233 kalem
on onay var, kayit haritasi yok           21      103 dk    467 kalem

4. sinirlama dakikasi tarandiginda erisilen kalem
sinirlama dk          200      280      362      470      560      656
erisilen kalem       6/14     8/14     9/14    11/14    12/14    13/14

uc duzey ve 12 marjinal kosum 500 ms bandinda: evet
```
Sayılar **ölçüm** sınıfındadır; girdileri yukarıdaki varsayımlardır.

#### Üç Hazırlık Düzeyi

Birinci tablo hazırlığı dakikaya çevirir. Hiçbir kalem hazır değilken zincir 470 dakika sürer:
uyarı 186. dakikada düşer, sınırlama 656. dakikada uygulanır ve o ana kadar on dört kalemin
**on üçüne** erişilmiştir. Altı kalemle 251 dakikaya, on iki kalemle 182 dakikaya iner; sınırlama
368. dakikaya çekilir ve erişilen kalem **dokuza** düşer.

Adım kırılımı, hazırlığın nereye dokunduğunu gösterir. En büyük iki taban kapsam (124 dakika) ve
yetki (96 dakika) adımlarıdır — yani "hangi varlıklar etkilendi" ve "kim kesebilir" soruları. Tam
hazırlıkta kapsam 60, yetki 21 dakikaya iner. Doğrulama adımı 68'den yalnız 30'a düşer ve tam
hazırlıkta zincirin üçüncü en uzun adımı olarak kalır; doğrulama bir belge işi değil, kayıt okuma
işidir ve hazırlıkla kısaltılabilecek bir tavanı vardır.

İki düzey arasındaki fark eşit dağılmaz. İlk altı kalem yılda 76 kişi-saat ister ve zincirden 219
dakika düşürür — kişi-saat başına 2,88 dakika. İkinci altı kalem 93 kişi-saat daha ister ve yalnız
69 dakika düşürür; kişi-saat başına 0,74. Hazırlığın getirisi azalan bir eğridir: ilk kalemler
zincirin en uzun adımlarına dokunur, sonrakiler kalan payı böler.

Dördüncü tablo aynı eğriyi tek başına gösterir. Sınırlamayı 656. dakikadan 368'e çekmek dört kalem
kazandırır; 368'den 280'e çekmek bir kalem daha. Eğri düz değildir: erken dakikalarda kalem sayısı
hızla artar, sonra seyrelir. Bu, hazırlığın getirisinin de sabit olmadığı anlamına gelir.

#### Kalem Başına Dakika

İkinci tablo hazırlığı **kalem** olarak sayar. Tam kümeden tek bir kalem çıkarıldığında zincire
eklenen dakika, o kalemin gerçek karşılığıdır. Varlık envanterinin eksikliği en pahalıdır: tek
başına **49 dakika** ekler, çünkü kapsam adımı hem en uzun tabana sahiptir hem de envanter yoksa
elde hiçbir başlangıç listesi yoktur. İletişim ağacı ve kayıt kaynağı haritası otuzar dakika,
yetki matrisi ve masa başı tatbikatı yirmi beşer dakika ekler.

Bu üç kalemin ne olduğu sayının anlamını verir. Varlık envanteri, hangi makinenin hangi hizmeti
koşturduğunu ve hangi ağ bölütünde durduğunu tutan listedir; olay sırasında yoksa kapsam adımı önce
bu listeyi üretmek zorunda kalır. Yetki matrisi, hangi rolün hangi eylemi hangi onayla
uygulayabileceğini yazar: bir ağ bölütünü kesmek, bir hizmet hesabını kilitlemek ya da bir uç
noktayı ağdan almak farklı satırlardır. İletişim ağacı, hangi bilginin kime hangi kanalla
gideceğini önceden bağlar; olay sırasında bu ağ yoksa karar adımı doğru kişiyi aramakla geçer.

Son sütun kararı verir: kişi-saat başına kaç dakika. İletişim ağacı yılda altı kişi-saat bakım
ister ve kişi-saat başına **5,00 dakika** kazandırır; ön onaylı yetki dört kişi-saatle 4,25;
yetki matrisi 3,13. Masa başı tatbikatı otuz kişi-saatle en pahalı kalemdir ve 0,83'te kalır —
ama tek adım değil, altı adımın hepsini birden ölçekler, yani tabloda göründüğünden geniş bir
etkisi vardır.

Listenin sonundaki iki kalem dikkat ister. Geri getirme sınaması 0,18, adli toplama hazırlığı
0,11 dakika/kişi-saat verir; ikisi birlikte kırk kişi-saat harcar ve zincirden yalnız altı dakika
düşürür. **Bu derste ölçülen tek şey karar dakikasıdır.** Adli toplama hazırlığının karşılığı bu
tabloda değil, kanıtın toplanıp toplanmadığının sayıldığı yerdedir; geri getirme sınamasının
karşılığı da kurtarmanın kaç aşamada yapıldığı ölçüldüğünde çıkar. Tek eksende ölçülen bir
hazırlık kalemi, o eksende ucuz göründüğü için çıkarılırsa başka bir eksende bedeli ödenir.

#### Hazırlığın İki Yönü

Üçüncü tablo hazırlığın bedava olmadığını gösterir. Ön onaylı sınırlama yetkisi, vardiyanın kıdemli
onay beklemeden kesmesine izin verir. **OM7:** Yılda 24 doğrulanmış uyarı incelenir, bunların altısı
gerçek olaydır; ön onay varken kesme, uyarının elenmesine kadar yani doğrulama adımı boyunca sürer
ve saatte 26 meşru iş kalemi keser. Ön onay olmadan yetki adımı 38 dakikadır, ön onayla 21 dakika;
altı gerçek olayda yılda 103 dakika kazandırır. Aynı yetki, gerçek olmayan on sekiz uyarıda toplam
**233 meşru iş kalemi** keser.

Üçüncü satır iki hazırlık kaleminin birbirine bağlı olduğunu gösterir. Kayıt kaynağı haritası
eksikken doğrulama 30 dakikadan 60 dakikaya çıkar; ön onaylı yetkinin kazandırdığı dakika aynı kalır
(103), ama kestiği meşru iş **467 kaleme** çıkar. Erken kesme yetkisinin bedeli, o kesmenin ne kadar
sürede geri alınabileceğine bağlıdır. Hızlı doğrulama olmadan verilen erken kesme yetkisi, kazandığı
dakikanın iki katı bedeli üretir. Hazırlık kalemleri bağımsız satırlar değildir; bir kalemin
değeri, başka bir kalemin hazır olup olmamasına göre değişir ve tek tek toplanan dakikalar bu
bağımlılığı göstermez.

#### Özet

- Uyarıdan sınırlamaya giden zincir altı adımdır; hazırlıksız 470, altı kalemle 251, on iki kalemle
  182 dakika sürer. Sınırlama anı 656'dan 368'e, erişilen kalem 13'ten 9'a iner.
- En büyük iki adım kapsam (124 dakika taban) ve yetkidir (96 dakika); hazırlık bunları 60 ve 21
  dakikaya indirir, doğrulama ise 68'den yalnız 30'a inip zincirde üçüncü sırada kalır.
- Tek bir kalemin eksikliğinin bedeli ayrı ayrı sayılır: varlık envanteri +49, iletişim ağacı ve
  kayıt kaynağı haritası +30, yetki matrisi ve masa başı tatbikatı +25 dakika.
- Kişi-saat başına kazanç iletişim ağacında 5,00, ön onaylı yetkide 4,25 dakikadır; adli toplama
  hazırlığı 0,11'de kalır — karşılığı bu eksende değil, kanıt sayıldığında ölçülür.
- Ön onaylı yetki yılda 103 dakika kazandırır ve 233 meşru iş kalemi keser; kayıt kaynağı haritası
  eksikken aynı yetkinin kestiği kalem 467'ye çıkar.

#### Sonraki Adım

Zincirin ilk iki adımı bu derste yalnız birer dakika değeriydi: doğrulama 30, kapsam 60. İkisi de
tek bir soruyu yanıtlamak zorundadır — bu uyarı gerçekten bir olay mı ve **kaç varlık** etkilendi.
Sonraki ders bu iki adımın içine girer: uyarı hangi varlığı işaret ediyor, o varlıktan kaç adım
uzağa bakmak gerekiyor, bakılan varlıkların kaçında kayıt var ve kapsamı dar tutmak kaç etkilenmiş
varlığı listenin dışında bırakıyor.

### Tanımlama

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/tanimlama

Kapsam belirlemenin aday ve dakika olarak ölçülmesi: 30 varlıklı bir envanterde yedi kapsam ölçütünün 1 ile 19 arasında aday getirmesi, kapsam adımının 3 ile 73 dakika arasında değişmesi, kayıt göstergesinin 10 dakikada dört adayla yarıçap ikinin 68 dakikadaki on yedi adayıyla aynı sayıda kalemi açık bırakması, en geniş ölçütün on üç varlıkta meşru işi gereksiz kesmesi ve erişilmiş iki toplayıcının yalnız ağ akış verisi ilettiği için hiçbir ölçütte doğrulanamaması.

Önceki ders zinciri altı adıma böldü ve hazırlığın her adımdan kaç dakika düşürdüğünü saydı. Tam
hazırlıkta iki adım öne çıkmıştı: doğrulama 30 dakika, kapsam 60 dakika. İkisi de tek bir soruyu
yanıtlar — bu uyarı gerçekten bir olay mı ve kaç varlık etkilendi. Kapsam adımının 60 dakikası ise
önceki derste sabit bir sayıydı; bu derste o sayı, seçilen kapsam ölçütünden türetilir.

Tanımlama iki iş yapar: doğrulama ve kapsam. İkincisi bir denge sorunudur ve dengenin iki yakası da
sayılabilir. Kapsam dar tutulursa kapsam adımı kısalır ve sınırlama erken uygulanır — ama listeye
girmeyen etkilenmiş varlıklarda erişim durmaz. Kapsam geniş tutulursa kapsam adımı uzar, sınırlama
geciken her dakikada eğri ilerler ve etkilenmemiş varlıklarda meşru iş gereksiz kesilir.

#### Varlık, Kayıt ve Erişim Eğrisi

**OM8:** Kurgu ağın envanteri otuz varlıktır: on iki şube toplayıcısı, üç doğrulayıcı, iki
faturalama, iki portal, bir iş emri servisi, bir yedek deposu, bir yönetim konsolu ve sekiz saha
ucu. Komşuluk grafiği hangi varlığın hangisiyle konuştuğunu verir. **OM9:** Her varlık belirli
kayıt kaynaklarını merkezî hatta iletir. Bir varlığın etkilenip etkilenmediği ancak süreç, kimlik
ya da uygulama kaydı iletiyorsa doğrulanabilir; yalnız ağ akış verisi ileten varlıkta bağlantı
görünür, çalıştırma ya da oturum doğrulanamaz. **OM10:** Erişim eğrisi on sekiz kalemdir; her kalem
bir dakikada ve bir varlıkta erişilir. Bir varlık, adı eğride geçtiği andan sonra etkilenmiştir.
**OM11:** Kapsam ölçütü aday kümesini belirler: topolojik yarıçap, ortak hizmet hesabı, kayıt
göstergesi ya da bunların birleşimi. Gösterge kümesi doğrulama adımının bittiği anda okunur; o ana
kadar kayda düşmemiş varlık göstergede yoktur. **OM12:** Kapsam adımının dakikası aday sayısından
türer — doğrulanabilir kayıt ileten aday 7, iletmeyen aday 19 dakika inceleme ister ve üç kişilik
vardiya paralel çalışır. **OM13:** Zincirin kapsam dışındaki adımları önceki dersin tam hazırlık
değerlerindedir: doğrulama 30, kalan dört adım toplam 92 dakika. **OM14:** Sınırlama kapsamdaki her
varlığa uygulanır; kapsam dışındaki etkilenmiş varlıkta erişim sürer, kapsamdaki etkilenmemiş
varlıkta meşru iş gereksiz kesilir.

```js
// tanimlama/model.mjs — kapsam belirleme modeli: gercek bir ag ya da olay kaydi yok.
// Varlik envanteri, komsuluk grafigi, kayit iletimi ve erisim egrisi veri yapisidir.

export const UYARI = 186, ISARET = "toplayici-03";   // uyarinin isaret ettigi varlik
export const DOGRULAMA = 30, KALAN = 92;             // zincirin kapsam disindaki adimlari
export const VARDIYA = 3;                            // vardiyadaki kisi sayisi
export const DK_KAYITLI = 7, DK_BELIRSIZ = 19;       // varlik basina inceleme dakikasi

const say = (on, n) => Array.from({ length: n }, (_, i) => `${on}-${String(i + 1).padStart(2, "0")}`);
// varlik: ad -> { ilettigi kaynaklar, hizmet hesabi kullaniyor mu }
export const VARLIK = {};
for (const [i, a] of say("toplayici", 12).entries())
  VARLIK[a] = { kaynak: i < 6 ? ["surec", "ag"] : ["ag"], hesap: true };
for (const a of say("dogrulayici", 3)) VARLIK[a] = { kaynak: ["surec", "kimlik"], hesap: true };
for (const a of say("faturalama", 2)) VARLIK[a] = { kaynak: ["kimlik", "uygulama"], hesap: false };
for (const a of say("portal", 2)) VARLIK[a] = { kaynak: ["uygulama"], hesap: false };
VARLIK["isemri-01"] = { kaynak: ["uygulama"], hesap: false };
VARLIK["depo-01"] = { kaynak: [], hesap: false };
VARLIK["konsol-01"] = { kaynak: ["kimlik"], hesap: false };
for (const [i, a] of say("uc", 8).entries())
  VARLIK[a] = { kaynak: i < 5 ? ["surec"] : [], hesap: false };

// komsuluk: hangi varlik hangisiyle konusuyor (yonsuz)
export const KOMSU = {};
const bag = (a, b) => { (KOMSU[a] ??= []).push(b); (KOMSU[b] ??= []).push(a); };
say("toplayici", 12).forEach((t, i) => bag(t, `dogrulayici-${String(1 + (i / 4 | 0)).padStart(2, "0")}`));
for (const d of say("dogrulayici", 3)) { bag(d, "faturalama-01"); bag(d, "faturalama-02"); bag(d, "depo-01"); }
for (const f of say("faturalama", 2)) { bag(f, "portal-01"); bag(f, "portal-02"); }
for (const u of say("uc", 8)) bag(u, "isemri-01");
for (const t of say("toplayici", 12)) bag("konsol-01", t);

// erisim egrisi: [dakika, varlik, kalem adi] — kalem o dakikada erisilir (veri)
export const ERISIM = [
  [0, "toplayici-03", "uzerinde calistirma"], [26, "toplayici-03", "yerel kimlik deposu"],
  [58, "dogrulayici-01", "hizmet hesabi"], [95, "toplayici-07", "toplayici devri"],
  [134, "toplayici-11", "toplayici devri"], [171, "dogrulayici-02", "ikinci dogrulayici"],
  [214, "faturalama-01", "okuma ucu"], [263, "portal-01", "abone kopyasi"],
  [318, "isemri-01", "is emri kuyrugu"], [372, "uc-01", "yonetim kanali"],
  [441, "depo-01", "yedek listeleme"], [505, "faturalama-01", "arsiv disari aktarma"],
  [588, "toplayici-09", "ikinci bolge kumesi"], [676, "konsol-01", "konsol okuma"],
  [762, "portal-02", "ikinci portal kopyasi"], [845, "depo-01", "yedek disari aktarma"],
  [951, "faturalama-02", "ikinci faturalama ucu"], [1088, "konsol-01", "konsol yazma yetkisi"]];
export const kalem = (dk) => ERISIM.filter(([t]) => t <= dk);
export const etkilenen = (dk) => [...new Set(kalem(dk).map(([, v]) => v))];

// yaricap r icinde isaret varligindan ulasilan varliklar
export function yaricap(r) {
  let kume = new Set([ISARET]);
  for (let i = 0; i < r; i++)
    kume = new Set([...kume, ...[...kume].flatMap((a) => KOMSU[a] ?? [])]);
  return [...kume];
}
export const hesapKumesi = () => Object.keys(VARLIK).filter((a) => VARLIK[a].hesap);
// kayit gostergesi: o ana kadar erisilmis varliklardan gostergeyi kayda dusurenler
export const gostergeKumesi = (dk) =>
  etkilenen(dk).filter((a) => VARLIK[a].kaynak.some((k) => k !== "ag"));

export const dogrulanabilir = (a) => VARLIK[a].kaynak.some((k) => k !== "ag");
export function kapsamDakika(aday) {
  const k = aday.filter(dogrulanabilir).length, b = aday.length - k;
  return { aday: aday.length, kayitli: k, belirsiz: b,
    dk: Math.ceil((k * DK_KAYITLI + b * DK_BELIRSIZ) / VARDIYA) };
}
```

Ölçüm dosyası yedi ölçütü aynı olayda koşturur ve her ölçüt için dört sayı çıkarır: kaç aday,
kapsam adımı kaç dakika, sınırlama hangi dakikada, o anda kaç kalem açık kalıyor.

```js
// tanimlama/olc.mjs — kapsam olcutu kac aday getiriyor, kaci dogrulanabiliyor, kapsam
// dakikasi sinirlamayi nereye tasiyor, kapsam disinda kalan varlik kac kalemi acik birakiyor.
import { UYARI, ISARET, DOGRULAMA, KALAN, VARLIK, ERISIM, kalem, etkilenen,
  yaricap, hesapKumesi, gostergeKumesi, dogrulanabilir, kapsamDakika } from "./model.mjs";

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));
const t0 = process.hrtime.bigint();
const birlesim = (...k) => [...new Set(k.flat())];

const AN = UYARI + DOGRULAMA;              // dogrulamanin bittigi an: gosterge kumesi burada okunur
const OLCUT = [["yaricap 0", yaricap(0)], ["yaricap 1", yaricap(1)], ["yaricap 2", yaricap(2)],
  ["ortak hizmet hesabi", hesapKumesi()], ["kayit gostergesi", gostergeKumesi(AN)],
  ["gosterge + hesap", birlesim(gostergeKumesi(AN), hesapKumesi())],
  ["yaricap 2 + hesap", birlesim(yaricap(2), hesapKumesi())]];

const V = Object.keys(VARLIK);
console.log(`${V.length} varlik, ${V.filter(dogrulanabilir).length} tanesi dogrulanabilir kayit ` +
  `iletiyor; uyari ${UYARI}. dakikada "${ISARET}" varligini isaret etti`);
console.log(`dogrulama ${AN}. dakikada bitti; o ana kadar erisilen varlik ` +
  `${etkilenen(AN).length}: ` + etkilenen(AN).join(", "));

const R = OLCUT.map(([ad, kume]) => {
  const k = kapsamDakika(kume), sinirlama = UYARI + DOGRULAMA + k.dk + KALAN;
  const etk = etkilenen(sinirlama), kapsanan = etk.filter((a) => kume.includes(a));
  const kalemler = kalem(sinirlama), kapanan = kalemler.filter(([, v]) => kume.includes(v));
  return { ad, kume, ...k, sinirlama, etk, kapsanan, kalemler, kapanan,
    // dogrulandi: kapsamda, kayit iletiyor ve gercekten erisilmis
    dogrulandi: kume.filter((a) => dogrulanabilir(a) && etk.includes(a)).length,
    elendi: kume.filter((a) => dogrulanabilir(a) && !etk.includes(a)).length,
    etkBelirsiz: etk.filter((a) => kume.includes(a) && !dogrulanabilir(a)).length };
});

console.log("\n1. kapsam olcutu, aday sayisi ve kapsam adiminin dakikasi");
const A = [-22, 7, 9, 10, 11, 13];
yaz(A, "olcut", "aday", "kayitli", "belirsiz", "kapsam dk", "sinirlama dk");
for (const r of R) yaz(A, r.ad, r.aday, r.kayitli, r.belirsiz, r.dk, r.sinirlama);

console.log("\n2. kapsamin gordugu ve kacirdigi (sinirlama aninda)");
const B = [-22, 11, 10, 11, 9, 7, 20];
yaz(B, "olcut", "etkilenen", "kapsanan", "kacirilan", "kapanan", "acik", "gereksiz kesilen");
for (const r of R) yaz(B, r.ad, r.etk.length, r.kapsanan.length,
  r.etk.length - r.kapsanan.length, r.kapanan.length, r.kalemler.length - r.kapanan.length,
  r.aday - r.kapsanan.length);

console.log("\n3. adayin dogrulama sonucu");
const C = [-22, 12, 9, 10, 22];
yaz(C, "olcut", "dogrulandi", "elendi", "belirsiz", "kapsamda ama belirsiz");
for (const r of R) yaz(C, r.ad, r.dogrulandi, r.elendi, r.belirsiz, r.etkBelirsiz);

console.log("\n4. kapsami genisletmenin marjinal bedeli");
const D = [-38, 8, 10, 12, 10, 15];
yaz(D, "genisleme", "+aday", "+dakika", "+kapsanan", "-acik", "dakika/kalem");
const bul = (ad) => R.find((r) => r.ad === ad);
for (const [x, y] of [["yaricap 0", "yaricap 1"], ["yaricap 1", "yaricap 2"],
    ["yaricap 2", "yaricap 2 + hesap"], ["kayit gostergesi", "gosterge + hesap"],
    ["kayit gostergesi", "yaricap 2 + hesap"]]) {
  const a = bul(x), b = bul(y);
  const acikA = a.kalemler.length - a.kapanan.length, acikB = b.kalemler.length - b.kapanan.length;
  yaz(D, `${x} -> ${y}`, b.aday - a.aday, b.dk - a.dk,
    b.kapsanan.length - a.kapsanan.length, acikA - acikB,
    acikA === acikB ? "-" : ((b.dk - a.dk) / (acikA - acikB)).toFixed(1));
}

console.log("\n5. erisilmis ama hicbir kayitla dogrulanamayan varlik");
const enGenis = bul("yaricap 2 + hesap");
for (const a of enGenis.etk.filter((x) => !dogrulanabilir(x)))
  yaz([-4, -16, -26, -14], "", a, `ilettigi kaynak: ${VARLIK[a].kaynak.join(", ") || "yok"}`,
    enGenis.kume.includes(a) ? "kapsamda" : "kapsam disi");

const ms = Number(process.hrtime.bigint() - t0) / 1e6;   // ham olcum basilmaz, bant denetlenir
console.log(`\nyedi olcut ve dort tarama 500 ms bandinda: ${ms < 500 ? "evet" : "hayir"}`);
```

```
30 varlik, 20 tanesi dogrulanabilir kayit iletiyor; uyari 186. dakikada "toplayici-03" varligini isaret etti
dogrulama 216. dakikada bitti; o ana kadar erisilen varlik 6: toplayici-03, dogrulayici-01, toplayici-07, toplayici-11, dogrulayici-02, faturalama-01

1. kapsam olcutu, aday sayisi ve kapsam adiminin dakikasi
olcut                    aday  kayitli  belirsiz  kapsam dk sinirlama dk
yaricap 0                   1        1         0          3          311
yaricap 1                   3        3         0          7          315
yaricap 2                  17       10         7         68          376
ortak hizmet hesabi        15        9         6         59          367
kayit gostergesi            4        4         0         10          318
gosterge + hesap           16       10         6         62          370
yaricap 2 + hesap          19       12         7         73          381

2. kapsamin gordugu ve kacirdigi (sinirlama aninda)
olcut                   etkilenen  kapsanan  kacirilan  kapanan   acik    gereksiz kesilen
yaricap 0                       7         1          6        2      6                   0
yaricap 1                       7         2          5        3      5                   1
yaricap 2                       9         5          4        6      4                  12
ortak hizmet hesabi             8         5          3        6      3                  10
kayit gostergesi                8         4          4        5      4                   0
gosterge + hesap                8         6          2        7      2                  10
yaricap 2 + hesap               9         6          3        7      3                  13

3. adayin dogrulama sonucu
olcut                   dogrulandi   elendi  belirsiz kapsamda ama belirsiz
yaricap 0                        1        0         0                     0
yaricap 1                        2        1         0                     0
yaricap 2                        3        7         7                     2
ortak hizmet hesabi              3        6         6                     2
kayit gostergesi                 4        0         0                     0
gosterge + hesap                 4        6         6                     2
yaricap 2 + hesap                4        8         7                     2

4. kapsami genisletmenin marjinal bedeli
genisleme                                +aday   +dakika   +kapsanan     -acik   dakika/kalem
yaricap 0 -> yaricap 1                       2         4           1         1            4.0
yaricap 1 -> yaricap 2                      14        61           3         1           61.0
yaricap 2 -> yaricap 2 + hesap               2         5           1         1            5.0
kayit gostergesi -> gosterge + hesap        12        52           2         2           26.0
kayit gostergesi -> yaricap 2 + hesap       15        63           2         1           63.0

5. erisilmis ama hicbir kayitla dogrulanamayan varlik
    toplayici-07    ilettigi kaynak: ag       kapsamda      
    toplayici-11    ilettigi kaynak: ag       kapsamda      

yedi olcut ve dort tarama 500 ms bandinda: evet
```
Sayılar **ölçüm** sınıfındadır; girdileri yukarıdaki varsayımlardır.

#### Yedi Kapsam Ölçütü

Birinci tablo aday sayısını dakikaya çevirir. Yarıçap sıfır tek adaydır ve kapsam adımı 3 dakika
sürer; yarıçap bir üç adayla 7 dakika. Yarıçap iki on yedi adaya sıçrar çünkü doğrulayıcı ve yönetim
konsolu üzerinden bütün toplayıcı kümesi listeye girer — kapsam adımı 68 dakikaya çıkar. Ortak
hizmet hesabı on beş aday ve 59 dakika verir. Kayıt göstergesi dört aday ve **10 dakikadır**: bu
ölçüt, doğrulama anına kadar merkezî hatta gösterge düşürmüş varlıkları alır ve hiçbiri belirsiz
değildir, çünkü tanımı gereği hepsi kayıt iletir.

İkinci tablo aynı ölçütleri sonuçla karşılaştırır. Yarıçap sıfırda sınırlama 311. dakikada
uygulanır, o anda yedi varlık etkilenmiştir ve bunlardan yalnız biri kapsamdadır; sekiz kalemin
ikisi kapanır, **altısı açık kalır**. Yarıçap iki 376. dakikaya kadar bekler, dokuz etkilenmiş
varlığın beşini kapsar ve dört kalemi açık bırakır. Kayıt göstergesi 318. dakikada sınırlar, sekiz
etkilenmiş varlığın dördünü kapsar ve **yine dört kalemi** açık bırakır. Yarıçap ikinin on üç fazla
adayı ve 58 fazla dakikası, açık kalan kalem sayısını değiştirmez.

En iyi sonucu gösterge ile hesabın birleşimi verir: on altı aday, 62 dakika, 370. dakikada
sınırlama ve **iki açık kalem**. Yarıçap iki ile hesabın birleşimi on dokuz adayla daha geniştir,
ama kapsam adımı 73 dakikaya çıkar, sınırlama 381. dakikaya kayar ve açık kalem üçe çıkar. Daha
geniş kapsam daha çok kalem kapatmaz; geciken kapsam eğrinin ilerlemesine izin verir.

#### Gereksiz Kesilen ve Doğrulanamayan

İkinci tablonun son sütunu kararın diğer yönüdür. Kapsamdaki her varlığa sınırlama uygulanır;
kapsamda olup etkilenmemiş her varlıkta meşru iş kesilir. Yarıçap sıfır ve kayıt göstergesi bu
sütunda sıfırdır — getirdikleri her aday gerçekten etkilenmiştir. Yarıçap iki on iki, gösterge ile
hesap on, yarıçap iki ile hesap **on üç** varlıkta meşru işi gereksiz keser. Kayıt göstergesinin
isabeti burada görünür: dört adayın dördü de etkilenmiştir.

Üçüncü tablo aday kümesinin içini açar. Yarıçap iki ile hesabın on dokuz adayından dördü
doğrulanır, sekizi elenir, yedisi **belirsiz** kalır — yani ne doğrulanabilir ne elenebilir, çünkü
o varlıklar doğrulanabilir kayıt iletmez. Son sütun bunun içinden en can sıkıcı alt kümeyi çeker:
gerçekten etkilenmiş olduğu hâlde belirsiz kalan varlık sayısı ikidir.

Beşinci tablo bu iki varlığı adıyla yazar. `toplayici-07` ve `toplayici-11` erişim eğrisinde 95. ve
134. dakikalarda geçer; ikisi de yalnız ağ akış verisi iletir. Kapsamdadırlar ve sınırlama onlara da
uygulanır, ama etkilendikleri hiçbir kayıtla doğrulanamaz. Kayıt iletmeyen varlıkta sınırlama kararı
ya kapsam ölçütüyle verilir ya hiç verilmez.

#### Genişletmenin Marjinal Bedeli

Dördüncü tablo kapsamı bir ölçütten diğerine taşımanın bedelini kalem başına dakikaya çevirir.
Yarıçap sıfırdan bire geçiş iki aday ve 4 dakika ister, bir kalem kapatır: kalem başına 4,0 dakika.
Yarıçap birden ikiye geçiş on dört aday ve 61 dakika ister ve yine yalnız bir kalem kapatır: kalem
başına **61,0 dakika**. Yarıçap ikiden hesap eklemeye geçiş iki aday ve 5 dakikayla bir kalem daha
kapatır.

İki kalemi birden kapatan iki geçişin ucuzu göstergeden gösterge ile hesaba geçiştir: on iki aday
ve 52 dakika karşılığında iki kalem, yani kalem başına 26,0 dakika. Topolojik yarıçap bu ağda
pahalı bir ölçüttür: yönetim konsolu bütün toplayıcılara bağlı olduğu için ikinci yarıçap adımı
envanterin yarısını birden listeye alır ve getirdiği varlıkların çoğu etkilenmemiştir.

#### Özet

- Otuz varlıklı envanterin yirmisi doğrulanabilir kayıt iletir; yedi kapsam ölçütü 1 ile 19 arasında
  aday getirir ve kapsam adımı 3 ile 73 dakika arasında değişir.
- Kayıt göstergesi dört adayla 10 dakikada sınırlamayı 318. dakikaya çeker ve dört kalemi açık
  bırakır; yarıçap iki on yedi adayla 68 dakika harcar, 376. dakikada sınırlar ve yine dört kalemi
  açık bırakır.
- En az açık kalemi (iki) gösterge ile hesabın birleşimi verir; yarıçap iki ile hesap üç aday daha
  getirip 11 dakika geciktiği için üç kalem açık bırakır.
- Geniş kapsamın bedeli gereksiz kesmedir: yarıçap iki ile hesap on üç etkilenmemiş varlıkta meşru
  işi keser, kayıt göstergesi hiçbirinde kesmez.
- Erişilmiş iki toplayıcı yalnız ağ akış verisi iletir; kapsamdadır ama etkilendikleri hiçbir
  kayıtla doğrulanamaz — kalan on yedi adayın yedisi de aynı nedenle belirsizdir.

#### Sonraki Adım

Bu derste sınırlama tek bir eylemdi ve kapsamdaki her varlığa aynı biçimde uygulandı. Gerçekte
sınırlama tek bir eylem değildir: bir ağ bölütünü kesmek dakikalar içinde uygulanır ve şubenin
bütün meşru trafiğini durdurur, bir hizmet hesabını yeniden anahtarlamak saatler alır ama meşru işi
geri açar. Sonraki ders aynı olayda bu iki türü ayrı ayrı koşturur: kısa vadeli sınırlama kaç meşru
iş kalemini keser, uzun vadeli sınırlama kaç dakika sonra devreye girer ve o dakikalarda kaç ek
kaleme erişilir.

### Sınırlama

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/sinirlama

Aynı olayda erken ve geç sınırlamanın kalem farkının hesaplanması: sekiz kısa ve dört uzun vadeli eylemin yedi düzende koşturulması, erken sınırlamanın 393. dakikada 10 kalemde durdurup 1.161 meşru iş kalemi kesmesine karşılık yalnız uzun vadeli sınırlamanın 765. dakikada 15 kalemde durup hiç kesmemesi, beş ek kalemin bedelinin ek kalem başına 232 meşru iş kalemi olması, uzun vadeli eylem yokken aynı kesmenin 11.687 kaleme çıkması ve yıllık dengede erken politikanın 9.171 meşru iş kalemine karşılık 30 ek kalem önlemesi.

Önceki ders kapsamı ölçtü ve en iyi ölçüt 370. dakikada bir karar üretti. O derste sınırlama tek bir
eylemdi: kapsamdaki her varlığa aynı biçimde uygulandı ve erişim durdu. Bu ders o basitleştirmeyi
kaldırır. Sınırlama tek bir eylem değildir; farklı dakikalarda devreye giren, farklı varlıkları
kapatan ve farklı bedeller üreten bir eylem kümesidir.

Ayrım kısa vadeli ile uzun vadeli sınırlama arasındadır. Kısa vadeli eylem dakikalar içinde
uygulanır ve uygulandığı andan itibaren o varlıklardaki meşru işi de durdurur. Uzun vadeli eylem
saatler sonra devreye girer, meşru işi kesmez ve kısa vadeli kesmeyi kaldırır. Bu dersin ölçtüğü
şey bu iki türün aynı olaydaki kalem farkıdır.

#### Sınırlama Eylemleri

**OM15:** Sınırlama kümesi sekiz kısa ve dört uzun vadeli eylemden oluşur; her eylem karar anından
belirli bir dakika sonra devreye girer, belirli varlıkları kapatır ve belirli sayıda kalemin elle
yeniden kurulmasını gerektirir. **OM16:** Erişim, o an etkilenmiş bütün varlıklar kapatıldığında
durur; kapatılmamış tek bir etkilenmiş varlık kalırsa erişim sürer. **OM17:** Her varlık sınıfının
saatlik meşru iş kalemi vardır — toplayıcı 12, doğrulayıcı 26, faturalama 18, portal 40, iş emri 9,
saha ucu 4, yedek deposu ve konsol 2. **OM18:** Kısa vadeli sınırlama, aynı varlığı kapsayan ilk
uzun vadeli eylem devreye girene kadar sürer; böyle bir eylem yoksa 2.880 dakikalık ölçüm
penceresinin sonuna kadar sürer. **OM19:** Karar anı önceki dersten gelir: 370. dakika. **OM20:**
Uzun vadeli eylem meşru işi kesmez, ama elle yeniden kurulacak kalem üretir. **OM21:** Yılda 24
doğrulanmış uyarının altısı gerçek olaydır; erken kesme politikasında kısa vadeli sınırlama
doğrulamadan önce uygulanır ve gerçek olmayan uyarıda doğrulama süresi boyunca sürer.

```js
// sinirlama/model.mjs — sinirlama modeli: gercek bir olay ya da ag yok. Erisim egrisi,
// sinirlama eylemleri ve mesru is hizlari veri yapisidir; sureler kurgu verilerdir.

export const KARAR = 370, PENCERE = 2880;      // onceki dersin karar ani; olcum penceresi (dk)
// erisim egrisi: [dakika, varlik, kalem adi] (onceki dersle ayni veri)
export const ERISIM = [
  [0, "toplayici-03", "uzerinde calistirma"], [26, "toplayici-03", "yerel kimlik deposu"],
  [58, "dogrulayici-01", "hizmet hesabi"], [95, "toplayici-07", "toplayici devri"],
  [134, "toplayici-11", "toplayici devri"], [171, "dogrulayici-02", "ikinci dogrulayici"],
  [214, "faturalama-01", "okuma ucu"], [263, "portal-01", "abone kopyasi"],
  [318, "isemri-01", "is emri kuyrugu"], [372, "uc-01", "yonetim kanali"],
  [441, "depo-01", "yedek listeleme"], [505, "faturalama-01", "arsiv disari aktarma"],
  [588, "toplayici-09", "ikinci bolge kumesi"], [676, "konsol-01", "konsol okuma"],
  [762, "portal-02", "ikinci portal kopyasi"], [845, "depo-01", "yedek disari aktarma"],
  [951, "faturalama-02", "ikinci faturalama ucu"], [1088, "konsol-01", "konsol yazma yetkisi"]];
export const kalem = (dk) => ERISIM.filter(([t]) => t <= dk);
export const etkilenen = (dk) => [...new Set(kalem(dk).map(([, v]) => v))];

const say = (on, n) => Array.from({ length: n }, (_, i) => `${on}-${String(i + 1).padStart(2, "0")}`);
export const TOPLAYICI = say("toplayici", 12), DOGRULAYICI = say("dogrulayici", 3);
export const HESAP = [...TOPLAYICI, ...DOGRULAYICI];        // ortak hizmet hesabini kullananlar
export const UYGULAMA = [...say("faturalama", 2), ...say("portal", 2), "isemri-01"];
export const KAPSAM = ["toplayici-03", "toplayici-07", "toplayici-11",
  "dogrulayici-01", "dogrulayici-02", "faturalama-01"];     // onceki derste dogrulanan kapsam

// varlik sinifi basina saatlik mesru is kalemi (veri)
export const MESRU = { toplayici: 12, dogrulayici: 26, faturalama: 18, portal: 40,
  isemri: 9, uc: 4, depo: 2, konsol: 2 };
export const saatlik = (kume) =>
  kume.reduce((s, a) => s + (MESRU[a.split("-")[0]] ?? 0), 0);

// sinirlama eylemi: ad, tur, karardan sonra uygulanma dakikasi, kapattigi varlik,
// elle yeniden kurulacak kalem
export const SAHA = say("uc", 8), TUMU = [...HESAP, ...UYGULAMA, ...SAHA, "depo-01", "konsol-01"];
export const EYLEM = {
  hesapKilit: ["hizmet hesabini kilitleme", "kisa", 4, HESAP, 0],
  konsolKapat: ["yonetim kanalini kapatma", "kisa", 9, ["konsol-01"], 0],
  bolutKes: ["sube bolutunu kesme", "kisa", 11, TOPLAYICI, 0],
  depoKilit: ["yedek deposunu salt okunura alma", "kisa", 13, ["depo-01"], 0],
  uygulamaKilit: ["uygulama ucunu salt okunura alma", "kisa", 16, UYGULAMA, 0],
  kapsamKes: ["dogrulanan kapsami agdan alma", "kisa", 19, KAPSAM, 0],
  sahaAyir: ["saha uclarini agdan alma", "kisa", 23, SAHA, 0],
  disKes: ["merkezi hattin dis baglantisini kesme", "kisa", 31, TUMU, 0],
  hesapAnahtar: ["hizmet hesabini yeniden anahtarlama", "uzun", 214, HESAP, 15],
  bolutKural: ["bolutleme kuralini kalicilastirma", "uzun", 286, [...TOPLAYICI, "konsol-01"], 4],
  uygulamaYama: ["uygulama ucunu yamalama", "uzun", 341, [...UYGULAMA, "depo-01"], 5],
  ucKur: ["uc noktayi yeniden kurma", "uzun", 395, [...SAHA, ...KAPSAM], 6],
};
export const e = (k) => { const [ad, tur, dk, kume, elle] = EYLEM[k];
  return { anahtar: k, ad, tur, dk, kume, elle }; };

// erisim, o an etkilenmis butun varliklar kapatildiginda durur
export function uygula(karar, anahtarlar) {
  const sirali = anahtarlar.map(e).sort((a, b) => a.dk - b.dk);
  const kapali = new Set();
  for (const y of sirali) {
    const t = karar + y.dk;
    for (const a of y.kume) kapali.add(a);
    if (etkilenen(t).every((a) => kapali.has(a))) return { t, kapali, duran: y };
  }
  return { t: null, kapali, duran: null };
}

// kisa vadeli sinirlama, ayni varliklari kapsayan uzun vadeli eylem devreye girene kadar surer
export function olc(karar, anahtarlar) {
  const y = anahtarlar.map(e), s = uygula(karar, anahtarlar);
  const kisa = y.filter((x) => x.tur === "kisa"), uzun = y.filter((x) => x.tur === "uzun");
  // her varlikta kisa vadeli kesme, o varligi kapsayan ilk uzun vadeli eylem devreye
  // girene kadar surer; boyle bir eylem yoksa olcum penceresinin sonuna kadar surer
  const kaldirma = (a) => Math.min(PENCERE,
    ...uzun.filter((u) => u.kume.includes(a)).map((u) => u.dk));
  let kesilen = 0;
  const kesik = new Map();
  for (const k of kisa) for (const a of k.kume)
    kesik.set(a, Math.min(kesik.get(a) ?? Infinity, k.dk));
  for (const [a, bas] of kesik)
    kesilen += (MESRU[a.split("-")[0]] ?? 0) * Math.max(0, kaldirma(a) - bas) / 60;
  const son = s.t ?? karar + PENCERE;
  return { sinirlama: s.t, kalem: kalem(son).length, acik: s.t
      ? etkilenen(s.t).filter((a) => !s.kapali.has(a)).length : etkilenen(son).length,
    kesilen: Math.round(kesilen), elle: y.reduce((a, x) => a + x.elle, 0),
    kesikVarlik: kesik.size, kisa: kisa.length, uzun: uzun.length };
}
```

Ölçüm dosyası sekiz sınırlama düzenini aynı olayda ve aynı karar anında koşturur, sonra karar anını
tarayarak erken ile geç sınırlamanın kalem farkını çıkarır.

```js
// sinirlama/olc.mjs — ayni olayda erken ve gec sinirlamanin kalem farki: kisa vadeli
// sinirlama kac mesru is kalemi kesiyor, uzun vadeli kac dakika sonra devreye giriyor,
// o dakikalarda kac ek kaleme erisiliyor.
import { KARAR, PENCERE, ERISIM, kalem, EYLEM, e, saatlik, olc } from "./model.mjs";

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));
const t0 = process.hrtime.bigint();

console.log(`karar ani ${KARAR}. dakika (onceki dersin en iyi kapsam olcutu); ` +
  `olcum penceresi ${PENCERE} dk`);

console.log("\n1. sinirlama eylemleri");
const A = [-38, 7, 8, 9, 12, 7];
yaz(A, "eylem", "tur", "+dakika", "varlik", "mesru is/sa", "elle");
for (const k of Object.keys(EYLEM)) {
  const y = e(k);
  yaz(A, y.ad, y.tur, y.dk, y.kume.length, y.tur === "kisa" ? saatlik(y.kume) : "-",
    y.elle || "-");
}

const DUZEN = {
  "dar kisa": ["kapsamKes"],
  "hesap kilidi": ["hesapKilit"],
  "tam kisa": ["kapsamKes", "uygulamaKilit", "sahaAyir"],
  "genis kisa": ["hesapKilit", "konsolKapat", "bolutKes", "depoKilit", "uygulamaKilit", "sahaAyir"],
  "dis baglantiyi kesme": ["disKes"],
  "yalniz uzun": ["hesapAnahtar", "bolutKural", "uygulamaYama", "ucKur"],
  "tam kisa + uzun": ["kapsamKes", "uygulamaKilit", "sahaAyir",
    "hesapAnahtar", "bolutKural", "uygulamaYama", "ucKur"],
};

console.log(`\n2. ${Object.keys(DUZEN).length} sinirlama duzeni, ayni olay ve ayni karar ani`);
const B = [-22, 12, 9, 8, 10, 13, 7];
yaz(B, "duzen", "sinirlama", "kalem", "acik", "kesik", "kesilen is", "elle");
const R = {};
for (const [ad, k] of Object.entries(DUZEN)) {
  const r = R[ad] = olc(KARAR, k);
  yaz(B, ad, r.sinirlama ?? "durmadi", `${r.kalem}/${ERISIM.length}`, r.acik,
    r.kesikVarlik, r.kesilen, r.elle || "-");
}

console.log("\n3. ayni olayda erken ve gec sinirlama (karar ani taranir)");
const C = [-9, 11, 8, 11, 8, 10, 12, 12];
yaz(C, "karar", "erken dk", "kalem", "gec dk", "kalem", "ek kalem", "kesilen is", "is/ek kalem");
for (const karar of [311, 318, 370, 437, 656]) {
  const er = olc(karar, DUZEN["tam kisa + uzun"]), ge = olc(karar, DUZEN["yalniz uzun"]);
  const ek = ge.kalem - er.kalem;
  yaz(C, karar, er.sinirlama, er.kalem, ge.sinirlama, ge.kalem, ek, er.kesilen,
    ek ? (er.kesilen / ek).toFixed(0) : "-");
}

// yillik uyari kumesi: 24 dogrulanmis uyarinin 6'si gercek olay (veri). Erken politikada
// kisa vadeli sinirlama dogrulamadan once uygulanir ve yanlis uyaride DOGRULAMA kadar surer.
const UYARI_YIL = 24, GERCEK = 6, DOGRULAMA = 30;
const kesik = saatlik([...new Set(DUZEN["tam kisa + uzun"].flatMap((k) =>
  e(k).tur === "kisa" ? e(k).kume : []))]);
console.log(`\n4. yillik denge (${UYARI_YIL} dogrulanmis uyari, ${GERCEK} gercek olay; ` +
  `yanlis uyaride kesme ${DOGRULAMA} dk surer)`);
const D = [-18, 15, 16, 13, 14];
yaz(D, "politika", "gercek olayda", "yanlis uyarida", "yil kesilen", "yil ek kalem");
const erY = olc(KARAR, DUZEN["tam kisa + uzun"]), geY = olc(KARAR, DUZEN["yalniz uzun"]);
const yanlis = Math.round((UYARI_YIL - GERCEK) * kesik * DOGRULAMA / 60);
yaz(D, "erken kesme", GERCEK * erY.kesilen, yanlis, GERCEK * erY.kesilen + yanlis, 0);
yaz(D, "gec kesme", 0, 0, 0, GERCEK * (geY.kalem - erY.kalem));
console.log(`  erken politikanin kalem basina bedeli: ` +
  `${((GERCEK * erY.kesilen + yanlis) / (GERCEK * (geY.kalem - erY.kalem))).toFixed(0)} mesru is kalemi`);

console.log("\n5. gec sinirlamanin izin verdigi ek kalemler");
for (const [t, v, ad] of kalem(geY.sinirlama).filter(([t]) => t > erY.sinirlama))
  yaz([-4, -12, -18, -28], "", `${t}. dakika`, v, ad);

const ms = Number(process.hrtime.bigint() - t0) / 1e6;   // ham olcum basilmaz, bant denetlenir
console.log(`\nyedi duzen ve bes karar ani 500 ms bandinda: ${ms < 500 ? "evet" : "hayir"}`);
```

```
karar ani 370. dakika (onceki dersin en iyi kapsam olcutu); olcum penceresi 2880 dk

1. sinirlama eylemleri
eylem                                     tur +dakika   varlik mesru is/sa   elle
hizmet hesabini kilitleme                kisa       4       15         222      -
yonetim kanalini kapatma                 kisa       9        1           2      -
sube bolutunu kesme                      kisa      11       12         144      -
yedek deposunu salt okunura alma         kisa      13        1           2      -
uygulama ucunu salt okunura alma         kisa      16        5         125      -
dogrulanan kapsami agdan alma            kisa      19        6         106      -
saha uclarini agdan alma                 kisa      23        8          32      -
merkezi hattin dis baglantisini kesme    kisa      31       30         383      -
hizmet hesabini yeniden anahtarlama      uzun     214       15           -     15
bolutleme kuralini kalicilastirma        uzun     286       13           -      4
uygulama ucunu yamalama                  uzun     341        6           -      5
uc noktayi yeniden kurma                 uzun     395       14           -      6

2. 7 sinirlama duzeni, ayni olay ve ayni karar ani
duzen                    sinirlama    kalem    acik     kesik   kesilen is   elle
dar kisa                   durmadi    18/18      14         6         5054      -
hesap kilidi               durmadi    18/18      14        15        10641      -
tam kisa                       393    10/18       0        18        11687      -
genis kisa                     393    10/18       0        30        18323      -
dis baglantiyi kesme           401    10/18       0        30        18186      -
yalniz uzun                    765    15/18       0         0            0     30
tam kisa + uzun                393    10/18       0        18         1161     30

3. ayni olayda erken ve gec sinirlama (karar ani taranir)
karar       erken dk   kalem     gec dk   kalem  ek kalem  kesilen is is/ek kalem
311              330       9        706      14         5        1161         232
318              337       9        713      14         5        1161         232
370              393      10        765      15         5        1161         232
437              778      15        832      15         0        1161           -
656              997      17       1051      17         0        1161           -

4. yillik denge (24 dogrulanmis uyari, 6 gercek olay; yanlis uyaride kesme 30 dk surer)
politika            gercek olayda  yanlis uyarida  yil kesilen  yil ek kalem
erken kesme                  6966            2205         9171             0
gec kesme                       0               0            0            30
  erken politikanin kalem basina bedeli: 306 mesru is kalemi

5. gec sinirlamanin izin verdigi ek kalemler
    441. dakika depo-01           yedek listeleme             
    505. dakika faturalama-01     arsiv disari aktarma        
    588. dakika toplayici-09      ikinci bolge kumesi         
    676. dakika konsol-01         konsol okuma                
    762. dakika portal-02         ikinci portal kopyasi       

yedi duzen ve bes karar ani 500 ms bandinda: evet
```
Sayılar **ölçüm** sınıfındadır; girdileri yukarıdaki varsayımlardır.

#### Sekiz Düzen, Aynı Olay

İkinci tablo yedi düzeni aynı olayda ve aynı karar anında koşturur. İlk iki satır erişimi hiç
durdurmaz. Dar kısa düzen altı varlığı keser, 5.054 meşru iş kalemi harcar ve on dört varlık açık
kaldığı için on sekiz kalemin hepsine erişilir; hesap kilidi on beş varlığı keser ve 10.641 kalem
harcar. Bu iki düzen kararın her iki yönünden de kaybeder: hem meşru iş kesilir hem erişim sürer.

Tam kısa düzen üç eylemle 393. dakikada durdurur; erişilen kalem **on**dur ve açık varlık kalmaz.
Geniş kısa düzen aynı dakikada durdurur ama otuz varlığı keser ve 18.323 kalem harcar; dış bağlantıyı
kesmek 401. dakikada durdurur ve 18.186 kalem harcar. **Aynı sonucu veren üç düzenin bedeli 11.687
ile 18.323 arasında değişir.**

Uzun vadeli eylemler kısa vadeli kesmenin süresini belirler. Tam kısa düzende uzun vadeli eylem
yokken kesme ölçüm penceresinin sonuna kadar sürer ve 11.687 kalem harcar; dört uzun vadeli eylem
eklendiğinde **1.161 kaleme** iner. Uzun vadeli eylem burada kısa vadeli sınırlamanın **bitiş
tarihidir**.

#### Erken ile Geç Arasındaki Fark

Üçüncü tablo bu dersin ana ölçümüdür. Aynı olayda iki düzen karşılaştırılır: erken (tam kısa artı
uzun) ve geç (yalnız uzun). Erken düzen 393. dakikada durdurur ve on kaleme erişilir; geç düzen
765. dakikada durdurur ve **on beş** kaleme erişilir. Fark beş kalem,
bedeli 1.161 meşru iş kalemidir — yani ek kalem başına **232 meşru iş kalemi**. Karar ne kadar erken
verilirse verilsin bu oran değişmez: 311. ve 318. dakikalarda da fark beş kalem ve oran 232'dir,
çünkü kısa ile uzun vadeli eylemler arasındaki mesafe karar anından bağımsızdır.

Tablonun son iki satırı bunu bozar. Karar 437. dakikaya kaydığında erken düzen 393 yerine 778.
dakikada durdurur; 656. dakikada verilen kararla 997. dakikaya çıkar. Nedeni erişim eğrisinin kapsam
dışına çıkmasıdır: 441. dakikada yedek deposuna, 588. dakikada ikinci bölge toplayıcı kümesine
erişilir ve tam kısa düzenin üç eylemi bu varlıkları kapsamaz. Erişim ancak uzun vadeli eylem
devreye girdiğinde durur. **Bu iki satırda erken sınırlamanın kazandırdığı ek kalem sıfırdır, ama
kestiği meşru iş yine 1.161 kalemdir.** Kısa vadeli sınırlamanın değeri, karar anındaki kapsamın
hâlâ geçerli olmasına bağlıdır.

Beşinci tablo geç sınırlamanın izin verdiği beş kalemi adıyla yazar. İkisi veri dışarı aktarma,
ikisi erişimin yeni varlıklara yayılmasıdır. Sayı beştir, ama kalemlerin ağırlığı eşit değildir ve
bu model onu ölçmez.

#### Yılın Dengesi

Dördüncü tablo kararı yıla taşır. Erken kesme politikasında altı gerçek olayda 6.966, on sekiz
gerçek olmayan uyarıda 2.205 meşru iş kalemi kesilir — yılda **9.171 kalem**. Geç kesme
politikasında hiçbir kalem kesilmez ve karşılığında **30 ek kaleme** erişilir; erken politikanın
önlediği ek kalem başına bedeli 306 meşru iş kalemidir.

Bu iki sayı aynı birimden değildir ve model onları birbirine çeviremez; kararı veren iki sütunu
görüp kendi ölçüsüyle tartar. Ölçümün yaptığı iş kararı sayısız bırakmamaktır: "erken sınırlayalım"
ile "önce doğrulayalım" arasındaki fark bu olayda 9.171 kaleme karşı 30 kalemdir.

#### Özet

- Erişimi durduran üç kısa düzen 393 ile 401. dakikalarda ve on kalemde durdurur, ama bedelleri
  11.687 ile 18.323 kalem arasında değişir; uzun vadeli eylem eklendiğinde aynı kesmenin bedeli
  1.161 kaleme iner ve karşılığı otuz kalemin elle yeniden kurulmasıdır.
- Erken sınırlama 393. dakikada on kalemde, geç sınırlama 765. dakikada on beş kalemde durur; beş ek
  kalemin bedeli ek kalem başına 232 meşru iş kalemidir.
- Karar 437. dakikaya geciktiğinde erişim eğrisi kapsam dışına çıkar: erken düzenin kazandırdığı ek
  kalem sıfıra iner, kestiği meşru iş 1.161 kalemde kalır.
- Yıllık dengede erken politika 9.171 meşru iş kalemi keser ve 30 ek kalem önler; ek kalem başına
  306 meşru iş kalemi.

#### Sonraki Adım

Erişim durdu, ama duran şey yalnız erişimdir; sistemler ağa döndüğünde üzerlerinde ne varsa onunla
dönerler. Sonraki ders bunu ölçer: uçlarda kaç tutunma noktası var, keşif yöntemleri kaçını buluyor,
temizleme kaçını kaldırıyor ve kaçırılan bir nokta kaç gün sonra yeniden bulaşma üretiyor.

### Temizleme

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/temizleme

Kalıcılığın kaldırılmasının tutunma noktası cinsinden ölçülmesi: dokuz etkilenen varlıkta 22 noktanın beş keşif yöntemiyle 506 dakikada 17'sinin bulunması, dört yapılandırma kancasının üçünün hiçbir yöntemle bulunamaması çünkü bellek sınırlamada ağdan alınan varlıklarda kaybolmuş olması, altı temizleme düzeninde kaçırılan noktanın 10'dan 0'a inerken toplam sürenin 353 dakikadan 1.361 dakikaya çıkması ve beş kaçırılan noktanın 60 günde 8 yeniden bulaşma üretip ilkini beşinci günde vermesi.

Önceki ders erişimi durdurdu. Kısa vadeli sınırlama 393. dakikada uygulandı, uzun vadeli eylemler
saatler içinde devreye girdi ve kesme kalktı. Duran şey erişimdi; uçlarda otomatik çalıştırılan
kalemler durmadı. Kısa vadeli kesme kalktığında ve varlıklar ağa döndüğünde, üzerlerinde ne varsa
onunla dönerler.

Temizlemenin ölçü birimi **tutunma noktasıdır**: otomatik çalıştırılan kalem. Nokta türlerinin
envanteri Uç Nokta Güvenliği kursunda ölçüldü; burada girdi olarak alınır. Bu derste sayılan üç
şey ayrıdır — kaç nokta **biliniyor**, kaçı **temizlendi**, kaçı **kaçırıldığında** yeniden bulaşma
üretiyor. Üçü aynı sayı değildir; aradaki fark bu dersin konusudur. Hiçbir kalıcılık kurma yöntemi
yazılmaz, sayılan şey noktanın kendisi ve üzerindeki keşif yöntemidir.

#### Nokta Envanteri ve Keşif Yöntemleri

**OM22:** Önceki dersteki dokuz etkilenen varlıkta toplam 22 tutunma noktası vardır; yedi türe
dağılırlar ve her noktanın günlük yeniden etkinleşme olasılığı bir veridir. **OM23:** Beş keşif
yöntemi vardır ve her biri yalnız belirli türleri bulur: taban çizgisi karşılaştırma, süreç
oluşturma kaydı taraması, kimlik deposu denetimi, ağ akış verisi izleme ve bellek incelemesi.
**OM24:** Her yöntem her varlıkta uygulanamaz — taban çizgisi karşılaştırma taban çizgisi olan
varlıkta, süreç kaydı taraması süreç kaydı ileten varlıkta, **bellek incelemesi ise sınırlamada
ağdan alınmamış varlıkta** çalışır. **OM25:** Bulunan nokta kaldırılabilir ve nokta başına 8 dakika
sürer; bir varlığı yeniden kurmak 95 dakika sürer ve o varlıktaki bütün noktaları — bulunmamış
olanlar dahil — kaldırır. **OM26:** Kaçırılan nokta her gün kendi olasılığıyla yeniden etkinleşir;
tarama 60 gündür ve tohum 20260214'tür. Bütün zarlar baştan atılır, altı düzen aynı günlük diziyi
paylaşır.

```js
// temizleme/model.mjs — kalicilik temizleme modeli: gercek bir uc, kalicilik yontemi ya da
// betik yok. Tutunma noktalari, kesif yontemleri ve varlik ozellikleri veri yapisidir.

export const TOHUM = 20260214, GUN = 60;       // yeniden bulasma taramasi
export const YENIDEN_KURMA_DK = 95, KALDIRMA_DK = 8;   // varlik basina, nokta basina

// etkilenen varlik: ad -> { taban cizgisi var mi, surec kaydi iletiyor mu,
// sinirlamada agdan mi alindi (bellek kayboldu) }
export const VARLIK = {
  "toplayici-03": { taban: true, surec: true, agdan: true },
  "toplayici-07": { taban: true, surec: false, agdan: true },
  "toplayici-11": { taban: true, surec: false, agdan: true },
  "dogrulayici-01": { taban: true, surec: true, agdan: true },
  "dogrulayici-02": { taban: true, surec: true, agdan: true },
  "faturalama-01": { taban: true, surec: false, agdan: true },
  "portal-01": { taban: true, surec: false, agdan: false },
  "isemri-01": { taban: true, surec: false, agdan: false },
  "uc-01": { taban: false, surec: true, agdan: true },
};

// tutunma noktasi: [varlik, tur, gunluk yeniden etkinlesme olasiligi]
// M24/K05'te tur envanteri olculdu; burada girdi olarak alinir, yontem yazilmaz
export const NOKTA = [
  ["toplayici-03", "servis tanimi", 0.06], ["toplayici-03", "zamanlanmis gorev", 0.05],
  ["toplayici-03", "yapilandirma kancasi", 0.04], ["toplayici-07", "servis tanimi", 0.06],
  ["toplayici-07", "oturum betigi", 0.03], ["toplayici-11", "zamanlanmis gorev", 0.05],
  ["toplayici-11", "bellekte kalan kosum", 0.02], ["dogrulayici-01", "servis tanimi", 0.07],
  ["dogrulayici-01", "kimlik kalemi", 0.09], ["dogrulayici-01", "disa acilan baglanti", 0.05],
  ["dogrulayici-02", "kimlik kalemi", 0.09], ["dogrulayici-02", "yapilandirma kancasi", 0.04],
  ["faturalama-01", "kimlik kalemi", 0.08], ["faturalama-01", "oturum betigi", 0.03],
  ["faturalama-01", "disa acilan baglanti", 0.05], ["portal-01", "yapilandirma kancasi", 0.04],
  ["portal-01", "kimlik kalemi", 0.08], ["isemri-01", "zamanlanmis gorev", 0.05],
  ["isemri-01", "bellekte kalan kosum", 0.02], ["uc-01", "oturum betigi", 0.03],
  ["uc-01", "servis tanimi", 0.06], ["uc-01", "yapilandirma kancasi", 0.04],
];

// kesif yontemi: ad, varlik basina dakika, buldugu turler, hangi varlikta uygulanabilir
export const YONTEM = [
  ["taban cizgisi karsilastirma", 22, ["servis tanimi", "zamanlanmis gorev", "oturum betigi"],
    (v) => v.taban],
  ["surec olusturma kaydi taramasi", 14,
    ["servis tanimi", "zamanlanmis gorev", "bellekte kalan kosum"], (v) => v.surec],
  ["kimlik deposu denetimi", 9, ["kimlik kalemi"], () => true],
  ["ag akis verisi izleme", 11, ["disa acilan baglanti"], () => true],
  ["bellek incelemesi", 47, ["bellekte kalan kosum", "yapilandirma kancasi"], (v) => !v.agdan],
];

// secilen yontem kumesiyle bulunan nokta dizini ve harcanan dakika
export function kesfet(secili) {
  const bulunan = new Set();
  let dk = 0;
  for (const [ad, dakika, turler, uygun] of YONTEM) {
    if (!secili.includes(ad)) continue;
    for (const [a, v] of Object.entries(VARLIK)) {
      if (!uygun(v)) continue;
      dk += dakika;
      NOKTA.forEach(([na, nt], i) => { if (na === a && turler.includes(nt)) bulunan.add(i); });
    }
  }
  return { bulunan, dk };
}

export function uretec(tohum) {                    // dogrusal eslesmeli uretec
  let x = tohum >>> 0;
  return () => ((x = (x * 1664525 + 1013904223) >>> 0) / 2 ** 32);
}
// butun zarlar bastan atilir: kosumlar ayni gunluk diziyi paylasir
const Z = (() => { const z = uretec(TOHUM);
  return Array.from({ length: GUN * NOKTA.length }, () => z()); })();

// kacirilan nokta gunluk olasilikla yeniden etkinlesir; ilk etkinlesme ve toplam sayilir
export function bulasma(kacirilan) {
  let ilk = null, olay = 0;
  for (let g = 0; g < GUN; g++)
    for (const i of kacirilan)
      if (Z[g * NOKTA.length + i] < NOKTA[i][2]) { olay++; if (ilk === null) ilk = g + 1; }
  return { ilk, olay };
}

export function olc(secili, yenidenKurulan) {
  const { bulunan, dk } = kesfet(secili);
  const kurulan = new Set(yenidenKurulan);
  const temiz = new Set(bulunan);
  NOKTA.forEach(([a], i) => { if (kurulan.has(a)) temiz.add(i); });
  const kacirilan = NOKTA.map((_, i) => i).filter((i) => !temiz.has(i));
  const kaldirilan = [...bulunan].filter((i) => !kurulan.has(NOKTA[i][0])).length;
  return { bulunan: bulunan.size, temiz: temiz.size, kacirilan,
    kesifDk: dk, temizDk: kaldirilan * KALDIRMA_DK + kurulan.size * YENIDEN_KURMA_DK,
    kurulan: kurulan.size, ...bulasma(kacirilan) };
}
```

Ölçüm dosyası önce yöntemleri tek tek ekleyip her birinin kaç yeni nokta getirdiğini sayar, sonra
altı temizleme düzenini aynı envanterde koşturur.

```js
// temizleme/olc.mjs — kac tutunma noktasi var, kesif yontemi kacini buluyor, temizleme
// kacini kaldiriyor ve kacirilan nokta kac gun sonra yeniden bulasma uretiyor.
import { TOHUM, GUN, VARLIK, NOKTA, YONTEM, kesfet, olc } from "./model.mjs";

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));
const t0 = process.hrtime.bigint();
const TUM = YONTEM.map((y) => y[0]);
const V = Object.keys(VARLIK);
const TURLER = [...new Set(NOKTA.map(([, t]) => t))];

console.log(`${V.length} etkilenen varlikta ${NOKTA.length} tutunma noktasi, ` +
  `${TURLER.length} tur; ${YONTEM.length} kesif yontemi; tohum ${TOHUM}`);

console.log("\n1. kesif yontemi eklendikce bulunan nokta (kumulatif)");
const A = [-32, 10, 8, 12, 15, 16];
yaz(A, "yontem", "dk/varlik", "varlik", "yeni nokta", "kumul. nokta", "kumul. dakika");
let secili = [], oncekiN = 0;
for (const [ad, dakika, , uygun] of YONTEM) {
  secili = [...secili, ad];
  const k = kesfet(secili), uygunSay = V.filter((a) => uygun(VARLIK[a])).length;
  yaz(A, ad, dakika, uygunSay, k.bulunan.size - oncekiN, `${k.bulunan.size}/${NOKTA.length}`, k.dk);
  oncekiN = k.bulunan.size;
}

console.log("\n2. nokta turu ve onu bulabilen yontem sayisi");
const B = [-24, 8, 9, -40];
yaz(B, "tur", "nokta", "yontem", "   bulunamayan nokta / neden");
const tum = kesfet(TUM).bulunan;
for (const tur of TURLER) {
  const dizin = NOKTA.map((n, i) => [n, i]).filter(([n]) => n[1] === tur);
  const eksik = dizin.filter(([, i]) => !tum.has(i));
  yaz(B, tur, dizin.length, YONTEM.filter((y) => y[2].includes(tur)).length,
    eksik.length ? `   ${eksik.length}: ${eksik.map(([n]) => n[0]).join(", ")}` : "   -");
}

const KAPSAM = ["toplayici-03", "toplayici-07", "toplayici-11",
  "dogrulayici-01", "dogrulayici-02", "faturalama-01"];
const DUZEN = {
  "ucuz kesif": [[TUM[0], TUM[2]], []],
  "bellek disinda": [TUM.slice(0, 4), []],
  "tam kesif": [TUM, []],
  "tam kesif + kapsam kurma": [TUM, KAPSAM],
  "ucuz kesif + kapsam kurma": [[TUM[0], TUM[2]], KAPSAM],
  "tum varligi yeniden kurma": [TUM, V],
};

console.log(`\n3. alti temizleme duzeni (${GUN} gunluk yeniden bulasma taramasi)`);
const C = [-27, 9, 8, 11, 10, 10, 8, 14, 7];
yaz(C, "duzen", "bulunan", "temiz", "kacirilan", "kesif dk", "temiz dk", "kurma", "ilk bulasma",
  "olay");
const R = {};
for (const [ad, [s, k]] of Object.entries(DUZEN)) {
  const r = R[ad] = olc(s, k);
  yaz(C, ad, `${r.bulunan}/${NOKTA.length}`, r.temiz, r.kacirilan.length, r.kesifDk, r.temizDk,
    r.kurulan, r.ilk ? `${r.ilk}. gun` : "-", r.olay);
}

console.log("\n4. tam kesiften sonra kacirilan nokta");
for (const i of R["tam kesif"].kacirilan)
  yaz([-4, -16, -24, -18], "", NOKTA[i][0], NOKTA[i][1],
    `gunluk olasilik ${NOKTA[i][2].toFixed(2)}`);

console.log("\n5. kacirilan nokta basina dusen bedel");
const D = [-27, 11, 12, 21, 16];
yaz(D, "duzen", "toplam dk", "kacirilan", "dk/kapatilan nokta", "olay/kacirilan");
const taban = R["ucuz kesif"];
for (const [ad, r] of Object.entries(R)) {
  const kapali = r.temiz - taban.temiz, dk = r.kesifDk + r.temizDk - taban.kesifDk - taban.temizDk;
  yaz(D, ad, r.kesifDk + r.temizDk, r.kacirilan.length, kapali > 0 ? (dk / kapali).toFixed(0) : "-",
    r.kacirilan.length ? (r.olay / r.kacirilan.length).toFixed(1) : "-");
}

const ms = Number(process.hrtime.bigint() - t0) / 1e6;   // ham olcum basilmaz, bant denetlenir
console.log(`\nalti duzen ve ${GUN} gunluk tarama 500 ms bandinda: ${ms < 500 ? "evet" : "hayir"}`);
```

```
9 etkilenen varlikta 22 tutunma noktasi, 7 tur; 5 kesif yontemi; tohum 20260214

1. kesif yontemi eklendikce bulunan nokta (kumulatif)
yontem                           dk/varlik  varlik  yeni nokta   kumul. nokta   kumul. dakika
taban cizgisi karsilastirma             22       8           8           8/22             176
surec olusturma kaydi taramasi          14       4           1           9/22             232
kimlik deposu denetimi                   9       9           4          13/22             313
ag akis verisi izleme                   11       9           2          15/22             412
bellek incelemesi                       47       2           2          17/22             506

2. nokta turu ve onu bulabilen yontem sayisi
tur                        nokta   yontem   bulunamayan nokta / neden            
servis tanimi                  4        2   -                                    
zamanlanmis gorev              3        2   -                                    
yapilandirma kancasi           4        1   3: toplayici-03, dogrulayici-02, uc-01
oturum betigi                  3        1   1: uc-01                             
bellekte kalan kosum           2        2   1: toplayici-11                      
kimlik kalemi                  4        1   -                                    
disa acilan baglanti           2        1   -                                    

3. alti temizleme duzeni (60 gunluk yeniden bulasma taramasi)
duzen                        bulunan   temiz  kacirilan  kesif dk  temiz dk   kurma   ilk bulasma   olay
ucuz kesif                     12/22      12         10       257        96       0        3. gun     19
bellek disinda                 15/22      15          7       412       120       0        5. gun     11
tam kesif                      17/22      17          5       506       136       0        5. gun      8
tam kesif + kapsam kurma       17/22      20          2       506       610       6        5. gun      4
ucuz kesif + kapsam kurma      12/22      17          5       257       586       6        5. gun      9
tum varligi yeniden kurma      17/22      22          0       506       855       9             -      0

4. tam kesiften sonra kacirilan nokta
    toplayici-03    yapilandirma kancasi    gunluk olasilik 0.04
    toplayici-11    bellekte kalan kosum    gunluk olasilik 0.02
    dogrulayici-02  yapilandirma kancasi    gunluk olasilik 0.04
    uc-01           oturum betigi           gunluk olasilik 0.03
    uc-01           yapilandirma kancasi    gunluk olasilik 0.04

5. kacirilan nokta basina dusen bedel
duzen                        toplam dk   kacirilan   dk/kapatilan nokta  olay/kacirilan
ucuz kesif                         353          10                    -             1.9
bellek disinda                     532           7                   60             1.6
tam kesif                          642           5                   58             1.6
tam kesif + kapsam kurma          1116           2                   95             2.0
ucuz kesif + kapsam kurma          843           5                   98             1.8
tum varligi yeniden kurma         1361           0                  101               -

alti duzen ve 60 gunluk tarama 500 ms bandinda: evet
```
Sayılar **ölçüm** sınıfındadır; girdileri yukarıdaki varsayımlardır.

#### Yöntem Eklendikçe Bulunan Nokta

Birinci tablo keşfi kümülatif olarak sayar. Taban çizgisi karşılaştırma sekiz varlıkta uygulanır,
176 dakika sürer ve tek başına 22 noktanın **sekizini** bulur. Süreç oluşturma kaydı taraması
yalnız dört varlıkta uygulanabilir — beş varlık süreç kaydı iletmez — ve 56 dakika karşılığında
**bir** yeni nokta getirir; bulduklarının geri kalanını taban çizgisi zaten bulmuştur. Kimlik deposu
denetimi dokuz varlıkta 81 dakikayla dört yeni nokta, ağ akış verisi izleme 99 dakikayla iki yeni
nokta ekler.

Son satır en pahalısıdır. Bellek incelemesi varlık başına 47 dakika sürer ve yalnız **iki** varlıkta
uygulanabilir: sınırlamada ağdan alınan yedi varlıkta bellek içeriği kaybolmuştur. 94 dakika
karşılığında iki yeni nokta getirir ve toplam 17'ye çıkarır. Beş nokta hiçbir yöntemle bulunamaz.

#### Bulunamayan Beş Nokta

İkinci tablo kaybı türe indirir. Dört yapılandırma kancasının **üçü** bulunamaz, çünkü bu türü
yalnız bellek incelemesi bulur ve o yöntem `toplayici-03`, `dogrulayici-02` ve `uc-01` varlıklarında
uygulanamaz. `toplayici-11`'deki bellekte kalan koşum aynı nedenle kaybolur. `uc-01`'deki oturum
betiği başka bir nedenle kaçar: o varlığın taban çizgisi yoktur ve bu türü yalnız taban çizgisi
karşılaştırma bulur.

Dördüncü tablo bu beş noktayı adıyla yazar. Aralarındaki ortak nokta bir keşif eksikliği değil,
**bir sınırlama kararının yan etkisidir**. Önceki derste kısa vadeli sınırlama varlıkları ağdan
aldı ve erişimi 393. dakikada durdurdu; aynı karar, bellek incelemesini yedi varlıkta imkânsız
kıldı. Erken sınırlamanın üçüncü bir bedeli buradadır ve önceki dersin tablolarında görünmez.

#### Altı Düzen ve Yeniden Bulaşma

Üçüncü tablo temizleme düzenlerini karşılaştırır. Ucuz keşif — taban çizgisi ve kimlik denetimi —
257 dakikada 12 nokta bulur, 10'unu kaçırır ve 60 günde **19 yeniden bulaşma** üretir; ilki üçüncü
gündedir. Tam keşif 506 dakikada 17 nokta bulur, beşini kaçırır ve sekiz olay üretir; ilki beşinci
gündedir.

Kaçırılan noktayı kapatmanın tek yolu, o noktanın bulunmasını beklemek değil, varlığı yeniden
kurmaktır. Tam keşife altı kapsam varlığının yeniden kurulması eklendiğinde temiz nokta 17'den
**20**'ye çıkar — kurulan varlıklardaki bulunmamış noktalar da kalkar — kaçırılan ikiye iner ve
olay dörde düşer. Dokuz varlığın hepsini yeniden kurmak kaçırılanı sıfıra indirir ve 60 günde hiç
yeniden bulaşma olmaz.

Beşinci tablo bunun dakikasını verir. Ucuz keşif toplam 353, tam keşif 642, tam keşif artı kapsam
kurma 1.116, hepsini yeniden kurma 1.361 dakikadır. Ucuz keşife göre kapatılan nokta başına maliyet
tam keşifte 58, kapsam kurmada 95, tam yeniden kurmada 101 dakikadır. Dikkat çeken satır **ucuz
keşif artı kapsam kurma**dır: 843 dakikada 17 nokta temizler, yani tam keşifle aynı sayıyı 201
dakika daha pahalıya alır ve beş nokta yine açık kalır. Yeniden kurma keşfin yerini tutmaz — yalnız
kurulan varlıkta tutar.

#### Özet

- Dokuz etkilenen varlıkta 22 tutunma noktası vardır; beş keşif yöntemi 506 dakikada 17'sini bulur,
  beşi hiçbir yöntemle bulunamaz.
- Yöntemlerin marjinal katkısı eşit değildir: taban çizgisi karşılaştırma 176 dakikada sekiz nokta,
  süreç kaydı taraması 56 dakikada bir nokta, bellek incelemesi 94 dakikada iki nokta getirir.
- Dört yapılandırma kancasının üçü ve bir bellekte kalan koşum, bellek incelemesi yedi varlıkta
  uygulanamadığı için kaçar; bu varlıklar sınırlamada ağdan alınmıştır.
- Kaçırılan beş nokta 60 günde sekiz yeniden bulaşma üretir ve ilki beşinci gündedir; on nokta
  kaçırıldığında olay 19'a çıkar ve ilki üçüncü güne iner.
- Kaçırılanı sıfıra indirmenin tek yolu varlığı yeniden kurmaktır: dokuz varlık 1.361 dakika
  tutar, kapatılan nokta başına 101 dakika.

#### Sonraki Adım

Noktalar temizlendi ve kaçırılan sayısı yazıldı. Bundan sonrası hizmetin geri getirilmesidir ve
orada yeni bir soru çıkar: yeniden kurulan varlık hangi noktaya geri dönecek. Yedeklerin bir bölümü
ilk tutunma anından sonra alınmıştır ve o yedeklerde noktalar durur. Sonraki ders kurtarmayı yeniden
bulaşma riski ekseninde ölçer: hangi yedeğe dönmek temiz, temiz yedeğe dönmek kaç kalemi kaybettirir,
kaç kalem elle yeniden kurulur ve denetimli geri getirmenin kaç aşaması yeniden bulaşmayı hangi
aşamada yakalar.

### Kurtarma

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/kurtarma

Kurtarmanın yeniden bulaşma riski ekseninde ölçülmesi: yedi geri dönüş noktasının üçünün temiz olması ve en yenisinin dokuz buçuk gün geride kalması, temiz yedeğe dönüşün 94.715 kalem veri ve 44 elle kalem tutması, sıfırdan kurmanın aynı temizliği 2.493 kalem kayıpla 190 dakika fazlasına vermesi, kirli yedeğe dönüşün temizlemeyi baştan koşturup toplam süreyi 1.347 dakikaya çıkarması ve dört aşamalı denetimli geri getirmenin üretime geçen nokta beklentisini 5,00'ten 0,10'a indirmesi.

Önceki ders 22 tutunma noktasından beşinin hiçbir keşif yöntemiyle bulunamadığını saydı ve
kaçırılanı sıfıra indirmenin tek yolunun varlığı yeniden kurmak olduğunu gösterdi. Yeniden kurulan
varlık boş dönmez; bir yedekten ya da bir imajdan doldurulur. Bu ders o seçimi ölçer.

Kurtarmanın ölçüsü hizmetin ne kadar sürede açıldığı değildir. Ölçülen şey **yeniden bulaşma
riskidir**: hangi geri dönüş noktası ilk tutunmadan önce alınmıştır, temiz olana dönmek kaç kalemi
kaybettirir, kaç kalem elle yeniden kurulur ve hizmet üretime dönerken kaç aşamada gözlenir. Yedek
türleri, zincir yapısı ve depolama hesabı Bilgi Teknolojileri ve Sistem Temelleri kursunda ölçüldü;
burada yedek yalnız bir **zaman noktası** olarak ele alınır.

#### Geri Dönüş Noktaları

**OM27:** İlk tutunma dokuz gün öncedir; bir geri dönüş noktası ancak o andan önce alınmışsa
temizdir. **OM28:** Yirmi iki tutunma noktasının her birinin kurulduğu gün bir veridir; bir yedek,
alındığı anda kurulmuş olan bütün noktaları içerir. **OM29:** Günlük işlem hacmi 9.970 kalemdir —
8.400 sayaç okuması, 1.250 fatura kalemi, 320 iş emri; kayıp kalem geri dönülen günden bugüne kadarki
hacimdir. **OM30:** Yedeğin dışında kalan yapılandırma elle yeniden kurulur: taban altı kalem, geri
dönülen gün başına dört kalem. **OM31:** Kirli bir yedeğe dönüldüğünde temizleme baştan koşar —
önceki dersin tam keşif düzeni, 642 dakika — ve beş nokta yine kaçırılır. **OM32:** Denetimli geri
getirme dört aşamadır; her aşamanın bir gözlem penceresi ve yeniden etkinleşen bir noktayı yakalama
olasılığı vardır. **OM33:** Sıfırdan kurmada sistem imajı temizdir ve veri en yeni yedekten alınır;
dokuz varlığı imajdan kurmak 430 dakika ve 34 elle kalem tutar.

```js
// kurtarma/model.mjs — denetimli geri getirme modeli: gercek bir yedek ya da sistem yok.
// Geri donus noktalari, tutunma noktasi kurulus gunleri ve asamalar veri yapisidir.

export const ILK_TUTUNMA = 9;                  // ilk tutunma kac gun once gerceklesti
export const NOKTA_SAY = 22, KACIRILAN = 5;    // onceki dersten: toplam ve kacirilan nokta
// tutunma noktasinin kuruldugu gun (kac gun once) — 22 nokta (veri)
export const KURULUS = [9, 9, 9, 8, 8, 7, 7, 6, 6, 6, 5, 5, 4, 4, 4, 3, 3, 2, 2, 1, 1, 1];

// gunluk islem hacmi: hizmet -> kalem (veri)
export const HACIM = { "sayac okumasi": 8400, "fatura kalemi": 1250, "is emri": 320 };
export const GUNLUK = Object.values(HACIM).reduce((s, v) => s + v, 0);

// geri donus noktasi: kac gun once alindi, geri getirme dakikasi
export const NOKTALAR = [[21, 260], [14, 245], [9.5, 240], [7, 215], [3, 190], [1, 175],
  [0.25, 165]];
// elle yeniden kurulacak kalem: yedek disinda kalan yapilandirma, gun basina (veri)
export const ELLE_GUNLUK = 4, ELLE_TABAN = 6;

export const kirliNokta = (gunOnce) =>
  KURULUS.filter((k) => k >= gunOnce).length;    // o an zaten kurulmus noktalar yedektedir
export const kayip = (gunOnce) => Math.round(gunOnce * GUNLUK);
export const elle = (gunOnce) => ELLE_TABAN + Math.round(gunOnce * ELLE_GUNLUK);

// denetimli geri getirme asamasi: ad, gozlem dakikasi, yeniden etkinlesen noktayi yakalama
export const ASAMA = [["yalitilmis agda acma", 120, 0.55],
  ["denetimli sinirli trafik", 180, 0.70], ["kismi trafik", 240, 0.85],
  ["tam trafik", 0, 0]];

export function asamali(sayi) {                  // ilk `sayi` asama uygulanir
  const kume = ASAMA.slice(0, sayi);
  const kacan = kume.reduce((p, [, , y]) => p * (1 - y), 1);
  return { dk: kume.reduce((s, [, d]) => s + d, 0), yakalama: 1 - kacan, kacan };
}

// kurtarma duzeni: ad, geri donus noktasi (gun once) ya da null (sifirdan kurma),
// sifirdan kurmada veri en yeni yedekten alinir ve sistem imaji temizdir
export const DUZEN = [
  ["en yeni yedege donus", 0.25, false], ["1 gun oncesine donus", 1, false],
  ["3 gun oncesine donus", 3, false], ["temiz yedege donus", 9.5, false],
  ["sifirdan kurma + veri", 0.25, true],
];
export const SIFIRDAN_DK = 430, SIFIRDAN_ELLE = 34;   // dokuz varligi imajdan kurma
// kirli yedege donuldugunde temizleme bastan kosar (onceki dersin tam kesif duzeni)
export const TEMIZLEME_DK = 642;

export function olc([ad, gun, sifirdan], asamaSay) {
  const yedekNokta = sifirdan ? 0 : kirliNokta(gun);
  const kalan = yedekNokta > 0 ? KACIRILAN : 0;   // temizleme tekrar kossa da kacirilan kalir
  const a = asamali(asamaSay);
  const geri = NOKTALAR.find(([g]) => g === gun)[1];
  return { ad, gun, yedekNokta, kalan, kayip: sifirdan ? kayip(0.25) : kayip(gun),
    elle: sifirdan ? SIFIRDAN_ELLE : elle(gun),
    dk: (sifirdan ? SIFIRDAN_DK : geri) + (yedekNokta ? TEMIZLEME_DK : 0) + a.dk,
    yakalanan: +(kalan * a.yakalama).toFixed(1), gecen: +(kalan * a.kacan).toFixed(2),
    asama: asamaSay, gozlem: a.dk, oran: a.yakalama };
}
```

Ölçüm dosyası önce yedi geri dönüş noktasını sıralar, sonra beş kurtarma düzenini aynı olayda
koşturur ve aşama sayısını tarar.

```js
// kurtarma/olc.mjs — hangi yedege donmek temiz, kac kalem kaybediliyor, kac kalem elle
// yeniden kuruluyor ve denetimli geri getirmenin asamalari yeniden bulasmayi nerede yakaliyor.
import { ILK_TUTUNMA, KURULUS, HACIM, GUNLUK, NOKTALAR, ASAMA, DUZEN, TEMIZLEME_DK,
  KACIRILAN, kirliNokta, kayip, elle, asamali, olc } from "./model.mjs";

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));
const t0 = process.hrtime.bigint();
const TEMIZ_GUN = NOKTALAR.find(([g]) => kirliNokta(g) === 0 && g < ILK_TUTUNMA + 1)[0];

console.log(`ilk tutunma ${ILK_TUTUNMA} gun once; ${KURULUS.length} tutunma noktasi, ` +
  `gunluk islem hacmi ${GUNLUK} kalem (` +
  Object.entries(HACIM).map(([a, v]) => `${a} ${v}`).join(", ") + ")");

console.log("\n1. geri donus noktalari");
const A = [-10, 8, 17, 14, 8, 15];
yaz(A, "gun once", "temiz", "yedekteki nokta", "kayip kalem", "elle", "geri getirme");
for (const [g, dk] of NOKTALAR)
  yaz(A, g, kirliNokta(g) === 0 ? "evet" : "hayir", kirliNokta(g), kayip(g), elle(g), dk + " dk");

console.log(`\n2. bes kurtarma duzeni (kirli yedekte temizleme ${TEMIZLEME_DK} dk bastan kosar, ` +
  `${KACIRILAN} nokta yine kacirilir)`);
const B = [-24, 10, 8, 14, 8, 12, 14];
yaz(B, "duzen", "yedekte", "kalan", "kayip kalem", "elle", "toplam dk", "gecen nokta");
const R = DUZEN.map((d) => olc(d, ASAMA.length));
for (const r of R)
  yaz(B, r.ad, r.yedekNokta, r.kalan, r.kayip, r.elle, r.dk, r.gecen.toFixed(2));

console.log("\n3. denetimli geri getirme asamalari");
const C = [-26, 10, 12, 18, 16];
yaz(C, "asama", "gozlem dk", "yakalama", "kumul. yakalama", "kumul. dakika");
for (const [i, [ad, dk, y]] of ASAMA.entries()) {
  const a = asamali(i + 1);
  yaz(C, ad, dk, y.toFixed(2), a.yakalama.toFixed(4), a.dk);
}

console.log("\n4. asama sayisi ile uretime gecen nokta beklentisi");
const D = [-8, 12, 18, 16, 14, 14];
yaz(D, "asama", "gozlem dk", "kumul. yakalama", "en yeni yedek", "temiz yedek", "sifirdan");
for (let n = 0; n <= ASAMA.length; n++) {
  const a = asamali(n);
  yaz(D, n, a.dk, a.yakalama.toFixed(4), olc(DUZEN[0], n).gecen.toFixed(2),
    olc(DUZEN[3], n).gecen.toFixed(2), olc(DUZEN[4], n).gecen.toFixed(2));
}

console.log("\n5. iki temiz secenek arasindaki fark");
const t = olc(DUZEN[3], ASAMA.length), s = olc(DUZEN[4], ASAMA.length);
const E = [-22, 14, 12, 12];
yaz(E, "olcu", "temiz yedek", "sifirdan", "fark");
yaz(E, "kayip kalem", t.kayip, s.kayip, t.kayip - s.kayip);
yaz(E, "elle kalem", t.elle, s.elle, t.elle - s.elle);
yaz(E, "toplam dakika", t.dk, s.dk, t.dk - s.dk);
yaz(E, "uretime gecen nokta", t.gecen.toFixed(2), s.gecen.toFixed(2),
  (t.gecen - s.gecen).toFixed(2));

console.log("\n6. temiz yedege donusun hizmet basina kaybi");
const F = [-18, 12, 14, 10];
yaz(F, "hizmet", "gunluk", `${TEMIZ_GUN} gunluk`, "pay");
for (const [ad, v] of Object.entries(HACIM))
  yaz(F, ad, v, Math.round(v * TEMIZ_GUN), (100 * v / GUNLUK).toFixed(1) + "%");

const ms = Number(process.hrtime.bigint() - t0) / 1e6;   // ham olcum basilmaz, bant denetlenir
console.log(`\nbes duzen ve bes asama sayisi 500 ms bandinda: ${ms < 500 ? "evet" : "hayir"}`);
```

```
ilk tutunma 9 gun once; 22 tutunma noktasi, gunluk islem hacmi 9970 kalem (sayac okumasi 8400, fatura kalemi 1250, is emri 320)

1. geri donus noktalari
gun once     temiz  yedekteki nokta   kayip kalem    elle   geri getirme
21            evet                0        209370      90         260 dk
14            evet                0        139580      62         245 dk
9.5           evet                0         94715      44         240 dk
7            hayir                7         69790      34         215 dk
3            hayir               17         29910      18         190 dk
1            hayir               22          9970      10         175 dk
0.25         hayir               22          2493       7         165 dk

2. bes kurtarma duzeni (kirli yedekte temizleme 642 dk bastan kosar, 5 nokta yine kacirilir)
duzen                      yedekte   kalan   kayip kalem    elle   toplam dk   gecen nokta
en yeni yedege donus            22       5          2493       7        1347          0.10
1 gun oncesine donus            22       5          9970      10        1357          0.10
3 gun oncesine donus            17       5         29910      18        1372          0.10
temiz yedege donus               0       0         94715      44         780          0.00
sifirdan kurma + veri            0       0          2493      34         970          0.00

3. denetimli geri getirme asamalari
asama                      gozlem dk    yakalama   kumul. yakalama   kumul. dakika
yalitilmis agda acma             120        0.55            0.5500             120
denetimli sinirli trafik         180        0.70            0.8650             300
kismi trafik                     240        0.85            0.9798             540
tam trafik                         0        0.00            0.9798             540

4. asama sayisi ile uretime gecen nokta beklentisi
asama      gozlem dk   kumul. yakalama   en yeni yedek   temiz yedek      sifirdan
0                  0            0.0000            5.00          0.00          0.00
1                120            0.5500            2.25          0.00          0.00
2                300            0.8650            0.68          0.00          0.00
3                540            0.9798            0.10          0.00          0.00
4                540            0.9798            0.10          0.00          0.00

5. iki temiz secenek arasindaki fark
olcu                     temiz yedek    sifirdan        fark
kayip kalem                    94715        2493       92222
elle kalem                        44          34          10
toplam dakika                    780         970        -190
uretime gecen nokta             0.00        0.00        0.00

6. temiz yedege donusun hizmet basina kaybi
hizmet                  gunluk    9.5 gunluk       pay
sayac okumasi             8400         79800     84.3%
fatura kalemi             1250         11875     12.5%
is emri                    320          3040      3.2%

bes duzen ve bes asama sayisi 500 ms bandinda: evet
```
Sayılar **ölçüm** sınıfındadır; girdileri yukarıdaki varsayımlardır.

#### Hangi Yedek Temiz

Birinci tablo yedi geri dönüş noktasını temizlik ekseninde ayırır. Üçü temizdir: 21, 14 ve 9,5 gün
öncesi. En yeni temiz nokta **9,5 gün geridedir** ve ona dönmek 94.715 kalem veri ile 44 elle
kalem tutar. Dört nokta kirlidir ve içerdikleri tutunma noktası sayısı yeniye doğru artar: yedi gün
öncesinde 7, üç gün öncesinde 17, bir gün öncesinde 22. Kayıp kalem ile yedekteki nokta sayısı ters
yönde hareket eder — bu tablonun tek satırında iyi bir seçenek yoktur.

Geri getirme dakikası bu ayrımı hiç yansıtmaz: en eski nokta 260, en yeni nokta 165 dakikadır.
Kurtarma süresi tek başına ölçüldüğünde en yeni yedek en iyi seçenek görünür. Karar, geri getirme
dakikasına değil yedeğin içeriğine bağlıdır.

#### Beş Düzen

İkinci tablo beş düzeni birlikte koşturur. Kirli yedeğe dönen üç düzende temizleme baştan koşar ve
642 dakika ekler; toplam süre 1.347 ile 1.372 dakika arasındadır ve üçünde de beş nokta kaçırılmış
olarak kalır. En yeni yedeğe dönmek yalnız 2.493 kalem veri kaybettirir, ama 1.347 dakika sürer ve
temizlemenin bütün işini yeniden yaptırır. **Kurtarma, temizlemenin yaptığı işi geri alabilir.**

İki düzen temizdir. Temiz yedeğe dönmek 780 dakikayla en hızlısıdır ve hiç nokta getirmez, ama
94.715 kalem veri ile 44 elle kalem bedeli vardır. Sıfırdan kurma aynı temizliği 970 dakikada verir;
kayıp kalem 2.493'e, elle kalem 34'e iner. Beşinci tablo farkı tek tek yazar: 190 dakika fazlasına
92.222 kalem veri ve 10 elle kalem kazanılır. **Kurtarmada ödenen 190 dakika, dokuz buçuk günlük
işlem verisinden ucuzdur.**

#### Aşamalı Geri Getirme

Üçüncü tablo denetimli geri getirmeyi aşamalara böler. Yalıtılmış ağda açma 120 dakika gözlem ile
0,55, denetimli sınırlı trafik 180 dakikayla 0,70, kısmi trafik 240 dakikayla 0,85 yakalar; kümülatif
yakalama sırasıyla 0,5500, 0,8650 ve 0,9798'dir. Dördüncü aşama tam trafiktir, gözlem penceresi
sıfırdır ve **hiçbir şey eklemez** — üretimin kendisi bir gözlem aşaması değildir.

Dördüncü tablo aşama sayısını üretime geçen nokta beklentisine çevirir. En yeni yedeğe dönen düzende
beş nokta kalır; hiç aşama uygulanmazsa beşi de üretime geçer, bir aşamayla 2,25'e, ikiyle 0,68'e,
üçle **0,10**'a iner. Bedeli 540 dakika gözlemdir. Temiz düzenlerde kalan nokta sıfırdır ve aşama
sayısı hiçbir şeyi değiştirmez.

Buradan iki ayrı karar çıkar. Kirli bir yedeğe dönüldüyse aşamalı geri getirme zorunludur ve 540
dakika gözlem, üretime geçen nokta beklentisini beşten 0,10'a — ellide birine — indirir. Temiz bir
kaynaktan gelindiyse aşamalar bu ölçüde hiçbir şey kazandırmaz — kazandırdıkları başka bir eksende,
temizliğin gerçekten sağlandığının doğrulanmasındadır ve bu model onu ölçmez.

Aşamaların dakikası kurtarmanın kendisiyle karşılaştırıldığında büyüktür. Sıfırdan kurmanın 970
dakikasının 540'ı gözlemdir; geri getirmenin kendisi 430 dakika tutar. Gözlem penceresi kısaltılırsa
hizmet daha erken açılır ama yakalama oranı düşer: iki aşamada 300 dakika ile 0,8650, üç aşamada
540 dakika ile 0,9798. Son aşamanın 240 dakikası, kümülatif yakalamayı 0,8650'den 0,9798'e taşır —
kirli bir düzende bu, üretime geçen nokta beklentisini 0,68'den 0,10'a indirmek demektir.

#### Kaybın Nereye Düştüğü

Altıncı tablo temiz yedeğe dönüşün 94.715 kalemlik kaybını hizmete böler. Sayaç okuması günlük
8.400 kalemle payın yüzde 84,3'ünü tutar ve 9,5 günde 79.800 kalem eder; fatura kalemi 11.875, iş
emri 3.040 kalemdir. Üç hizmetin kaybı aynı ağırlıkta değildir ve bu model onları eşit sayar. Sayaç
okuması sonradan yeniden okunabilir bir ölçümdür; fatura kalemi ve iş emri ise dışarıya verilmiş bir
sözün kaydıdır. Kayıp kalem sayısı bu ayrımı taşımaz — kararı veren, sayının hangi hizmetten
geldiğini de görmek zorundadır.

#### Özet

- Yedi geri dönüş noktasının üçü temizdir; en yeni temiz nokta 9,5 gün geridedir ve 94.715 kalem
  veri ile 44 elle kalem tutar.
- Kirli yedeğe dönen üç düzende temizleme 642 dakika ile baştan koşar, toplam süre 1.347–1.372
  dakikaya çıkar ve beş nokta yine kaçırılır.
- Sıfırdan kurma temiz yedeğe göre 190 dakika fazlaya 92.222 kalem veri ve 10 elle kalem kazandırır.
- Denetimli geri getirmenin üç gözlem aşaması 540 dakikada kümülatif 0,9798 yakalar; dördüncü aşama
  tam trafiktir ve hiçbir şey eklemez.
- Üretime geçen nokta beklentisi kirli düzende aşamasız 5,00, bir aşamayla 2,25, üç aşamayla 0,10'dur;
  temiz düzenlerde aşama sayısından bağımsız olarak sıfırdır.

#### Sonraki Adım

Hizmet döndü ve yeniden bulaşma beklentisi 0,10'a indi. Geriye olayın kendisi kaldı: ne oldu, ne
zaman başladı, hangi karar hangi dakikada verildi ve bir dahakine hangi kalem farklı olsaydı süre
kısalırdı. Sonraki ders çıkarılan dersleri kanıt ve kapsam ekseninde ele alır: hangi soru
yanıtlanabiliyor, hangisi kayıt olmadığı için yanıtsız kalıyor ve açılan iyileştirme kalemlerinin
kaçı doğrudan bir eksik kayda dayanıyor.

### Çıkarılan Dersler

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/cikarilan-dersler

İncelemenin kanıt ve kapsam ekseninde ölçülmesi: on altı sorudan on birinin dokuz kayıt kaynağıyla yanıtlanması, beş sorunun üç ayrı nedenle yanıtsız kalması, on iki iyileştirme kaleminin beşinin doğrudan bir eksik kayda dayanması, yalnız kayıt iyileştirmelerinin 136 kişi-saatle yanıtlı soruyu 16'ya çıkarıp zincirden 22 dakika düşürmesi, hazırlık ve süreç iyileştirmelerinin 103 kişi-saatle 55 dakika kazandırıp hiçbir soru açmaması.

Önceki ders hizmeti geri getirdi ve üretime geçen tutunma noktası beklentisini 0,10'a indirdi. Olay
kapandı. Geriye olayın kendisinin yeniden kurulması kaldı: ne oldu, ne zaman başladı, hangi karar
hangi dakikada verildi ve hangi kalem farklı olsaydı süre kısalırdı.

Bu dersin ölçüsü incelemenin çıktısı değil, incelemenin **kanıt tabanıdır**. Eylem maddesinin
açılması, kapanması ve izlenmesi DevOps ve Gözlemlenebilirlik kursunda ölçüldü; burada ondan önceki
adım sayılır. Bir soru kümesi kurulur, her sorunun yanıtlanması için gereken kayıt kaynakları
yazılır ve şu üç sayı çıkarılır: kaç soru yanıtlanıyor, kaç soru **kayıt olmadığı için** yanıtsız
kalıyor ve açılan iyileştirme kalemlerinin kaçı doğrudan bir eksik kayda dayanıyor.

#### Soru Kümesi ve Kayıt Kaynakları

**OM34:** İnceleme olaydan on iki gün sonra yapılır; ilk tutunma dokuz gün öncedir. **OM35:** On
altı soru vardır; her soru bir ya da iki kayıt kaynağı ister ve kaçıncı güne bakması gerektiği
bellidir. **OM36:** Dokuz kayıt kaynağının her birinin üç özelliği vardır — var mı, saklama süresi
kaç gün ve sınırlama ile kurtarmadan sonra duruyor mu. **OM37:** Bir soru, gerektirdiği kaynakların
hepsi kullanılabilir olduğunda yanıtlanır; kaynak yoksa, saklama süresi sorunun baktığı günü
kapsamıyorsa ya da kaynak sınırlamada silinmişse soru yanıtsız kalır. **OM38:** On iki iyileştirme
kalemi vardır; her biri ya doğrudan bir eksik kayda dayanır, ya bir hazırlık kalemini tazeler, ya da
bir süreç adımını bağlar. **OM39:** Her kalemin yıllık kişi-saat bedeli ve karar zincirinden
düşürdüğü dakika bir veridir; dakika değerleri zincirin yeniden koşturulmasından gelir. **OM40:**
Karar zincirinin başlangıç değeri birinci dersteki tam hazırlık değeridir: 182 dakika.

```js
// dersler/model.mjs — cikarilan dersler modeli: gercek bir olay kaydi ya da inceleme yok.
// Soru kumesi, kayit kaynaklari ve iyilestirme kalemleri veri yapisidir.

export const OLAY_YAS = 12, ILK_TUTUNMA = 9;   // inceleme gunu; ilk tutunma kac gun once

// kayit kaynagi: ad -> { var mi, saklama gunu, sinirlama ve kurtarmadan sonra duruyor mu }
export const KAYNAK = {
  surec: { ad: "surec olusturma kaydi", var: true, saklama: 14, kalici: true },
  kimlik: { ad: "kimlik dogrulama gunlugu", var: true, saklama: 90, kalici: true },
  ag: { ad: "ag akis verisi", var: true, saklama: 30, kalici: true },
  uygulama: { ad: "uygulama denetim kaydi", var: true, saklama: 7, kalici: true },
  tespit: { ad: "tespit hatti kaydi", var: true, saklama: 30, kalici: true },
  mudahale: { ad: "mudahale kutugu", var: true, saklama: 365, kalici: true },
  dosya: { ad: "dosya butunlugu izleme", var: false, saklama: 0, kalici: false },
  veri: { ad: "veri erisim kaydi", var: false, saklama: 0, kalici: false },
  bellek: { ad: "bellek dokumu", var: true, saklama: 365, kalici: false },
};

// soru: metin, gerekli kaynaklar, sorunun bakmasi gereken gun (kac gun once)
export const SORU = [
  ["ilk calistirma hangi varlikta ve ne zaman", ["surec"], 9],
  ["ilk erisim hangi kimlikle saglandi", ["kimlik"], 9],
  ["hizmet hesabi hangi varliklarda kullanildi", ["kimlik", "ag"], 9],
  ["toplayici-07 ve -11 gercekten etkilendi mi", ["surec"], 0],
  ["disari hangi hacimde veri aktarildi", ["ag"], 0],
  ["fatura arsivini hangi hesap okudu", ["uygulama"], 9],
  ["son gunun uygulama erisimleri neydi", ["uygulama"], 3],
  ["kalicilik noktalari ne zaman kuruldu", ["dosya"], 9],
  ["yapilandirma kancalari hangi anda eklendi", ["bellek", "dosya"], 9],
  ["uyari neden 186. dakikada dustu", ["tespit"], 0],
  ["daha erken dusebilecek bir kural var miydi", ["tespit", "surec"], 0],
  ["kapsam karari hangi veriye dayandi", ["mudahale"], 0],
  ["sinirlama hangi dakikada uygulandi", ["mudahale"], 0],
  ["kesilen mesru is ne kadar surdu", ["mudahale", "uygulama"], 0],
  ["kacirilan noktalar ne zaman kuruldu", ["bellek", "dosya"], 9],
  ["hangi abone kayitlari okundu", ["veri"], 9],
];

// bir kaynagin soruyu yanitlayamama nedeni
export function neden(k, gun) {
  const s = KAYNAK[k];
  if (!s.var) return "kaynak yok";
  if (!s.kalici) return "sinirlamada silindi";
  if (gun > s.saklama) return "saklama yetmedi";
  return null;
}
export function yanit(soru, eklenen = []) {
  const [, gerekli, gun] = soru;
  const eksik = gerekli.filter((k) => !eklenen.includes(k) && neden(k, gun));
  return { yanitli: eksik.length === 0,
    nedenler: eksik.map((k) => `${k}: ${neden(k, gun)}`) };
}
export const yanitli = (eklenen = []) => SORU.filter((s) => yanit(s, eklenen).yanitli).length;

// iyilestirme kalemi: ad, dayandigi eksik (kaynak anahtari ya da hazirlik kalemi),
// tur, yillik kisi-saat, karar zincirinden dusurdugu dakika
export const IYILESTIRME = [
  ["dosya butunlugu izlemeyi acma", "dosya", "kayit", 34, 0],
  ["veri erisim kaydini acma", "veri", "kayit", 46, 0],
  ["uygulama saklamasini 30 gune cikarma", "uygulama", "kayit", 12, 0],
  ["sinirlamadan once bellek alma", "bellek", "kayit", 18, 0],
  ["toplayici-07..12'ye surec kaydi", "surec", "kayit", 26, 22],
  ["varlik envanterini guncel tutma", "-", "hazirlik", 24, 10],
  ["iletisim agacini tazeleme", "-", "hazirlik", 6, 6],
  ["yetki matrisini tazeleme", "-", "hazirlik", 8, 8],
  ["kayit kaynagi haritasini cikarma", "-", "hazirlik", 12, 7],
  ["ceyrekte bir masa basi tatbikati", "-", "hazirlik", 30, 9],
  ["sinirlama eylemlerini yordama baglama", "-", "surec", 14, 8],
  ["kapsam olcutunu gostergeye cevirme", "-", "surec", 9, 7],
];
export const ZINCIR_TABAN = 182, UYARI = 186;  // birinci dersteki tam hazirlik zinciri
// erisim egrisi: [dakika, varlik] (onceki derslerle ayni veri)
export const ERISIM = [[0, "toplayici-03"], [26, "toplayici-03"], [58, "dogrulayici-01"],
  [95, "toplayici-07"], [134, "toplayici-11"], [171, "dogrulayici-02"], [214, "faturalama-01"],
  [263, "portal-01"], [318, "isemri-01"], [372, "uc-01"], [441, "depo-01"],
  [505, "faturalama-01"], [588, "toplayici-09"], [676, "konsol-01"], [762, "portal-02"],
  [845, "depo-01"], [951, "faturalama-02"], [1088, "konsol-01"]];
export const kalem = (dk) => ERISIM.filter(([t]) => t <= dk).length;

// secilen iyilestirme kumesi: yanitli soru, zincir dakikasi, sinirlama ani, erisilen kalem
export function uygula(secili) {
  const k = IYILESTIRME.filter(([ad]) => secili.includes(ad));
  const eklenen = k.filter((x) => x[2] === "kayit").map((x) => x[1]);
  const zincir = ZINCIR_TABAN - k.reduce((s, x) => s + x[4], 0);
  return { kalem: k.length, yanit: yanitli(eklenen), zincir, sinirlama: UYARI + zincir,
    erisilen: kalem(UYARI + zincir), saat: k.reduce((s, x) => s + x[3], 0) };
}
```

Ölçüm dosyası önce kaynakları ve soruları eşleştirir, sonra iyileştirme kümelerini uygulayıp
yanıtlı soru sayısıyla zincir dakikasını birlikte çıkarır.

```js
// dersler/olc.mjs — hangi soru kayit olmadigi icin yanitsiz kaliyor, yanitsizligin nedeni
// ne ve acilan iyilestirme kalemlerinin kaci dogrudan bir eksik kayda dayaniyor.
import { OLAY_YAS, KAYNAK, SORU, IYILESTIRME, ZINCIR_TABAN, neden, yanit, yanitli,
  uygula } from "./model.mjs";

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));
const t0 = process.hrtime.bigint();

console.log(`inceleme olaydan ${OLAY_YAS} gun sonra yapiliyor; ${SORU.length} soru, ` +
  `${Object.keys(KAYNAK).length} kayit kaynagi`);

console.log("\n1. kayit kaynaklari");
const A = [-26, 7, 10, 9, 10, 12];
yaz(A, "kaynak", "var", "saklama", "kalici", "gerekli", "engelledigi");
for (const [k, s] of Object.entries(KAYNAK)) {
  const gerekli = SORU.filter(([, g]) => g.includes(k));
  const engel = gerekli.filter(([, , gun]) => neden(k, gun));
  yaz(A, s.ad, s.var ? "evet" : "hayir", s.var ? s.saklama + " gun" : "-",
    s.kalici ? "evet" : "hayir", gerekli.length, engel.length);
}

console.log("\n2. yanitsiz sorular ve nedeni");
const B = [-4, -42, -34];
for (const s of SORU) {
  const y = yanit(s);
  if (!y.yanitli) yaz(B, "", s[0], y.nedenler.join("; "));
}
console.log(`  yanitli ${yanitli()}/${SORU.length}`);

console.log("\n3. iyilestirme kalemleri");
const C = [-38, 10, 17, 12, 11];
yaz(C, "kalem", "tur", "dayandigi eksik", "yil s-saat", "zincir dk");
for (const [ad, eksik, tur, saat, dk] of IYILESTIRME)
  yaz(C, ad, tur, eksik === "-" ? "-" : KAYNAK[eksik].ad.split(" ")[0], saat, dk || "-");
const kayitKalem = IYILESTIRME.filter((x) => x[2] === "kayit").length;
console.log(`  dogrudan bir eksik kayda dayanan kalem: ${kayitKalem}/${IYILESTIRME.length}`);

console.log("\n4. iyilestirme kumeleri uygulandiginda");
const D = [-24, 8, 10, 11, 12, 11, 12];
yaz(D, "kume", "kalem", "yanitli", "zincir dk", "sinirlama", "erisilen", "yil s-saat");
const ad = (t) => IYILESTIRME.filter((x) => t.includes(x[2])).map((x) => x[0]);
const KUME = { "hicbiri": [], "yalniz kayit": ad(["kayit"]),
  "hazirlik + surec": ad(["hazirlik", "surec"]), "hepsi": ad(["kayit", "hazirlik", "surec"]) };
for (const [k, secili] of Object.entries(KUME)) {
  const r = uygula(secili);
  yaz(D, k, r.kalem, `${r.yanit}/${SORU.length}`, r.zincir, r.sinirlama,
    `${r.erisilen}/18`, r.saat);
}

console.log("\n5. iki eksenin birbirine cevrilemedigi yer");
const kayitR = uygula(KUME["yalniz kayit"]), hazirR = uygula(KUME["hazirlik + surec"]);
const E = [-20, 12, 14, 15, -22];
yaz(E, "kume", "yil s-saat", "acilan soru", "kazanilan dk", "  birim basina s-saat");
yaz(E, "yalniz kayit", kayitR.saat, kayitR.yanit - yanitli(), ZINCIR_TABAN - kayitR.zincir,
  `  ${(kayitR.saat / (kayitR.yanit - yanitli())).toFixed(1)} / soru`);
yaz(E, "hazirlik + surec", hazirR.saat, hazirR.yanit - yanitli(), ZINCIR_TABAN - hazirR.zincir,
  `  ${(hazirR.saat / (ZINCIR_TABAN - hazirR.zincir)).toFixed(1)} / dakika`);

const ms = Number(process.hrtime.bigint() - t0) / 1e6;   // ham olcum basilmaz, bant denetlenir
console.log(`\ndort kume ve soru taramasi 500 ms bandinda: ${ms < 500 ? "evet" : "hayir"}`);
```

```
inceleme olaydan 12 gun sonra yapiliyor; 16 soru, 9 kayit kaynagi

1. kayit kaynaklari
kaynak                        var   saklama   kalici   gerekli engelledigi
surec olusturma kaydi        evet    14 gun     evet         3           0
kimlik dogrulama gunlugu     evet    90 gun     evet         2           0
ag akis verisi               evet    30 gun     evet         2           0
uygulama denetim kaydi       evet     7 gun     evet         3           1
tespit hatti kaydi           evet    30 gun     evet         2           0
mudahale kutugu              evet   365 gun     evet         3           0
dosya butunlugu izleme      hayir         -    hayir         3           3
veri erisim kaydi           hayir         -    hayir         1           1
bellek dokumu                evet   365 gun    hayir         2           2

2. yanitsiz sorular ve nedeni
    fatura arsivini hangi hesap okudu         uygulama: saklama yetmedi         
    kalicilik noktalari ne zaman kuruldu      dosya: kaynak yok                 
    yapilandirma kancalari hangi anda eklendi bellek: sinirlamada silindi; dosya: kaynak yok
    kacirilan noktalar ne zaman kuruldu       bellek: sinirlamada silindi; dosya: kaynak yok
    hangi abone kayitlari okundu              veri: kaynak yok                  
  yanitli 11/16

3. iyilestirme kalemleri
kalem                                        tur  dayandigi eksik  yil s-saat  zincir dk
dosya butunlugu izlemeyi acma              kayit            dosya          34          -
veri erisim kaydini acma                   kayit             veri          46          -
uygulama saklamasini 30 gune cikarma       kayit         uygulama          12          -
sinirlamadan once bellek alma              kayit           bellek          18          -
toplayici-07..12'ye surec kaydi            kayit            surec          26         22
varlik envanterini guncel tutma         hazirlik                -          24         10
iletisim agacini tazeleme               hazirlik                -           6          6
yetki matrisini tazeleme                hazirlik                -           8          8
kayit kaynagi haritasini cikarma        hazirlik                -          12          7
ceyrekte bir masa basi tatbikati        hazirlik                -          30          9
sinirlama eylemlerini yordama baglama      surec                -          14          8
kapsam olcutunu gostergeye cevirme         surec                -           9          7
  dogrudan bir eksik kayda dayanan kalem: 5/12

4. iyilestirme kumeleri uygulandiginda
kume                       kalem   yanitli  zincir dk   sinirlama   erisilen  yil s-saat
hicbiri                        0     11/16        182         368       9/18           0
yalniz kayit                   5     16/16        160         346       9/18         136
hazirlik + surec               7     11/16        127         313       8/18         103
hepsi                         12     16/16        105         291       8/18         239

5. iki eksenin birbirine cevrilemedigi yer
kume                  yil s-saat   acilan soru   kazanilan dk  birim basina s-saat 
yalniz kayit                 136             5             22  27.2 / soru         
hazirlik + surec             103             0             55  1.9 / dakika        

dort kume ve soru taramasi 500 ms bandinda: evet
```
Sayılar **ölçüm** sınıfındadır; girdileri yukarıdaki varsayımlardır.

#### On Birinin Yanıtı Var

Birinci tablo kaynakları sayar. Altı kaynak vardır ve kalıcıdır: süreç oluşturma kaydı, kimlik
doğrulama günlüğü, ağ akış verisi, uygulama denetim kaydı, tespit hattı kaydı ve müdahale kütüğü.
Son sütun her kaynağın kaç soruyu **engellediğini** verir. Dosya bütünlüğü izleme üç soruda gerekli
ve üçünü de engeller, çünkü hiç yoktur. Bellek dökümü iki soruda gerekli ve ikisini de engeller,
çünkü kalıcı değildir. Uygulama denetim kaydı üç soruda gerekli ve yalnız birini engeller — o soru
dokuz gün öncesine bakar, saklama ise yedi gündür.

İkinci tablo yanıtsız beş soruyu nedeniyle yazar ve neden üç ayrı türdedir. **Kaynak yok:**
kalıcılık noktalarının ne zaman kurulduğu ve hangi abone kayıtlarının okunduğu soruları, dosya
bütünlüğü izleme ile veri erişim kaydı hiç açılmadığı için yanıtsızdır. **Saklama yetmedi:** fatura
arşivini hangi hesabın okuduğu, uygulama kaydının yedi günlük penceresi dışında kaldığı için
yanıtsızdır — kaynak vardı, kayıt vardı, ama silinmişti. **Sınırlamada silindi:** yapılandırma
kancalarının ve kaçırılan noktaların ne zaman kurulduğu soruları, bellek dökümü alınmadan varlıklar
ağdan alındığı için yanıtsızdır.

Bu üçüncü neden bu konunun içinden çıkar. Üçüncü derste kısa vadeli sınırlama erişimi 393. dakikada
durdurdu ve beş kalem kazandırdı; dördüncü derste aynı karar bellek incelemesini yedi varlıkta
imkânsız kıldı ve üç yapılandırma kancasını kaçırttı. Burada aynı kararın üçüncü karşılığı görünür:
iki inceleme sorusu bir daha yanıtlanamaz. **Sınırlama kararının bedeli üç ayrı derste, üç ayrı
birimde ödenir.**

#### Beşi Kayda Dayanıyor

Üçüncü tablo on iki iyileştirme kalemini listeler. Beşi doğrudan bir eksik kayda dayanır: dosya
bütünlüğü izlemeyi açmak, veri erişim kaydını açmak, uygulama saklamasını otuz güne çıkarmak,
sınırlamadan önce bellek almak ve süreç kaydı iletmeyen altı toplayıcıya kayıt eklemek. Beşi
hazırlık kalemlerini tazeler, ikisi bir süreç adımını bağlar. **On iki kalemin beşi bir kayıt
eksikliğinin doğrudan sonucudur.**

Dördüncü tablo kümeleri uygular. Yalnız kayıt iyileştirmeleri beş kalem ve yılda 136 kişi-saat
tutar; yanıtlı soru 11'den **16'ya** çıkar ve zincir 182'den 160 dakikaya iner — tek dakika kazancı
süreç kaydı eklemekten gelir. Hazırlık ve süreç iyileştirmeleri yedi kalem ve 103 kişi-saat tutar;
zincir 127 dakikaya, sınırlama 313. dakikaya iner ve erişilen kalem dokuzdan sekize düşer, ama
yanıtlı soru sayısı **11'de kalır**. Hepsi birlikte 239 kişi-saat, 105 dakikalık zincir ve 16/16
yanıt verir.

#### İki Eksen

Beşinci tablo iki kümenin birbirine çevrilemediğini gösterir. Kayıt iyileştirmeleri soru başına
27,2 kişi-saat tutar ve zincirden yalnız 22 dakika düşürür. Hazırlık ve süreç iyileştirmeleri dakika
başına 1,9 kişi-saat tutar ve hiçbir soru açmaz. Aynı bütçe iki farklı şey satın alır: biri **bir
sonraki olayı daha hızlı durdurmayı**, öteki **bu olayı daha iyi anlatmayı**.

İkisi arasında bir sıra kurmak bu modelin işi değildir, ama bir gözlem yapılabilir. Kayıt
iyileştirmelerinden biri — sınırlamadan önce bellek alma — on sekiz kişi-saatle iki soruyu açar ve
zincire hiçbir dakika eklemez; buna karşılık sınırlamayı geciktirir ve o gecikmenin bedeli üçüncü
derste ölçüldü. Bir iyileştirme kalemi, açtığı sorunun ötesinde başka bir eksende bir bedel taşıyorsa,
o bedel de listeye yazılmadıkça kalem eksik ölçülmüştür.

#### Özet

- On altı inceleme sorusundan on biri dokuz kayıt kaynağıyla yanıtlanır; beşi yanıtsız kalır.
- Yanıtsızlığın üç nedeni ayrı ayrı sayılır: iki soruda kaynak hiç yoktur, bir soruda saklama
  süresi yetmemiştir, iki soruda kaynak sınırlamada silinmiştir.
- Sınırlama kararının bedeli üçüncü derste beş kalem, dördüncü derste üç kaçırılan tutunma noktası,
  burada iki yanıtsız sorudur.
- On iki iyileştirme kaleminin beşi doğrudan bir eksik kayda dayanır; beşi hazırlık kalemini
  tazeler, ikisi bir süreç adımını bağlar.
- Yalnız kayıt iyileştirmeleri 136 kişi-saatle yanıtlı soruyu 16/16'ya çıkarır ve zincirden 22
  dakika düşürür; hazırlık ve süreç iyileştirmeleri 103 kişi-saatle 55 dakika kazandırır ve hiçbir
  soru açmaz.

#### Sonraki Adım

İnceleme yanıtlarını çıkardı, iyileştirme kalemlerini yazdı ve bedellerini saydı. Bütün bunlar
kurumun içinde kaldı. Olayın dışarıya bakan bir yüzü daha vardır: kimin haberdar edilmesi gerektiği,
hangi eşikte, hangi sürede. Sonraki ders bunu süre ve paydaş sayısı olarak ölçer — kaç paydaş var,
hangi eşikte bildirim başlıyor, kapsam kesinleşmeden yapılan bildirim kaç düzeltme üretiyor ve
gecikmenin bedeli kaç saattir.

### İletişim ve Bildirim Yükümlülüğü

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/iletisim-ve-bildirim-yukumlulugu

Bildirimin süre ve paydaş sayısı olarak ölçülmesi: on iki paydaşın beşinin dış olması, belirli bir sürede bildirim isteyen yükümlülük türünün 4.320 dakikalık penceresi, kapsam tahmininin 48.000'den 6.200'e inip hiç kesinleşmemesi, erken bildirimin 14.800 aboneyi fazladan bildirip 46 düzeltme üretmesine karşılık 29.967 bilgisiz abone-saatte kalması ve geç bildirimin beş dış paydaşta pencereyi 64.540 dakika aşıp 1.793.247 abone-saat üretmesi.

Önceki ders on altı inceleme sorusundan beşinin yanıtsız kaldığını saydı; bunlardan biri "hangi
abone kayıtları okundu" sorusuydu ve veri erişim kaydı hiç açılmadığı için yanıtsızdı. O eksik bu
derste doğrudan bir karara dönüşür, çünkü bildirim tam olarak bu sayıyı ister: kaç aboneye ne
söylenecek.

Bildirimin ölçü birimi **süre ve paydaş sayısıdır**. Kaç paydaş var, her biri hangi eşikte
bilgilendiriliyor, bildirimi hazırlamak kaç dakika sürüyor ve gecikmenin bedeli ne. Dış paydaşların
bir bölümü belirli bir sürede bildirim isteyen bir yükümlülük türüne tabidir; bu yükümlülüğün
penceresi fark etme anından başlar ve sabittir. Ölçümün göstereceği şey şudur: pencere içinde kalmak
ile doğru sayıyı bildirmek aynı anda sağlanamaz.

#### Paydaşlar, Eşikler ve Pencere

**OM41:** On iki paydaş vardır; beşi dış, yedisi iç. Her paydaşın bir bildirim eşiği vardır ve eşik,
önceki derslerden gelen bir ana karşılık gelir: doğrulama 216, kapsam 370, sınırlama 393, kurtarma
1.363 ve inceleme 17.280. dakika. **OM42:** Her paydaş için bildirimin hazırlanması ve onaylanması
belirli bir dakika sürer; bildirim anı eşik ile hazırlığın toplamıdır. **OM43:** Dış paydaşların
tabi olduğu, belirli bir sürede bildirim isteyen yükümlülük türünün penceresi 4.320 dakikadır ve
fark etme anından başlar; sınır 4.506. dakikadır. **OM44:** Etkilenen abone sayısı bir **tahmindir**
ve zamanla daralır: 48.000, 21.000, 9.400, 7.100 ve 6.200. Veri erişim kaydı olmadığı için sayı hiç
kesinleşmez; son değer de bir tahmindir. **OM45:** Bir paydaş bildirildikten sonra tahmin her
değiştiğinde bir düzeltme bildirimi gerekir ve düzeltme, paydaşın hazırlık kişi-saatinin 0,35'i
kadar ek yük getirir. **OM46:** Bilgisiz abone-saat, son tahmindeki abone sayısının fark etme ile
abone bildirimi arasındaki süreyle çarpımıdır. **OM47:** Fazladan bildirilen abone, bildirim anındaki
tahmin ile son tahmin arasındaki farktır.

```js
// bildirim/model.mjs — iletisim ve bildirim modeli: gercek bir kurum, duzenleme ya da olay
// yok. Paydaslar, esikler ve kapsam tahmini veri yapisidir; sureler kurgu verilerdir.

export const FARK_ETME = 186;                  // uyarinin dustugu dakika
export const PENCERE = 4320;                   // belirli bir surede bildirim isteyen
                                               // yukumluluk turunun penceresi (dakika)
// esik: ad -> gerceklestigi dakika (onceki derslerden gelir)
export const ESIK = { dogrulama: 216, kapsam: 370, sinirlama: 393, kurtarma: 1363,
  inceleme: 17280 };

// paydas: ad, ic/dis, esik, bildirim hazirlik dakikasi, hazirlik kisi-saati
export const PAYDAS = [
  ["vardiya sorumlusu", "ic", "dogrulama", 5, 0.3],
  ["bilgi guvenligi yoneticisi", "ic", "dogrulama", 8, 0.5],
  ["hizmet sahibi ekipler", "ic", "dogrulama", 12, 1.5],
  ["dis mudahale destegi", "dis", "dogrulama", 15, 1.0],
  ["yurutme", "ic", "kapsam", 35, 2.0],
  ["hukuk birimi", "ic", "kapsam", 25, 1.5],
  ["bildirim yukumlulugu muhatabi", "dis", "kapsam", 180, 8.0],
  ["is surekliligi ekibi", "ic", "sinirlama", 18, 1.0],
  ["kurumsal iletisim", "ic", "sinirlama", 40, 3.0],
  ["kurumsal musteriler", "dis", "sinirlama", 120, 6.0],
  ["etkilenen aboneler", "dis", "kurtarma", 260, 14.0],
  ["sigorta saglayicisi", "dis", "kurtarma", 95, 4.0],
];

// kapsam tahmini: [dakika, o an bildirilecek etkilenen abone sayisi] (veri).
// Onceki derste veri erisim kaydi olmadigi icin sayi hicbir zaman kesinlesmez.
export const TAHMIN = [[216, 48000], [370, 21000], [1363, 9400], [4506, 7100], [17280, 6200]];
export const tahmin = (dk) => [...TAHMIN].reverse().find(([t]) => t <= dk)?.[1] ?? TAHMIN[0][1];
export const duzeltme = (dk) => TAHMIN.filter(([t]) => t > dk).length;
export const SON = TAHMIN[TAHMIN.length - 1][1];

// politika: paydasa bildirimin baslatildigi an
export const POLITIKA = {
  "erken": () => ESIK.dogrulama,
  "esige gore": (p) => ESIK[p[2]],
  "pencere sonunda": (p) => p[1] === "dis" ? FARK_ETME + PENCERE - p[3] : ESIK[p[2]],
  "gec": () => ESIK.inceleme,
};

export function olc(politikaAdi) {
  const f = POLITIKA[politikaAdi];
  const satir = PAYDAS.map((p) => {
    const baslangic = f(p), an = baslangic + p[3];
    const dis = p[1] === "dis";
    return { ad: p[0], dis, an, gecikme: dis ? Math.max(0, an - (FARK_ETME + PENCERE)) : 0,
      duzeltme: duzeltme(an), bildirilen: tahmin(an), saat: p[4] };
  });
  const abone = satir.find((s) => s.ad === "etkilenen aboneler");
  return { satir, disGec: satir.filter((s) => s.dis && s.gecikme > 0).length,
    fazla: Math.max(0, abone.bildirilen - SON), bildirilen: abone.bildirilen, aboneAn: abone.an,
    gecikme: satir.reduce((a, s) => a + s.gecikme, 0),
    duzeltme: satir.reduce((a, s) => a + s.duzeltme, 0),
    saat: satir.reduce((a, s) => a + s.saat * (1 + s.duzeltme * 0.35), 0),
    aboneSaat: Math.round(SON * (abone.an - FARK_ETME) / 60) };
}
```

Ölçüm dosyası önce paydaşları eşiğe göre sıralar, sonra dört bildirim politikasını aynı olayda
koşturur.

```js
// bildirim/olc.mjs — kac paydas var, hangi esikte bildirim basliyor, kapsam kesinlesmeden
// yapilan bildirim kac duzeltme uretiyor ve gecikmenin bedeli kac abone-saat.
import { FARK_ETME, PENCERE, ESIK, PAYDAS, TAHMIN, SON, POLITIKA, tahmin, duzeltme,
  olc } from "./model.mjs";

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));
const t0 = process.hrtime.bigint();
const SINIR = FARK_ETME + PENCERE;

console.log(`${PAYDAS.length} paydas (${PAYDAS.filter((p) => p[1] === "dis").length} dis); ` +
  `fark etme ${FARK_ETME}. dakika, bildirim penceresi ${PENCERE} dk, siniri ${SINIR}. dakika`);

console.log("\n1. paydaslar ve esige gore bildirim ani");
const A = [-30, 6, 12, 10, 14, 13, 12];
yaz(A, "paydas", "tur", "esik", "hazirlik", "bildirim ani", "pencere ici", "bildirilen");
for (const p of PAYDAS) {
  const an = ESIK[p[2]] + p[3];
  yaz(A, p[0], p[1], p[2], p[3] + " dk", an, p[1] === "dis" ? (an <= SINIR ? "evet" : "hayir") : "-",
    p[0] === "etkilenen aboneler" ? tahmin(an) : "-");
}

console.log("\n2. kapsam tahmini (veri erisim kaydi olmadigi icin kesinlesmez)");
const B = [-10, 10, 13, 17];
yaz(B, "dakika", "tahmin", "son sayiya", "kalan duzeltme");
for (const [dk, v] of TAHMIN)
  yaz(B, dk, v, (v / SON).toFixed(2) + "x", duzeltme(dk));

console.log("\n3. dort bildirim politikasi");
const C = [-18, 12, 12, 10, 9, 12, 11, 12];
yaz(C, "politika", "abone ani", "bildirilen", "fazla", "dis gec", "gecikme dk", "duzeltme",
  "kisi-saat");
const R = {};
for (const k of Object.keys(POLITIKA)) {
  const r = R[k] = olc(k);
  yaz(C, k, r.aboneAn, r.bildirilen, r.fazla, r.disGec, r.gecikme, r.duzeltme,
    r.saat.toFixed(1));
}

console.log("\n4. kararin iki yonu");
const D = [-18, 21, 18, 21];
yaz(D, "politika", "bilgisiz abone-saat", "fazla bildirilen", "duzeltme bildirimi");
for (const [k, r] of Object.entries(R)) yaz(D, k, r.aboneSaat, r.fazla, r.duzeltme);
const e = R["erken"], g = R["gec"];
console.log(`  erken ile gec arasi: ${g.aboneSaat - e.aboneSaat} abone-saat farkina karsilik ` +
  `${e.fazla - g.fazla} fazla bildirilen abone ve ${e.duzeltme - g.duzeltme} duzeltme`);

console.log("\n5. gec politikada pencereyi asan dis paydaslar");
for (const s of R["gec"].satir.filter((x) => x.dis && x.gecikme > 0))
  yaz([-4, -30, 10, 12], "", s.ad, s.an, `+${s.gecikme} dk`);

const ms = Number(process.hrtime.bigint() - t0) / 1e6;   // ham olcum basilmaz, bant denetlenir
console.log(`\ndort politika ve ${PAYDAS.length} paydas 500 ms bandinda: ${ms < 500 ? "evet" : "hayir"}`);
```

```
12 paydas (5 dis); fark etme 186. dakika, bildirim penceresi 4320 dk, siniri 4506. dakika

1. paydaslar ve esige gore bildirim ani
paydas                           tur        esik  hazirlik  bildirim ani  pencere ici  bildirilen
vardiya sorumlusu                 ic   dogrulama      5 dk           221            -           -
bilgi guvenligi yoneticisi        ic   dogrulama      8 dk           224            -           -
hizmet sahibi ekipler             ic   dogrulama     12 dk           228            -           -
dis mudahale destegi             dis   dogrulama     15 dk           231         evet           -
yurutme                           ic      kapsam     35 dk           405            -           -
hukuk birimi                      ic      kapsam     25 dk           395            -           -
bildirim yukumlulugu muhatabi    dis      kapsam    180 dk           550         evet           -
is surekliligi ekibi              ic   sinirlama     18 dk           411            -           -
kurumsal iletisim                 ic   sinirlama     40 dk           433            -           -
kurumsal musteriler              dis   sinirlama    120 dk           513         evet           -
etkilenen aboneler               dis    kurtarma    260 dk          1623         evet        9400
sigorta saglayicisi              dis    kurtarma     95 dk          1458         evet           -

2. kapsam tahmini (veri erisim kaydi olmadigi icin kesinlesmez)
dakika        tahmin   son sayiya   kalan duzeltme
216            48000        7.74x                4
370            21000        3.39x                3
1363            9400        1.52x                2
4506            7100        1.15x                1
17280           6200        1.00x                0

3. dort bildirim politikasi
politika             abone ani  bildirilen     fazla  dis gec  gecikme dk   duzeltme   kisi-saat
erken                      476       21000     14800        0           0         46        95.0
esige gore                1623        9400      3200        0           0         38        82.6
pencere sonunda           4506        7100       900        0           0         29        65.4
gec                      17540        6200         0        5       64540          0        42.8

4. kararin iki yonu
politika            bilgisiz abone-saat  fazla bildirilen   duzeltme bildirimi
erken                             29967             14800                   46
esige gore                       148490              3200                   38
pencere sonunda                  446400               900                   29
gec                             1793247                 0                    0
  erken ile gec arasi: 1763280 abone-saat farkina karsilik 14800 fazla bildirilen abone ve 46 duzeltme

5. gec politikada pencereyi asan dis paydaslar
    dis mudahale destegi               17295   +12789 dk
    bildirim yukumlulugu muhatabi      17460   +12954 dk
    kurumsal musteriler                17400   +12894 dk
    etkilenen aboneler                 17540   +13034 dk
    sigorta saglayicisi                17375   +12869 dk

dort politika ve 12 paydas 500 ms bandinda: evet
```
Sayılar **ölçüm** sınıfındadır; girdileri yukarıdaki varsayımlardır.

#### On İki Paydaş

Birinci tablo paydaşları eşiğe göre bildirim anına çevirir. İç paydaşların yedisi 221 ile 433.
dakikalar arasında bilgilendirilir; hazırlık süreleri 5 ile 40 dakika arasındadır. Dış paydaşlarda
hazırlık belirgin biçimde uzar: bildirim yükümlülüğü muhatabı için 180, kurumsal müşteriler için
120, etkilenen aboneler için 260 dakika. Bu fark bir gecikme değil, bildirimin kendisinin iş
olmasıdır — metin yazılır, hukuk birimi okur, kanal hazırlanır.

Eşiğe göre politikada beş dış paydaşın beşi de pencere içinde kalır; en geç bildirim 1.623. dakikada
etkilenen abonelere gider ve sınır 4.506. dakikadır. Pencere bu olayda dar değildir. Dar olan başka
bir şeydir.

Eşiklerin dağılımı da bir karardır. Üç iç paydaş doğrulama eşiğinde, yani uyarının gerçek olduğu
anlaşıldığı anda bilgilendirilir; hukuk birimi ve yürütme kapsam eşiğini bekler. Bu sıra rastgele
değildir: kapsam belirlenmeden yapılan bir yürütme bildirimi, kaç varlığın etkilendiğini söyleyemez
ve karşılığında bir karar üretmez. Dış paydaşların hiçbiri doğrulama eşiğinden önce yer almaz; tek
istisna dış müdahale desteğidir ve o da bir bildirim değil, bir çağrıdır.

#### Kesinleşmeyen Sayı

İkinci tablo kapsam tahminini zamanla verir. 216. dakikada tahmin 48.000'dir — son tahminin
**7,74 katı**. 370. dakikada 21.000'e, 1.363. dakikada 9.400'e, 4.506. dakikada 7.100'e iner ve
17.280. dakikada 6.200'de durur. Son sütun her andan sonra kaç düzeltmenin geleceğini yazar.

Bu tablonun anlamı önceki derste kurulmuştu: veri erişim kaydı hiç açılmadığı için "hangi abone
kayıtları okundu" sorusu yanıtsızdır. Sayı bu yüzden bir ölçüm değil, daralan bir tahmindir; 6.200
de kesin değildir, yalnız daha fazla daralmayan değerdir. **Bildirim, kesinleşmeyen bir sayı
üzerinden yapılmak zorundadır** ve bu, bildirim anının seçimini bir tahmin doğruluğu sorununa
çevirir.

#### Dört Politika

Üçüncü tablo dört politikayı koşturur. Erken politikada bütün paydaşlar doğrulama anında
bilgilendirilir; abone bildirimi 476. dakikada 21.000 sayısıyla gider, 14.800 abone fazladan
bildirilir, 46 düzeltme gerekir ve toplam yük 95,0 kişi-saattir. Eşiğe göre politikada abone
bildirimi 1.623. dakikaya kayar, bildirilen 9.400'e ve fazladan bildirilen 3.200'e iner, düzeltme
38'e düşer. Pencere sonunda politikası dış bildirimleri sınırın hemen öncesine yerleştirir: 4.506.
dakika, 7.100 abone, 900 fazladan bildirilen, 29 düzeltme ve 65,4 kişi-saat.

Geç politika inceleme tamamlanana kadar bekler. Bildirilen sayı 6.200'dür, fazladan bildirilen
sıfırdır ve hiç düzeltme gerekmez — kişi-saat 42,8 ile en düşüktür. Karşılığı beşinci tablodadır:
beş dış paydaşın beşi de pencereyi aşar, toplam gecikme **64.540 dakikadır** ve en büyük aşım
etkilenen abonelerdedir, 13.034 dakika.

Kişi-saat sütunu tek başına yanıltıcıdır. Erken politikanın 95,0 kişi-saatinin büyük bölümü
bildirimin kendisinden değil, onu izleyen 46 düzeltmeden gelir; her düzeltme paydaşın hazırlık
yükünün üçte birini yeniden getirir. Politika geciktikçe düzeltme sayısı 46'dan 38'e, 29'a ve
sıfıra iner. Bu sütunda en ucuz görünen politika, etkilenen abonelere bildirimi pencereden dokuz
gün sonra yapan politikadır; maliyeti kişi-saatte değil, dakikada ödenir. Bir bildirim politikasını
yalnız hazırlık yüküyle seçmek, geciken bildirimi ucuz göstermek demektir.

#### Kararın İki Yönü

Dördüncü tablo iki sütunu yan yana koyar. Erken politikada bilgisiz abone-saat 29.967'dir ve
fazladan bildirilen abone 14.800. Geç politikada fazladan bildirilen sıfırdır ve bilgisiz abone-saat
**1.793.247**. İki uç arasındaki fark 1.763.280 abone-saate karşılık 14.800 fazladan bildirilen
abone ve 46 düzeltmedir.

Aradaki iki politika bu eğrinin nasıl büküldüğünü gösterir. Eşiğe göre politika, erkene göre
118.523 abone-saat ekleyerek fazladan bildirileni 14.800'den 3.200'e indirir — abone başına yaklaşık
on abone-saat. Pencere sonunda politikası 297.910 abone-saat daha ekleyerek 3.200'ü 900'e indirir;
bu kez abone başına yüz otuz abone-saat. **Doğruluk pahalılaşarak gelir.** Pencere sonunda politikası
yükümlülük penceresinin izin verdiği son ana yerleşir ve o noktadan sonra doğruluk ancak pencereyi
aşarak artırılabilir; geç politikanın yaptığı da budur.

Fazladan bildirilen abone sayısı bir sayı olarak masumdur, ama karşılığı 14.800 kişiye kendi
verilerinin görülmüş olabileceğinin söylenmesidir; sonradan gelen düzeltme bu ilk bildirimi geri
almaz. Bilgisiz abone-saat de bir sayıdır ve karşılığı, gerçekten etkilenmiş 6.200 kişinin bunu
bilmeden geçirdiği süredir. Model ikisini de sayar, ikisini birbirine çeviremez; kararı veren, hangi sütunun ağır bastığını
kendi ölçüsüyle yazmak zorundadır.

#### Özet

- On iki paydaşın beşi dıştır; iç bildirimler 221–433. dakikalarda, dış bildirimler eşiğe göre
  231–1.623. dakikalarda gider ve hazırlık süreleri 5 ile 260 dakika arasındadır.
- Belirli bir sürede bildirim isteyen yükümlülük türünün penceresi 4.320 dakikadır ve sınır 4.506.
  dakikadır; eşiğe göre politikada beş dış paydaşın beşi de pencere içinde kalır.
- Etkilenen abone tahmini 48.000'den 6.200'e daralır ama veri erişim kaydı olmadığı için hiç
  kesinleşmez; bildirim kesinleşmemiş bir sayı üzerinden yapılır.
- Erken politika 14.800 aboneyi fazladan bildirir ve 46 düzeltme üretir, bilgisiz abone-saat
  29.967'dir; geç politika hiç fazladan bildirmez ama beş dış paydaşta pencereyi 64.540 dakika aşar
  ve 1.793.247 abone-saat üretir.
- Doğruluk pahalılaşarak gelir: fazladan bildirileni 14.800'den 3.200'e indirmek abone başına on
  abone-saat, 3.200'den 900'e indirmek yüz otuz abone-saat tutar.

#### Sonraki Adım

Olay kapatıldı: erişim durduruldu, tutunma noktaları temizlendi, hizmet geri getirildi ve paydaşlar
bilgilendirildi. Yedi ders boyunca ölçülen her karar bir sayıya bağlandı. Bir tanesi bağlanamadı ve
her derste yeniden karşımıza çıktı: **ne olduğunu** kanıtlayacak kalemlerin çoğu sınırlama anında
zaten silinmişti. Bellek dökümü alınmadan varlıklar ağdan alındı, üç yapılandırma kancası bir daha
bulunamadı, iki inceleme sorusu yanıtsız kaldı ve abone sayısı bir tahmin olarak kaldı. Sonraki
konu bu kalemleri kendi başına ele alır: kanıtın bütünlüğü neyle gösterilir, hangi kalem uçucudur
ve toplanmazsa kaybolur, toplama sırası yanlış olduğunda kaç kalem kaybedilir ve gözetim zinciri
kaç kalemde kopar.

## Adli İnceleme

Kanıt kaleminin ölçülmesi: delil bütünlüğü ve gözetim zincirinin kaç kalemde koptuğu, yazma korumalı kopyalamanın doğrulanabilirliği ve kısmi kopyanın kaçırdığı kalem, uçuculuk sırası ile toplama sırası yanlışsa kaybedilen kalem, üç kaynağın zaman çizelgesinin birleştirilmesi ve saat kaymasının bozduğu sıra, sistem yapılarından çıkarılan izin kanıt değeri ve teknik bulgunun hukuki bağlamda iddia–kanıt eşlemesi olarak sunulması.

### Adli İnceleme İlkeleri

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/adli-inceleme-ilkeleri

Delil bütünlüğü ve gözetim zincirinin kalem cinsinden ölçülmesi: 28 kanıt kalemi, 78 aktarım ve aktarım başına beş kayıt alanı; 390 alanın 10'unun boş kalması 9 kalemi, karma uyuşmazlığı 3 kalemi daha tartışmaya açıyor ve 28 kalemin 12'si savunulamıyor. Saha zincirindeki tek bir noktanın kaydı tümüyle düşerse 13 kalem birden açılıyor; yüzde 2,6'lık kayıt boşluğunun yüzde 43'lük kalem kaybına dönüşmesi zincirin yapısından geliyor.

Bir önceki konu olayı kapattı: sınırlama uygulandı, etkilenen makineler ağdan alındı, hizmet geri
geldi. Kapanış oradan şu soruyla çıkıyordu — olayın **ne olduğunu** kanıtlayacak kalemlerin çoğu
sınırlama anında zaten silinmişti. Makine kapatıldığında bellek gitti, oturum düştüğünde bağlantı
listesi gitti, yeniden kurulumda geçici dosyalar gitti. Geriye kalanla bir anlatı kurulabilir; o
anlatının **sınanabilir** olup olmadığı ayrı bir sorudur.

Bu konu o soruyu ölçer ve ölçü birimi **kanıt kalemidir**. Üç sütun sayılır: kaç kalem uçucudur ve
toplanmazsa kaybolur, toplama sırası kaç kalemi kaybettirir, gözetim zinciri kaç kalemde kopar. Bu
ders üçüncü sütunu kurar. Kurgu bölgesel ölçüm ağında bir şube ucunda yetkisiz erişim görülmüş,
inceleme altı konağı kapsıyor. **Bütün sayılar bir modelden gelir.** Başkasına ait bir sistemden
kanıt toplamak — imaj almak, döküm çıkarmak, kayıt kopyalamak — yazılı yetki ve tanımlı kapsam
olmadan hem yasadışı hem meslek dışıdır.

- **AI1.** **Kanıt kalemi**, tek bir kaynaktan alınmış ve tek bir bütünlük değeriyle bağlanabilen
  veri parçasıdır: bir disk imajı, bir bellek dökümü, bir günlük dilimi, bir yapılandırma kopyası.
- **AI2.** Her kalemin bir **ömrü** vardır: toplanmazsa kaybolmadan önce geçen süre. Ömrü bir saati
  aşmayan kalem **uçucudur**.
- **AI3.** **Gözetim zinciri** (chain of custody), kalemin toplandığı andan çözümlendiği ana kadar
  geçtiği aktarımların kaydıdır. Zincir düğümlerden, aktarım iki düğüm arasındaki devirden oluşur.
- **AI4.** Her aktarım **beş kayıt alanı** ister: kimden, kime, ne zaman, hangi ortamda, hangi
  karma. Alanlar elle doldurulur ve boş kalabilir.
- **AI5.** Bir kalem **savunulabilirdir** ancak toplama anındaki karma çözümleme anındaki karmayla
  aynıysa **ve** zincirindeki hiçbir aktarımda eksik alan yoksa. Aksi durumda kalem **tartışmaya
  açıktır** — yanlış olduğu gösterilmiş değildir, doğru olduğu gösterilemez.
- **AI6.** Kalem sayıları, süreler ve hata oranı kurgudur; rastgelelik tohumu görünürdür.

#### Kalem, Karma ve Aktarım

```js
// adli/kalem.mjs — kanit kalemi kumesi, karma tabanli butunluk ve gozetim zinciri MODELIDIR.
// Bolgesel olcum agi kurgudur; gercek kurum, olay ve makine adi yazilmaz.
import { createHash } from "node:crypto";

export const TOHUM = 20260731;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };

// sinif -> [omur(sn): toplanmazsa kaybolmadan once gecen sure, toplama suresi(sn)]
export const SINIF = {
  "ag-durumu": [120, 45], "surec-listesi": [240, 60], "acik-tanitici": [300, 55],
  "oturum-durumu": [600, 70], "bellek-icerigi": [900, 420], "gecici-dosya": [3600, 180],
  "akis-kaydi": [86400, 240], "disk-imaji": [604800, 5400], "yapilandirma": [604800, 90],
  "uzak-gunluk": [2592000, 300],
};

// konak -> [gozetim zinciri dugumleri, tasidigi kalem siniflari]
export const KONAK = {
  "sube-ucu-3": [["toplama", "paketleme", "aktarim", "laboratuvar", "cozumleme"],
    ["ag-durumu", "surec-listesi", "acik-tanitici", "oturum-durumu", "bellek-icerigi",
      "gecici-dosya", "disk-imaji", "yapilandirma"]],
  "saha-dizustu-14": [["toplama", "paketleme", "aktarim", "laboratuvar", "cozumleme"],
    ["ag-durumu", "surec-listesi", "oturum-durumu", "bellek-icerigi", "disk-imaji"]],
  "toplayici-2": [["toplama", "aktarim", "cozumleme"],
    ["ag-durumu", "surec-listesi", "acik-tanitici", "oturum-durumu", "bellek-icerigi",
      "disk-imaji", "yapilandirma"]],
  "portal-onyuz": [["toplama", "aktarim", "cozumleme"],
    ["ag-durumu", "surec-listesi", "bellek-icerigi", "yapilandirma"]],
  "merkez-gunluk": [["alma", "cozumleme"], ["uzak-gunluk", "yapilandirma"]],
  "akis-toplayici": [["alma", "cozumleme"], ["akis-kaydi", "yapilandirma"]],
};

// Her aktarimda doldurulmasi gereken bes kayit alani.
export const ALAN = ["kimden", "kime", "zaman", "ortam", "karma"];
// Yazma korumasi olmadan acilan kalemler: icerik degismese de erisim damgasi degisiyor.
export const KORUMASIZ = ["sube-ucu-3/gecici-dosya", "toplayici-2/disk-imaji",
  "portal-onyuz/yapilandirma"];

export const ozet = (s) => createHash("sha256").update(s).digest("hex").slice(0, 16);

export function kume() {
  const r = uretec(TOHUM), liste = [];
  for (const [konak, [dugum, siniflar]] of Object.entries(KONAK))
    for (const s of siniflar) {
      const ad = `${konak}/${s}`;
      const icerik = `${ad}|${Math.floor(r() * 1e9)}`;
      liste.push({ ad, konak, sinif: s, dugum, omur: SINIF[s][0], sure: SINIF[s][1],
        toplamaKarma: ozet(icerik),
        cozumlemeKarma: ozet(icerik + (KORUMASIZ.includes(ad) ? "|erisim-damgasi" : "")),
        aktarim: dugum.slice(1).map((d, i) => {
          const kayit = Object.fromEntries(ALAN.map((a) => [a, true]));
          if (r() < 0.11) kayit[ALAN[Math.floor(r() * 5)]] = false;   // alan bos kaldi
          return { nokta: `${dugum[i]}>${d}`, kayit };
        }) });
    }
  return liste;
}

export const eksikAlan = (k) =>
  k.aktarim.reduce((a, t) => a + ALAN.filter((x) => !t.kayit[x]).length, 0);
export const butun = (k) => k.toplamaKarma === k.cozumlemeKarma;
export const savunulabilir = (k) => butun(k) && eksikAlan(k) === 0;
```

Karma burada tek bir işi yapıyor: kalemi **kendisine bağlamak**. Toplama anında hesaplanan özet
kaydedilir; çözümleme anında yeniden hesaplanır. İki değer aynıysa kalemin bu iki an arasında
değişmediği gösterilmiş olur. Aynı değilse kalemin değiştiği gösterilmiş olur — nasıl ve kimin
tarafından değil, yalnız **değiştiği**. Karmanın kanıtladığı budur ve fazlası değildir.

Üç kalem yazma koruması olmadan açılmıştır. İçeriğe hiçbir şey yazılmamıştır; yalnız erişim damgası
tazelenmiştir. Karma bu ayrımı görmez, çünkü görmemesi gerekir: bütünlük değeri niyeti değil
**farkı** ölçer. Bir kalemin kazara mı yoksa bilerek mi değiştiği, karmanın değil zincirin sorusudur.

#### Zincirin Sayıları

```js
// adli/olc.mjs — konak basina kalem, aktarim ve savunulabilirlik sayimi.
import { kume, ALAN, SINIF, eksikAlan, butun, savunulabilir, TOHUM } from "./kalem.mjs";

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd());

const K = kume();
const ucucu = K.filter((k) => k.omur <= 3600).length;
console.log(`model (tohum ${TOHUM}): ${K.length} kanit kalemi, ${Object.keys(SINIF).length} ` +
  `sinif, aktarim basina ${ALAN.length} kayit alani`);
console.log(`${ucucu} kalem ucucu (omru bir saati asmiyor), ${K.length - ucucu} kalem kalici`);

const A = [-17, 7, 8, 9, 7, 12, 15];
console.log("");
y(A, "konak", "kalem", "dugum", "aktarim", "alan", "eksik alan", "savunulabilir");
for (const konak of [...new Set(K.map((k) => k.konak))]) {
  const g = K.filter((k) => k.konak === konak);
  const akt = g.reduce((a, k) => a + k.aktarim.length, 0);
  y(A, konak, g.length, g[0].dugum.length, akt, akt * ALAN.length,
    g.reduce((a, k) => a + eksikAlan(k), 0), `${g.filter(savunulabilir).length}/${g.length}`);
}
const akt = K.reduce((a, k) => a + k.aktarim.length, 0);
y(A, "toplam", K.length, "-", akt, akt * ALAN.length,
  K.reduce((a, k) => a + eksikAlan(k), 0), `${K.filter(savunulabilir).length}/${K.length}`);

console.log(`\nkarma uyusmazligi ${K.filter((k) => !butun(k)).length} kalemde: ` +
  K.filter((k) => !butun(k)).map((k) => k.ad).join(", "));
```

```
model (tohum 20260731): 28 kanit kalemi, 10 sinif, aktarim basina 5 kayit alani
18 kalem ucucu (omru bir saati asmiyor), 10 kalem kalici

konak              kalem   dugum  aktarim   alan  eksik alan  savunulabilir
sube-ucu-3             8       5       32    160           4            3/8
saha-dizustu-14        5       5       20    100           4            2/5
toplayici-2            7       3       14     70           1            5/7
portal-onyuz           4       3        8     40           0            3/4
merkez-gunluk          2       2        2     10           1            1/2
akis-toplayici         2       2        2     10           0            2/2
toplam                28       -       78    390          10          16/28

karma uyusmazligi 3 kalemde: sube-ucu-3/gecici-dosya, toplayici-2/disk-imaji, portal-onyuz/yapilandirma
```

Tabloda iki sütun birlikte okunmalıdır. Saha konakları beş düğümlü bir zincir izliyor: kalem
toplanıyor, paketleniyor, laboratuvara taşınıyor, kabul ediliyor, çözümleniyor. Dört aktarım demek,
kalem başına yirmi doldurulacak alan demektir. Merkezdeki konaklarda zincir üç düğüm, uzaktan alınan
kalemlerde iki düğümdür — fiziksel taşıma yoktur, dolayısıyla doldurulacak alan da azdır.

Sonuç sütunu bu yapıyı doğrudan yansıtıyor. Sekiz kalemli şube ucunda savunulabilir kalem sayısı
üçtür; iki kalemli akış toplayıcısında ikinin ikisi savunulabilirdir. Zincir uzadıkça kalem başına
düşen kayıt yükü artıyor ve her ek alan bir boş kalma fırsatıdır. **Uzun zincir kalemi daha çok
korumaz; onu daha çok yerde kırılabilir kılar.**

#### Tek Eksik Kayıt

```js
// adli/bosluk.mjs — tek eksik kaydin kac kalemi tartismaya actigi.
import { kume, ALAN, eksikAlan, butun } from "./kalem.mjs";

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd());
const K = kume();

// Her aktarim noktasi icin: kac kalem geciyor, kaydi tumuyle dusrse hepsi tartismaya acilir.
const nokta = new Map();
for (const k of K)
  k.aktarim.forEach((t, i) => {
    if (!nokta.has(t.nokta)) nokta.set(t.nokta, { gecen: 0, sonra: 0 });
    const n = nokta.get(t.nokta);
    n.gecen += 1; n.sonra = k.aktarim.length - i - 1;
  });

const A = [-22, 14, 14, 20];
y(A, "aktarim noktasi", "gecen kalem", "sonraki adim", "kaydi dusrse acilan");
for (const [ad, n] of [...nokta].sort((a, b) => b[1].gecen - a[1].gecen))
  y(A, ad, n.gecen, n.sonra, `${n.gecen} kalem (%${Math.round(n.gecen * 100 / K.length)})`);

// Gozlenen durum: hangi alan eksik, hangi soru yanitsiz kaliyor.
const SORU = { kimden: "kalem kimin elindeydi", kime: "kim teslim aldi",
  zaman: "sira kanitlanabilir mi", ortam: "hangi kosulda saklandi",
  karma: "degismedigi gosterilebilir mi" };
console.log("");
const B = [-12, -32, 9, 7];
y(B, "eksik alan", "yanitsiz kalan soru", "aktarim", "kalem");
for (const a of ALAN) {
  const t = K.reduce((s, k) => s + k.aktarim.filter((x) => !x.kayit[a]).length, 0);
  y(B, a, SORU[a], t, K.filter((k) => k.aktarim.some((x) => !x.kayit[a])).length);
}

const alan = K.reduce((a, k) => a + k.aktarim.length, 0) * ALAN.length;
const eksik = K.reduce((a, k) => a + eksikAlan(k), 0);
const acik = K.filter((k) => eksikAlan(k) > 0 || !butun(k)).length;
console.log(`\n${alan} kayit alaninin ${eksik}'i bos (%${(eksik * 100 / alan).toFixed(1)}); ` +
  `bu ${K.filter((k) => eksikAlan(k) > 0).length} kalemi, karma uyusmazligi ` +
  `${K.filter((k) => !butun(k)).length} kalemi daha etkiliyor`);
console.log(`toplam ${acik} / ${K.length} kalem tartismaya acik ` +
  `(%${Math.round(acik * 100 / K.length)}), ${K.length - acik} kalem savunulabilir`);
const enKotu = Math.max(...[...nokta.values()].map((n) => n.gecen));
console.log(`tek bir noktanin kaydi tumuyle dusrse en kotu durum ${enKotu} kalem ` +
  `(%${Math.round(enKotu * 100 / K.length)}) ve bu, gozlenen ${acik} kalemin ustune eklenir`);
```

```
aktarim noktasi          gecen kalem  sonraki adim kaydi dusrse acilan
toplama>paketleme                 13             3      13 kalem (%46)
paketleme>aktarim                 13             2      13 kalem (%46)
aktarim>laboratuvar               13             1      13 kalem (%46)
laboratuvar>cozumleme             13             0      13 kalem (%46)
toplama>aktarim                   11             1      11 kalem (%39)
aktarim>cozumleme                 11             0      11 kalem (%39)
alma>cozumleme                     4             0       4 kalem (%14)

eksik alan  yanitsiz kalan soru               aktarim  kalem
kimden      kalem kimin elindeydi                   3      3
kime        kim teslim aldi                         1      1
zaman       sira kanitlanabilir mi                  1      1
ortam       hangi kosulda saklandi                  2      2
karma       degismedigi gosterilebilir mi           3      3

390 kayit alaninin 10'i bos (%2.6); bu 9 kalemi, karma uyusmazligi 3 kalemi daha etkiliyor
toplam 12 / 28 kalem tartismaya acik (%43), 16 kalem savunulabilir
tek bir noktanin kaydi tumuyle dusrse en kotu durum 13 kalem (%46) ve bu, gozlenen 12 kalemin ustune eklenir
```

Son üç satır bu dersin sonucudur. Kayıt alanlarının **yüzde 2,6'sı** boştur ve bu, kalemlerin
**yüzde 43'ünü** tartışmaya açar. Oran arasındaki fark bir hesap hatası değil, zincirin yapısıdır:
alan tek tek doldurulur, kalem ise bütün olarak savunulur. Bir kalemin yirmi alanından biri boşsa o
kalemin tamamı için "değişmediği gösterilemez" denir. Bütünlük bölünebilir bir nitelik değildir.

Birinci tablo bu kırılganlığın nerede yoğunlaştığını gösteriyor. Saha zincirindeki dört noktanın her
biri **on üç kalem** taşıyor; herhangi birinin kaydı tümüyle düşerse on üç kalem birden açılır. Bu,
bir kalem-kayıt ilişkisi değil, bir **darboğaz** ilişkisidir: aynı kurye, aynı kabul masası, aynı
form. Uzaktan alınan dört kalemde aynı riskin ölçüsü dörttür.

İkinci tablo eksik alanın türüne göre neyin cevapsız kaldığını ayırıyor ve sütunlar eşit değildir.
**Karma** alanı boşsa kalemin değişmediği gösterilemez; bu, kalemi doğrudan kullanılamaz kılar.
**Ortam** alanı boşsa yalnız saklama koşulu bilinmez; kalem hâlâ karma ile bağlıdır ve bu boşluk
sonradan bir tanıklıkla kapatılabilir. Zincir denetimi bu iki durumu aynı sütuna yazarsa, kapatılabilir
boşlukla kapatılamaz boşluğu karıştırır ve inceleme bütçesini yanlış yere harcar.

#### Zinciri Kısaltmanın Bedeli

```js
// adli/kisalt.mjs — zincir uzunlugu ile beklenen acik kalem sayisi arasindaki bag.
import { kume, ALAN, eksikAlan } from "./kalem.mjs";
const K = kume(), P = 0.11;                    // aktarim basina alan bos kalma olasiligi
const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd());
const bek = (a) => 1 - (1 - P) ** a;           // en az bir alani eksik kalma olasiligi

const A = [-20, 7, 9, 7, 10, 20];
y(A, "zincir", "kalem", "aktarim", "alan", "gozlenen", "beklenen acik kalem");
let tk = 0, ta = 0, tb = 0, tg = 0;
for (const [ad, n] of [["saha (5 dugum)", 4], ["merkez (3 dugum)", 2], ["uzak (2 dugum)", 1]]) {
  const g = K.filter((k) => k.aktarim.length === n);
  const gozlenen = g.filter((k) => eksikAlan(k) > 0).length;
  y(A, ad, g.length, g.length * n, g.length * n * ALAN.length, gozlenen,
    (g.length * bek(n)).toFixed(2));
  tk += g.length; ta += g.length * n; tg += gozlenen; tb += g.length * bek(n);
}
y(A, "toplam", tk, ta, ta * ALAN.length, tg, tb.toFixed(2));

// Yerinde cozumleme: saha kalemleri tasinmiyor, zincir tek aktarima iniyor.
const s = K.filter((k) => k.aktarim.length === 4).length;
const a2 = s + K.filter((k) => k.aktarim.length === 2).length * 2 +
  K.filter((k) => k.aktarim.length === 1).length;
const b2 = s * bek(1) + K.filter((k) => k.aktarim.length === 2).length * bek(2) +
  K.filter((k) => k.aktarim.length === 1).length * bek(1);
y(A, "yerinde cozumleme", tk, a2, a2 * ALAN.length, "-", b2.toFixed(2));
console.log(`aktarim ${ta} -> ${a2} (%${Math.round((1 - a2 / ta) * 100)} az), ` +
  `beklenen acik kalem ${tb.toFixed(2)} -> ${b2.toFixed(2)}`);
```

```
zincir                kalem  aktarim   alan  gozlenen beklenen acik kalem
saha (5 dugum)           13       52    260         7                4.84
merkez (3 dugum)         11       22    110         1                2.29
uzak (2 dugum)            4        4     20         1                0.44
toplam                   28       78    390         9                7.57
yerinde cozumleme        28       39    195         -                4.16
aktarim 78 -> 39 (%50 az), beklenen acik kalem 7.57 -> 4.16
```

Beklenen sütun modeli kendi içinde sınıyor: aktarım başına yüzde 11'lik alan boş kalma olasılığıyla
saha kalemlerinin 4,84'ünün açılması beklenir, gözlenen 7'dir. Sapma küçük bir kümede olağandır ve
tam olarak bu yüzden zincir denetimi tek tek kalem üzerinden yapılır, ortalama üzerinden değil.

Son satır bir seçenek ölçüyor. Saha kalemleri laboratuvara taşınmaz, çözümleme yerinde yapılırsa
zincir tek aktarıma iner: 78 aktarım 39'a düşer ve beklenen açık kalem 7,57'den 4,16'ya iner. Bu
kazancın karşılığı yazılmadan karar verilemez. Yerinde çözümleme, o yetkinlikteki kişinin sahaya
gitmesini gerektirir; onun yolda geçirdiği süre bütün kalemlerin saatine eklenir ve tabloda ömrü iki
yüz saniyenin altında olan kalemler o süreyi beklemez. **Zinciri kısaltmak kalemi korur, gecikme
kalemi yok eder** — ikisi aynı ölçünün iki ucudur ve hangisinin ağır bastığı ancak sürelerle
hesaplanır.

#### Özet

- Kanıt kalemi tek bir bütünlük değeriyle bağlanabilen veri parçasıdır; kurgu olayda 28 kalemin
  18'i uçucudur, ömrü bir saati aşmaz.
- Karma kalemi kendisine bağlar ve yalnız **değiştiğini** gösterir: üç kalemde uyuşmazlık vardır,
  üçü de yazma koruması olmadan açılmış ve yalnız erişim damgası tazelenmiştir.
- Gözetim zinciri saha konaklarında dört, merkezde iki, uzaktan alımda tek aktarımdır; aktarım
  başına beş alan, toplam 78 aktarım ve 390 alan demektir.
- Alanların yüzde 2,6'sının boş kalması kalemlerin yüzde 43'ünü tartışmaya açıyor: alan tek tek
  doldurulur, kalem bütün olarak savunulur.
- Saha zincirindeki dört noktanın her biri 13 kalem taşıyor; tek bir noktanın kaydının düşmesi
  kalemlerin yüzde 46'sını birden açar.

#### Sonraki Adım

Bu derste zincir kalemin **etrafında** kuruldu: kim taşıdı, ne zaman devretti, hangi karma
kaydedildi. Kalemin kendisinin nasıl alındığı hiç sorulmadı. Tabloda 28 kalemin üçü disk
imajıdır ve her biri modelde 5.400 saniyelik bir toplama süresi taşıyor — konudaki en pahalı
kalemler bunlar.

Sonraki ders o kopyalamayı **doğrulanabilirlik** cinsinden ölçer. Kopyanın kaynakla aynı olduğunu
ne kanıtlar, kaynağın hangi bölümü kopyaya girmez, kısmi bir kopya kaç kalemi kaçırır ve çalışan bir
sistemden kopya alınırken kaç kalem kopyalama sırasında değişir. Üç sayı ayrı ayrı çıkarılır; ilki
karma ile kurulur, ikincisi kapsamla, üçüncüsü ancak iki karmanın karşılaştırılmasıyla görülür.

### Disk İmajı Alma

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/disk-imaji-alma

Yazma korumalı kopyalamanın doğrulanabilirlik cinsinden ölçülmesi: 4.096 dilimlik kurgu bir kaynakta seçmeli dizin kopyası 15 kanıt kaleminin 4'ünü, mantıksal kopya 8'ini, bölüm bloğu 13'ünü, tam blok kopyası 15'ini alıyor. Çevrimdışı kopyada kaynak karması yeniden hesaplanabildiği için 15 kalemin 15'i doğrulanıyor; çalışan sistemden alınan kopyada 4.096 dilimin 303'ü değişiyor, üç karma da farklı çıkıyor ve doğrulanan kalem 9'a iniyor.

Bir önceki ders zinciri kalemin etrafında kurdu ve 28 kalemin üçünün disk imajı olduğunu, her
birinin modelde 5.400 saniyelik bir toplama süresi taşıdığını yazdı. Zincirin ilk halkası olan
**toplama** adımı orada tek bir kutu olarak geçti. Bu ders o kutuyu açar ve tek bir soru sorar:
kopyanın kaynakla aynı olduğunu ne kanıtlıyor.

Soru göründüğünden dar değildir. Karma iki değeri karşılaştırır; karşılaştırmanın anlamlı olması
için **ikinci değerin hesaplanabiliyor olması** gerekir. Kaynak kopyalama boyunca değişmezse
karması sonradan yeniden hesaplanır ve imajla karşılaştırılır. Kaynak değişiyorsa
karşılaştırılacak sabit bir değer yoktur ve karma yalnız imajı kendisine bağlar. Bu ders üç sayıyı
ayrı ayrı çıkarır: kaç kalem karma ile kaynağa bağlanıyor, kısmi kopya kaç kalemi kaçırıyor, kaç
kalem kopyalama sırasında değişiyor.

- **AI7.** Kaynak, 4.096 **dilime** bölünmüş 512 GiB'lik bir depolama birimi olarak modellenir.
  Dilim burada bir ölçüm taneciğidir, dosya sistemi bloğu değildir; gerçek bir depolama birimi
  okunmuyor.
- **AI8.** **Yazma korumalı kopyalama düzeneği** kaynağa giden yazma isteklerini geçirmez. Kaynak,
  kopyalama boyunca ve sonrasında değişmez.
- **AI9.** **Adli imaj**, kapsam içindeki bütün dilimlerin sırayla kopyasıdır. Kopyalama hızı 97
  MiB/s'dir ve kurgudur.
- **AI10.** Bir kopya **doğrulanabilirdir** ancak kaynağın karması kopyalamadan sonra yeniden
  hesaplanıp imajın karmasıyla karşılaştırılabiliyorsa.
- **AI11.** Çalışan bir sistemde her bölge kendi hızıyla değişir; hız, 1.000 saniyede değişen dilim
  sayısıdır ve kurgudur.
- **AI12.** Bir kanıt kalemi beş ardışık dilime yerleşir; kalem karması o beş dilimin
  özetlerinden hesaplanır.

#### Kaynak, Bölge ve Kapsam

```js
// adli/disk.mjs — 512 GiB'lik bir kaynagin dilim modeli, bolgeler ve kanit kalemleri.
// MODELDIR: gercek bir disk okunmuyor, dilim icerigi uretecten geliyor.
import { createHash } from "node:crypto";

export const TOHUM = 20260803, DILIM = 4096, MIB = 128, HIZ = 97;   // dilim 128 MiB, 97 MiB/s
export const SURE = Math.round(DILIM * MIB / HIZ);                  // tam kopyalama suresi (sn)
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };

// bolge -> [dilim sayisi, 1000 saniyede degisen dilim (calisan sistemde)]
export const BOLGE = {
  "bolum-tablosu": [8, 0], "dosya-sistemi-meta": [240, 9], "etkin-dosya": [2400, 26],
  "dosya-sistemi-gunlugu": [128, 14], "takas-alani": [512, 11],
  "ayrilmamis-alan": [760, 2], "bolum-disi-alan": [48, 0],
};

// Kopyalama kapsami -> hangi bolgeleri aliyor.
export const KAPSAM = {
  "secmeli dizin": ["etkin-dosya"],                        // yalniz secilen dizinler
  "mantiksal kopya": ["etkin-dosya", "dosya-sistemi-meta"],
  "bolum blogu": ["etkin-dosya", "dosya-sistemi-meta", "dosya-sistemi-gunlugu",
    "takas-alani", "ayrilmamis-alan"],
  "tam blok": Object.keys(BOLGE),
};

// kalem -> [bolge, secilen dizinin icinde mi]
export const KALEM = {
  "yapilandirma-dosyasi": ["etkin-dosya", true], "hizmet-tanimi": ["etkin-dosya", true],
  "uygulama-gunlugu": ["etkin-dosya", true], "zamanlanmis-gorev": ["etkin-dosya", true],
  "kullanici-belgesi": ["etkin-dosya", false], "onbellek-dosyasi": ["etkin-dosya", false],
  "silinmis-yukleyici-artigi": ["ayrilmamis-alan", false],
  "silinmis-gunluk-parcasi": ["ayrilmamis-alan", false],
  "gecici-dosya-kalintisi": ["ayrilmamis-alan", false],
  "silinmis-dosya-adi": ["dosya-sistemi-meta", false],
  "zaman-damgasi-kaydi": ["dosya-sistemi-meta", false],
  "gunluk-girdisi": ["dosya-sistemi-gunlugu", false],
  "takas-alanindaki-artik": ["takas-alani", false],
  "bolum-disi-yapilandirma": ["bolum-disi-alan", false],
  "bolum-tablosu-kaydi": ["bolum-tablosu", false],
};

// Dilimler bolge bolge dizilir; her kalem bes ardisik dilime yerlesir.
export function kaynak() {
  const r = uretec(TOHUM), d = [];
  for (const [b, [n]] of Object.entries(BOLGE))
    for (let i = 0; i < n; i += 1)
      d.push({ no: d.length, bolge: b, icerik: `${b}:${i}:${Math.floor(r() * 1e9)}` });
  const kalem = {};
  for (const [ad, [b, secili]] of Object.entries(KALEM)) {
    const bolgeDilim = d.filter((x) => x.bolge === b).map((x) => x.no);
    const bas = Math.floor(r() * (bolgeDilim.length - 5));
    kalem[ad] = { bolge: b, secili, dilim: bolgeDilim.slice(bas, bas + 5) };
  }
  return { dilim: d, kalem };
}

export const ozet = (s) => createHash("sha256").update(s).digest("hex").slice(0, 16);
export const butunKarma = (d) => ozet(d.map((x) => ozet(x.icerik)).join("|"));
export const kalemKarma = (d, k) => ozet(k.dilim.map((n) => ozet(d[n].icerik)).join("|"));
export const kapsanan = (kapsam, ad) => {
  const [b, secili] = KALEM[ad];
  return KAPSAM[kapsam].includes(b) && (kapsam !== "secmeli dizin" || secili);
};
```

Bölge listesi bu dersin asıl çatısıdır. Bir depolama birimi dosyalardan ibaret değildir: dosya
sistemi meta verisi silinmiş dosyaların adını ve zaman damgalarını taşır, ayrılmamış alan silinmiş
içeriğin üzerine yazılmamış kalıntısını taşır, takas alanı çalışan süreçlerin belleğinden düşmüş
parçaları taşır, bölüm tablosunun dışında kalan alan ise dosya sistemi tarafından hiç görülmez.
Kanıt kalemlerinin çoğu bu bölgelerdedir.

#### Kapsam Kaç Kalemi Kaçırıyor

```js
// adli/kapsam.mjs — kopyalama kapsaminin aldigi dilim, sure ve kacirdigi kalem.
import { kaynak, BOLGE, KAPSAM, KALEM, DILIM, MIB, HIZ, SURE, kapsanan } from "./disk.mjs";

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd());
const { dilim } = kaynak();
const secmeliPay = 0.35;                            // secilen dizinler etkin dosyalarin %35'i

console.log(`model (tohum 20260803): ${DILIM} dilim x ${MIB} MiB = ` +
  `${DILIM * MIB / 1024} GiB, ${HIZ} MiB/s, tam kopya ${SURE} sn`);
console.log(`${Object.keys(BOLGE).length} bolge, ${Object.keys(KALEM).length} kanit kalemi`);

const A = [-17, 8, 10, 9, 9, 8];
console.log("");
y(A, "kapsam", "dilim", "GiB", "sure sn", "kalem", "kacan");
for (const ad of Object.keys(KAPSAM)) {
  let n = KAPSAM[ad].reduce((a, b) => a + BOLGE[b][0], 0);
  if (ad === "secmeli dizin") n = Math.round(n * secmeliPay);
  const alinan = Object.keys(KALEM).filter((k) => kapsanan(ad, k)).length;
  y(A, ad, n, (n * MIB / 1024).toFixed(1), Math.round(n * MIB / HIZ), alinan,
    Object.keys(KALEM).length - alinan);
}

const B = [-26, -22, 15, 17, 13, 10];
console.log("");
y(B, "kalem", "bolge", "secmeli dizin", "mantiksal kopya", "bolum blogu", "tam blok");
for (const ad of Object.keys(KALEM))
  y(B, ad, KALEM[ad][0], ...Object.keys(KAPSAM).map((k) => (kapsanan(k, ad) ? "var" : "-")));

const kacan = Object.keys(KALEM).filter((k) => !kapsanan("bolum blogu", k));
console.log(`\nbolum blogunun kacirdigi kalem: ${kacan.join(", ")}`);
console.log(`mantiksal kopyanin aldigi dilim ${Math.round((BOLGE["etkin-dosya"][0] +
  BOLGE["dosya-sistemi-meta"][0]) * 100 / dilim.length)}%, aldigi kalem ` +
  `${Object.keys(KALEM).filter((k) => kapsanan("mantiksal kopya", k)).length} / ` +
  `${Object.keys(KALEM).length}`);
```

```
model (tohum 20260803): 4096 dilim x 128 MiB = 512 GiB, 97 MiB/s, tam kopya 5405 sn
7 bolge, 15 kanit kalemi

kapsam              dilim       GiB  sure sn    kalem   kacan
secmeli dizin         840     105.0     1108        4      11
mantiksal kopya      2640     330.0     3484        8       7
bolum blogu          4040     505.0     5331       13       2
tam blok             4096     512.0     5405       15       0

kalem                     bolge                   secmeli dizin  mantiksal kopya  bolum blogu  tam blok
yapilandirma-dosyasi      etkin-dosya                       var              var          var       var
hizmet-tanimi             etkin-dosya                       var              var          var       var
uygulama-gunlugu          etkin-dosya                       var              var          var       var
zamanlanmis-gorev         etkin-dosya                       var              var          var       var
kullanici-belgesi         etkin-dosya                         -              var          var       var
onbellek-dosyasi          etkin-dosya                         -              var          var       var
silinmis-yukleyici-artigi ayrilmamis-alan                     -                -          var       var
silinmis-gunluk-parcasi   ayrilmamis-alan                     -                -          var       var
gecici-dosya-kalintisi    ayrilmamis-alan                     -                -          var       var
silinmis-dosya-adi        dosya-sistemi-meta                  -              var          var       var
zaman-damgasi-kaydi       dosya-sistemi-meta                  -              var          var       var
gunluk-girdisi            dosya-sistemi-gunlugu               -                -          var       var
takas-alanindaki-artik    takas-alani                         -                -          var       var
bolum-disi-yapilandirma   bolum-disi-alan                     -                -            -       var
bolum-tablosu-kaydi       bolum-tablosu                       -                -            -       var

bolum blogunun kacirdigi kalem: bolum-disi-yapilandirma, bolum-tablosu-kaydi
mantiksal kopyanin aldigi dilim 64%, aldigi kalem 8 / 15
```

Kapsam tablosu bir eğri çiziyor ve eğri düz değildir. Seçmeli dizin kopyası kaynağın yüzde
yirmisini alıyor ve 15 kalemin **dördünü** getiriyor. Mantıksal kopya alanı üçe katlıyor, kalem
sayısı ikiye katlanıyor. Bölüm bloğu kopyası mantıksal kopyanın üstüne yüzde elli daha alan
ekliyor ve kalem sayısını 8'den **13'e** çıkarıyor. Son adım en ucuzudur: 56 dilim daha, 74
saniye daha, iki kalem daha.

Bu son adım tablodaki en öğretici satırdır. Bölüm bloğu kopyası kaynağın yüzde 98,6'sını almıştır
ve "neredeyse tam" görünür; kaçırdığı iki kalem bölüm tablosu kaydı ile bölüm dışı alandaki
yapılandırmadır. Kapsamı **oranla** ölçen bir karar, kalan yüzde 1,4'ü ihmal edilebilir sayar.
Kapsamı **kalemle** ölçen bir karar, aynı yüzde 1,4'ün iki kalem taşıdığını görür. Kanıt oranla
değil kalemle sayılır.

İkinci tablo aynı sonucu kalem kalem gösteriyor. Silinmiş dosya adı ve zaman damgası kaydı meta
veridedir; bir dosya kopyalayıcı bunları görür ama silinmiş kaydı okumaz. Silinmiş yükleyici
kalıntısı, silinmiş günlük parçası ve geçici dosya kalıntısı ayrılmamış alandadır; hiçbir dosya
kopyası bunlara ulaşamaz, çünkü dosya sistemi bu dilimleri artık bir dosyaya bağlamıyor. Kalem
sayısına bakıldığında bir dosya kopyası, kanıt kümesinin **en iyi durumda yarısını, en kötü
durumda dörtte üçünü** kapsam dışında bırakıyor.

#### Çalışan Sistemden Kopya

```js
// adli/canli.mjs — cevrimdisi ve calisan sistemden alinan kopyanin dogrulanabilirligi.
import { kaynak, BOLGE, KALEM, DILIM, SURE, butunKarma, kalemKarma } from "./disk.mjs";

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd());
const { dilim, kalem } = kaynak();
const bas = dilim.map((d) => ({ ...d }));                 // kaynagin kopya baslangicindaki hali
const r = (() => { let s = 20260804 >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; })();

// Cevrimdisi kopya: yazma korumali duzenek kaynagi degistirmiyor.
const cevrimdisi = bas.map((d) => ({ ...d }));
console.log(`cevrimdisi kopya: kaynak karmasi ${butunKarma(bas)}, imaj karmasi ` +
  `${butunKarma(cevrimdisi)}, esit ${butunKarma(bas) === butunKarma(cevrimdisi) ? "evet" : "hayir"}`);

// Calisan sistem: her bolge kendi hiziyla degisiyor, kopyalama dilim dilim ilerliyor.
const son = bas.map((d) => ({ ...d }));
const imaj = bas.map((d) => ({ ...d }));
const kopyaAni = (no) => (no + 1) * SURE / DILIM;
const oncesi = new Set(), sonrasi = new Set();
for (const [b, [n, hiz]] of Object.entries(BOLGE)) {
  const havuz = bas.filter((d) => d.bolge === b).map((d) => d.no);
  for (let e = 0; e < Math.round(hiz * SURE / 1000); e += 1) {
    const no = havuz[Math.floor(r() * n)], t = r() * SURE;
    son[no].icerik += `|yazma${e}`;
    if (t < kopyaAni(no)) { imaj[no].icerik = son[no].icerik; oncesi.add(no); }
    else sonrasi.add(no);
  }
}
for (const no of oncesi) sonrasi.delete(no);

const A = [-22, 9, 10, 16, 17];
console.log("");
y(A, "bolge", "dilim", "degisen", "kopyadan once", "kopyadan sonra");
for (const b of Object.keys(BOLGE)) {
  const h = bas.filter((d) => d.bolge === b).map((d) => d.no);
  y(A, b, h.length, h.filter((n) => son[n].icerik !== bas[n].icerik).length,
    h.filter((n) => oncesi.has(n)).length, h.filter((n) => sonrasi.has(n)).length);
}
const degisen = bas.filter((d, i) => son[i].icerik !== d.icerik).length;
y(A, "toplam", DILIM, degisen, oncesi.size, sonrasi.size);

console.log(`\ncalisan sistem: kopya basindaki kaynak ${butunKarma(bas)}, kopya sonundaki ` +
  `kaynak ${butunKarma(son)}, imaj ${butunKarma(imaj)}`);
console.log(`ucu de farkli; imajin esitlenebilecegi tek bir kaynak hali yok`);

const B = [-26, 16, 16, 12];
console.log("");
y(B, "kalem", "imaj=kopya basi", "imaj=kopya sonu", "dogrulanan");
let temiz = 0, hic = 0;
for (const [ad, k] of Object.entries(kalem)) {
  const a = kalemKarma(imaj, k) === kalemKarma(bas, k);
  const b = kalemKarma(imaj, k) === kalemKarma(son, k);
  if (a && b) temiz += 1;
  else y(B, ad, a ? "evet" : "hayir", b ? "evet" : "hayir", "hayir");
  if (!a && !b) hic += 1;
}
const N = Object.keys(KALEM).length;
console.log(`${N} kalemin ${temiz}'i iki kaynak haliyle de ayni; kopyalama sirasinda ` +
  `${N - temiz} kalem degisti ve bunlarin ${hic}'i hicbir kaynak haliyle esitlenemiyor`);
console.log(`cevrimdisi kopyada dogrulanan kalem ${N}/${N}, calisan sistemde ${temiz}/${N}`);
```

```
cevrimdisi kopya: kaynak karmasi 4123262663a3f0a2, imaj karmasi 4123262663a3f0a2, esit evet

bolge                     dilim   degisen   kopyadan once   kopyadan sonra
bolum-tablosu                 8         0               0                0
dosya-sistemi-meta          240        43               4               39
etkin-dosya                2400       139              43               96
dosya-sistemi-gunlugu       128        56              37               19
takas-alani                 512        54              43               11
ayrilmamis-alan             760        11               8                3
bolum-disi-alan              48         0               0                0
toplam                     4096       303             135              168

calisan sistem: kopya basindaki kaynak 4123262663a3f0a2, kopya sonundaki kaynak 76f5df072bc321a6, imaj 1db54a2503e2c78c
ucu de farkli; imajin esitlenebilecegi tek bir kaynak hali yok

kalem                      imaj=kopya basi imaj=kopya sonu  dogrulanan
zamanlanmis-gorev                     evet           hayir       hayir
onbellek-dosyasi                     hayir            evet       hayir
silinmis-dosya-adi                    evet           hayir       hayir
zaman-damgasi-kaydi                   evet           hayir       hayir
gunluk-girdisi                       hayir           hayir       hayir
takas-alanindaki-artik               hayir            evet       hayir
15 kalemin 9'i iki kaynak haliyle de ayni; kopyalama sirasinda 6 kalem degisti ve bunlarin 1'i hicbir kaynak haliyle esitlenemiyor
cevrimdisi kopyada dogrulanan kalem 15/15, calisan sistemde 9/15
```

İlk satır kopyalamanın kanıt tarafını tek başına taşıyor. Yazma korumalı düzeneğin arkasında
kaynak değişmez; kopyalama bittikten sonra kaynağın karması yeniden hesaplanır ve imajınkiyle
karşılaştırılır. İki değer eşittir. Kanıtlanan şey **imajın kaynağın kopyası olduğudur** ve bu,
karmanın verebileceği en güçlü ifadedir.

Çalışan sistemde aynı hesap yapılamaz. Kopyalama 5.405 saniye sürüyor ve bu sürede 4.096 dilimin
**303'ü** değişiyor. Değişimin nerede yoğunlaştığı bölge hızlarını doğrudan yansıtıyor: dosya
sistemi günlüğünün 128 diliminin 56'sı, takas alanının 512 diliminin 54'ü, ayrılmamış alanın 760
diliminin yalnız 11'i. Kanıt açısından en değerli bölge olan ayrılmamış alan, veri taşıyan
bölgeler arasında aynı zamanda en durağan olanıdır; en hareketli bölgeler ise sistemin kendi
çalışmasıyla dönen bölgelerdir.

Üç karma da farklı çıkıyor ve bu sonucun tek bir okuması vardır: **imajın eşitlenebileceği bir
kaynak hali yoktur.** İmaj, kopya başındaki kaynak da değildir, kopya sonundaki kaynak da; 135
dilimde yeni içeriği, 168 dilimde eski içeriği taşır. Ortaya çıkan şey hiçbir anda var olmamış bir
karışımdır.

Kalem tablosu bunun bedelini sayıyor: 15 kalemin altısı kopyalama sırasında değişiyor,
doğrulanan kalem 15'ten **9'a** iniyor. Burada bir uyarı gerekir. Modelin "imaj=kopya başı" sütunu
gerçek bir incelemede **görülemez**, çünkü kaynağın kopya başındaki hali artık yoktur. Elde yalnız
imajın kendi karması kalır ve o karma imajın sonradan değişmediğini gösterir — kaynakla aynı
olduğunu değil. Canlı kopyada doğrulanan kalem sayısı, ölçülemediği için sıfır sayılır.

Bu, canlı kopyayı yanlış bir adım yapmaz. Kapatılamayan bir sistemde tek seçenek odur ve bu ders
kapsamın kaç kalem getirdiğini zaten saydı. Yapılması gereken, imajın hangi koşulda alındığının
gözetim zinciri kaydına yazılmasıdır: kaynak çalışıyordu, kopyalama şu kadar sürdü, doğrulama
imajın kendisiyle sınırlıdır. Yazılmayan koşul, sonradan **hiç fark edilmemiş bir eksiklik** gibi
görünür.

#### Özet

- Bir kopyanın doğrulanabilirliği kaynağın karmasının yeniden hesaplanabilmesine bağlıdır; yazma
  korumalı düzeneğin arkasında iki karma eşit çıkar ve 15 kalemin 15'i doğrulanır.
- Kapsam eğrisi düz değildir: seçmeli dizin 4 kalem, mantıksal kopya 8, bölüm bloğu 13, tam blok
  kopyası 15 kalem getirir; son adım 56 dilim ve 74 saniyeye iki kalem eklemiştir.
- Kaynağın yüzde 98,6'sını alan bölüm bloğu kopyası iki kalem kaçırır; kapsam oranla değil kalemle
  ölçülür.
- Kanıt kalemlerinin çoğu dosya olmayan bölgelerdedir: ayrılmamış alanda 3, meta veride 2, dosya
  sistemi günlüğünde 1, takas alanında 1 kalem.
- Çalışan sistemden alınan kopyada 4.096 dilimin 303'ü değişir, üç karma da farklı çıkar ve imajın
  eşitlenebileceği bir kaynak hali kalmaz; doğrulanan kalem 15'ten 9'a iner.

#### Sonraki Adım

Bu derste bir kalem hiç görünmedi. Modelin bölge listesinde bellek yoktur ve olmaması doğrudur:
bellek diskte değildir, hiçbir kopyalama kapsamı onu almaz. Takas alanındaki artık bellekten düşmüş
parçaları taşır ama bu, belleğin kendisi değil, kalıntısıdır — ve o kalıntı kopyalama sırasında
değişen bölgeler arasındadır.

Sonraki ders bu konunun en önemli sayısını çıkarır. Kanıt kalemleri ömürlerine göre bir **uçuculuk
sırasına** dizilir ve toplama sırası bu sıraya uymadığında kaç kalemin kaybolduğu hesaplanır. Aynı
28 kalem, aynı süreler, üç farklı sıra: uçuculuğa göre, konak konak ve en büyük kalem önce. Aradaki
fark bir tercih meselesi değil, doğrudan kaybedilen kanıt sayısıdır.

### Bellek Dökümü Analizi

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/bellek-dokumu-analizi

Uçuculuk sırasının kurulması ve toplama sırasının kaybettirdiği kalemin sayılması: 28 kanıt kalemi 10 uçuculuk sınıfına dizilir, tek kişilik toplamada doğru sıra 7, konak konak toplama 12, en büyük kalem önce toplama 18 kalem kaybettirir. Üç kişilik ekip doğru sırayla 0 kayıp verir, altı kişilik ekip yanlış sırayla 13; yanlış sıra en hızlı biten toplamadır, çünkü kaybolan kalem süre harcamaz. Bellek dökümü 12 sorunun 8'ine değer, 4'ünü tek başına yanıtlar.

Bir önceki ders kaynağın yedi bölgesini saydı ve kanıt kalemlerinin çoğunun dosya olmayan
bölgelerde durduğunu gösterdi. O listede bellek yoktu. Olmaması bir eksiklik değil, tanımın kendisi:
bellek diskte değildir ve hiçbir kopyalama kapsamı ona ulaşmaz. Takas alanındaki artık bellekten
düşmüş parçaları taşır, ama parçadır ve tam da kopyalama sırasında en çok değişen bölgelerdendir.

Bellek bu konuda ayrı bir ders açıyor, çünkü ölçü birimini değiştiriyor. Disk imajında soru
"kapsam kaç kalem getiriyor" idi ve kapsam genişletilebilir bir karardı. Bellekte soru
"**ne zaman**" olur ve zaman genişletilemez. Bu ders o zamanı ölçer: kalemler ömürlerine göre
sıralanır, üç farklı toplama sırası aynı küme üzerinde koşturulur ve her sıranın kaybettirdiği kalem
sayılır. Ölçüm bir **modeldir**; **bellek dökümü çıkarma aracı ve komutu yazılmaz**, ölçülen şey
sıra ve kalem sayısıdır.

- **AI13.** Bir kalemin **ömrü**, toplanmaya başlanmazsa kaybolmadan önce geçen süredir. Ömür
  kalemin sınıfından gelir ve kurgudur.
- **AI14.** **Uçuculuk sırası** (order of volatility), kalemlerin ömürlerine göre artan sıralamasıdır:
  ağ durumu, süreç listesi, açık tanıtıcılar, oturum durumu, bellek içeriği, geçici dosyalar, sonra
  disk ve uzak kayıtlar.
- **AI15.** Toplama **sıralıdır**: bir toplayıcı aynı anda tek kalem alır ve kalemin süresi kadar
  meşguldür. Ekip büyüdükçe koşut kuyruk sayısı artar.
- **AI16.** Bir kalem, toplanmaya **başlanmadan** ömrünü doldurursa kaybolur ve süre harcamaz.
- **AI17.** Zamanın sıfır noktası müdahale ekibinin konaklara erişim kazandığı andır; tespit ve karar
  süreleri bu derste sayılmaz.
- **AI18.** Kalem kümesi ilk dersteki kümenin aynısıdır: altı konak, 28 kalem.

#### Uçuculuk Sırası

```js
// adli/sira.mjs — uculuk sirasi ve toplama sirasinin kaybettirdigi kalem MODELIDIR.
// Bellek cikarma araci ve komutu yazilmaz; olculen sey sira ve kalem sayisidir.

// sinif -> [omur(sn): toplanmaya baslanmazsa kaybolmadan once gecen sure, toplama suresi(sn)]
export const SINIF = {
  "ag-durumu": [120, 45], "surec-listesi": [240, 60], "acik-tanitici": [300, 55],
  "oturum-durumu": [600, 70], "bellek-icerigi": [900, 420], "gecici-dosya": [3600, 180],
  "akis-kaydi": [86400, 240], "uzak-gunluk": [2592000, 300],
  "disk-imaji": [604800, 5400], "yapilandirma": [604800, 90],
};

export const KONAK = {
  "sube-ucu-3": ["ag-durumu", "surec-listesi", "acik-tanitici", "oturum-durumu",
    "bellek-icerigi", "gecici-dosya", "disk-imaji", "yapilandirma"],
  "saha-dizustu-14": ["ag-durumu", "surec-listesi", "oturum-durumu", "bellek-icerigi",
    "disk-imaji"],
  "toplayici-2": ["ag-durumu", "surec-listesi", "acik-tanitici", "oturum-durumu",
    "bellek-icerigi", "disk-imaji", "yapilandirma"],
  "portal-onyuz": ["ag-durumu", "surec-listesi", "bellek-icerigi", "yapilandirma"],
  "merkez-gunluk": ["uzak-gunluk", "yapilandirma"],
  "akis-toplayici": ["akis-kaydi", "yapilandirma"],
};

export const KUME = Object.entries(KONAK).flatMap(([konak, siniflar]) =>
  siniflar.map((s) => ({ ad: `${konak}/${s}`, konak, sinif: s,
    omur: SINIF[s][0], sure: SINIF[s][1] })));

// Uc siralama: uculuge gore, konak konak (gelis sirasi), en buyuk kalem once.
export const DIZI = {
  "uculuk sirasi": [...KUME].sort((a, b) => a.omur - b.omur || a.sure - b.sure),
  "konak konak": [...KUME],
  "en buyuk once": [...KUME].sort((a, b) => b.sure - a.sure),
};

// Toplama: n toplayici paralel calisir, sirasi gelen kalem ilk bosalan toplayiciya gider.
// Kalem, omru dolduktan sonra baslanirsa kaybolur ve sure harcanmaz.
export function topla(dizi, n) {
  const bos = Array(n).fill(0), kayip = [], alinan = [];
  for (const k of dizi) {
    const i = bos.indexOf(Math.min(...bos)), bas = bos[i];
    if (bas > k.omur) kayip.push({ ...k, bas });
    else { alinan.push({ ...k, bas }); bos[i] = bas + k.sure; }
  }
  return { alinan, kayip, sure: Math.max(...bos) };
}
```

Sıralamanın üç adayı da gerçekte karşılaşılan alışkanlıklardır. **Konak konak** toplama en doğal
olanıdır: ekip bir makinenin başına geçer, o makinede ne varsa alır, sonrakine geçer. **En büyük
önce** toplama bir tedbir gibi görünür: en pahalı kalem en uzun sürüyorsa ona en erken başlanmalıdır.
**Uçuculuk sırası** ise kalemin değerine ya da boyutuna değil, yalnız ömrüne bakar.

#### Sıra Yanlışsa Kaybedilen Kalem

```js
// adli/olc.mjs — uc siralama ve iki ekip buyuklugu icin kaybedilen kalem sayimi.
import { SINIF, KUME, DIZI, topla } from "./sira.mjs";

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd());

const ucucu = KUME.filter((k) => k.omur <= 3600);
console.log(`model: ${KUME.length} kanit kalemi, ${Object.keys(SINIF).length} uculuk sinifi, ` +
  `${ucucu.length} kalem ucucu, hepsini toplamak ${KUME.reduce((a, k) => a + k.sure, 0)} sn`);

const A = [-16, 9, 9, 7, 14, 14, 14];
console.log("");
y(A, "sinif", "omur sn", "sure sn", "kalem", "1 kisi/dogru", "1 kisi/konak", "1 kisi/buyuk");
const t = Object.fromEntries(Object.keys(DIZI).map((d) => [d, topla(DIZI[d], 1)]));
for (const s of Object.keys(SINIF)) {
  const n = KUME.filter((k) => k.sinif === s).length;
  y(A, s, SINIF[s][0], SINIF[s][1], n,
    ...Object.keys(DIZI).map((d) => `${t[d].kayip.filter((k) => k.sinif === s).length} kayip`));
}
y(A, "toplam", "-", "-", KUME.length,
  ...Object.keys(DIZI).map((d) => `${t[d].kayip.length} kayip`));

const B = [-16, 7, 9, 8, 14, 11];
console.log("");
y(B, "siralama", "kisi", "alinan", "kayip", "ucucu kayip", "bitis sn");
for (const n of [1, 3, 6])
  for (const d of Object.keys(DIZI)) {
    const s = topla(DIZI[d], n);
    y(B, d, n, s.alinan.length, s.kayip.length,
      s.kayip.filter((k) => k.omur <= 3600).length, s.sure);
  }
```

```
model: 28 kanit kalemi, 10 uculuk sinifi, 18 kalem ucucu, hepsini toplamak 19790 sn

sinif             omur sn  sure sn  kalem  1 kisi/dogru  1 kisi/konak  1 kisi/buyuk
ag-durumu             120       45      4       1 kayip       3 kayip       4 kayip
surec-listesi         240       60      4       2 kayip       3 kayip       4 kayip
acik-tanitici         300       55      2       1 kayip       1 kayip       2 kayip
oturum-durumu         600       70      3       0 kayip       2 kayip       3 kayip
bellek-icerigi        900      420      4       3 kayip       3 kayip       4 kayip
gecici-dosya         3600      180      1       0 kayip       0 kayip       1 kayip
akis-kaydi          86400      240      1       0 kayip       0 kayip       0 kayip
uzak-gunluk       2592000      300      1       0 kayip       0 kayip       0 kayip
disk-imaji         604800     5400      3       0 kayip       0 kayip       0 kayip
yapilandirma       604800       90      5       0 kayip       0 kayip       0 kayip
toplam                  -        -     28       7 kayip      12 kayip      18 kayip

siralama           kisi   alinan   kayip   ucucu kayip   bitis sn
uculuk sirasi         1       21       7             7      18310
konak konak           1       16      12            12      18020
en buyuk once         1       10      18            18      17190
uculuk sirasi         3       28       0             0       6770
konak konak           3       19       9             9       6640
en buyuk once         3       10      18            18       5760
uculuk sirasi         6       28       0             0       5925
konak konak           6       25       3             3       5705
en buyuk once         6       15      13            13       5400
```

İlk tablo dersin çekirdeğidir ve son satırı üç sayı taşır: **7, 12, 18**. Aynı 28 kalem, aynı
süreler, aynı tek toplayıcı; değişen yalnız sıradır. Uçuculuk sırasında yedi kalem kaybolur, konak
konak toplamada on iki, en büyük kalem önce toplamada on sekiz. Son sayı uçucu kalemlerin
tamamıdır: 5.400 saniyelik ilk disk imajı bitene kadar ömrü bir saatin altında olan hiçbir kalem
ayakta kalmaz.

Doğru sıradaki yedi kayıp da ayrıca okunmalıdır. Sıra en iyisi olduğu halde ağ durumunun dördünden
biri, süreç listesinin dördünden ikisi, bellek içeriğinin dördünden üçü kaybolur. Nedeni tek
kişilik ekiptir: ağ durumunu almak 45 saniye sürüyor ve dört konağın dördüncüsüne sıra 135. saniyede
geliyor, ömür ise 120. **Doğru sıra kaybı en aza indirir, sıfırlamaz**; kaybı sıfırlayan şey koşut
kuyruk sayısıdır.

İkinci tablo bu ikisini ayırıyor ve karşılaştırma tek yönlü değildir. Üç kişilik ekip doğru sırayla
çalıştığında kayıp **sıfırdır** — üç kişi bu kurgu kümede yeterlidir. Altı kişilik ekip yanlış
sırayla çalıştığında kayıp **on üçtür**. İki kat insan, yanlış sırayı düzeltmiyor; sıra ekip
büyüklüğünden daha belirleyicidir, çünkü sıra ömrü tüketen şeydir, insan sayısı ise yalnız tüketme
hızını değiştirir.

Son sütun en aldatıcı olanıdır. En hızlı biten toplama, en çok kalem kaybeden toplamadır: tek
kişilik ekipte "en büyük önce" 17.190 saniyede biterken doğru sıra 18.310 saniye sürer. Fark bir
verimlilik değil, bir muhasebe yanılsamasıdır — **kaybolan kalem süre harcamaz.** Bir toplama
işleminin erken bitmesi, ancak alınan kalem sayısıyla birlikte okunduğunda bir şey anlatır.

#### Konağa Varış Süresi

```js
// adli/varis.mjs — konaga erisim gecikmesinin dogru siradaki kayba etkisi.
import { KUME, DIZI } from "./sira.mjs";

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd());
const UZAK = ["sube-ucu-3", "saha-dizustu-14"];     // ekibin yolda oldugu iki saha konagi

// Kalem, konaga varildiktan sonra ve omru dolmadan once baslanmalidir.
function topla(dizi, n, gecikme) {
  const bos = Array(n).fill(0), kayip = [];
  for (const k of dizi) {
    const varis = UZAK.includes(k.konak) ? gecikme : 0;
    const i = bos.indexOf(Math.min(...bos)), bas = Math.max(bos[i], varis);
    if (bas > k.omur) kayip.push(k);
    else bos[i] = bas + k.sure;
  }
  return kayip;
}

const A = [-12, 9, 9, 12, 14];
y(A, "gecikme sn", "kisi", "kayip", "uzak konak", "merkez konak");
for (const g of [0, 600, 1200, 2400])
  for (const n of [3, 6]) {
    const k = topla(DIZI["uculuk sirasi"], n, g);
    y(A, g, n, k.length, k.filter((x) => UZAK.includes(x.konak)).length,
      k.filter((x) => !UZAK.includes(x.konak)).length);
  }
const uzakUcucu = KUME.filter((k) => UZAK.includes(k.konak) && k.omur <= 3600).length;
console.log(`\nuzak iki konaktaki ucucu kalem ${uzakUcucu}; 2400 saniyelik gecikmede ekip ` +
  `buyuklugu kaybi degistirmiyor`);
```

```
gecikme sn       kisi    kayip  uzak konak  merkez konak
0                   3        0           0             0
0                   6        0           0             0
600                 3        6           5             1
600                 6        5           5             0
1200                3        9           9             0
1200                6        9           9             0
2400                3        9           9             0
2400                6        9           9             0

uzak iki konaktaki ucucu kalem 10; 2400 saniyelik gecikmede ekip buyuklugu kaybi degistirmiyor
```

On yedinci varsayım zamanın sıfır noktasını "ekibin konaklara erişim kazandığı an" diye tanımladı ve
bütün konaklar için aynı anı kullandı. İki konak sahadadır; ekip oraya yolda olur. Altı yüz
saniyelik bir yol, doğru sırayla çalışan üç kişilik ekipte kaybı sıfırdan **altıya** çıkarıyor. Bin
iki yüz saniyede kayıp **dokuza** çıkıyor ve orada duruyor: iki saha konağındaki on uçucu kalemin
dokuzu ekip varmadan önce ömrünü dolduruyor, ayakta kalan tek kalem ömrü 3.600 saniye olan geçici
dosyadır.

Bu tablonun iki satırı ayrıca okunmalıdır. Altı yüz saniyede üç kişilik ekip altı, altı kişilik ekip
beş kalem kaybediyor; aradaki tek kalem merkezdedir ve uzak konağı bekleyen bir toplayıcının
kuyruğunda kalmıştır. Bin iki yüz saniyeden sonra ekip büyüklüğü hiçbir şeyi değiştirmiyor, çünkü
kaybedilen kalemler kimse varmadan önce kaybolmuştur. **Gecikme belli bir noktadan sonra ekip
büyüklüğünü ölçüsüz kılar.**

Birinci ders zinciri kısaltmanın beklenen açık kalemi 7,57'den 4,16'ya indirdiğini hesaplamış ve
bunun karşılığının "yetkin kişinin sahaya gitme süresi" olduğunu yazmıştı. Bu tablo o karşılığın
sayısıdır: bin iki yüz saniyelik bir yol, dokuz kalem eder.

#### Yalnız Bellekten Yanıtlanan Soru

```js
// adli/kaynak.mjs — hangi soru hangi kaynaktan yanitlaniyor. MODELDIR.
const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd());

// soru -> [bellek dokumu, disk imaji, uzak gunluk]  1: yanitlar, 0: yanitlamaz
const SORU = {
  "hangi surecler calisiyordu": [1, 0, 0],
  "surecin komut satiri neydi": [1, 0, 1],
  "hangi baglantilar etkindi": [1, 0, 1],
  "bellekte cozulmus icerik": [1, 0, 0],
  "etkin oturum belirteci": [1, 0, 0],
  "yuklu cekirdek modulu": [1, 1, 0],
  "yururlukteki yapilandirma": [1, 0, 0],
  "diskteki yapilandirma": [0, 1, 0],
  "dosya ne zaman degisti": [0, 1, 0],
  "silinmis dosyanin icerigi": [0, 1, 0],
  "kim oturum acti": [1, 1, 1],
  "kim hangi kayda eristi": [0, 0, 1],
};
const KAYNAK = ["bellek dokumu", "disk imaji", "uzak gunluk"];

const A = [-27, 15, 12, 13, 10];
y(A, "soru", ...KAYNAK, "kaynak");
for (const [s, v] of Object.entries(SORU))
  y(A, s, ...v.map((x) => (x ? "var" : "-")), v.reduce((a, x) => a + x, 0));

const yalniz = KAYNAK.map((_, i) =>
  Object.values(SORU).filter((v) => v[i] === 1 && v.reduce((a, x) => a + x, 0) === 1).length);
console.log("");
KAYNAK.forEach((k, i) => console.log(`${k}: dokundugu soru ` +
  `${Object.values(SORU).filter((v) => v[i]).length}, yalniz kendisinin yanitladigi ${yalniz[i]}`));
console.log(`iki ya da uc kaynaktan yanitlanan soru: ` +
  `${Object.values(SORU).filter((v) => v.reduce((a, x) => a + x, 0) > 1).length} / ` +
  `${Object.keys(SORU).length}`);
```

```
soru                         bellek dokumu  disk imaji  uzak gunluk    kaynak
hangi surecler calisiyordu             var           -            -         1
surecin komut satiri neydi             var           -          var         2
hangi baglantilar etkindi              var           -          var         2
bellekte cozulmus icerik               var           -            -         1
etkin oturum belirteci                 var           -            -         1
yuklu cekirdek modulu                  var         var            -         2
yururlukteki yapilandirma              var           -            -         1
diskteki yapilandirma                    -         var            -         1
dosya ne zaman degisti                   -         var            -         1
silinmis dosyanin icerigi                -         var            -         1
kim oturum acti                        var         var          var         3
kim hangi kayda eristi                   -           -          var         1

bellek dokumu: dokundugu soru 8, yalniz kendisinin yanitladigi 4
disk imaji: dokundugu soru 5, yalniz kendisinin yanitladigi 3
uzak gunluk: dokundugu soru 4, yalniz kendisinin yanitladigi 1
iki ya da uc kaynaktan yanitlanan soru: 4 / 12
```

On iki sorunun yalnız dördü birden çok kaynaktan yanıtlanıyor. Kalan sekizinde tek bir kaynak
vardır ve o kaynak toplanmamışsa soru **yanıtsız kalır** — başka bir kalemden çıkarım yapılamaz.
Bellek dökümü sekiz soruya değiyor ve dördünü tek başına yanıtlıyor; bu dördü de yalnız çalışan
bir sistemde yanıtı olan sorulardır.

Tabloda birbirine karıştırılan iki satır var: **yürürlükteki yapılandırma** ile **diskteki
yapılandırma**. İkisi ayrı sorudur ve ayrı kaynaklardan yanıtlanır. Bir sürecin belleğe okuduğu
ayar, diskteki dosya sonradan değiştirilmişse ondan farklıdır; bir olayda hangisinin geçerli olduğu
tam olarak sorulan şeydir. Disk imajı bu soruya yanıt veremez, yalnız ikinci soruya verir. Raporda
"yapılandırma şuydu" diye yazılan bir satır, hangi sorunun yanıtı olduğunu söylemiyorsa ölçülemez
bir iddiadır.

#### Özet

- Uçuculuk sırası kalemlerin ömrüne göre artan sıralamasıdır; kurgu kümede 28 kalemin 18'i uçucudur
  ve hepsini toplamak 19.790 saniye tutar.
- Aynı küme üzerinde tek toplayıcıyla doğru sıra 7, konak konak toplama 12, en büyük kalem önce
  toplama 18 kalem kaybettirir; sonuncusu uçucu kalemlerin tamamıdır.
- Doğru sıra kaybı en aza indirir, sıfırlamaz: iki saha konağına 1.200 saniyelik varış gecikmesi,
  doğru sırayla çalışan ekipte kaybı 0'dan 9'a çıkarır ve o noktadan sonra ekip büyüklüğü sonucu
  değiştirmez.
- Üç kişi doğru sırayla 0 kayıp verir, altı kişi yanlış sırayla 13 kayıp verir; sıra ekip
  büyüklüğünden daha belirleyicidir.
- En hızlı biten toplama en çok kalem kaybedenidir, çünkü kaybolan kalem süre harcamaz; bitiş
  süresi ancak alınan kalem sayısıyla birlikte okunur.
- Bellek dökümü 12 sorunun 8'ine değer ve 4'ünü tek başına yanıtlar; sorulardan yalnız 4'ü birden
  çok kaynaktan yanıtlanabilir.

#### Sonraki Adım

Bu ders kalemleri **ne zaman** toplandıklarına göre sıraladı. Toplandıktan sonra her kalem kendi
zaman damgalarını taşır: dosya değişim anları, oturum açma anları, akış kaydındaki bağlantı anları.
İncelemenin bir sonraki adımı bu damgaları tek bir çizgi üzerinde birleştirmektir ve orada
sessiz bir varsayım vardır — bütün kaynakların saatinin aynı olduğu.

Sonraki ders o varsayımı sınar. Üç kaynağın olayları tek bir zaman çizelgesinde birleştirilir, her
kaynağın saat kayması ölçülür ve iki sayı çıkarılır: kaç olay yanlış sıraya giriyor ve kayma
düzeltildiğinde kaç olay yer değiştiriyor. Sıralamanın bozulması bir gecikme değil, bir **neden
sonuç** hatasıdır: yanlış sırada okunan iki olay, birbirini doğuran iki olay gibi görünür.

### Zaman Çizelgesi Oluşturma

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/zaman-cizelgesi-olusturma

Üç kaynağın olaylarının tek çizelgede birleştirilmesi ve saat kaymasının sıralamayı bozması: 54 olayın oluşturduğu 1.431 çiftte ham birleştirme 35 ters çift üretiyor, 54 olayın 33'ü yanlış konuma giriyor ve en büyük kayma 243 saniye. On dokuz çapa olayıyla kayma kestirilip düzeltildiğinde ters çift 1'e, yanlış konum 2'ye iniyor ve düzeltme 34 olayın yerini değiştiriyor. Ters çiftlerin 35'inin 35'i iki ayrı kaynaktan gelir; kayma bir kaynağın kendi içindeki sırayı hiç bozmaz.

Bir önceki ders kalemlerin **ne zaman toplandığını** ölçtü. Toplanan her kalem kendi zaman
damgalarını taşır: dosya değişim anları, oturum açma anları, akış kaydındaki bağlantı anları.
İncelemenin bir sonraki adımı bu damgaları tek bir çizgi üzerinde birleştirmektir; çıkan şeye
**zaman çizelgesi** denir ve raporun omurgasıdır.

Çizelgenin taşıdığı iddia sıradır. "Önce yapılandırma değişti, sonra dış bağlantı kuruldu" cümlesi
bir zaman bilgisi değil, bir **neden sonuç** önermesidir; sırası ters çevrilirse tersini söyler.
Sıranın dayandığı sessiz varsayım ise bütün kaynakların aynı saati okuduğudur. Bu ders o varsayımı
sınar: üç kaynağın olayları birleştirilir, kaç olayın yanlış sıraya girdiği sayılır, kayma
kestirilip düzeltilir ve düzeltmenin kaç olayı yerinden oynattığı ölçülür. Olaylar ve saatler
**kurgudur**.

- **AI19.** **Zaman çizelgesi**, farklı kaynaklardaki olayların tek bir eksende sıralanmasıdır.
  Çizelgenin taşıdığı bilgi zaman değerleri değil, **sıradır**.
- **AI20.** Her kaynağın saati kendi **kaymasını** taşır: sabit bir sapma ve saniye başına biriken
  bir sürüklenme. İkisi de kurgudur.
- **AI21.** **Çapa olayı**, iki kaynakta birden kaydedilmiş aynı olaydır. Kayma kestirimi yalnız
  çapa olaylarından çıkarılır.
- **AI22.** Merkez günlüğü başvuru saatidir. Sıralama göreli bir sorudur; mutlak doğruluk
  gerekmez, kaynakların birbirine göre hizalanması yeter.
- **AI23.** **Ters çift**, gerçekte biri önce olduğu halde çizelgede öteki önce görünen olay
  çiftidir. Sıralama hatasının ölçüsü budur.
- **AI24.** Gerçek zamanlar bu modelde bilinir. Gerçek bir incelemede bilinmez; oradaki tek dayanak
  çapa olaylarıdır.

#### Üç Saat, Tek Çizelge

```js
// adli/zaman.mjs — uc kaynagin kurgu olay kayitlari ve saat kaymasi MODELIDIR.
// Gercek kurum, adres ve olay adi yazilmaz; saatler kurgudur.

export const TOHUM = 20260805, N = 54, PENCERE = 7200;   // iki saatlik pencere
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };

// kaynak -> [sabit sapma(sn), suruklenme(sn/sn)]  merkez gunlugu basvuru saatidir
export const KAYNAK = {
  "merkez-gunluk": [0, 0], "uc-nokta-kaydi": [-214, -0.0042], "akis-toplayici": [96, 0.0013],
};
export const TUR = ["oturum-acma", "yapilandirma-degisikligi", "dis-baglanti",
  "surec-baslatma", "dosya-yazma", "yetki-yukseltme"];

// Bildirilen zaman: kaynagin kendi saatinde okunan deger.
export const bildir = (k, t) =>
  Math.round(t + KAYNAK[k][0] + KAYNAK[k][1] * t);

// Olaylar gercek zamanlariyla uretilir; capa olaylari iki kaynakta birden kaydedilir.
export function olaylar() {
  const r = uretec(TOHUM), ad = Object.keys(KAYNAK), liste = [];
  for (let i = 0; i < N; i += 1) {
    const t = Math.floor(r() * PENCERE), k = ad[Math.floor(r() * 3)];
    liste.push({ no: i, t, kaynak: k, tur: TUR[Math.floor(r() * TUR.length)],
      capa: k !== "merkez-gunluk" && r() < 0.3 });
  }
  liste.sort((a, b) => a.t - b.t || a.no - b.no);
  const kayit = [];
  for (const o of liste) {
    kayit.push({ ...o, bildirilen: bildir(o.kaynak, o.t) });
    if (o.capa) kayit.push({ ...o, kaynak: "merkez-gunluk", ikincil: true,
      bildirilen: bildir("merkez-gunluk", o.t) });
  }
  return kayit;
}

// Ters cift: gercekte a once oldugu halde cizelgede b once gorunen olay ciftleri.
export function tersCift(dizi) {
  let n = 0;
  for (let i = 0; i < dizi.length; i += 1)
    for (let j = i + 1; j < dizi.length; j += 1)
      if (dizi[i].t > dizi[j].t) n += 1;
  return n;
}
export const siraya = (kayit, zaman) =>
  [...kayit].sort((a, b) => zaman(a) - zaman(b) || a.no - b.no);
```

Kayma iki bileşenden oluşuyor ve ikisi ayrı davranır. **Sabit sapma** kaynağın saatinin baştan beri
kaç saniye ileri ya da geri olduğudur; bütün kayıtları aynı miktarda kaydırır. **Sürüklenme** ise
saatin biriken hatasıdır; kaydırma miktarı zamanla büyür. Sabit sapma tek bir sayıyla düzeltilir,
sürüklenme düzeltilemez — ancak ölçülüp artık hata olarak yazılabilir.

#### Ham Çizelge ve Çapa ile Düzeltme

```js
// adli/cizelge.mjs — ham birlestirme, capa ile duzeltme ve kalan ters cift.
import { KAYNAK, N, olaylar, tersCift, siraya } from "./zaman.mjs";

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd());
const K = olaylar();
const birincil = K.filter((k) => !k.ikincil);
const capa = K.filter((k) => k.capa);

const A = [-18, 8, 8, 15, 16];
y(A, "kaynak", "kayit", "capa", "gercek sapma", "capa kestirimi");
const kestirim = {};
for (const k of Object.keys(KAYNAK)) {
  const c = capa.filter((x) => x.kaynak === k && !x.ikincil);
  const es = c.map((x) => x.bildirilen -
    capa.find((z) => z.no === x.no && z.ikincil).bildirilen);
  kestirim[k] = es.length ? Math.round(es.reduce((a, b) => a + b, 0) / es.length) : 0;
  y(A, k, birincil.filter((x) => x.kaynak === k).length, c.length, KAYNAK[k][0], kestirim[k]);
}

const ham = siraya(birincil, (o) => o.bildirilen);
const duz = siraya(birincil, (o) => o.bildirilen - kestirim[o.kaynak]);
const dogru = siraya(birincil, (o) => o.t);
const yer = (a, b) => a.filter((o, i) => b[i].no !== o.no).length;

console.log("");
const B = [-24, 11, 14, 16];
y(B, "cizelge", "ters cift", "yanlis konum", "en buyuk kayma");
const ciftler = (N * (N - 1)) / 2;
for (const [ad, d, z] of [["ham birlestirme", ham, (o) => o.bildirilen],
  ["capa ile duzeltilmis", duz, (o) => o.bildirilen - kestirim[o.kaynak]],
  ["gercek zaman", dogru, (o) => o.t]])
  y(B, ad, tersCift(d), yer(d, dogru), Math.max(...d.map((o) => Math.abs(z(o) - o.t))));
console.log(`${N} olay, ${ciftler} cift, ${capa.length / 2} capa olayi`);
console.log(`ham cizelgede ters cift orani %${(tersCift(ham) * 100 / ciftler).toFixed(1)}, ` +
  `duzeltmeden sonra %${(tersCift(duz) * 100 / ciftler).toFixed(1)}`);
console.log(`duzeltme ${yer(ham, duz)} olayin cizelgedeki yerini degistiriyor`);
```

```
kaynak               kayit    capa   gercek sapma  capa kestirimi
merkez-gunluk           13       0              0               0
uc-nokta-kaydi          25      12           -214            -230
akis-toplayici          16       7             96             100

cizelge                   ters cift  yanlis konum  en buyuk kayma
ham birlestirme                  35            33             243
capa ile duzeltilmis              1             2              15
gercek zaman                      0             0               0
54 olay, 1431 cift, 19 capa olayi
ham cizelgede ters cift orani %2.4, duzeltmeden sonra %0.1
duzeltme 34 olayin cizelgedeki yerini degistiriyor
```

İki sayı arasındaki fark bu dersin ilk sonucudur. Ham çizelgede ters çift oranı yüzde **2,4**'tür
ve küçük görünür; aynı çizelgede 54 olayın **33'ü** yanlış konumdadır, yani olayların yüzde 61'i.
Bu iki oran çelişmiyor: birkaç yüz saniyelik bir kayma, olayların çoğunu birkaç sıra kaydırır ama
yalnız zaman aralığı kaymadan küçük olan çiftleri tersine çevirir. Çizelgeye "olaylar aşağı yukarı
doğru sırada" diye bakan bir okuma yüzde 97,6'lık orana dayanır; raporda kullanılan cümleler ise tam
olarak birbirine yakın olaylar hakkında kurulur.

Çapa ile düzeltme ters çifti 35'ten **1'e**, yanlış konumu 33'ten **2'ye** indiriyor. Kalan bir
ters çift bir artıktır ve nedeni tabloda görünüyor: uç nokta kaydının gerçek sapması −214 iken çapa
kestirimi −230'dur. On altı saniyelik yanlılık sürüklenmeden gelir. Sabit bir sayıyla yapılan
düzeltme, pencerenin ortasında doğru, iki ucunda yanlıştır; en büyük kalan kayma 15 saniyedir. Bu
sayı raporda **çözünürlük** olarak yazılmalıdır: on beş saniyeden yakın iki olayın sırası bu
çizelgeyle kanıtlanamaz.

Son satır düzeltmenin ölçeğini veriyor: **34 olayın** çizelgedeki yeri değişiyor. Düzeltmeden önce
yazılmış bir anlatı, düzeltmeden sonra otuz dört noktada farklı bir metin olurdu.

#### Çapa Sayısı ve Düzeltmenin Biçimi

```js
// adli/capa.mjs — capa sayisinin ve duzeltme bicimlerinin kalan hataya etkisi.
import { KAYNAK, olaylar, tersCift, siraya } from "./zaman.mjs";

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd());
const K = olaylar(), birincil = K.filter((o) => !o.ikincil);
// Capa cifti: (basvuru saatinde okunan zaman, iki kayit arasindaki fark).
const cift = (k) => K.filter((o) => o.capa && o.kaynak === k && !o.ikincil).map((o) => {
  const m = K.find((z) => z.no === o.no && z.ikincil);
  return [m.bildirilen, o.bildirilen - m.bildirilen];
});

const sabit = (c) => [Math.round(c.reduce((a, [, d]) => a + d, 0) / c.length), 0];
// Dogrusal uydurma: fark = sapma + suruklenme * zaman.
function dogrusal(c) {
  const n = c.length, st = c.reduce((a, [t]) => a + t, 0), sd = c.reduce((a, [, d]) => a + d, 0);
  const stt = c.reduce((a, [t]) => a + t * t, 0), std = c.reduce((a, [t, d]) => a + t * d, 0);
  const b = (n * std - st * sd) / (n * stt - st * st);
  return [(sd - b * st) / n, b];
}
const geri = ([a, b]) => (o) => (o.bildirilen - a) / (1 + b);

const A = [-7, 15, 12, 14, 14, 13];
y(A, "capa", "sabit kestirim", "sabit ters", "sabit kayma", "dogrusal ters", "dogr. kayma");
for (const n of [2, 4, 8, 12]) {
  const p = {}, q = {};
  for (const k of Object.keys(KAYNAK)) {
    const c = cift(k).slice(0, n);
    p[k] = c.length ? sabit(c) : [0, 0];
    q[k] = c.length > 1 ? dogrusal(c) : [0, 0];
  }
  const d1 = siraya(birincil, (o) => geri(p[o.kaynak])(o));
  const d2 = siraya(birincil, (o) => geri(q[o.kaynak])(o));
  const kayma = (m) => Math.round(Math.max(...birincil.map((o) =>
    Math.abs(geri(m[o.kaynak])(o) - o.t))));
  y(A, n, p["uc-nokta-kaydi"][0], tersCift(d1), kayma(p),
    tersCift(d2), kayma(q));
}
console.log(`\ngercek sapma ${KAYNAK["uc-nokta-kaydi"][0]} sn, gercek suruklenme ` +
  `${KAYNAK["uc-nokta-kaydi"][1]} sn/sn; uc nokta kaydinda ${cift("uc-nokta-kaydi").length} ` +
  `capa var, akis toplayicisinda ${cift("akis-toplayici").length}`);
```

```
capa    sabit kestirim  sabit ters   sabit kayma dogrusal ters  dogr. kayma
2                 -218           0            25             0            4
4                 -221           0            22             0            1
8                 -226           1            17             0            1
12                -230           1            15             0            1

gercek sapma -214 sn, gercek suruklenme -0.0042 sn/sn; uc nokta kaydinda 12 capa var, akis toplayicisinda 7
```

İkinci sütun beklenenin tersine gidiyor. Çapa sayısı ikiden on ikiye çıkarken sabit kestirim
−218'den −230'a kayıyor, yani gerçek sapma olan −214'ten **uzaklaşıyor**. Bu bir hesap hatası
değildir: sabit kestirim bütün pencerenin ortalamasıdır ve sürüklenme pencere boyunca birikir. Daha
çok çapa, yanlış bir modelin kestirimini doğru yapmaz; onu yalnız daha kararlı biçimde yanlış yapar.
Kalan kayma da bunu gösteriyor — 25 saniyeden 15 saniyeye iniyor ve orada duruyor.

İki katsayılı düzeltme aynı çapa kümesiyle farklı bir sonuç veriyor. Fark, zamanın doğrusal bir
işlevi olarak uydurulduğunda iki çapayla bile kalan kayma 4 saniyeye, dört çapadan sonra 1 saniyeye
iniyor. Aradaki fark veri miktarı değil, **modelin biçimidir**: sürüklenmesi olan bir saati sabit
bir sayıyla düzeltmek, eğimli bir doğruyu yatay bir çizgiyle temsil etmektir.

Ters çift sütunları bu ölçekte karar taşımıyor ve bunu yazmak gerekir. Otuz beşten sıfır ile bir
arasına inmiş bir sayıda 0 ile 1 farkı tek bir çiftin hangi tarafa düştüğüdür; asıl bilgi kalan
kayma sütunundadır. Bir çizelge "ters çift kalmadı" diye değil, "on beş saniyeden yakın olayların
sırası kanıtlanamaz" diye raporlanır.

Doğrusal düzeltmenin bir koşulu vardır ve tablonun okumadığı yerde durur: çapa olaylarının
pencereye **yayılmış** olması. Hepsi pencerenin bir ucunda toplanırsa eğim kestirimi kararsız olur
ve düzeltme öteki uçta sabit düzeltmeden daha kötü davranır. Belirleyici olan çapa sayısı değil,
çapaların dağılımıdır.

#### Tersine Dönen Çiftler

```js
// adli/cift.mjs — ham cizelgede tersine donen ciftler ve dogurdugu yanlis cikarim.
import { olaylar, siraya } from "./zaman.mjs";

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd());
const birincil = olaylar().filter((k) => !k.ikincil);
const ham = siraya(birincil, (o) => o.bildirilen);

const ters = [];
for (let i = 0; i < ham.length; i += 1)
  for (let j = i + 1; j < ham.length; j += 1)
    if (ham[i].t > ham[j].t) ters.push([ham[i], ham[j], ham[i].t - ham[j].t]);
ters.sort((a, b) => b[2] - a[2]);

const KOD = { "merkez-gunluk": "M", "uc-nokta-kaydi": "U", "akis-toplayici": "A" };
const A = [-28, -28, 11, 13];
y(A, "cizelgede once gorunen", "cizelgede sonra gorunen", "ham fark", "gercek fark");
for (const [a, b] of ters.slice(0, 5))
  y(A, `${KOD[a.kaynak]}/${a.tur}`, `${KOD[b.kaynak]}/${b.tur}`,
    `${b.bildirilen - a.bildirilen} sn`, `${b.t - a.t} sn`);

const farkli = ters.filter(([a, b]) => a.kaynak !== b.kaynak).length;
console.log(`\n${ters.length} ters ciftin ${farkli}'i iki ayri kaynaktan geliyor, ` +
  `${ters.length - farkli}'i ayni kaynaktan`);
console.log(`en buyuk tersine donme ${ters[0][2]} saniyelik gercek farki gizliyor`);
```

```
cizelgede once gorunen      cizelgede sonra gorunen        ham fark  gercek fark
U/dis-baglanti              A/dis-baglanti                    18 sn      -306 sn
U/dis-baglanti              M/yapilandirma-degisikligi         9 sn      -224 sn
U/yapilandirma-degisikligi  A/surec-baslatma                 141 sn      -200 sn
U/surec-baslatma            A/yapilandirma-degisikligi       145 sn      -191 sn
U/dis-baglanti              A/oturum-acma                    156 sn      -179 sn

35 ters ciftin 35'i iki ayri kaynaktan geliyor, 0'i ayni kaynaktan
en buyuk tersine donme 306 saniyelik gercek farki gizliyor
```

Son satırdan bir önceki cümle bu dersin en kullanışlı kuralını veriyor: **35 ters çiftin 35'i iki
ayrı kaynaktan gelir, hiçbiri aynı kaynağın içinde değildir.** Bunun nedeni yapısaldır. Bir
kaynağın bütün kayıtları aynı saatten okunur; o saat ne kadar yanlış olursa olsun kendi
kayıtlarını aynı miktarda kaydırır ve iç sıralarını korur. Sıra bozulması yalnız kaynaklar
**arasında** doğar.

Bu, incelemeye doğrudan uygulanabilir bir ayrım verir. Tek bir kaynağın içindeki sıra kaymadan
bağımsızdır ve ek bir dayanak istemez. İki kaynaktan gelen iki olay arasındaki sıra ise bir
**iddiadır** ve dayanağı ancak kayma ölçüldükten sonra kurulur. Raporda bu ikisi aynı cümle
kalıbıyla yazılırsa, ikincisinin taşıdığı belirsizlik görünmez olur.

Tablonun ilk satırı bunun somut karşılığıdır. Uç noktadaki dış bağlantı kaydı ham çizelgede akış
toplayıcısındaki dış bağlantı kaydından 18 saniye önce görünüyor; gerçekte 306 saniye **sonradır**.
Bu iki satırı yan yana okuyan bir inceleme, uçtaki bağlantının akış kaydını doğurduğunu düşünür —
oysa sıralama tam tersidir ve iki kayıt beş dakikadan uzun bir aralıkla ayrılmıştır. Kaymanın
ürettiği hata bir gecikme değil, bir **yön** hatasıdır.

#### Özet

- Zaman çizelgesinin taşıdığı bilgi zaman değerleri değil sıradır; sıra bir neden sonuç önermesi
  kurar ve ters çevrilirse tersini söyler.
- Ham birleştirmede 1.431 çiftin 35'i ters çıkar (yüzde 2,4), ama 54 olayın 33'ü yanlış konumdadır;
  düşük çift oranı çizelgenin doğru olduğu anlamına gelmez.
- On dokuz çapa olayıyla kestirilen düzeltme ters çifti 1'e, yanlış konumu 2'ye indirir ve 34 olayın
  çizelgedeki yerini değiştirir.
- Sabit sapma kestirimi sürüklenmeyi düzeltemez: gerçek sapma −214 iken kestirim −230'dur ve kalan
  en büyük kayma 15 saniyedir; bu sayı çizelgenin çözünürlüğüdür.
- Çapa sayısını artırmak sabit kestirimi gerçek sapmaya yaklaştırmaz (−218'den −230'a gider);
  zamanın doğrusal bir işlevi olarak uydurulan düzeltme iki çapayla kalan kaymayı 4 saniyeye
  indirir. Belirleyici olan çapa sayısı değil, modelin biçimi ve çapaların pencereye yayılımıdır.
- Ters çiftlerin tamamı iki ayrı kaynaktan gelir; bir kaynağın kendi içindeki sıra kaymadan
  etkilenmez, kaynaklar arası sıra ise ölçülmeden iddia edilemez.

#### Sonraki Adım

Bu derste olaylar hazır **kayıt** olarak geldi: her birinin bir türü, bir kaynağı ve bir zamanı
vardı. Gerçek bir incelemede kayıtların bir bölümü böyle hazır değildir; sistemin kendi işleyişi
için tuttuğu yapılardan çıkarılır. Bir yapılandırma deposundaki girdi, bir dosya sistemi meta veri
kaydı, bir kısayol, bir önbellek girdisi — bunların hiçbiri "olay günlüğü" olmak üzere yazılmamıştır
ama sıralanabilir bir iz bırakır.

Sonraki ders bu yapıları **kanıt değeri** cinsinden ele alır. Her yapı bir soruya yanıt verir, ama
hangi soruya yanıt verdiği yapıdan yapıya değişir: bazısı bir şeyin olduğunu doğrudan gösterir,
bazısı ancak bir çıkarım taşır, bazısı ise makinenin olağan kullanımında da oluşur. Bu sonuncusu
sayılmadan yazılan her cümle, taban gürültüsünü bulgu diye rapora sokar.

### Yapı ve Kayıt İncelemesi

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/yapi-ve-kayit-incelemesi

Sistem yapılarından çıkan izin kanıt değerinin ölçülmesi: 12 yapının 7'si doğrudan, 5'i çıkarım sınıfındadır ve tabanları 268 makinelik kurgu filoda 4 ile 187 arasında değişir. Yedi iddianın 2'si ayırt edici, 4'ü zayıf, 1'i gürültüdür; tek yapıya dayanan iddia 187 temiz makinede de doğrudur. Üç dayanağı olan bir iddia, üçü de çıkarım sınıfındaysa iki dayanaklı bir iddiadan daha zayıf çıkıyor ve bağımsızlık varsayımı hesabı alt sınır yapıyor.

Bir önceki ders olayları hazır **kayıt** olarak aldı: her birinin bir türü, bir kaynağı ve bir
zamanı vardı. Bir incelemede toplanan izin önemli bir bölümü böyle hazır gelmez. Sistem kendi
işleyişi için tuttuğu yapılara yazar — bir yapılandırma deposu girdisi, bir dosya sistemi meta veri
kaydı, bir kısayol, bir önbellek girdisi. Bunların hiçbiri günlük olsun diye yazılmamıştır, ama
sıralanabilir ve okunabilir bir iz bırakır.

Bu ders o izleri **kanıt değeri** cinsinden ele alır ve ölçü birimi bir orandır: aynı izi taşıyan
temiz makine sayısı. Bir iz ne kadar seyrekse iddiayı o kadar ayırt eder; bir iz makinelerin
çoğunda zaten varsa iddiayı hiç ayırt etmez. Rapora giren cümlelerin çoğu bu ikisi arasında bir
yerde durur ve nerede durduğu yazılmadıkça okunamaz. Filo, taban sayıları ve iddia listesi
**kurgudur**.

- **AI25.** **Sistem yapısı**, olay kaydı olarak tutulmayan ama sistemin işleyişi gereği iz bırakan
  bir veri yapısıdır.
- **AI26.** Bir yapı **doğrudan** sınıftadır ancak yalnız iddia edilen olay gerçekleştiği için
  oluşuyorsa. Başka nedenlerle de oluşabiliyorsa **çıkarım** sınıfındadır.
- **AI27.** **Taban**, aynı izi taşıyan temiz makine sayısıdır. Kurgu filo 268 makinedir; taban
  değerleri elle verilmiştir, gerçek bir filo taranmadı.
- **AI28.** Bir iddianın **ayırt ediciliği**, aynı iz birleşimini taşıması beklenen temiz makine
  sayısıdır. Bir'in altı ayırt edici, bir ile on arası zayıf, onun üstü gürültüdür.
- **AI29.** Beklenen sayı, izlerin birbirinden **bağımsız** olduğu varsayımıyla hesaplanır. Bu
  varsayım gerçekte tutmaz; hesap bu yüzden bir **alt sınırdır**.
- **AI30.** Yapıların olay makinesinde bulunduğu verilidir. Bu ders bulmayı değil, bulunanın
  değerini ölçer.

#### Yapı, Soru ve Taban

```js
// adli/yapi.mjs — sistem yapilarindan cikan izler ve filo tabani MODELIDIR.
// Taban sayilari elle verilmis kurgu degerlerdir; gercek bir filo taranmadi.

export const FILO = 268;                    // temiz kabul edilen makine sayisi

// yapi -> [sinif, temiz filoda ayni izi tasiyan makine, yanit verdigi soru]
export const YAPI = {
  "silinmis-dosya-adi": ["dogrudan", 4, "dosya bu makinede vardi"],
  "cop-kutusu-ustverisi": ["dogrudan", 47, "dosya silindi"],
  "uygulama-onbellegi": ["dogrudan", 9, "ikili calistirildi"],
  "zamanlanmis-gorev-tanimi": ["dogrudan", 6, "kalem otomatik calisiyor"],
  "yapilandirma-deposu-girdisi": ["dogrudan", 12, "kalem acilista calisiyor"],
  "tasinabilir-ortam-kaydi": ["dogrudan", 22, "ortam bu makineye baglandi"],
  "kurulum-kaydi": ["dogrudan", 63, "yazilim kuruldu"],
  "kisayol-kaydi": ["cikarim", 31, "dosyaya erisildi"],
  "son-kullanilanlar-listesi": ["cikarim", 58, "dosya listelendi"],
  "dosya-zaman-damgasi": ["cikarim", 96, "dosya pencerede degisti"],
  "paylasim-dizin-girdisi": ["cikarim", 74, "ag paylasimina baglanildi"],
  "kullanici-profili-damgasi": ["cikarim", 187, "kullanici oturum acti"],
};

// Iddia -> dayandigi yapilar. Iddialar rapora girmesi dusunulen cumlelerdir.
export const IDDIA = {
  "dosya makinede vardi ve silindi": ["silinmis-dosya-adi", "cop-kutusu-ustverisi"],
  "kalem her acilista calisiyor": ["yapilandirma-deposu-girdisi", "zamanlanmis-gorev-tanimi"],
  "ikili bu makinede calistirildi": ["uygulama-onbellegi", "kisayol-kaydi"],
  "veri tasinabilir ortama kopyalandi": ["tasinabilir-ortam-kaydi", "dosya-zaman-damgasi",
    "son-kullanilanlar-listesi"],
  "yazilim makineye kuruldu": ["kurulum-kaydi", "uygulama-onbellegi"],
  "dosyayi bir kullanici acti": ["son-kullanilanlar-listesi", "kisayol-kaydi",
    "kullanici-profili-damgasi"],
  "su kullanici o anda oturumdaydi": ["kullanici-profili-damgasi"],
};

// Ayni iz birlesimini tasiyan temiz makine beklentisi (izler bagimsiz varsayilir).
export const beklenen = (dayanak) =>
  FILO * dayanak.reduce((a, y) => a * YAPI[y][1] / FILO, 1);
export const dogrudanSayisi = (dayanak) =>
  dayanak.filter((y) => YAPI[y][0] === "dogrudan").length;
export const sinifla = (b) => (b < 1 ? "ayirt edici" : b < 10 ? "zayif" : "gurultu");
```

Tablodaki üçüncü alan her yapının **yanıt verdiği soruyu** taşıyor ve bu alan iddia yazarken en çok
karıştırılan yerdir. Silinmiş dosya adı kaydı "dosya bu makinede vardı" sorusunu yanıtlar,
"dosyayı kim getirdi" sorusunu değil. Çöp kutusu üst verisi "dosya silindi" der, "dosya gizlendi"
demez. Uygulama önbelleği "ikili çalıştırıldı" der, "ikili şunu yaptı" demez. Bir yapıdan onun
yanıtladığı sorunun ötesine geçen her cümle, dayanağı olmayan bir genişletmedir ve tabloda hiçbir
sütuna yazılamaz.

İki sınıf arasındaki fark ise yapının **ne zaman oluştuğuna** bakar. Bir uygulama önbelleği girdisi,
ikili çalıştırılmadıysa oluşmaz; girdinin varlığı çalıştırmayı doğrudan gösterir. Bir dosya zaman
damgası ise dosya değiştiğinde de, kopyalandığında da, yedekten döndüğünde de değişir; damganın
olay penceresine düşmesi bir çıkarımdır. Aynı ayrım kısayol kaydı için de geçerlidir: kısayol,
kullanıcı dosyayı açtığında da, bir betik ona dokunduğunda da oluşabilir.

#### İddianın Ayırt Ediciliği

```js
// adli/deger.mjs — yapi basina taban, iddia basina ayirt edicilik ve tek yapiya baglilik.
import { FILO, YAPI, IDDIA, beklenen, dogrudanSayisi, sinifla } from "./yapi.mjs";

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd());
const yapilar = Object.keys(YAPI), iddialar = Object.keys(IDDIA);

console.log(`model: ${yapilar.length} yapi, ${iddialar.length} iddia, ${FILO} makinelik temiz ` +
  `filo; ${yapilar.filter((k) => YAPI[k][0] === "dogrudan").length} yapi dogrudan, ` +
  `${yapilar.filter((k) => YAPI[k][0] === "cikarim").length} yapi cikarim`);

const A = [-28, -10, 8, 7, 16];
console.log("");
y(A, "yapi", "sinif", "taban", "oran", "dayanan iddia");
for (const k of yapilar)
  y(A, k, YAPI[k][0], YAPI[k][1], `%${Math.round(YAPI[k][1] * 100 / FILO)}`,
    iddialar.filter((i) => IDDIA[i].includes(k)).length);

const B = [-36, 8, 10, 15, 14];
console.log("");
y(B, "iddia", "dayanak", "dogrudan", "temiz makine", "sonuc");
for (const i of iddialar) {
  const b = beklenen(IDDIA[i]);
  y(B, i, IDDIA[i].length, dogrudanSayisi(IDDIA[i]), b.toFixed(2), sinifla(b));
}

const kanitsiz = iddialar.filter((i) => dogrudanSayisi(IDDIA[i]) === 0);
console.log(`\ndogrudan dayanagi olmayan iddia: ${kanitsiz.length} (${kanitsiz.join("; ")})`);
console.log(`ayirt edici ${iddialar.filter((i) => beklenen(IDDIA[i]) < 1).length}, ` +
  `zayif ${iddialar.filter((i) => sinifla(beklenen(IDDIA[i])) === "zayif").length}, ` +
  `gurultu ${iddialar.filter((i) => sinifla(beklenen(IDDIA[i])) === "gurultu").length}`);

// Tek yapiya baglilik: bir yapi silinirse hangi iddia sinif degistiriyor.
console.log("");
const C = [-28, 12, 19, 14];
y(C, "yapi silinirse", "etkilenen", "dayanaksiz kalan", "sinif dusen");
for (const k of yapilar) {
  const et = iddialar.filter((i) => IDDIA[i].includes(k));
  if (!et.length) continue;
  const bos = et.filter((i) => IDDIA[i].length === 1);
  const dus = et.filter((i) => IDDIA[i].length > 1 &&
    sinifla(beklenen(IDDIA[i].filter((z) => z !== k))) !== sinifla(beklenen(IDDIA[i])));
  y(C, k, et.length, bos.length, dus.length);
}
```

```
model: 12 yapi, 7 iddia, 268 makinelik temiz filo; 7 yapi dogrudan, 5 yapi cikarim

yapi                        sinif        taban   oran   dayanan iddia
silinmis-dosya-adi          dogrudan         4     %1               1
cop-kutusu-ustverisi        dogrudan        47    %18               1
uygulama-onbellegi          dogrudan         9     %3               2
zamanlanmis-gorev-tanimi    dogrudan         6     %2               1
yapilandirma-deposu-girdisi dogrudan        12     %4               1
tasinabilir-ortam-kaydi     dogrudan        22     %8               1
kurulum-kaydi               dogrudan        63    %24               1
kisayol-kaydi               cikarim         31    %12               2
son-kullanilanlar-listesi   cikarim         58    %22               2
dosya-zaman-damgasi         cikarim         96    %36               1
paylasim-dizin-girdisi      cikarim         74    %28               0
kullanici-profili-damgasi   cikarim        187    %70               2

iddia                                dayanak  dogrudan   temiz makine         sonuc
dosya makinede vardi ve silindi            2         2           0.70   ayirt edici
kalem her acilista calisiyor               2         2           0.27   ayirt edici
ikili bu makinede calistirildi             2         1           1.04         zayif
veri tasinabilir ortama kopyalandi         3         1           1.71         zayif
yazilim makineye kuruldu                   2         2           2.12         zayif
dosyayi bir kullanici acti                 3         0           4.68         zayif
su kullanici o anda oturumdaydi            1         0         187.00       gurultu

dogrudan dayanagi olmayan iddia: 2 (dosyayi bir kullanici acti; su kullanici o anda oturumdaydi)
ayirt edici 2, zayif 4, gurultu 1

yapi silinirse                 etkilenen   dayanaksiz kalan   sinif dusen
silinmis-dosya-adi                     1                  0             1
cop-kutusu-ustverisi                   1                  0             1
uygulama-onbellegi                     2                  0             2
zamanlanmis-gorev-tanimi               1                  0             1
yapilandirma-deposu-girdisi            1                  0             1
tasinabilir-ortam-kaydi                1                  0             1
kurulum-kaydi                          1                  0             0
kisayol-kaydi                          2                  0             1
son-kullanilanlar-listesi              2                  0             1
dosya-zaman-damgasi                    1                  0             0
kullanici-profili-damgasi              2                  1             0
```

Son sütun 0,27'den 187'ye uzanıyor ve bu aralık dersin sonucudur. En altta duran cümle — "şu
kullanıcı o anda oturumdaydı" — tek bir yapıya dayanıyor ve o yapının tabanı 268 makinenin
**187'sidir**. Cümle büyük olasılıkla doğrudur ve hiçbir şey ayırt etmez: filodaki her on makinenin
yedisinde aynı iz vardır. Bir iddianın doğru olması ile bir şey göstermesi ayrı niteliklerdir ve
raporda ancak ikincisi iş görür.

Dördüncü ve altıncı satırlar birlikte okunmalıdır. "Veri taşınabilir ortama kopyalandı" üç
dayanağa oturuyor ve beklenen sayısı 1,71; "dosyayı bir kullanıcı açtı" da üç dayanağa oturuyor ve
beklenen sayısı 4,68. Aradaki farkı yapan dayanak sayısı değil, dayanakların **sınıfıdır**:
birincisinde taşınabilir ortam kaydı doğrudan sınıftadır ve tabanı yüzde 8'dir; ikincisinin üç
dayanağı da çıkarımdır ve en zayıfının tabanı yüzde 70. **Dayanak eklemek ayırt ediciliği
artırmaz; seyrek dayanak eklemek artırır.**

Bağımsızlık varsayımı burada ayrıca yazılmalıdır. Çarpım, izlerin birbirinden bağımsız oluştuğunu
kabul eder. Gerçekte kısayol kaydı ile son kullanılanlar listesi çoğu zaman aynı eylemden doğar;
biri varsa ötekinin de bulunma olasılığı çarpımın verdiğinden yüksektir. Yani gerçek sayı
hesaplanandan **büyüktür** ve tabloda okunan 4,68 bir alt sınırdır. Bağımsızlık varsayımı her zaman
iddiayı olduğundan güçlü gösterir; bunun yazılmadığı bir çözümleme kendi lehine yanlıdır.

Üçüncü tablo bir yapının kaybının bedelini sayıyor. Uygulama önbelleği iki iddiaya dayanaktır ve
kaybı **iki iddianın da sınıfını düşürür**; en pahalı tek yapı odur. Kullanıcı profili damgası da
iki iddiaya dayanaktır ama kaybı hiçbir sınıf düşürmez — biri zaten gürültüdür, ötekisi onsuz da
aynı sınıfta kalır. İki yapı aynı sayıda iddiaya dayanak olabilir ve taşıdıkları ağırlık taban
farkı kadar farklıdır.

Tablodaki en sessiz satır **paylaşım dizin girdisidir**: bulunmuştur, sınıflandırılmıştır ve hiçbir
iddiaya dayanak değildir. Toplanan iz ile kullanılan iz aynı küme değildir ve aradaki fark, raporun
uzunluğuyla değeri arasındaki farkın kaynağıdır.

#### Yapının Ömrü ve Gecikmenin Bedeli

```js
// adli/omur.mjs — yapinin uzerine yazilma suresi ve gecikmenin iddialara etkisi.
import { FILO, YAPI, IDDIA, beklenen, sinifla } from "./yapi.mjs";

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd());

// yapi -> [tuttugu girdi sayisi, olagan kullanimda gunde eklenen girdi]  0 = uzerine yazilmaz
const DONGU = {
  "silinmis-dosya-adi": [2400, 180], "cop-kutusu-ustverisi": [500, 12],
  "uygulama-onbellegi": [1024, 96], "zamanlanmis-gorev-tanimi": [1, 0],
  "yapilandirma-deposu-girdisi": [1, 0], "tasinabilir-ortam-kaydi": [64, 3],
  "kurulum-kaydi": [1, 0], "kisayol-kaydi": [149, 22],
  "son-kullanilanlar-listesi": [20, 14], "dosya-zaman-damgasi": [1, 0.35],
  "paylasim-dizin-girdisi": [32, 9], "kullanici-profili-damgasi": [1, 1],
};
const omur = (k) => (DONGU[k][1] ? DONGU[k][0] / DONGU[k][1] : Infinity);
const okunur = (k, gun) => gun <= omur(k);

const A = [-28, 10, 10, 12, 10];
y(A, "yapi", "girdi", "gunluk", "omur gun", "taban");
for (const k of Object.keys(YAPI))
  y(A, k, DONGU[k][0], DONGU[k][1], DONGU[k][1] ? omur(k).toFixed(1) : "surekli", YAPI[k][1]);

const B = [-10, 14, 14, 8, 10, 14];
console.log("");
y(B, "gecikme", "okunur yapi", "ayirt edici", "zayif", "gurultu", "dayanaksiz");
for (const gun of [1, 3, 7, 14, 30, 90]) {
  const kalan = Object.fromEntries(Object.keys(IDDIA).map((i) =>
    [i, IDDIA[i].filter((k) => okunur(k, gun))]));
  const say = (s) => Object.values(kalan).filter((d) => d.length && sinifla(beklenen(d)) === s).length;
  y(B, `${gun} gun`, Object.keys(YAPI).filter((k) => okunur(k, gun)).length,
    say("ayirt edici"), say("zayif"), say("gurultu"),
    Object.values(kalan).filter((d) => !d.length).length);
}
const kalici = Object.keys(YAPI).filter((k) => omur(k) === Infinity);
console.log(`\n${Object.keys(YAPI).length} yapinin ${kalici.length}'i uzerine yazilmiyor; ` +
  `filo ${FILO} makine, taban degerleri degismiyor`);
```

```
yapi                             girdi    gunluk    omur gun     taban
silinmis-dosya-adi                2400       180        13.3         4
cop-kutusu-ustverisi               500        12        41.7        47
uygulama-onbellegi                1024        96        10.7         9
zamanlanmis-gorev-tanimi             1         0     surekli         6
yapilandirma-deposu-girdisi          1         0     surekli        12
tasinabilir-ortam-kaydi             64         3        21.3        22
kurulum-kaydi                        1         0     surekli        63
kisayol-kaydi                      149        22         6.8        31
son-kullanilanlar-listesi           20        14         1.4        58
dosya-zaman-damgasi                  1      0.35         2.9        96
paylasim-dizin-girdisi              32         9         3.6        74
kullanici-profili-damgasi            1         1         1.0       187

gecikme      okunur yapi   ayirt edici   zayif   gurultu    dayanaksiz
1 gun                 12             2       4         1             0
3 gun                  9             2       2         2             1
7 gun                  7             2       2         1             2
14 gun                 5             1       0         3             3
30 gun                 4             1       0         2             4
90 gun                 3             1       0         1             5

12 yapinin 3'i uzerine yazilmiyor; filo 268 makine, taban degerleri degismiyor
```

Yapıların çoğu **döngüseldir**: sabit sayıda girdi tutar ve yenisi geldiğinde en eskisini atar.
Ömür bu iki sayının oranıdır ve tabloda bir günden sürekliye uzanıyor. Üç yapı hiç üzerine
yazılmıyor; bunlar tanım kayıtlarıdır, silinmedikçe durur.

Birinci tablonun iki sütunu birlikte okunduğunda ters bir bağ çıkıyor. En kısa ömürlü yapı —
kullanıcı profili damgası — aynı zamanda en yüksek tabanlı yapıdır: ömrü bir gün, tabanı 187. Bir
yapıya ne kadar sık yazılıyorsa hem o kadar çabuk üzerine yazılır hem de temiz makinelerin o kadar
çoğunda bulunur. Hızlı kaybolan iz, kaybolmasa bile en az ayırt eden izdir.

İkinci tablo kursun ölçü eksenini bu derse taşıyor. Gecikme bir günden doksan güne çıkarken
okunabilir yapı sayısı 12'den 3'e, dayanaksız kalan iddia sayısı 0'dan **5'e** gidiyor. İddia
sayısı hiç değişmiyor; değişen tek şey, o iddiaları taşıyan yapıların hâlâ orada olup olmadığıdır.

On dördüncü günün satırı ayrıca dikkat ister: zayıf sınıftaki iddia sayısı **sıfırdır**. İddialar
iyileşmiş değildir; aradaki dayanakları taşıyan yapılar döngüde silindiği için iddialar iki uca
savrulmuştur — ya sürekli yapılara dayanıp ayırt edici kalmışlardır ya da yalnız yüksek tabanlı bir
yapıya kalıp gürültüye düşmüşlerdir. **Gecikme kanıtı yalnız azaltmaz, dağılımını da bozar.**

#### Özet

- Bir yapı, yalnız iddia edilen olay gerçekleştiği için oluşuyorsa doğrudan, başka nedenlerle de
  oluşabiliyorsa çıkarım sınıfındadır; 12 yapının 7'si doğrudandır ve tabanları 268 makinelik
  filoda 4 ile 187 arasında, yani yüzde 1 ile yüzde 70 arasında değişir.
- Yedi iddianın 2'si ayırt edici, 4'ü zayıf, 1'i gürültüdür; gürültü olan iddia tek bir çıkarım
  yapısına dayanır ve 187 temiz makinede de doğrudur.
- Dayanak sayısı ayırt ediciliği belirlemez: üç çıkarım dayanağı olan iddia (4,68), bir doğrudan ve
  iki çıkarım dayanağı olan iddiadan (1,71) daha zayıftır.
- Bağımsızlık varsayımı hesabı alt sınır yapar ve her zaman iddia lehine yanlıdır; aynı eylemden
  doğan izler birlikte bulunur.
- Bir yapının kaybı sayı olarak ölçülür: uygulama önbelleğinin kaybı iki iddianın sınıfını düşürür,
  kullanıcı profili damgasının kaybı hiçbirini düşürmez.
- Yapıların dokuzu döngüseldir ve ömürleri 1 ile 41,7 gün arasındadır; gecikme bir günden doksan
  güne çıktığında okunabilir yapı 12'den 3'e, dayanaksız kalan iddia 0'dan 5'e gider.

#### Sonraki Adım

Bu konunun beş dersi beş ayrı sayı üretti: zincirin kaç kalemde koptuğu, kapsamın kaç kalem
getirdiği, sıranın kaç kalem kaybettirdiği, kaymanın kaç olayı ters çevirdiği ve bir izin kaç temiz
makinede de bulunduğu. Bunların hiçbiri henüz bir rapor cümlesi değil. Rapor, bu sayıların
üzerine kurulan iddialardan oluşur ve iddia ile kalem arasındaki bağ tek tek yazılmadıkça sayılar
raporda görünmez.

Son ders bu eşlemeyi ölçer ve kursu kapatır. Rapora girmesi düşünülen her iddia, dayandığı kanıt
kalemine bağlanır; üç sütun ayrı sayılır — kaç iddia doğrudan bir kalemle destekleniyor, kaçı bir
çıkarıma dayanıyor, kaçının hiçbir kanıtı yok. Teknik bulgunun hukuki bağlamda ne anlama geldiği de
tam olarak bu üç sayının nasıl yazıldığına bağlıdır.

### Raporlama

Source: https://academia.sh/tr/kurslar/guvenlik-operasyonlari/raporlama

Teknik bulgunun iddia–kanıt eşlemesi olarak ölçülmesi: 20 iddialık kurgu bir rapor taslağında üç kişilik vardiyanın topladığı 22 kalem üzerinde 10 iddia doğrudan destekli, 9'u çıkarım, 1'i kanıtsız çıkıyor. Çıkarım sayılan 9 iddianın 7'si gözetim zincirindeki boşluklar yüzünden düşüyor, 2'si zaten çıkarımdır. Kusursuz toplama 11 doğrudan iddia verirken konak konak toplama ve tek kişilik ekip bunu 7'ye indirip kanıtsız iddiayı 3'e çıkarıyor.

Bu konunun beş dersi beş ayrı sayı üretti: zincirin kaç kalemde koptuğu, kapsamın kaç kalem
getirdiği, sıranın kaç kalem kaybettirdiği, kaymanın kaç olayı ters çevirdiği, bir izin kaç temiz
makinede de bulunduğu. Hiçbiri bir rapor cümlesi değil. Rapor **iddialardan** oluşur ve her iddia,
dayandığı kalem yazılmadıkça bir sayı değil bir kanaattir.

Bu ders o eşlemeyi ölçer. Yirmi iddialık kurgu bir taslak, ilk üç dersteki kalem kümesinin üzerine
oturtulur — aynı 28 kalem, aynı zincir boşlukları, aynı toplama modeli. Üç sütun ayrı sayılır: kaç
iddia doğrudan bir kalemle destekleniyor, kaçı çıkarıma dayanıyor, kaçının hiçbir kanıtı yok.

- **AI31.** **Rapor taslağı**, incelemenin sonunda yazılması düşünülen iddiaların listesidir. Yirmi
  iddia kurgudur.
- **AI32.** Bir iddia **doğrudan desteklidir** ancak dayanaklarından en az biri toplanmış, o kalem
  savunulabilir (zinciri tam, karması uyuşuyor) ve iddiayı doğrudan taşıyorsa.
- **AI33.** Dayanağı toplanmış ama kalemin zinciri kopuksa ya da iddia kalemden yalnız çıkarımla
  geliyorsa iddia **çıkarımdır**.
- **AI34.** Hiçbir dayanağı toplanmamışsa iddia **kanıtsızdır**.
- **AI35.** Kalem kümesi, zincir boşlukları ve toplama modeli önceki derslerin aynısıdır; üreteç
  tohumu değişmediği için sayılar birebir aynı kümeden gelir.

#### Rapor Taslağı ve Eşleme Kuralı

```js
// adli/rapor.mjs — rapor iddialarinin kanit kalemlerine eslenmesi MODELIDIR.
// Kalem kumesi, zincir hatalari ve toplama sirasi ilk uc dersteki modelin aynisidir.

const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
export const SINIF = {
  "ag-durumu": [120, 45], "surec-listesi": [240, 60], "acik-tanitici": [300, 55],
  "oturum-durumu": [600, 70], "bellek-icerigi": [900, 420], "gecici-dosya": [3600, 180],
  "akis-kaydi": [86400, 240], "uzak-gunluk": [2592000, 300],
  "disk-imaji": [604800, 5400], "yapilandirma": [604800, 90],
};
const D5 = ["toplama", "paketleme", "aktarim", "laboratuvar", "cozumleme"];
const D3 = ["toplama", "aktarim", "cozumleme"], D2 = ["alma", "cozumleme"];
export const KONAK = {
  "sube-ucu-3": [D5, ["ag-durumu", "surec-listesi", "acik-tanitici", "oturum-durumu",
    "bellek-icerigi", "gecici-dosya", "disk-imaji", "yapilandirma"]],
  "saha-dizustu-14": [D5, ["ag-durumu", "surec-listesi", "oturum-durumu", "bellek-icerigi",
    "disk-imaji"]],
  "toplayici-2": [D3, ["ag-durumu", "surec-listesi", "acik-tanitici", "oturum-durumu",
    "bellek-icerigi", "disk-imaji", "yapilandirma"]],
  "portal-onyuz": [D3, ["ag-durumu", "surec-listesi", "bellek-icerigi", "yapilandirma"]],
  "merkez-gunluk": [D2, ["uzak-gunluk", "yapilandirma"]],
  "akis-toplayici": [D2, ["akis-kaydi", "yapilandirma"]],
};
const KORUMASIZ = ["sube-ucu-3/gecici-dosya", "toplayici-2/disk-imaji",
  "portal-onyuz/yapilandirma"];

// Ilk dersteki uretecin ayni dizisi: kalem basina bir cekis, aktarim basina bir (ya da iki) cekis.
export function kume() {
  const r = uretec(20260731), liste = [];
  for (const [konak, [dugum, siniflar]] of Object.entries(KONAK))
    for (const s of siniflar) {
      const ad = `${konak}/${s}`;
      r();
      let eksik = 0;
      for (let i = 1; i < dugum.length; i += 1) if (r() < 0.11) { r(); eksik += 1; }
      liste.push({ ad, konak, sinif: s, omur: SINIF[s][0], sure: SINIF[s][1],
        savunulabilir: eksik === 0 && !KORUMASIZ.includes(ad) });
    }
  return liste;
}

// Ucuncu dersteki toplama: n kisi, verilen sira, uzak konaklara varis gecikmesi.
const UZAK = ["sube-ucu-3", "saha-dizustu-14"];
export function topla(dizi, n, gecikme) {
  const bos = Array(n).fill(0), alinan = new Set();
  for (const k of dizi) {
    const i = bos.indexOf(Math.min(...bos));
    const bas = Math.max(bos[i], UZAK.includes(k.konak) ? gecikme : 0);
    if (bas <= k.omur) { alinan.add(k.ad); bos[i] = bas + k.sure; }
  }
  return alinan;
}
export const SIRA = {
  "uculuk sirasi": (K) => [...K].sort((a, b) => a.omur - b.omur || a.sure - b.sure),
  "konak konak": (K) => [...K],
};

// Rapor taslagi: iddia -> [dayanak kalemleri, dayanak iddiayi dogrudan tasiyor mu]
export const IDDIA = {
  "sube ucunda yetkisiz oturum acildi": [["merkez-gunluk/uzak-gunluk",
    "sube-ucu-3/oturum-durumu"], true],
  "sube ucundan disariya baglanti kuruldu": [["akis-toplayici/akis-kaydi",
    "sube-ucu-3/ag-durumu"], true],
  "sube ucunde yeni bir surec calisti": [["sube-ucu-3/surec-listesi",
    "sube-ucu-3/bellek-icerigi"], true],
  "surec bir dosya yazdi": [["sube-ucu-3/acik-tanitici", "sube-ucu-3/disk-imaji"], true],
  "yazilan dosya sonra silindi": [["sube-ucu-3/disk-imaji"], true],
  "kalem acilista calisacak bicimde ayarlandi": [["sube-ucu-3/yapilandirma"], true],
  "sube ucundeki gecici dosyalar temizlendi": [["sube-ucu-3/gecici-dosya"], true],
  "toplayiciya baglanti kuruldu": [["akis-toplayici/akis-kaydi", "toplayici-2/ag-durumu"], true],
  "toplayicida oturum acildi": [["toplayici-2/oturum-durumu", "merkez-gunluk/uzak-gunluk"], true],
  "toplayicida bir surec baslatildi": [["toplayici-2/surec-listesi",
    "toplayici-2/bellek-icerigi"], true],
  "toplayicidan abone verisi okundu": [["toplayici-2/disk-imaji",
    "toplayici-2/acik-tanitici"], true],
  "toplayicinin yapilandirmasi degismedi": [["toplayici-2/yapilandirma"], true],
  "saha dizustunde ayni oturum kullanildi": [["saha-dizustu-14/oturum-durumu",
    "saha-dizustu-14/bellek-icerigi"], true],
  "saha dizustunden toplayiciya erisildi": [["saha-dizustu-14/ag-durumu",
    "akis-toplayici/akis-kaydi"], true],
  "saha dizustunde dosya degistirildi": [["saha-dizustu-14/disk-imaji"], true],
  "portal onyuzunde belirtec kullanildi": [["portal-onyuz/bellek-icerigi",
    "merkez-gunluk/uzak-gunluk"], true],
  "portal onyuzunun ayari degistirildi": [["portal-onyuz/yapilandirma"], true],
  "erisimlerin tamami ayni kisidendir": [["merkez-gunluk/uzak-gunluk"], false],
  "veri ucuncu bir tarafa iletildi": [[], false],
  "olaydan once ayni erisim hic olmadi": [["merkez-gunluk/uzak-gunluk",
    "akis-toplayici/akis-kaydi"], false],
};

export function sinifla(iddia, alinan, kalem) {
  const [dayanak, dogrudan] = IDDIA[iddia];
  const eldeki = dayanak.filter((d) => alinan.has(d));
  if (!eldeki.length) return "kanitsiz";
  if (!dogrudan) return "cikarim";
  return eldeki.some((d) => kalem.find((k) => k.ad === d).savunulabilir)
    ? "dogrudan" : "cikarim";
}
```

Eşleme kuralının üç girdisi var: kalem toplandı mı, kalemin zinciri sağlam mı, kalem iddiayı
doğrudan mı taşıyor. İlk ikisi önceki derslerde ölçüldü; üçüncüsü inceleyenin kararıdır ve
**iddia yazılırken** doldurulur — sonradan doldurulursa dayanağın gücü iddiaya göre seçilir.

#### Yirmi İddianın Sınıfı

```js
// adli/esle.mjs — iddia-kanit eslemesi ve toplama sirasinin rapordaki karsiligi.
import { kume, topla, SIRA, IDDIA, sinifla } from "./rapor.mjs";

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd());
const K = kume(), iddialar = Object.keys(IDDIA);
const ana = topla(SIRA["uculuk sirasi"](K), 3, 600);      // uc kisilik vardiya, 600 sn yol

console.log(`model: ${K.length} kanit kalemi, ${K.filter((k) => k.savunulabilir).length} ` +
  `savunulabilir; rapor taslaginda ${iddialar.length} iddia`);
console.log(`uc kisilik vardiya, uculuk sirasi, 600 saniyelik varis: ${ana.size} kalem alindi`);

const A = [-42, 9, 8, 11, 11];
console.log("");
y(A, "iddia", "dayanak", "eldeki", "sinif", "neden");
for (const i of iddialar) {
  const [d, dogrudan] = IDDIA[i];
  const elde = d.filter((x) => ana.has(x));
  const s = sinifla(i, ana, K);
  y(A, i, d.length, elde.length, s,
    s === "dogrudan" ? "-" : s === "kanitsiz" ? "kalem yok" : dogrudan ? "zincir" : "iddia");
}

const say = (alinan) => ["dogrudan", "cikarim", "kanitsiz"].map((s) =>
  iddialar.filter((i) => sinifla(i, alinan, K) === s).length);
const [d0, c0, k0] = say(ana);
const zincir = iddialar.filter((i) => IDDIA[i][1] && sinifla(i, ana, K) === "cikarim").length;
console.log(`\ndogrudan destekli ${d0}, cikarim ${c0}, kanitsiz ${k0} (toplam ${iddialar.length})`);
console.log(`cikarim sayilan ${c0} iddianin ${zincir}'i zincir bosluklari yuzunden dustu, ` +
  `${c0 - zincir}'i zaten cikarimdi`);

const B = [-22, 7, 9, 10, 10, 10];
console.log("");
y(B, "toplama", "kisi", "alinan", "dogrudan", "cikarim", "kanitsiz");
for (const [ad, kisi, gec] of [["uculuk sirasi", 3, 0], ["uculuk sirasi", 3, 600],
  ["uculuk sirasi", 1, 0], ["konak konak", 3, 0], ["konak konak", 1, 0]]) {
  const a = topla(SIRA[ad](K), kisi, gec);
  y(B, `${ad}${gec ? " +600 sn" : ""}`, kisi, a.size, ...say(a));
}
```

```
model: 28 kanit kalemi, 16 savunulabilir; rapor taslaginda 20 iddia
uc kisilik vardiya, uculuk sirasi, 600 saniyelik varis: 22 kalem alindi

iddia                                       dayanak  eldeki      sinif      neden
sube ucunda yetkisiz oturum acildi                2       2    cikarim     zincir
sube ucundan disariya baglanti kuruldu            2       1   dogrudan          -
sube ucunde yeni bir surec calisti                2       1    cikarim     zincir
surec bir dosya yazdi                             2       1   dogrudan          -
yazilan dosya sonra silindi                       1       1   dogrudan          -
kalem acilista calisacak bicimde ayarlandi        1       1    cikarim     zincir
sube ucundeki gecici dosyalar temizlendi          1       1    cikarim     zincir
toplayiciya baglanti kuruldu                      2       2   dogrudan          -
toplayicida oturum acildi                         2       2   dogrudan          -
toplayicida bir surec baslatildi                  2       2   dogrudan          -
toplayicidan abone verisi okundu                  2       2    cikarim     zincir
toplayicinin yapilandirmasi degismedi             1       1   dogrudan          -
saha dizustunde ayni oturum kullanildi            2       2   dogrudan          -
saha dizustunden toplayiciya erisildi             2       1   dogrudan          -
saha dizustunde dosya degistirildi                1       1   dogrudan          -
portal onyuzunde belirtec kullanildi              2       1    cikarim     zincir
portal onyuzunun ayari degistirildi               1       1    cikarim     zincir
erisimlerin tamami ayni kisidendir                1       1    cikarim      iddia
veri ucuncu bir tarafa iletildi                   0       0   kanitsiz  kalem yok
olaydan once ayni erisim hic olmadi               2       2    cikarim      iddia

dogrudan destekli 10, cikarim 9, kanitsiz 1 (toplam 20)
cikarim sayilan 9 iddianin 7'i zincir bosluklari yuzunden dustu, 2'i zaten cikarimdi

toplama                  kisi   alinan  dogrudan   cikarim  kanitsiz
uculuk sirasi               3       28        11         8         1
uculuk sirasi +600 sn       3       22        10         9         1
uculuk sirasi               1       21         8        10         2
konak konak                 3       19         9        10         1
konak konak                 1       16         7        10         3
```

Sonucun tamamı iki satırda duruyor: yirmi iddianın onu doğrudan desteklidir, dokuzu çıkarımdır,
biri kanıtsızdır. Ama asıl bilgi bir alttaki satırdadır. Çıkarım sayılan dokuz iddianın **yedisi**
zaten çıkarım olduğu için değil, dayandıkları kalemin gözetim zinciri koptuğu için oraya düşmüştür.
Kalemler toplanmıştır, elde durmaktadır, içerikleri okunmaktadır — yalnız savunulabilir değildir.
Birinci derste ölçülen yüzde 2,6'lık boş kayıt alanı oranının rapordaki karşılığı budur:
**doğrudan destekli olabilecek yedi cümle bir sınıf aşağı iniyor.**

Neden sütunu üç ayrı kusuru ayırıyor ve üçünün çaresi ayrıdır. "Zincir" yazan satırlar bir **kayıt**
sorunudur ve bir bölümü sonradan kapatılabilir. "İddia" yazan iki satır bir **mantık** sorunudur;
"erişimlerin tamamı aynı kişidendir" cümlesi hiçbir kalem eklenerek yükselmez, çünkü kalem kimliği
değil oturumu gösterir. "Kalem yok" yazan tek satır bir **kapsam** sorunudur.

Alttaki tablo toplama kararlarının rapordaki karşılığını veriyor. Kusursuz koşulda — üç kişi, doğru
sıra, gecikmesiz — 28 kalemin tamamı alınıyor ve doğrudan destekli iddia **11** oluyor. Aynı ekip
altı yüz saniye yolda kalırsa 10'a, tek kişiye inilirse 8'e, konak konak toplanır ve tek kişi
kalırsa **7'ye** iniyor; kanıtsız iddia bir taneden üçe çıkıyor. Dört rapor cümlesi ile iki
yanıtsız soru, tek bir sıralama kararının farkıdır.

#### İddia, Çıkarım ve Yazılmayan Şey

Üç sütunun rapora nasıl yazıldığı, ölçülmesi kadar belirleyicidir. Sınıf yazılmazsa okuyan bütün
cümleleri aynı ağırlıkta okur; çıkarım olan cümle, doğrudan destekli cümlenin yanında ondan
ayırt edilemez. Bu ayrımı yapmak okuyanın değil, yazanın işidir.

Çıkarım cümlesi rapora girebilir; çıkarım olduğu yazılmadan giremez. Kanıtsız iddia ise
silinmemelidir — "sorulmuş ve yanıtlanamamış soru" başlığına taşınır. Sorunun sorulduğu ve neden
yanıtlanamadığı bilgisi karar taşır: verinin dışarı çıkıp çıkmadığı bilinmiyorsa, bilinmediğinin
yazılması ile hiç yazılmaması aynı şey değildir.

Toplanan kalem sayısı ile rapora giren kalem sayısı da aynı değildir: 28 kalem toplanmış, 22'si
elde kalmış, dayanak olarak 23 kalem anılmış ve bunların 18'i elde bulunmuştur. Kullanılmayan
kalemin varlığı bir kusur değildir, ama raporun uzunluğu toplanan kalemle değil **eşlenen** kalemle
ölçülür.

Yöntem bölümü de bir kalem listesidir: karma değerleri, gözetim zinciri kayıtları, toplama sırası,
varış gecikmesi, çizelgenin kalan kayması. Bunlar okunsun diye değil, **aynı sonucu üretebilmek
için** yazılır.

Son sınır hukuki bağlamla ilgilidir ve tek cümleyle çizilir: inceleme **kalemin neyi gösterdiğini**
söyler, eylemin nasıl nitelendirileceğini söylemez. Nitelendirme başka bir mesleğin işidir ve
teknik rapor onun yerine geçmeye çalıştığı anda, doğru olan teknik bölümünü de tartışmaya açar.
Raporun kapsamı, dayandığı yazılı yetki ve incelenen sistemlerin listesi de bu yüzden ilk sayfada
yazılır.

#### Özet

- Rapor iddialardan oluşur ve her iddia dayandığı kaleme eşlenir; eşleme kuralının üç girdisi
  kalemin toplanmış, savunulabilir ve iddiayı doğrudan taşıyor olmasıdır.
- Yirmi iddialık taslakta 22 kalemle 10 iddia doğrudan destekli, 9'u çıkarım, 1'i kanıtsızdır.
- Çıkarım sayılan 9 iddianın 7'si gözetim zinciri boşlukları yüzünden düşmüştür; kalemler eldedir,
  yalnız savunulamaz.
- Üç kusurun çaresi ayrıdır: zincir boşluğu bir kayıt sorunu, çıkarım kalması bir mantık sorunu,
  kalem yokluğu bir kapsam sorunudur.
- Kusursuz toplama 11 doğrudan iddia verir; konak konak toplama ve tek kişilik ekip bunu 7'ye
  indirip kanıtsız iddiayı 3'e çıkarır.

#### Kurs Kapanışı

| Ders | İlk kayıt / kaynak | Karara kadar adım | Geç kalmanın bedeli |
|---|---|---|---|
| Güvenlik Operasyon Merkezi | 273 uyarı, 3 kişilik vardiya | 26 vaka, 1 devir noktası | 64 uyarı görülmüyor, medyan 987 dakika |
| Günlük Toplama ve Normalleştirme | 3 kaynak, 1–8 dakika gecikme | 8 alanlık şema, 2 ara tablo | 9 artık alan, 404 kayıt aktörsüz |
| Güvenlik Bilgi ve Olay Yönetimi | 3.083 ham olay | 12 aday, 10 uyarı, 43 dakika | 5 kampanyanın 2'si hiç görünmüyor |
| Ağ Akış Verisi | 2.979 akış, 7 alan | 4 ölçüt, 43 işaret | 10 sorunun 4'ü yanıtsız, 8,8 GB kesinti |
| Yanlış Pozitif ve Yanlış Negatif | 900 aday, 20 kalem | 4 öznitelik, 1 eşik | eşik 72'de 7 kaçırılan, 42 ek kalem |
| Tespit Mühendisliği | 26 teknik, 8 taktik | 11 kural, 2 sürüm | 2 teknik kapsanmıyor, 513 dakika inceleme |
| Tehdit Avcılığı | 12.910 kayıt, 6 hipotez | 2–3 eleme adımı | 1.691 dakikada 2 kalem, 846 dakika/kalem |
| Tehdit İstihbaratı | 900 gösterge, 12 tanım | 90 günlük pencere | 828 ölü gösterge, 55 temas kaçıyor |
| Yanıt Otomasyonu | 8 yordam, 158 kalem/gün | 3 kip, 1.215 dakika elle iş | günde 2,65 yanlış eylem, 457 dakika |
| Hazırlık | 12 hazırlık kalemi | 6 adımlık zincir | hazırlıksız 470 dakika, 13 kalem |
| Tanımlama | 30 varlık, 20'si kayıtlı | 7 ölçüt, 3–73 dakika | 13 varlıkta meşru iş kesiliyor |
| Sınırlama | 8 kısa, 4 uzun eylem | 7 sınırlama düzeni | geç kararda 5 ek kalem, 372 dakika |
| Temizleme | 22 nokta, 9 varlık | 5 keşif yöntemi, 506 dakika | 5 nokta kaçıyor, 60 günde 8 bulaşma |
| Kurtarma | 7 geri dönüş noktası | 4 aşamalı denetim | kirli yedekte 1.347 dakika, 9,5 gün veri |
| Çıkarılan Dersler | 16 soru, 9 kayıt kaynağı | 12 iyileştirme kalemi | 5 soru yanıtsız, 136 kişi-saat |
| İletişim ve Bildirim Yükümlülüğü | 12 paydaş, 5'i dış | 4.320 dakikalık pencere | geç bildirimde 64.540 dakika aşım |
| Adli İnceleme İlkeleri | 28 kalem, 6 konak | 4 aktarım, 5 kayıt alanı | 12 kalem tartışmaya açık |
| Disk İmajı Alma | 15 kalem, 7 bölge | 4 kopyalama kapsamı | canlı kopyada 6 kalem doğrulanamıyor |
| Bellek Dökümü Analizi | 28 kalem, 18'i uçucu | 10 sınıflık uçuculuk sırası | 1.200 saniyede 9 kalem |
| Zaman Çizelgesi Oluşturma | 3 kaynak, 54 olay | 19 çapa, 2 katsayı | 33 olay yanlış konumda |
| Yapı ve Kayıt İncelemesi | 12 yapı, taban 4–187 | 7 iddia, 3 sınıf | 90 günde 5 iddia dayanaksız |
| Raporlama | 20 iddia, 22 kalem | 3 sınıflı eşleme | 7 iddia zincirde düşüyor |

Dördüncü sütunda boş bir hücre yok. Yirmi iki dersin her biri geç kalmanın bedelini ya bir süre ya
bir kalem sayısı olarak yazdı ve hiçbirinde bu bedel sıfır çıkmadı. Kursun kuralı bu sütundan
okunur: **güvenlik operasyonunun çıktısı uyarı sayısı değil, fark etme ile sınırlama arasındaki
süredir; o süre ölçülmüyorsa hat kurulmuş sayılmaz.** Uyarı sayısı bir iş yükü ölçüsüdür, kurulmuş
bir hattın kanıtı değil.

İkinci ve üçüncü sütun kuralın iki yarısıdır. Hiç düşmeyen bir kayıt hiçbir adımla kurtarılamaz;
her ek adım ise bir eleme ve bir gecikmedir. Yirmi iki dersin hiçbirinde ikisi birden iyileşmedi.

Bütün bu hat tek bir sessiz varsayım üzerinde durdu ve son altı ders onu en açık biçimde kullandı:
kayıtların, imajların ve bellek dökümlerinin **erişebildiğin makinelerde** durduğu. Toplayıcının
diski alınabiliyordu, şube ucuna gidilebiliyordu. Oysa sistemlerin bir bölümü artık senin olmayan
bir donanımda koşuyor; orada imaj alınamaz ve gözetim zincirinin ilk halkası başka birinin
elindedir. **M24/K09 Bulut ve Sanallaştırma Güvenliği** tam olarak bu soruyla başlar.

