---
title: 'Ağ Güvenliği'
source: 'https://academia.sh/tr/kurslar/ag-guvenligi'
language: tr
updated: '2026-08-17T04:39:57+00:00'
license: 'CC BY-SA 4.0'
lessons: 20
outcomes:
    - 'Ağ protokollerinin doğrulamadan kabul ettiği iddiaları sayarak zayıflığı ölçer'
    - 'Bölütleme, filtreleme ve denetim noktalarının kapattığı yolu ve bedelini karşılaştırır'
    - 'Kablosuz katmanın fiziksel yüzeyini ve kimlik doğrulama seçeneklerini ölçer'
---

# Ağ Güvenliği

Ağ üzerindeki mesajların taşıdığı iddiaların kaçının kanıtlanabildiği: katman başına doğrulanmayan iddia sayımı, açık servisin anlamı, adres ve ad çözümleme zehirlenmesi ile imzalı doğrulamanın kurtardığı kayıt, sahte adres dağıtımı, tekil ve dağıtık hizmet engelleme, araya girme, tekrar ve sahtecilik saldırıları, güvenlik duvarı nesillerinin gördüğü ve doğrulayabildiği iddia, ağ bölütleme ve güven bölgeleri, vekil ve sıçrama sunucuları, saldırı tespit ve önleme, bal küpleri, sanal özel ağların erişim kapsamı, kural değerlendirme sırası, kablosuz şifreleme kuşakları, kurumsal ve kişisel mod, ikiz erişim noktaları ve kapsama denetimi.

## Protokol Güvenliği

Ağ protokollerinin doğrulamadan kabul ettiği iddiaların sayılması: katman başına iddia dağılımı, açık bağlantı noktalarının kabul etmeye hazır olduğu iddia, adres ve ad çözümleme önbelleklerinin bozulan kayıtları, sahte adres dağıtımı, kapasite aritmetiğiyle hizmet engelleme, kanıt zinciri eksikliği olarak araya girme ve tazelik kanıtı cinsinden tekrar ile sahtecilik.

### Katman Modelleri ve Saldırı Yüzeyi

Source: https://academia.sh/tr/kurslar/ag-guvenligi/katman-modelleri-ve-saldiri-yuzeyi

Ağ yüzeyinin iddia cinsinden ölçülmesi: tek bir sayaç okumasının dört katmanda taşıdığı 18 iddianın hiçbirinin kanıtı olmaması, beş savunmanın 11 iddiayı doğrulanabilir kılıp 7'sini açık bırakması, bir savunmanın altındaki katmanın hiçbir iddiasını görememesi ve doğrulamanın 4 ek tur, 13 anahtar kalemi, 25 elle kalem, 11 reddedilen bağlantı ve 6 dışarıda kalan aygıt tutması.

Önceki kurs makinenin sınırını saydı: izin bitleri, hipervizör duvarı, bölme. Kapanışta kalan
soru şuydu — şube sunucusu yalnız başına durmuyor, ona bağlanan her uç işletim sisteminin
çizdiği sınırın dışından geçen bir yol açıyor ve o yolları kimse saymıyor. Bu ders o yolları
sayılabilir bir birime çevirir.

Birim, bağlantının kendisi değildir. İki makine arasında bir kablo olması tek başına bir şey
söylemez; o kablodan geçen mesajların **ne söylediği** ve alıcının **neye dayanarak** inandığı
belirleyicidir. Ağ üzerindeki her mesaj bir ya da birkaç **iddia (claim)** taşır: "kaynak adres
benim", "şu ad şu adrese karşılık gelir", "bu segment açık bir oturuma ait". Bu kursun ölçü
birimi, doğrulanmadan kabul edilen iddia sayısıdır.

#### İddianın Kanıtı

**PG1:** her mesaj bir iddia taşır; iddia, alıcının doğru sayması beklenen bir önermedir.
**PG2:** bir iddianın **kanıtı**, alıcının o iddiayı gönderenden bağımsız olarak sınayabildiği
veridir; kanıtı olmayan iddia doğrulanmadan kabul edilir. **PG3:** bir savunma yalnız kendi
katmanının ve üstündeki katmanın iddialarını doğrulanabilir kılar; altındaki katmanın iddiası
ona görünmez.

"Bu protokol güvensizdir" bir karar taşımaz. Karar taşıyan üç sayı vardır ve bu kurs boyunca
her ders bu üçünü yazar: kaç iddia doğrulanmadan kabul ediliyor, savunma kaçını doğrulanabilir
kılıyor ve kaçı hâlâ doğrulanamıyor, doğrulamanın bedeli ne. Bedel beş kalemde ölçülür: el
sıkışmaya eklenen tur sayısı, sürekli yönetilen anahtar kalemi, elle tutulan yapılandırma
kalemi, reddedilen meşru bağlantı ve dışarıda kalan eski aygıt sayısı.

Katmanların görevleri, başlık alanları ve protokol mekaniği **Ağ Modelleri ve Protokoller**
kursunda ölçüldü; burada tekrarlanmaz. Katman burada yalnız bir sayma ekseni olarak kullanılır:
her katman kaç iddia taşıyor ve kaçının kanıtı var.

#### Bir Okumanın Taşıdığı On Sekiz İddia

Aşağıdaki liste bir **modeldir**: kurgu bölgesel ölçüm ağında bir sayaç okumasının sahadan
merkeze giderken taşıdığı iddialar sayılır. Gerçek bir ağ, gerçek bir ana bilgisayar adı ya da
gerçek bir genel adres yoktur. Bu sayımın gerçek bir ağ üzerinde yapılması **yazılı yetki ve
tanımlı kapsam olmadan hem yasadışı hem meslek dışıdır**.

```js
// aglar/iddia.mjs — kurgu bolgesel olcum aginda tek bir sayac okumasinin sahadan merkeze
// giderken tasidigi iddialar (model): gercek bir ag, gercek bir ana bilgisayar adi ya da
// gercek bir genel adres yok. Rastgelelik yok.

// PG1: her mesaj bir iddia tasir; iddia, alicinin dogru saymasi beklenen bir onermedir.
// PG2: bir iddianin kaniti, alicinin iddiayi gondericiden bagimsiz sinayabildigi veridir;
// kaniti olmayan iddia dogrulanmadan kabul edilir. Son sutun, iddianin bu konudaki hangi
// derste olculdugudur.
export const IDDIA = `
  baglanti  kaynak donanim adresi bana ait          uc-kaydi        03
  baglanti  su ag adresi su donanim adresine ait    uc-kaydi        03
  baglanti  bu bolutun ag gecidi benim              uc-kaydi        03
  baglanti  bu cerceve su bolute ait                -                -
  ag        paketin kaynak adresi benim             kaynak-suzme    06
  ag        bu ag benim uzerimden gecilir           -               07
  ag        bu parca su butunun parcasidir          -               06
  ag        bu denetim iletisi agdan geliyor        -               06
  tasima    bu segment acik oturuma ait             oturum-baglama  08
  tasima    bu oturumu ben actim                    oturum-baglama  06
  tasima    bu oturumu ben kapatiyorum              oturum-baglama  07
  uygulama  su ad su adrese karsilik gelir          imzali-ad       04
  uygulama  adres dagitimini yapan sunucu benim     -               05
  uygulama  karsi uc sunucu benim                   uc-dogrulama    07
  uygulama  ben su saha terminaliyim                uc-dogrulama    02
  uygulama  bu yanit benim istegime karsiliktir     uc-dogrulama    04
  uygulama  bu okuma su sayactan geldi              -               08
  uygulama  bu istek daha once gonderilmedi         -               08`
  .trim().split("\n").map((r) => {
    const p = r.trim().split(/\s{2,}/);
    return { kat: p[0], ad: p[1], dog: p[2], ders: p[3] };
  });

// PG3: bir savunma yalnizca kendi katmaninin ve ustundeki katmanin iddialarini
// dogrulanabilir kilar; alt katmanin iddiasi ona gorunmez.
// Bedel sutunlari: ek tur = el sikismaya eklenen gidis-donus; anahtar = surekli yonetilen
// anahtar kalemi; elle = elle tutulan yapilandirma kalemi; red = reddedilen mesru baglanti;
// eski = disarida kalan eski aygit.
export const SAVUNMA = {
  "uc-kaydi":       { kat: "baglanti", tur: 0, anahtar: 0, elle: 14, red: 3, eski: 0 },
  "kaynak-suzme":   { kat: "ag",       tur: 0, anahtar: 0, elle: 6,  red: 2, eski: 0 },
  "oturum-baglama": { kat: "tasima",   tur: 1, anahtar: 0, elle: 0,  red: 0, eski: 2 },
  "imzali-ad":      { kat: "uygulama", tur: 1, anahtar: 4, elle: 2,  red: 1, eski: 0 },
  "uc-dogrulama":   { kat: "uygulama", tur: 2, anahtar: 9, elle: 3,  red: 5, eski: 4 },
};

export const KATMAN = ["baglanti", "ag", "tasima", "uygulama"];
export const BEDEL = ["tur", "anahtar", "elle", "red", "eski"];
export const acik = (etkin) =>
  IDDIA.filter((i) => i.dog === "-" || !etkin.includes(i.dog)).length;
export const toplamBedel = (etkin) => BEDEL.map((b) =>
  etkin.reduce((s, d) => s + SAVUNMA[d][b], 0));
```

```js
// aglar/sayim.mjs — katman basina iddia sayimi: kacinin kaniti var, savunma kacini
// dogrulanabilir kiliyor, kaci hala dogrulanamiyor ve bunun bedeli ne.
import { IDDIA, SAVUNMA, KATMAN, acik, toplamBedel } from "./iddia.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 hepsi = Object.keys(SAVUNMA);

console.log(`${IDDIA.length} iddia, ${KATMAN.length} katman, ${hepsi.length} savunma; ` +
  `kaniti olan iddia ${IDDIA.length - acik([])}, dogrulanmadan kabul edilen ${acik([])}`);

const A = [-11, 8, 9, 14, 13];
console.log("\n1. katman basina iddia ve kaniti olan iddia sayisi");
yaz(A, "katman", "iddia", "kaniti", "kilinabilir", "savunmasiz");
for (const k of KATMAN) {
  const s = IDDIA.filter((i) => i.kat === k);
  yaz(A, k, s.length, 0, s.filter((i) => i.dog !== "-").length,
    s.filter((i) => i.dog === "-").length);
}

const B = [-16, -10, 12, 8, 8, 9, 7, 6];
console.log("\n2. her savunma tek basina acikken");
yaz(B, "savunma", "katman", "dogrulanan", "kalan", "ek tur", "anahtar", "elle", "red");
for (const d of hepsi) {
  const s = SAVUNMA[d];
  yaz(B, d, s.kat, IDDIA.filter((i) => i.dog === d).length, acik([d]),
    s.tur, s.anahtar, s.elle, s.red);
}

const C = [-16, 12, 8, 8, 9, 7, 6, 6];
console.log("\n3. savunmalar alttan uste eklenirse (birikimli)");
yaz(C, "eklenen", "dogrulanan", "kalan", "ek tur", "anahtar", "elle", "red", "eski");
const etkin = [];
yaz(C, "hicbiri", 0, acik([]), 0, 0, 0, 0, 0);
for (const d of hepsi) {
  etkin.push(d);
  yaz(C, d, IDDIA.length - acik(etkin), acik(etkin), ...toplamBedel(etkin));
}

const D = [-40, -11, 7];
console.log("\n4. butun savunmalar acikken dogrulanamayan iddialar");
yaz(D, "iddia", "katman", "ders");
for (const i of IDDIA.filter((x) => x.dog === "-")) yaz(D, i.ad, i.kat, i.ders);

const E = [-16, 8, 13, 13, 13];
console.log("\n5. bir savunma altindaki katmanlarin kac iddiasini goruyor");
yaz(E, "savunma", "altta", "dogruladigi", "alttan acik", "ustten acik");
for (const d of hepsi) {
  const sinir = KATMAN.indexOf(SAVUNMA[d].kat);
  const a = IDDIA.filter((i) => KATMAN.indexOf(i.kat) < sinir);
  const u = IDDIA.filter((i) => KATMAN.indexOf(i.kat) >= sinir);
  yaz(E, d, a.length, IDDIA.filter((i) => i.dog === d).length,
    a.filter((i) => i.dog !== d).length, u.filter((i) => i.dog !== d).length);
}
```

```
18 iddia, 4 katman, 5 savunma; kaniti olan iddia 0, dogrulanmadan kabul edilen 18

1. katman basina iddia ve kaniti olan iddia sayisi
katman        iddia   kaniti   kilinabilir   savunmasiz
baglanti          4        0             3            1
ag                4        0             1            3
tasima            3        0             3            0
uygulama          7        0             4            3

2. her savunma tek basina acikken
savunma         katman      dogrulanan   kalan  ek tur  anahtar   elle   red
uc-kaydi        baglanti             3      15       0        0     14     3
kaynak-suzme    ag                   1      17       0        0      6     2
oturum-baglama  tasima               3      15       1        0      0     0
imzali-ad       uygulama             1      17       1        4      2     1
uc-dogrulama    uygulama             3      15       2        9      3     5

3. savunmalar alttan uste eklenirse (birikimli)
eklenen           dogrulanan   kalan  ek tur  anahtar   elle   red  eski
hicbiri                    0      18       0        0      0     0     0
uc-kaydi                   3      15       0        0     14     3     0
kaynak-suzme               4      14       0        0     20     5     0
oturum-baglama             7      11       1        0     20     5     2
imzali-ad                  8      10       2        4     22     6     2
uc-dogrulama              11       7       4       13     25    11     6

4. butun savunmalar acikken dogrulanamayan iddialar
iddia                                   katman        ders
bu cerceve su bolute ait                baglanti         -
bu ag benim uzerimden gecilir           ag              07
bu parca su butunun parcasidir          ag              06
bu denetim iletisi agdan geliyor        ag              06
adres dagitimini yapan sunucu benim     uygulama        05
bu okuma su sayactan geldi              uygulama        08
bu istek daha once gonderilmedi         uygulama        08

5. bir savunma altindaki katmanlarin kac iddiasini goruyor
savunma            altta  dogruladigi  alttan acik  ustten acik
uc-kaydi               0            3            0           15
kaynak-suzme           4            1            4           13
oturum-baglama         8            3            8            7
imzali-ad             11            1           11            6
uc-dogrulama          11            3           11            4
```
Sayılar **ölçüm** sınıfındadır; girdileri PG1–PG3'tür.

#### On Sekiz İddia, Sıfır Kanıt

Başlık satırı bu kursun çıkış noktasıdır: on sekiz iddianın **hiçbirinin kanıtı yoktur**.
Hiçbir savunma açık değilken alıcı, on sekiz önermenin tamamını yalnız gönderenin söylediği
için doğru sayar. Bu bir arıza değildir; sayılan protokollerin çoğu, ağ üzerindeki tarafların
birbirine zarar vermek istemediği bir ortam için tasarlanmıştır ve doğrulama o tasarımın
parçası değildir.

Birinci tablo dağılımı verir. Uygulama katmanı yedi iddia ile en yüklüsüdür, çünkü bir okumanın
anlamı orada kurulur: kim gönderdi, hangi sayaçtan geldi, hangi ada karşılık geliyor. Bağlantı
katmanı dört, ağ katmanı dört, taşıma katmanı üç iddia taşır. Ağ katmanı dört iddiasının
**üçünü** hiçbir savunmaya bağlayamaz; taşıma katmanı üç iddiasının üçünü de bağlar. İki katman
arasındaki bu fark, savunma bütçesinin nereye gittiğini önceden belirler.

Taşıma katmanının üçünü birden bağlayabilmesinin nedeni, üç iddianın da **aynı** kanıta
dayanmasıdır: bir oturumun açılışında iki tarafın üzerinde anlaştığı ve sonraki her mesajda
sınanabilen bir bağ. Ağ katmanının üç açık iddiası ise üç ayrı kanıt ister ve hiçbiri mesajın
içinde taşınamaz — bir paketin hangi yoldan geçtiği, alıcının elindeki veriden çıkarılamaz. Bir
katmandaki iddiaların **tek bir kanıta indirgenip indirgenemediği**, o katmanın savunma
maliyetini belirleyen asıl özelliktir.

#### Bir Savunma Neyi Göremez

İkinci tablo her savunmayı tek başına açar. En pahalı savunma olan uç doğrulama üç iddia
doğrular ve on beşini açık bırakır; en ucuz savunmalardan uç kaydı da üç iddia doğrular ve aynı
on beşi bırakır. Tek başına hiçbir savunma iddiaların altıda birinden fazlasını kapatmaz.

Beşinci tablo bunun nedenini gösterir ve PG3'ü sayıya çevirir. Uç doğrulama uygulama
katmanındadır; altında on bir iddia vardır ve bunların **on biri de** ona açık kalır. İmzalı ad
çözümleme için aynı sayı on birdir. Oturum bağlama sekiz alt iddianın sekizini görmez. Bir
savunmanın alt katmanda kapattığı iddia sayısı her satırda **sıfırdır**.

Bu, güvenli bir uygulama katmanı bağlantısının altındaki ağın hangi hâlde olduğunu neden
söylemediğinin ölçüsüdür. Uç doğrulama açıkken karşı ucun kim olduğu doğrulanır; o uca hangi
adres üzerinden gidildiği, o adresin hangi donanım adresine çözüldüğü ve paketin hangi ağdan
geçtiği doğrulanmaz. Bunlar ayrı iddialardır ve ayrı savunma ister.

#### Doğrulamanın Bedeli

Üçüncü tablo beş savunmayı alttan üste birikimli açar. Doğrulanan iddia sayısı 0, 3, 4, 7, 8,
11 diye ilerler; kalan 18'den 7'ye iner. Aynı satırlarda bedel de birikir: dört ek tur, on üç
anahtar kalemi, yirmi beş elle tutulan yapılandırma kalemi, on bir reddedilen meşru bağlantı ve
altı dışarıda kalan eski aygıt.

Bedelin biçimi savunmadan savunmaya değişir ve bu fark yönetim yükünü belirler. Uç kaydı hiçbir
ek tur ve hiçbir anahtar istemez, ama tek başına **on dört elle kalem** getirir: her uç için
bir kayıt. Uç doğrulama ise elle üç kalem tutar ama **dokuz anahtar kalemi** ve **iki ek tur**
ekler. Birincinin maliyeti insana, ikincininki her bağlantıya yazılır. On dört elle kalem, ağ
büyüdükçe doğrusal artar ve unutulan bir kalem sessizce açık bırakır; iki ek tur ise ağ
büyüdükçe artmaz, her bağlantıda aynı kalır.

Kaynak süzme satırı ters uçtadır: bir tek iddia doğrular ve altı elle kalem ile iki reddedilen
bağlantıya mal olur. Doğrulanan iddia başına düşen bedel, tablodaki en kötü orandır. Yine de o
tek iddia — kaynak adresin gerçekten göndericiye ait olması — altıncı derste ölçülecek bütün
kapasite aritmetiğinin girdisidir. **Doğrulanan iddia sayısı tek başına bir sıralama ölçütü
değildir; hangi iddianın doğrulandığı sayıdan önce gelir.**

#### Yedi İddia Açık Kalır

Dördüncü tablo bu dersin en önemli sonucudur. Beş savunmanın beşi de açıkken yedi iddia hâlâ
doğrulanamaz. Bunlar zayıf yapılandırmanın sonucu değildir; sayılan savunmaların hiçbirinin
kapsamına girmezler. Ağ katmanında üç, uygulama katmanında üç, bağlantı katmanında bir tane
vardır.

Yedisinin altısı bu konunun geri kalanında tek tek ölçülür. Adres dağıtımını yapan sunucunun
kim olduğu beşinci derste, yolun kimin üzerinden geçtiği yedinci derste, parçalama ve denetim
iletisi altıncı derste, okumanın kaynağı ve isteğin tazeliği sekizinci derste sayılır. Yalnız
biri — bir çerçevenin hangi bölüte ait olduğu — bu konuda ölçülmez, çünkü karşılığı protokolde
değil ağın çizildiği sınırdadır.

Bu yedi satır aynı zamanda konunun haritasıdır. Sonraki yedi dersin her biri buradaki bir ya da
birkaç satırı alır, kendi mesaj kümesinde koşturur ve aynı üç sütunu yazar. Sayı on sekizden
başlar ve her derste yalnız o dersin ele aldığı iddialar için değişir.

#### Özet

- Ağ yüzeyinin ölçü birimi doğrulanmadan kabul edilen iddia sayısıdır: bir sayaç okuması dört
  katmanda **18 iddia** taşır ve savunma yokken bunların **kanıtı olan sayısı sıfırdır**.
- Dağılım eşit değildir: uygulama katmanı 7, bağlantı ve ağ katmanı 4'er, taşıma katmanı 3
  iddia taşır; ağ katmanı 4 iddiasının 3'ünü hiçbir savunmaya bağlayamaz.
- Tek başına hiçbir savunma üçten fazla iddia doğrulamaz; en pahalı savunma da en ucuzu da 15
  iddiayı açık bırakır.
- Bir savunma altındaki katmanların iddialarının **hiçbirini** doğrulamaz: beş savunmanın
  beşinde de alt katmanda kapanan iddia sayısı sıfırdır.
- Beş savunma birlikte 11 iddia doğrular, 7'sini açık bırakır ve bedeli 4 ek tur, 13 anahtar
  kalemi, 25 elle kalem, 11 reddedilen bağlantı ile 6 dışarıda kalan aygıttır.

#### Sonraki Adım

Bu ders iddiaları bir okumanın yolculuğu boyunca saydı — yani ağın **konuştuğu** anı ölçtü.
Oysa bir uç, hiç kimse ona bir şey göndermeden önce de bir şey yapar: dinler. Açık bir bağlantı
noktası, üzerinden hiçbir mesaj geçmese bile bir bildirimdir; o uçtaki servisin belirli bir
iddia sınıfını **kabul etmeye hazır** olduğunu söyler. Yedi açık uç, yedi ayrı hazır bekleyen
kabul demektir ve bunların kaçının o makinede gerçekten bir işi olduğu ayrı bir sayıdır.
Sonraki ders bir servis envanterini bu gözle sayar: hangi bağlantı noktası hangi iddiayı kabul
ediyor, kaç servis hiç kullanılmıyor ve kullanılmayanları kapatmak kaç iddiayı ortadan
kaldırıyor.

### Yaygın Bağlantı Noktaları ve Servisler

Source: https://academia.sh/tr/kurslar/ag-guvenligi/yaygin-baglanti-noktalari-ve-servisler

Açık servisin iddia cinsinden ölçülmesi: 20 servisin 6 konakta 49 kabul noktası açması, 21 kabul noktasının hiçbir kanıta dayanmaması, dış ağdan erişilebilen 4 servisin 30 günde tek meşru istek almaması, kullanılmayanı kapatıp erişimi daraltmanın kabul noktasını 27'ye indirmesi ama 4 dönemsel akışı kesmesi ve son 7 kabul noktasının doğrulanmasının 240 aygıtı dışarıda bırakması.

Önceki ders iddiaları ağın konuştuğu anda saydı: bir okuma sahadan merkeze giderken on sekiz
iddia taşıyor ve savunma yokken hiçbirinin kanıtı bulunmuyordu. Oysa bir uç, kendisine hiçbir
mesaj gelmeden önce de bir şey yapar. Dinler.

Dinlemek edilgen bir davranış değildir. Açık bir bağlantı noktası, üzerinden hiçbir mesaj
geçmese bile bir bildirimdir: o noktadaki servisin belirli bir iddia sınıfını kabul etmeye
hazır olduğunu söyler. Bir uzak kabuk servisi "ben şu kullanıcıyım" iddiasını, bir ölçüm alım
ucu "bu okuma şu sayaçtan geldi" iddiasını almaya hazırdır. Bu ders bir servis envanterini o
gözle sayar.

#### Açık Nokta Bir Kabul Bildirimidir

**PG4:** açık bir bağlantı noktası, üzerinden hiçbir mesaj geçmese bile o noktadaki servisin
belirli bir iddia sınıfını kabul etmeye hazır olduğunu bildirir. **PG5:** yüzeyin sayısı servis
sayısı değil **kabul noktası (accept point)** sayısıdır; kabul noktası, bir servis ile o
servise erişebilen bir bölge çiftidir. **PG6:** bir servisin kullanılıp kullanılmadığı yalnız
bir gözlem penceresi içinde bilinir; pencerenin dışında kalan dönemsel kullanım "hiç
kullanılmıyor" diye okunur.

PG5 bu dersin ölçüyü servis sayımından ayıran maddesidir. İki konakta açık duran aynı servis
iki kalemdir, ama biri yalnız merkezden, öteki dört bölgenin dördünden erişilebiliyorsa yüzeye
katkıları eşit değildir. Bağlantı noktalarının numaralandırılması, dinleyen soket ile bağlantı
soketi ayrımı ve numara aralıkları **Ağ Modelleri ve Protokoller** kursunda ölçüldü; burada
tekrarlanmaz. Buradaki tek soru, açık her noktanın hangi iddiayı hangi kanıta dayanarak kabul
ettiğidir.

Aşağıdaki envanter bir **modeldir**: kurgu bölgesel ölçüm ağının servisleri sayılır, gerçek bir
ana bilgisayar adı ya da gerçek bir genel adres yoktur. Böyle bir envanterin kendi ağının
dışında çıkarılması — hangi noktanın açık olduğunun uzaktan sınanması — **yazılı yetki ve
tanımlı kapsam olmadan hem yasadışı hem meslek dışıdır**.

```js
// aglar/envanter.mjs — kurgu bolgesel olcum aginin servis envanteri (model): gercek bir ag,
// gercek bir ana bilgisayar adi ya da gercek bir genel adres yok. Rastgelelik yok.

// PG4: acik bir baglanti noktasi, uzerinden hicbir mesaj gecmese bile bir bildirimdir; o
// noktadaki servisin belirli bir iddia sinifini kabul etmeye hazir oldugunu soyler.
// PG5: kabul noktasi = (servis, servise erisebilen bolge) ciftidir; yuzeyin sayisi
// servis sayisi degil, kabul noktasi sayisidir.
// Sutunlar: konak, baglanti noktasi, servis sinifi, dogrulama, 30 gunluk mesru istek,
// erisebilen bolgeler, son 30 gunde istek gonderen bolgeler, donemsel kullanan bolgeler,
// servise istek gonderen ve dogrulama yapamayacak eski aygit sayisi (bu aygitlar
// disarida kalirsa servisin 30 gunluk istek hacminin tamami durur).
// Bolgeler: d = dis ag, s = saha, b = sube, m = merkez.
export const SERVIS = `
  sube-gecidi  22    uzak-kabuk           istemci-kaniti     268  b,m      m      b     0
  sube-gecidi  23    eski-uzak-kabuk      parola               0  b,m      -      -     0
  sube-gecidi  161   aygit-izleme         topluluk-adi      9240  b,m      m      -     8
  sube-gecidi  8080  yonetim-arayuzu      parola             140  b,m      m      -     0
  toplayici    22    uzak-kabuk           istemci-kaniti     412  s,b,m    b,m    s     0
  toplayici    1883  olcum-alim-ucu       yok              89400  d,s,b,m  s,b    -   220
  toplayici    9100  olcum-disa-aktarim   yok               8640  b,m      m      -     0
  toplayici    514   gunluk-toplama       yok              43200  s,b,m    b,m    -    14
  dogrulayici  22    uzak-kabuk           istemci-kaniti     190  b,m      m      -     0
  dogrulayici  443   ic-servis-ucu        belirtec         61300  b,m      b,m    -     0
  dogrulayici  5432  veritabani-dinleyici parola               0  b,m      -      m     0
  faturalama   443   ic-servis-ucu        belirtec         22800  b,m      b,m    -     0
  faturalama   80    sifresiz-web-ucu     yok               1150  d,b,m    b      -     0
  faturalama   5432  veritabani-dinleyici parola           47600  b,m      m      -     0
  faturalama   21    eski-dosya-aktarimi  parola              36  d,b,m    m      -     0
  ad-sunucusu  53    ad-cozumleme         yok             128400  d,s,b,m  s,b,m  -     0
  ad-sunucusu  123   zaman-esitleme       yok              34600  s,b,m    s,b,m  -     6
  dizin-ucu    389   dizin-sorgulama      parola           19700  b,m      b,m    -     0
  dizin-ucu    445   dosya-paylasimi      parola            3300  b,m      b      m     0
  dizin-ucu    631   yazici-hizmeti       yok                  0  b,m      -      -     0`
  .trim().split("\n").map((r) => {
    const p = r.trim().split(/\s+/);
    const kume = (x) => (x === "-" ? [] : x.split(","));
    return { konak: p[0], nokta: +p[1], servis: p[2], dog: p[3], istek: +p[4],
      eris: kume(p[5]), kullan: kume(p[6]), donem: kume(p[7]), eski: +p[8] };
  });

export const KONAK = [...new Set(SERVIS.map((s) => s.konak))];
export const nokta = (l) => l.reduce((t, s) => t + s.eris.length, 0);
export const acikNokta = (l) =>
  l.filter((s) => s.dog === "yok").reduce((t, s) => t + s.eris.length, 0);
```

```js
// aglar/yuzey.mjs — acik servis kac iddia kabul noktasi acar, kaci hic kullanilmiyor,
// daraltmanin ve dogrulama eklemenin bedeli ne.
import { SERVIS, KONAK, nokta, acikNokta } from "./envanter.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 BOLGE = ["d", "s", "b", "m"];
const bos = SERVIS.filter((s) => s.istek === 0);

console.log(`${SERVIS.length} servis, ${KONAK.length} konak, ${BOLGE.length} bolge; ` +
  `kabul noktasi ${nokta(SERVIS)}, dogrulamasiz kabul noktasi ${acikNokta(SERVIS)}, ` +
  `30 gunde hic istek almayan servis ${bos.length}`);

const A = [-14, 8, 15, 14, 10, 12];
console.log("\n1. konak basina");
yaz(A, "konak", "servis", "dogrulamasiz", "kullanilmayan", "kabul", "30g istek");
for (const k of KONAK) {
  const l = SERVIS.filter((s) => s.konak === k);
  yaz(A, k, l.length, l.filter((s) => s.dog === "yok").length,
    l.filter((s) => s.istek === 0).length, nokta(l),
    l.reduce((t, s) => t + s.istek, 0));
}

const B = [-16, 8, 9, 12];
console.log("\n2. kabul edilen iddianin dayandigi kanit");
yaz(B, "dogrulama", "servis", "kabul", "30g istek");
for (const d of [...new Set(SERVIS.map((s) => s.dog))]) {
  const l = SERVIS.filter((s) => s.dog === d);
  yaz(B, d, l.length, nokta(l), l.reduce((t, s) => t + s.istek, 0));
}

const C = [-34, 8, 14, 13, 14, 10];
console.log("\n3. yuzeyi daraltma adimlari (birikimli)");
yaz(C, "adim", "kabul", "dogrulamasiz", "duran istek", "kesilen akis", "disarida");
let kalan = SERVIS, kesik = 0, duran = 0, disarida = 0;
const satir = (ad) => yaz(C, ad, nokta(kalan), acikNokta(kalan), duran, kesik, disarida);
satir("hicbiri");
kesik += bos.reduce((t, s) => t + s.donem.length, 0);
kalan = kalan.filter((s) => s.istek > 0);
satir("hic kullanilmayan servisi kapat");
kesik += kalan.reduce((t, s) => t + s.donem.filter((z) => !s.kullan.includes(z)).length, 0);
kalan = kalan.map((s) => ({ ...s, eris: s.kullan }));
satir("erisimi kullanan bolgeye daralt");
const dogrula = (sec) => {
  const l = kalan.filter((s) => s.dog === "yok" && sec(s));
  disarida += l.reduce((t, s) => t + s.eski, 0);
  duran += l.filter((s) => s.eski > 0).reduce((t, s) => t + s.istek, 0);
  kalan = kalan.map((s) => (l.includes(s) ? { ...s, dog: "eklendi" } : s));
};
dogrula((s) => s.eski === 0);
satir("eski aygiti olmayana dogrulama");
dogrula(() => true);
satir("kalanlara da dogrulama");

const D = [-14, -20, 8, 11, 12];
console.log("\n4. daraltmadan sonra dogrulamasiz kalan servisler");
yaz(D, "konak", "servis", "kabul", "30g istek", "eski aygit");
for (const s of SERVIS.filter((x) => x.dog === "yok" && x.istek > 0 && x.eski > 0))
  yaz(D, s.konak, s.servis, s.kullan.length, s.istek, s.eski);

const E = [-8, 10, 12, 14, 14];
console.log("\n5. bolge basina erisilen ve kullanilan servis");
yaz(E, "bolge", "erisilen", "kullanilan", "kullanilmayan", "dogrulamasiz");
for (const z of BOLGE) {
  const e = SERVIS.filter((s) => s.eris.includes(z));
  const k = SERVIS.filter((s) => s.kullan.includes(z));
  yaz(E, z, e.length, k.length, e.length - k.length,
    e.filter((s) => s.dog === "yok").length);
}
```

```
20 servis, 6 konak, 4 bolge; kabul noktasi 49, dogrulamasiz kabul noktasi 21, 30 gunde hic istek almayan servis 3

1. konak basina
konak           servis   dogrulamasiz kullanilmayan     kabul   30g istek
sube-gecidi          4              0             1         8        9648
toplayici            4              3             0        12      141652
dogrulayici          3              0             1         6       61490
faturalama           4              1             0        10       71586
ad-sunucusu          2              2             0         7      163000
dizin-ucu            3              1             1         6       23000

2. kabul edilen iddianin dayandigi kanit
dogrulama         servis    kabul   30g istek
istemci-kaniti         3        7         870
parola                 7       15       70776
topluluk-adi           1        2        9240
yok                    7       21      305390
belirtec               2        4       84100

3. yuzeyi daraltma adimlari (birikimli)
adim                                 kabul  dogrulamasiz  duran istek  kesilen akis  disarida
hicbiri                                 49            21            0             0         0
hic kullanilmayan servisi kapat         43            19            0             1         0
erisimi kullanan bolgeye daralt         27            12            0             4         0
eski aygiti olmayana dogrulama          27             7            0             4         0
kalanlara da dogrulama                  27             0       167200             4       240

4. daraltmadan sonra dogrulamasiz kalan servisler
konak         servis                 kabul  30g istek  eski aygit
toplayici     olcum-alim-ucu             2      89400         220
toplayici     gunluk-toplama             2      43200          14
ad-sunucusu   zaman-esitleme             3      34600           6

5. bolge basina erisilen ve kullanilan servis
bolge     erisilen  kullanilan kullanilmayan  dogrulamasiz
d                4           0             4             3
s                5           3             2             4
b               20          10            10             7
m               20          14             6             7
```
Sayılar **ölçüm** sınıfındadır; girdileri PG4–PG6'dır.

#### Kırk Dokuz Kabul Noktası

Yirmi servis altı konakta **49 kabul noktası** açar. Bu, servis sayısının iki buçuk katıdır ve
farkın nedeni erişim genişliğidir: envanterdeki servislerin çoğu iki bölgeden, bazıları
dördünden birden erişilebilir durumdadır. Kırk dokuz noktanın **yirmi biri** hiçbir kanıta
dayanmaz.

İkinci tablo kanıtın dayanağına göre ayırır. Yedi servis hiçbir doğrulama yapmaz ve bunlar 21
kabul noktası ile envanterin en geniş grubudur; aynı yedi servis otuz günlük istek hacminin
305.390'ını, yani en büyük payını taşır. Yedi servis parola ile 15 kabul noktası açar. Üç
servis istemci kanıtı ister ve yalnız 7 kabul noktası açar; taşıdıkları istek hacmi 870'tir.
**En sıkı doğrulanan servisler en az iş taşıyan servislerdir**; doğrulamanın hiç bulunmadığı
yerde işin tamamı akmaktadır. Bu ters orantı bir tesadüf değildir: doğrulama eklemek, o servisi
kullanan her istemciyi değiştirmeyi gerektirir ve en çok kullanılan servis en pahalı
değişikliktir.

Birinci tablo yükün nerede toplandığını gösterir. Toplayıcı dört servisin üçünde doğrulama
yapmaz ve tek başına 12 kabul noktası açar. Ad sunucusu iki servisin ikisinde de doğrulama
yapmaz ve 163.000 istekle envanterin en yoğun konağıdır. Buna karşılık şube geçidi dört
servisin dördünde de bir kanıt ister.

Konak başına servis sayısı da yüzeyin yerine geçmez. Şube geçidi ile faturalama dörder servis
taşır, ama biri 8 kabul noktası açar öteki 10; dizin ucu üç servisle 6 nokta açarken
doğrulayıcı da üç servisle 6 nokta açar ve ikisinin doğrulamasız nokta sayısı farklıdır.
**Konak sayısı, servis sayısı ve kabul noktası sayısı üç ayrı büyüklüktür ve yalnız üçüncüsü
daraltma kararına girdi verir.**

#### Otuz Gün Neyi Göstermez

Beşinci tablo bölge başına okur ve bu dersin en dikkat çekici satırını üretir: **dış ağdan dört
servise erişilebilirken bu dört servisin hiçbiri otuz günde dış ağdan tek bir meşru istek
almamıştır**. Dördünün üçünde doğrulama yoktur. Bu dört kalem, karşılığında hiçbir iş
görülmeyen, ama tam olarak dış ağa açık duran bir kabul yüzeyidir.

Saha bölgesinde de benzer bir aralık vardır: beş servise erişilebilir, üçü kullanılır. Şube
bölgesi yirmi servisin onunu, merkez on dördünü kullanır. Erişilebilen ile kullanılan
arasındaki fark her bölgede vardır ve toplamı yüzeyin yarısına yakındır.

Üç servis otuz günde hiç istek almamıştır. Burada PG6 devreye girer ve pencerenin yalanını
ölçer: bu üç servisten biri — doğrulayıcı üzerindeki veritabanı dinleyicisi — merkez tarafından
**dönemsel** olarak kullanılır ve otuz günlük pencereye düşmemiştir. Kullanım verisine bakıp
kapatmak, bu kalemde çalışan bir akışı keser.

#### Daraltmanın Dört Adımı

Üçüncü tablo yüzeyi adım adım daraltır ve her adımın bedelini yazar. Hiç kullanılmayan üç
servisi kapatmak kabul noktasını 49'dan 43'e indirir, hiçbir isteği durdurmaz ve **bir dönemsel
akışı** keser. Erişimi gerçekten kullanan bölgeye daraltmak en büyük kazancı verir: 43'ten
**27'ye** iner, yine hiçbir isteği durdurmaz, ama kesilen dönemsel akış sayısı dörde çıkar. İlk
iki adım birlikte yüzeyin %44,9'unu, otuz günlük istek hacminin sıfırını harcayarak kapatır.

Kesilen dört akışın ortak özelliği, hiçbirinin otuz günlük pencerede görünmemesidir: şube
geçidine şubeden bağlanan uzak kabuk, toplayıcıya sahadan bağlanan uzak kabuk, dizin ucundaki
dosya paylaşımına merkezden gelen erişim ve kapatılan veritabanı dinleyicisi. Dördü de meşrudur
ve dördü de gözlem penceresi uzatılsaydı görünürdü. **Kullanım verisine dayanan her daraltmanın
bedeli, pencere uzunluğunun bir işlevidir.** Otuz günlük bir pencere aylık işleri görür, üç
aylık kapanış işlerini görmez; pencereyi uzatmak kesilen akışı azaltır ama kapatılabilecek
kalem sayısını da azaltır.

#### Doğrulanamayan Yedi Nokta

Son iki adım kalan doğrulamasız kabul noktalarını kapatmayı dener ve kabul noktası sayısını hiç
değiştirmez — 27'de kalır. Değişen şey doğrulamasız noktaların 12'den önce 7'ye, sonra 0'a
inmesidir. Kabul noktası ile doğrulamasız kabul noktası **ayrı iki sayıdır**: bir servis kapalı
değilse yüzeydedir, doğrulanıyorsa yalnız kanıtsız değildir.

Dördüncü tablo son adımın bedelini gösterir. Doğrulamasız kalan üç servisin üçüne de doğrulama
yapamayan aygıtlar istek göndermektedir: ölçüm alım ucuna 220, günlük toplamaya 14, zaman
eşitlemeye 6 aygıt. Doğrulama eklemek bu **240 aygıtı** dışarıda bırakır ve üç servisin otuz
günlük 167.200 isteğinin tamamını durdurur. Ölçüm alım ucu ağın asıl işidir ve doğrulanamayan
tek en büyük kalemdir.

Burada savunma yetmemektedir. İlk üç adım bedelsiz ya da neredeyse bedelsizdir; son adım
envanterin en çok iş taşıyan servisini kapatmakla eşdeğerdir. Doğrulamasız yedi kabul noktası,
yanlış bir yapılandırma kararının değil, uçlardaki aygıtların kanıt üretememesinin sonucudur.

#### Özet

- Açık bir bağlantı noktası, bir iddia sınıfını kabul etmeye hazır olunduğunun bildirimidir;
  yüzeyin sayısı servis sayısı değil, servis ile erişebilen bölge çiftlerinin sayısıdır.
- Envanterdeki 20 servis 6 konakta **49 kabul noktası** açar; bunların **21'i** hiçbir kanıta
  dayanmaz ve aynı 21 nokta otuz günlük istek hacminin en büyük payını taşır.
- Dış ağdan 4 servise erişilebilir ve dördü de otuz günde dış ağdan tek meşru istek almamıştır;
  üçünde doğrulama yoktur.
- Kullanılmayanı kapatmak ve erişimi kullanan bölgeye daraltmak kabul noktasını 49'dan 27'ye
  indirir, hiçbir isteği durdurmaz, ama pencereye düşmeyen **4 dönemsel akışı** keser.
- Kalan 7 doğrulamasız kabul noktasına doğrulama eklemek 240 aygıtı dışarıda bırakır ve 167.200
  isteği durdurur; bu servisler yanlış yapılandırıldığı için değil, uçları kanıt üretemediği
  için doğrulanamaz.

#### Sonraki Adım

Bu ders bir servise **erişilebildiğini** varsaydı: envanterdeki her satır, bir bölgeden bir
konağa paketin ulaşabildiğini kabul ederek yazıldı. Oysa aynı bölütteki iki makinenin birbirine
ulaşması bile bir iddiaya dayanır. Bir uç, hedefin ağ adresini bilir ama çerçeveyi hangi
donanım adresine göndereceğini bilmez; bunu sorar ve gelen ilk yanıtı **hiçbir kanıt
istemeden** önbelleğine yazar. Sonraki ders o önbelleği bir veri yapısı olarak kurar ve sayar:
doğrulanmayan bir yanıt kaç kaydı bozuyor, tutarlılık denetimi kaçını yakalıyor, sabit kayıt
kaçını kurtarıyor ve bunun elle yönetim bedeli ne oluyor.

### Adres Çözümleme Saldırıları

Source: https://academia.sh/tr/kurslar/ag-guvenligi/adres-cozumleme-saldirilari

Adres çözümleme önbelleğinin doğrulanmayan yanıtla bozulmasının ölçülmesi: 26 yanıtlık kümede 18 kaydın 6'sının bozulması, sabit kaydın 4'ünü kurtarıp 2'sini bırakması, tutarlılık denetiminin 5'ini kurtarıp en değerli kaydı bırakması, yalnız istenen yanıtı kabul etmenin altısını da kurtarıp 3 meşru duyuruyu kesmesi ve üç savunmanın birlikte 4 meşru yanıt reddedip 2 kaydı hiç oluşturmaması.

Önceki ders bir servise erişilebildiğini varsaydı: envanterdeki her satır, bir bölgeden bir
konağa paketin ulaşabildiğini kabul ederek yazıldı. Oysa aynı bölütteki iki makinenin birbirine
ulaşması bile bir iddiaya dayanır. Bir uç hedefin ağ adresini bilir, ama çerçeveyi hangi
donanım adresine göndereceğini bilmez. Bunu sorar ve gelen yanıtı önbelleğine yazar.

Yazma kuralı bu dersin çıkış noktasıdır. Önbellek gelen yanıtın doğru olup olmadığını sınamaz;
yanıtın istenmiş olup olmadığını bile sormaz. Bu kabulün yanlış bir eşleme üretmesine **adres
çözümleme zehirlenmesi (ARP poisoning)**, gönderenin kendini başka bir adresin sahibi olarak
sunmasına **adres çözümleme sahteciliği (ARP spoofing)** denir. Birinci dersteki on sekiz
iddiadan üçü bağlantı katmanındaydı ve üçü de bu tek kurala bağlıdır. Bu ders o kuralı bir veri
yapısı üzerinde koşturur ve doğrulanmayan bir yanıtın kaç kaydı bozduğunu sayar.

#### Önbellek Neyi Sınayabilir

**PG7:** adres çözümleme önbelleğinin kabul kuralı "son yanıt kazanır"dır; yanıtın istenmiş
olması ve doğru olması kurala girmez. **PG8:** bir kaydın bozulması, o ağ adresinin gerçekte
ait olmadığı bir donanım adresine bağlanmasıdır; bozulan her kayıt o adrese giden bütün
çerçeveleri yönlendirir. **PG9:** bir savunma yanıtı yalnız önbelleğin kendi verisinden
sınayabilir; yanıtın doğru olup olmadığını bilmez.

PG9 bu dersin sınırıdır ve üç savunmanın üçünü birden belirler. Önbellekte "doğru eşleme" diye
bir kaynak yoktur; sınanabilecek tek şey, gelen yanıtın önbellekteki verilerle **tutarlı** olup
olmadığıdır. Protokol mekaniği — istek ve yanıtın taşınması, önbellek yaşam süresi, vekil ve
istenmeden gönderilen kullanım biçimleri — **Ağ Modelleri ve Protokoller** kursunda ölçüldü;
burada tekrarlanmaz.

Aşağıdaki yanıt kümesi bir **modeldir**: kurgu bölgesel ölçüm ağının bir bölütünde önbelleğe
ulaşan yanıtlar veri olarak yazılır, gerçek bir ağ ya da gerçek bir donanım adresi yoktur.
Kümede hiçbir sahte yanıt üretim adımı yer almaz; yalnız önbelleğin kabul kuralı ve denetimi
koşar. Böyle bir yanıt kümesinin gerçek bir ağa gönderilmesi **yazılı yetki ve tanımlı kapsam
olmadan hem yasadışı hem meslek dışıdır**.

```js
// aglar/cozumleme.mjs — kurgu bolgesel olcum agindaki bir bolutun adres cozumleme
// onbellegi (model): gercek bir ag, gercek bir donanim adresi yok. Donanim adresleri
// d01..d17 diye etiketlenmistir. Rastgelelik yok.

// PG7: adres cozumleme onbelleginin kabul kurali "son yanit kazanir"dir; yanitin
// istenmis olmasi ve dogru olmasi kurala girmez.
// PG8: bir kaydin bozulmasi, o ag adresinin gercekte ait olmadigi bir donanim adresine
// baglanmasidir; bozulan her kayit o adrese giden butun cerceveleri yonlendirir.
// Sutunlar: ag adresi, iddia eden donanim adresi, bekleyen bir istege yanit mi (e/h),
// iddia dogru mu (e/h). Son sutun yalnizca puanlama icindir; hicbir savunma onu gormez.
export const YANIT = `
  10.20.0.1   d01  e e     10.20.0.5   d02  e e     10.20.0.6   d03  e e
  10.20.0.7   d04  e e     10.20.0.8   d05  e e     10.20.0.9   d06  e e
  10.20.0.10  d07  e e     10.20.1.11  d08  e e     10.20.1.12  d09  e e
  10.20.1.13  d10  e e     10.20.2.21  d11  e e     10.20.2.22  d12  e e
  10.20.0.11  d13  e e     10.20.0.12  d14  e e     10.20.0.30  d17  e e
  10.20.0.31  d17  e e     10.20.0.2   d01  h e     10.20.0.32  d17  e e
  10.20.0.7   d15  h e     10.20.2.22  d16  h e     10.20.0.1   d09  h h
  10.20.0.5   d09  h h     10.20.0.6   d09  h h     10.20.0.8   d09  h h
  10.20.0.10  d09  h h     10.20.0.9   d09  h h`
  .trim().split(/\s+/).reduce((l, _, i, a) => (i % 4 ? l : [...l,
    { ag: a[i], don: a[i + 1], ist: a[i + 2] === "e", dog: a[i + 3] === "e" }]), []);

// PG9: bir savunma yaniti yalnizca onbellegin kendi verisinden sinayabilir; dogrulugu
// bilmez. Uc savunma da bu sinirla calisir.
export const SABIT = ["10.20.0.1", "10.20.0.5", "10.20.0.6", "10.20.0.7", "10.20.0.10"];
export const ESIK = 2;

// Onbellek, yanitlari sirayla isler; secilen savunmalar her yaniti kabul etmeden once sinar.
export function onbellek(savunma = []) {
  const tablo = new Map(), red = [];
  for (const y of YANIT) {
    if (savunma.includes("sabit") && SABIT.includes(y.ag) && tablo.has(y.ag)) {
      red.push(y); continue;
    }
    if (savunma.includes("istendi") && !y.ist) { red.push(y); continue; }
    if (savunma.includes("tutarlilik")) {
      const sonra = [...tablo].filter(([a, d]) => d === y.don && a !== y.ag).length + 1;
      if (sonra > ESIK) { red.push(y); continue; }
    }
    tablo.set(y.ag, y.don);
  }
  const bozuk = [...tablo].filter(([a, d]) =>
    !YANIT.some((y) => y.ag === a && y.don === d && y.dog));
  return { tablo, bozuk, redMesru: red.filter((y) => y.dog), redYanlis: red.filter((y) => !y.dog) };
}
```

```js
// aglar/onbellek-denetimi.mjs — dogrulanmayan yanit kac kaydi bozuyor, hangi savunma
// kacini kurtariyor, kaci kaliyor ve bedeli ne.
import { YANIT, SABIT, ESIK, onbellek } from "./cozumleme.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 taban = onbellek();

console.log(`${YANIT.length} yanit, ${taban.tablo.size} kayit; ` +
  `bozulan kayit ${taban.bozuk.length}, dogru olmayan yanit ` +
  `${YANIT.filter((y) => !y.dog).length}, istenmeden gelen yanit ` +
  `${YANIT.filter((y) => !y.ist).length}`);

const A = [-14, 10, 13, 9];
console.log("\n1. yanit kumesi: istenmis olmak ile dogru olmak ayri iki ozelliktir");
yaz(A, "yanit", "dogru", "dogru degil", "toplam");
for (const [ad, f] of [["istenmis", (y) => y.ist], ["istenmemis", (y) => !y.ist]]) {
  const l = YANIT.filter(f);
  yaz(A, ad, l.filter((y) => y.dog).length, l.filter((y) => !y.dog).length, l.length);
}

const B = [-10, 8, 15, 12];
console.log("\n2. belirti: bir donanim adresi kac ag adresi ustlendi");
yaz(B, "donanim", "iddia", "kabul edilen", "esik ustu");
const don = [...new Set(YANIT.map((y) => y.don))];
for (const d of don.filter((d) => YANIT.filter((y) => y.don === d).length > 1)) {
  const l = [...new Set(YANIT.filter((y) => y.don === d).map((y) => y.ag))];
  const k = [...taban.tablo].filter(([, v]) => v === d).length;
  yaz(B, d, l.length, k, l.length > ESIK ? "evet" : "hayir");
}

const C = [-28, 8, 8, 12, 11, 8, 8];
console.log("\n3. savunmalar: kurtarilan kayit ve bedeli");
yaz(C, "savunma", "kayit", "bozuk", "kurtarilan", "red mesru", "elle", "ek tur");
for (const s of [[], ["sabit"], ["tutarlilik"], ["istendi"], ["sabit", "tutarlilik"],
  ["sabit", "tutarlilik", "istendi"]]) {
  const r = onbellek(s);
  yaz(C, s.join(" + ") || "hicbiri", r.tablo.size, r.bozuk.length,
    taban.bozuk.length - r.bozuk.length, r.redMesru.length,
    s.includes("sabit") ? SABIT.length : 0, s.includes("istendi") ? r.tablo.size : 0);
}

const D = [-28, -34, -1];
console.log("\n4. hangi kayit bozuk kaliyor, hangi mesru yanit reddediliyor");
yaz(D, "savunma", "bozuk kalan kayit", "reddedilen mesru yanit");
for (const s of [["sabit"], ["tutarlilik"], ["istendi"], ["sabit", "tutarlilik"]]) {
  const r = onbellek(s);
  yaz(D, s.join(" + "), r.bozuk.map(([a]) => a).join(" ") || "yok",
    r.redMesru.map((y) => `${y.ag}=${y.don}`).join(" ") || "yok");
}
```

```
26 yanit, 18 kayit; bozulan kayit 6, dogru olmayan yanit 6, istenmeden gelen yanit 9

1. yanit kumesi: istenmis olmak ile dogru olmak ayri iki ozelliktir
yanit              dogru  dogru degil   toplam
istenmis              17            0       17
istenmemis             3            6        9

2. belirti: bir donanim adresi kac ag adresi ustlendi
donanim      iddia   kabul edilen   esik ustu
d01              2              1       hayir
d09              7              7        evet
d17              3              3        evet

3. savunmalar: kurtarilan kayit ve bedeli
savunma                        kayit   bozuk  kurtarilan  red mesru    elle  ek tur
hicbiri                           18       6           0          0       0       0
sabit                             18       2           4          1       5       0
tutarlilik                        17       1           5          1       0       0
istendi                           17       0           6          3       0      17
sabit + tutarlilik                17       1           5          2       5       0
sabit + tutarlilik + istendi      16       0           6          4       5      16

4. hangi kayit bozuk kaliyor, hangi mesru yanit reddediliyor
savunma                     bozuk kalan kayit                 reddedilen mesru yanit
sabit                       10.20.0.8 10.20.0.9               10.20.0.7=d15
tutarlilik                  10.20.0.1                         10.20.0.32=d17
istendi                     yok                               10.20.0.2=d01 10.20.0.7=d15 10.20.2.22=d16
sabit + tutarlilik          10.20.0.8                         10.20.0.32=d17 10.20.0.7=d15
```
Sayılar **ölçüm** sınıfındadır; girdileri PG7–PG9'dur.

#### Altı Kayıt

Yirmi altı yanıt on sekiz kayıt üretir ve savunma yokken bu kayıtların **altısı** bozuktur.
Bozulma oranı üçte birdir, ama asıl belirleyici olan hangi kayıtların bozulduğudur: ağ geçidi,
toplayıcı, doğrulayıcı, ad sunucusu, dizin ucu ve ölçüm deposu. Altısı da bölütün dışına ya da
merkezî hizmetlere giden trafiği taşıyan adreslerdir; sahadaki terminaller ile yazıcının
kayıtları bozulmamıştır.

Bozulan kayıt sayısı ile etkilenen trafik aynı sayı değildir. Önceki dersin envanterinde
toplayıcı üzerindeki dört servis otuz günde 141.652, ad sunucusu üzerindeki iki servis 163.000
istek almıştı. Bu bölütteki bir uç, bozulan altı kaydın altısı için hedefine giden çerçeveleri
yanlış donanım adresine teslim eder; kayıt başına düşen etki, o adresin taşıdığı istek hacmi
kadardır. **Bozulan kayıt sayısı yüzeyi ölçer, taşınan istek hacmi ise etkiyi ölçer ve ikisi
aynı sırayı vermez.**

Birinci tablo iki özelliği ayırır. On yedi yanıtın hepsi bekleyen bir isteğe karşılıktır ve
hepsi doğrudur. Dokuz yanıt istenmeden gelmiştir; bunların **üçü doğru, altısı değildir**.
İstenmemiş olmak yanlış olmak anlamına gelmez: sanal geçit adresinin duyurulması, faturalama
adresinin yedeğe devri ve bir arayüz değişimi istenmeden duyurulur ve üçü de meşrudur. Bir
savunmanın istenmemiş yanıtları toptan reddetmesi, altı yanlış yanıtla birlikte bu üçünü de
keser.

İkinci tablo denetimin gördüğü **belirtiyi** verir. Birden fazla ağ adresi üstlenen üç donanım
adresi vardır: biri iki, biri üç, biri **yedi** ağ adresi iddia eder ve yedisinin yedisi de
kabul edilmiştir. Yedili satır, aynı bölütteki bir uçtan gelen ve kendi adresi dışında altı
adres daha üstlenen yanıtları toplar. İki ve üç adres üstlenen satırlar ise meşrudur: biri ağ
geçidinin sanal adresi, öteki üç konuk sistem çalıştıran bir konaktır. **Belirti bir sayıdır,
bir karar değildir**; eşiğin nereye konduğu doğru ile yanlışı birlikte keser.

#### Üç Savunma, Üç Ayrı Boşluk

Üçüncü tablo üç savunmayı ayrı ayrı ve birlikte koşturur. Sabit kayıt beş adresi listeye alır
ve listedekiler için gelen sonraki yanıtları yok sayar: dört bozuk kaydı kurtarır, **ikisini
bırakır**. Bırakılanlar listede olmayan ad sunucusu ile dizin ucudur. Sabit kaydın koruması tam
olarak listenin uzunluğu kadardır ve listede olmayan hiçbir kaydı kurtarmaz.

Tutarlılık denetimi bir donanım adresinin en çok iki ağ adresi üstlenmesine izin verir ve altı
bozuk kaydın **beşini** kurtarır. Kurtaramadığı tek kayıt ağ geçididir. Nedeni sıradır: yedi
adres üstlenen donanım adresi kendi adresine ek olarak **önce** ağ geçidini iddia eder ve o
anda eşik henüz aşılmamıştır. Eşik ancak ikinci iddiada aşılır ve o noktadan sonrası
reddedilir. **Eşik tabanlı bir denetim, eşiğe kadar olan iddiaları kabul eder; kaçırdığı iddia
her zaman ilk iddiadır ve ilk iddia genellikle en değerli hedeftir.**

Yalnız istenen yanıtın kabul edilmesi altı bozuk kaydın altısını da kurtarır ve bozuk kayıt
sayısını sıfıra indirir. Üç savunma içinde tek eksiksiz olan budur, çünkü altı yanlış yanıtın
altısı da istenmeden gelmiştir. Bu eksiksizlik yanıt kümesinin bir özelliğidir, savunmanın
gücünün değil: bekleyen bir isteğe karşılık olarak gelen bir yanıt aynı denetimden geçerdi.

Üçüncü tablonun beşinci satırı bir savunma birleşiminin her zaman toplanmadığını gösterir.
Sabit kayıt ile tutarlılık denetimi birlikte açıldığında bozuk kayıt **bir** kalır — tutarlılık
denetiminin tek başına verdiği sayının aynısı. Buna karşılık reddedilen meşru yanıt bire değil
**ikiye** çıkar ve beş elle kalem de eklenir. Dördüncü tablo bozuk kalan kaydın **değiştiğini**
gösterir: tutarlılık tek başınayken ağ geçidi kaydı bozuk kalıyordu, birleşimde ad sunucusu
kaydı bozuk kalır. Sabit liste ilk üç iddiayı keser, dolayısıyla eşiği aşan ilk iddia artık
dördüncü sıradaki ad sunucusudur ve o kabul edilir. **Eşik tabanlı denetimin kaçırdığı kayıt,
önündeki savunma değiştiğinde yer değiştirir; kaçırılan kayıt sayısı sabit kalır.**

#### Bedelin Üç Biçimi

Dördüncü tablo her savunmanın kestiği meşru yanıtı adıyla verir ve üç bedelin biçimi
birbirinden tümüyle farklıdır.

Sabit kaydın bedeli **elle yönetimdir**: beş kalem listede tutulur, her adres değişikliğinde
elle güncellenir ve listedeki bir adres meşru olarak yer değiştirdiğinde değişiklik reddedilir.
Tabloda tam olarak bu görülür: faturalama adresinin yedeğe devri kesilir. Beş kalem küçük bir
sayıdır, ama ağdaki her yeni kritik adres bu sayıyı büyütür ve unutulan bir kalem sessizce
korumasız kalır.

Tutarlılık denetiminin bedeli **yanlış yakalamadır**: üç konuk sistem çalıştıran konağın üçüncü
adresi reddedilir. Eşiği üçe çıkarmak bu meşru kaydı kurtarır, ama aynı hareketle yedi adres
üstlenen satırın ikinci iddiasını da kabul eder. Eşik hem doğruyu hem yanlışı aynı yönde
kaydırır.

Yalnız istenen yanıtı kabul etmenin bedeli **tur sayısı ve kesilen duyurudur**: on yedi kaydın
her biri için bir istek turu gerekir ve istenmeden gelen üç meşru duyurunun üçü de reddedilir.
Bir yedeğe devir duyurusunun kesilmesi, önbelleğin eski kaydı yaşam süresi dolana kadar tutması
demektir; devir anında trafiğin bir bölümü eski donanım adresine gitmeye devam eder.

Üçü birlikte açıldığında bozuk kayıt sıfırdır, ama reddedilen meşru yanıt sayısı dörde çıkar ve
kayıt sayısı on sekizden **on altıya** iner. Eksik iki kayıt, hiçbir zaman oluşmayan iki
eşlemedir: sanal geçit adresi ve üçüncü konuk sistemin adresi. O iki adrese giden trafik, kayıt
oluşana kadar hiç gitmez. **Bozuk kaydı sıfırlamanın bedeli yalnız reddedilen yanıt değil,
oluşmayan kayıttır.** Reddedilen bir yanıt denetimde bir kayıt bırakır ve aranabilir; oluşmayan
bir eşleme hiçbir iz bırakmaz ve yalnız o adrese ulaşılamadığı görüldüğünde fark edilir.

#### Özet

- Adres çözümleme önbelleğinin kabul kuralı "son yanıt kazanır"dır; 26 yanıtlık kümede 18
  kaydın **6'sı** bozulur ve altısı da bölüt dışına giden trafiği taşıyan adreslerdir.
- İstenmiş olmak ile doğru olmak ayrı özelliklerdir: 17 istenmiş yanıtın 17'si doğrudur, 9
  istenmemiş yanıtın 3'ü doğru 6'sı değildir.
- Sabit kayıt listedeki 5 adres için 4 kaydı kurtarır ve listede olmayan 2'sini bırakır;
  tutarlılık denetimi 5 kaydı kurtarır ve sırası ilk olan ağ geçidi kaydını kaçırır.
- Yalnız istenen yanıtın kabul edilmesi 6 kaydın 6'sını kurtarır, ama istenmeden gelen 3 meşru
  duyuruyu keser ve 17 kayıt için ek istek turu getirir.
- Üç savunma birlikte bozuk kaydı sıfırlar; bedeli 4 reddedilen meşru yanıt, 5 elle kalem, 16
  ek tur ve hiç oluşmayan 2 kayıttır.

#### Sonraki Adım

Bu ders bir bölütün içinde kaldı: sorulan soru "şu ağ adresi hangi donanım adresine ait" idi ve
yanıt aynı bölütten geldi. Bölütün dışına çıkan her istek ise daha önce bir başka soru sorar —
bir adın hangi adrese karşılık geldiği. Bu sorunun yanıtı da bir önbelleğe yazılır, ama bu kez
önbellek yerel bir bölütte değil, ağın her katmanında bulunur ve tek bir yanlış kayıt tek bir
makineyi değil, o kaydı okuyan bütün istemcileri yönlendirir. Sonraki ders ad çözümleme
önbelleğini aynı biçimde kurar ve sayar: doğrulanmayan bir yanıt kaç kaydı ve kaç bağımlı
servisi bozuyor, imzalı doğrulama kaçını kurtarıyor, imzalanmamış bölge kaç kalemi dışarıda
bırakıyor.

### Ad Çözümleme Saldırıları

Source: https://academia.sh/tr/kurslar/ag-guvenligi/ad-cozumleme-saldirilari

Ad çözümleme önbelleğinin doğrulanmayan yanıtla bozulmasının ölçülmesi: 16 adın 7'sinin bozulup 73 bağımlı servisin 38'ini yönlendirmesi, imzalı doğrulamanın 3 kaydı kurtarıp imzasız bölgede 4'ünü bırakması, süresi dolmuş imzanın 2 adı hiç çözümlenemez kılıp 9 servisi durdurması, katı kipin bozuk kaydı sıfırlarken 47 servisi durdurması ve yaşam süresi tavanının bozuk kalma süresini %88,1 düşürüp sorgu sayısını %346,5 artırması.

Önceki ders bir bölütün içinde kaldı: sorulan soru bir ağ adresinin hangi donanım adresine ait
olduğuydu ve yanıt aynı bölütten geldi. Bölütün dışına çıkan her istek ise daha önce bir başka
soru sorar — bir adın hangi adrese karşılık geldiği. Bu sorunun yanıtı da bir önbelleğe
yazılır.

İki önbellek arasında bir ölçek farkı vardır. Bir adres çözümleme kaydı tek bir bölütte tek bir
hedefi yönlendirir; bir ad çözümleme kaydı ise o adı kullanan **bütün** servisleri birden
yönlendirir ve önbellek ağın her katmanında bulunur. Bir ad kaydının doğrulanmayan bir yanıtla
değiştirilmesine **ad çözümleme zehirlenmesi (DNS poisoning)**, bölge kayıtlarının imzalanıp
alıcı tarafından sınanmasına **imzalı ad çözümleme (DNSSEC)** denir. Bu ders o farkı sayar:
doğrulanmayan bir yanıt kaç kaydı ve kaç bağımlı servisi bozuyor, imzalı doğrulama kaçını
kurtarıyor, imzalanmamış bölge kaç kalem bırakıyor.

#### İmza Neyi Sınayabilir

**PG10:** ad çözümleme yanıtı bir iddiadır — "şu ad şu adrese karşılık gelir"; imzasız bir
bölgede bu iddianın önbellekte sınanabilecek hiçbir kanıtı yoktur. **PG11:** bir ad kaydının
bozulması o ada bağlı bütün servisleri birden yönlendirir; etkinin ölçüsü kayıt sayısı değil,
**bağımlı servis sayısıdır**. **PG12:** imza yalnız imzalanmış bölgenin yanıtlarını
sınayabilir; imzasız bölgenin yanıtı ne doğrulanabilir ne de yanlışlanabilir.

PG12 bu dersin belirleyici maddesidir. İmzalı ad çözümleme bir yanıtı "doğru" ya da "yanlış"
diye ikiye ayırmaz; **"doğrulandı", "doğrulanamadı" ve "sınanamadı"** diye üçe ayırır. Üçüncü
küme, imzasız bölgelerden gelen her yanıttır ve bu yanıtlar için önbellek ilk derste sayılan
durumda kalır: kanıt yoktur. Kayıt türleri, çözümleme zincirindeki roller ve yaşam süresine
dayalı önbellekleme **Bilgisayar Ağları** müfredatında ölçüldü; burada tekrarlanmaz.

Aşağıdaki ad kümesi bir **modeldir**: adlar ve bölgeler kurgudur, adresler özel ve belgeleme
için ayrılmış bloklardandır. Kümede hiçbir sahte yanıt üretim adımı yoktur; koşan kod
önbelleğin kabul kuralı ile denetimidir. Böyle bir yanıt kümesinin sahibi olmadığın bir
çözümleyiciye gönderilmesi **yazılı yetki ve tanımlı kapsam olmadan hem yasadışı hem meslek
dışıdır**.

```js
// aglar/ad-cozumleme.mjs — kurgu bolgesel olcum aginin ad cozumleme onbellegi (model):
// adlar ve bolgeler kurgudur, gercek bir alan adi yoktur; adresler ozel ve belgeleme icin
// ayrilmis bloklardandir. Rastgelelik yok.

// PG10: ad cozumleme yaniti bir iddiadir: "su ad su adrese karsilik gelir". Imzasiz bir
// bolgede bu iddianin onbellekte sinanabilecek hicbir kaniti yoktur.
// PG11: bir ad kaydinin bozulmasi, o ada bagli butun servisleri birden yonlendirir;
// etkinin olcusu kayit sayisi degil, bagimli servis sayisidir.
// Sutunlar: ad, bolge, yasam suresi (saniye), o ada bagli servis sayisi.
export const AD = `
  toplayici.olcum      olcum      3600  6    dogrulayici.olcum   olcum     3600  5
  depo.olcum           olcum      1800  4    alim.olcum          olcum      300  9
  aktarim.olcum        olcum      3600  2    faturalama.kurumsal kurumsal  3600  7
  isemri.kurumsal      kurumsal   3600  3    rapor.kurumsal      kurumsal  7200  1
  dizin.kurumsal       kurumsal   1800  8    kimlik.kurumsal     kurumsal   900 11
  sube01.saha          saha        600  2    sube02.saha         saha       600  2
  gecit.saha           saha       1800  4    arayuz.dis          dis       3600  3
  durum.dis            dis        7200  1    guncelleme.dis      dis       1800  5`
  .trim().split(/\s+/).reduce((l, _, i, a) => (i % 4 ? l : [...l,
    { ad: a[i], bolge: a[i + 1], ttl: +a[i + 2], bagimli: +a[i + 3] }]), []);

// PG12: imza yalnizca imzalanmis bolgenin yanitlarini sinayabilir; imzasiz bolgenin yaniti
// ne dogrulanabilir ne de yanlislanabilir.
export const IMZALI = ["olcum", "dis"];

// Onbellege ulasan yanitlar. imza: gecerli | gecersiz | dolmus | yok (imzasiz bolge).
// dog sutunu yalnizca puanlama icindir; hicbir savunma onu gormez.
export const YANIT = `
  toplayici.olcum      10.30.0.5     gecerli   e    alim.olcum      10.30.0.8   gecerli e
  depo.olcum           10.30.0.10    dolmus    e    aktarim.olcum   10.30.0.11  gecerli e
  dogrulayici.olcum    10.30.0.6     dolmus    e    rapor.kurumsal  10.30.1.9   yok     e
  faturalama.kurumsal  10.30.1.7     yok       e    dizin.kurumsal  10.30.1.12  yok     e
  isemri.kurumsal      10.30.1.8     yok       e    kimlik.kurumsal 10.30.1.13  yok     e
  sube01.saha          10.30.2.21    yok       e    sube02.saha     10.30.2.22  yok     e
  gecit.saha           10.30.2.1     yok       e    arayuz.dis      198.51.100.4 gecerli e
  durum.dis            198.51.100.5  gecerli   e    guncelleme.dis  198.51.100.6 gecerli e
  toplayici.olcum      10.30.9.90    gecersiz  h    dogrulayici.olcum 10.30.9.90 gecersiz h
  arayuz.dis           10.30.9.90    gecersiz  h    faturalama.kurumsal 10.30.9.90 yok    h
  kimlik.kurumsal      10.30.9.90    yok       h    sube01.saha     10.30.9.90  yok     h
  gecit.saha           10.30.9.90    yok       h`
  .trim().split(/\s+/).reduce((l, _, i, a) => (i % 4 ? l : [...l,
    { ad: a[i], adres: a[i + 1], imza: a[i + 2], dog: a[i + 3] === "e" }]), []);

// kip: "yok" = imza sinanmaz; "imzali" = gecersiz ve dolmus imza reddedilir;
// "kati" = imzasiz bolgenin yaniti da reddedilir.
export function cozumle(kip = "yok") {
  const tablo = new Map(), red = [];
  for (const y of YANIT) {
    const bozuk = y.imza === "gecersiz" || y.imza === "dolmus";
    if (kip !== "yok" && bozuk) { red.push(y); continue; }
    if (kip === "kati" && y.imza === "yok") { red.push(y); continue; }
    tablo.set(y.ad, y.adres);
  }
  const kayit = AD.map((a) => ({ ...a, adres: tablo.get(a.ad) }));
  return {
    kayit,
    bozuk: kayit.filter((a) => a.adres &&
      !YANIT.some((y) => y.ad === a.ad && y.adres === a.adres && y.dog)),
    yok: kayit.filter((a) => !a.adres),
    redMesru: red.filter((y) => y.dog),
  };
}
```

```js
// aglar/ad-denetimi.mjs — dogrulanmayan ad yaniti kac kaydi ve kac bagimli servisi bozuyor,
// imzali dogrulama kacini kurtariyor, imzasiz bolge kac kalem birakiyor, bedeli ne.
import { AD, YANIT, IMZALI, cozumle } from "./ad-cozumleme.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 taban = cozumle(), TAVAN = 300;
const bagimli = (l) => l.reduce((s, a) => s + a.bagimli, 0);
const sorgu = (t) => AD.reduce((s, a) => s + Math.floor(86400 / Math.min(a.ttl, t)), 0);
const ANAHTAR = 3; // bolge basina: bolge anahtari, imzalama anahtari, ust bolgeye verilen ozet

console.log(`${AD.length} ad, ${YANIT.length} yanit, ${bagimli(AD)} bagimli servis; ` +
  `imzali bolge ${IMZALI.length}/${new Set(AD.map((a) => a.bolge)).size}, ` +
  `bozulan kayit ${taban.bozuk.length}, etkilenen bagimli servis ${bagimli(taban.bozuk)}`);

const A = [-10, 6, 9, 10, 13, 11];
console.log("\n1. bolge basina");
yaz(A, "bolge", "imza", "ad", "bagimli", "bozuk kayit", "etkilenen");
for (const b of [...new Set(AD.map((a) => a.bolge))]) {
  const l = AD.filter((a) => a.bolge === b), z = taban.bozuk.filter((a) => a.bolge === b);
  yaz(A, b, IMZALI.includes(b) ? "var" : "yok", l.length, bagimli(l), z.length, bagimli(z));
}

const B = [-22, -10, 9, 10, 18];
console.log("\n2. taban: bozulan kayitlar ve tasidiklari bagimlilik");
yaz(B, "ad", "bolge", "bagimli", "ttl (sn)", "imzayla kurtulur");
for (const a of taban.bozuk)
  yaz(B, a.ad, a.bolge, a.bagimli, a.ttl, IMZALI.includes(a.bolge) ? "evet" : "hayir");

const C = [-8, 8, 11, 10, 14, 11, 9, 8];
console.log("\n3. kipler: kurtarilan kayit ve bedeli");
yaz(C, "kip", "bozuk", "etkilenen", "kayitsiz", "duran servis", "red mesru", "anahtar", "ek tur");
for (const [k, imzaliBolge] of [["yok", 0], ["imzali", IMZALI.length], ["kati", 4]]) {
  const r = cozumle(k);
  const kapsam = AD.filter((a) => k === "kati" || IMZALI.includes(a.bolge)).length;
  yaz(C, k, r.bozuk.length, bagimli(r.bozuk), r.yok.length, bagimli(r.yok),
    r.redMesru.length, imzaliBolge * ANAHTAR, k === "yok" ? 0 : kapsam);
}

const D = [-16, 10, 12, 13, 12];
console.log(`\n4. yasam suresi tavani ${TAVAN} sn olursa`);
yaz(D, "olcu", "tavansiz", "tavanli", "fark", "fark %");
const olcum = [
  ["gunluk sorgu", sorgu(1e9), sorgu(TAVAN)],
  ["bozuk kayit sn", taban.bozuk.reduce((s, a) => s + a.ttl, 0),
    taban.bozuk.reduce((s, a) => s + Math.min(a.ttl, TAVAN), 0)],
  ["en uzun bozuk sn", Math.max(...taban.bozuk.map((a) => a.ttl)),
    Math.max(...taban.bozuk.map((a) => Math.min(a.ttl, TAVAN)))],
];
for (const [ad, x, y] of olcum)
  yaz(D, ad, x, y, y - x, (((y - x) / x) * 100).toFixed(1));
```

```
16 ad, 23 yanit, 73 bagimli servis; imzali bolge 2/4, bozulan kayit 7, etkilenen bagimli servis 38

1. bolge basina
bolge       imza       ad   bagimli  bozuk kayit  etkilenen
olcum        var        5        26            2         11
kurumsal     yok        5        30            2         18
saha         yok        3         8            2          6
dis          var        3         9            1          3

2. taban: bozulan kayitlar ve tasidiklari bagimlilik
ad                    bolge       bagimli  ttl (sn)  imzayla kurtulur
toplayici.olcum       olcum             6      3600              evet
dogrulayici.olcum     olcum             5      3600              evet
faturalama.kurumsal   kurumsal          7      3600             hayir
kimlik.kurumsal       kurumsal         11       900             hayir
sube01.saha           saha              2       600             hayir
gecit.saha            saha              4      1800             hayir
arayuz.dis            dis               3      3600              evet

3. kipler: kurtarilan kayit ve bedeli
kip        bozuk  etkilenen  kayitsiz  duran servis  red mesru  anahtar  ek tur
yok            7         38         0             0          0        0       0
imzali         4         24         2             9          2        6       8
kati           0          0        10            47         10       12      16

4. yasam suresi tavani 300 sn olursa
olcu              tavansiz     tavanli         fark      fark %
gunluk sorgu          1032        4608         3576       346.5
bozuk kayit sn       17700        2100       -15600       -88.1
en uzun bozuk sn      3600         300        -3300       -91.7
```
Sayılar **ölçüm** sınıfındadır; girdileri PG10–PG12'dir.

#### Yedi Kayıt, Otuz Sekiz Servis

On altı ad on altı kayıt üretir ve savunma yokken bunların **yedisi** bozuktur. Kayıt oranı
%43,8'dir, ama asıl sayı ikinci sütundadır: yedi bozuk kayıt yetmiş üç bağımlı servisin **otuz
sekizini** yönlendirir. Bir kayıt bir hedefi değil, o adı kullanan her servisi taşır.

İkinci tablo bu orantısızlığı adım adım gösterir. Saha bölgesindeki `sube01.saha` kaydı yalnız
iki servis taşır; `kimlik.kurumsal` kaydı **on bir** servis taşır. İkisi de tek bir kayıttır ve
ikisi de aynı kuralla bozulur. Bir ad kümesinde bozulma sırasını belirleyen şey kayıt sayısı
değil, kayıt başına bağımlılıktır.

Birinci tablo bölge düzeyinde okur. İmzalı iki bölgede beş ve üç ad vardır; imzasız iki bölgede
beş ve üç. Bozulan yedi kaydın **üçü** imzalı bölgelerdedir ve on dört bağımlı servis taşır;
**dördü** imzasız bölgelerdedir ve yirmi dört bağımlı servis taşır. Kurumsal bölge tek başına
otuz bağımlı servisle en yüklü bölgedir ve imzasızdır.

Bu son cümle imzalama kapsamının bağımlılık ağırlığını izlemediğini gösterir. İmzalı iki bölge
yetmiş üç bağımlı servisin otuz beşini kapsar; imzasız iki bölge otuz sekizini. Kapsam ad
sayısına göre yarı yarıyadır (sekiz ada karşı sekiz), ama taşınan bağımlılığa göre imzalı taraf
azınlıktadır. En çok servis taşıyan tek ad — on bir servisle `kimlik.kurumsal` — imzasız
bölgededir. **İmzalama kararı bölge bölge verilir, oysa etki ad ad dağılır.**

#### İmzanın Kurtardığı ve Bırakan

Üçüncü tablonun ikinci satırı imzalı doğrulamayı açar. Bozuk kayıt yediden **dörde**, etkilenen
bağımlı servis otuz sekizden **yirmi dörde** iner. Kurtarılan üç kaydın üçü de imzalı
bölgelerdedir; imzasız bölgelerdeki dördü olduğu gibi kalır. **İmzalı doğrulamanın kapsamı
bölge sınırıdır ve o sınırın dışında hiçbir şey değişmez.**

Aynı satırın dördüncü ve beşinci sütunları savunmanın kendi bedelini yazar. İki ad **hiç
çözümlenemez** hâle gelir ve dokuz bağımlı servis durur. Nedeni bir saldırı değildir: bu iki
adın meşru yanıtlarının imzası süresi dolmuş olarak gelmiştir ve doğrulama onları da reddeder.
İki meşru yanıt kesilir. İmzalı doğrulama açıkken **bir imzanın süresinin dolması, o adın hiç
yanıtı yokmuş gibi davranmasına yol açar**; imzasız bir bölgede aynı durum hiç oluşmaz.

Üçüncü satır katı kipi ölçer: imzasız bölgeden gelen yanıtlar da reddedilir. Bozuk kayıt sıfıra
iner ve etkilenen bağımlı servis sıfır olur. Bedeli, on adın çözümlenememesi ve **kırk yedi
bağımlı servisin durmasıdır** — yetmiş üçün üçte ikisinden fazlası. On meşru yanıt reddedilir,
anahtar kalemi altıdan on ikiye çıkar ve her ad için bir ek tur gerekir.

Katı kip bu kursta savunmanın yetmediği en açık örneklerden biridir. Doğrulanmayan iddiayı
sıfırlar, ama bunu iddiayı doğrulayarak değil, doğrulanamayan her şeyi reddederek yapar. Kalan
dört bozuk kaydın gerçek çözümü katı kip değil, imzasız iki bölgenin imzalanmasıdır; o da bu
tabloda anahtar kalemini on ikiye ve ek turu on altıya çıkaran satırdır.

İmzalı kipin net kazancı, iki bedeli birlikte yazınca daha da daralır. Tabansız durumda otuz
sekiz bağımlı servis yanlış yönlendirilir ve hiçbiri durmaz. İmzalı kipte yirmi dördü yanlış
yönlendirilir ve dokuzu durur; doğru çalışan servis sayısı otuz beşten kırka çıkar. Yetmiş üç
servislik bir kümede net kazanç **beş servistir**. Aynı savunma imzalı bölgelerin içinde tam
etkilidir; toplamı bu kadar küçük yapan şey, imzasız bölgelerin taşıdığı ağırlık ve imzanın
kendi arıza kipidir.

#### Yaşam Süresi Tavanı

Dördüncü tablo imzadan bağımsız bir savunmayı ölçer: kayıtların yaşam süresine bir tavan
koymak. Bu, bozulmayı engellemez; bozuk kaydın **ne kadar süre** bozuk kaldığını sınırlar.

Tavansız durumda yedi bozuk kaydın toplam yaşam süresi 17.700 saniyedir ve en uzunu 3.600
saniyedir. Tavan 300 saniyeye çekildiğinde toplam 2.100 saniyeye, en uzunu 300 saniyeye iner —
sırasıyla **%88,1** ve **%91,7** düşüş. Karşılığında günlük sorgu sayısı 1.032'den 4.608'e
çıkar: **%346,5 artış**.

İki oran birlikte okunduğunda tavanın niteliği görünür. Yaşam süresi tavanı doğrulanan iddia
sayısını **hiç değiştirmez**; bu dersin ilk sütununda tek bir sayı bile oynamaz. Değiştirdiği
şey bozuk bir kaydın etkisinin süresidir. Üç sütunlu ölçümde bu, birinci ve ikinci sütunu boş
bırakıp yalnız üçüncüyü dolduran bir savunmadır — ve bedeli sorgu hacminin dört buçuk katına
çıkmasıdır. **Etkiyi kısaltmak, iddiayı doğrulamanın yerine geçmez.**

#### Özet

- Ad çözümleme yanıtı imzasız bir bölgede sınanamaz; 16 adın **7'si** bozulur ve bu 7 kayıt 73
  bağımlı servisin **38'ini** yönlendirir.
- Etkinin ölçüsü kayıt sayısı değil bağımlılıktır: bir kayıt 2 servis taşırken bir başkası 11
  servis taşır ve ikisi de aynı kuralla bozulur.
- İmzalı doğrulama bozuk kaydı 7'den 4'e, etkilenen servisi 38'den 24'e indirir; kurtardığı 3
  kaydın üçü de imzalı bölgededir ve imzasız bölgede hiçbir şey değişmez.
- İmzanın kendi bedeli vardır: süresi dolmuş imza 2 adı hiç çözümlenemez kılar ve 9 bağımlı
  servisi durdurur; katı kip bozuk kaydı sıfırlar ama 10 adı çözümlenemez kılıp 47 servisi
  durdurur, anahtar kalemini 12'ye ve ek turu 16'ya çıkarır.
- Yaşam süresi tavanı doğrulanan iddia sayısını hiç değiştirmez; bozuk kaydın süresini %88,1
  kısaltır ve günlük sorgu sayısını %346,5 artırır.

#### Sonraki Adım

Bu dersin ve bir öncekinin ortak varsayımı, önbelleğe soru soran ucun **kime soracağını zaten
bildiğiydi**. Ad çözümleyicinin adresi, ağ geçidinin adresi ve ucun kendi adresi verilmiş kabul
edildi. Oysa bir uç ağa bağlandığında bunların hiçbirini bilmez; sorar ve gelen ilk yanıtı
kabul eder. O tek yanıt üç ayrı iddiayı birden taşır: bu senin adresin, geçidin şu, ad
çözümleyicin şu. Sonraki ders adres dağıtımını bir veri yapısı olarak kurar ve sayar: bir
dağıtım yanıtı kaç iddia taşıyor, ilk yanıtın kazanması kaç ucu hangi yapılandırmaya bağlıyor,
bağlantı noktası güveni ve bağlama tablosu kaçını kurtarıyor ve bunun elle yönetim bedeli ne
oluyor.

### Adres Dağıtımı Riskleri

Source: https://academia.sh/tr/kurslar/ag-guvenligi/adres-dagitimi-riskleri

Adres dağıtımının iddia cinsinden ölçülmesi: 14 ucun yanıt başına 5 iddia ile 70 iddiayı doğrulamadan kabul etmesi, ilk yanıt kuralının 7 ucu kanıtı olmayan bir kaynağa bağlaması, bağlantı noktası güveninin yanlış yapılandırmayı sıfırlayıp 2 ucu yapılandırmasız bırakması, havuz denetimi ile sabit ayırmanın aynı 12 ucu 3 elle kalemle doğru yapılandırıp 2 ucu yanlış bırakması.

Önceki iki dersin ortak varsayımı, önbelleğe soru soran ucun **kime soracağını zaten
bildiğiydi**. Ad çözümleyicinin adresi, ağ geçidinin adresi ve ucun kendi adresi verilmiş kabul
edildi. Oysa bir uç ağa bağlandığında bunların hiçbirini bilmez.

Bilmediği için sorar ve sorduğu anda elinde hiçbir ölçüt yoktur: hangi yanıtın yetkili bir
kaynaktan geldiğini ayıramaz, çünkü ayırmasını sağlayacak yapılandırma tam da o yanıtla
gelecektir. Kabul kuralı bu yüzden çok yalındır — **ilk gelen yanıt kazanır**. Bu kuralı
kullanarak yetkili olmayan bir kaynağın yapılandırma dağıtmasına **sahte adres dağıtım sunucusu
(rogue DHCP server)** denir. Bu ders o kuralı bir veri yapısı üzerinde koşturur ve tek bir
yanıtın kaç iddiayı birden bağladığını sayar.

#### Bir Yanıt, Beş İddia

**PG13:** adres dağıtım yanıtı tek bir mesajda beş iddia taşır — adres, ağ geçidi, ad
çözümleyici, kira süresi ve alan soneki — ve uç bunların hiçbirini sınamadan kabul eder.
**PG14:** ucun kabul kuralı "ilk yanıt kazanır"dır; kaynağın kim olduğu kurala girmez.
**PG15:** bir savunma yanıtı yalnız geliş yolundan ve içeriğinden süzebilir; kaynağın yetkili
olup olmadığını gösteren bir kanıt mesajda yoktur.

PG13 bu dersi önceki ikisinden ayırır. Adres çözümlemede bozulan şey tek bir eşlemeydi, ad
çözümlemede bir ad ve ona bağlı servislerdi. Burada tek bir kabul, ucun ağ üzerindeki **bütün**
davranışını belirler: hangi adresi kullanacağını, çıkışını nereye vereceğini ve adları kime
soracağını. Üçüncü iddia doğrudan bir önceki derse bağlanır — ad çözümleyici iddiası yanlış
kabul edildiğinde, o ucun bütün ad kayıtları imzalı doğrulama olmadan yeniden sınanmamış olur.

Dört adımlı kiralama, kira süresi ve yenileme eşikleri ile aktarım aracısının rolü **Ağ
Modelleri ve Protokoller** kursunda ölçüldü; burada tekrarlanmaz. Aşağıdaki dağıtım kümesi bir
**modeldir**: kurgu bir şube bölütündeki uçlar ve yanıt gecikmeleri veri olarak yazılır, gerçek
bir ağ ya da gerçek bir aygıt yoktur. Kümede hiçbir sahte dağıtım adımı bulunmaz; koşan kod
ucun kabul kuralı ile bölüt savunmalarıdır. Kendi yönetimindeki bir bölütün dışında böyle bir
ölçüm yapmak **yazılı yetki ve tanımlı kapsam olmadan hem yasadışı hem meslek dışıdır**.

```js
// aglar/dagitim.mjs — kurgu bolgesel olcum agindaki bir sube bolutunde adres dagitimi
// (model): gercek bir ag ve gercek bir aygit yok, adresler ozel bloktandir. Rastgelelik yok.

// PG13: adres dagitim yaniti tek bir mesajda bes iddia tasir ve uc bunlarin hicbirini
// sinamadan kabul eder.
export const IDDIA = ["adres", "ag gecidi", "ad cozumleyici", "kira suresi", "alan soneki"];

// PG14: ucun kabul kurali "ilk yanit kazanir"dir; kaynagin kim oldugu kurala girmez.
// Sutunlar: uc, a kaynagindan yanit gecikmesi (ms), b kaynagindan, c kaynagindan,
// b yanitinin adresi yetkili havuzun icinde mi (e/h). "-" o kaynaktan yanit gelmedigidir.
// a = bolutun yetkili dagiticisi (guvenilir baglanti noktasi), c = yedek yetkili dagitici
// (guvenilmeyen baglanti noktasi), b = kaniti olmayan kaynak.
export const UC = `
  u01 40 12  -  e    u02 38 55  -  e    u03 45 20  -  h    u04 30 70  -  e
  u05 50 18  -  e    u06 42 90  -  h    u07 36 22  -  h    u08 48 14  -  e
  u09 33 60  -  e    u10 44 25  -  e    u11 39 80  -  h    u12 41 28  -  h
  u13  - 95 30  e    u14  - 45 26  e`
  .trim().split(/\s+/).reduce((l, _, i, a) => (i % 5 ? l : [...l, {
    uc: a[i], g: { a: a[i + 1], b: a[i + 2], c: a[i + 3] }, havuzda: a[i + 4] === "e",
  }]), []);

// PG15: bir savunma yaniti yalnizca gelis yolundan ve iceriginden suzebilir; kaynagin
// yetkili olup olmadigini gosteren bir kanit mesajda yoktur.
export const SABIT = ["u05", "u08"];
export const PORT = 24;      // bolut anahtarinda guven ayari yazilan baglanti noktasi sayisi
export const YETKILI = ["a", "c"];

export function dagit(savunma = []) {
  const sonuc = UC.map((u) => {
    if (savunma.includes("sabit") && SABIT.includes(u.uc))
      return { uc: u.uc, kaynak: "sabit", dogru: true };
    const aday = Object.entries(u.g)
      .filter(([k, v]) => v !== "-"
        && !(savunma.includes("port") && k !== "a")
        && !(savunma.includes("havuz") && k === "b" && !u.havuzda))
      .sort((x, y) => +x[1] - +y[1])[0];
    return aday
      ? { uc: u.uc, kaynak: aday[0], dogru: YETKILI.includes(aday[0]) }
      : { uc: u.uc, kaynak: "-", dogru: false };
  });
  return {
    sonuc,
    yanlis: sonuc.filter((s) => s.kaynak === "b"),
    bos: sonuc.filter((s) => s.kaynak === "-"),
    redMesru: UC.filter((u) => u.g.c !== "-" && savunma.includes("port")).length,
  };
}
```

```js
// aglar/dagitim-denetimi.mjs — bir dagitim yaniti kac iddia tasiyor, ilk yanitin kazanmasi
// kac ucu hangi kaynaga bagliyor, savunma kacini kurtariyor ve bedeli ne.
import { UC, IDDIA, SABIT, PORT, dagit } from "./dagitim.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 taban = dagit(), N = UC.length, I = IDDIA.length;

console.log(`${N} uc, yanit basina ${I} iddia, toplam ${N * I} dogrulanmadan kabul edilen ` +
  `iddia; kaniti olmayan kaynagi secen uc ${taban.yanlis.length}, ` +
  `boyle kabul edilen iddia ${taban.yanlis.length * I}`);

const A = [-6, 8, 8, 8, 11, 10];
console.log("\n1. ilk yanit kazanir: hangi kaynak kac ms ile kazandi");
yaz(A, "uc", "a (ms)", "b (ms)", "c (ms)", "b havuzda", "kazanan");
for (const u of UC)
  yaz(A, u.uc, u.g.a, u.g.b, u.g.c, u.havuzda ? "evet" : "hayir",
    taban.sonuc.find((s) => s.uc === u.uc).kaynak);

const B = [-22, 10, 12, 17];
console.log("\n2. savunmalar: kurtarilan uc ve bedeli");
yaz(B, "savunma", "dogru uc", "yanlis uc", "yapilandirmasiz");
const C = [-22, 13, 11, 8];
const kur = [[], ["port"], ["havuz"], ["sabit"], ["havuz", "sabit"],
  ["port", "havuz", "sabit"]];
for (const s of kur) {
  const r = dagit(s);
  yaz(B, s.join(" + ") || "hicbiri", r.sonuc.filter((x) => x.dogru).length,
    r.yanlis.length, r.bos.length);
}
console.log("\n3. ayni savunmalarin bedeli");
yaz(C, "savunma", "yanlis iddia", "red mesru", "elle");
for (const s of kur) {
  const r = dagit(s);
  yaz(C, s.join(" + ") || "hicbiri", r.yanlis.length * I, r.redMesru,
    (s.includes("port") ? PORT : 0) + (s.includes("havuz") ? 1 : 0) +
    (s.includes("sabit") ? SABIT.length : 0));
}

const D = [-22, -30, -1];
console.log("\n4. hangi uc kaliyor");
yaz(D, "savunma", "kaniti olmayan kaynagi secen", "yapilandirma alamayan");
for (const s of kur.slice(1)) {
  const r = dagit(s);
  yaz(D, s.join(" + "), r.yanlis.map((x) => x.uc).join(" ") || "yok",
    r.bos.map((x) => x.uc).join(" ") || "yok");
}
```

```
14 uc, yanit basina 5 iddia, toplam 70 dogrulanmadan kabul edilen iddia; kaniti olmayan kaynagi secen uc 7, boyle kabul edilen iddia 35

1. ilk yanit kazanir: hangi kaynak kac ms ile kazandi
uc      a (ms)  b (ms)  c (ms)  b havuzda   kazanan
u01         40      12       -       evet         b
u02         38      55       -       evet         a
u03         45      20       -      hayir         b
u04         30      70       -       evet         a
u05         50      18       -       evet         b
u06         42      90       -      hayir         a
u07         36      22       -      hayir         b
u08         48      14       -       evet         b
u09         33      60       -       evet         a
u10         44      25       -       evet         b
u11         39      80       -      hayir         a
u12         41      28       -      hayir         b
u13          -      95      30       evet         c
u14          -      45      26       evet         c

2. savunmalar: kurtarilan uc ve bedeli
savunma                 dogru uc   yanlis uc  yapilandirmasiz
hicbiri                        7           7                0
port                          12           0                2
havuz                         10           4                0
sabit                          9           5                0
havuz + sabit                 12           2                0
port + havuz + sabit          12           0                2

3. ayni savunmalarin bedeli
savunma                yanlis iddia  red mesru    elle
hicbiri                          35          0       0
port                              0          2      24
havuz                            20          0       1
sabit                            25          0       2
havuz + sabit                    10          0       3
port + havuz + sabit              0          2      27

4. hangi uc kaliyor
savunma               kaniti olmayan kaynagi secen  yapilandirma alamayan
port                  yok                           u13 u14
havuz                 u01 u05 u08 u10               yok
sabit                 u01 u03 u07 u10 u12           yok
havuz + sabit         u01 u10                       yok
port + havuz + sabit  yok                           u13 u14
```
Sayılar **ölçüm** sınıfındadır; girdileri PG13–PG15'tir.

#### Yedi Uç, Otuz Beş İddia

On dört uç yanıt başına beş iddia kabul eder: toplam **70 iddia**, hiçbirinin kanıtı yok.
Savunma yokken bu uçların **yedisi** kanıtı olmayan bir kaynağın yanıtını alır ve o yanıtın beş
iddiası da kabul edilir — **35 iddia**. Yarısı.

Birinci tablo kazananı ms cinsinden verir ve kuralın ne kadar dar bir farkla işlediğini
gösterir. Yetkili dağıtıcının gecikmesi 30 ile 50 ms arasındadır; kanıtı olmayan kaynağınki 12
ile 90 ms arasında dağılır. Kazanma ölçütü kaynağın kim olduğu değil, yalnız bu iki sayının
hangisinin küçük olduğudur. `u02` yetkili kaynağı 38 ms ile alır, `u12` kanıtsız kaynağı 28 ms
ile alır ve ikisi arasındaki tek fark on milisaniyedir.

İki uç — `u13` ve `u14` — yetkili dağıtıcıdan hiç yanıt almaz ve yedek yetkili dağıtıcıyı
seçer. Bu iki satır sonraki bölümde savunmanın bedelini belirleyecek olan kalemdir: yedek
dağıtıcı meşrudur, ama güvenilmeyen bir bağlantı noktasındadır.

Tablonun üçüncü sütunu savunma tarafının görebileceği tek **belirtiyi** de taşır. Kanıtı
olmayan kaynağı seçen yedi ucun gecikmeleri 12 ile 28 ms arasındadır; onu seçmeyen beş ucunki
55 ile 90 ms arasındadır. İki küme arasında hiçbir örtüşme yoktur ve aradaki boşluk 27 ms'dir.
Yanıt gecikmelerinin tek tepeli değil **iki tepeli** dağılması, bölütte iki ayrı kaynağın yanıt
verdiğinin sayılabilir işaretidir. Belirti kaynağın kim olduğunu söylemez; yalnız iki farklı
yerden yanıt geldiğini söyler ve bu, dağıtım kayıtlarında aranabilecek somut bir niceliktir.

#### Üç Savunma, İki Farklı Sonuç

İkinci tablo üç savunmayı ayrı ayrı ve birlikte koşturur. Bağlantı noktası güveni yalnız
güvenilir bağlantı noktasından gelen yanıtları geçirir: yanlış yapılandırılan uç sayısı yediden
**sıfıra** iner. Doğru yapılandırılan uç sayısı ise on dörde değil **on ikiye** çıkar. Aradaki
iki uç, yedek yetkili dağıtıcıya bağlı olan `u13` ve `u14`tür ve hiçbir yapılandırma alamaz.

Havuz denetimi yanıtın içeriğine bakar: yetkili havuzun dışında bir adres öneren yanıtı
reddeder. Yedi yanlış ucun **üçünü** kurtarır, **dördünü** bırakır. Bırakılan dördü, havuzun
içinden adres öneren yanıtlardır ve içerik denetimiyle ayırt edilemez. Sabit ayırma iki kritik
ucu listeye alır ve o ikisini her koşulda kurtarır; kalan beşi bırakır. Sabit ayırmanın
kapsamı, üçüncü dersteki sabit kayıt gibi, tam olarak listenin uzunluğu kadardır: iki kalem
yazılır, iki uç kurtulur. Listeyi on dört uca genişletmek yanlış yapılandırmayı sıfırlar, ama o
noktada dağıtım düzeneğinin kendisi kullanılmıyor demektir ve ağa eklenen her yeni uç bir elle
kalem ister.

Beşinci satır bu dersin karşılaştırma noktasıdır. Havuz denetimi ile sabit ayırma birlikte **on
iki ucu** doğru yapılandırır — bağlantı noktası güveninin tek başına ulaştığı sayının aynısı.
Aynı sonuca iki ayrı yoldan varılır ve iki yolun bıraktığı artık **birbirinden tümüyle
farklıdır**: biri iki ucu yanlış yapılandırır, öteki iki ucu hiç yapılandırmaz.

#### İki Artığın Bedeli

Üçüncü tablo bu iki yolun bedelini yan yana koyar. Bağlantı noktası güveni 24 elle kalem ister
— bölüt anahtarındaki her bağlantı noktası için bir güven ayarı — ve iki meşru yanıtı reddeder.
Havuz denetimi ile sabit ayırma birlikte **üç elle kalem** ister ve hiçbir meşru yanıtı
reddetmez; karşılığında on iddia doğrulanmadan kabul edilmiş olarak kalır.

Yirmi dört kalem ile üç kalem arasındaki fark, ölçek büyüdükçe artan bir farktır: her yeni
bağlantı noktası birinci yolda bir kalem ekler, ikinci yolda hiçbir şey eklemez. Buna karşılık
ikinci yolun bıraktığı iki uç, ölçek büyüdükçe sayıca artar ve her biri beş iddia taşır.

Artıkların **niteliği** de farklıdır. Yapılandırma alamayan bir uç sessiz kalmaz: ağa hiç
katılmaz, bu görülür ve giderilir. Yanlış yapılandırılan bir uç ise çalışır — trafiği akar,
görevini yerine getirir ve beş iddiasının hiçbiri sınanmadığı için hiçbir kayıt bırakmaz. **Bir
savunmanın bıraktığı artığın görünür olup olmaması, sayısı kadar belirleyicidir.**

Son satır üçünü birden açar ve yanlış yapılandırmayı sıfırlar. Bedeli 27 elle kalem ve iki
reddedilen meşru yanıttır; iki uç yine yapılandırmasız kalır. Sabit ayırma bu birleşimde hiçbir
şey eklemez, çünkü bağlantı noktası güveni onun kurtardığı iki ucu zaten kurtarmıştır — üçüncü
dersteki üst üste konan savunma örneğinin aynısı.

Yanlış kabul edilen beş iddianın ağırlığı da eşit değildir. Üçüncü iddia — ad çözümleyici — bir
önceki dersin bütün ölçümünü o uç için geçersiz kılar: on altı adın on altısı artık bu ucun
sınamadığı bir kaynaktan gelir ve imzalı doğrulamanın kurtardığı üç kayıt da o kaynağın verdiği
yanıtla değişir. Kira süresi iddiası ise en hafifidir; yalnız yanlış yapılandırmanın ne kadar
süre yenilenmeden kalacağını belirler. **Bir mesajda taşınan beş iddia tek bir sayı olarak
sayılır, ama bedelleri aynı büyüklükte değildir**; sıralama yapılırken hangi iddianın sonraki
kaç ölçümü belirlediği yazılır.

#### Özet

- Adres dağıtım yanıtı tek mesajda 5 iddia taşır; 14 uç toplam **70 iddiayı** sınamadan kabul
  eder ve bir uç için bu tek kabul adresini, çıkışını ve ad çözümleyicisini birden belirler.
- Kabul kuralı "ilk yanıt kazanır"dır: 7 uç kanıtı olmayan bir kaynağı seçer ve **35 iddia** o
  kaynaktan gelir; kazanma farkı bazı uçlarda 10 ms kadardır.
- Bağlantı noktası güveni yanlış yapılandırmayı sıfırlar ama meşru bir yedek dağıtıcıya bağlı 2
  ucu **yapılandırmasız** bırakır ve 24 elle kalem ister.
- Havuz denetimi ile sabit ayırma birlikte aynı 12 ucu doğru yapılandırır, 3 elle kalem ister,
  hiçbir meşru yanıtı reddetmez ve 2 ucu yanlış yapılandırılmış bırakır.
- İki artığın niteliği farklıdır: yapılandırma alamayan uç ağa katılmadığı için görülür, yanlış
  yapılandırılan uç çalıştığı için hiçbir kayıt bırakmaz.

#### Sonraki Adım

Şimdiye kadarki dört ders bir iddianın **yanlış** kabul edilmesini ölçtü: bozulan kayıt, yanlış
adres, yanlış kaynak. Bütün bu ölçümlerde hedef servis ayaktaydı ve isteklere yanıt veriyordu.
Oysa bir iddianın doğrulanmaması yalnız yanlış yanıt üretmez; **hiç yanıt üretmemeye** de yol
açabilir. Bir bağlantı açma isteği kaynağını kanıtlamıyorsa, hedef o isteği tutmak için
ayırdığı yeri kime ayırdığını bilmez ve yer biterse meşru istek de dışarıda kalır. Sonraki ders
bunu kapasite aritmetiğiyle ölçer: kaç kaynaktan gelen istek eşiği aşıyor, durum tablosu kaç
saniyede doluyor, hangi savunma hangi oranı düşürüyor ve o savunma meşru trafiğin kaçını da
düşürüyor.

### Hizmet Engelleme Saldırıları

Source: https://academia.sh/tr/kurslar/ag-guvenligi/hizmet-engelleme-saldirilari

Hizmet engellemenin kapasite aritmetiğiyle ölçülmesi: aynı 4.000 istek/sn'lik yükün dört farklı kaynak dağılımında aynı sonucu vermesi, 4.096 yuvalık durum tablosunun 1,02 saniyede dolması, kaynak başına hız sınırının tek kaynakta yükü 5'e indirip 4.000 kaynakta hiçbir şey değiştirmemesi, el sıkışma kanıtının yuva tükenmesini bitirip istek hızını hiç düşürmemesi ve yük boşaltmanın meşru trafiği %22'ye indirmesi.

Şimdiye kadarki dört ders bir iddianın **yanlış** kabul edilmesini ölçtü: bozulan kayıt, yanlış
adres, yanlış kaynak. Bütün bu ölçümlerde hedef servis ayaktaydı ve isteklere yanıt veriyordu.
Oysa bir iddianın doğrulanmaması yalnız yanlış yanıt üretmez.

Bir bağlantı açma isteği kaynağını kanıtlamaz. Hedef, isteği tutmak için ayırdığı yeri kime
ayırdığını bilmez ve isteğin karşılığı hiç gelmeyebilir. Yer sınırlıdır; bittiğinde meşru istek
de dışarıda kalır. Bir hizmetin isteklere yanıt veremez hâle getirilmesine **hizmet engelleme
(denial of service)**, aynı yükün çok sayıda kaynağa dağıtılmasına **dağıtık hizmet engelleme
(distributed denial of service)** denir. Birinci derste ağ katmanında sayılan üç doğrulanamayan
iddia — kaynak adresi, parçalanmış bir bütünün parçası olma, denetim iletisinin ağdan geldiği —
bu dersin girdisidir. Bu ders bunları kapasite aritmetiğine çevirir.

#### İki Ayrı Kaynak Tükenir

**PG16:** bir bağlantı açma isteği kaynağını kanıtlamaz; hedef, isteği tutmak için ayırdığı
yeri kime ayırdığını bilmez. **PG17:** hizmet engelleme iki ayrı kaynağı tüketir — saniyedeki
istek kapasitesi ve durum tablosundaki yuva — ve ikisi ayrı sayılır. **PG18:** bir savunma
kaynağı değil, yalnız isteğin biçimini ve hızını görür; aynı ölçüt meşru isteğe de uygulanır.

PG17 bu dersin ölçüyü tek bir sayıdan kurtaran maddesidir. "Servis çöktü" bir karar taşımaz;
karar taşıyan iki ayrı hesap vardır. Birincisi hız hesabıdır: gelen istek hızı kapasiteyi kaç
kat aşıyor. İkincisi yuva hesabıdır: tamamlanmayan her istek bir yuvayı belirli bir süre
tuttuğuna göre, tablo kaç saniyede doluyor. İki hesap ayrı savunmalara yanıt verir ve bir
savunmanın birini düşürüp ötekini hiç değiştirmemesi olağandır.

Aşağıdaki hesap bir **modeldir**: kurgu ölçüm ağındaki bir alım ucunun kapasitesi, yuva sayısı
ve meşru akışı veri olarak yazılır; gerçek bir hizmet ya da gerçek bir adres yoktur. Kod hiçbir
istek üretmez, yalnız savunma tarafının aritmetiğini koşturur. Bir hizmete kendi yönetimin
dışında yük bindirmek — ölçüm amaçlı olsa bile — **yazılı yetki ve tanımlı kapsam olmadan hem
yasadışı hem meslek dışıdır**.

```js
// aglar/kapasite.mjs — kurgu bolgesel olcum agindaki bir alim ucunun kapasite modeli:
// gercek bir hizmet, gercek bir adres ya da gercek bir olcum yok. Rastgelelik yok.
// Kod yalnizca savunma tarafinin aritmetigini kosturur; hicbir istek uretilmez.

// PG16: bir baglanti acma istegi kaynagini kanitlamaz; hedef, istegi tutmak icin ayirdigi
// yeri kime ayirdigini bilmez.
// PG17: hizmet engelleme iki ayri kaynagi tuketir: saniyedeki istek kapasitesi ve durum
// tablosundaki yuva. Ikisi ayri sayilir.
export const KAPASITE = 900;   // istek/sn
export const YUVA = 4096;      // durum tablosundaki yuva sayisi
export const TUTMA = 30;       // tamamlanmayan bir istegin yuvayi tuttugu sure (sn)
export const MESRU = { kaynak: 60, hiz: 2 };   // 60 kaynak, kaynak basina 2 istek/sn

// PG18: bir savunma kaynagi degil, yalnizca istegin bicimini ve hizini gorur; ayni olcut
// mesru istege de uygulanir.
export const PROFIL = [
  { ad: "tek kaynak", kaynak: 1, hiz: 4000 },
  { ad: "yirmi kaynak", kaynak: 20, hiz: 200 },
  { ad: "bes yuz kaynak", kaynak: 500, hiz: 8 },
  { ad: "dort bin kaynak", kaynak: 4000, hiz: 1 },
];

export const HIZ_SINIRI = 5;   // kaynak basina izin verilen istek/sn
export const SUZME_YUK = 0.90; // kaba oruntuyle elenen yuk orani
export const SUZME_MESRU = 0.15; // ayni oruntuye takilan mesru istek orani

// Bir profili ve mesru akisi verilen savunmalarla suzer; sonuc istek/sn cinsindendir.
export function olc(p, savunma = []) {
  let yuk = p.kaynak * p.hiz, mesru = MESRU.kaynak * MESRU.hiz;
  if (savunma.includes("hiz")) {
    yuk = p.kaynak * Math.min(p.hiz, HIZ_SINIRI);
    mesru = MESRU.kaynak * Math.min(MESRU.hiz, HIZ_SINIRI);
  }
  if (savunma.includes("suzme")) {
    yuk *= 1 - SUZME_YUK;
    mesru *= 1 - SUZME_MESRU;
  }
  // Tamamlanmayan istek yuva tutar; el sikisma kaniti acikken yuva ayrilmaz.
  const yarimAcik = savunma.includes("kanit") ? 0 : yuk;
  if (savunma.includes("bosaltma") && yuk + mesru > KAPASITE) {
    const oran = KAPASITE / (yuk + mesru);
    yuk *= oran; mesru *= oran;
  }
  const doluluk = Math.min(YUVA, yarimAcik * TUTMA);
  return {
    yuk, mesru, toplam: yuk + mesru,
    kat: (yuk + mesru) / KAPASITE,
    doluluk: (doluluk / YUVA) * 100,
    dolmaSn: yarimAcik * TUTMA > YUVA ? YUVA / yarimAcik : null,
    mesruPay: (mesru / (MESRU.kaynak * MESRU.hiz)) * 100,
  };
}
```

```js
// aglar/kapasite-denetimi.mjs — kac kaynaktan gelen istek esigi asiyor, durum tablosu kac
// saniyede doluyor, hangi savunma hangi orani dusuruyor ve mesru trafigin kaci dusuyor.
import { KAPASITE, YUVA, TUTMA, MESRU, PROFIL, HIZ_SINIRI, SUZME_YUK, SUZME_MESRU, olc }
  from "./kapasite.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 sn = (x) => (x === null ? "dolmaz" : x.toFixed(2));
const n = (x) => Math.round(x);

console.log(`kapasite ${KAPASITE} istek/sn, yuva ${YUVA}, tutma ${TUTMA} sn, ` +
  `mesru akis ${MESRU.kaynak} kaynak x ${MESRU.hiz} = ${MESRU.kaynak * MESRU.hiz} istek/sn; ` +
  `esik ${n(KAPASITE - MESRU.kaynak * MESRU.hiz)} istek/sn`);
console.log(`yuva esigi ${(YUVA / TUTMA).toFixed(1)} istek/sn: tamamlanmayan istek bu hizi ` +
  `asarsa tablo dolar; kapasiteye orani %${((YUVA / TUTMA / KAPASITE) * 100).toFixed(1)}. ` +
  `Hiz esigini ${HIZ_SINIRI} istek/sn tavani altinda asmak icin ` +
  `${Math.ceil((KAPASITE - MESRU.kaynak * MESRU.hiz) / HIZ_SINIRI)} kaynak yeter.`);

const A = [-18, 9, 8, 9, 9, 9, 10];
console.log("\n1. ayni toplam hiz, dort farkli kaynak dagilimi (savunma yok)");
yaz(A, "profil", "kaynak", "hiz/knk", "toplam", "kapasite", "yuva %", "dolma sn");
for (const p of PROFIL) {
  const r = olc(p);
  yaz(A, p.ad, p.kaynak, p.hiz, n(r.toplam), r.kat.toFixed(2) + "x",
    r.doluluk.toFixed(0), sn(r.dolmaSn));
}

const B = [-18, 10, 10, 10, 14];
console.log(`\n2. kaynak basina hiz siniri ${HIZ_SINIRI} istek/sn`);
yaz(B, "profil", "gecen yuk", "kapasite", "dolma sn", "mesru gecen");
for (const p of PROFIL) {
  const r = olc(p, ["hiz"]);
  yaz(B, p.ad, n(r.yuk), r.kat.toFixed(2) + "x", sn(r.dolmaSn),
    r.mesruPay.toFixed(0) + "%");
}

const C = [-26, 10, 10, 8, 10, 14];
console.log("\n3. en dagitik profilde savunmalar (4000 kaynak x 1 istek/sn)");
yaz(C, "savunma", "gecen yuk", "kapasite", "yuva %", "dolma sn", "mesru gecen");
const zor = PROFIL[3];
for (const s of [[], ["hiz"], ["kanit"], ["suzme"], ["bosaltma"],
  ["kanit", "suzme"], ["kanit", "suzme", "bosaltma"]]) {
  const r = olc(zor, s);
  yaz(C, s.join(" + ") || "hicbiri", n(r.yuk), r.kat.toFixed(2) + "x",
    r.doluluk.toFixed(0), sn(r.dolmaSn), r.mesruPay.toFixed(0) + "%");
}

const D = [-26, -40, 12];
console.log("\n4. savunmalarin mesru trafige bedeli");
yaz(D, "savunma", "bedel", "mesru gecen");
const bedel = [
  [["hiz"], `kaynak basina ${HIZ_SINIRI} istek/sn tavani`],
  [["kanit"], "her baglanti icin 1 ek tur"],
  [["suzme"], `oruntuye takilan mesru istegin %${SUZME_MESRU * 100}'i`],
  [["bosaltma"], "kapasite ustu istek oransal reddedilir"],
];
for (const [s, ad] of bedel)
  yaz(D, s.join(" + "), ad, olc(zor, s).mesruPay.toFixed(0) + "%");
console.log(`suzme oruntusu yukun %${SUZME_YUK * 100}'ini eler; ayni oruntu mesru ` +
  `istegin %${SUZME_MESRU * 100}'ini de eler`);
```

```
kapasite 900 istek/sn, yuva 4096, tutma 30 sn, mesru akis 60 kaynak x 2 = 120 istek/sn; esik 780 istek/sn
yuva esigi 136.5 istek/sn: tamamlanmayan istek bu hizi asarsa tablo dolar; kapasiteye orani %15.2. Hiz esigini 5 istek/sn tavani altinda asmak icin 156 kaynak yeter.

1. ayni toplam hiz, dort farkli kaynak dagilimi (savunma yok)
profil               kaynak hiz/knk   toplam kapasite   yuva %  dolma sn
tek kaynak                1    4000     4120    4.58x      100      1.02
yirmi kaynak             20     200     4120    4.58x      100      1.02
bes yuz kaynak          500       8     4120    4.58x      100      1.02
dort bin kaynak        4000       1     4120    4.58x      100      1.02

2. kaynak basina hiz siniri 5 istek/sn
profil             gecen yuk  kapasite  dolma sn   mesru gecen
tek kaynak                 5     0.14x    dolmaz          100%
yirmi kaynak             100     0.24x    dolmaz          100%
bes yuz kaynak          2500     2.91x      1.64          100%
dort bin kaynak         4000     4.58x      1.02          100%

3. en dagitik profilde savunmalar (4000 kaynak x 1 istek/sn)
savunma                    gecen yuk  kapasite  yuva %  dolma sn   mesru gecen
hicbiri                         4000     4.58x     100      1.02          100%
hiz                             4000     4.58x     100      1.02          100%
kanit                           4000     4.58x       0    dolmaz          100%
suzme                            400     0.56x     100     10.24           85%
bosaltma                         874     1.00x     100      1.02           22%
kanit + suzme                    400     0.56x       0    dolmaz           85%
kanit + suzme + bosaltma         400     0.56x       0    dolmaz           85%

4. savunmalarin mesru trafige bedeli
savunma                   bedel                                    mesru gecen
hiz                       kaynak basina 5 istek/sn tavani                 100%
kanit                     her baglanti icin 1 ek tur                      100%
suzme                     oruntuye takilan mesru istegin %15'i             85%
bosaltma                  kapasite ustu istek oransal reddedilir           22%
suzme oruntusu yukun %90'ini eler; ayni oruntu mesru istegin %15'ini de eler
```
Sayılar **ölçüm** sınıfındadır; girdileri PG16–PG18'dir.

#### Dört Dağılım, Aynı Sonuç

Birinci tablo dört profili yan yana koyar ve dördü de aynı toplam hızı üretir: 4.000 istek/sn.
Bir kaynaktan 4.000, yirmi kaynaktan 200'er, beş yüz kaynaktan 8'er, dört bin kaynaktan 1'er.
Savunma yokken **dört satır da aynıdır**: 4.120 istek/sn, kapasitenin 4,58 katı, yuvaların
%100'ü dolu, dolma süresi 1,02 saniye.

Bu eşitlik dersin çıkış noktasıdır. Hedefin gördüğü şey kaynak sayısı değil, saniyedeki istek
sayısıdır; kaynak dağılımı hedefin hesabına hiç girmez. Yuva hesabı da aynı yerden çıkar: 4.000
tamamlanmayan istek saniyede geliyor ve her biri yuvayı otuz saniye tutuyorsa, 4.096 yuvalık
tablo **1,02 saniyede** dolar. Bir kaynaktan gelen dört bin istek ile dört bin kaynaktan gelen
birer istek arasında hedef için hiçbir fark yoktur.

Başlık satırındaki iki eşik, dört profilin neden aynı sonucu verdiğini de açıklar. Hız eşiği
780 istek/sn'dir: kapasiteden meşru akışın payı düşüldüğünde kalan. Yuva eşiği ise yalnız
**136,5 istek/sn**'dir — kapasitenin **%15,2'si**. Tamamlanmayan istek hızı bu sayıyı aştığı
anda tablo dolar, hız hesabı hâlâ rahatken. İki eşiğin arasındaki 5,7 katlık fark, iki
hesabın neden ayrı sayıldığının niceliksel karşılığıdır: bir hizmet, kapasitesinin altıda
birinde durum tablosunu kaybedebilir ve yük ölçüsüne bakan bir gözlem bunu göremez.

İkinci eşik hesabı savunma tarafının hazırlığını da doğrudan verir. Kaynak başına 5 istek/sn
tavanı konmuş bir hizmette hız eşiğini aşmak için **156 kaynak** yeterlidir ve bu kaynakların
hiçbiri tavanı aşmaz. Tavanı düşürmek gereken kaynak sayısını artırır, ama aynı hareketle meşru
uçların da tavanını düşürür.

Fark savunma açıldığında ortaya çıkar. İkinci tablo kaynak başına 5 istek/sn tavanı koyar ve
dört satır birbirinden tümüyle ayrılır. Tek kaynak profilinde geçen yük 4.000'den **5'e** iner
— %99,9 düşüş. Yirmi kaynakta 100'e iner. Beş yüz kaynakta 2.500'de kalır ve tablo 1,64
saniyede dolar. Dört bin kaynakta **hiçbir şey değişmez**: her kaynak zaten tavanın altındadır.

**Kaynak başına hız sınırının etkisi, kaynak başına düşen hızın tavana oranıdır; kaynak sayısı
tavana ulaştığında sınır tümüyle etkisiz hâle gelir.** Aynı savunmanın aynı toplam yüke karşı
etkisi %99,9 ile %0 arasında değişir ve bunu belirleyen tek şey saldıran tarafın kaynak
sayısıdır.

#### Hızı Düşüren ve Yuvayı Kurtaran

Üçüncü tablo en dağıtık profilde dört savunmayı ayrı ayrı koşturur ve PG17'nin iki hesabını
birbirinden ayırır.

El sıkışma kanıtı — yer ayırmadan önce karşı tarafın erişilebilir olduğunu göstermesini istemek
— yuva doluluğunu %100'den **%0'a** indirir ve tablo hiç dolmaz. Geçen yük ise 4.000'de kalır
ve kapasitenin 4,58 katı olmayı sürdürür. Bu savunma yuva hesabını tümüyle çözer ve hız
hesabına hiç dokunmaz. Meşru trafiğin %100'ü geçer; bedeli her bağlantı için bir ek turdur.

Yukarı akış süzmesi tersini yapar. Kaba bir örüntüyle yükün %90'ını eler: geçen yük 4.000'den
**400'e**, kapasite oranı 4,58 katından **0,56 katına** iner. Yuva hesabı ise çözülmez; tablo
yine dolar, yalnız 1,02 saniye yerine 10,24 saniyede. Bedeli aynı örüntüye takılan meşru
isteklerdir: meşru trafiğin **%15'i** de elenir.

İki savunma birlikte açıldığında her iki hesap da çözülür: geçen yük 0,56 kat, yuva doluluğu
%0, meşru geçen %85. Bu, tablodaki en iyi satırdır ve iki savunmanın **farklı kaynakları**
koruduğu için toplandığını gösterir. Üçüncü dersteki aynı kaydı koruyan iki savunma
toplanmıyordu; burada biri yuvayı, öteki hızı düşürdüğü için toplanır.

#### Yük Boşaltmanın Oranı

Dördüncü satır yük boşaltmayı ölçer: kapasitenin üstündeki isteği hiç kabul etmemek. Geçen
toplam tam olarak kapasiteye oturur — 1,00 kat — ve bu, tablodaki tek "hedef ayakta" satırıdır.
Bedeli son sütundadır: meşru trafiğin yalnız **%22'si** geçer.

Nedeni oranlamadır. Yük boşaltma isteğin kaynağını ayıramaz, yalnız toplamı keser; kapasite
4.120 isteklik bir akışa oranlandığında her kaynağa aynı pay düşer. Meşru akış toplamın
%2,9'unu oluşturduğu için kapasitenin de %2,9'unu alır. **Ayrım yapmadan kesen bir savunma,
meşru trafiği onun toplam içindeki payı oranında korur; payı küçükse koruma da küçüktür.**

Son satır bunu tamamlar: el sıkışma kanıtı ve süzme birlikte açıkken yük boşaltma **hiçbir şey
değiştirmez**, çünkü geçen toplam zaten kapasitenin altındadır. Yük boşaltma son çare olarak
kalır ve ancak öteki iki savunma yetmediğinde devreye girer. Bu tabloda savunmanın yetmediği
yer açıktır: dört savunmanın hiçbiri doğrulanmayan iddiayı doğrulanabilir kılmaz. Kaynak
adresinin iddiası hâlâ kanıtsızdır; ölçülen tek şey o kanıtsız iddianın kaç isteği ve kaç
yuvayı tüketmeye yettiğidir.

#### Özet

- Hizmet engelleme iki ayrı kaynağı tüketir: 900 istek/sn'lik kapasite ve 4.096 yuvalık durum
  tablosu; 4.000 istek/sn'lik yük kapasiteyi 4,58 kat aşar ve tabloyu **1,02 saniyede**
  doldurur.
- Aynı toplam hız dört farklı kaynak dağılımında savunmasız hedefe **aynı** sonucu verir;
  kaynak sayısı hedefin hesabına girmez.
- Kaynak başına 5 istek/sn tavanı tek kaynakta yükü 4.000'den 5'e indirir, dört bin kaynakta
  hiçbir şey değiştirmez; etkisi kaynak başına hızın tavana oranıdır.
- El sıkışma kanıtı yuva doluluğunu %100'den %0'a indirir ve istek hızını hiç düşürmez; yukarı
  akış süzmesi hızı 0,56 kata indirir, yuvayı kurtarmaz ve meşru trafiğin %15'ini eler. İkisi
  birlikte her iki hesabı da çözer ve meşru trafiğin %85'ini geçirir.
- Yük boşaltma toplamı kapasiteye oturtur ama ayrım yapmadığı için meşru trafiği payı oranında
  korur: **%22**. Dört savunmanın hiçbiri kaynak adresi iddiasını doğrulanabilir kılmaz.

#### Sonraki Adım

Bu ders bir iddianın kanıtsız olmasının **niceliğini** ölçtü: kaç istek, kaç yuva, kaç saniye.
Yük düştüğünde ya da savunma yeterli olduğunda hizmet ayakta kalır ve ölçüm biter. Oysa aynı
kanıtsız iddia, hiçbir kapasite tüketmeden ve hiçbir sayacı sapıtmadan da kullanılabilir. Bir
bağlantının iki ucu birbirini kanıtla tanımıyorsa, aralarındaki her adım kendini karşı taraf
olarak sunabilir ve bağlantı olağan hızında, olağan hacminde sürer. Sonraki ders bunu bir
**kanıt zinciri** eksikliği olarak ölçer: bir yolun kaç adımı var, kaç adımda kanıt zinciri
kopuyor, uç doğrulama kaçını bağlıyor ve zinciri kuranın kendisi doğrulanmadığında kaç adım
açık kalıyor.

### Araya Girme Saldırıları

Source: https://academia.sh/tr/kurslar/ag-guvenligi/araya-girme-saldirilari

Araya girmenin kanıt zinciri eksikliği olarak ölçülmesi: 8 akışın 36 adımında 3 akışın hiç zinciri olmaması ve 16 adımın içeriği okuyabilmesi, kimlik iddiasını üretebilecek taraf sayısının 272 olması, uç doğrulamanın bu sayıyı 509'a çıkarması, kök sabitlemenin 11'e indirmesi ve 89.400 istek taşıyan tek akışın doğrulama yapamadığı için zincirsiz kalması.

Önceki ders bir iddianın kanıtsız olmasının **niceliğini** ölçtü: kaç istek, kaç yuva, kaç
saniye. Yük düştüğünde ya da savunma yeterli olduğunda hizmet ayakta kalır ve ölçüm biter. Oysa
aynı kanıtsız iddia, hiçbir kapasite tüketmeden ve hiçbir sayacı sapıtmadan da kullanılabilir.

Bir bağlantının iki ucu birbirini kanıtla tanımıyorsa, aralarındaki her adım kendini karşı
taraf olarak sunabilir ve bağlantı olağan hızında, olağan hacminde sürer. Burada ölçülecek şey
bir yük ya da bir sayaç değildir; **eksik olan bir kanıttır**. Bu ders o eksikliği sayar.

#### Araya Girme Bir Eksikliktir

**PG19:** **araya girme (man-in-the-middle)** bir yetenek değil, bir eksikliktir — iki ucun
birbirinin kimlik iddiasını bağladığı **kanıt zincirinin (evidence chain)** eksik olması.
**PG20:** bir kanıt zincirinin gücü halka sayısı değil, o iddiayı **üretebilecek taraf
sayısıdır**; bu sayı bir ise zincir tektir, büyüdükçe zincir zayıflar. **PG21:** zincirin
halkaları sayılabilir; dayanağı olmayan halka, o halkayı kim yazarsa yazsın kabul edilen
halkadır.

PG20 bu dersin ölçüyü halka saymaktan kurtaran maddesidir. Üç halkalı bir zincir, tek halkalı
bir zincirden daha güçlü değildir; belirleyici olan, o üç halkanın sonuncusunu **kaç ayrı
tarafın** yazabildiğidir. Aktarımda şifreleme ve sertifika doğrulamanın algoritma tarafı bu
kursun konusu değildir ve M24/K04'te ölçülecektir; burada sayılan tek şey iddianın kaç taraftan
gelebileceğidir.

Aşağıdaki akış kümesi bir **modeldir**: kurgu ölçüm ağının akışları, adım sayıları ve zincir
türleri veri olarak yazılır; gerçek bir ağ, gerçek bir ad ya da gerçek bir kök listesi yoktur.
Kod hiçbir trafiği yakalamaz ya da değiştirmez; koşan tek şey zincir sayımıdır. Bir yolun
adımlarını kendi ağının dışında sınamak **yazılı yetki ve tanımlı kapsam olmadan hem yasadışı
hem meslek dışıdır**.

```js
// aglar/zincir.mjs — kurgu bolgesel olcum agindaki akislarin kanit zinciri (model):
// gercek bir ag, gercek bir ad ya da gercek bir kok listesi yok. Rastgelelik yok.

// PG19: araya girme bir yetenek degil, bir eksikliktir: iki ucun birbirinin kimlik
// iddiasini bagladigi kanit zincirinin eksik olmasi.
// PG20: bir kanit zincirinin gucu halka sayisi degil, o iddiayi uretebilecek taraf
// sayisidir; bu sayi bir ise zincir tektir, buyudukce zincir zayiflar.
export const KOK = 84;   // uclarin kosulsuz kabul ettigi kok listesindeki kalem sayisi

// Sutunlar: akis, yoldaki adim sayisi, zincir turu, gunluk istek, ucu dogrulama
// yapabiliyor mu (e/h).
export const AKIS = `
  saha-terminali>toplayici    6  yok           12400 e
  sayac-ucu>alim-ucu          4  yok           89400 h
  sube-gecidi>merkez-gecidi   5  ortak-kok     43200 e
  yonetim-ucu>sube-gecidi     3  ilk-kullanim    268 e
  faturalama>dogrulayici      2  ortak-kok     22800 e
  dogrulayici>olcum-deposu    2  sabit-kok     61300 e
  saha-terminali>ad-sunucusu  6  yok           34600 e
  dis-istemci>ortak-arayuz    8  ortak-kok      1150 e`
  .trim().split(/\s+/).reduce((l, _, i, a) => (i % 5 ? l : [...l, {
    ad: a[i], adim: +a[i + 1], zincir: a[i + 2], istek: +a[i + 3], yapabilir: a[i + 4] === "e",
  }]), []);

// PG21: zincirin halkalari sayilabilir; dayanagi olmayan halka, o halkayi kim yazarsa
// yazsin kabul edilen halkadir.
// halka = zincirdeki dogrulama adimi, dayanaksiz = ucun sinayamadigi halka.
export const ZINCIR = {
  "yok":          { halka: 0, dayanaksiz: 0, okur: true },
  "ilk-kullanim": { halka: 1, dayanaksiz: 1, okur: false },
  "ortak-kok":    { halka: 3, dayanaksiz: 1, okur: false },
  "sabit-kok":    { halka: 3, dayanaksiz: 0, okur: false },
};

// Bir akisin kimlik iddiasini kac ayri taraf uretebilir.
export function uretebilen(a) {
  if (a.zincir === "yok") return a.adim;
  if (a.zincir === "ilk-kullanim") return a.adim;   // yalnizca ilk baglantida
  if (a.zincir === "ortak-kok") return KOK;
  return 1;
}

// Savunma: uc dogrulama zincirsiz akislari ortak koke, sabitleme ortak kok akislarini
// sabit koke tasir. Ucu dogrulama yapamayan akis oldugu gibi kalir.
export function uygula(savunma = []) {
  return AKIS.map((a) => {
    let z = a.zincir;
    if (savunma.includes("uc-dogrulama") && a.yapabilir && z === "yok") z = "ortak-kok";
    if (savunma.includes("uc-dogrulama") && a.yapabilir && z === "ilk-kullanim") z = "ortak-kok";
    if (savunma.includes("sabitleme") && a.yapabilir && z === "ortak-kok") z = "sabit-kok";
    return { ...a, zincir: z };
  });
}
```

```js
// aglar/zincir-denetimi.mjs — kac akista kanit zinciri kopuk, kimlik iddiasini kac taraf
// uretebiliyor, uc dogrulama ve kok sabitleme neyi degistiriyor ve bedeli ne.
import { AKIS, KOK, ZINCIR, uretebilen, uygula } from "./zincir.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 okuyan = (l) => l.reduce((t, a) => t + (ZINCIR[a.zincir].okur ? a.adim : 0), 0);
const uretim = (l) => l.reduce((t, a) => t + uretebilen(a), 0);
const KUR = [[], ["uc-dogrulama"], ["sabitleme"], ["uc-dogrulama", "sabitleme"]];

console.log(`${AKIS.length} akis, ${AKIS.reduce((t, a) => t + a.adim, 0)} adim, ` +
  `kok listesi ${KOK} kalem; zinciri olmayan akis ` +
  `${AKIS.filter((a) => a.zincir === "yok").length}, okuyabilen adim ${okuyan(AKIS)}, ` +
  `30 gunluk toplam istek ${AKIS.reduce((t, a) => t + a.istek, 0)}`);

const A = [-27, 7, 14, 8, 12, 12, 11];
console.log("\n1. akis basina kanit zinciri");
yaz(A, "akis", "adim", "zincir", "halka", "dayanaksiz", "uretebilen", "30g istek");
for (const a of AKIS)
  yaz(A, a.ad, a.adim, a.zincir, ZINCIR[a.zincir].halka, ZINCIR[a.zincir].dayanaksiz,
    uretebilen(a), a.istek);

const B = [-26, 10, 12, 12, 12, 13, 19];
console.log("\n2. savunmalar: zincirin durumu");
yaz(B, "savunma", "zincirsiz", "dayanaksiz", "uretebilen", "tek zincir", "okuyan adim",
    "zincirsiz istek %");
for (const s of KUR) {
  const l = uygula(s);
  yaz(B, s.join(" + ") || "hicbiri", l.filter((a) => a.zincir === "yok").length,
    l.reduce((t, a) => t + ZINCIR[a.zincir].dayanaksiz, 0), uretim(l),
    l.filter((a) => uretebilen(a) === 1).length, okuyan(l),
    ((l.filter((a) => a.zincir === "yok").reduce((t, a) => t + a.istek, 0) /
      AKIS.reduce((t, a) => t + a.istek, 0)) * 100).toFixed(1));
}

const C = [-26, 9, 8, 8, 14, 13];
console.log("\n3. ayni savunmalarin bedeli");
yaz(C, "savunma", "kok kalem", "ek tur", "elle", "kesilen akis", "kapsam disi");
for (const s of KUR) {
  const l = uygula(s), kapsam = AKIS.filter((a) => a.yapabilir);
  const sabit = l.filter((a) => a.zincir === "sabit-kok" && a.yapabilir).length;
  yaz(C, s.join(" + ") || "hicbiri", s.includes("uc-dogrulama") ? KOK : 0,
    s.includes("uc-dogrulama") ? kapsam.length * 2 : 0, s.includes("sabitleme") ? sabit : 0,
    s.includes("sabitleme") ? sabit : 0, AKIS.length - kapsam.length);
}

const D = [-27, 14, 12, 12];
console.log("\n4. uc dogrulama ve sabitleme birlikte acikken kalan");
yaz(D, "akis", "zincir", "uretebilen", "30g istek");
for (const a of uygula(["uc-dogrulama", "sabitleme"]).filter((x) => uretebilen(x) > 1))
  yaz(D, a.ad, a.zincir, uretebilen(a), a.istek);
```

```
8 akis, 36 adim, kok listesi 84 kalem; zinciri olmayan akis 3, okuyabilen adim 16, 30 gunluk toplam istek 265118

1. akis basina kanit zinciri
akis                          adim        zincir   halka  dayanaksiz  uretebilen  30g istek
saha-terminali>toplayici         6           yok       0           0           6      12400
sayac-ucu>alim-ucu               4           yok       0           0           4      89400
sube-gecidi>merkez-gecidi        5     ortak-kok       3           1          84      43200
yonetim-ucu>sube-gecidi          3  ilk-kullanim       1           1           3        268
faturalama>dogrulayici           2     ortak-kok       3           1          84      22800
dogrulayici>olcum-deposu         2     sabit-kok       3           0           1      61300
saha-terminali>ad-sunucusu       6           yok       0           0           6      34600
dis-istemci>ortak-arayuz         8     ortak-kok       3           1          84       1150

2. savunmalar: zincirin durumu
savunma                    zincirsiz  dayanaksiz  uretebilen  tek zincir  okuyan adim  zincirsiz istek %
hicbiri                            3           4         272           1           16               51.4
uc-dogrulama                       1           6         509           1            4               33.7
sabitleme                          3           1          23           4           16               51.4
uc-dogrulama + sabitleme           1           0          11           7            4               33.7

3. ayni savunmalarin bedeli
savunma                   kok kalem  ek tur    elle  kesilen akis  kapsam disi
hicbiri                           0       0       0             0            1
uc-dogrulama                     84      14       0             0            1
sabitleme                         0       0       4             4            1
uc-dogrulama + sabitleme         84      14       7             7            1

4. uc dogrulama ve sabitleme birlikte acikken kalan
akis                               zincir  uretebilen   30g istek
sayac-ucu>alim-ucu                    yok           4       89400
```
Sayılar **ölçüm** sınıfındadır; girdileri PG19–PG21'dir.

#### Otuz Altı Adım, Üç Zincirsiz Akış

Sekiz akış toplam otuz altı adımdan geçer. Üç akışın hiç kanıt zinciri yoktur ve bu üç akışın
on altı adımı içeriği okuyabilir. Kalan beş akışta bir zincir vardır, ama zincirin varlığı tek
başına bir sonuç değildir.

Birinci tablo bunu altıncı sütunda gösterir. `dogrulayici>olcum-deposu` akışının zinciri üç
halkalıdır ve dayanaksız halkası yoktur: kimlik iddiasını üretebilecek taraf sayısı **birdir**.
`faturalama>dogrulayici` akışının zinciri de üç halkalıdır, ama bir halkası dayanaksızdır ve
üretebilen taraf sayısı **84'tür**. İki akış aynı halka sayısına sahiptir ve aralarında seksen
dört kat fark vardır.

Farkın kaynağı dayanaksız halkadır. Ortak kök düzeninde uç, kök listesindeki her kalemin
yazdığı bir ifadeyi kabul eder; o listede kaç kalem varsa iddiayı o kadar taraf üretebilir.
Sabit kök düzeninde uç yalnız tek bir kalemin ifadesini kabul eder. **Zincirin uzunluğu güveni
ölçmez; listenin uzunluğu ölçer.**

Zincirsiz akışlarda sayı daha küçüktür ve bu, ilk bakışta ters görünür. `saha-
terminali>toplayici` akışının üretebilen taraf sayısı altıdır — yoldaki altı adım. Ortak kök
düzenindeki bir akışın seksen dördüne göre az. Aradaki fark niteliktedir: zincirsiz akışta o
altı adım yolun **üstündedir** ve trafiği ayrıca okuyabilir; ortak kök düzenindeki seksen dört
kalem yolun üstünde değildir ve içeriği okuyamaz. Sayılar aynı eksende karşılaştırılamaz; ikisi
de yazılır.

Akış sayısı yerine istek hacmi okunduğunda tablo daha da keskinleşir. Sekiz akış otuz günde
265.118 istek taşır; zinciri hiç olmayan üç akış bunun **136.400'ünü**, yani **%51,4'ünü**
taşır. Zincirin tek halkaya indiği tek akış — `dogrulayici>olcum-deposu` — 61.300 istekle
toplamın %23,1'ini taşır. Akış sayısına göre üç sekizde bir olan zincirsizlik, hacme göre
yarıdan fazladır. **Kanıt zinciri kapsamı akış sayarak değil, o akışların taşıdığı istek
hacmiyle raporlanır.**

Dördüncü satırdaki ilk kullanımda güven düzeni ayrı bir kalemdir. Bu akışta iddiayı
üretebilecek taraf sayısı yalnız **ilk bağlantıda** üçtür; ilk bağlantı tamamlandıktan sonra uç
gördüğü değeri saklar ve sayı bire iner. Zincirin tamamı tek bir ana bağlıdır ve o an bir daha
gelmez. Bu düzenin ölçüsü bir taraf sayısı değil, bir **pencere sayısıdır**: kaç kez ilk
bağlantı kuruluyor. Aygıt değişiminde, yeniden kurulumda ve anahtar yenilemesinde pencere
yeniden açılır.

#### Uç Doğrulamanın Yön Değiştirdiği Yer

İkinci tablo bu dersin en dikkat çekici satırını üretir. Uç doğrulama açıldığında zincirsiz
akış sayısı üçten **bire** iner ve okuyan adım sayısı on altıdan **dörde** düşer — beklenen
iyileşme. Aynı satırda üretebilen taraf toplamı ise 272'den **509'a çıkar**. Dayanaksız halka
sayısı da dörtten **altıya** yükselir.

Neden yükseldiği birinci tablodan okunur. Zincirsiz iki akış, yolundaki altı adım tarafından
üretilebilen bir iddia taşıyordu; uç doğrulama açıldığında bu akışlar ortak kök düzenine geçer
ve iddiayı üretebilecek taraf sayısı altıdan seksen dörde çıkar. Okuma tümüyle kapanır, ama
kimlik iddiasını üretebilecek taraf kümesi büyür.

**Uç doğrulama, iddiayı yoldaki adımlardan alıp bir kök listesine devreder; kazanç okuma
tarafındadır, kayıp ise güven kümesinin büyümesindedir.** Bu iki sonucu tek bir "güvenli oldu"
cümlesinde toplayan bir değerlendirme, ikinci sütunun yönünü hiç görmez.

Üçüncü satır sabitlemeyi tek başına ölçer: üretebilen toplam 272'den **23'e** iner ve tek
zincirli akış sayısı birden dörde çıkar. Okuyan adım on altıda kalır, çünkü sabitleme zincirsiz
akışlara dokunmaz. Dördüncü satır ikisini birleştirir ve iki eksende de en iyi sonucu verir:
dayanaksız halka **sıfır**, üretebilen toplam **11**, tek zincirli akış **yedi**, okuyan adım
**dört**.

#### Kalan Akış ve Bedel

Dördüncü tablo geriye kalanı adıyla verir. Sekiz akıştan biri — sayaç uçlarından alım ucuna
giden akış — uç doğrulama yapamaz ve zincirsiz kalır. Bu akış otuz günde **89.400 istek**
taşır; sekiz akışın toplam hacminin en büyük payı. İkinci derste doğrulanamayan yedi kabul
noktasını bırakan neden burada da geçerlidir: uçlar kanıt üretemez. Savunma yetmemektedir ve
yetmemesinin nedeni yapılandırma değildir.

Üçüncü tablo bedeli yazar. Uç doğrulama seksen dört kalemlik bir kök listesinin sürekli
yönetilmesini ve akış başına iki ek tur — kapsamdaki yedi akış için toplam on dört tur — ister.
Sabitleme tek başına dört elle kalem getirir ve her kalem, sabitlenen kök değiştiğinde o akışın
kesilmesi anlamına gelir: **dört kesilen akış**; iki savunma birlikte açıkken sayı yediye çıkar.
Kapsam dışı kalan akış sayısı her satırda birdir ve hiçbir savunma onu değiştirmez. Hacim
cinsinden bu tek akış, üç savunma da açıkken zincirsiz kalan 265.118 isteğin **89.400'ü** —
toplamın %33,7'si — demektir; başlangıçtaki %51,4'ten inmiştir ama üçte biri hâlâ kanıtsızdır.

Kök listesi kalemi ile elle sabitleme kalemi ters yönde çalışır. Seksen dört kalemlik liste
merkezî olarak yönetilir ve akış sayısından bağımsızdır; yedi sabitleme kalemi akış başınadır
ve her yeni akış bir kalem ekler. Küçük bir ağda sabitleme ucuzdur ve güven kümesini bire
indirir; akış sayısı büyüdükçe kalem sayısı doğrusal artar ve her kök değişimi bir kesinti
üretir. İkinci tablonun son sütunu bu iki bedelin karşılığını tek sayıda toplar: hangi savunma
açılırsa açılsın zincirsiz istek payı ya %51,4'te kalır ya %33,7'ye iner, çünkü aradaki fark
tümüyle uç doğrulamanın kapsadığı akışlardan gelir ve sabitleme o payı hiç değiştirmez.

#### Özet

- Araya girme bir kanıt zinciri eksikliğidir: 8 akışın 36 adımında 3 akışın hiç zinciri yoktur
  ve bu üç akışın **16 adımı** içeriği okuyabilir.
- Zincirin gücü halka sayısı değil, iddiayı üretebilecek taraf sayısıdır: aynı 3 halkalı iki
  akıştan biri **1**, öteki **84** tarafça üretilebilir; farkı dayanaksız tek halka yaratır.
- Uç doğrulama okuyan adımı 16'dan 4'e indirir, ama üretebilen taraf toplamını 272'den **509'a
  çıkarır**; iddiayı yoldaki adımlardan alıp 84 kalemlik bir kök listesine devreder.
- Kök sabitleme üretebilen toplamı 23'e, ikisi birlikte **11'e** indirir ve dayanaksız halkayı
  sıfırlar; bedeli 84 kalemlik liste, 14 ek tur ve kök değişiminde kesilen **7 akıştır**.
- Uç doğrulama yapamayan tek akış 30 günde 89.400 istek taşır ve hiçbir savunma onu kapsamaz.

#### Sonraki Adım

Bu ders bir iddianın **kimden** geldiğini sordu ve yanıtı bir zincirle bağladı. Sabit kök
düzeninde iddiayı üretebilecek taraf sayısı bire indi; kimliğin kanıtı tamdır. Yine de tam bir
kanıt zinciriyle üretilmiş, doğru kaynaktan gelmiş, hiçbir halkası dayanaksız olmayan bir
mesajın bir özelliği hâlâ hiç sorulmadı: **ne zaman** üretildiği. Aynı mesaj bir kez daha
sunulduğunda kimlik kanıtı yine geçerlidir, zincir yine tamdır ve alıcı onu ilk seferkiyle aynı
biçimde kabul eder. Sonraki ders bunu tazelik kanıtı cinsinden ölçer: mesaj kümesinin kaçı
tekrar edildiğinde kabul ediliyor, sayaç, zaman damgası ve tek kullanımlık değer kaçını
yakalıyor, kaçı hâlâ yakalanamıyor ve bunun durum, saat ve depolama bedeli ne oluyor.

### Tekrar ve Sahtecilik Saldırıları

Source: https://academia.sh/tr/kurslar/ag-guvenligi/tekrar-ve-sahtecilik-saldirilari

Tekrar ve sahteciliğin tazelik kanıtı cinsinden ölçülmesi: 10 mesaj türünün tazelik kanıtı yokken tekrarı olduğu gibi kabul etmesi, sayacın hacmin %75'ini tam koruyup durum değiştiren tek bir türü bile kapsamaması, zaman damgasının 120 saniyelik pencere kadar açık kalması, ayrı depolu tek kullanımlık değerin 2 alıcı kadar açık kalması ve üç kanıt birlikte açıkken 36.460 isteğin hâlâ sınırsız tekrarlanabilmesi.

Önceki ders bir iddianın **kimden** geldiğini sordu ve yanıtı bir zincirle bağladı. Sabit kök
düzeninde iddiayı üretebilecek taraf sayısı bire indi; kimliğin kanıtı tamdır. Yine de tam bir
kanıt zinciriyle üretilmiş, doğru kaynaktan gelmiş, hiçbir halkası dayanaksız olmayan bir
mesajın bir özelliği hâlâ hiç sorulmadı: **ne zaman** üretildiği.

Aynı mesaj bir kez daha sunulduğunda kimlik kanıtı yine geçerlidir, zincir yine tamdır ve alıcı
onu ilk seferkiyle aynı biçimde kabul eder. Kimlik kanıtı mesajın kimden geldiğini söyler;
hiçbir şey mesajın **yeni** olduğunu söylemez. Bu ders o eksik özelliği sayar ve konuyu
kapatır.

#### Tazelik Bir Kanıt İster

Aynı mesajın yeniden sunulmasına **tekrar saldırısı (replay attack)** denir.

**PG22:** **tazelik kanıtı (freshness proof)**, bir mesajın daha önce sunulmadığını alıcının
sınayabilmesidir; kimlik kanıtı tam olsa da tazelik kanıtı yoksa aynı mesaj yeniden kabul
edilir. **PG23:** üç tazelik kanıtı vardır ve güçleri eşit değildir — sayaç tamdır, zaman
damgası pencere kadar açıktır, **tek kullanımlık değer (nonce)** yalnız depo paylaşılıyorsa
tamdır. **PG24:** bir savunma yalnız mesajın taşıdığı alanı sınayabilir; alan yoksa savunma o
mesaj türüne hiç dokunmaz.

PG24 bu dersin kapsamını belirler. Tazelik denetimi bir açma kapama düğmesi değildir: mesaj
biçiminde ilgili alan yoksa denetim koşacak bir şey bulamaz. Bu yüzden ölçüm iki aşamalıdır —
önce hangi mesaj türünün hangi alanı taşıdığı, sonra o alanın hangi koruma düzeyini verdiği.

Aşağıdaki mesaj kümesi bir **modeldir**: kurgu ölçüm ağının mesaj türleri, taşıdıkları alanlar
ve otuz günlük hacimleri veri olarak yazılır; gerçek bir ağ ya da gerçek bir mesaj yoktur. Kod
hiçbir mesaj üretmez ya da yeniden sunmaz; koşan tek şey alıcı tarafındaki tazelik denetiminin
sayımıdır. Bir mesajın sahibi olunmayan bir sistemde yeniden sunulması **yazılı yetki ve
tanımlı kapsam olmadan hem yasadışı hem meslek dışıdır**.

```js
// aglar/tazelik.mjs — kurgu bolgesel olcum agindaki mesaj turlerinin tazelik kaniti
// (model): gercek bir ag, gercek bir mesaj ya da gercek bir hacim yok. Rastgelelik yok.

// PG22: tazelik kaniti, bir mesajin daha once sunulmadigini alicinin sinayabilmesidir;
// kimlik kaniti tam olsa da tazelik kaniti yoksa ayni mesaj yeniden kabul edilir.
// PG23: uc tazelik kaniti vardir ve gucleri esit degildir. Sayac tamdir; zaman damgasi
// pencere kadar aciktir; tek kullanimlik deger yalnizca depo paylasiliyorsa tamdir.
export const PENCERE = 120;      // zaman damgasi penceresi (sn)
export const ALICI = 3;          // ayni mesaji kabul eden alici sayisi
export const UC = 224;           // sayac ya da saat tutulacak uc sayisi
export const KAYIT = 24;         // tek kullanimlik deger kaydinin boyutu (bayt)
export const AY = 2592000;       // 30 gun (sn)
export const SIRASIZ = 0.003;    // sayac denetiminde sirasiz gelen mesru mesaj orani
export const GEC = 0.008;        // pencereden gec gelen mesru mesaj orani

// Sutunlar: mesaj turu, sayac tasiyor mu, zaman damgasi tasiyor mu, tek kullanimlik deger
// tasiyor mu, tekrari durum degistiriyor mu (etkili), 30 gunluk hacim.
export const MESAJ = `
  okuma-bildirimi      e e h h 89400    yapilandirma-komutu  h e e e   140
  kira-yenileme        h h h e  1860    gunluk-kaydi         e e h h 43200
  is-emri-onayi        h e h e   420    oturum-acma          h h e e   870
  toplu-aktarim        e h h h  8640    durum-sorgusu        h h h h 34600
  sayac-okuma-talebi   h e h h  9240    guncelleme-onayi     h e e e    36`
  .trim().split(/\s+/).reduce((l, _, i, a) => (i % 6 ? l : [...l, {
    tur: a[i], sayac: a[i + 1] === "e", zaman: a[i + 2] === "e",
    tekil: a[i + 3] === "e", etkili: a[i + 4] === "e", hacim: +a[i + 5],
  }]), []);

// PG24: bir savunma yalnizca mesajin tasidigi alani sinayabilir; alan yoksa savunma o
// mesaj turune hic dokunmaz.
// Koruma duzeyi: tam = her tekrar yakalanir; kismi = bir pencere ya da bir alici kadar
// acik kalir; yok = tekrar oldugu gibi kabul edilir.
export function duzey(m, savunma = [], paylasik = false) {
  if (savunma.includes("sayac") && m.sayac) return { d: "tam", acik: "-" };
  if (savunma.includes("tekil") && m.tekil)
    return paylasik ? { d: "tam", acik: "-" } : { d: "kismi", acik: `${ALICI - 1} alici` };
  if (savunma.includes("zaman") && m.zaman) return { d: "kismi", acik: `${PENCERE} sn` };
  return { d: "yok", acik: "sinirsiz" };
}

export const hacim = (l) => l.reduce((t, m) => t + m.hacim, 0);
export function bedel(savunma = [], paylasik = false) {
  const korunan = (f) => hacim(MESAJ.filter(f));
  const tekilHacim = korunan((m) => savunma.includes("tekil") && m.tekil);
  return {
    durum: savunma.includes("sayac") ? UC : 0,
    saat: savunma.includes("zaman") ? UC : 0,
    depoPencere: Math.ceil(PENCERE * tekilHacim / AY) * KAYIT * (paylasik ? 1 : ALICI),
    depoSinirsiz: tekilHacim * KAYIT * (paylasik ? 1 : ALICI),
    red: Math.round(SIRASIZ * korunan((m) => savunma.includes("sayac") && m.sayac)) +
      Math.round(GEC * korunan((m) => savunma.includes("zaman") && m.zaman && !m.sayac)),
  };
}
```

```js
// aglar/tazelik-denetimi.mjs — mesaj kumesinin kaci tekrar edildiginde kabul ediliyor,
// sayac, zaman damgasi ve tek kullanimlik deger kacini yakaliyor, kaci aciksa bedeli ne.
import { MESAJ, PENCERE, ALICI, UC, KAYIT, duzey, hacim, bedel } from "./tazelik.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 say = (s, p, d) => MESAJ.filter((m) => duzey(m, s, p).d === d);
// [savunma kumesi, tek kullanimlik deger deposu aliciar arasinda paylasik mi]
const KUR = [[[], false], [["sayac"], false], [["zaman"], false], [["tekil"], false],
  [["sayac", "zaman", "tekil"], false], [["sayac", "zaman", "tekil"], true]];
const ad = (s, p) => (s.join(" + ") || "hicbiri") + (p ? " (paylasik depo)" : "");

console.log(`${MESAJ.length} mesaj turu, 30 gunluk hacim ${hacim(MESAJ)}; ` +
  `tazelik kaniti yokken tekrar edildiginde kabul edilen tur ${MESAJ.length}, ` +
  `tekrari durum degistiren tur ${MESAJ.filter((m) => m.etkili).length}`);

const A = [-12, 7, 12, 12, 12];
console.log("\n1. hangi alan kac turde var");
yaz(A, "alan", "tur", "30g hacim", "hacim %", "etkili tur");
for (const [k, f] of [["sayac", (m) => m.sayac], ["zaman", (m) => m.zaman],
  ["tekil", (m) => m.tekil], ["hicbiri", (m) => !m.sayac && !m.zaman && !m.tekil]]) {
  const l = MESAJ.filter(f);
  yaz(A, k, l.length, hacim(l), ((hacim(l) / hacim(MESAJ)) * 100).toFixed(1),
    l.filter((m) => m.etkili).length);
}

const B = [-38, 6, 7, 6, 13, 17];
console.log("\n2. savunmalarin yakaladigi tur ve hacim");
yaz(B, "savunma", "tam", "kismi", "yok", "acik hacim", "etkili acik tur");
for (const [s, p] of KUR) {
  const acik = say(s, p, "yok");
  yaz(B, ad(s, p), say(s, p, "tam").length, say(s, p, "kismi").length, acik.length,
    hacim(acik), acik.filter((m) => m.etkili).length);
}

const C = [-38, 8, 8, 16, 14, 11];
console.log("\n3. ayni savunmalarin bedeli");
yaz(C, "savunma", "durum", "saat", "depo (pencere)", "depo (30g)", "red mesru");
for (const [s, p] of KUR) {
  const b = bedel(s, p);
  yaz(C, ad(s, p), b.durum, b.saat, b.depoPencere + " B", b.depoSinirsiz + " B", b.red);
}

const D = [-22, 8, 8, 10, 12];
console.log("\n4. uc kanit birlikte acikken kalan aciklik");
yaz(D, "tur", "duzey", "etkili", "30g hacim", "acik kalan");
for (const m of MESAJ) {
  const z = duzey(m, ["sayac", "zaman", "tekil"], false);
  if (z.d !== "tam") yaz(D, m.tur, z.d, m.etkili ? "evet" : "hayir", m.hacim, z.acik);
}
console.log(`pencere ${PENCERE} sn, alici ${ALICI}, uc ${UC}, kayit ${KAYIT} bayt`);
```

```
10 mesaj turu, 30 gunluk hacim 188406; tazelik kaniti yokken tekrar edildiginde kabul edilen tur 10, tekrari durum degistiren tur 5

1. hangi alan kac turde var
alan            tur   30g hacim     hacim %  etkili tur
sayac             3      141240        75.0           0
zaman             6      142436        75.6           3
tekil             3        1046         0.6           3
hicbiri           2       36460        19.4           1

2. savunmalarin yakaladigi tur ve hacim
savunma                                  tam  kismi   yok   acik hacim  etkili acik tur
hicbiri                                    0      0    10       188406                5
sayac                                      3      0     7        47166                5
zaman                                      0      6     4        45970                2
tekil                                      0      3     7       187360                2
sayac + zaman + tekil                      3      5     2        36460                1
sayac + zaman + tekil (paylasik depo)      6      2     2        36460                1

3. ayni savunmalarin bedeli
savunma                                  durum    saat  depo (pencere)    depo (30g)  red mesru
hicbiri                                      0       0             0 B           0 B          0
sayac                                      224       0             0 B           0 B        424
zaman                                        0     224             0 B           0 B         79
tekil                                        0       0            72 B       75312 B          0
sayac + zaman + tekil                      224     224            72 B       75312 B        503
sayac + zaman + tekil (paylasik depo)      224     224            24 B       25104 B        503

4. uc kanit birlikte acikken kalan aciklik
tur                      duzey  etkili 30g hacim  acik kalan
yapilandirma-komutu      kismi    evet       140     2 alici
kira-yenileme              yok    evet      1860    sinirsiz
is-emri-onayi            kismi    evet       420      120 sn
oturum-acma              kismi    evet       870     2 alici
durum-sorgusu              yok   hayir     34600    sinirsiz
sayac-okuma-talebi       kismi   hayir      9240      120 sn
guncelleme-onayi         kismi    evet        36     2 alici
pencere 120 sn, alici 3, uc 224, kayit 24 bayt
```
Sayılar **ölçüm** sınıfındadır; girdileri PG22–PG24'tür.

#### Alan Yoksa Denetim Yok

Başlık satırı tabanı verir: on mesaj türünün **onu da** tazelik kanıtı yokken tekrar
edildiğinde kabul edilir ve bunların **beşinin** tekrarı durumu değiştirir. Hacim otuz günde
188.406 istektir.

Birinci tablo alanların dağılımını gösterir ve bu dersin ters orantısını kurar. Sayaç alanı üç
türde vardır ve hacmin **%75'ini** taşır; bu üç türün **hiçbiri** durum değiştirmez. Tek
kullanımlık değer alanı da üç türdedir, ama hacmin yalnız **%0,6'sını** taşır; buna karşılık üç
türün **üçü de** durum değiştirir. Zaman damgası altı türde ve hacmin %75,6'sındadır.

İki uçtaki bu dağılım rastlantı değildir. Sayaç, sürekli akan ve sırası zaten anlamlı olan
mesajlarda bulunur — okuma bildirimi, günlük kaydı, toplu aktarım. Tek kullanımlık değer,
seyrek ve tekil işlemlerde bulunur — yapılandırma komutu, oturum açma, güncelleme onayı. **En
güçlü tazelik kanıtı en yüksek hacimli ve en zararsız mesajlarda, en pahalı kanıt en düşük
hacimli ve en etkili mesajlardadır.**

Son satır boşluğu verir: iki tür hiçbir alan taşımaz, hacmin **%19,4'ünü** tutar ve biri durum
değiştirir. Bu iki tür hiçbir savunmayla korunamaz, çünkü korunacak alan mesajda yoktur.

#### Üç Kanıtın Üç Ayrı Açıklığı

İkinci tablo savunmaları ayrı ayrı koşturur. Sayaç üç türü **tam** korur ve açık hacmi
188.406'dan 47.166'ya indirir; zaman damgası aynı hacmi 45.970'e indirdiği için hacim ölçüsündeki
en büyük düşüş onundur. Durum değiştiren açık tür
sayısı ise **beşte kalır**; sayaç hiçbirine dokunmaz.

Zaman damgası altı türü korur, ama koruma düzeyi **kısmi**dir: pencere 120 saniyedir ve bu süre
içinde sunulan bir tekrar geçerli sayılır. Açık hacim 45.970'e iner ve durum değiştiren açık
tür beşten **ikiye** düşer. Pencereyi daraltmak açıklığı kısaltır ve reddedilen meşru mesaj
sayısını artırır; sıfır yapmak, saatleri tam eşitlenmemiş her ucu dışarıda bırakır.

Tek kullanımlık değer üç türü korur, ama ayrı depolarla koruma yine **kısmi**dir: bir alıcının
kabul ettiği değer öteki iki alıcının deposunda yoktur ve aynı mesaj onlara sunulduğunda geçer.
Açıklık **iki alıcı** kadardır. Açık hacim 187.360'ta kalır, çünkü korunan üç tür hacmin yalnız
%0,6'sıdır.

Üçü birlikte açıkken üç tür tam, beş tür kısmi korunur ve **iki tür açık kalır**. Depo alıcılar
arasında paylaşıldığında tam korunan tür sayısı üçten **altıya** çıkar, kısmi ikiye iner ve
açık tür yine ikidir. Paylaşılan depo hiçbir yeni türü kapsamaz; yalnız kapsadıklarının
düzeyini yükseltir.

#### Kalan Açıklığın Bedeli

Dördüncü tablo üç kanıt açıkken kalan yedi kalemi ve her birinin ne kadar açık olduğunu verir.
Üçü **iki alıcı** kadar, ikisi **120 saniye** kadar, ikisi **sınırsız** açıktır. Sınırsız
olanlardan biri kira yenilemedir ve durumu değiştirir: hiçbir alan taşımadığı için hiçbir
denetim ona dokunamaz. Öteki durum sorgusudur ve 34.600 istekle kalan açık hacmin büyük payını
tutar.

Üçüncü tablo bedeli üç ayrı kalemde yazar. Sayaç **224 durum kalemi** ister — her uç için bir
sayaç — ve sırasız gelen 424 meşru mesajı reddeder. Zaman damgası **224 saat eşitleme kalemi**
ister ve pencereden geç gelen 79 meşru mesajı reddeder. İkisi birlikte 503 meşru mesajın
reddedilmesi demektir; otuz günlük hacmin binde 2,7'si.

Tek kullanımlık değerin bedeli depolamadır ve iki sayı arasındaki fark bu tablonun en büyük
oranıdır. Zaman damgası penceresiyle sınırlandığında depo **72 bayttır**; pencere olmadan, yani
tekrarın ne zamana kadar mümkün olduğu bilinmediğinde, otuz günlük depo **75.312 bayttır** —
bin katın üstünde. Paylaşılan tek depoyla bu sayılar 24 ve 25.104 bayta iner. **Tek kullanımlık
değer tek başına sınırsız depolama ister; sınırlı hâle gelmesi zaman damgasına bağlıdır ve iki
kanıt ancak birlikte kullanılabilir.**

#### Özet

- Tazelik kanıtı olmadan 10 mesaj türünün 10'u da tekrarı olduğu gibi kabul eder; 5'inin
  tekrarı durumu değiştirir ve toplam hacim 30 günde 188.406 istektir.
- Alan dağılımı terstir: sayaç hacmin %75'ini taşıyan 3 türdedir ve **hiçbiri** durum
  değiştirmez; tek kullanımlık değer hacmin %0,6'sını taşıyan 3 türdedir ve **üçü de** durum
  değiştirir. İki tür hiçbir alan taşımaz ve hacmin %19,4'ünü tutar.
- Üç kanıtın açıklıkları farklı büyüklüktedir: sayaç tam korur, zaman damgası **120 saniye**,
  ayrı depolu tek kullanımlık değer **2 alıcı** kadar açık kalır.
- Üçü birlikte açıkken 3 tür tam, 5 tür kısmi korunur ve 2 tür açık kalır; paylaşılan depo tam
  korunan türü 6'ya çıkarır ama hiçbir yeni türü kapsamaz.
- Bedel 224 durum kalemi, 224 saat eşitleme kalemi, 503 reddedilen meşru mesaj ve 72 baytlık
  bir depodur; pencere olmadan aynı depo 75.312 bayta çıkar.

#### Sonraki Adım

Bu konu ağın ölçü birimini kurdu ve sekiz derste aynı üç sütunu yazdı. Bir okumanın taşıdığı on
sekiz iddia sayıldı ve savunma yokken hiçbirinin kanıtı olmadığı görüldü; açık bir bağlantı
noktasının bir kabul bildirimi olduğu ve kırk dokuz kabul noktasının yirmi birinin kanıtsız
olduğu ölçüldü; adres ve ad çözümleme önbelleklerinde doğrulanmayan yanıtın kaç kaydı ve kaç
bağımlı servisi bozduğu, adres dağıtımında tek bir kabulün beş iddiayı birden bağladığı, kaynak
adresi kanıtsız olan isteklerin kapasiteyi ve durum tablosunu nasıl tükettiği, kanıt zincirinin
kaç tarafça üretilebildiği ve tazelik kanıtının kaç türde hiç bulunmadığı sayıldı.

Bütün bu ölçümlerin ortak bir varsayımı vardı ve bu ders de dâhil hiçbir yerde sorgulanmadı:
her iddia **aynı düz ağda** dolaşıyordu. Doğrulanmayan bir yanıtın önbelleğe ulaşabildiği, bir
dağıtım yanıtının uca varabildiği, kanıtsız bir kaynağın alım ucuna istek gönderebildiği,
tekrarlanan bir mesajın alıcıya erişebildiği varsayıldı. Ağın kendisine bir sınır çizilirse bu
iddiaların kaçı karşıya bile geçemez, o sınır kaç kural ister ve kaç meşru akışı durdurur?
Sonraki konu — **Çevre Savunması** — aynı iddia kümesini bu kez ağın çizilmiş sınırları
üzerinde ölçer.

## Çevre Savunması

Ağın kendisine çizilen sınırın kaç iddiayı kanıtlanabilir kıldığı: güvenlik duvarı nesillerinin gördüğü ve kanıtladığı alan, bölütlemenin bölge grafiğinde kapattığı yol ve silahtan arındırılmış bölge, denetim noktası olarak vekil ve sıçrama sunucusu, tespit ile önlemenin aynı olay kümesindeki farkı, bal küpü ve yönlendirme kuyusunun ürettiği erken sinyal, sanal özel ağın erişim kapsamı ve kural değerlendirme sırasının akış sonuçlarını değiştirmesi.

### Güvenlik Duvarı Nesilleri

Source: https://academia.sh/tr/kurslar/ag-guvenligi/guvenlik-duvari-nesilleri

Sekiz akış sınıfının taşıdığı kırk sekiz iddia üç güvenlik duvarı neslinde koşturulur: paket filtreleyen kutu kaçını görüyor, durum bilgili kaçını, uygulama farkındalıklı kaçını kanıtlıyor, her nesil karşılığında kaç yeni kaleme bakmak zorunda ve şifreli akış kanıtlananın ne kadarını geri alıyor.

Önceki konu protokollerin taşıdığı iddiaları saydı ve bunların hepsi aynı düz ağda dolaşıyordu:
bir mesajın kaynak adresi, ait olduğu oturum ve arkasındaki özne yolun hiçbir noktasında
sınanmıyordu. Ağın ortasına bir sınır çizmenin ilk biçimi güvenlik duvarıdır. Sınırı çizmek tek
başına hiçbir iddiayı kanıtlamaz; sınırda duran kutu yalnız **gördüğü** alan üzerinde karar
verebilir.

Bu dersin sorusu kutuların karşılaştırılması değildir. Aynı akış kümesinde paket filtreleyen,
durum bilgili ve uygulama farkındalıklı güvenlik duvarının her biri kaç iddiayı görüyor, kaçını
kanıtlayabiliyor, kaçını kanıtsız kabul ediyor ve gördüğünü kanıtlayabilmek için kaç yeni kaleme
bakmak zorunda kalıyor. Kural yazımı, varsayılan reddet ve kural genişliği başka bir kursta
ölçüldü; buradaki eksen kuralın kendisi değil, kuralın dayandığı alanın kanıtlanabilir olup
olmadığıdır.

- **CS1.** Sekiz akış sınıfı, iddia türleri ve oturum sayıları kurgusal bölgesel ölçüm ağına
  aittir. Gerçek paket akmıyor; ölçülen şey `node` ile kurulan modeldir.
- **CS2.** İddia türü sekize indirgendi. Gerçek bir alışverişte alan sayısı çok daha büyüktür;
  kalem sayısını büyütür, nesiller arasındaki farkın yönünü değiştirmez.
- **CS3.** "Kanıtlar" burada dar anlamda kullanılıyor: kutunun elinde iddiayı sınayacak bir
  karşılık var demektir. Kriptografik kanıt ve sertifika doğrulaması bu kursun dışındadır.
- **CS4.** Durum kaydı sayısı dönemin eşzamanlı oturum toplamı alındı. Gerçekte tablo zaman
  aşımıyla boşalır; kayıt sayısını düşürür, tablonun bir kalem olduğunu değiştirmez.
- **CS5.** Sahte iddia sınıfları yalnız model olarak yazıldı; hiçbiri çalıştırılabilir biçimde
  verilmedi. Sayılan şey hangi neslin durdurduğudur.
- **CS6.** Uçtan uca şifreli akışta dışarıdan görünen tek uygulama iddiası sunucu adı sayıldı.

#### İddia ve Nesil Modeli

Model iki şey tutuyor: her iddia türünün hangi nesilden itibaren görülebildiği ve hangi nesilden
itibaren kanıtlanabildiği. Bu ikisi aynı şey değildir; ayrımın kendisi dersin bütün iddiasıdır.
Hedef kapı numarasını paket filtreleyen kutu da görür, ama o numaranın arkasındaki hizmetin
gerçekten o hizmet olduğunu ancak akışı çözümleyen kutu sınayabilir.

```js
// nesil.mjs — akis kumesi ve uc guvenlik duvari neslinin gordugu/kanitlayabildigi iddia; model, gercek trafik degil
export const NESIL = ['paket', 'durum', 'uygulama'];
const D = (gorur, kanit) => ({ gorur, kanit });
export const IDDIA = {                       // iddia: hangi nesilden itibaren gorulur / kanitlanabilir
  'kaynak-adres': D('paket', 'paket'),       // kanit: geldigi yonun beklenen adres blogu
  'hedef-hizmet': D('paket', 'uygulama'),    // kapi numarasi hizmetin kendisini kanitlamaz
  'yon-baslangici': D('paket', 'durum'),     // kanit: durum tablosunda kayit var mi
  'oturum-uyeligi': D('durum', 'durum'),
  'sunucu-adi': D('uygulama', 'uygulama'),
  'istek-yolu': D('uygulama', 'uygulama'),
  'icerik-turu': D('uygulama', 'uygulama'),
  'ozne-kimligi': D('uygulama', null),       // tasinan kimlik; ag katmani kanitlayamaz
};
const sr = (n) => NESIL.indexOf(n);
export const gorur = (n, i) => sr(n) >= sr(IDDIA[i].gorur);
export const kanitlar = (n, i) => IDDIA[i].kanit !== null && sr(n) >= sr(IDDIA[i].kanit);
const T = Object.keys(IDDIA);
const k = (...a) => T.filter((_, i) => a[i]);
// [ad, tasidigi iddialar, donemdeki eszamanli oturum] — kurgu bolgesel olcum agi
export const AKIS = [
  ['sayac -> toplayici', k(1, 1, 1, 1, 0, 0, 0, 0), 41200],
  ['toplayici -> dogrulayici', k(1, 1, 1, 1, 1, 1, 0, 0), 8600],
  ['sube -> fatura arayuzu', k(1, 1, 1, 1, 1, 1, 0, 1), 12400],
  ['saha terminali -> api', k(1, 1, 1, 1, 1, 1, 1, 1), 5100],
  ['yonetim -> kabuk', k(1, 1, 1, 1, 0, 0, 0, 0), 310],
  ['dis -> genel arayuz', k(1, 1, 1, 1, 1, 1, 1, 1), 26400],
  ['uygulama -> paket deposu', k(1, 1, 1, 1, 1, 1, 0, 0), 90],
  ['yedek -> dis depo', k(1, 1, 1, 1, 1, 0, 0, 0), 12],
];
export const TOPLAM = AKIS.reduce((a, [, i]) => a + i.length, 0);
export const OTURUM = AKIS.reduce((a, x) => a + x[2], 0);
// Ucdan uca sifreli akislar: disaridan gorulebilen tek uygulama iddiasi sunucu adidir
export const SIFRELI = ['sube -> fatura arayuzu', 'saha terminali -> api', 'dis -> genel arayuz',
  'uygulama -> paket deposu', 'yedek -> dis depo'];
const kapali = (ad, i) => SIFRELI.includes(ad) && IDDIA[i].gorur === 'uygulama' && i !== 'sunucu-adi';
export function say(n, sifre = false) {      // bir nesil icin: gorulen, kanitlanan, kanitsiz kabul
  let gor = 0, kan = 0;
  for (const [ad, iddia] of AKIS) for (const i of iddia) {
    if (sifre && kapali(ad, i)) continue;
    if (gorur(n, i)) gor++;
    if (kanitlar(n, i)) kan++;
  }
  return { gor, kan, kanitsiz: TOPLAM - kan, gormedigi: TOPLAM - gor };
}
export const SIFRELI_OTURUM = AKIS.filter((a) => SIFRELI.includes(a[0])).reduce((a, x) => a + x[2], 0);
export const KALEM = {                       // her neslin bakmak zorunda oldugu kalem
  paket: { 'kural satiri': 34, 'durum kaydi': 0, 'akis tamponu': 0, 'protokol cozumleyici': 0 },
  durum: { 'kural satiri': 34, 'durum kaydi': OTURUM, 'akis tamponu': 0, 'protokol cozumleyici': 0 },
  uygulama: { 'kural satiri': 34, 'durum kaydi': OTURUM, 'akis tamponu': OTURUM, 'protokol cozumleyici': 6 },
};
// Iddia sahteciligi siniflari model olarak yazildi; hicbiri calistirilabilir bicimde verilmedi.
export const SINIF = [                       // [ad, sahte iddia, o iddiayi kanitlayan en dusuk nesil]
  ['kaynak adresi baska bolgeden', 'kaynak-adres', 'paket'],
  ['kurulmus oturum gibi gorunen paket', 'yon-baslangici', 'durum'],
  ['izinli kapida baska protokol', 'hedef-hizmet', 'uygulama'],
  ['izinli akista baska sunucu adi', 'sunucu-adi', 'uygulama'],
  ['istekte tasinan ozne basligi', 'ozne-kimligi', null],
];
export const durduran = (s) => s[2] === null ? '-' : s[2];
```

Akış listesindeki her satır bir sınıfı, taşıdığı iddia kümesini ve dönemdeki eşzamanlı oturum
sayısını tutuyor. İddia kümesi sekiz basamaklı bir maskeyle yazılıyor; sıfır o alanın o akışta hiç
bulunmadığı demektir. Sayaç toplayıcısına giden akış yalnız dört alan taşır, çünkü uygulama
katmanında sunucu adı da istek yolu da yoktur — ikili bir akıştır. Şube ağından faturalama
arayüzüne giden istek ise yedi alan taşır ve bunlardan biri, isteğin arkasındaki öznenin kim
olduğunu söyleyen başlıktır.

#### Kanıtlanan ve Kanıtsız Kabul Edilen

```js
// kosum1.mjs — sekiz akis sinifinin tasidigi iddia sayilir, uc nesil ayni kume uzerinde kosturulur
import { NESIL, AKIS, TOPLAM, IDDIA, gorur, kanitlar, say } from './nesil.mjs';

console.log(`${'akis sinifi'.padEnd(25)} ${'iddia'.padStart(5)}` + NESIL.map((n) => `${n} gor/kanit`.padStart(19)).join(''));
for (const [ad, iddia] of AKIS)
  console.log(`${ad.padEnd(25)} ${String(iddia.length).padStart(5)}` +
    NESIL.map((n) => `${iddia.filter((i) => gorur(n, i)).length}/${iddia.filter((i) => kanitlar(n, i)).length}`.padStart(19)).join(''));
console.log(`\nsekiz akis sinifi ${TOPLAM} iddia tasiyor\n`);
console.log(`${'nesil'.padEnd(10)} ${'goremiyor'.padStart(9)} ${'goruyor'.padStart(7)} ${'kanitliyor'.padStart(10)} ${'kanitsiz kabul'.padStart(14)}`);
for (const n of NESIL) {
  const s = say(n);
  console.log(`${n.padEnd(10)} ${String(s.gormedigi).padStart(9)} ${String(s.gor).padStart(7)} ${String(s.kan).padStart(10)} ${String(s.kanitsiz).padStart(14)}`);
}
const hic = Object.keys(IDDIA).filter((i) => !NESIL.some((n) => kanitlar(n, i)));
console.log(`\nhicbir neslin kanitlayamadigi tur: ${hic.join(', ')} — ${AKIS.filter(([, i]) => i.includes(hic[0])).length} akis sinifinda`);
```

```
akis sinifi               iddia    paket gor/kanit    durum gor/kanit uygulama gor/kanit
sayac -> toplayici            4                3/1                4/3                4/4
toplayici -> dogrulayici      6                3/1                4/3                6/6
sube -> fatura arayuzu        7                3/1                4/3                7/6
saha terminali -> api         8                3/1                4/3                8/7
yonetim -> kabuk              4                3/1                4/3                4/4
dis -> genel arayuz           8                3/1                4/3                8/7
uygulama -> paket deposu      6                3/1                4/3                6/6
yedek -> dis depo             5                3/1                4/3                5/5

sekiz akis sinifi 48 iddia tasiyor

nesil      goremiyor goruyor kanitliyor kanitsiz kabul
paket             24      24          8             40
durum             16      32         24             24
uygulama           0      48         45              3

hicbir neslin kanitlayamadigi tur: ozne-kimligi — 3 akis sinifinda
```

İlk tablonun en anlatıcı sütunu paket filtreleyen kutununkidir: akış sınıfı ne taşırsa taşısın
sayı değişmiyor, her satırda üç görülüyor ve bir kanıtlanıyor. Sekiz iddia taşıyan bir akışla dört
iddia taşıyan bir akış o kutu için aynı şeydir; aradaki dört alan onun bakış alanının dışındadır.
Kanıtladığı tek iddia kaynak adresidir ve bunu ancak paketin geldiği yönün beklenen adres bloğunu
bildiği için yapabilir. Kalan iki alanı, hedef kapıyı ve yön başlangıcını, gördüğü hâlde
sınayamaz.

Toplamda kırk sekiz iddianın kırkı paket filtreleyen kutuda kanıtsız kabul ediliyor. Durum bilgili
nesil bu sayıyı yirmi dörde indiriyor ve kazancının tamamı tek bir yerden geliyor: oturum
tablosundan. Yön başlangıcı iddiası, "bu paket zaten kurulmuş bir bağlantıya ait" demektir ve
paketin kendi içindeki bir alan bunu söyler. Tablo tutan kutu o alanı söylenene bakarak değil,
kendi kaydına bakarak sınar. On altı iddia hâlâ görüş alanının dışındadır.

Uygulama farkındalıklı nesil görmediği alan bırakmıyor; kırk sekiz iddianın kırk beşini
kanıtlıyor. Kalan üç iddia aynı türdendir ve alt satır onu adlandırıyor. İstekte taşınan özne
kimliği, üç akış sınıfında geçiyor ve hiçbir nesil onu kanıtlayamıyor — çünkü ağ katmanındaki
hiçbir kutunun elinde o kimliği sınayacak bir karşılık yoktur. Kutu yalnızca başlığın orada
yazdığını görür. Bu iddianın kanıtı ağın dışındadır; kime ait olduğu ve neye dayandığı bu kursun
konusu değildir.

#### Sahte İddia, Bakılan Kalem ve Şifreli Akış

Kanıtlanmayan bir iddia, o iddianın yanlış olduğu anlamına gelmez; sınanmadığı anlamına gelir.
Farkın nerede önem kazandığını görmek için aynı iddia türlerinin sahte olduğu beş sınıf modele
konuldu. Bunlar birer yöntem tarifi değil, tek satırlık birer etikettir: hangi alanın söylediğiyle
gerçeğin ayrıştığı yer.

```js
// kosum2.mjs — bes iddia sahteciligi sinifi hangi nesilde duruyor, her nesil kac kaleme bakiyor
import { NESIL, SINIF, KALEM, OTURUM, SIFRELI, SIFRELI_OTURUM, say, durduran, kanitlar } from './nesil.mjs';

console.log(`${'sahte iddia sinifi'.padEnd(36)} ${'iddia turu'.padEnd(16)}` + NESIL.map((n) => n.padStart(11)).join(''));
for (const s of SINIF)
  console.log(`${s[0].padEnd(36)} ${s[1].padEnd(16)}` +
    NESIL.map((n) => (kanitlar(n, s[1]) ? 'durur' : 'gecer').padStart(11)).join(''));
const durur = (n) => SINIF.filter((s) => kanitlar(n, s[1])).length;
console.log('\n' + `${'nesil'.padEnd(10)} ${'duran sinif'.padStart(11)}` +
  Object.keys(KALEM.uygulama).map((k) => k.padStart(22)).join(''));
for (const n of NESIL)
  console.log(`${n.padEnd(10)} ${`${durur(n)}/${SINIF.length}`.padStart(11)}` +
    Object.values(KALEM[n]).map((v) => String(v).padStart(22)).join(''));
console.log(`\ndurum kaydi = donemdeki eszamanli oturum (${OTURUM}); tablo dolarsa yeni oturum ya reddedilir ya kayitsiz gecer`);
console.log(`hicbir nesil ${SINIF.filter((s) => durduran(s) === '-').length} sinifi durdurmuyor: ${SINIF.filter((s) => durduran(s) === '-').map((s) => s[0]).join(', ')}`);
const [acik, sifre] = [say('uygulama'), say('uygulama', true)];
console.log(`\nucdan uca sifreli akis: ${SIFRELI.length}/8 sinif, ${SIFRELI_OTURUM} oturum`);
console.log(`uygulama farkindalikli nesil kanitladigi iddia  ${acik.kan} -> ${sifre.kan}  (sifreli akista yalniz sunucu adi gorunur)`);
console.log(`kanitsiz kabul edilen iddia                     ${acik.kanitsiz} -> ${sifre.kanitsiz}`);
console.log(`kaybi kapatmak: ${SIFRELI_OTURUM} oturumu sonlandirip yeniden kurmak, oturum basina 1 ek tur ve 2 ek anahtar kalemi`);
```

```
sahte iddia sinifi                   iddia turu            paket      durum   uygulama
kaynak adresi baska bolgeden         kaynak-adres          durur      durur      durur
kurulmus oturum gibi gorunen paket   yon-baslangici        gecer      durur      durur
izinli kapida baska protokol         hedef-hizmet          gecer      gecer      durur
izinli akista baska sunucu adi       sunucu-adi            gecer      gecer      durur
istekte tasinan ozne basligi         ozne-kimligi          gecer      gecer      gecer

nesil      duran sinif          kural satiri           durum kaydi          akis tamponu  protokol cozumleyici
paket              1/5                    34                     0                     0                     0
durum              2/5                    34                 94112                     0                     0
uygulama           4/5                    34                 94112                 94112                     6

durum kaydi = donemdeki eszamanli oturum (94112); tablo dolarsa yeni oturum ya reddedilir ya kayitsiz gecer
hicbir nesil 1 sinifi durdurmuyor: istekte tasinan ozne basligi

ucdan uca sifreli akis: 5/8 sinif, 44002 oturum
uygulama farkindalikli nesil kanitladigi iddia  45 -> 39  (sifreli akista yalniz sunucu adi gorunur)
kanitsiz kabul edilen iddia                     3 -> 9
kaybi kapatmak: 44002 oturumu sonlandirip yeniden kurmak, oturum basina 1 ek tur ve 2 ek anahtar kalemi
```

Üst tablo beş sahte iddia sınıfını aynı üç kutuya veriyor. Kural satırı üç nesilde de otuz dörttür;
duran sınıf sayısı birden dörde çıkıyor. Aradaki fark yazılan kuralda değil, kutunun elindeki
karşılıktadır. İkinci tablo o karşılığın adını koyuyor: durum bilgili nesil doksan dört bin kayıtlık
bir tablo tutmak zorundadır ve o tabloyu tutmasa yön başlangıcı iddiasını sınayamaz. Uygulama
farkındalıklı nesil aynı tabloya ek olarak her oturum için bir akış tamponu ve altı protokol
çözümleyicisi taşır. Bir sınıf daha durdurmanın bedeli, bakılan kalemin sıfırdan doksan dört bine,
oradan iki katına çıkmasıdır.

Sıralamanın bir yönü daha var. Beş sınıfın ilki üç nesilde de duruyor ve bunu durduran şey en ucuz
neslin en ucuz denetimidir: paketin geldiği yön ile taşıdığı kaynak adresinin uyuşup uyuşmadığı.
Bakılan kalem sıfırdır, çünkü karşılık zaten yönlendirme kararının içindedir. Nesli yükseltmek bu
denetimi güçlendirmez; yalnız arkasına yenilerini ekler. Pahalı olan nesil, ucuz denetimi yapmayı
unutan bir düzende de aynı sınıfı geçirir.

Durum tablosunun kendisi yeni bir kalemdir ve dolabilir. Doluluk anında iki seçenek vardır: yeni
oturumu reddetmek — meşru trafiği kesmek — ya da kayıtsız geçirmek, yani o oturum için yön
başlangıcı iddiasını yeniden kanıtsız kabul etmek. Durum tutan bir kutunun kapasitesi bu yüzden
bir başarım kalemi değil, bir güvenlik kalemidir.

Alt blok savunmanın yetmediği yeri veriyor. Sekiz akış sınıfının beşi uçtan uca şifrelidir ve
bunlarda kutunun dışarıdan görebildiği tek uygulama iddiası sunucu adıdır. Kanıtlanan iddia kırk
beşten otuz dokuza, kanıtsız kabul edilen üçten dokuza gidiyor. Uygulama farkındalığı yalnız
akışın açık olduğu yerde çalışır. Kaybı geri almanın tek yolu bağlantıyı kutuda sonlandırıp arkaya
yeniden kurmaktır: kırk dört bin oturumun her biri için bir ek tur, iki ek anahtar kalemi ve
akışın açık hâlde görüldüğü yeni bir nokta. Kanıtlanan iddia sayısını yükselten hamle, ağa daha
önce olmayan bir yoğunlaşma noktası ekliyor.

#### Özet

- Sekiz akış sınıfı 48 iddia taşıyor. Paket filtreleyen kutu her sınıfta aynı 3 alanı görüyor ve
  yalnız 1'ini kanıtlıyor; toplamda 40 iddia kanıtsız kabul ediliyor.
- Durum bilgili nesil kanıtsız kabul edilen iddiayı 24'e indiriyor ve kazancının tamamı oturum
  tablosundan geliyor: paketin kendi söylediği yön başlangıcı yerine kutunun kendi kaydına bakıyor.
- Uygulama farkındalıklı nesil 48 iddianın 45'ini kanıtlıyor. Kalan 3'ü aynı türdendir: istekte
  taşınan özne kimliğini hiçbir nesil kanıtlayamıyor, çünkü ağ katmanında sınayacak karşılık yoktur.
- Bedel bakılan kalemdir: kural satırı üç nesilde de 34 kalırken durum kaydı 0'dan 94.112'ye, akış
  tamponu 0'dan 94.112'ye çıkıyor ve 6 protokol çözümleyicisi ekleniyor. Tablo dolduğunda seçenek
  meşru oturumu reddetmek ya da kanıtsız geçirmektir.
- 8 akış sınıfının 5'i uçtan uca şifreli; bu 44.002 oturumda kanıtlanan iddia 45'ten 39'a iniyor.
  Geri almanın yolu bağlantıyı sonlandırmaktır: oturum başına 1 ek tur, 2 ek anahtar kalemi ve
  akışın açık göründüğü yeni bir nokta.

#### Sonraki Adım

Bu dersin bütün ölçümü tek bir sınırda duran tek bir kutu varsaydı ve o kutunun kanıtlayamadığı
her iddia arkasındaki ağın tamamına girdi. Sekiz akış sınıfı da aynı düzlükte duruyordu: sayaç
toplayıcısına ulaşan bir mesaj, faturalama arayüzüne de aynı hamleyle ulaşabiliyordu. Sonraki
dersin sorusu kutunun ne gördüğü değil, ağın kaç parçaya ayrıldığıdır: bölgeler arasına sınır
konulduğunda bir bölge düştüğünde kaç bölgeye ulaşılıyor, kaç yol kapanıyor, silahtan arındırılmış
bölge dışarıya bakan kalemleri hangi tarafta bırakıyor ve bölgeler arasındaki meşru trafiğin
sürmesi kaç kural satırı istiyor.

### Ağ Bölütleme ve Silahtan Arındırılmış Bölge

Source: https://academia.sh/tr/kurslar/ag-guvenligi/ag-bolutleme-ve-dmz

Sekiz bölgelik bir grafikte dört yerleşim koşturulur: düz ağ, yalnız çevre denetimi, silahtan arındırılmış bölge olmadan bölütleme ve tam bölütleme; her birinde açık yol sayısı, dış bölgeden ilk atlamada ve geçişli olarak erişilen kalem, bir bölge düştüğünde ulaşılan bölge ve kural yazımında gözden kaçan meşru akış sayılır.

Önceki ders sınırda duran kutunun ne görebildiğini saydı ve kanıtlanmayan her iddianın arkadaki
ağa girdiğini varsaydı. Varsayımın kendisi bu dersin konusudur: "arkadaki ağ" tek bir şey miydi?
Sekiz akış sınıfı da aynı düzlükte duruyordu; sayaç toplayıcısına ulaşan bir mesaj, faturalama
arayüzüne de aynı hamleyle ulaşabiliyordu. Bölütleme kutunun kanıtladığı iddia sayısını
değiştirmez; **iddianın sunulabileceği yolun sayısını** değiştirir.

Ölçülen üç şey var. Bölge grafiğinde kaç yönlü çift açık, bir bölge düştüğünde kaçına ulaşılıyor
ve bölgeler arası meşru trafiğin sürmesi kaç kural satırı istiyor. Bulut ağı ölçeğinde adres planı
ve alt ağ aritmetiği başka bir kursta ölçüldü; buradaki eksen adres değil, bölge grafiğinin
kendisidir.

- **CS7.** Sekiz bölge, kalem sayıları ve kural listesi kurgusal bölgesel ölçüm ağına aittir.
  Gerçek trafik akmıyor; ölçülen şey `node` ile kurulan grafik modelidir.
- **CS8.** Bölge içinde kısıt yok sayıldı: bir bölgedeki kaleme ulaşan, o bölgenin bütün
  kalemlerine ulaşır. Gerçekte bölge içi denetim de yazılabilir; kalem sayısını düşürür,
  bölgeler arası ölçümün yönünü değiştirmez.
- **CS9.** Dış bölge varış noktası sayıldı, geçiş noktası sayılmadı. İç bir bölgeden dışarıya
  çıkmak, dış bölgenin ulaşabildiği her yere ulaşmak anlamına gelmiyor.
- **CS10.** Kural satırı yönlü bölge çifti düzeyinde sayıldı. Gerçekte her satır kapı ve protokol
  de belirtir; satır sayısını büyütür, karşılaştırmanın yönünü değiştirmez.
- **CS11.** "Bölge düştü" ifadesi yalnız o bölgedeki bir kalemin denetim dışına çıktığı durumu
  adlandırıyor. Nasıl çıktığı modellenmedi ve yazılmadı.
- **CS12.** Kural yazımında gözden kaçan iki meşru akış modele elle konuldu. Gerçekte bu sayı
  gözlem süresine ve akışın seyrekliğine bağlıdır.

#### Bölge Grafiği ve Dört Yerleşim

Model bölgeleri düğüm, izin verilen yönlü çiftleri kenar olarak tutuyor. Dört yerleşim aynı işi
görüyor ve yalnız iki eksende ayrılıyor: iç bölgeler arasında sınır var mı ve dışa bakan kalemler
ayrı bir bölgede mi duruyor. Dışa bakan kalemler ayrı durduğunda o bölge silahtan arındırılmış
bölgedir; durmadığında aynı kalemler uygulama bölgesinin içine yerleşir.

```js
// bolge.mjs — bolge grafigi, kalem sayilari ve dort yerlesim; model, gercek ag degil
const ORTAK = { dis: 0, sube: 120, saha: 60, veri: 6, yonetim: 5, yedek: 3 };
export const KALEM = {                       // genel arayuz kalemleri ayri bolgede mi, uygulamayla ayni bolgede mi
  ayri: { ...ORTAK, dmz: 4, uygulama: 12 },
  icinde: { ...ORTAK, uygulama: 16 },
};
// Kural yazilan mesru akislar: varsayilan reddet altinda izin verilen yonlu bolge cifti
export const MESRU = [
  ['dis', 'dmz'], ['dmz', 'uygulama'], ['saha', 'dmz'], ['sube', 'dmz'], ['sube', 'uygulama'],
  ['uygulama', 'veri'], ['uygulama', 'dis'], ['veri', 'yedek'], ['yedek', 'dis'],
  ...['dmz', 'sube', 'saha', 'uygulama', 'veri', 'yedek'].map((b) => ['yonetim', b]),
];
// Kural yaziminda gozden kacan iki mesru akis: ceyrek sonu mutabakati ve sube arsivi
export const KACAN = [['saha', 'veri'], ['sube', 'yedek']];
const tek = (l) => [...new Set(l.map((e) => e.join('>')))].map((s) => s.split('>'));
const katla = (l) => tek(l.map(([a, b]) => [a === 'dmz' ? 'uygulama' : a, b === 'dmz' ? 'uygulama' : b]))
  .filter(([a, b]) => a !== b);
const duzKenar = (bl) => {                   // ic bolgeler arasi kisit yok, giden yon serbest
  const ic = bl.filter((b) => b !== 'dis');
  return [...ic.flatMap((x) => ic.filter((y) => y !== x).map((y) => [x, y])), ...ic.map((b) => [b, 'dis'])];
};
const B8 = ['dis', 'dmz', 'sube', 'saha', 'uygulama', 'veri', 'yedek', 'yonetim'];
const B7 = B8.filter((b) => b !== 'dmz');
export const YERLESIM = {                    // [bolgeler, kenar, yazilmis kural, kalem haritasi]
  duz: [B7, [...duzKenar(B7), ['dis', 'uygulama']], 0, 'icinde'],
  cevre: [B8, [...duzKenar(B8), ['dis', 'dmz']], 1, 'ayri'],
  dmzsiz: [B7, katla(MESRU), katla(MESRU).length, 'icinde'],
  bolutlu: [B8, MESRU, MESRU.length, 'ayri'],
};
export function ulasilan(kenar, bas) {       // gecisli erisim; dis bolge varis noktasidir, gecis noktasi degil
  const gor = new Set(), kuyruk = [bas];
  while (kuyruk.length) {
    const b = kuyruk.shift();
    if (b === 'dis' && bas !== 'dis') continue;
    for (const [x, y] of kenar) if (x === b && !gor.has(y)) { gor.add(y); kuyruk.push(y); }
  }
  gor.delete(bas);
  return gor;
}
export function mesafe(kenar, bas, hedef) {  // hedefe varmak icin kac bolge siniri geciliyor
  let kat = new Set([bas]), n = 0; const gor = new Set([bas]);
  while (kat.size) {
    n++;
    const yeni = new Set();
    for (const [x, y] of kenar) if (kat.has(x) && !gor.has(y)) { gor.add(y); yeni.add(y); }
    if (yeni.has(hedef)) return n;
    kat = yeni;
  }
  return '-';
}
export const yol = (bl, kenar) => bl.reduce((a, b) => a + ulasilan(kenar, b).size, 0);
export const kalemi = (kume, h) => [...kume].reduce((a, b) => a + (KALEM[h][b] ?? 0), 0);
export const ilk = (kenar, bas) => new Set(kenar.filter(([x]) => x === bas).map(([, y]) => y));
export const dogrudan = (kenar, [a, b]) => kenar.some(([x, y]) => x === a && y === b);
```

İki ölçü işlevi grafiğin üzerinde yürüyor. Geçişli erişim, bir bölgeden başlayıp kenarları izleyerek
ulaşılan bütün bölgeleri topluyor; mesafe işlevi aynı yürüyüşü katman katman yapıp hedefe kaç
sınırda varıldığını veriyor. Kalem sayıları iki haritadan okunuyor, çünkü dışa bakan dört kalem
ya kendi bölgesinde ya uygulama bölgesinin içinde duruyor ve toplam iki yüz on kalem her iki
durumda da aynı kalıyor. Yer değiştiren şey kalem sayısı değil, kalemin hangi sınırın arkasında
olduğudur.

#### Dört Yerleşimin Açtığı Yol

```js
// kosum1.mjs — dort yerlesimde acik yol, dis bolgeden erisilen kalem ve kesilen mesru akis
import { YERLESIM, MESRU, KACAN, ulasilan, mesafe, yol, kalemi, ilk, dogrudan } from './bolge.mjs';

console.log(`kural yazilan mesru akis ${MESRU.length}, kural yaziminda gozden kacan ${KACAN.length}\n`);
console.log(`${'yerlesim'.padEnd(9)} ${'bolge'.padStart(5)} ${'kural'.padStart(5)} ${'acik/tum yol'.padStart(12)} ` +
  `${'ilk atlama kalem'.padStart(16)} ${'gecisli kalem'.padStart(13)} ${'veriye sinir'.padStart(12)} ${'kesilen mesru'.padStart(13)}`);
for (const [ad, [bl, kenar, kural, h]] of Object.entries(YERLESIM)) {
  const tum = bl.length * (bl.length - 1);
  console.log(`${ad.padEnd(9)} ${String(bl.length).padStart(5)} ${String(kural).padStart(5)} ` +
    `${`${yol(bl, kenar)}/${tum}`.padStart(12)} ${String(kalemi(ilk(kenar, 'dis'), h)).padStart(16)} ` +
    `${String(kalemi(ulasilan(kenar, 'dis'), h)).padStart(13)} ${String(mesafe(kenar, 'dis', 'veri')).padStart(12)} ` +
    `${String(KACAN.filter((m) => !dogrudan(kenar, m)).length).padStart(13)}`);
}
console.log('\ndis bolgeden ulasilan bolgeler:');
for (const [ad, [, kenar]] of Object.entries(YERLESIM))
  console.log(`  ${ad.padEnd(9)} ${[...ulasilan(kenar, 'dis')].join(', ')}`);
const kes = KACAN.filter((m) => !dogrudan(YERLESIM.bolutlu[1], m));
console.log(`\nbolutlu yerlesimde kesilen mesru akis: ${kes.map(([a, b]) => `${a} -> ${b}`).join(', ')}`);
```

```
kural yazilan mesru akis 15, kural yaziminda gozden kacan 2

yerlesim  bolge kural acik/tum yol ilk atlama kalem gecisli kalem veriye sinir kesilen mesru
duz           7     0        42/42               16           210            2             0
cevre         8     1        56/56                4           210            2             0
dmzsiz        7    12        23/42               16            25            2             2
bolutlu       8    15        31/56                4            25            3             2

dis bolgeden ulasilan bolgeler:
  duz       uygulama, sube, saha, veri, yedek, yonetim
  cevre     dmz, sube, saha, uygulama, veri, yedek, yonetim
  dmzsiz    uygulama, veri, yedek
  bolutlu   dmz, uygulama, veri, yedek

bolutlu yerlesimde kesilen mesru akis: saha -> veri, sube -> yedek
```

İkinci satır bu dersin en pahalı yanılgısını sayıyor. Çevre yerleşiminde dışa bakan kalemler ayrı
bir bölgeye taşındı, dışarıdan yalnız o bölgeye izin veren tek bir kural yazıldı ve dış bölgenin
ilk atlamada eriştiği kalem on altıdan dörde indi. Buna karşılık geçişli kalem iki yüz onda kaldı
ve açık yol elli altıda tam. İç bölgeler arasında hiçbir sınır olmadığı için, dışa bakan dört
kalemden birine ulaşan taraf altı iç bölgenin tamamına ulaşıyor. Silahtan arındırılmış bölge tek
başına bir bölge değil, bir ilk atlamadır; arkasında sınır yoksa yalnız ilk adımı geciktirir.

Üçüncü ve dördüncü satırlar aynı bölütlemeyi iki ayrı yerleşimde gösteriyor. İkisi de geçişli
kalemi iki yüz ondan yirmi beşe indiriyor; fark ilk atlamadadır. Dışa bakan kalemler uygulama
bölgesinin içinde bırakıldığında dış bölgeden gelen bağlantı doğrudan on altı kalemin yanına
iniyor ve bölge içinde sınır olmadığı için hepsine ulaşıyor. Ayrı bölgeye taşındığında bu sayı
dörde iniyor ve veri bölgesine varmak için geçilmesi gereken sınır sayısı ikiden üçe çıkıyor. Ayrı
bölgenin bütün kazancı bu iki sayıdır: on iki kalem ve bir sınır.

Kural sütunu bedeli veriyor. Düz yerleşimde hiç kural yok; bölütlü yerleşim on beş satır istiyor
ve bu on beş satır bölge çiftinden ibaret, kapı ve protokol eklendiğinde her satır birkaç satıra
bölünür. Sağdaki sütun daha sinsi bir bedeli veriyor: bölütleme iki meşru akışı kesiyor. Çeyrek
sonu mutabakatı saha bölgesinden veri bölgesine, şube arşivi şube bölgesinden yedek bölgesine
gidiyordu; ikisi de kural yazılırken kimsenin aklına gelmedi, çünkü ikisi de seyrek çalışıyor. Düz
ağda bu akışlar hiç kural istemediği için hiç görünmemişti.

Açık yol sütununda bir ters okuma tuzağı var. Bölütlü yerleşim otuz bir açık yol gösteriyor,
silahtan arındırılmış bölgesi olmayan yerleşim yirmi üç; sayıya bakılırsa ikincisi daha dar
görünüyor. Fark bölge sayısındandır: sekiz bölgeli grafikte elli altı, yedi bölgeli grafikte kırk
iki yönlü çift vardır. Bölge eklemek çift sayısını büyütür. Yol sayısı bu yüzden tek başına
karşılaştırılamaz; karşılaştırılabilen şey yolun indiği kalemdir ve o sütun iki yerleşimde de
yirmi beştir.

#### Bölge Düştüğünde

```js
// kosum2.mjs — bir bolge dustugunde ulasilan bolge ve kalem; duz ile bolutlu yerlesim yan yana
import { YERLESIM, ulasilan, kalemi } from './bolge.mjs';

const [B, DUZ] = [YERLESIM.duz[0], YERLESIM.duz[1]];
const BOL = YERLESIM.bolutlu[1];
const ic = (k) => [...k].filter((b) => b !== 'dis');
console.log(`${'dusen bolge'.padEnd(11)} ${'duz bolge'.padStart(9)} ${'duz kalem'.padStart(9)} ` +
  `${'bolutlu bolge'.padStart(13)} ${'bolutlu kalem'.padStart(13)}  bolutlu yerlesimde ulasilan`);
let [td, tb] = [0, 0];
for (const b of B.filter((x) => x !== 'dis')) {
  const [d, s] = [ic(ulasilan(DUZ, b)), ic(ulasilan(BOL, b))];
  td += d.length; tb += s.length;
  console.log(`${b.padEnd(11)} ${String(d.length).padStart(9)} ${String(kalemi(d, 'icinde')).padStart(9)} ` +
    `${String(s.length).padStart(13)} ${String(kalemi(s, 'ayri')).padStart(13)}  ${s.join(', ') || '-'}`);
}
console.log(`\nulasilan bolge toplami   duz ${td}   bolutlu ${tb}   kapanan ${td - tb} (%${Math.round((td - tb) * 100 / td)})`);
const d = ic(ulasilan(BOL, 'dmz')), y = ic(ulasilan(BOL, 'yonetim'));
console.log(`dmz dustugunde       ${d.length} bolge, ${kalemi(d, 'ayri')} kalem  (${d.join(', ')})`);
console.log(`yonetim dustugunde   ${y.length} bolge, ${kalemi(y, 'ayri')} kalem  — ${BOL.filter(([a]) => a === 'yonetim').length} dogrudan kural`);
console.log(`bolutlemenin kapattigi yol ${td - tb}; kapatamadigi bolge 1`);
```

```
dusen bolge duz bolge duz kalem bolutlu bolge bolutlu kalem  bolutlu yerlesimde ulasilan
sube                5        90             4            25  dmz, uygulama, veri, yedek
saha                5       150             4            25  dmz, uygulama, veri, yedek
uygulama            5       194             2             9  veri, yedek
veri                5       204             1             3  yedek
yedek               5       207             0             0  -
yonetim             5       205             6           205  dmz, sube, saha, uygulama, veri, yedek

ulasilan bolge toplami   duz 30   bolutlu 17   kapanan 13 (%43)
dmz dustugunde       3 bolge, 21 kalem  (uygulama, veri, yedek)
yonetim dustugunde   6 bolge, 205 kalem  — 6 dogrudan kural
bolutlemenin kapattigi yol 13; kapatamadigi bolge 1
```

Düz sütunda her satır aynı sayıyı veriyor: beş bölge. Hangi bölgenin düştüğü değişmiyor, sonuç
değişmiyor; ikinci sütundaki kalem farkı yalnız düşen bölgenin kendi kalemlerinin dışarıda
bırakılmasından geliyor. Bölütlü sütunda satırlar birbirinden ayrışıyor ve ayrışmanın yönü kural
listesinin yönüdür. Yedek bölgesi düştüğünde hiçbir bölgeye ulaşılmıyor, çünkü o bölgeden çıkan
tek kural dışarıya bakıyor. Veri bölgesi düştüğünde yalnız yedek bölgesine ulaşılıyor. Akışın
yönü aşağı doğru olduğu için zincirin altındaki bölgeler yukarı çıkamıyor.

Şube ve saha bölgeleri en kalabalık kalem kümesini taşıyor — yüz yirmi ve altmış kalem — ve düşen
bölge onlar olduğunda ulaşılan kalem yirmi beşte kalıyor. Düz yerleşimde aynı iki satır doksan ve
yüz elli veriyordu. Kapanan yolun toplamı otuz üzerinden on üç; bölütleme bölge çiftlerinin
yaklaşık yarısını kapatıyor, tamamını değil.

Kesilen iki meşru akışın bu tabloda bir karşılığı var. Saha bölgesinden veri bölgesine giden
mutabakat akışı için bir kural yazılırsa satır sayısı on altıya çıkar ve saha bölgesi veri
bölgesine üç sınır yerine tek sınırdan ulaşır. Ulaşılan kalem yirmi beşte kalır — veri bölgesi
zaten zincirin ucundaydı — ama yol kısalır; akış meşru olduğu için de yazılır. Bölütlemenin ölçüsü
bu yüzden kurulduğu gün alınan sayı değildir. Her yeni meşru akış bir satır ekler, her satır bir
yol açar ve satırlar tek yönde birikir — akış durduğunda kuralı silmek için kimseye bir uyarı
gitmez.

Son satırlar bölütlemenin kapatamadığı bölgeyi adlandırıyor. Yönetim bölgesi altı bölgeye
doğrudan yazılmış durumda ve düştüğünde iki yüz beş kaleme ulaşılıyor — bölütlü yerleşimde bile
düz ağdakiyle aynı sayı. Bunun nedeni bir eksiklik değil, işin kendisidir: yönetim bölgesi
yapılandırma dağıtmak ve arıza gidermek için her bölgeye erişmek zorundadır. Bölütleme bu bölgede
hiçbir yol kapatmıyor. Silahtan arındırılmış bölge düştüğünde ulaşılan yirmi bir kalem de aynı
sınıftandır: dışa bakan bölge tanımı gereği içeriye bir kural taşır, o kural olmasa bölge hiçbir
işe yaramaz. Bölütlemenin kapattığı yol sayılabilir; kapatamadığı bölge de sayılabilir ve bir
tanedir.

#### Özet

- Yalnız çevre denetimi dış bölgenin ilk atlamada eriştiği kalemi 16'dan 4'e indiriyor ama geçişli
  kalem 210'da kalıyor: iç bölgeler arasında sınır yoksa dışa bakan tek kaleme ulaşan taraf 6 iç
  bölgenin tamamına ulaşıyor.
- Bölütleme geçişli kalemi 210'dan 25'e indiriyor. Dışa bakan kalemleri ayrı bölgeye taşımanın
  kazancı bunun üstüne 2 sayıdır: ilk atlamada erişilen kalem 16'dan 4'e, veri bölgesine giden
  sınır sayısı 2'den 3'e gidiyor.
- Bedeli 15 kural satırı ve 2 kesilen meşru akıştır. Kesilen ikisi de seyrek çalışan işlerdir
  (çeyrek sonu mutabakatı, şube arşivi); düz ağda hiç kural istemedikleri için hiç görünmemişlerdi.
- Bir bölge düştüğünde ulaşılan bölge toplamı düz yerleşimde 30, bölütlü yerleşimde 17: kapanan yol
  13. Şube bölgesi düştüğünde ulaşılan kalem 90'dan 25'e iniyor.
- Bölütlemenin kapatamadığı bölge yönetim bölgesidir: 6 bölgeye doğrudan yazılmıştır ve düştüğünde
  205 kaleme ulaşılıyor — bölütlü yerleşimde de düz yerleşimdeki sayının aynısı.

#### Sonraki Adım

Yönetim bölgesi satırı çözülmemiş bir kalem bırakıyor: altı bölgeye doğrudan yazılan bir bölge,
bölütlemenin hiçbir yol kapatmadığı tek yerdir. Sonraki dersin sorusu bu bölgeyi kaldırmak değil,
oradan çıkan bağlantıları tek bir noktadan geçirmenin ne kazandırdığıdır. Bir denetim noktası
konulduğunda kaç bağlantı o noktadan geçiyor, o noktanın kaydettiği ve kanıtladığı iddia sayısı ne
oluyor, nokta düştüğünde kaç yol birden kesiliyor ve en önemlisi — kaç yol o noktayı hiç
kullanmadan hedefe varıyor.

### Vekil Sunucular ve Sıçrama Sunucusu

Source: https://academia.sh/tr/kurslar/ag-guvenligi/vekil-sunucular-ve-sicrama-sunucusu

On bağlantı sınıfı dört yerleşimde koşturulur: denetim noktası kurulunca dönemin kaç bağlantısı tek noktadan geçiyor, kaçı noktayı atlıyor, atlama yolları kural değişikliğiyle kapatılınca kaç sınıf kalıyor, noktanın kendi yükü ve düşmesinin kestiği yol ne kadar, hangi iddia noktada kanıtlanabilir hâle geliyor.

Önceki ders yönetim bölgesini çözülmemiş bir kalem olarak bıraktı: altı bölgeye doğrudan yazılmış,
bölütlemenin hiçbir yol kapatmadığı tek bölge. Bu dersin hamlesi o bölgeyi kaldırmak değil,
oradan çıkan bağlantıları tek bir noktadan geçirmektir. Aynı hamlenin ters yönü de var: içeriden
dışarıya giden bağlantılar da tek bir noktaya toplanabilir.

İkisi ayrı şeyler yapar. İçeriden dışarıya çıkanı toplayan nokta ileri vekildir; dışarıdan ya da
yönetim bölgesinden içeriye girenleri toplayan nokta sıçrama sunucusudur. Ortak yanları
ölçülebilir: her ikisi de bir bağlantıyı ikiye böler, ortada bir kayıt bırakır ve kendisi yeni bir
kalem olur. Ters vekilin yapılandırması ve uygulamaya iletirken kaybettiği bilgi başka bir kursta
ölçüldü; buradaki eksen tek bir soru üzerindedir — kaç bağlantı gerçekten o noktadan geçiyor.

- **CS13.** On bağlantı sınıfı ve dönem sayıları kurgusal bölgesel ölçüm ağına aittir. Gerçek
  bağlantı kurulmuyor; ölçülen şey `node` ile kurulan modeldir.
- **CS14.** Atlama nedenleri elle yazıldı ve ikisi kural değişikliğiyle kapatılamaz işaretlendi.
  Gerçekte hangi atlamanın kapatılabildiği ağın fiziksel düzenine bağlıdır.
- **CS15.** Nokta yükü, geçen bağlantının iki katı sayıldı: nokta ön ve arka olmak üzere iki
  bağlantı taşır. Eşzamanlılık ve süre modellenmedi.
- **CS16.** Noktanın kanıtladığı iddia, önceki derslerin iddia listesinden alındı. Kanıtın neye
  dayandığı bu kursun dışındadır.
- **CS17.** Sıçrama sunucusunun eriştiği bölge sayısı, önceki dersteki yönetim bölgesi kural
  sayısından okundu.

#### Bağlantı Sınıfları ve Yerleşimler

Model her bağlantı sınıfı için dört şey tutuyor: kaynağı, dönemdeki bağlantı sayısı, doğal olarak
hangi denetim noktasına ait olduğu ve varsa noktayı atlama nedeni. Atlama nedeninin boş olmaması
o sınıfın nokta kurulsa bile hedefe başka bir yoldan vardığı demektir.

```js
// nokta.mjs — baglanti siniflari ve denetim noktasi yerlesimleri; model, gercek baglanti degil
// [ad, kaynak, hedef, donem baglantisi, dogal denetim noktasi, atlama nedeni ('' ise atlamiyor)]
export const BAGLANTI = [
  ['sube -> dis arayuz', 'sube', 'dis', 184000, 'vekil', ''],
  ['uygulama -> paket deposu', 'uygulama', 'dis', 90, 'vekil', ''],
  ['uygulama -> dis olcum servisi', 'uygulama', 'dis', 26400, 'vekil', ''],
  ['saha terminali -> dis harita', 'saha', 'dis', 5100, 'vekil', 'ucler hucresel baglantidan cikiyor'],
  ['yedek -> dis depo', 'yedek', 'dis', 12, 'vekil', 'aktarim hacmi icin dogrudan yazildi'],
  ['her makine -> zaman kaynagi', 'hepsi', 'dis', 43200, 'vekil', 'vekil bu protokolu tasimiyor'],
  ['yonetim -> makine kabugu', 'yonetim', 'ic', 372, 'sicrama', ''],
  ['yonetim -> yonetim arayuzu', 'yonetim', 'ic', 860, 'sicrama', ''],
  ['dagitim otomasyonu -> kabuk', 'yonetim', 'ic', 1860, 'sicrama', 'otomasyon kendi anahtariyla dogrudan baglaniyor'],
  ['sube -> kabuk (acil yol)', 'sube', 'ic', 26, 'sicrama', 'acil durum kurali kaldirilmadi'],
];
export const YERLESIM = {                    // hangi denetim noktasi kurulu ve atlama yollari kapali mi
  yok: { nokta: [], kapali: false },
  sicrama: { nokta: ['sicrama'], kapali: false },
  ikisi: { nokta: ['vekil', 'sicrama'], kapali: false },
  'ikisi+kapali': { nokta: ['vekil', 'sicrama'], kapali: true },
};
// Kapatilamayan iki atlama: hucresel cikis ile tasinamayan protokol ag kuraliyla kapanmiyor
const KAPANMAZ = ['ucler hucresel baglantidan cikiyor', 'vekil bu protokolu tasimiyor'];
export const gecer = (b, y) => y.nokta.includes(b[4]) &&
  (b[5] === '' || (y.kapali && !KAPANMAZ.includes(b[5])));
export const atlar = (b, y) => y.nokta.includes(b[4]) && !gecer(b, y);
export const TOPLAM = BAGLANTI.reduce((a, b) => a + b[3], 0);
export const topla = (l) => l.reduce((a, b) => a + b[3], 0);
// Denetim noktasi baglantiyi kayda geciriyor ve ozneyi kendi dogruluyor
export const KANITLANAN = ['ozne-kimligi', 'istek-yolu'];
export const NOKTA_ERISIMI = { vekil: 1, sicrama: 6 };   // noktanin dogrudan erisebildigi bolge sayisi
```

Dört yerleşim iki eksende ayrılıyor: hangi noktalar kurulu ve atlama yolları kural değişikliğiyle
kapatıldı mı. Kapatma her atlamayı çözmüyor; iki neden kapatılamaz olarak işaretlendi. Saha uçları
kurumun ağına hiç girmeden hücresel bağlantı üzerinden dışarıya çıkıyor, dolayısıyla ağ üzerinde
yazılacak bir kuralın onlara ulaşacağı bir nokta yok. Zaman kaynağı sorgusu ise vekilin taşıyabildiği
bir protokol değil; kural yazılsa bağlantı kurulmaz, iş durur. Bu iki neden bir eksiklik değil, ölçüm
girdisidir.

#### Kaç Bağlantı Gerçekten Geçiyor

```js
// kosum1.mjs — dort yerlesimde noktadan gecen, atlayan ve hic denetlenmeyen baglanti
import { BAGLANTI, YERLESIM, TOPLAM, topla, gecer, atlar } from './nokta.mjs';

console.log(`on baglanti sinifi, donemde ${TOPLAM} baglanti\n`);
const yuzde = (n) => `%${(n * 100 / TOPLAM).toFixed(1)}`;
console.log(`${'yerlesim'.padEnd(13)} ${'gecen sinif'.padStart(11)} ${'gecen baglanti'.padStart(14)} ${'pay'.padStart(6)} ` +
  `${'atlayan sinif'.padStart(13)} ${'atlayan baglanti'.padStart(16)} ${'denetimsiz'.padStart(10)}`);
for (const [ad, y] of Object.entries(YERLESIM)) {
  const g = BAGLANTI.filter((b) => gecer(b, y)), a = BAGLANTI.filter((b) => atlar(b, y));
  const d = BAGLANTI.filter((b) => !gecer(b, y));
  console.log(`${ad.padEnd(13)} ${String(g.length).padStart(11)} ${String(topla(g)).padStart(14)} ${yuzde(topla(g)).padStart(6)} ` +
    `${String(a.length).padStart(13)} ${String(topla(a)).padStart(16)} ${String(topla(d)).padStart(10)}`);
}
const son = YERLESIM['ikisi+kapali'];
console.log('\niki nokta kurulu ve atlama yollari kapatilmisken hala atlayan siniflar:');
for (const b of BAGLANTI.filter((x) => atlar(x, son)))
  console.log(`  ${b[0].padEnd(30)} ${String(b[3]).padStart(6)}  ${b[5]}`);
console.log('\nkapatma bir kural degisikligiyle cozdugu siniflar:');
for (const b of BAGLANTI.filter((x) => atlar(x, YERLESIM.ikisi) && gecer(x, son)))
  console.log(`  ${b[0].padEnd(30)} ${String(b[3]).padStart(6)}  ${b[5]}`);
```

```
on baglanti sinifi, donemde 261920 baglanti

yerlesim      gecen sinif gecen baglanti    pay atlayan sinif atlayan baglanti denetimsiz
yok                     0              0   %0.0             0                0     261920
sicrama                 2           1232   %0.5             2             1886     260688
ikisi                   5         211722  %80.8             5            50198      50198
ikisi+kapali            8         213620  %81.6             2            48300      48300

iki nokta kurulu ve atlama yollari kapatilmisken hala atlayan siniflar:
  saha terminali -> dis harita     5100  ucler hucresel baglantidan cikiyor
  her makine -> zaman kaynagi     43200  vekil bu protokolu tasimiyor

kapatma bir kural degisikligiyle cozdugu siniflar:
  yedek -> dis depo                  12  aktarim hacmi icin dogrudan yazildi
  dagitim otomasyonu -> kabuk      1860  otomasyon kendi anahtariyla dogrudan baglaniyor
  sube -> kabuk (acil yol)           26  acil durum kurali kaldirilmadi
```

İlk satır çıkış noktasıdır: hiçbir nokta kurulmadığında dönemin iki yüz altmış bir bin dokuz yüz
yirmi bağlantısının tamamı denetimsizdir. Bu satırda atlayan sınıf sıfır yazıyor, çünkü atlanacak
bir şey yok — denetim noktası olmayan bir ağda her yol doğrudan yoldur. Sonraki üç satırın hepsi
bu sayıdan ne kadarını geri aldığını gösteriyor.

İkinci satır tek başına kurulan sıçrama sunucusunun ölçüsüdür ve şaşırtıcıdır: dönemin binde
beşi geçiyor. Sınıf sayısına bakıldığında dördün ikisi geçiyor, hacme bakıldığında bin iki yüz
otuz iki bağlantı. Atlayan iki sınıfın biri dağıtım otomasyonudur ve tek başına bin sekiz yüz
altmış bağlantı taşır; sıçrama sunucusundan geçen bütün insan oturumlarından fazladır. Sıçrama
sunucusu kurulduğunda kimse yalan söylemiyor — yönetim ekibi gerçekten oradan geçiyor. Geçmeyen
şey otomasyondur ve otomasyon işin çoğunu yapar.

Üçüncü satır ileri vekili ekliyor ve pay yüzde seksen bire çıkıyor. Buradaki sıçrama, bir sınıfın
tek başına dönemin yüzde yetmişini taşımasındandır: şube ağının dışarıya çıkan bağlantısı. Yüzde
seksen bir kulağa yüksek geliyor; kalan yüzde on dokuz elli bin bağlantı demektir ve bunların
hiçbiri hiçbir yerde kaydedilmiyor.

Bu satırın bir başka okuması daha var. Sınıf sayısına göre onun beşi geçiyor, beşi atlıyor: yarı
yarıya. Hacme göre yüzde seksen bir geçiyor. İki oran aynı kümeden çıkıyor ve birbirini
yalanlamıyor; ölçünün hangi birimle alındığı sonucu belirliyor. Denetim kapsamı sınıf sayısıyla
raporlandığında düşük, hacimle raporlandığında yüksek görünür. Karar için ikisi de tek başına
yetmez: kapsamın dışında kalan sınıflardan biri seyrek çalışıp yönetim kabuğuna bağlanıyorsa,
hacimdeki payı küçüklüğü onu önemsiz yapmaz.

Dördüncü satır atlama yollarını kural değişikliğiyle kapatıyor ve pay yüzde seksen bir buçuğa
çıkıyor. Bütün emeğin karşılığı 0,8 puandır. Alttaki iki liste nedeni ayırıyor. Kapatılan üç
sınıfın hacmi bin dokuz yüz bağlantıdır ve ikisi tek satırlık düzeltmedir — aylar önce açılmış bir
acil durum kuralı, hacim gerekçesiyle doğrudan yazılmış bir yedek akışı. Kapatılamayan iki sınıf
kırk sekiz bin üç yüz bağlantı taşıyor ve ikisi de bir kural sorunu değildir: saha uçları ağın
üzerinden hiç geçmiyor, zaman kaynağı sorgusunu vekil taşıyamıyor. Denetim noktasının kapsamı,
noktanın kendisiyle değil, ağın fiziksel düzeniyle ve protokolün taşınabilirliğiyle sınırlıdır.

Atlayan sınıfların ortak bir özelliği daha var: hiçbiri bir yanlış yapılandırma değildir. Beşi de
bir gerekçeyle ve çoğu zaman yazılı bir onayla doğdu — aktarım hacmi, acil erişim ihtiyacı,
otomasyonun kendi kimlik bilgisi, uçların bulunduğu yer, protokolün taşınamaması. Denetim
noktasının kapsamı bu yüzden kurulum kararıyla belirlenmez; kurulumdan sonra biriken istisnalarla
belirlenir ve her istisnanın kendi gerekçesi olduğu için tek tek bakıldığında hiçbiri fazla
görünmez. Ölçülebilen tek şey toplamdır.

#### Noktanın Kendi Yükü

```js
// kosum2.mjs — noktanin kendi yuku, dusmesinin kestigi yol ve kanitlanir hale gelen iddia
import { BAGLANTI, YERLESIM, TOPLAM, topla, gecer, atlar, KANITLANAN, NOKTA_ERISIMI } from './nokta.mjs';

const son = YERLESIM['ikisi+kapali'];
console.log(`${'nokta'.padEnd(8)} ${'gecen sinif'.padStart(11)} ${'gecen baglanti'.padStart(14)} ${'nokta yuku'.padStart(10)} ` +
  `${'dusunce kesilen'.padStart(15)} ${'eristigi bolge'.padStart(14)}  kanitladigi iddia`);
for (const n of ['vekil', 'sicrama']) {
  const g = BAGLANTI.filter((b) => b[4] === n && gecer(b, son));
  console.log(`${n.padEnd(8)} ${String(g.length).padStart(11)} ${String(topla(g)).padStart(14)} ${String(topla(g) * 2).padStart(10)} ` +
    `${`${g.length} sinif`.padStart(15)} ${String(NOKTA_ERISIMI[n]).padStart(14)}  ${KANITLANAN[n === 'vekil' ? 1 : 0]}`);
}
const kayitli = BAGLANTI.filter((b) => gecer(b, son)), disi = BAGLANTI.filter((b) => !gecer(b, son));
console.log(`\n${'olcu'.padEnd(34)} ${'nokta yokken'.padStart(12)} ${'iki nokta kuruluyken'.padStart(20)}`);
for (const [ad, once, sonra] of [
  ['kayda gecen baglanti', 0, topla(kayitli)],
  ['kayitsiz baglanti', TOPLAM, topla(disi)],
  ['ozne kimligi kanitlanan baglanti', 0, topla(kayitli.filter((b) => b[4] === 'sicrama'))],
  ['yonetimin dogrudan eristigi bolge', 6, 1],
  ['tek dususle kesilen baglanti', 0, Math.max(...['vekil', 'sicrama'].map((n) => topla(BAGLANTI.filter((b) => b[4] === n && gecer(b, son)))))],
]) console.log(`${ad.padEnd(34)} ${String(once).padStart(12)} ${String(sonra).padStart(20)}`);
console.log(`\natlayan ${topla(BAGLANTI.filter((b) => atlar(b, son)))} baglantinin hicbiri kayda girmiyor; ` +
  `bu, donemin %${(topla(disi) * 100 / TOPLAM).toFixed(1)} payi`);
```

```
nokta    gecen sinif gecen baglanti nokta yuku dusunce kesilen eristigi bolge  kanitladigi iddia
vekil              4         210502     421004         4 sinif              1  istek-yolu
sicrama            4           3118       6236         4 sinif              6  ozne-kimligi

olcu                               nokta yokken iki nokta kuruluyken
kayda gecen baglanti                          0               213620
kayitsiz baglanti                        261920                48300
ozne kimligi kanitlanan baglanti              0                 3118
yonetimin dogrudan eristigi bolge             6                    1
tek dususle kesilen baglanti                  0               210502

atlayan 48300 baglantinin hicbiri kayda girmiyor; bu, donemin %18.4 payi
```

Üst tablo iki noktayı yan yana koyuyor ve ikisinin ölçüsü zıt yönlerde büyük. Vekil iki yüz on bin
bağlantı taşıyor ve dört yüz yirmi bir bin bağlantılık bir yük altındadır, ama eriştiği bölge
birdir: dış bölge. Sıçrama sunucusu üç bin bağlantı taşıyor, yükü altı bin iki yüz otuz altıdır ve
altı bölgeye erişir. Yük ile değer aynı yerde durmuyor. Bir önceki dersin yönetim bölgesi satırı
şimdi tek bir makineye indi; o makine düştüğünde dört sınıf kesilir, ele geçtiğinde altı bölgeye
ulaşılır. Yönetimin doğrudan eriştiği bölge altıdan bire indi — kazanç budur ve aynı hamle iki yüz
beş kalemi tek bir makinenin arkasına dizdi.

Kanıtlanan iddia sütunu önceki iki dersi kapatıyor. Güvenlik duvarının hiçbir nesli özne kimliğini
kanıtlayamıyordu; sıçrama sunucusu kanıtlıyor, çünkü oturumu kendisi açıyor ve özneyi kendi
doğruluyor. Karşılığında kanıtın kapsamı üç bin yüz on sekiz bağlantıdır. Dönemin geri kalanında
özne kimliği hâlâ kanıtsızdır.

Alt tablonun son iki satırı bedeli veriyor. Denetim noktası kurmadan önce kayıtsız bağlantı
sayısı iki yüz altmış bir bindi ve tek düşüşle kesilecek bağlantı sıfırdı; sonra kayıtsız kırk
sekiz bine indi ve tek düşüşle kesilecek bağlantı iki yüz on bine çıktı. İki sayı birlikte
okunmalıdır: denetim noktası bir görünürlük kazancı ile bir kullanılabilirlik borcunun aynı
hamlede alınmasıdır. İkinci bir nokta koymak borcu böler ama kanıtı da böler; artık iki makinede
iki ayrı kayıt ve iki ayrı yetkili küme vardır.

Noktanın kendisi de yeni bir yüzeydir ve iki ayrı biçimde. Birincisi kaleme dönüşmesidir: sıçrama
sunucusu altı bölgeye erişen bir makinedir ve bu erişimi kural olarak taşır; önceki dersteki
yönetim bölgesi satırı şimdi tek bir makinenin yetkili anahtar listesidir. İkincisi bağlantının
ikiye bölünmesidir. Nokta yükü sütunundaki dört yüz yirmi bir bin sayısı yalnız bir başarım kalemi
değil: her bağlantı için ortada, iki ucu da açık gören bir yer vardır. Şifreli akışın bu noktada
sonlandırılması ilk derste ölçülen kazancın koşuludur ve aynı hamle, akışın açık göründüğü tek
yeri de yaratır.

Kırk sekiz bin bağlantının kayda hiç girmemesi bu dersin kapanmayan kalemidir. Bunlar hatalı
yapılandırmadan değil, ağın kendisinden geçmemekten doğuyor. Denetim noktası ölçülürken sorulacak
soru "kuruldu mu" değil, "dönemin yüzde kaçı gerçekten geçti" olmalıdır; ilk sorunun cevabı her iki
yerleşimde de aynıdır.

Bu iki dersin kalemleri birlikte okunduğunda bir sıralama çıkıyor. Bölütleme yolu kapatır ve
kapattığı yol sayılabilir; denetim noktası yolu kapatmaz, tek bir yere toplar ve topladığı yerde
bir kayıt üretir. İkisi birbirinin yerine geçmez. Yönetim bölgesinin altı bölgeye yazılmış kuralı
bölütlemeyle kapanmıyordu; sıçrama sunucusu o kuralı kapatmıyor, tek bir makinenin arkasına
diziyor. Kapanan yol sayısı değişmedi, kanıtlanan iddia sayısı arttı ve yeni bir tek nokta doğdu.
Ölçüm üç sütunu birden yazmadıkça bu hamlenin iyi mi kötü mü olduğu söylenemez.

#### Özet

- Tek başına sıçrama sunucusu dönemin yalnız %0,5'ini geçiriyor: 4 sınıfın 2'si geçiyor, atlayan
  dağıtım otomasyonu tek başına 1.860 bağlantı taşıyor — bütün insan oturumlarından fazla.
- İleri vekil eklenince pay %80,8'e çıkıyor; kalan %19,2 elli bin bağlantıdır ve hiçbiri kayda
  girmiyor.
- Atlama yollarını kural değişikliğiyle kapatmak payı yalnız %81,6'ya taşıyor: kapatılan 3 sınıf
  1.898 bağlantı, kapatılamayan 2 sınıf 48.300 bağlantı. Kapatılamayanlar bir kural sorunu değil —
  saha uçları ağın üzerinden geçmiyor, zaman kaynağı sorgusunu vekil taşımıyor.
- Yük ile değer aynı yerde durmuyor: vekil 210.502 bağlantı taşıyıp 1 bölgeye erişiyor, sıçrama
  sunucusu 3.118 bağlantı taşıyıp 6 bölgeye erişiyor.
- Nokta özne kimliğini kanıtlanabilir kılıyor ama yalnız 3.118 bağlantı için. Bedeli iki sayıdır:
  yönetimin doğrudan eriştiği bölge 6'dan 1'e inerken tek düşüşle kesilecek bağlantı 0'dan
  210.502'ye çıkıyor.

#### Sonraki Adım

Bu dersin bütün kazancı bir kayıtta toplandı: iki yüz on üç bin bağlantı artık bir yere yazılıyor.
Yazılmak görmek değildir. Kayıt tutmak, kaydın içindeki bir bağlantının hangi sınıfa girdiğini
söylemez; dönemin iki yüz altmış bin satırında hangisinin bakılmaya değer olduğu hâlâ
sorulmadı. Sonraki dersin sorusu aynı olay kümesinde üç sayıyı çıkarır: kaç olay yakalanıyor,
yakalananların kaçının aslında bir karşılığı yok ve tespitten önlemeye geçildiğinde — yani kayıt
tutmak yerine bağlantı kesilmeye başlandığında — kaç meşru bağlantı kesiliyor.

### Saldırı Tespit ve Önleme Sistemleri

Source: https://academia.sh/tr/kurslar/ag-guvenligi/saldiri-tespit-ve-onleme

On dört olay sınıfı ve yedi imza aynı dönem üzerinde koşturulur: ağ tabanlı ile konak tabanlı algılayıcının gördüğü kalem farkı, yakalanan ve kaçan olay, uyarıların ne kadarının yanlış pozitif olduğu, önleme kipine geçilince kesilen meşru iş ve gürültülü imzayı kapatmanın aynı hamlede kaybettirdiği tespit.

Önceki ders iki yüz on üç bin bağlantıyı bir kayda yazdırdı. Kayıt tutmak görmek değildir: dönemin
kayıtları arasında hangisinin bakılmaya değer olduğunu söyleyen bir şey yok. Bu dersin konusu o
söylemeyi üstlenen katmandır — ve o katmanın kendisi de sayılabilir bir şey yapar, çünkü her
"bakılmaya değer" kararı bir doğru ve bir yanlış üretir.

Ölçülen üç sayı var: dönemin kötü olaylarından kaçı yakalanıyor, yakalananların yanında kaç meşru
olay yanlışlıkla işaretleniyor ve tespitten önlemeye geçildiğinde — yani kayıt tutmak yerine
bağlantı kesilmeye başlandığında — kaç meşru iş duruyor. Buna bir dördüncü ekleniyor: algılayıcı
ağda mı yoksa konakta mı duruyor, çünkü ikisi aynı dönemde farklı olay kümesi görüyor. Bu derste
hiçbir saldırı adımı yazılmadı; olay sınıfları savunmanın gördüğü **belirtilerdir**.

- **CS18.** On dört olay sınıfı, dönem sayıları ve yedi imza kurgusal bölgesel ölçüm ağına aittir.
  Gerçek bir olay üretilmiyor; ölçülen şey `node` ile kurulan modeldir.
- **CS19.** Olayların gerçek sınıfı elle işaretlendi. Gerçekte bu sınıf ancak inceleme sonrası
  bilinir; modelde bilindiği varsayılıyor ki yanlış pozitif sayılabilsin.
- **CS20.** Bir olay sınıfı ya tek bir imzayla eşleşiyor ya hiçbiriyle. Gerçekte bir olay birden
  çok imzaya değebilir; uyarı sayısını büyütür, oranların yönünü değiştirmez.
- **CS21.** Görünürlük üç değerle modellendi: yalnız ağdan, yalnız konaktan ya da ikisinden.
  Şifreli akış konak tarafında açık, ağ tarafında kapalı sayıldı.
- **CS22.** Eşik, sıklık penceresi ve öğrenme evresi modellenmedi. Bir imza ya uyarır ya uyarmaz.
- **CS23.** Önleme kipinde uyaran her olayın durdurulduğu varsayıldı; gecikme ve kısmi kesme yok.

#### Olay Kümesi ve İki Algılayıcı Türü

Model her olay sınıfı için beş şey tutuyor: adı, gerçek sınıfı, hangi konumdan görülebildiği,
dönemdeki sayısı ve eşleştiği imza. Algılayıcının uyarması iki koşula bağlı — olayı görebilmesi ve
bir imzanın eşleşmesi. İkisi ayrı ayrı sayılabildiği için kaçan olayları iki nedene ayırmak
mümkün oluyor.

```js
// olay.mjs — donem olay kumesi, imza listesi ve iki algilayici turu; model, gercek olay degil
// [ad, gercek sinif, gorunurluk, donem sayisi, eslesen imza]
export const OLAY = [
  ['yonetim kapisina yogun deneme', 'kotu', 'ikisi', 12000, 'yogun-deneme'],
  ['bilinmeyen sunucu adina cikis', 'kotu', 'ag', 40, 'bilinmeyen-ad'],
  ['konakta yeni ayricalikli surec', 'kotu', 'konak', 6, 'yeni-surec'],
  ['duzenli aralikli kucuk cikis', 'kotu', 'ikisi', 2880, null],
  ['yerel dosya izninin degismesi', 'kotu', 'konak', 14, 'izin-degisikligi'],
  ['sifreli akis icinde bilinen yuk', 'kotu', 'konak', 3, 'bilinen-yuk'],
  ['ic bolgede tarama benzeri dizi', 'kotu', 'ag', 220, 'tarama-dizisi'],
  ['ceyrek sonu toplu sorgu', 'mesru', 'ikisi', 12, 'tarama-dizisi'],
  ['yedek aktarimi', 'mesru', 'ikisi', 12, 'buyuk-hacim'],
  ['yama dagitimi', 'mesru', 'ikisi', 90, 'yeni-surec'],
  ['saha ucu yeniden baglanma dalgasi', 'mesru', 'ag', 5100, 'yogun-deneme'],
  ['olcut cekme', 'mesru', 'ikisi', 259200, null],
  ['sube arayuz istekleri', 'mesru', 'ag', 184000, null],
  ['zaman kaynagi sorgusu', 'mesru', 'ag', 43200, null],
];
export const SENSOR = { ag: ['ag', 'ikisi'], konak: ['konak', 'ikisi'], ikisi: ['ag', 'konak', 'ikisi'] };
export const IMZA = [...new Set(OLAY.map((o) => o[4]).filter(Boolean))];
export const gorur = (s, o) => SENSOR[s].includes(o[2]);
export const uyarir = (s, o, kapali = []) => gorur(s, o) && o[4] !== null && !kapali.includes(o[4]);
export const topla = (l) => l.reduce((a, o) => a + o[3], 0);
export function say(s, kapali = []) {
  const u = (f) => OLAY.filter((o) => f(o));
  const yakalanan = u((o) => o[1] === 'kotu' && uyarir(s, o, kapali));
  const kacan = u((o) => o[1] === 'kotu' && !uyarir(s, o, kapali));
  const yanlis = u((o) => o[1] === 'mesru' && uyarir(s, o, kapali));
  return { yakalanan, kacan, yanlis, uyari: topla(yakalanan) + topla(yanlis) };
}
```

İmza kümesi yedi kalemden oluşuyor ve hiçbiri bir ürüne ait değil; her biri bir belirtinin adıdır.
Dönemin toplam olay sayısı beş yüz altı bini aşıyor, bunun büyük çoğunluğu üç sınıftan geliyor ve
o üç sınıfın hiçbir imzası yok. Ölçüm bu yüzden hacimle değil sınıfla başlıyor: hangi sınıf hangi
konumdan görünüyor, hangi sınıfa bir imza değiyor.

#### Ağ Tabanlı ile Konak Tabanlı

```js
// kosum1.mjs — ag ve konak tabanli algilayicinin gordugu kalem, yakaladigi ve kacirdigi olay
import { OLAY, SENSOR, IMZA, gorur, uyarir, topla, say } from './olay.mjs';

const KOTU = OLAY.filter((o) => o[1] === 'kotu');
console.log(`${OLAY.length} olay sinifi, ${KOTU.length} kotu / ${OLAY.length - KOTU.length} mesru; ` +
  `donemde ${topla(OLAY)} olay, ${IMZA.length} imza\n`);
console.log(`${'olay sinifi'.padEnd(34)} ${'sinif'.padStart(6)} ${'sayi'.padStart(6)} ${'imza'.padStart(17)} ` +
  `${'ag'.padStart(8)} ${'konak'.padStart(8)}`);
for (const o of OLAY)
  console.log(`${o[0].padEnd(34)} ${o[1].padStart(6)} ${String(o[3]).padStart(6)} ${String(o[4] ?? '-').padStart(17)} ` +
    `${(gorur('ag', o) ? (uyarir('ag', o) ? 'uyari' : 'gorur') : '-').padStart(8)} ` +
    `${(gorur('konak', o) ? (uyarir('konak', o) ? 'uyari' : 'gorur') : '-').padStart(8)}`);
console.log(`\n${'algilayici'.padEnd(11)} ${'gordugu sinif'.padStart(13)} ${'yakalanan kotu'.padStart(14)} ` +
  `${'kacan kotu'.padStart(10)} ${'yanlis pozitif sinif'.padStart(20)} ${'donem uyarisi'.padStart(13)}`);
for (const s of Object.keys(SENSOR)) {
  const r = say(s), gordugu = OLAY.filter((o) => gorur(s, o)).length;
  console.log(`${s.padEnd(11)} ${String(gordugu).padStart(13)} ${`${r.yakalanan.length}/${KOTU.length}`.padStart(14)} ` +
    `${String(r.kacan.length).padStart(10)} ${String(r.yanlis.length).padStart(20)} ${String(r.uyari).padStart(13)}`);
}
const ikisi = say('ikisi');
console.log(`\niki algilayici birlikteyken kacan kotu siniflar:`);
for (const o of ikisi.kacan) console.log(`  ${o[0].padEnd(34)} ${String(o[3]).padStart(6)}  ${o[4] === null ? 'imza yok' : 'gorulmuyor'}`);
```

```
14 olay sinifi, 7 kotu / 7 mesru; donemde 506777 olay, 7 imza

olay sinifi                         sinif   sayi              imza       ag    konak
yonetim kapisina yogun deneme        kotu  12000      yogun-deneme    uyari    uyari
bilinmeyen sunucu adina cikis        kotu     40     bilinmeyen-ad    uyari        -
konakta yeni ayricalikli surec       kotu      6        yeni-surec        -    uyari
duzenli aralikli kucuk cikis         kotu   2880                 -    gorur    gorur
yerel dosya izninin degismesi        kotu     14  izin-degisikligi        -    uyari
sifreli akis icinde bilinen yuk      kotu      3       bilinen-yuk        -    uyari
ic bolgede tarama benzeri dizi       kotu    220     tarama-dizisi    uyari        -
ceyrek sonu toplu sorgu             mesru     12     tarama-dizisi    uyari    uyari
yedek aktarimi                      mesru     12       buyuk-hacim    uyari    uyari
yama dagitimi                       mesru     90        yeni-surec    uyari    uyari
saha ucu yeniden baglanma dalgasi   mesru   5100      yogun-deneme    uyari        -
olcut cekme                         mesru 259200                 -    gorur    gorur
sube arayuz istekleri               mesru 184000                 -    gorur        -
zaman kaynagi sorgusu               mesru  43200                 -    gorur        -

algilayici  gordugu sinif yakalanan kotu kacan kotu yanlis pozitif sinif donem uyarisi
ag                     11            3/7          4                    4         17474
konak                   9            4/7          3                    3         12137
ikisi                  14            6/7          1                    4         17497

iki algilayici birlikteyken kacan kotu siniflar:
  duzenli aralikli kucuk cikis         2880  imza yok
```

İki algılayıcı türü aynı dönemde farklı kümeler görüyor ve kesişimleri tam değil. Ağ tabanlı olan
on bir sınıf görüyor, konak tabanlı olan dokuz; ikisinin birleşimi on dörttür, yani her sınıf en az
birinden görülüyor. Ayrıştıkları yer tek tek satırlarda okunuyor. Konakta açılan ayrıcalıklı bir
süreç ve yerel dosya izninin değişmesi ağdan hiç görünmüyor, çünkü bu olaylar hiçbir paket
üretmiyor. Şifreli akış içindeki bilinen yük de ağdan görünmüyor — ilk derste ölçülen kayıp burada
tespit tarafında karşımıza çıkıyor. Buna karşılık iç bölgedeki tarama benzeri bağlantı dizisi
konaktan görünmüyor: her makine kendi payına düşen tek bir bağlantıyı görür, diziyi görmek için
bütün makinelerin bağlantılarına aynı anda bakmak gerekir.

Yakalanan sütunu bu farkın toplamıdır. Ağ tabanlı algılayıcı yedi kötü sınıfın üçünü, konak
tabanlı dördünü yakalıyor; ikisi birlikte altısını. Tek bir sınıf ikisinden de kaçıyor ve nedeni
görünürlük değil: düzenli aralıklı küçük çıkışları iki algılayıcı da **görüyor**, hiçbir imza
eşleşmiyor. Bu olay hiçbir kurala aykırı değildir; aykırı olan düzenliliğidir ve düzenlilik bir
imzayla değil, bir taban çizgisiyle yakalanır.

Yanlış pozitif sütunu ise ters yönde okunmalıdır. Ağ tabanlı algılayıcı dört sınıfta, konak
tabanlı üç sınıfta yanlış uyarı üretiyor; ikisini birlikte çalıştırmak yanlış pozitif sınıfını
dörtte tutuyor ama uyarı sayısını on yedi bin dört yüz yetmiş dörtten on yedi bin dört yüz doksan
yediye çıkarıyor. İki algılayıcı aynı olayı iki kez işaretlediğinde yakalanan sınıf artmaz, kuyruk
artar. İkisini birlikte kurmanın kazancı — yakalanan sınıfın üçten ya da dörtten altıya çıkması —
bedelsiz değildir: iki ayrı kural kümesi, iki ayrı kuyruk ve konak tarafında her makineye
yerleştirilecek bir kalem.

#### Tespit, Önleme ve İmzayı Kapatmak

```js
// kosum2.mjs — ayni kume once tespit sonra onleme kipinde; imza kapatmanin iki yonu
import { OLAY, IMZA, uyarir, topla, say } from './olay.mjs';

console.log(`${'imza'.padEnd(17)} ${'uyardigi kotu'.padStart(13)} ${'uyardigi mesru'.padStart(14)} ${'gurultu payi'.padStart(12)}`);
for (const i of IMZA) {
  const e = OLAY.filter((o) => o[4] === i && uyarir('ikisi', o));
  const [k, m] = [topla(e.filter((o) => o[1] === 'kotu')), topla(e.filter((o) => o[1] === 'mesru'))];
  console.log(`${i.padEnd(17)} ${String(k).padStart(13)} ${String(m).padStart(14)} ${`%${(m * 100 / (k + m)).toFixed(1)}`.padStart(12)}`);
}
console.log(`\n${'imza kumesi'.padEnd(26)} ${'uyari'.padStart(6)} ${'gurultu'.padStart(7)} ${'yakalanan kotu'.padStart(14)} ` +
  `${'kacan kotu'.padStart(10)} ${'onlemede kesilen mesru'.padStart(22)}`);
for (const [ad, kapali] of [['hepsi acik', []], ['buyuk-hacim kapali', ['buyuk-hacim']],
  ['+ yogun-deneme kapali', ['buyuk-hacim', 'yogun-deneme']]]) {
  const r = say('ikisi', kapali);
  console.log(`${ad.padEnd(26)} ${String(r.uyari).padStart(6)} ${`%${(topla(r.yanlis) * 100 / r.uyari).toFixed(1)}`.padStart(7)} ` +
    `${String(topla(r.yakalanan)).padStart(14)} ${String(topla(r.kacan)).padStart(10)} ${String(topla(r.yanlis)).padStart(22)}`);
}
const r = say('ikisi');
console.log('\nonleme kipine gecilince kesilen mesru is:');
for (const o of r.yanlis) console.log(`  ${o[0].padEnd(34)} ${String(o[3]).padStart(5)}  imza: ${o[4]}`);
console.log(`\n${'olcu'.padEnd(30)} ${'tespit kipi'.padStart(11)} ${'onleme kipi'.padStart(11)}`);
for (const [ad, t, o] of [['duran kotu olay', 0, topla(r.yakalanan)], ['kesilen mesru olay', 0, topla(r.yanlis)],
  ['elle bakilacak uyari', r.uyari, r.uyari], ['kacan kotu olay', topla(r.kacan), topla(r.kacan)]])
  console.log(`${ad.padEnd(30)} ${String(t).padStart(11)} ${String(o).padStart(11)}`);
```

```
imza              uyardigi kotu uyardigi mesru gurultu payi
yogun-deneme              12000           5100        %29.8
bilinmeyen-ad                40              0         %0.0
yeni-surec                    6             90        %93.8
izin-degisikligi             14              0         %0.0
bilinen-yuk                   3              0         %0.0
tarama-dizisi               220             12         %5.2
buyuk-hacim                   0             12       %100.0

imza kumesi                 uyari gurultu yakalanan kotu kacan kotu onlemede kesilen mesru
hepsi acik                  17497   %29.8          12283       2880                   5214
buyuk-hacim kapali          17485   %29.8          12283       2880                   5202
+ yogun-deneme kapali         385   %26.5            283      14880                    102

onleme kipine gecilince kesilen mesru is:
  ceyrek sonu toplu sorgu               12  imza: tarama-dizisi
  yedek aktarimi                        12  imza: buyuk-hacim
  yama dagitimi                         90  imza: yeni-surec
  saha ucu yeniden baglanma dalgasi   5100  imza: yogun-deneme

olcu                           tespit kipi onleme kipi
duran kotu olay                          0       12283
kesilen mesru olay                       0        5214
elle bakilacak uyari                 17497       17497
kacan kotu olay                       2880        2880
```

Üst tablo imzaları tek tek tartıyor ve iki uç var. Büyük hacimli aktarım imzası dönemde hiçbir kötü
olay yakalamadı, on iki meşru yedek aktarımı işaretledi: gürültü payı yüzde yüz. Bilinen yük ve
izin değişikliği imzaları hiç yanlış pozitif üretmedi. Aradaki fark imzanın ne kadar özel
yazıldığıdır; hacim ölçen bir imza işin kendisiyle aynı şeye bakar, bir dosya izninin belirli bir
biçimde değişmesi işin hiçbir yerinde olmaz.

Alt tablo bu tartının sonucunu koşturuyor. Gürültü payı yüzde yüz olan imzayı kapatmak on iki
uyarı düşürüyor ve hiçbir tespit kaybettirmiyor — karşılıksız kazanç budur ve nadirdir. İkinci
adım gerçek takası gösteriyor. Yoğun deneme imzası dönemin yanlış pozitiflerinin neredeyse
tamamını tek başına üretiyor — beş bin iki yüz on dördün beş bin yüzünü; kapatmak uyarı sayısını
on yedi binden üç yüz seksen beşe indirir. Aynı hamle yakalanan kötü olayı on iki binden iki yüz
seksen üçe düşürür, kaçan kötü olayı iki bin sekiz yüzden on dört bin sekiz yüze çıkarır. Gürültü
payı ise yüzde otuzdan yüzde yirmi altıya iner: gürültünün **oranı** neredeyse değişmez, çünkü hem
pay hem payda aynı imzadan geliyordu. Gürültü oranıyla karar veren bir düzen bu hamleyi bir
iyileşme sanır.

Son tablo tespit ile önleme arasındaki tek gerçek farkı veriyor. İki kip aynı uyarıyı üretiyor ve
aynı olayı kaçırıyor; ayrıştıkları yer ilk iki satırdır. Önleme kipi on iki bin iki yüz seksen üç
kötü olayı durduruyor ve karşılığında beş bin iki yüz on dört meşru olayı kesiyor. Kesilen dört
sınıfın hangileri olduğu alt listede yazıyor ve sayıdan daha önemli olan sınıfın kendisidir: doksan
yama dağıtımı ve on iki yedek aktarımı kesiliyor. Bir önleme sistemi yama dağıtımını durdurduğunda
ağı yalnız o dönem için korumuş olmaz; makineleri yamasız bıraktığı için sonraki dönemin açık
kalemini kendisi üretir. Beş bin yüz saha ucu yeniden bağlanma denemesinin kesilmesi ise ölçüm
verisinin kaybı demektir.

Kesilen sınıflardan biri bu takasın en dar hâlini gösteriyor. Yama dağıtımı ile konakta açılan
ayrıcalıklı süreç aynı imzayı tetikliyor ve o imzanın gürültü payı yüzde doksan dörttür: doksan
altı işaretin doksanı yanlıştır. Böyle bir imzayı önleme kipinde bırakmak, altı gerçek olayı
durdurmak için doksan yama dağıtımını kesmek demektir. Kapatmak ise altı olayı tamamen görünmez
kılar. Üçüncü bir seçenek modelde yok ve gerçekte de ucuz değildir: imzayı bağlama duyarlı hâle
getirmek, yani süreci neyin başlattığını bilmek. O bilgi ağ katmanında hiç yoktur.

Tespit kipinde bu maliyetlerin hiçbiri yoktur; onun yerine on yedi bin dört yüz doksan yedi
uyarının elle bakılacak bir kuyruk oluşturması vardır. İki kip arasındaki seçim bir doğruluk
seçimi değildir — aynı imza kümesi, aynı yanlışlar. Seçilen şey yanlışın nereye yazılacağıdır:
kesilen meşru işe mi, yoksa kimsenin sonuna kadar bakamayacağı bir kuyruğa mı.

#### Özet

- Ağ tabanlı algılayıcı 14 sınıfın 11'ini, konak tabanlı 9'unu görüyor. Konakta açılan ayrıcalıklı
  süreç ve dosya izni değişikliği ağdan hiç görünmüyor; iç bölgedeki tarama benzeri dizi ise
  konaktan görünmüyor, çünkü her makine yalnız kendi tek bağlantısını görür.
- İkisi birlikte 7 kötü sınıfın 6'sını yakalıyor. Kaçan tek sınıfı ikisi de **görüyor**; eşleşen
  imza yok — aykırı olan tek şey düzenliliğidir.
- 7 imzanın gürültü payı %0 ile %100 arasında değişiyor. Büyük hacim imzası dönemde hiç kötü olay
  yakalamayıp 12 meşru aktarım işaretliyor; kapatmak karşılıksız kazançtır.
- Yoğun deneme imzasını kapatmak uyarıyı 17.497'den 385'e indiriyor, ama yakalanan kötü olayı
  12.283'ten 283'e düşürüp kaçanı 2.880'den 14.880'e çıkarıyor. Gürültü **oranı** %29,8'den
  %26,5'e iniyor: oranla karar veren düzen bu hamleyi iyileşme sanır.
- Önleme kipi 12.283 kötü olayı durdurup 4 sınıfta 5.214 meşru olayı kesiyor; kesilenlerin arasında
  90 yama dağıtımı var. İki kip aynı olayı kaçırıyor; seçilen şey yanlışın kesilen işe mi yoksa
  bakılamayan uyarı kuyruğuna mı yazılacağıdır.

#### Sonraki Adım

Bu dersin bütün gürültüsü tek bir yerden geldi: imzalar hem meşru işin hem de kötü olayın geçtiği
bir alana bakıyordu. Yanlış pozitif oranını düşürmenin yolu daha iyi imza yazmak değil, meşru
işin hiç uğramadığı bir yere bakmaktır. Sonraki dersin sorusu budur: dönemde hiçbir meşru
bağlantının hiç dokunmaması gereken bir kalem konulursa, ona gelen her etkileşimin yanlış pozitif
oranı ne olur, bu sinyal dönemin kaçıncı gününde gelir ve aynı düzenin hiç göremediği kaç kalem
kalır.

### Bal Küpleri ve Yönlendirme Kuyuları

Source: https://academia.sh/tr/kurslar/ag-guvenligi/bal-kupleri-ve-yonlendirme-kuyulari

Meşru işin hiç uğramadığı dört aldatma kalemi aynı dönemde koşturulur: etkileşimin yanlış pozitif oranı imza tabanlı tespitin yanında ne kadar düşük kalıyor, kaç kötü olay sınıfı bu düzende hiç görünmüyor ve yönlendirme kuyusu düşürdüğü bağlantı başına kaç meşru bağlantı kesiyor.

Önceki dersin bütün gürültüsü tek bir yerden geliyordu: imzalar hem meşru işin hem kötü olayın
geçtiği alana bakıyordu. Yedek aktarımı ile veri sızması aynı hacim eşiğine değiyor, yama dağıtımı
ile yeni ayrıcalıklı süreç aynı belirtiyi üretiyordu. Yanlış pozitif oranını düşürmenin yolu daha
dar imza yazmak değil — meşru işin hiç uğramadığı bir yere bakmaktır.

Aldatma kalemi tam olarak budur: dönem boyunca hiçbir meşru akışın dokunmaması gereken bir uç, bir
kayıt ya da bir kimlik bilgisi. Dokunulduğunda sinyalin anlamı belirsiz değildir, çünkü ortada
"acaba meşru muydu" diye sorulacak bir alternatif yoktur. Bu kalemler kendi ağında kurulur ve
gözlem kendi sınırında kalır; başkasının ağına tuzak yerleştirmek ya da oradan veri toplamak,
yazılı yetki ve tanımlı kapsam olmadan hem yasa dışı hem meslek dışıdır.

- **CS24.** Dört aldatma kalemi, etkileşim sayıları ve altı önek sınıfı kurgusal bölgesel ölçüm
  ağına aittir. Gerçek bir kurulum yapılmıyor; ölçülen şey `node` ile kurulan modeldir.
- **CS25.** Karşılaştırılan imza tabanlı sayılar önceki dersin iki algılayıcılı koşumundan
  okundu; aynı dönem ve aynı olay kümesidir.
- **CS26.** İlk sinyal günü elle yazıldı. Gerçekte bu gün, aldatma kaleminin nereye konulduğuna ve
  keşif sırasına bağlıdır; sayı değil sıra taşır.
- **CS27.** Önek sınıfları etiketle anıldı; gerçek adres bloğu yazılmadı. Kötü ve meşru bağlantı
  ayrımı elle işaretlendi.
- **CS28.** Yönlendirme kuyusu tam kesme olarak modellendi: öneğe giden ve önekten gelen bütün
  bağlantılar düşer. Kısmi kesme ve hız sınırı modellenmedi.

#### Aldatma Kalemleri ve Kapsam

Model dört aldatma kalemi tutuyor. İkisi bir uçtur: yönetim bölgesinde hiçbir işi olmayan bir
yönetim arayüzü ve veri bölgesinde hiçbir uygulamanın çağırmadığı bir veri ucu. Üçüncüsü bir
kayıttır — hiçbir meşru sorgunun döndürmediği bir satır; dışarı çıkan bir akışta görünmesi tek
başına bir sinyaldir. Dördüncüsü hiçbir yerde kullanılmayan bir kimlik bilgisidir.

```js
// aldatma.mjs — aldatma kalemleri, etkilesim kaynaklari ve onek kumesi; model, gercek kurulum degil
// [kalem, bulundugu bolge, kotu etkilesim, mesru etkilesim, mesru etkilesimin kaynagi, ilk sinyal gunu]
export const ALDATMA = [
  ['bal-kupu-yonetim', 'yonetim', 412, 6, 'aylik envanter taramasi', 2],
  ['bal-kupu-veri', 'veri', 54, 1, 'yedek dogrulama betigi', 9],
  ['bal-kaydi', 'veri', 3, 0, '-', 17],
  ['bal-kimlik', 'yonetim', 118, 0, '-', 2],
];
// Onceki dersteki yedi kotu olay sinifindan hangisi hangi aldatma kalemine dokunuyor
export const DOKUNAN = {
  'yonetim kapisina yogun deneme': ['bal-kupu-yonetim', 'bal-kimlik'],
  'bilinmeyen sunucu adina cikis': [],
  'konakta yeni ayricalikli surec': [],
  'duzenli aralikli kucuk cikis': ['bal-kaydi'],
  'yerel dosya izninin degismesi': [],
  'sifreli akis icinde bilinen yuk': [],
  'ic bolgede tarama benzeri dizi': ['bal-kupu-yonetim', 'bal-kupu-veri'],
};
// Yonlendirme kuyusuna alinabilecek onek siniflari: [etiket, kotu baglanti, mesru baglanti, not]
export const ONEK = [
  ['onek-A', 8400, 0, ''], ['onek-B', 2100, 0, ''],
  ['onek-C', 640, 12, 'tedarikci ayni blokta'], ['onek-D', 190, 0, ''],
  ['onek-E', 40, 5100, 'saha uclerinin hucresel cikisi ayni blokta'], ['onek-F', 12000, 0, ''],
];
export const KUYU = {
  yok: [], temiz: ['onek-A', 'onek-B', 'onek-D', 'onek-F'],
  'temiz+C': ['onek-A', 'onek-B', 'onek-C', 'onek-D', 'onek-F'],
  hepsi: ONEK.map((o) => o[0]),
};
export const topla = (l, i) => l.reduce((a, o) => a + o[i], 0);
export const oran = (k, m) => (k + m === 0 ? '-' : `%${(m * 100 / (k + m)).toFixed(1)}`);
// Onceki dersin imza tabanli sayilari (kaynak: ayni donem, iki algilayici birlikte)
export const IMZA_SAYI = { uyari: 17497, kotu: 12283, mesru: 5214, kacan: 2880, sinif: 6 };
```

Modelin ikinci parçası önceki dersin yedi kötü olay sınıfını alıp her birinin hangi aldatma
kalemine dokunduğunu yazıyor. Boş liste, o sınıfın bu düzende hiç görünmediği demektir; kapsam
ölçüsü buradan çıkıyor. Üçüncü parça yönlendirme kuyusuna ait ve ayrı bir mantıkla çalışıyor —
orada ölçülen şey sinyal değil, düşürülen bağlantıdır.

```js
// kosum1.mjs — aldatma kalemlerinin yanlis pozitif orani ve kapsam disinda kalan olay siniflari
import { ALDATMA, DOKUNAN, IMZA_SAYI, topla, oran } from './aldatma.mjs';

console.log(`${'aldatma kalemi'.padEnd(17)} ${'bolge'.padEnd(8)} ${'kotu etkilesim'.padStart(14)} ${'mesru'.padStart(6)} ` +
  `${'yanlis pozitif'.padStart(14)} ${'ilk sinyal'.padStart(10)}  mesru etkilesimin kaynagi`);
for (const a of ALDATMA)
  console.log(`${a[0].padEnd(17)} ${a[1].padEnd(8)} ${String(a[2]).padStart(14)} ${String(a[3]).padStart(6)} ` +
    `${oran(a[2], a[3]).padStart(14)} ${`${a[5]}. gun`.padStart(10)}  ${a[4]}`);
const [k, m] = [topla(ALDATMA, 2), topla(ALDATMA, 3)];
console.log(`\n${'olcu'.padEnd(28)} ${'imza tabanli'.padStart(12)} ${'aldatma tabanli'.padStart(15)}`);
for (const [ad, i, a] of [
  ['donem uyarisi', IMZA_SAYI.uyari, k + m],
  ['yanlis pozitif', IMZA_SAYI.mesru, m],
  ['yanlis pozitif orani', oran(IMZA_SAYI.kotu, IMZA_SAYI.mesru), oran(k, m)],
  ['kapsanan kotu olay sinifi', `${IMZA_SAYI.sinif}/7`, `${Object.values(DOKUNAN).filter((d) => d.length).length}/7`],
]) console.log(`${ad.padEnd(28)} ${String(i).padStart(12)} ${String(a).padStart(15)}`);
console.log('\nolay sinifi -> dokundugu aldatma kalemi:');
for (const [s, d] of Object.entries(DOKUNAN)) console.log(`  ${s.padEnd(34)} ${d.join(', ') || '- (hic gorunmuyor)'}`);
```

```
aldatma kalemi    bolge    kotu etkilesim  mesru yanlis pozitif ilk sinyal  mesru etkilesimin kaynagi
bal-kupu-yonetim  yonetim             412      6           %1.4     2. gun  aylik envanter taramasi
bal-kupu-veri     veri                 54      1           %1.8     9. gun  yedek dogrulama betigi
bal-kaydi         veri                  3      0           %0.0    17. gun  -
bal-kimlik        yonetim             118      0           %0.0     2. gun  -

olcu                         imza tabanli aldatma tabanli
donem uyarisi                       17497             594
yanlis pozitif                       5214               7
yanlis pozitif orani                %29.8            %1.2
kapsanan kotu olay sinifi             6/7             3/7

olay sinifi -> dokundugu aldatma kalemi:
  yonetim kapisina yogun deneme      bal-kupu-yonetim, bal-kimlik
  bilinmeyen sunucu adina cikis      - (hic gorunmuyor)
  konakta yeni ayricalikli surec     - (hic gorunmuyor)
  duzenli aralikli kucuk cikis       bal-kaydi
  yerel dosya izninin degismesi      - (hic gorunmuyor)
  sifreli akis icinde bilinen yuk    - (hic gorunmuyor)
  ic bolgede tarama benzeri dizi     bal-kupu-yonetim, bal-kupu-veri
```

İkinci tablo dersin çekirdeğidir. Aynı dönemde imza tabanlı düzen on yedi bin uyarı üretti, aldatma
tabanlı düzen beş yüz doksan dört. Yanlış pozitif beş bin iki yüz on dörtten yediye indi; oran
yüzde otuzdan yüzde bire. Bunun bir nedeni var ve nedeni imzaların kötü yazılmış olması değil.
İmza, meşru trafiğin de geçtiği bir alanda desen arıyor; aldatma kalemi meşru trafiğin hiç geçmediği
bir yere konuluyor. Yanlış pozitif oranı düşük çıkıyor çünkü **payda tanım gereği boş**.

Kalan yedi yanlış pozitifin kaynağı da bunu doğruluyor: ikisi de kurumun kendi betikleridir. Aylık
envanter taraması bütün adresleri dolaşıyor, yedek doğrulama betiği bütün uçları yokluyor. İkisi
adıyla bilindiği için istisna listesine yazılıp yanlış pozitif sıfıra indirilebilir; bedeli, o
listenin bir kalem olarak bakımda tutulmasıdır. İstisna listesi büyüdükçe aldatma kaleminin
sinyali sulanır.

Son satır bedelin asıl yerini gösteriyor. İmza tabanlı düzen yedi kötü sınıfın altısını kapsıyordu,
aldatma tabanlı düzen üçünü. Dört sınıf hiç görünmüyor ve hepsi aynı türdendir: aldatma kalemine
dokunmayı gerektirmeyen olaylar. Konakta açılan bir süreç ya da değişen bir dosya izni, ağda
kurulmuş hiçbir tuzağa değmez. Aldatma bir tespit katmanının yerine geçmez; onun en gürültülü
olduğu yerde çok temiz bir sinyal verir, en sessiz olduğu yerde hiçbir şey vermez.

İlk tablodaki etkileşim sayıları da kendi başına bir şey söylüyor. Dört kalemin taşıdığı yük
birbirinden çok farklı: yönetim bölgesindeki sahte arayüz dört yüz on iki etkileşim görürken veri
bölgesindeki kayıt üç etkileşim görüyor. İkisi de aynı kesinlikte sinyal veriyor ve aynı işlemi
gerektiriyor. Aldatma kaleminin değeri gördüğü hacimle ölçülmez, çünkü hacmin kendisi bir bilgi
taşımıyor — bir etkileşim ile dört yüz etkileşim aynı sonuca varır. Ölçülebilen tek şey kalemin
**nereye** konulduğudur: sinyal, kalemin bulunduğu bölgeye birinin ulaşmış olduğunu söyler.

Kesişimin ortasında bir satır var: düzenli aralıklı küçük çıkışlar. Önceki derste yedi sınıftan
yalnız bu biri iki algılayıcının ikisinden birden kaçmıştı — görülüyordu, hiçbir imza eşleşmiyordu.
Bal kaydı bu sınıfı yakalıyor ve dönemde yalnız üç etkileşimle yakalıyor. Sinyalin on yedinci günde
gelmesi de anlamlıdır: aldatma kalemi bir hız ölçüsü değil, bir varlık ölçüsüdür.

Aldatma kalemlerinin bir bedeli de tabloda görünmüyor: kalemin inandırıcı kalması. Bir yönetim
arayüzü kılığındaki uç, çevresindeki gerçek kalemlerden ayırt edilebiliyorsa kimse ona
dokunmaz ve sinyal hiç gelmez. Ayırt edilemez kalması ise onun da güncellenmesini, adlandırma
düzenine uymasını ve envanterde bir karşılığının bulunmasını gerektirir. Dört kalemin bakımı,
korunan iki yüz on kalemin bakımından ayrı bir iştir ve unutulduğunda kalem sessizce işlevsiz
hâle gelir — yanlış pozitif üretmediği için de kimse fark etmez. Ölçülmeyen bir savunmanın
sessizliği çalıştığının kanıtı değildir.

#### Yönlendirme Kuyusu

```js
// kosum2.mjs — yonlendirme kuyusu: dusen kotu baglanti, kesilen mesru baglanti ve kalan kotu
import { ONEK, KUYU, topla } from './aldatma.mjs';

const [TK, TM] = [topla(ONEK, 1), topla(ONEK, 2)];
console.log(`alti onek sinifi: ${TK} kotu, ${TM} mesru baglanti\n`);
console.log(`${'onek'.padEnd(8)} ${'kotu'.padStart(6)} ${'mesru'.padStart(6)} ${'kuyuya alinirsa kesilen mesru'.padStart(29)}  not`);
for (const o of ONEK)
  console.log(`${o[0].padEnd(8)} ${String(o[1]).padStart(6)} ${String(o[2]).padStart(6)} ${String(o[2]).padStart(29)}  ${o[3]}`.trimEnd());
console.log(`\n${'kuyu listesi'.padEnd(13)} ${'onek'.padStart(4)} ${'dusen kotu'.padStart(10)} ${'kalan kotu'.padStart(10)} ` +
  `${'kesilen mesru'.padStart(13)} ${'kotu basina kesilen mesru'.padStart(25)}`);
for (const [ad, liste] of Object.entries(KUYU)) {
  const ic = ONEK.filter((o) => liste.includes(o[0]));
  const [dk, km] = [topla(ic, 1), topla(ic, 2)];
  console.log(`${ad.padEnd(13)} ${String(liste.length).padStart(4)} ${String(dk).padStart(10)} ${String(TK - dk).padStart(10)} ` +
    `${String(km).padStart(13)} ${(dk ? (km / dk).toFixed(4) : '-').padStart(25)}`);
}
const e = ONEK.find((o) => o[0] === 'onek-E'), c = ONEK.find((o) => o[0] === 'onek-C');
console.log(`\nson iki onegin tek tek bedeli:`);
for (const o of [c, e])
  console.log(`  ${o[0]} eklenince  dusen kotu +${o[1]}, kesilen mesru +${o[2]}  (${o[3]})`);
console.log(`\nkuyuya dusen trafik hedefe varmadigi icin hicbir algilayici kaydi uretmiyor;`);
console.log(`temiz listede ${topla(ONEK.filter((o) => KUYU.temiz.includes(o[0])), 1)} baglanti sessizce dusuyor`);
```

```
alti onek sinifi: 23370 kotu, 5112 mesru baglanti

onek       kotu  mesru kuyuya alinirsa kesilen mesru  not
onek-A     8400      0                             0
onek-B     2100      0                             0
onek-C      640     12                            12  tedarikci ayni blokta
onek-D      190      0                             0
onek-E       40   5100                          5100  saha uclerinin hucresel cikisi ayni blokta
onek-F    12000      0                             0

kuyu listesi  onek dusen kotu kalan kotu kesilen mesru kotu basina kesilen mesru
yok              0          0      23370             0                         -
temiz            4      22690        680             0                    0.0000
temiz+C          5      23330         40            12                    0.0005
hepsi            6      23370          0          5112                    0.2187

son iki onegin tek tek bedeli:
  onek-C eklenince  dusen kotu +640, kesilen mesru +12  (tedarikci ayni blokta)
  onek-E eklenince  dusen kotu +40, kesilen mesru +5100  (saha uclerinin hucresel cikisi ayni blokta)

kuyuya dusen trafik hedefe varmadigi icin hicbir algilayici kaydi uretmiyor;
temiz listede 22690 baglanti sessizce dusuyor
```

Yönlendirme kuyusu ters yönde çalışan bir kalemdir: aldatma kalemi sinyal üretmek için konulur,
kuyu trafiği hiç görmemek için. Dört temiz önek yirmi iki bin altı yüz doksan kötü bağlantıyı
düşürüyor ve tek bir meşru bağlantı kesmiyor. Kalan altı yüz seksen kötü bağlantı iki önekten
geliyor ve ikisi de meşru trafikle karışık.

Son sütun bu karışıklığın fiyatını veriyor. Beşinci öneği eklemek kötü bağlantı başına on binde
beş meşru bağlantı kesiyor — pratikte bedelsiz. Altıncısını eklemek aynı oranı beşte bire
çıkarıyor: kırk kötü bağlantıyı düşürmek için beş bin yüz meşru bağlantı kesiliyor. İki hamle
listeye birer satır ekliyor ve satırlar birbirine benziyor; ayrımı yapan tek şey öneğin arkasında
kimin durduğudur. Bir engelleme listesinin uzunluğu bu yüzden bir ölçü değildir; ölçü, düşen kötü
bağlantı başına kesilen meşru bağlantıdır.

Listenin bir de zaman boyutu var ve tabloda görünmüyor. Bir önek dönem boyunca kötü trafik
taşıdığı için listeye girer; sonraki dönemde arkasındaki taraf değişebilir ve satır yerinde kalır.
Satırı eklemenin gerekçesi kayda geçer, silmenin gerekçesi hiçbir yerde doğmaz — çünkü kuyuya
düşen trafik hiçbir kayıt üretmediği için o öneğin artık meşru trafik taşıdığı da görünmez.
Yönlendirme kuyusu bu yönüyle güvenlik duvarı kural kümesiyle aynı huya sahiptir: tek yönde büyür.

Son iki satır kuyunun kendi kör noktasını veriyor. Kuyuya düşen trafik hedefe varmadığı için
hiçbir algılayıcı kaydı üretmiyor: yirmi iki bin altı yüz doksan bağlantı sessizce yok oluyor.
Önceki dersin uyarı kuyruğu bu kadar hafifliyor, ama aynı hamle o trafiğin ne aradığını ve neyi
denediğini de görünmez kılıyor. Kuyu ile bal küpü aynı dönemde birlikte kurulabildiği için bu iki
kalem birbirini tamamlar: biri gürültüyü hiç üretmeden düşürür, öteki gürültünün hiç olmadığı
yerde tek bir etkileşimi sinyale çevirir.

Bu dersin iki kalemi bir arada bir şey daha söylüyor. Aldatma kalemi kapsamı dar, sinyali temiz
bir savunmadır; yönlendirme kuyusu kapsamı geniş, sinyali hiç olmayan bir savunmadır. Önceki
dersin imza tabanlı düzeni ikisinin ortasındadır: kapsamı geniş, sinyali gürültülü. Üçü aynı
dönemde birlikte çalıştığında ölçüm sütunları toplanmaz, çünkü hepsi aynı olayı farklı yerlerde
görür. Ölçülebilir olan tek şey her birinin kendi sütunudur — kapsanan sınıf, üretilen yanlış
pozitif ve kesilen meşru iş — ve bir savunmanın bu üçünden yalnız birini iyileştirdiği söyleniyorsa
ötekilerin nereye gittiği sorulmamış demektir.

#### Özet

- Aynı dönemde imza tabanlı düzen 17.497 uyarı ve %29,8 yanlış pozitif üretiyor; aldatma tabanlı
  düzen 594 uyarı ve %1,2. Oran düşük çünkü aldatma kalemine meşru iş tanım gereği uğramıyor.
- Kalan 7 yanlış pozitifin ikisi de kurumun kendi betiğidir. İstisna listesiyle sıfırlanabilir;
  bedeli, listenin bakımda tutulması ve büyüdükçe sinyali sulandırmasıdır.
- Kapsam bedeldir: imza tabanlı düzen 7 kötü sınıfın 6'sını, aldatma tabanlı düzen 3'ünü kapsıyor.
  Görünmeyen 4 sınıf aynı türdendir — hiçbir tuzağa dokunmayı gerektirmeyen olaylar.
- Bal kaydı, önceki derste iki algılayıcının da kaçırdığı tek sınıfı 3 etkileşimle yakalıyor.
  Sinyal 17. günde geliyor: aldatma bir hız değil, bir varlık ölçüsüdür.
- Yönlendirme kuyusunda 4 temiz önek 22.690 kötü bağlantıyı sıfır meşru kayıpla düşürüyor.
  Beşinci önek kötü başına 0,0005, altıncısı 0,2187 meşru bağlantıya mal oluyor. Kuyunun kendi
  bedeli kayıtsızlıktır: düşen 22.690 bağlantı hiçbir algılayıcı kaydı üretmiyor.

#### Sonraki Adım

Buraya kadar sayılan her savunma trafiği ya bölgelere ayırdı, ya bir noktadan geçirdi, ya kaydetti
ya da düşürdü. Hepsinin ortak varsayımı, bağlanan tarafın ağın **dışında** durmasıydı. Bir tünel
bu varsayımı kaldırır: uzaktaki bir uç, doğrulandıktan sonra ağın içinde bir adres alır ve
bölge grafiğinde bir düğüm hâline gelir. Sonraki dersin sorusu tünelin kurulup kurulmadığı değil,
kurulduğunda kaç kaleme erişildiğidir — tam tünelde kaç kalem, bölünmüş tünelde kaçı içeride kaçı
dışarıda kalıyor ve tek bir doğrulama kaç bağlantıyı kanıtlanmış saymaya yetiyor.

### Sanal Özel Ağlar

Source: https://academia.sh/tr/kurslar/ag-guvenligi/sanal-ozel-aglar

Tünelin açtığı erişim kapsamı üç yerleşimde koşturulur: uzak uç iç bölgeye indiğinde kaç kaleme doğrudan erişiliyor, ayrı bölgeye ve rol başına bölgeye indiğinde kaç kalem kapsam dışında kalıyor; bölünmüş tünel kaç bağlantıyı denetim dışında bırakıyor ve tek bir doğrulama kaç bağlantının özne kimliğini kanıtlanmış saymaya yetiyor.

Buraya kadar sayılan her savunma trafiği ya bölgelere ayırdı, ya bir noktadan geçirdi, ya kaydetti
ya da düşürdü. Hepsinin ortak varsayımı bağlanan tarafın ağın dışında durmasıydı. Tünel bu
varsayımı kaldırır: uzaktaki bir uç doğrulandıktan sonra iç ağdan bir adres alır ve bölge
grafiğinde bir düğüm hâline gelir. O andan sonra uzaklık bir güvenlik özelliği değildir.

Ölçülen üç şey var. Tünel açıldığında hangi bölgeye iniliyor ve oradan kaç kaleme erişiliyor;
bölünmüş tünel kaç bağlantıyı tünelin dışında bırakıyor; ve tek bir doğrulama kaç bağlantının
özne kimliğini kanıtlanmış saymaya yetiyor. Bulut ağlarında tünel ve özel bağlantı başka bir
kursta ele alındı; buradaki eksen bağlantının kurulması değil, kurulduktan sonraki kapsamıdır.

- **CS29.** Üç uzak uç sınıfı, kalem sayıları, bağlantı ve oturum sayıları kurgusal bölgesel ölçüm
  ağına aittir. Gerçek tünel kurulmuyor; ölçülen şey `node` ile kurulan modeldir.
- **CS30.** Şifreleme, anahtar değişimi ve tünel protokolü modellenmedi. Tünelin kurulduğu ve
  içindeki trafiğin dışarıdan okunamadığı varsayıldı; kanıtın neye dayandığı bu kursun dışındadır.
- **CS31.** Bölge içinde kısıt yok sayıldı: bir bölgeye inen uç o bölgenin bütün kalemlerine
  erişir. Doğrudan erişim, iniş bölgesi ile ondan çıkan kuralların hedefleri sayıldı.
- **CS32.** Oturum süresi sekiz saat alındı ve her oturumun tam sürdüğü varsayıldı. Yeniden
  doğrulama, oturum yenileme ve boşta kalma zaman aşımı modellenmedi.
- **CS33.** Bağlantıların kurum hedefli ve dış hedefli ayrımı elle işaretlendi; her koşum aynı
  sayıları üretir.

#### Tünelin İndiği Bölge

Uzaktan erişim tünelinin tek bir yapılandırma kalemi bütün kapsamı belirliyor: uzak ucun hangi
bölgeden adres aldığı. En kolay yol onu çalışanların bulunduğu bölgeye indirmektir, çünkü o
bölgenin kuralları zaten yazılmıştır ve hiçbir yeni satır gerekmez. Model üç yerleşimi
karşılaştırıyor: iç bölgeye iniş, tek bir uzak erişim bölgesine iniş ve her uç sınıfının kendi
bölgesine inişi.

```js
// tunel.mjs — tunelin indigi bolge, erisim kapsami ve baglanti dagilimi; model, gercek tunel degil
export const KALEM = { dmz: 4, sube: 120, saha: 60, uygulama: 12, veri: 6, yonetim: 5, yedek: 3 };
const YONETIM = ['dmz', 'sube', 'saha', 'uygulama', 'veri', 'yedek'].map((b) => ['yonetim', b]);
export const TABAN = [['sube', 'dmz'], ['sube', 'uygulama'], ['saha', 'dmz'], ['dmz', 'uygulama'],
  ['uygulama', 'veri'], ['veri', 'yedek'], ...YONETIM];
// [sinif, uc sayisi, kurum hedefli baglanti, dis hedefli baglanti, donemdeki oturum]
export const UC = [
  ['saha dizustu', 40, 26400, 5100, 880], ['evden calisan', 25, 18600, 92000, 550],
  ['tedarikci', 6, 740, 0, 24],
];
// Uc sinifi hangi bolgeye iniyor ve o bolgeden hangi kurallar yaziliyor
export const YERLESIM = {
  duz: { inis: () => 'sube', ek: [] },
  'tek uzak bolge': { inis: () => 'uzak', ek: [['uzak', 'dmz'], ['uzak', 'uygulama']] },
  'rol basina bolge': {
    inis: (s) => ({ 'saha dizustu': 'uzak-saha', 'evden calisan': 'uzak-ofis', tedarikci: 'uzak-tedarik' })[s],
    ek: [['uzak-saha', 'dmz'], ['uzak-ofis', 'dmz'], ['uzak-ofis', 'uygulama'], ['uzak-tedarik', 'dmz']],
  },
};
export function ulasilan(kenar, bas) {
  const gor = new Set(), kuyruk = [bas];
  while (kuyruk.length) {
    const b = kuyruk.shift();
    for (const [x, y] of kenar) if (x === b && !gor.has(y)) { gor.add(y); kuyruk.push(y); }
  }
  return gor;
}
export const kalemi = (kume) => [...kume].reduce((a, b) => a + (KALEM[b] ?? 0), 0);
export const kapsam = (y, s) => {             // bir uc sinifinin tunel acikken erisebildigi kalem
  const kenar = [...TABAN, ...y.ek], bas = y.inis(s);
  const yakin = new Set([bas, ...kenar.filter(([x]) => x === bas).map(([, b]) => b)]);
  const tum = ulasilan(kenar, bas); tum.add(bas);
  return { bolge: [...tum].filter((b) => KALEM[b]).length, dogrudan: kalemi(yakin), gecisli: kalemi(tum) };
};
export const TOPLAM_KALEM = kalemi(Object.keys(KALEM));
export const OTURUM_SAAT = 8;                 // tek dogrulamayla acilan oturumun suresi
export const topla = (i) => UC.reduce((a, u) => a + u[i], 0);
```

Model iki ölçü veriyor ve ikisini karıştırmamak gerekiyor. Doğrudan erişilen kalem, tünelin indiği
bölgenin kendi kalemleriyle o bölgeden çıkan kuralların hedeflerini toplar; geçişli erişilen kalem
grafiğin tamamını yürür. Aradaki fark bir adım daha atmanın neye bağlı olduğudur: doğrudan erişilen
kalem uzak ucun elindedir, geçişli olanlar arada bir uygulama akışının kullanılmasını gerektirir.
Bölütleme dersinde aynı ayrım ilk atlama ile geçişli kalem olarak sayılmıştı.

```js
// kosum1.mjs — tunel acikken uc sinifinin erisebildigi bolge ve kalem, uc yerlesimde
import { UC, YERLESIM, TABAN, kapsam, TOPLAM_KALEM } from './tunel.mjs';

console.log(`ic ag ${TOPLAM_KALEM} kalem, ${TABAN.length} bolge kurali\n`);
console.log('sutunlar: uc sinifi basina dogrudan / gecisli erisilen kalem');
console.log(`${'yerlesim'.padEnd(18)} ${'ek kural'.padStart(8)}` + UC.map((u) => u[0].padStart(16)).join(''));
for (const [ad, y] of Object.entries(YERLESIM))
  console.log(`${ad.padEnd(18)} ${String(y.ek.length).padStart(8)}` +
    UC.map((u) => { const k = kapsam(y, u[0]); return `${k.dogrudan}/${k.gecisli}`.padStart(16); }).join(''));
console.log(`\n${'yerlesim'.padEnd(18)} ${'ek kural'.padStart(8)} ${'en genis dogrudan'.padStart(17)} ` +
  `${'kapsam disi kalem'.padStart(17)} ${'kapali yol payi'.padStart(15)}`);
for (const [ad, y] of Object.entries(YERLESIM)) {
  const en = Math.max(...UC.map((u) => kapsam(y, u[0]).dogrudan));
  console.log(`${ad.padEnd(18)} ${String(y.ek.length).padStart(8)} ${String(en).padStart(17)} ` +
    `${String(TOPLAM_KALEM - en).padStart(17)} ${`%${((TOPLAM_KALEM - en) * 100 / TOPLAM_KALEM).toFixed(1)}`.padStart(15)}`);
}
const r = YERLESIM['rol basina bolge'];
console.log('\nrol basina bolgede sinif basina erisilen kalem:');
for (const u of UC) console.log(`  ${u[0].padEnd(14)} ${u[1]} uc  ${String(kapsam(r, u[0]).dogrudan).padStart(4)} dogrudan, ${String(kapsam(r, u[0]).gecisli).padStart(3)} gecisli kalem`);
```

```
ic ag 210 kalem, 12 bolge kurali

sutunlar: uc sinifi basina dogrudan / gecisli erisilen kalem
yerlesim           ek kural    saha dizustu   evden calisan       tedarikci
duz                       0         136/145         136/145         136/145
tek uzak bolge            2           16/25           16/25           16/25
rol basina bolge          4            4/25           16/25            4/25

yerlesim           ek kural en genis dogrudan kapsam disi kalem kapali yol payi
duz                       0               136                74           %35.2
tek uzak bolge            2                16               194           %92.4
rol basina bolge          4                16               194           %92.4

rol basina bolgede sinif basina erisilen kalem:
  saha dizustu   40 uc     4 dogrudan,  25 gecisli kalem
  evden calisan  25 uc    16 dogrudan,  25 gecisli kalem
  tedarikci      6 uc     4 dogrudan,  25 gecisli kalem
```

İlk satır hiç kural yazmamanın karşılığıdır. Tünel şube bölgesine indiğinde uzak uç o bölgenin
yüz yirmi kalemiyle aynı düzlükte durur ve şube bölgesinden çıkan kuralları da devralır: doğrudan
erişilen kalem yüz otuz altı, geçişli erişilen kalem yüz kırk beş. İki yüz on kalemlik ağın üçte
ikisi tek bir tünelin arkasında. Tedarikçi ucu ile saha dizüstü ucu aynı sayıyı alıyor, çünkü
kapsam ucun kim olduğuna göre değil, indiği bölgeye göre belirleniyor.

İkinci satır iki kural satırının karşılığıdır. Uzak uçlar kendi bölgesine indiğinde doğrudan
erişilen kalem on altıya, geçişli erişilen kalem yirmi beşe iniyor; kapsam dışında kalan kalem
yetmiş dörtten yüz doksan dörde çıkıyor. İki satır yüz yirmi kalemi kapsam dışına taşıyor. Bu
dersin en yüksek getirili hamlesi budur ve maliyeti iki satırdır.

Üçüncü satır iki satır daha ekliyor ve toplam kapsamı hiç değiştirmiyor: geçişli erişim yine yirmi
beş. Değişen şey sınıf başına doğrudan erişimdir. Saha dizüstü ile tedarikçi ucu on altı yerine
dört kaleme doğrudan erişiyor; evden çalışanın kapsamı aynı kalıyor, çünkü onun işi uygulama
bölgesindedir. Rol başına bölge, kapsamı toplamda daraltmıyor — **en geniş kapsamı en az sayıda
uca bırakıyor**. Yetmiş bir ucun kırk altısı artık on altı yerine dört kalem görüyor.

Bu üç satırın ortak dersi, tünelin kendisinin bir güvenlik kalemi olmadığıdır. Üç yerleşimde de
aynı tünel kuruluyor, aynı doğrulama yapılıyor ve içerideki trafik aynı biçimde taşınıyor. Ölçüyü
belirleyen tek şey uzak ucun hangi bölgeden adres aldığı ve o bölgeden hangi kuralların yazıldığı.
Tünel bir erişim aracıdır; kapsamı ise bir bölütleme kararıdır ve bölütleme kararı verilmediğinde
varsayılan kapsam en geniş olanıdır.

Yerleşimlerin bedeli kural satırında görünüyor ama bir kalem daha var ve tabloda yok: uzak ucun
hangi sınıfa ait olduğunun her oturumda belirlenmesi gerekiyor. İç bölgeye inen düzende bu soru hiç
sorulmaz. Rol başına bölge düzeninde her oturumda bir eşleme yapılır ve eşlemenin dayandığı bilgi
ucun kendi ilan ettiği bir şey değil, doğrulamanın döndürdüğü bir özelliktir. Dört kural satırının
gerçek maliyeti bu eşlemenin bakımıdır: sınıf değiştiren bir uç, kural değişmeden kapsam değiştirir.

#### Bölünmüş Tünel ve Doğrulamanın Kapsamı

```js
// kosum2.mjs — tam tunel ile bolunmus tunel: yogunlastirici yuku, denetim disi baglanti ve dogrulamanin kapsami
import { UC, OTURUM_SAAT, topla } from './tunel.mjs';

console.log(`${'uc sinifi'.padEnd(14)} ${'uc'.padStart(3)} ${'oturum'.padStart(6)} ${'kurum hedefli'.padStart(13)} ` +
  `${'dis hedefli'.padStart(11)} ${'tam tunel'.padStart(9)} ${'bolunmus'.padStart(8)} ${'oturum basina kanitsiz'.padStart(22)}`);
for (const [ad, uc, kurum, dis, oturum] of UC)
  console.log(`${ad.padEnd(14)} ${String(uc).padStart(3)} ${String(oturum).padStart(6)} ${String(kurum).padStart(13)} ` +
    `${String(dis).padStart(11)} ${String(kurum + dis).padStart(9)} ${String(kurum).padStart(8)} ` +
    `${(kurum / oturum).toFixed(1).padStart(22)}`);
const [uc, kurum, dis, oturum] = [topla(1), topla(2), topla(3), topla(4)];
console.log(`\n${'olcu'.padEnd(38)} ${'tam tunel'.padStart(10)} ${'bolunmus tunel'.padStart(14)}`);
for (const [ad, tam, bol] of [
  ['yogunlastiricidan gecen baglanti', kurum + dis, kurum],
  ['denetim disinda kalan baglanti', 0, dis],
  ['ayni anda iki agda duran uc', 0, uc],
  ['tek dogrulamayla acilan oturum', oturum, oturum],
  ['bir dogrulamanin kapsadigi saat', OTURUM_SAAT, OTURUM_SAAT],
  ['bir dogrulamanin kapsadigi baglanti', Math.round((kurum + dis) / oturum), Math.round(kurum / oturum)],
]) console.log(`${ad.padEnd(38)} ${String(tam).padStart(10)} ${String(bol).padStart(14)}`);
console.log(`\ntunel dustugunde kesilen baglanti  tam ${kurum + dis}  bolunmus ${kurum}`);
console.log(`donemde ${oturum} dogrulama yapiliyor; ${kurum + dis} baglantinin ozne kimligi bu ${oturum} kanita dayaniyor`);
```

```
uc sinifi       uc oturum kurum hedefli dis hedefli tam tunel bolunmus oturum basina kanitsiz
saha dizustu    40    880         26400        5100     31500    26400                   30.0
evden calisan   25    550         18600       92000    110600    18600                   33.8
tedarikci        6     24           740           0       740      740                   30.8

olcu                                    tam tunel bolunmus tunel
yogunlastiricidan gecen baglanti           142840          45740
denetim disinda kalan baglanti                  0          97100
ayni anda iki agda duran uc                     0             71
tek dogrulamayla acilan oturum               1454           1454
bir dogrulamanin kapsadigi saat                 8              8
bir dogrulamanin kapsadigi baglanti            98             31

tunel dustugunde kesilen baglanti  tam 142840  bolunmus 45740
donemde 1454 dogrulama yapiliyor; 142840 baglantinin ozne kimligi bu 1454 kanita dayaniyor
```

Tam tünel bütün trafiği yoğunlaştırıcıdan geçirir: yüz kırk iki bin sekiz yüz kırk bağlantı,
denetim dışında sıfır. Bölünmüş tünel yalnız kurum hedefli olanı geçirir ve yük kırk beş bine
iner — ama doksan yedi bin yüz bağlantı hiçbir denetimden geçmez. Bu sayının nereden geldiği ikinci
satırda: evden çalışan sınıfının dış hedefli bağlantıları tek başına doksan iki bindir. Bölünmüş
tünelin yükü üçte bire indirmesinin bütün kaynağı, denetimden çıkardığı bu kümedir.

Üçüncü satır bölünmüş tünelin asıl kalemidir. Bölünmüş tünelde yetmiş bir uç aynı anda iki ağda
durur: iç ağdan adres almış hâlde ve doğrudan dış ağa bağlı. İki ağ arasında bir kural kümesi yok;
ucun kendisi iki tarafa da bakan bir düğümdür. Bölge grafiğinde çizilen bütün sınırlar bu yetmiş
bir noktada kesişiyor. Tam tünelde bu sayı sıfırdır — bedeli, dışarıya giden doksan yedi bin
bağlantının da kurumun çıkışından geçmesi ve yoğunlaştırıcının üç kat yük almasıdır.

Son üç satır ölçünün kendisine dönüyor. Dönemde bin dört yüz elli dört doğrulama yapılıyor ve
tünel açıldıktan sonra sekiz saat boyunca yeniden sorulmuyor. Tam tünelde bir doğrulama ortalama
doksan sekiz bağlantıyı, bölünmüş tünelde otuz bir bağlantıyı kanıtlanmış sayıyor. İlk derste
sayılan kırk sekiz iddianın üçü hiçbir neslin kanıtlayamadığı özne kimliğiydi; tünel onu bir kez
kanıtlıyor ve sonraki doksan yedi bağlantı için o tek kanıta yaslanıyor. Kanıt yanlış çıkarsa —
uç başkasının elindeyse — ağ bunu sekiz saat boyunca fark edecek bir yere sahip değildir, çünkü
tünelin içindeki her bağlantı doğrulanmış bir oturumun parçası olarak görünür.

Sütunların ilkinde bir ayrıntı daha var. Oturum başına kanıtsız bağlantı sayısı üç sınıfta da
otuz civarında: otuz, otuz üç virgül sekiz ve otuz virgül sekiz. Sayının sınıflar arasında
değişmemesi, ölçünün uç sayısıyla ya da işin hacmiyle ilgili olmadığını gösteriyor. Belirleyen
şey oturumun uzunluğudur; sekiz saatlik bir oturum, o sürede yapılan her işi tek bir kanıta bağlar.
Oturum süresini yarıya indirmek bu sayıyı da yarıya indirir ve karşılığında doğrulama sayısını
ikiye katlar — bedeli, dönemde bin dört yüz elli dört yerine iki bin dokuz yüz sekiz kez kimlik
sorulmasıdır.

Tünel düştüğünde kesilen bağlantı sütunu bedelin son kalemidir. Yoğunlaştırıcı önceki derste
ölçülen denetim noktalarıyla aynı sınıftandır: bir görünürlük kazancı ile bir kullanılabilirlik
borcunun aynı hamlede alınması. Tam tünelde borç yüz kırk iki bin bağlantı, bölünmüş tünelde kırk
beş bin. Seçim ikisi arasında değil, hangi sayının hangi tarafta yazılacağı üzerinedir.

Siteler arası tünel aynı ölçüyü başka bir ölçekte tekrarlar. Uzaktan erişim tünelinde tek bir uç
bir bölgeye iner; siteler arası tünelde bütün bir ağ iner. Şube ağı ile merkezî bölge arasında
kurulan bir tünel, iki ağı bölge grafiğinde tek bir kenara indirger ve o kenarın hangi kalemleri
kapsadığı yine yazılan kurallara bağlıdır. Kural yazılmadığında iki ağ tek bir düzlük olur; ölçü
yine doğrudan erişilen kalemdir ve şube ağının kalem sayısı bu kez uzak ucun değil, karşı tarafın
kapsamına eklenir.

#### Özet

- Tünel iç bölgeye indiğinde uzak uç 136 kaleme doğrudan, 145 kaleme geçişli erişiyor: 210 kalemlik
  ağın üçte ikisi. Kapsam ucun kim olduğuna değil, indiği bölgeye bağlı.
- Ayrı bir uzak erişim bölgesi 2 kural satırıyla doğrudan erişimi 16'ya, geçişliyi 25'e indiriyor;
  kapsam dışındaki kalem 74'ten 194'e çıkıyor. En yüksek getirili hamle budur.
- Rol başına bölge 2 satır daha ekleyip toplam kapsamı değiştirmiyor: en geniş kapsamı en az uca
  bırakıyor. 71 ucun 46'sı 16 yerine 4 kalem görüyor.
- Bölünmüş tünel yoğunlaştırıcı yükünü 142.840'tan 45.740'a indiriyor; karşılığında 97.100 bağlantı
  hiçbir denetimden geçmiyor ve 71 uç aynı anda iki ağda duruyor.
- Dönemde 1.454 doğrulama yapılıyor ve bir doğrulama 8 saati kapsıyor: tam tünelde ortalama 98,
  bölünmüş tünelde 31 bağlantı tek bir kanıta dayanıyor. Kanıt yanlış çıkarsa ağın bunu sekiz saat
  boyunca fark edeceği bir yer yok.

#### Sonraki Adım

Altı derstir yazılan her savunma sonunda aynı şeye indi: bir kural listesi. Bölge sınırları on beş
satır, uzak erişim bölgeleri dört satır, denetim noktası ve engelleme listeleri kendi satırları.
Bütün bu satırlar tek bir kutuda yan yana durur ve bir paket geldiğinde hepsine birden bakılmaz —
**sırayla** bakılır ve ilk eşleşen kazanır. Sonraki dersin sorusu hangi kuralın yazıldığı değil,
hangisinin önce geldiğidir: bilinen bir akış kümesinde her akış için ilk eşleşen kural bulunur ve
listenin sırası değiştiğinde kaç akışın sonucunun değiştiği sayılır.

### Erişim Denetim Listeleri

Source: https://academia.sh/tr/kurslar/ag-guvenligi/erisim-denetim-listeleri

On kural ve on altı bilinen akış üzerinde kural değerlendirme sırası koşturulur: her akış için ilk eşleşen kural bulunur, aynı liste beş ayrı sırada değerlendirilir ve sıra değişince kaç akışın sonucunun değiştiği sayılır; sertleştirme amaçlı bir taşımanın kaç meşru akışı kestiği ve özgülden genele sıralamanın açtığı yol ölçülür.

Altı derstir yazılan her savunma sonunda aynı şeye indi: bir kural listesi. Bölge sınırları on beş
satır, uzak erişim bölgeleri dört satır, denetim noktası ve engelleme listeleri kendi satırlarını
getirdi. Bu satırlar tek bir kutuda yan yana durur ve bir akış geldiğinde hepsine birden bakılmaz —
sırayla bakılır ve **ilk eşleşen kazanır**.

Bu dersin sorusu hangi kuralın yazıldığı değil, hangisinin önce geldiğidir. Kural metni tek bir
karakter değişmeden, yalnız satırların sırası değiştiğinde aynı akış kümesinin sonuçları
değişebilir. Ölçülen şey budur: bilinen bir akış kümesinde her akış için ilk eşleşen kural bulunur
ve sıra değiştiğinde kaç akışın sonucunun değiştiği sayılır.

- **CS34.** On kural, on altı akış ve bölge adları kurgusal bölgesel ölçüm ağına aittir. Gerçek
  paket akmıyor; ölçülen şey `node` ile kurulan modeldir.
- **CS35.** Eşleşme üç eksende yapılıyor: kaynak bölge, hedef bölge ve hizmet adı. Gerçekte adres
  aralığı, protokol ve kapı da yazılır; eksen sayısını büyütür, sıranın etkisini değiştirmez.
- **CS36.** Akışların meşru olup olmadığı elle işaretlendi ve model boyunca sabittir.
- **CS37.** Kural numaraları operatörün yazdığı sıradır: eski satırlar küçük numaralı, sonradan
  eklenenler büyük. Taşıma, satıra yeni bir numara vermekle modellendi.
- **CS38.** Durum bilgisi ve dönüş yönü modellenmedi; her akış tek yönde değerlendiriliyor.
- **CS39.** Bir akış listedeki her kurala uyabilir; sonucu yalnız ilk eşleşen belirler.

#### Liste ve İlk Eşleşen Kural

Kural listesi bir kerede yazılmadı. En küçük numaralı satır en eskisidir ve yönetim bölgesine her
yere erişim verir; bölütleme dersinde ölçülen satır tam olarak budur. Yüz altmış numaralı satır
sonradan, sertleştirme sırasında eklendi ve yönetim kabuğunu her yerden reddediyor. İkisi aynı
listede duruyor ve ikisi de aynı akışlara uyuyor.

```js
// liste.mjs — numarali kural listesi ve bilinen akis kumesi; model, gercek filtre degil
// [no, kaynak bolge, hedef bolge, hizmet, karar] — '*' o eksende ayrim yok demektir
export const KURAL = [
  [100, 'yonetim', '*', '*', 'izin'],              // en eski satir: yonetim her yere
  [110, '*', 'dmz', 'genel-arayuz', 'izin'],
  [120, 'dmz', 'uygulama', 'uygulama-api', 'izin'],
  [130, 'sube', 'uygulama', 'fatura-api', 'izin'],
  [140, 'saha', 'dmz', 'olcum-alim', 'izin'],
  [150, 'uygulama', 'veri', 'veri-uc', 'izin'],
  [160, '*', '*', 'yonetim-kabugu', 'reddet'],     // sertlestirme sirasinda eklendi
  [170, 'uzak', 'dmz', '*', 'izin'],
  [180, 'veri', 'yedek', 'yedek-uc', 'izin'],
  [190, '*', '*', '*', 'reddet'],                  // varsayilan reddet
];
// [ad, kaynak, hedef, hizmet, mesru mu]
export const AKIS = [
  ['yonetim -> uygulama kabugu', 'yonetim', 'uygulama', 'yonetim-kabugu', true],
  ['yonetim -> veri kabugu', 'yonetim', 'veri', 'yonetim-kabugu', true],
  ['yonetim -> dmz arayuzu', 'yonetim', 'dmz', 'genel-arayuz', true],
  ['sube -> fatura api', 'sube', 'uygulama', 'fatura-api', true],
  ['saha -> olcum alimi', 'saha', 'dmz', 'olcum-alim', true],
  ['dis -> genel arayuz', 'dis', 'dmz', 'genel-arayuz', true],
  ['dmz -> uygulama api', 'dmz', 'uygulama', 'uygulama-api', true],
  ['uygulama -> veri ucu', 'uygulama', 'veri', 'veri-uc', true],
  ['veri -> yedek ucu', 'veri', 'yedek', 'yedek-uc', true],
  ['uzak -> genel arayuz', 'uzak', 'dmz', 'genel-arayuz', true],
  ['uzak -> olcum alimi', 'uzak', 'dmz', 'olcum-alim', true],
  ['saha -> veri ucu (ceyrek sonu)', 'saha', 'veri', 'veri-uc', true],
  ['uzak -> dmz kabugu', 'uzak', 'dmz', 'yonetim-kabugu', false],
  ['sube -> uygulama kabugu', 'sube', 'uygulama', 'yonetim-kabugu', false],
  ['dis -> uygulama api', 'dis', 'uygulama', 'uygulama-api', false],
  ['dmz -> veri ucu', 'dmz', 'veri', 'veri-uc', false],
];
const uyar = (k, a) => (k[1] === '*' || k[1] === a[1]) && (k[2] === '*' || k[2] === a[2]) &&
  (k[3] === '*' || k[3] === a[3]);
export const ilkEslesen = (liste, a) => liste.find((k) => uyar(k, a));
export const karar = (liste, a) => ilkEslesen(liste, a)[4];
export function say(liste) {
  const r = AKIS.map((a) => [a, karar(liste, a)]);
  const n = (f) => r.filter(([a, k]) => f(a, k)).length;
  return { izin: n((a, k) => k === 'izin'), reddet: n((a, k) => k === 'reddet'),
    yanlisKapali: n((a, k) => a[4] && k === 'reddet'), kacan: n((a, k) => !a[4] && k === 'izin') };
}
export const golge = (liste) => liste.filter((k) => !AKIS.some((a) => ilkEslesen(liste, a)[0] === k[0]));
export const tasi = (no, yeni) => [...KURAL].map((k) => (k[0] === no ? [yeni, ...k.slice(1)] : k))
  .sort((a, b) => a[0] - b[0]);
export const jokerSayisi = (k) => k.slice(1, 4).filter((x) => x === '*').length;
export const SIRA = {
  'yazildigi sira': KURAL,
  '160 -> 95': tasi(160, 95),
  '170 -> 105': tasi(170, 105),
  'ozgulden genele': [...KURAL].sort((a, b) => jokerSayisi(a) - jokerSayisi(b) || a[0] - b[0]),
  'ters': [...KURAL].reverse(),
};
export const degisen = (a1, a2) => AKIS.filter((a) => karar(a1, a) !== karar(a2, a));
```

```js
// kosum1.mjs — yazildigi sirada her akis icin ilk eslesen kural ve sonuc
import { KURAL, AKIS, ilkEslesen, karar, say, golge } from './liste.mjs';

console.log(`${KURAL.length} kural, ${AKIS.length} bilinen akis\n`);
console.log(`${'akis'.padEnd(32)} ${'mesru'.padStart(5)} ${'ilk eslesen'.padStart(11)} ${'karar'.padStart(6)}  sonuc`);
for (const a of AKIS) {
  const k = ilkEslesen(KURAL, a), c = karar(KURAL, a);
  const s = a[4] === (c === 'izin') ? 'dogru' : (a[4] ? 'yanlis kapali' : 'kacan');
  console.log(`${a[0].padEnd(32)} ${String(a[4] ? 'evet' : 'hayir').padStart(5)} ${String(k[0]).padStart(11)} ${c.padStart(6)}  ${s}`);
}
const s = say(KURAL);
console.log(`\nizin ${s.izin}, reddet ${s.reddet}, yanlis kapali ${s.yanlisKapali}, kacan ${s.kacan}`);
console.log(`golgede kalan kural: ${golge(KURAL).map((k) => k[0]).join(', ') || 'yok'}`);
const k160 = AKIS.filter((a) => a[3] === 'yonetim-kabugu');
console.log(`\n"yonetim-kabugu" hizmetine bakan ${k160.length} akis ve her birine karar veren kural:`);
for (const a of k160) console.log(`  ${a[0].padEnd(32)} ${ilkEslesen(KURAL, a)[0]} numarali satir -> ${karar(KURAL, a)}`);
```

```
10 kural, 16 bilinen akis

akis                             mesru ilk eslesen  karar  sonuc
yonetim -> uygulama kabugu        evet         100   izin  dogru
yonetim -> veri kabugu            evet         100   izin  dogru
yonetim -> dmz arayuzu            evet         100   izin  dogru
sube -> fatura api                evet         130   izin  dogru
saha -> olcum alimi               evet         140   izin  dogru
dis -> genel arayuz               evet         110   izin  dogru
dmz -> uygulama api               evet         120   izin  dogru
uygulama -> veri ucu              evet         150   izin  dogru
veri -> yedek ucu                 evet         180   izin  dogru
uzak -> genel arayuz              evet         110   izin  dogru
uzak -> olcum alimi               evet         170   izin  dogru
saha -> veri ucu (ceyrek sonu)    evet         190 reddet  yanlis kapali
uzak -> dmz kabugu               hayir         160 reddet  dogru
sube -> uygulama kabugu          hayir         160 reddet  dogru
dis -> uygulama api              hayir         190 reddet  dogru
dmz -> veri ucu                  hayir         190 reddet  dogru

izin 11, reddet 5, yanlis kapali 1, kacan 0
golgede kalan kural: yok

"yonetim-kabugu" hizmetine bakan 4 akis ve her birine karar veren kural:
  yonetim -> uygulama kabugu       100 numarali satir -> izin
  yonetim -> veri kabugu           100 numarali satir -> izin
  uzak -> dmz kabugu               160 numarali satir -> reddet
  sube -> uygulama kabugu          160 numarali satir -> reddet
```

Yazıldığı sırada liste iyi görünüyor: on altı akışın on beşi doğru sonuçlanıyor, tek yanlış kapatma
çeyrek sonu mutabakatıdır — bölütleme dersinde de aynı akış kesilmişti ve yine hiçbir satır ona
bakmıyor. Kaçan akış yok, gölgede kalan kural yok.

Alt liste dersin asıl sorusunu koyuyor. Yönetim kabuğu hizmetine bakan dört akış var ve bunların
ikisine yüz numaralı satır, ikisine yüz altmış numaralı satır karar veriyor. Yüz altmış numaralı
satır "yönetim kabuğunu her yerden reddet" diye yazıldı; metni bunu söylüyor ve denetim
belgesinde de böyle görünüyor. Koşumda yaptığı şey ise "yönetim bölgesi dışındaki her yerden
reddet"tir, çünkü yönetim bölgesinden gelen akışlar ona hiç ulaşmıyor — yüz numaralı satırda
duruyorlar. İki satır çakışıyor ve çakışmayı çözen şey metin değil, numaradır.

Aynı listede ters yönde bir örnek daha var. Uzak erişim bölgesinden ölçüm alımına giden akışa yüz
yetmiş numaralı satır karar veriyor; genel arayüze giden akışa ise yüz on numaralı satır, çünkü o
önce geliyor ve kaynak ekseninde joker taşıyor. İki akış da izin alıyor, sonuç aynı — ama kararı
veren satırlar farklı. Bir denetim kaydında "hangi kural izin verdi" sorusunun cevabı, kuralı yazan
kişinin beklediği satır olmayabilir. Yüz yetmiş numaralı satırı kaldıran biri, uzak erişimin genel
arayüze ulaşmaya devam ettiğini görüp değişikliğin etkisiz olduğunu düşünebilir; ölçüm alımı akışı
o sırada zaten kesilmiştir.

#### Sıra Değişince

```js
// kosum2.mjs — ayni kural kumesi bes sirada; sira degisince kac akisin sonucu degisiyor
import { KURAL, AKIS, SIRA, karar, say, golge, degisen } from './liste.mjs';

console.log(`${'sira'.padEnd(17)} ${'izin'.padStart(4)} ${'reddet'.padStart(6)} ${'yanlis kapali'.padStart(13)} ` +
  `${'kacan'.padStart(5)} ${'degisen akis'.padStart(12)} ${'golgede kural'.padStart(13)}`);
for (const [ad, liste] of Object.entries(SIRA)) {
  const s = say(liste), g = golge(liste);
  console.log(`${ad.padEnd(17)} ${String(s.izin).padStart(4)} ${String(s.reddet).padStart(6)} ${String(s.yanlisKapali).padStart(13)} ` +
    `${String(s.kacan).padStart(5)} ${String(degisen(KURAL, liste).length).padStart(12)} ${(g.map((k) => k[0]).join(',') || '-').padStart(13)}`);
}
for (const ad of ['160 -> 95', 'ozgulden genele']) {
  console.log(`\n"${ad}" sirasinda sonucu degisen akislar:`);
  for (const a of degisen(KURAL, SIRA[ad]))
    console.log(`  ${a[0].padEnd(32)} ${karar(KURAL, a)} -> ${karar(SIRA[ad], a)}  (mesru: ${a[4] ? 'evet' : 'hayir'})`);
}
console.log(`\nkural metni ${KURAL.length} satirda hic degismedi; degisen tek sey siradir`);
const O = KURAL.filter((k) => k[0] !== 190);      // varsayilan reddet her izin satiriyla catisir, disarida
const cift = O.flatMap((a, i) => O.slice(i + 1).filter((b) =>
  AKIS.some((x) => [a, b].every((k) => (k[1] === '*' || k[1] === x[1]) && (k[2] === '*' || k[2] === x[2]) &&
    (k[3] === '*' || k[3] === x[3]))) && a[4] !== b[4]).map((b) => [a[0], b[0]]));
console.log(`varsayilan reddet disinda, ayni akista eslesip farkli karar veren cift: ${cift.map(([a, b]) => `${a}/${b}`).join(', ')}`);
```

```
sira              izin reddet yanlis kapali kacan degisen akis golgede kural
yazildigi sira      11      5             1     0            0             -
160 -> 95            9      7             3     0            2             -
170 -> 105          12      4             1     1            1             -
ozgulden genele     12      4             1     1            1             -
ters                 0     16            12     0           11 180,170,160,150,140,130,120,110,100

"160 -> 95" sirasinda sonucu degisen akislar:
  yonetim -> uygulama kabugu       izin -> reddet  (mesru: evet)
  yonetim -> veri kabugu           izin -> reddet  (mesru: evet)

"ozgulden genele" sirasinda sonucu degisen akislar:
  uzak -> dmz kabugu               reddet -> izin  (mesru: hayir)

kural metni 10 satirda hic degismedi; degisen tek sey siradir
varsayilan reddet disinda, ayni akista eslesip farkli karar veren cift: 100/160, 160/170
```

İkinci satır sertleştirme sezgisinin sonucudur. Yönetim kabuğunu reddeden satır listenin başına
taşınıyor; artık gerçekten her yerden reddediyor. Yanlış kapatma birden üçe çıkıyor ve değişen iki
akışın ikisi de meşrudur: yönetim bölgesinden uygulama ve veri bölgelerine giden kabuk oturumları.
Hamle metinde bir düzeltmedir, koşumda yönetim erişiminin kesilmesidir. Kesintinin ne zaman fark
edileceği de belirlidir — bir sonraki bakım penceresinde.

Üçüncü ve dördüncü satırlar ters yönde aynı şeyi yapıyor. "Özgül kural önce, genel kural sonra"
yaygın bir sıralama sezgisidir ve burada koşturulduğunda kaçan akış sıfırdan bire çıkıyor. Neden
son satırdaki çift listesinde: yüz altmış numaralı reddet satırı iki eksende joker taşır, yüz
yetmiş numaralı izin satırı bir eksende. Özgüllüğe göre sıralayan bir düzen izin satırını öne
alır ve uzak erişim bölgesinden yönetim kabuğuna giden akış geçer. Aynı sonuç yüz yetmişi elle öne
taşımakla da çıkıyor; iki hamle farklı gerekçelere sahip, sonuçları aynı.

Beşinci satır sınırdır. Liste ters çevrildiğinde varsayılan reddet başa geçiyor, on altı akışın
tamamı reddediliyor ve dokuz kural gölgede kalıyor. Gölge sütunu bu yüzden bir sağlık ölçüsüdür:
hiçbir akışa karar vermeyen bir kural ya gereksizdir ya da önündeki bir satır tarafından
örtülmüştür. İkisi farklı şeylerdir ve liste metnine bakarak ayırt edilemez; ayırt eden şey akış
kümesi üzerindeki koşumdur.

İki taşıma hamlesi bir arada okunduğunda dersin ölçüsü ortaya çıkıyor. Yüz altmışı öne almak iki
meşru akışı kesti, yüz yetmişi öne almak bir gayrimeşru akışı geçirdi. İkisi de tek satırlık
değişikliklerdi, ikisinin de gerekçesi makuldü ve ikisi de listenin metnine bakılarak
değerlendirilemezdi. Ölçülebilir hâle gelmelerinin tek yolu bilinen bir akış kümesini iki sırada
koşturup sonuçları karşılaştırmaktı: değişen akış sütunu sırasıyla iki ve bir yazıyor. Bu sütun
olmadan yapılan her sıralama değişikliği, sonucu bir sonraki arıza kaydından öğrenilen bir
değişikliktir.

Son satır çakışan iki çifti veriyor: yüz ile yüz altmış, yüz altmış ile yüz yetmiş. On kurallık
bir listede sıraya duyarlı olan yalnız bu iki çifttir ve ikisinin ortasında aynı satır durur.
Kural sayısı büyüdükçe çift sayısı hızla büyür; sıranın etkisi tek tek satırlara bakarak değil,
bilinen bir akış kümesini koşturarak ölçülür.

Konunun ölçüsü burada tamamlanıyor. Yedi derste sayılan her savunma sonunda bir alana bakıyordu:
kaynak bölge, hedef bölge, hizmet adı, özne kimliği. Bu alanların hepsi birer iddiadır ve ilk
derste hangilerinin kanıtlanabildiği sayılmıştı. Kural listesi o iddiaları kullanır ama kanıtlamaz;
kaynak bölge alanına yazılan değer, paketin gerçekten o bölgeden geldiğinin kanıtı değil,
geldiği yönün beklenen bloğuna uyduğunun kanıtıdır. Sıralama tartışması bu yüzden bir kat daha
derindir: liste yalnız hangi kuralın kazanacağını değil, hangi iddianın hiç sınanmayacağını da
belirler. Bir akış yüz numaralı satırda dururken hizmet ekseni hiç okunmaz.

#### Özet

- Yazıldığı sırada 16 akışın 15'i doğru sonuçlanıyor; tek yanlış kapatma bölütleme dersinde de
  kesilen çeyrek sonu mutabakatıdır ve yine hiçbir satır ona bakmıyor.
- "Yönetim kabuğunu her yerden reddet" diye yazılan satır, koşumda "yönetim bölgesi dışındaki her
  yerden reddet" anlamına geliyor: 4 kabuk akışının 2'sine ondan önceki satır karar veriyor.
- O satırı listenin başına taşımak metinde bir düzeltmedir; koşumda 2 meşru yönetim akışını kesip
  yanlış kapatmayı 1'den 3'e çıkarıyor.
- "Özgül önce, genel sonra" sıralaması kaçanı 0'dan 1'e çıkarıyor: reddet satırı 2 joker, izin
  satırı 1 joker taşıdığı için izin öne geçiyor ve uzak erişim bölgesinden yönetim kabuğuna giden
  akış geçiyor.
- Liste ters çevrildiğinde 16 akışın tamamı reddediliyor ve 9 kural gölgede kalıyor. Kural metni
  hiçbir sırada değişmedi; değişen tek şey sıradır ve sıraya duyarlı çift 10 kuralda 2 tanedir.

#### Sonraki Adım

Yedi ders boyunca çevre çizildi, bölgeler ayrıldı, denetim noktaları kondu ve kurallar sıraya
dizildi. Bölge grafiğinde kapanan yol sayıldı, tünelin indiği bölge ölçüldü, ilk eşleşen kural
akış akış bulundu. Bütün bu sınırların ortak bir özelliği vardı ve hiçbir yerde yazılmadı: hepsi
**kablonun** sınırıydı. Bir bölgeye ait olmak, o bölgenin anahtarına bağlı bir kablonun ucunda
bulunmak demekti; kural listesindeki kaynak bölge alanı da bu varsayıma dayanıyordu. Sinyal binanın
duvarında durmuyor. Sonraki konu `Kablosuz Güvenlik`: erişim noktasının kapsama alanı bina
sınırının ne kadar dışına taşıyor, hangi iddia havada doğrulanabiliyor ve bir bölgeye ait olmak
kablo olmadığında neye dayanıyor.

## Kablosuz Güvenlik

Kablonun bittiği yerde iddiaların ne kadarının kanıtlanabildiği: şifreleme kuşaklarının kanıtladığı ve açık bıraktığı iddia ile geçişte dışarıda kalan aygıt, paylaşılan tek sır ile kişi başına kimliğin güven kökü ve iptal adımı cinsinden farkı, ikiz erişim noktasında istemcinin doğrulayamadığı iddia ve karşılıklı doğrulamanın kapattığı yol, korumalı yönetim çerçevelerinin kapattığı ve açık bıraktığı çerçeve türü, kapsama haritasında sinyalin bina sınırından taştığı alan ile yetkisiz cihaz taramasının bulduğu ve bulamadığı kalem.

### Kablosuz Şifreleme Kuşakları

Source: https://academia.sh/tr/kurslar/ag-guvenligi/kablosuz-sifreleme-kusaklari

Dört kablosuz şifreleme kuşağı aynı on iddialık küme üzerinde ölçülür: akış şifresine dayanan eski kuşak on iddianın hiçbirini kanıtlamıyor, blok şifresini sayaç kipinde kullanan kuşak beşini kanıtlıyor, eşzamanlı kimlik doğrulama kuşağı yediye çıkarıyor. Geçişin bedeli aygıt envanterinde sayılır: en üst kuşak zorunlu tutulduğunda dört bin beş yüz kırk aygıtın dört bin üç yüz yirmi biri dışarıda kalıyor.

Bir önceki konu çevreyi çizdi: bölgeler ayrıldı, denetim noktaları kondu ve kurallar sıraya
girdi. Bütün o sınırların ortak bir dayanağı vardı — bir mesajın belirli bir kablodan girmiş
olması. Kablosuz katmanda bu dayanak yoktur. Sinyal binanın duvarında durmaz; bir çerçeveyi
alan aygıtın bina içinde mi dışında mı olduğu, çerçevenin kendisinden okunamaz.

O yüzden bu konuda kablonun yaptığı işi şifreleme yapar. Kuşaklar arasındaki fark bir hız ya da
uyumluluk farkı değildir; **hangi iddianın kanıtlanabildiği** farkıdır. Bu ders dört kuşağı
kuşak adlarıyla değil taşıdıkları özellikle anar ve hepsini aynı on iddialık küme üzerinde
koşturur: kaçı kanıtlanıyor, kaçı açık kalıyor, yükseltmenin bedeli kaç aygıt.

- **KG1.** Kurgu bölgesel ölçüm ağı kablosuz tarafıyla ele alınır: şube ağları, saha ekiplerinin
  el terminalleri ve sayaç uçlarının bağlandığı toplayıcı ağ. Gerçek bir ağ kurulmuyor, gerçek ağ
  adı ve konum yazılmıyor; ölçülen şey `node` ile kurulan modeldir.
- **KG2.** İddia, bir bağlantı kurulurken taraflardan birinin öne sürdüğü ve karşı tarafın kabul
  ettiği önermedir. Üç değer alır: kanıtı var, kanıtı zayıf (sonlu bir işle bozulabiliyor), kanıtı
  yok.
- **KG3.** Kuşaklar dört sınıfa indirgenir: akış şifresini sabit anahtarla ve kısa bir sayaçla
  karıştıran eski kuşak; aynı akış şifresini koruyup her çerçeveye ayrı anahtar türeten geçiş
  kuşağı; blok şifresini sayaç kipinde kullanıp bütünlüğü aynı anahtarla doğrulayan kuşak; ortak
  sırdan her oturumda taze anahtar üreten eşzamanlı kimlik doğrulama kuşağı.
- **KG4.** Aygıt envanteri kurgudur; her sınıfın desteklediği en üst kuşak model kararıdır.
- **KG5.** Çevrimdışı deneme hızı kurgu bir model sabitidir ve donanıma bağlı olarak değişir;
  karşılaştırma mutlak süre için değil, iki kuşak arasındaki oran için yapılır.
- **KG6.** Kuşakların taşıdığı iddialar burada yalnız **doğrulama** ekseninde ele alınır; şifreleme
  algoritmalarının kendisi M24/K04'ün konusudur.

#### Bir Bağlantının Taşıdığı İddialar

Bir aygıt bir kablosuz ağa bağlanırken tek bir soru sormaz. On ayrı önerme kabul eder ve
bunların çoğunu sormadan kabul eder.

```js
// kusak.mjs — kablosuz kusaklarin iddia tablosu (model). Kusaklar ada gore degil,
// tasidiklari ozellige gore anilir. Kurgu bolgesel olcum agi; gercek ag kurulmuyor.
export const KUSAK = [
  ['akis-sifresi-kisa-sayac', 'akis sifresini sabit anahtarla ve kisa bir sayacla karistiran kusak'],
  ['akis-sifresi-cerceve-anahtari', 'ayni akis sifresini koruyup her cerceveye ayri anahtar tureten kusak'],
  ['blok-sifresi-sayac-kipi', 'blok sifresini sayac kipinde kullanip butunlugu ayni anahtarla dogrulayan kusak'],
  ['eszamanli-kimlik-dogrulama', 'ortak sirdan her oturumda taze anahtar ureten eszamanli kimlik dogrulama kusagi'],
];
// Bir baglanti kurulurken tasinan iddialar. Deger: 2 = kanit var, 1 = kanit zayif
// (sonlu is ile bozulabiliyor), 0 = hicbir kanit yok.
export const IDDIA = [
  ['ag adi dogru',            [0, 0, 0, 0]],
  ['istemci sirri biliyor',   [1, 2, 2, 2]],
  ['erisim noktasi sirri biliyor', [0, 1, 2, 2]],
  ['cerceve icerigi degismedi', [1, 1, 2, 2]],
  ['cerceve tekrar degil',    [0, 2, 2, 2]],
  ['anahtar bu oturuma ozel', [0, 1, 2, 2]],
  ['gecmis trafik acilamaz',  [0, 0, 0, 2]],
  ['yonetim cercevesi agdan geldi', [0, 0, 0, 1]],
  ['parola cevrimdisi denenemez', [0, 0, 0, 2]],
  ['kaynak adresi dogru',     [0, 0, 0, 0]],
];
// Kurgu olcum aginda aygit siniflari: [sinif, adet, destekledigi en ust kusak (indis)]
export const AYGIT = [
  ['sayac ucu (eski seri)', 1840, 0],
  ['sayac ucu (yeni seri)', 2260, 2],
  ['saha el terminali', 145, 2],
  ['saha el terminali (eski)', 38, 1],
  ['sube dizustu', 210, 3],
  ['barkod yazicisi', 26, 1],
  ['pano ekrani', 12, 2],
  ['bakim dizustu', 9, 3],
];
```

```js
// kosum1.mjs — her kusak kac iddiayi kanitliyor, kaci acik kaliyor
import { KUSAK, IDDIA } from './kusak.mjs';

const G = ['yok', 'zayif', 'var'];
const E = [32, 8, 8, 8, 8];
const yaz = (h) => h.map((d, i) => String(d)[i ? 'padStart' : 'padEnd'](E[i])).join('');
console.log(yaz(['iddia', 'kusak1', 'kusak2', 'kusak3', 'kusak4']));
for (const [ad, d] of IDDIA) console.log(yaz([ad, ...d.map((v) => G[v])]));
const say = (k, v) => IDDIA.filter(([, d]) => d[k] === v).length;
const S = [34, 12, 8, 10, 12];
const yaz2 = (h) => h.map((d, i) => String(d)[i ? 'padStart' : 'padEnd'](S[i])).join('');
console.log('\n' + yaz2(['kusak', 'kanitlanan', 'zayif', 'kanitsiz', 'acik iddia']));
KUSAK.forEach(([ad], k) =>
  console.log(yaz2([ad, say(k, 2), say(k, 1), say(k, 0), say(k, 1) + say(k, 0)])));
```

```
iddia                             kusak1  kusak2  kusak3  kusak4
ag adi dogru                         yok     yok     yok     yok
istemci sirri biliyor              zayif     var     var     var
erisim noktasi sirri biliyor         yok   zayif     var     var
cerceve icerigi degismedi          zayif   zayif     var     var
cerceve tekrar degil                 yok     var     var     var
anahtar bu oturuma ozel              yok   zayif     var     var
gecmis trafik acilamaz               yok     yok     yok     var
yonetim cercevesi agdan geldi        yok     yok     yok   zayif
parola cevrimdisi denenemez          yok     yok     yok     var
kaynak adresi dogru                  yok     yok     yok     yok

kusak                               kanitlanan   zayif  kanitsiz  acik iddia
akis-sifresi-kisa-sayac                      0       2         8          10
akis-sifresi-cerceve-anahtari                2       3         5           8
blok-sifresi-sayac-kipi                      5       0         5           5
eszamanli-kimlik-dogrulama                   7       1         2           3
```

İlk satırdaki sayı bu konunun başlangıç noktasıdır: eski kuşak on iddianın **hiçbirini**
kanıtlamıyor. İki iddiada zayıf bir kanıt var, sekizinde hiç yok. Zayıf olan ikisi de aynı
nedenle zayıf: çerçeve başına değişen sayaç kısa olduğu için yeterli sayıda çerçeve
biriktiğinde aynı değer tekrar eder ve tekrar eden değer hem içeriği hem de bütünlük toplamını
çözülebilir kılar. Bu kuşağın sorunu şifrelemenin varlığı değil, kanıtın **sonlu bir işle**
tükenmesidir.

Geçiş kuşağı iki iddiayı kanıta bağlıyor ve üçünü zayıf bırakıyor. Kazanılan asıl kalem tekrar
korumasıdır: sıra sayacı eklendiği için daha önce görülmüş bir çerçevenin yeniden oynatılması
reddedilir. Ama akış şifresi yerinde kaldığı için bütünlük ve oturum ayrımı hâlâ türetilmiş bir
karıştırma işlemine dayanır; kanıt vardır, tam değildir.

Üçüncü kuşak beş iddiayı kanıta bağlıyor ve zayıf sütununu **sıfırlıyor**. Bu tablo okumasının
en önemli yeri burasıdır: zayıf kanıt ortadan kalkıyor ama kanıtsız iddia sayısı beşten beşe,
yani hiç değişmiyor. Şifrelemenin güçlenmesi, kanıtı **olmayan** iddiayı kanıtlı yapmaz.

#### Kapanmayan İki İddia

Dördüncü kuşak yedi iddiayı kanıta bağlıyor ve tablonun iki satırı **dört sütunda da** boş
kalıyor: ağ adının doğruluğu ve kaynak adresinin doğruluğu.

Bunlar rastgele seçilmiş iddialar değildir. Ağ adı, erişim noktasının kendi hakkında yaptığı bir
bildirimdir ve bağlantı kurulmadan, yani herhangi bir anahtar devreye girmeden önce yayılır.
Şifreleme bağlantıdan sonra başlar; bağlantıdan önceki bildirimi hiçbir kuşak imzalamaz. Kaynak
adresi de aynı yerdedir: çerçeve başlığındaki adres alanı şifrelenmez, çünkü çerçevenin doğru
alıcıya ulaşması için okunabilir olması gerekir.

İki satır bu konunun geri kalanını belirliyor. Üçüncü ders ağ adı iddiasını, dördüncü ders
yönetim çerçevesi iddiasını ölçecek — ikisi de şifreleme kuşağının dışında kalan iddialardır ve
kuşak yükseltmek ikisini de kapatmaz.

Dördüncü kuşağın kazandırdığı iki kalem ise ayrı bir sınıftandır. **Geçmiş trafiğin açılamaması**,
ortak sır sonradan öğrenilse bile daha önce kaydedilmiş oturumların çözülememesi demektir; üç
kuşakta bu iddianın hiçbir kanıtı yoktur, yani bugün kaydedilen trafik yarın öğrenilen parolayla
açılabilir. **Parolanın çevrimdışı denenememesi** ise ölçülebilir bir kalemdir ve aşağıdaki
koşum onu sayıya çeviriyor.

#### Yükseltmenin Bedeli

Kuşak seçmek bir tercih değil, bir envanter kararıdır. Zorunlu tutulan en düşük kuşak, o kuşağı
desteklemeyen her aygıtı ağın dışında bırakır.

```js
// kosum2.mjs — kusak yukseltmesinin bedeli: disarida kalan aygit ve cevrimdisi deneme direnci
import { KUSAK, IDDIA, AYGIT } from './kusak.mjs';

const TOPLAM = AYGIT.reduce((s, [, n]) => s + n, 0);
const acik = (k) => IDDIA.filter(([, d]) => d[k] < 2).length;
const E = [34, 10, 12, 10, 12];
const yaz = (h) => h.map((d, i) => String(d)[i ? 'padStart' : 'padEnd'](E[i])).join('');
console.log(`aygit ${TOPLAM}, sinif ${AYGIT.length}`);
console.log(yaz(['en dusuk zorunlu kusak', 'baglanan', 'disarida', 'sinif', 'acik iddia']));
KUSAK.forEach(([ad], k) => {
  const dis = AYGIT.filter(([, , m]) => m < k);
  console.log(yaz([ad, TOPLAM - dis.reduce((s, [, n]) => s + n, 0),
    dis.reduce((s, [, n]) => s + n, 0), dis.length, acik(k)]));
});
console.log('\ndisarida kalan siniflar (en ust kusak zorunlu tutulursa):');
for (const [ad, n, m] of AYGIT.filter(([, , m]) => m < KUSAK.length - 1))
  console.log(`  ${ad.padEnd(26)}${String(n).padStart(6)}  en ust destek: kusak${m + 1}`);

// Cevrimdisi deneme direnci. Hiz kurgu model sabitidir; gercek deger donanima baglidir.
// Kusak 1-3: yakalanan el sikismadan aday parola ag ile konusmadan denenebilir.
// Kusak 4: her deneme ag ile bir tur ister; erisim noktasi hizi sinirlar.
const CEVRIMDISI = 400000, CEVRIMICI = 3, YIL = 365 * 24 * 3600;
const sure = (u, h) => u / h / YIL;
const bicim = (y) => y < 1 ? `${(y * 365).toFixed(1)} gun` :
  y < 1e6 ? `${y.toFixed(0)} yil` : `${y.toExponential(1)} yil`;
const P = [30, 14, 18, 18];
const yaz2 = (h) => h.map((d, i) => String(d)[i ? 'padStart' : 'padEnd'](P[i])).join('');
console.log('\n' + yaz2(['ortak sir bilesimi', 'aday sayisi', 'cevrimdisi', 'ag ile tur']));
for (const [ad, u] of [['8 kucuk harf', 26 ** 8], ['10 harf ve rakam', 36 ** 10],
  ['12 harf, rakam, imle', 72 ** 12], ['dort sozcuk (7776 sozluk)', 7776 ** 4]])
  console.log(yaz2([ad, u.toExponential(1), bicim(sure(u, CEVRIMDISI)), bicim(sure(u, CEVRIMICI))]));
```

```
aygit 4540, sinif 8
en dusuk zorunlu kusak              baglanan    disarida     sinif  acik iddia
akis-sifresi-kisa-sayac                 4540           0         0          10
akis-sifresi-cerceve-anahtari           2700        1840         1           8
blok-sifresi-sayac-kipi                 2636        1904         3           5
eszamanli-kimlik-dogrulama               219        4321         6           3

disarida kalan siniflar (en ust kusak zorunlu tutulursa):
  sayac ucu (eski seri)       1840  en ust destek: kusak1
  sayac ucu (yeni seri)       2260  en ust destek: kusak3
  saha el terminali            145  en ust destek: kusak3
  saha el terminali (eski)      38  en ust destek: kusak2
  barkod yazicisi               26  en ust destek: kusak2
  pano ekrani                   12  en ust destek: kusak3

ortak sir bilesimi               aday sayisi        cevrimdisi        ag ile tur
8 kucuk harf                         2.1e+11           6.0 gun          2207 yil
10 harf ve rakam                     3.7e+15           290 yil        3.9e+7 yil
12 harf, rakam, imle                 1.9e+22        1.5e+9 yil       2.1e+14 yil
dort sozcuk (7776 sozluk)            3.7e+15           290 yil        3.9e+7 yil
```

Birinci tablonun iki sütunu bu dersin kararını veriyor. Üçüncü kuşak zorunlu tutulduğunda dört
bin beş yüz kırk aygıtın **bin dokuz yüz dördü** dışarıda kalıyor ve açık iddia ondan beşe
iniyor. Dördüncü kuşak zorunlu tutulduğunda açık iddia üçe iniyor, ama bağlanabilen aygıt
**iki yüz on dokuza** düşüyor: sayaç uçlarının tamamı, saha terminallerinin tamamı ve pano
ekranları dışarıda kalıyor.

İkinci sütun tek başına okunduğunda karar veremez. En üst kuşağa geçmek iki açık iddia daha
kapatıyor; karşılığında dört bin üç yüz yirmi bir aygıt yerine yenisi konmadan ağ çalışmıyor.
Bu, ağ kararı değil bütçe kararıdır ve o yüzden gerçek kurumlarda genellikle üçüncü satır
seçilir: kabul edilebilir aygıt kaybı karşılığında zayıf kanıtın sıfırlanması.

Tablonun sessiz bir varsayımı var: her satır **tek** bir kuşağın zorunlu tutulduğunu kabul
ediyor. Aygıt kaybını görmemek için sık başvurulan çözüm, erişim noktasını iki kuşağı birden
kabul edecek biçimde bırakmaktır. O durumda hiçbir aygıt dışarıda kalmaz, ama açık iddia sayısı
üst kuşağın değil **alt kuşağın** sayısıdır: bir istemci hangi kuşakla bağlanacağını kendisi
seçer ve kabul edilen en düşük kuşak, ağdaki her bağlantı için erişilebilir bir seçenektir. İki
kuşağı birlikte kabul eden bir ağın ölçüsü beş değil ondur; tablodaki ilk satır o ağın satırıdır.

Ölçüm ikinci bir şeyi göstermiyor: dışarıda kalan aygıtların nereye gittiğini. Uygulamada bunlar
silinmez, **ayrı bir ağa** taşınır. O ağ birinci ya da ikinci kuşakla çalışır, yani kendi
sütunundaki açık iddia sayısını taşır. Bin sekiz yüz kırk sayaç ucu için açılan ikinci ağ, on
açık iddialık bir bağlantıyı kurumda tutar; kazanılan beş iddia, o aygıtların olduğu yerde
kazanılmaz. Doğru okuma budur: yükseltme açık iddiayı azaltmaz, **açık iddiayı bir bölgeye
taşır** — ve o bölgenin nasıl ayrılacağı bir önceki konunun bölütleme sorusudur.

#### Çevrimdışı Denemenin Ölçüsü

İkinci tablo dördüncü kuşağın en somut kalemini sayıyor. İlk üç kuşakta, bağlantı kurulurken
alışverilen mesajlar kaydedilebilirse aday ortak sırlar ağla hiç konuşmadan denenebilir: deneme
sayısı ağın değil, denemeyi yapan tarafın işlem gücüyle sınırlıdır. Dördüncü kuşakta her deneme
ağla bir tur gerektirir, yani sınır erişim noktasının kabul ettiği hızdır.

Fark sayıda görülüyor. Sekiz küçük harflik bir ortak sır çevrimdışı **altı günde** tükeniyor;
aynı sır ağla tur gerektirdiğinde iki bin iki yüz yıl sürüyor. Aradaki oran, model sabitlerinin
oranıdır: saniyede dört yüz bine karşı saniyede üç.

Alt iki satır ikinci bir kararı veriyor. On karakterlik harf ve rakam bileşimi ile dört sözcüklük
bir dizi **aynı** aday sayısını veriyor — üç virgül yedi çarpı on üzeri on beş — ve ikisi de
çevrimdışı iki yüz doksan yıl dayanıyor. Aynı direnç iki farklı biçimde elde edilebiliyor;
hangisinin seçileceği güvenlik değil, aygıta yazılabilirlik sorusudur. On iki karakterlik geniş
bileşim çevrimdışı denemeyi zaten anlamsız kılıyor, ama bir sayaç ucuna elle girilecek dizi
olarak da en pahalısı.

Buradan çıkan kural şudur: ilk üç kuşakta ortak sırrın uzunluğu bir yapılandırma tercihi değil,
**tek savunma hattıdır**. Dördüncü kuşakta aynı sır kısa olsa bile çevrimdışı denenemez; kuşağın
kazandırdığı asıl şey, kullanıcı seçimindeki zayıflığı protokolün taşımasıdır.

#### Özet

- Bir kablosuz bağlantı on iddia taşıyor. Akış şifresini kısa bir sayaçla karıştıran eski kuşak
  bunların **hiçbirini** kanıtlamıyor: iki zayıf kanıt, sekiz kanıtsız iddia.
- Blok şifresini sayaç kipinde kullanan kuşak zayıf kanıt sütununu sıfırlıyor ve beş iddiayı
  kanıta bağlıyor; kanıtsız iddia sayısı beşte kalıyor. Şifrelemenin güçlenmesi, kanıtı olmayan
  iddiayı kanıtlı yapmıyor.
- Ağ adının ve kaynak adresinin doğruluğu **dört kuşakta da** kanıtsız kalıyor; ikisi de bağlantı
  kurulmadan önce ya da başlıkta açık olarak taşındığı için hiçbir kuşağın kapsamına girmiyor.
- Üçüncü kuşak zorunlu tutulduğunda 4.540 aygıtın 1.904'ü, dördüncü kuşak zorunlu tutulduğunda
  4.321'i dışarıda kalıyor. Dışarıda kalan aygıtlar silinmiyor, ayrı bir ağa taşınıyor — açık
  iddia azalmıyor, yer değiştiriyor.
- Sekiz küçük harflik ortak sır çevrimdışı 6 günde tükeniyor, ağla tur gerektiğinde 2.207 yıl
  dayanıyor. Dört sözcüklük dizi ile on karakterlik harf-rakam bileşimi aynı aday sayısını
  veriyor.

#### Sonraki Adım

Bu ders ortak sırrın uzunluğunu ölçtü ama sırrın **kime ait olduğunu** hiç sormadı. Dört kuşağın
hepsinde tek bir dizi vardı ve o dizi bin sekiz yüz kırk sayaç ucunda, iki yüz on şube
dizüstünde ve kırk üç saha terminalinde aynıydı. Bir kişi ayrıldığında, bir terminal
kaybolduğunda ya da bir sayaç ucu sökülüp alındığında o dizi hâlâ geçerlidir ve onu değiştirmek
her aygıta ayrı ayrı dokunmak demektir. Sonraki dersin sorusu güven kökünün nerede durduğudur:
paylaşılan tek sır kaç kaleme erişim veriyor, kişi başına ayrı kimlik kaç kalemi ayırıyor, bir
kimliği iptal etmek kaç adım sürüyor ve kişi başına kimlik hangi ek altyapı kalemlerini
zorunlu kılıyor.

### Kimlik Doğrulama Yöntemleri

Source: https://academia.sh/tr/kurslar/ag-guvenligi/kimlik-dogrulama-yontemleri

Kişisel ve kurumsal mod güven kökü cinsinden ayrılır: tek paylaşılan sır bir ağda on iki kalemin tamamına erişim veriyor ve değiştirilmesi dört bin beş yüz kırk aygıta dokunmak demek, kişi başına kimlik ortalama iki buçuk kaleme iniyor ve iptal tek adım. Kurumsal mod yedi iddianın altısını kanıta bağlıyor ama bir iddia ekliyor ve onu varsayılan yapılandırmada doğrulamıyor.

Bir önceki ders ortak sırrın uzunluğunu ölçtü ve çevrimdışı denemeye karşı direncini hesapladı.
Sırrın **kime ait olduğu** hiç sorulmadı. Dört kuşağın hepsinde tek bir dizi vardı; o dizi
sayaç uçlarında, şube dizüstülerinde ve saha terminallerinde aynıydı.

Bu ayrım kablosuz kimlik doğrulamanın iki modunu birbirinden ayıran şeydir. **Kişisel modda**
güven kökü tek bir paylaşılan sırdır: onu bilen ağdadır. **Kurumsal modda** güven kökü özne
başına ayrı bir kimliktir ve doğrulamayı merkezî bir kimlik doğrulama sunucusu yapar. Bu ders
ikisini üç sütunda ölçer: bir güven kökü ele geçtiğinde kaç kaleme erişiliyor, iptal etmek kaç
adım sürüyor, ayrımın bedeli kaç altyapı kalemi.

- **KG7.** Kalem, kablosuz ağa bağlandıktan sonra ulaşılabilen bir kaynaktır: bir servis, bir
  depo, bir yönetim arayüzü. Kurgu bölgesel ölçüm ağında on iki kalem tanımlıdır.
- **KG8.** Kişisel modda bir ağın **tek** ortak sırrı vardır. O ağa giren her özne ağın bütün
  kalemlerine ulaşır; kalem ayrımı ancak ağı bölerek, yani ayrı ağ ve ayrı sır açarak yapılır.
- **KG9.** Kurumsal modda yetki kimliğe bağlanır; bir özne yalnız rolünün meşru kalemlerine
  ulaşır. Rollerin kalem eşlemesi model kararıdır.
- **KG10.** Aygıt başına elle yapılandırma dört dakikadır ve yıllık personel devri yüzde on
  dörttür; ikisi de kurgu model sabitidir.
- **KG11.** Ek altyapı kalemlerinin yıllık bakım dokunuşu model değeridir: o kalemin yılda kaç
  kez elle değiştirildiği ya da yenilendiği.
- **KG12.** Kimlik doğrulama sunucusunun iç işleyişi, belirteç mekaniği ve kimlik federasyonu
  bu dersin dışındadır; ölçülen şey yalnız güven kökünün nerede durduğudur.

#### Bir Sırrın Açtığı Kalem

Kişisel modun ölçüsü tek sayıdır: bir sır ele geçtiğinde kaç kaleme ulaşılıyor. O sayıyı
küçültmenin tek yolu ağı bölmektir ve her bölme yeni bir sır demektir.

```js
// mod.mjs — kisisel ve kurumsal modun guven koku modeli. Kurgu bolgesel olcum agi;
// gercek ag adi, gercek konum ve gercek kimlik yazilmiyor.
export const KALEM = ['olcum-deposu', 'toplayici-girisi', 'is-emri-servisi', 'abone-kayit',
  'fatura-vt', 'yapilandirma', 'yonetim-arayuzu', 'pano-yayini', 'yazici-kuyrugu',
  'sube-dosya', 'saha-harita', 'guncelleme-deposu'];
// [rol, ozne sayisi, aygit sayisi, mesru olarak erisilmesi gereken kalem]
export const ROL = [
  ['saha-teknisyeni', 43, 183, ['is-emri-servisi', 'saha-harita', 'abone-kayit']],
  ['sube-personeli', 210, 210, ['is-emri-servisi', 'abone-kayit', 'fatura-vt', 'sube-dosya',
    'yazici-kuyrugu']],
  ['bakim', 9, 9, ['yapilandirma', 'yonetim-arayuzu', 'guncelleme-deposu', 'olcum-deposu']],
  ['pano', 0, 12, ['pano-yayini']],
  ['barkod-yazicisi', 0, 26, ['yazici-kuyrugu']],
  ['sayac-ucu', 0, 4100, ['toplayici-girisi']],
];
// Kisisel modda bir agin bir tek ortak sirri vardir; o aga giren her ozne agin butun
// kalemlerine ulasir. Ag basina rol dagilimi bir tasarim karari olarak verilir.
export const PLAN = [
  ['tek-ag', [['saha-teknisyeni', 'sube-personeli', 'bakim', 'pano', 'barkod-yazicisi',
    'sayac-ucu']]],
  ['uc-ag', [['saha-teknisyeni', 'sube-personeli'], ['bakim', 'pano', 'barkod-yazicisi'],
    ['sayac-ucu']]],
  ['rol-basina-ag', ROL.map(([r]) => [r])],
];
export const kalemleri = (roller) =>
  [...new Set(roller.flatMap((r) => ROL.find(([a]) => a === r)[3]))];
export const aygitlari = (roller) =>
  roller.reduce((s, r) => s + ROL.find(([a]) => a === r)[2], 0);
// Kurumsal modun ek altyapi kalemleri ve her kalemin yillik bakim dokunusu (model).
export const ALTYAPI = [
  ['kimlik dogrulama sunucusu', 2], ['sunucu kimligi ve guven koku', 1],
  ['kimlik deposu baglantisi', 2], ['istemci profili dagitimi', 6],
  ['erisim noktasi paylasilan gizli degeri', 4], ['kimlik iptal listesi', 12],
  ['yedek dogrulama yolu', 2],
];
// Kurumsal modu destekleyen aygit siniflari (model karari).
export const KURUMSAL_DESTEK = ['saha-teknisyeni', 'sube-personeli', 'bakim'];
```

```js
// kosum1.mjs — bir sir sizdiginda erisilen kalem ve o sirri degistirmenin adim sayisi
import { KALEM, ROL, PLAN, kalemleri, aygitlari } from './mod.mjs';

const AYGIT = ROL.reduce((s, [, , n]) => s + n, 0);
const ELLE = 4;                       // aygit basina elle yapilandirma dakikasi (model sabiti)
const E = [16, 8, 16, 14, 16, 14];
const yaz = (h) => h.map((d, i) => String(d)[i ? 'padStart' : 'padEnd'](E[i])).join('');
console.log(`kalem ${KALEM.length}, rol ${ROL.length}, aygit ${AYGIT}`);
console.log(yaz(['kisisel mod plani', 'sir', 'en genis kalem', 'ort. kalem', 'en cok aygit',
  'sir degisimi']));
for (const [ad, aglar] of PLAN) {
  const kalem = aglar.map((g) => kalemleri(g).length);
  const aygit = aglar.map((g) => aygitlari(g));
  console.log(yaz([ad, aglar.length, Math.max(...kalem),
    (kalem.reduce((a, b) => a + b, 0) / aglar.length).toFixed(1), Math.max(...aygit),
    `${Math.max(...aygit) * ELLE} dk`]));
}
// Kurumsal mod: kimlik ozne basinadir, yetki kimlige baglidir.
const kurumsal = ROL.map(([r, , , k]) => k.length);
console.log(yaz(['kurumsal mod', ROL.reduce((s, [, o, a]) => s + (o || a), 0),
  Math.max(...kurumsal), (kurumsal.reduce((a, b) => a + b, 0) / ROL.length).toFixed(1), 1,
  `${ELLE} dk`]));
```

```
kalem 12, rol 6, aygit 4540
kisisel mod plani     sir  en genis kalem    ort. kalem    en cok aygit  sir degisimi
tek-ag                 1              12          12.0            4540      18160 dk
uc-ag                  3               6           4.3            4100      16400 dk
rol-basina-ag          6               5           2.5            4100      16400 dk
kurumsal mod        4400               5           2.5               1          4 dk
```

Birinci satır kişisel modun en yalın biçimidir: tek ağ, tek sır, on iki kalem. Ele geçen bir
sır ağın tamamını açar; kalemler arasında hiçbir ayrım yoktur, çünkü ayrımı yapacak bir kimlik
yoktur.

Ağı bölmek işe yarıyor. Üç ağa çıkıldığında en geniş sır on iki yerine altı kalem açıyor,
ortalama dört virgül üçe iniyor. Rol başına ağ açıldığında ortalama iki virgül beş, yani
kurumsal modla **aynı** değer elde ediliyor. Bu satır dersin ilk sürprizidir: kalem ayrımı için
kurumsal mod gerekmiyor, ağı yeterince bölmek aynı ayrımı veriyor.

Fark son iki sütunda. Rol başına ağ altı ayrı yayın, altı ayrı sır ve her erişim noktasında altı
ayrı yapılandırma demektir; bunların hiçbiri kalem sayısında görünmez. Asıl fark ise **sır
değişimi** sütunudur. Kişisel modda bir sır değiştiğinde o ağdaki her aygıta dokunulur: en
kalabalık ağ dört bin yüz aygıt taşıdığı için on altı bin dört yüz dakika, yaklaşık iki yüz
yetmiş üç saat. Kurumsal modda değişen şey tek bir kimliktir ve dokunulan aygıt sayısı birdir.

Kurumsal modun sütununda görünen dört bin dört yüz sayısı bedelin kendisidir: yönetilecek kimlik
sayısı bir sırdan dört bin dört yüze çıkıyor. Kalem ayrımı bedava değil; ayrımın bedeli kimlik
yönetiminin ölçeğidir.

#### İptalin Adım Sayısı ve Eklenen İddia

İki modun asıl ayrıldığı yer bir öznenin **çıkışıdır**. Aşağıdaki koşum önce iddia tablosunu
kuruyor, sonra ayrılan bir öznenin bedelini sayıyor.

```js
// kosum2.mjs — iki modun iddia tablosu ve kurumsal modun bedeli
import { ROL, ALTYAPI, KURUMSAL_DESTEK, kalemleri, aygitlari } from './mod.mjs';

const G = ['yok', 'zayif', 'var'];
const IDDIA = [
  ['baglanan taraf gizli degeri biliyor', [2, 2, 2]],
  ['baglanan taraf belirli bir oznedir', [0, 2, 2]],
  ['bu kimlik hala gecerli', [0, 2, 2]],
  ['erisim oznenin kalemiyle sinirli', [0, 2, 2]],
  ['karsi taraf kurumun kimlik sunucusu', [1, 0, 2]],
  ['ayrilan ozne kendiliginden disarida', [0, 2, 2]],
  ['oturum anahtari ozne basina ayri', [0, 2, 2]],
];
const BASLIK = ['kisisel', 'kurumsal (sunucu dogrulanmiyor)', 'kurumsal (guven koku sabit)'];
const E = [38, 10, 34, 30];
const yaz = (h) => h.map((d, i) => String(d)[i ? 'padStart' : 'padEnd'](E[i])).join('');
console.log(yaz(['iddia', ...BASLIK]));
for (const [ad, d] of IDDIA) console.log(yaz([ad, ...d.map((v) => G[v])]));
const say = (i, v) => IDDIA.filter(([, d]) => d[i] === v).length;
console.log(yaz(['kanitlanan / acik', ...BASLIK.map((_, i) =>
  `${say(i, 2)} / ${say(i, 1) + say(i, 0)}`)]));

// Ayrilan bir ozne: kisisel modda ag sirri, kurumsal modda tek kimlik degisir.
const ELLE = 4, DEVIR = 0.14;         // aygit basina dakika ve yillik personel devri (model)
const OZNE = ROL.reduce((s, [, o]) => s + o, 0);
const AG = [['saha-teknisyeni', 'sube-personeli'], ['bakim', 'pano', 'barkod-yazicisi'],
  ['sayac-ucu']];
const g = AG.find((x) => x.includes('saha-teknisyeni'));
const dokunulan = aygitlari(g);
console.log(`\nozne ${OZNE}, yillik ayrilma ${Math.round(OZNE * DEVIR)}`);
console.log(`kisisel: 1 sir degisir -> ${dokunulan} aygit, ${dokunulan * ELLE} dk, ` +
  `${kalemleri(g).length} kalem yeniden acilir`);
console.log(`kurumsal: 1 kimlik iptal -> 0 aygit, 0 dk, 0 kalem`);
console.log(`yillik: kisisel ${Math.round(OZNE * DEVIR) * dokunulan * ELLE} dk, kurumsal 0 dk`);

// Bedel: ek altyapi kalemi ve kurumsal modu destekleyemeyen aygitlar.
const disarida = ROL.filter(([r]) => !KURUMSAL_DESTEK.includes(r));
console.log(`\nek altyapi kalemi ${ALTYAPI.length}, yillik bakim dokunusu ` +
  `${ALTYAPI.reduce((s, [, n]) => s + n, 0)}`);
for (const [ad, n] of ALTYAPI) console.log(`  ${ad.padEnd(38)}${String(n).padStart(3)}`);
console.log(`kurumsal modu desteklemeyen sinif ${disarida.length}, aygit ` +
  `${disarida.reduce((s, [, , n]) => s + n, 0)} -> kisisel modda kalir`);
```

```
iddia                                    kisisel   kurumsal (sunucu dogrulanmiyor)   kurumsal (guven koku sabit)
baglanan taraf gizli degeri biliyor          var                               var                           var
baglanan taraf belirli bir oznedir           yok                               var                           var
bu kimlik hala gecerli                       yok                               var                           var
erisim oznenin kalemiyle sinirli             yok                               var                           var
karsi taraf kurumun kimlik sunucusu        zayif                               yok                           var
ayrilan ozne kendiliginden disarida          yok                               var                           var
oturum anahtari ozne basina ayri             yok                               var                           var
kanitlanan / acik                          1 / 6                             6 / 1                         7 / 0

ozne 262, yillik ayrilma 37
kisisel: 1 sir degisir -> 393 aygit, 1572 dk, 6 kalem yeniden acilir
kurumsal: 1 kimlik iptal -> 0 aygit, 0 dk, 0 kalem
yillik: kisisel 58164 dk, kurumsal 0 dk

ek altyapi kalemi 7, yillik bakim dokunusu 29
  kimlik dogrulama sunucusu               2
  sunucu kimligi ve guven koku            1
  kimlik deposu baglantisi                2
  istemci profili dagitimi                6
  erisim noktasi paylasilan gizli degeri  4
  kimlik iptal listesi                   12
  yedek dogrulama yolu                    2
kurumsal modu desteklemeyen sinif 3, aygit 4138 -> kisisel modda kalir
```

Kişisel mod yedi iddiadan **birini** kanıtlıyor: bağlanan tarafın gizli değeri bildiğini. Geri
kalan altıdan beşinin hiçbir karşılığı yoktur, çünkü sır kişiye değil ağa aittir; altıncısının
karşılığı yalnız zayıftır. "Bu kimlik hâlâ
geçerli" sorusunun kişisel modda bir yanıtı yoktur; sırrın geçerliliği vardır, kimliğin
geçerliliği diye bir kavram yoktur.

Ayrılma satırı bunu paraya çeviriyor. İki yüz altmış iki öznenin yılda otuz yedisi ayrılıyor.
Kişisel modda ayrılan her özne için o ağın sırrı değişmeli; ağdaki üç yüz doksan üç aygıta
dokunulur, bin beş yüz yetmiş iki dakika harcanır ve altı kalem yeniden açılır. Yıllık toplam
elli sekiz bin yüz altmış dört dakika, yaklaşık dokuz yüz yetmiş saat. Kurumsal modda aynı
sayının karşılığı sıfırdır.

Uygulamada bu sayı ödenmez. Bin beş yüz yetmiş iki dakikayı otuz yedi kez harcamak yerine sır
**değiştirilmez**; ayrılan öznenin bildiği dizi ağda kalmaya devam eder. Kişisel modun asıl
zayıflığı budur — sır tek olduğu için değil, iptalinin bedeli ödenmeyecek kadar büyük olduğu
için.

Model ayrıca bir kaynağı hiç saymıyor. Ayrılan özne yalnız aklında tuttuğu diziyi götürmez;
sırrın bir kopyası bıraktığı her aygıtın yapılandırmasında da durur. Kaybolan bir saha
terminali, sökülüp alınan bir sayaç ucu ya da elden çıkarılan bir pano ekranı aynı sonucu
üretir ve hiçbiri personel devri sayısında görünmez. Kişisel modda **aygıt kaybı ile personel
ayrılması aynı olaydır**, çünkü ikisi de aynı tek güven kökünü dışarı taşır. Kurumsal modda
bunlar iki ayrı olaydır ve ikisinin de karşılığı tek bir kaydın iptalidir.

#### Eklenen İddia ve Ödenen Bedel

Orta sütun bu dersin asıl bulgusudur. Kurumsal mod altı iddiayı kanıta bağlıyor ama **yeni bir
iddia ekliyor**: karşı tarafın kurumun kimlik doğrulama sunucusu olduğu. Kişisel modda bu iddia
zayıf bir biçimde karşılanır — ortak sır iki tarafça da bilinir, sırrı bilen ağ ağın kendisi
sayılır. Kurumsal modda istemci kimliğini merkezî bir sunucuya sunar ve o sunucunun kim olduğu
ayrı bir sorudur.

İstemci, sunucunun kimliğini ve güven kökünü doğrulamıyorsa bu iddianın hiçbir kanıtı olmaz.
Tablo bunu açıkça yazıyor: orta sütunda o satır boştur. Kurumsal mod, doğru yapılandırılmadığında
kişisel modun tek kanıtını da kaybeder ve karşılığında kimliği sunulacak bir sunucu ekler.
Güven kökü sabitlendiğinde yedi iddianın yedisi kanıta bağlanıyor; sabitlenmediğinde açık iddia
sayısı bire iniyor ama açık kalan iddia **en pahalısıdır**. Bir sonraki ders o iddianın açık
kalmasının ne demek olduğunu ölçecek.

Son bölüm bedeli sayıyor. Kurumsal mod yedi ek altyapı kalemi getiriyor ve bu kalemler yılda
yirmi dokuz kez elle dokunuluyor. En sık dokunulan kalem kimlik iptal listesidir; en kritik
olanı ise güven köküdür, çünkü yenilendiğinde her istemci profilinin de yenilenmesi gerekir.

Aygıt tarafı ise kararı sınırlıyor. Altı rolün üçü kurumsal modu destekliyor; kalan üç sınıf,
yani dört bin yüz otuz sekiz aygıt, kişisel modda kalmak zorunda. Bunların çoğu sayaç ucu ve
her biri tek bir kaleme, toplayıcı girişine bağlanıyor. Bu, kurumsal moda geçişin kısmi bir
geçiş olduğu anlamına gelir: özneli roller kurumsal moda, öznesiz aygıtlar rol başına ayrılmış
kişisel mod ağlarına gider. Ölçüm bu ayrımı destekliyor — dört bin yüz otuz sekiz aygıtın
tamamı için ortalama açılan kalem sayısı zaten birdir.

#### Özet

- Kişisel modda tek ağ ve tek sır on iki kalemin tamamını açıyor; ağı rol başına bölmek
  ortalamayı 2,5 kaleme indiriyor ve kurumsal modla aynı ayrımı veriyor. Kalem ayrımı için
  kurumsal mod zorunlu değil.
- Ayrım bedava değil: kişisel modda bir sır değiştiğinde o ağdaki her aygıta dokunulur (en
  kalabalık ağda 16.400 dakika), kurumsal modda tek kimlik iptal edilir (0 dakika, 0 aygıt).
  Yönetilecek güven kökü sayısı 1'den 4.400'e çıkıyor.
- Ayrılan bir özne kişisel modda 393 aygıta dokunmayı gerektiriyor; yıllık 37 ayrılma 58.164
  dakika eder. Bu bedel ödenmediği için sır değiştirilmez ve ayrılan öznenin bildiği dizi ağda
  kalır.
- Kurumsal mod yedi iddianın altısını kanıta bağlıyor ama bir iddia **ekliyor**: karşı tarafın
  kurumun kimlik doğrulama sunucusu olduğu. Güven kökü sabitlenmemişse o iddianın kanıtı yoktur.
- Bedel yedi ek altyapı kalemi ve yılda yirmi dokuz elle dokunuştur; altı rolün üçü, yani 4.138
  aygıt kurumsal modu destekleyemediği için kişisel modda kalır.

#### Sonraki Adım

Bu ders güven kökünü yerine oturttu ve tabloda tek bir satırı açık bıraktı: istemcinin karşı
tarafın kim olduğunu doğrulayıp doğrulamadığı. O satır boş kaldığında ne olduğu bir yapılandırma
ayrıntısı değildir. Bir istemci bir ağa bağlanmaya karar verirken elinde yalnız o ağın kendisi
hakkında yaptığı bildirimler vardır — ilk dersin tablosunda dört kuşakta da kanıtsız kalan ağ
adı iddiası tam olarak budur. Sonraki dersin sorusu şudur: bir istemci bir ağın kimliğini neye
bakarak kabul ediyor, o işaretlerin kaçı kanıt taşıyor, kaydedilmiş bir ağ profili kaç yolu
kendiliğinden açıyor ve karşılıklı doğrulama bu yolların kaçını kapatıyor.

### Sahte Erişim Noktaları

Source: https://academia.sh/tr/kurslar/ag-guvenligi/sahte-erisim-noktalari

İstemcinin bir ağı seçerken baktığı sekiz işaretin altısı bağlantıdan önce görülür ve hiçbirinin kanıtı yoktur. Sekiz kayıtlı profilde ikiz erişim noktasına giden dört yol açık, üçü kısmi açıktır; güven kökü sabitleme, kullanılmayan profilin silinmesi ve otomatik bağlanmanın kapatılması açık yolu sıfıra indirir, kısmi iki yol ancak dört bin iki yüz doksan iki aygıtı dışarıda bırakan bir kuşak zorunluluğuyla kapanır.

Bir önceki ders kurumsal modun eklediği iddiayı buldu ve tabloda tek bir satırı açık bıraktı:
istemcinin karşı tarafın kim olduğunu doğrulayıp doğrulamadığı. Aynı satırın kişisel mod
karşılığı da vardı ve ilk dersin tablosunda ağ adı iddiası dört kuşakta da kanıtsızdı.

Bu boşluk **ikiz erişim noktasının** yaşadığı yerdir. Sahte bir erişim noktası kurmak, kurumun
kullandığı adı bildiren ve daha güçlü bir sinyalle görünen bir cihaz çalıştırmaktır. Ders bu
tekniğin nasıl kurulduğunu değil, **istemcinin neye bakarak karar verdiğini** ve karşılıklı
doğrulamanın kaç yolu kapattığını ölçer.

- **KG13.** İşaret, istemcinin bir ağı seçerken kullandığı veridir. Üç kaynağı olabilir: karşı
  tarafın bildirimi, istemcinin kendi ölçümü, ya da bir güven köküne bağlanabilen imzalı kanıt.
- **KG14.** Yol, kayıtlı bir istemci profilinin ikiz bir erişim noktasıyla eşleşmesidir. Üç
  sonucu vardır: **açık** (istemci bağlanır ya da kimlik bilgisini sunar), **kısmi** (bağlantı
  tamamlanmaz ama el sıkışma mesajları dışarı çıkar), **kapalı** (istemci karşı tarafı reddeder).
- **KG15.** İkiz erişim noktası ağın adını, kanalını ve güvenlik göstergesini olduğu gibi
  bildirir ve daha güçlü sinyalle görünür. Ortak sırrı ya da kurumun kimlik sunucusunun kimliğini
  bilmez.
- **KG16.** Profil listesi kurgudur; her profilin kaç aygıtta kayıtlı olduğu model değeridir.
  Aynı aygıt birden çok profil taşıyabilir, o yüzden profil taşıyan aygıt toplamı aygıt
  sayısından büyüktür.
- **KG17.** Aygıt başına elle yapılandırma dört dakika, açık ağda günlük elle onay iki kezdir;
  ikisi de model sabitidir.

#### İstemci Neye Bakıyor

Bir aygıt bir ağı seçtiğinde elinde ne olduğu tek tek sayılabilir.

```js
// ikiz.mjs — istemcinin bir agi secerken baktigi isaretler ve kayitli profiller (model).
// Kurgu bolgesel olcum agi; gercek ag adi, gercek konum ve gercek donanim adresi yazilmiyor.
// [isaret, kaynak, istemcinin dogrulayabildigi mi]
export const ISARET = [
  ['ag adi', 'karsi tarafin bildirimi', false],
  ['sinyal gucu', 'istemcinin kendi olcumu', false],
  ['kanal', 'karsi tarafin bildirimi', false],
  ['donanim adresi', 'sifrelenmemis baslik alani', false],
  ['guvenlik gostergesi', 'karsi tarafin bildirimi', false],
  ['yetenek bildirimleri', 'karsi tarafin bildirimi', false],
  ['kimlik sunucusunun sundugu kimlik', 'imzali, guven kokune baglanabilir', true],
  ['ortak sirdan turetilen dogrulama', 'iki tarafin da bildigi gizli deger', true],
];
// Kayitli istemci profilleri: [profil, mod, sunucu kimligi dogrulaniyor mu, otomatik baglanma,
//  bu profili tasiyan aygit]
export const PROFIL = [
  ['sube-agi', 'kurumsal', true, true, 210],
  ['saha-agi', 'kurumsal', false, true, 183],
  ['toplayici-agi', 'kisisel', false, true, 4100],
  ['bakim-agi', 'kisisel', false, true, 9],
  ['konuk-agi', 'acik', false, true, 222],
  ['eski-saha-agi', 'kisisel', false, true, 183],
  ['ortak-calisma-alani', 'acik', false, true, 219],
  ['konferans-salonu', 'acik', false, true, 47],
];
// Ikiz erisim noktasi ayni adi, ayni kanali ve daha guclu sinyali bildirir. Sonuc:
// 'acik' = istemci baglanir ya da kimlik bilgisini sunar, 'kismi' = baglanti tamamlanmaz
// ama el sikisma mesajlari disari cikar, 'kapali' = istemci karsi tarafi reddeder.
export function sonuc([ad, mod, dogrulanir], d) {
  if (d.otomatikKapali.has(ad)) return 'kapali';   // kullanici onayi olmadan baglanmaz
  if (mod === 'acik') return 'acik';
  if (mod === 'kurumsal') return (dogrulanir || d.sabitlenmis) ? 'kapali' : 'acik';
  return d.kusak4 ? 'kapali' : 'kismi';            // kisisel mod: ortak sir karsilikli dogrular
}
```

```js
// kosum1.mjs — istemci bir agin kimligini neye bakarak kabul ediyor
import { ISARET, PROFIL } from './ikiz.mjs';

const E = [36, 40, 12];
const yaz = (h) => h.map((d, i) => String(d)[i ? 'padStart' : 'padEnd'](E[i])).join('');
console.log(yaz(['isaret', 'kaynagi', 'kanit mi']));
for (const [ad, kaynak, k] of ISARET) console.log(yaz([ad, kaynak, k ? 'evet' : 'hayir']));
const kanit = ISARET.filter(([, , k]) => k).length;
console.log(`\nbaglantidan once gorulen isaret ${ISARET.length - kanit}, kaniti olan 0`);
console.log(`kanit tasiyan isaret ${kanit}; ikisi de baglanti kurulurken ortaya cikar`);
const A = [22, 12, 22, 14, 10];
const yaz2 = (h) => h.map((d, i) => String(d)[i ? 'padStart' : 'padEnd'](A[i])).join('');
console.log('\n' + yaz2(['profil', 'mod', 'sunucu dogrulanir', 'otomatik', 'aygit']));
for (const [ad, mod, d, o, n] of PROFIL)
  console.log(yaz2([ad, mod, d ? 'evet' : 'hayir', o ? 'evet' : 'hayir', n]));
console.log(`\nprofil ${PROFIL.length}, profil tasiyan aygit ` +
  `${PROFIL.reduce((s, p) => s + p[4], 0)}`);
```

```
isaret                                                               kaynagi    kanit mi
ag adi                                               karsi tarafin bildirimi       hayir
sinyal gucu                                          istemcinin kendi olcumu       hayir
kanal                                                karsi tarafin bildirimi       hayir
donanim adresi                                    sifrelenmemis baslik alani       hayir
guvenlik gostergesi                                  karsi tarafin bildirimi       hayir
yetenek bildirimleri                                 karsi tarafin bildirimi       hayir
kimlik sunucusunun sundugu kimlik          imzali, guven kokune baglanabilir        evet
ortak sirdan turetilen dogrulama          iki tarafin da bildigi gizli deger        evet

baglantidan once gorulen isaret 6, kaniti olan 0
kanit tasiyan isaret 2; ikisi de baglanti kurulurken ortaya cikar

profil                         mod     sunucu dogrulanir      otomatik     aygit
sube-agi                  kurumsal                  evet          evet       210
saha-agi                  kurumsal                 hayir          evet       183
toplayici-agi              kisisel                 hayir          evet      4100
bakim-agi                  kisisel                 hayir          evet         9
konuk-agi                     acik                 hayir          evet       222
eski-saha-agi              kisisel                 hayir          evet       183
ortak-calisma-alani           acik                 hayir          evet       219
konferans-salonu              acik                 hayir          evet        47

profil 8, profil tasiyan aygit 5173
```

İlk tablonun ikinci sütunu bu dersin bütün noktasıdır. İstemcinin bağlanmadan **önce** gördüğü
altı işaretin dördü karşı tarafın kendi hakkındaki bildirimidir, biri istemcinin kendi
ölçümüdür, biri de şifrelenmemiş bir başlık alanıdır. Hiçbirinin kanıtı yoktur.

Sinyal gücü özel bir yerde durur, çünkü tek "kendi ölçümü" satırıdır ve bu onu güvenilir
göstermez. İstemci genellikle aynı adı bildiren adaylardan **en güçlü sinyalliyi** seçer. Bu bir
açık değil, tasarım kararıdır — hareket eden bir aygıtın erişim noktaları arasında geçiş
yapabilmesi için gerekir. Ama seçim ölçütü olarak sinyal gücü, karşı tarafın tek bir donanım ayarıyla artırdığı
bir değerdir; kendi ölçümü olması onu kanıt yapmaz.

Kanıt taşıyan iki işaret vardır ve ikisi de **bağlantıdan sonra** ortaya çıkar. Ortak sırdan
türetilen doğrulama kişisel modda, imzalı kimlik ise kurumsal modda devreye girer. Seçim anında
kullanılabilecek bir kanıt yoktur; seçim her zaman kanıtsız işaretlerle yapılır ve kanıt ancak
istemci karşı tarafla konuşmaya başladıktan sonra istenir.

İkinci tablo bu boşluğun kurumdaki karşılığını gösteriyor. Sekiz kayıtlı profil var ve
**hepsinde otomatik bağlanma açık**. İki tanesi kurumun ağı değil: ortak çalışma alanı ve
konferans salonu profilleri, çalışanların dışarıda bağlandığı açık ağlardır ve aygıtın profil
listesinde kalmıştır. Bir tanesi de artık kullanılmayan bir kurum ağıdır.

Son satırdaki beş bin yüz yetmiş üç sayısı bir aygıt sayısı değil, **profil taşıyan aygıt**
sayısıdır: bir şube dizüstü aynı anda şube ağını, konuk ağını ve iki dış ağı kayıtlı tutar.
Ölçünün yolu bu yüzden aygıt değil profildir. Bir aygıtın kaç yola açık olduğu, kaç ağa
bağlandığıyla değil, geçmişte kaç ağa bağlanmış olduğuyla belirlenir; profil listesi silinene
kadar büyümeye devam eden tek kalemdir.

#### Karşılıklı Doğrulamanın Kapattığı Yol

Sekiz profilin her biri bir yoldur. Aşağıdaki koşum savunmaları üst üste ekleyip her adımda
açık, kısmi ve kapalı yol sayısını çıkarıyor.

```js
// kosum2.mjs — karsilikli dogrulama kac yolu kapatiyor, kaci acik kaliyor, bedeli ne
import { PROFIL, sonuc } from './ikiz.mjs';

const BOS = new Set();
const KULLANILMAYAN = new Set(['eski-saha-agi', 'konferans-salonu']);
const ACIK_AGLAR = new Set(PROFIL.filter((p) => p[1] === 'acik').map((p) => p[0]));
const HEPSI = new Set([...KULLANILMAYAN, ...ACIK_AGLAR]);
const SAVUNMA = [
  ['taban (hicbiri)', { sabitlenmis: false, kusak4: false, otomatikKapali: BOS }],
  ['guven koku sabitlenir', { sabitlenmis: true, kusak4: false, otomatikKapali: BOS }],
  ['kullanilmayan profil silinir', { sabitlenmis: true, kusak4: false,
    otomatikKapali: KULLANILMAYAN }],
  ['acik agda otomatik baglanma kapali', { sabitlenmis: true, kusak4: false,
    otomatikKapali: HEPSI }],
  ['eszamanli kimlik dogrulama kusagi', { sabitlenmis: true, kusak4: true,
    otomatikKapali: HEPSI }],
];
const E = [37, 7, 8, 9, 12, 13];
const yaz = (h) => h.map((d, i) => String(d)[i ? 'padStart' : 'padEnd'](E[i])).join('');
console.log(yaz(['savunma (ust uste eklenir)', 'acik', 'kismi', 'kapali', 'acik aygit',
  'kismi aygit']));
const sonuclar = SAVUNMA.map(([ad, d]) => {
  const r = PROFIL.map((p) => [p, sonuc(p, d)]);
  const n = (t) => r.filter(([, s]) => s === t).length;
  const a = (t) => r.filter(([, s]) => s === t).reduce((s, [p]) => s + p[4], 0);
  console.log(yaz([ad, n('acik'), n('kismi'), n('kapali'), a('acik'), a('kismi')]));
  return r;
});
const P = [22, 10, 10, 10];
const yaz2 = (h) => h.map((d, i) => String(d)[i ? 'padStart' : 'padEnd'](P[i])).join('');
console.log('\n' + yaz2(['profil', 'taban', 'sabitleme', 'hepsi']));
PROFIL.forEach((p, i) => console.log(yaz2([p[0], sonuclar[0][i][1], sonuclar[1][i][1],
  sonuclar.at(-1)[i][1]])));

// Bedel: her savunmanin dokundugu aygit ve kesilen mesru is (model sabitleri).
const ELLE = 4, ONAY = 2;             // aygit basina dakika, gunluk elle onay sayisi
const kurumsal = PROFIL.filter((p) => p[1] === 'kurumsal').reduce((s, p) => s + p[4], 0);
const silinen = PROFIL.filter((p) => KULLANILMAYAN.has(p[0])).reduce((s, p) => s + p[4], 0);
const acikAygit = PROFIL.filter((p) => ACIK_AGLAR.has(p[0])).reduce((s, p) => s + p[4], 0);
const kisisel = PROFIL.filter((p) => p[1] === 'kisisel').reduce((s, p) => s + p[4], 0);
console.log(`\nbedel:`);
console.log(`  guven koku sabitleme   ${kurumsal} aygitta profil, ${kurumsal * ELLE} dk`);
console.log(`  profil silme           ${silinen} aygitta dokunus, ${silinen * ELLE} dk`);
console.log(`  otomatik baglanma      ${acikAygit} aygit, gunde ${acikAygit * ONAY} elle onay`);
console.log(`  ust kusak zorunlulugu  ${kisisel} aygit disarida kalir`);
```

```
savunma (ust uste eklenir)              acik   kismi   kapali  acik aygit  kismi aygit
taban (hicbiri)                            4       3        1         671         4292
guven koku sabitlenir                      3       3        2         488         4292
kullanilmayan profil silinir               2       2        4         441         4109
acik agda otomatik baglanma kapali         0       2        6           0         4109
eszamanli kimlik dogrulama kusagi          0       0        8           0            0

profil                     taban sabitleme     hepsi
sube-agi                  kapali    kapali    kapali
saha-agi                    acik    kapali    kapali
toplayici-agi              kismi     kismi    kapali
bakim-agi                  kismi     kismi    kapali
konuk-agi                   acik      acik    kapali
eski-saha-agi              kismi     kismi    kapali
ortak-calisma-alani         acik      acik    kapali
konferans-salonu            acik      acik    kapali

bedel:
  guven koku sabitleme   393 aygitta profil, 1572 dk
  profil silme           230 aygitta dokunus, 920 dk
  otomatik baglanma      488 aygit, gunde 976 elle onay
  ust kusak zorunlulugu  4292 aygit disarida kalir
```

Taban satırında sekiz yoldan yalnız **biri** kapalı: güven kökü sabitlenmiş kurumsal profil. Dört
yol açık, üçü kısmi açık. Bu, tabloyu okumadan verilecek yanıtın tersidir — kurumun ağlarının
çoğu şifrelidir, ama şifreleme ikiz erişim noktasına giden yolu kapatmaz.

Kısmi sonuç kişisel modun tam olarak ne yaptığını gösteriyor. Ortak sır iki tarafça bilindiği
için sırrı bilmeyen bir erişim noktası bağlantıyı tamamlayamaz; istemci reddeder. Ama istemci
bunu ancak el sıkışmayı **başlattıktan** sonra anlar ve o mesajlar dışarı çıkmış olur. İlk dersin
tablosunda çevrimdışı denemeye kanıt bulunmayan üç kuşak için bu, bağlantı kurulmasa bile
kaydedilmiş bir el sıkışma anlamına gelir. Kişisel mod yolu kapatır, izi kapatmaz.

Sabitleme satırı bir yol kapatıyor: doğrulama yapmayan kurumsal profil. Etkilenen aygıt yüz
seksen üçtür ve bu, ikinci dersin açık bıraktığı tek satırın karşılığıdır. Kurumsal moda
geçmiş ama sunucu kimliğini doğrulamayan bir profil, kişisel moddan **daha kötü** durumdadır:
kişisel modda sonuç kısmi iken burada açıktır, çünkü istemci kimliğini karşı tarafa sunar.

Kullanılmayan profilin silinmesi iki yol daha kapatıyor ve bunun bir savunma teknolojisiyle
ilgisi yoktur. Eski saha ağı ve konferans salonu profilleri, artık var olmayan ağların adlarını
istemcide tutuyordu; var olmayan bir ağın adı, o adı bildiren herkesin ağı demektir. Bu iki
satır bütün tabloda **bedeli en düşük** olan savunmadır: dokuz yüz yirmi dakikalık bir temizlik,
yeni bir altyapı kalemi getirmiyor ve hiçbir meşru bağlantıyı kesmiyor, çünkü kesilecek meşru
bağlantı zaten yok. Kapatılan yolun ucuz olması, onu en sık atlanan savunma yapıyor — envanterde
görünmeyen bir kalem bakım listesine de girmez.

#### Sıfıra İnen Yol ve Ödenen Bedel

Dördüncü satır açık yolu sıfıra indiriyor. Açık ağlarda otomatik bağlanmanın kapatılması dört
yüz seksen sekiz aygıtı ilgilendiriyor ve günde dokuz yüz yetmiş altı elle onay ekliyor. Yolu
kapatan şey bir doğrulama değil, kararın kullanıcıya devredilmesidir; bu, savunmanın bedelinin
en görünür olduğu satırdır çünkü bedel her gün ödenir.

Kısmi iki yol ancak son satırda kapanıyor ve bedeli dört bin iki yüz doksan iki aygıttır. İlk
dersin envanter tablosu bu sayının nereden geldiğini söylüyor: kişisel modda kalan aygıtların
neredeyse tamamı en üst kuşağı desteklemiyor. Son satır bu yüzden ölçülebilir ama seçilebilir
değildir; kısmi iki yol pratikte açık kalır.

Toplam bedel dört kalemde toplanıyor: iki bin dört yüz doksan iki dakikalık bir kerelik
yapılandırma, günde dokuz yüz yetmiş altı elle onay ve dört bin iki yüz doksan iki aygıtlık bir
yenileme. İlk üç savunma bir kerelik ve ucuzdur; dördüncüsü süreklidir; beşincisi bütçe
kararıdır.

Modelin görmediği bir şey var. Tablo istemcinin **kayıtlı bir profille** eşleşmesini sayıyor;
kayıtlı olmayan bir ada bağlanmayı hiç saymıyor. Bir kullanıcı elle bir ağ seçtiğinde
sabitlenmiş güven kökü hâlâ çalışır, ama açık bir ağ seçtiğinde hiçbir savunma devrede değildir.
Sekiz yolun sıfıra inmesi, bu ağdaki kayıtlı profillerin sıfıra indiği anlamına gelir; istemcinin
tercih edebileceği yolların sıfıra indiği anlamına gelmez.

#### Özet

- İstemcinin bağlantıdan önce gördüğü altı işaretin **hiçbirinin** kanıtı yok: dördü karşı
  tarafın bildirimi, biri kendi ölçümü, biri şifrelenmemiş başlık alanı. Kanıt taşıyan iki işaret
  de ancak bağlantı kurulurken ortaya çıkıyor.
- Sekiz kayıtlı profilden tabanda yalnız biri kapalı; dördü açık, üçü kısmi açık. Şifreleme
  kuşağı ikiz erişim noktasına giden yolu tek başına kapatmıyor.
- Kişisel mod bağlantıyı tamamlatmıyor ama el sıkışma mesajları dışarı çıkıyor; kurumsal moda
  geçip sunucu kimliğini doğrulamayan profil ise kişisel moddan daha kötü durumda, çünkü kimlik
  bilgisini karşı tarafa sunuyor.
- Güven kökü sabitleme, kullanılmayan profilin silinmesi ve açık ağda otomatik bağlanmanın
  kapatılması açık yolu 4'ten 0'a indiriyor; bedeli 2.492 dakikalık yapılandırma ve günde 976
  elle onay.
- Kısmi iki yol ancak en üst kuşak zorunlu tutulduğunda kapanıyor ve bedeli 4.292 aygıttır; bu
  yüzden ölçülebilir ama uygulanabilir bir seçenek değildir.

#### Sonraki Adım

Bu dersin bütün ölçümü bir varsayıma dayanıyordu: istemcinin bağlantısını **kendi isteğiyle**
kuruyor olması. Sekiz profilin altısı kapandığında istemci zaten bağlı olduğu ağda kalır ve
sahte adayı hiç görmez. Ama bir istemcinin bağlı kalması, o bağlantıyı ayakta tutan mesajların
da doğrulanmasını gerektirir. Veri çerçeveleri şifrelidir ve bütünlük kanıtı taşır; bağlantıyı
kuran, sürdüren ve **sonlandıran** çerçeveler ise ayrı bir sınıftandır. Sonraki dersin sorusu
budur: bir kablosuz bağlantıda hangi çerçeve türü bütünlük kanıtı taşıyor, hangisi taşımıyor,
koruma açıldığında kaç çerçeve türü kanıta bağlanıyor ve savunmanın hangi sayacında sapma
görünüyor.

### Kimlik Doğrulama Düşürme Saldırıları

Source: https://academia.sh/tr/kurslar/ag-guvenligi/kimlik-dogrulama-dusurme-saldirilari

On iki çerçeve türünün tabanda yalnız biri bütünlük kanıtı taşıyor; korumalı yönetim çerçeveleri bu sayıyı dörde çıkarıyor ve sekiz yönetim çerçevesinden üçünü kanıta bağlıyor, beşi bağlantı öncesi olduğu için korumasız kalıyor. Bağlantıyı koparan sekiz mekanizmadan üçü kapanıyor; savunmanın gördüğü kayıt bağlantı kesme sayacından reddedilen çerçeve sayacına taşınıyor ve yakalama üç bölü altıdan altı bölü altıya çıkıyor.

Bir önceki ders istemcinin bir ağı seçerken kanıtsız işaretlere baktığını saydı ve karşılıklı
doğrulamanın kaç profili kapattığını ölçtü. Bütün ölçüm bir varsayıma dayanıyordu: istemcinin
bağlantısını kendi isteğiyle kurduğu. Zaten bağlı bir istemci sahte bir adayı hiç görmez.

Bir istemcinin bağlı **kalması** ise ayrı bir doğrulama sorusudur. Veri çerçeveleri şifrelidir
ve bütünlük kanıtı taşır; bağlantıyı kuran, sürdüren ve sonlandıran çerçeveler ayrı bir
sınıftandır. **Kimlik doğrulama düşürme** bu ayrımın adıdır: bağlantıyı sonlandıran bir yönetim
çerçevesi, taşıdığı iddianın hiçbir kanıtı olmadan kabul edilir. Bu ders o tekniğin nasıl
uygulandığını değil, hangi çerçevenin korunduğunu, korumanın kaç yolu kapattığını ve savunmanın
hangi sayaçta ne gördüğünü ölçer.

- **KG18.** Çerçeve türleri üç sınıfa ayrılır: veri, denetim, yönetim. Sınıflandırma ve her
  türün bütünlük kanıtı taşıyıp taşımadığı model kararıdır.
- **KG19.** Bağlantı öncesi çerçeve, taraflar arasında henüz ortak bir anahtar yokken
  alışverilen çerçevedir. Ortak anahtar olmadığı için bütünlük kanıtı üretilemez.
- **KG20.** Yol, bir istemcinin bağlantısının kopmasına yol açan bir mekanizmadır. Yolun
  kapanması, o mekanizmanın taşıdığı iddianın doğrulanabilir hale gelmesi demektir.
- **KG21.** Günlük verisi kurgudur ve kendi yazılan bir üreteçle üretilir; tohum görünürdür ve
  koşum yinelenebilir. Saat başına normal bağlantı kesme beklentisi model değeridir.
- **KG22.** Eşik, aynı erişim noktası ve aynı saat için geçmiş günlerden çıkarılan ortalama ile
  standart sapmanın katıdır. Olay günü taban hesabının dışında tutulur.
- **KG23.** Saldırı adımı, araç ve çerçeve üretimi bu dersin dışındadır; ölçülen şey korumanın
  kapsamı ve savunmanın gördüğü kayıttır.

#### Hangi Çerçeve Korunuyor

Bir kablosuz bağlantı yalnız veri taşımaz. Aynı ortamda üç sınıf çerçeve dolaşır ve bunların
şifreleme kapsamı aynı değildir.

```js
// cerceve.mjs — kablosuz cerceve turleri ve korumali yonetim cerceveleri (model).
// Saldiri adimi yazilmaz; olculen sey hangi cercevenin butunluk kaniti tasidigidir.
// [cerceve turu, sinif, baglanti oncesi mi, taban korumada kanit, koruma acikken kanit]
export const CERCEVE = [
  ['veri cercevesi', 'veri', false, true, true],
  ['onay', 'denetim', false, false, false],
  ['gonderime hazir / hazir', 'denetim', false, false, false],
  ['guc tasarrufu yoklamasi', 'denetim', false, false, false],
  ['isaret cercevesi', 'yonetim', true, false, false],
  ['yoklama istegi', 'yonetim', true, false, false],
  ['yoklama yaniti', 'yonetim', true, false, false],
  ['kimlik dogrulama cercevesi', 'yonetim', true, false, false],
  ['baglanti istegi / yaniti', 'yonetim', true, false, false],
  ['baglanti kesme', 'yonetim', false, false, true],
  ['kimlik dogrulama dusurme', 'yonetim', false, false, true],
  ['eylem cercevesi (kanal, olcum)', 'yonetim', false, false, true],
];
// Baglantinin kopmasina yol acan mekanizmalar (model). 'kapatan' alani hangi savunmanin
// yolu kapattigini soyler; 'yok' = hicbiri.
export const YOL = [
  ['sahte baglanti kesme cercevesi', 'yonetim cercevesi', 'korumali yonetim cerceveleri'],
  ['sahte kimlik dogrulama dusurme cercevesi', 'yonetim cercevesi', 'korumali yonetim cerceveleri'],
  ['sahte eylem cercevesi (kanal degisimi)', 'yonetim cercevesi', 'korumali yonetim cerceveleri'],
  ['baglanti oncesi yoklama yanitinin taklidi', 'yonetim cercevesi', 'yok'],
  ['denetim cercevesi ile ortamin dolu gosterilmesi', 'denetim cercevesi', 'yok'],
  ['fiziksel katmanda sikisma', 'fiziksel', 'yok'],
  ['kimlik dogrulama sunucusuna ulasilamamasi', 'altyapi', 'yerel dogrulama onbellegi'],
  ['korumayi desteklemeyen istemcinin baglanmasi', 'istemci', 'koruma zorunlu tutulur'],
];
```

```js
// kosum1.mjs — hangi cerceve korunuyor, koruma acikken kac yol kapaniyor
import { CERCEVE, YOL } from './cerceve.mjs';

const E = [34, 12, 18, 12, 12];
const yaz = (h) => h.map((d, i) => String(d)[i ? 'padStart' : 'padEnd'](E[i])).join('');
const im = (b) => b ? 'var' : 'yok';
console.log(yaz(['cerceve turu', 'sinif', 'baglanti oncesi', 'taban', 'koruma acik']));
for (const [ad, s, o, a, b] of CERCEVE) console.log(yaz([ad, s, o ? 'evet' : 'hayir', im(a), im(b)]));
const say = (i) => CERCEVE.filter((c) => c[i]).length;
console.log(`\ncerceve turu ${CERCEVE.length}; butunluk kaniti tasiyan: taban ${say(3)}, ` +
  `koruma acik ${say(4)}`);
const yonetim = CERCEVE.filter((c) => c[1] === 'yonetim');
console.log(`yonetim cercevesi ${yonetim.length}; korunan ${yonetim.filter((c) => c[4]).length}, ` +
  `korunmayan ${yonetim.filter((c) => !c[4]).length} (hepsi baglanti oncesi)`);

const A = [46, 22, 32];
const yaz2 = (h) => h.map((d, i) => String(d)[i ? 'padStart' : 'padEnd'](A[i])).join('');
console.log('\n' + yaz2(['baglantinin kopmasina yol acan mekanizma', 'sinif', 'kapatan savunma']));
for (const [ad, s, k] of YOL) console.log(yaz2([ad, s, k]));
const korumaKapatir = YOL.filter((y) => y[2] === 'korumali yonetim cerceveleri').length;
console.log(`\nyol ${YOL.length}; korumali yonetim cerceveleri ${korumaKapatir} kapatir, ` +
  `${YOL.length - korumaKapatir} acik kalir`);
console.log(`acik kalanlarin ${YOL.filter((y) => y[2] === 'yok').length} tanesini hicbir ` +
  `dogrulama kapatmaz (iddia sorunu degil)`);
```

```
cerceve turu                             sinif   baglanti oncesi       taban koruma acik
veri cercevesi                            veri             hayir         var         var
onay                                   denetim             hayir         yok         yok
gonderime hazir / hazir                denetim             hayir         yok         yok
guc tasarrufu yoklamasi                denetim             hayir         yok         yok
isaret cercevesi                       yonetim              evet         yok         yok
yoklama istegi                         yonetim              evet         yok         yok
yoklama yaniti                         yonetim              evet         yok         yok
kimlik dogrulama cercevesi             yonetim              evet         yok         yok
baglanti istegi / yaniti               yonetim              evet         yok         yok
baglanti kesme                         yonetim             hayir         yok         var
kimlik dogrulama dusurme               yonetim             hayir         yok         var
eylem cercevesi (kanal, olcum)         yonetim             hayir         yok         var

cerceve turu 12; butunluk kaniti tasiyan: taban 1, koruma acik 4
yonetim cercevesi 8; korunan 3, korunmayan 5 (hepsi baglanti oncesi)

baglantinin kopmasina yol acan mekanizma                       sinif                 kapatan savunma
sahte baglanti kesme cercevesi                     yonetim cercevesi    korumali yonetim cerceveleri
sahte kimlik dogrulama dusurme cercevesi           yonetim cercevesi    korumali yonetim cerceveleri
sahte eylem cercevesi (kanal degisimi)             yonetim cercevesi    korumali yonetim cerceveleri
baglanti oncesi yoklama yanitinin taklidi          yonetim cercevesi                             yok
denetim cercevesi ile ortamin dolu gosterilmesi     denetim cercevesi                             yok
fiziksel katmanda sikisma                                   fiziksel                             yok
kimlik dogrulama sunucusuna ulasilamamasi                    altyapi       yerel dogrulama onbellegi
korumayi desteklemeyen istemcinin baglanmasi                 istemci          koruma zorunlu tutulur

yol 8; korumali yonetim cerceveleri 3 kapatir, 5 acik kalir
acik kalanlarin 3 tanesini hicbir dogrulama kapatmaz (iddia sorunu degil)
```

Tabanda on iki çerçeve türünden **biri** bütünlük kanıtı taşıyor. Şifrelemenin kapsamı veri
çerçevesidir; geri kalan on bir tür açık dolaşır. Kimlik doğrulama düşürmenin bütün dayanağı bu
satırdır — bağlantıyı sonlandıran çerçeve, taşıdığı "bu bağlantı bitiyor" iddiasının hiçbir
kanıtını taşımaz ve istemci onu kabul eder.

Koruma açıldığında sayı bire karşı dörde çıkıyor. Kazanılan üç tür, bağlantı kurulduktan
**sonra** gönderilen yönetim çerçeveleridir: bağlantı kesme, kimlik doğrulama düşürme ve eylem
çerçevesi. Üçünün ortak yanı, o anda taraflar arasında ortak bir anahtarın var olmasıdır; kanıt
üretilebilmesinin koşulu budur.

Korunamayan beş yönetim çerçevesinin de ortak yanı aynı sütunda okunuyor: hepsi **bağlantı
öncesi**. İşaret çerçevesi, yoklama isteği ve yanıtı, kimlik doğrulama ve bağlantı isteği,
ortak anahtar yokken alışverilir. Bir önceki dersin ikiz erişim noktası yolu tam olarak bu beş
satırda yaşar; korumalı yönetim çerçeveleri o yolu kapatmaz ve kapatamaz.

Denetim çerçeveleri üçüncü bir küme. Onay ve gönderime hazır çerçeveleri hiçbir durumda kanıt
taşımaz, çünkü ortam paylaşımının zamanlaması bu çerçevelerin küçük ve hızlı olmasına bağlıdır.
Bunlarda korunacak bir içerik de yoktur; taşıdıkları tek iddia "şu kadar süre ortamı ben
kullanacağım" ya da "aldım" bilgisidir. Kanıt eklemek bu çerçeveleri büyütür ve ortam
paylaşımının kendisini yavaşlatır — korumanın kapsamı dışında kalmalarının nedeni bir eksiklik
değil, ölçülmüş bir takastır.

İkinci tablo bunu yol sayısına çeviriyor. Sekiz mekanizmadan **üçü** kapanıyor, beşi açık
kalıyor. Açık kalan beşin üçünü hiçbir doğrulama kapatmaz ve bunun nedeni önemlidir: fiziksel
katmanda sıkışma bir iddia sorunu değildir. Orada doğrulanmadan kabul edilen bir iddia yoktur;
ortam kullanılamaz durumdadır ve doğrulama ortamın kendisini geri getirmez. Bu kursun ölçüsü
burada sınırına varıyor.

Kalan iki yol savunmanın başka kalemlerine düşüyor. Kimlik doğrulama sunucusuna ulaşılamaması
bir yerel doğrulama önbelleğiyle karşılanır; korumayı desteklemeyen istemci sorunu ise korumanın
**zorunlu** tutulmasıyla kapanır ve bedeli, önceki derslerin envanter tablosundaki dışarıda
kalan aygıtlardır. Koruma isteğe bağlı bırakıldığında bir istemci korumasız bağlanmayı seçebilir
ve o istemci için üç yol yeniden açılır.

#### Savunmanın Gördüğü Sayaç

Koruma açık değilse bağlantı kesme çerçevesi geçerli sayılır ve tek izi, istemcilerin yeniden
bağlanmasıdır. Aşağıdaki koşum otuz günlük kurgu kayıttan eşik seçiminin ne kazandırdığını
çıkarıyor.

```js
// kosum2.mjs — savunmanin gordugu kayit: baglanti kesme sayacindaki sapma ve esik secimi.
// Uretec kendi yazilmistir, tohum gorunurdur; koşum yinelenebilir.
const TOHUM = 20240917;
let s = TOHUM;
const rast = () => (s = (s * 1103515245 + 12345) % 2147483648) / 2147483648;
const poisson = (l) => { let k = 0, p = 1, L = Math.exp(-l); do { k++; p *= rast(); } while (p > L); return k - 1; };

const GUN = 30, SAAT = 24, AP = 6, OLAY_GUN = 17, OLAY_AP = 3;
const OLAY_SAAT = [7, 10, 13, 16, 19, 22];
// Saat basina normal baglanti kesme beklentisi (model): is saatlerinde gecis, gece dusuk.
const TABAN = Array.from({ length: SAAT }, (_, h) => (h >= 8 && h < 18) ? 6 : 1.2);
const kesme = [], reddedilen = [];
for (let g = 0; g < GUN; g++) {
  kesme.push([]); reddedilen.push([]);
  for (let a = 0; a < AP; a++) {
    kesme[g].push([]); reddedilen[g].push([]);
    for (let h = 0; h < SAAT; h++) {
      const olay = g === OLAY_GUN && a === OLAY_AP && OLAY_SAAT.includes(h);
      kesme[g][a].push(poisson(TABAN[h]) + (olay ? poisson(7) : 0));
      // Koruma acikken ayni cerceveler butunluk denetiminde reddedilir ve ayri sayilir.
      reddedilen[g][a].push(olay ? poisson(7) : 0);
    }
  }
}
// Taban, olay gunu disindaki gunlerden saat ve erisim noktasi basina cikarilir.
const gunler = [...Array(GUN).keys()].filter((g) => g !== OLAY_GUN);
const ort = (v) => v.reduce((a, b) => a + b, 0) / v.length;
const sapma = (v) => Math.sqrt(ort(v.map((x) => (x - ort(v)) ** 2)));
const E = [10, 14, 16, 18, 16];
const yaz = (h) => h.map((d, i) => String(d)[i ? 'padStart' : 'padEnd'](E[i])).join('');
console.log(`gun ${GUN}, erisim noktasi ${AP}, saat ${GUN * AP * SAAT}, olay saati ${OLAY_SAAT.length}`);
console.log(yaz(['esik', 'yakalanan', 'kacirilan', 'yanlis uyari', 'yanlis/gun']));
for (const k of [2, 3, 4, 5, 6]) {
  let yakalanan = 0, yanlis = 0;
  for (let g = 0; g < GUN; g++) for (let a = 0; a < AP; a++) for (let h = 0; h < SAAT; h++) {
    const gecmis = gunler.map((x) => kesme[x][a][h]);
    const esik = ort(gecmis) + k * sapma(gecmis);
    if (kesme[g][a][h] <= esik) continue;
    if (g === OLAY_GUN && a === OLAY_AP && OLAY_SAAT.includes(h)) yakalanan++; else yanlis++;
  }
  console.log(yaz([k, `${yakalanan}/${OLAY_SAAT.length}`, OLAY_SAAT.length - yakalanan, yanlis,
    (yanlis / GUN).toFixed(2)]));
}
// Koruma acikken: ayni cerceveler baglanti kesmez, reddedilen cerceve sayacinda birikir.
const toplamRed = reddedilen.flat(2).reduce((a, b) => a + b, 0);
const redSaat = reddedilen.flat(2).filter((x) => x > 0).length;
console.log(`\nkoruma acik: reddedilen yonetim cercevesi ${toplamRed}, sapan saat ${redSaat}`);
console.log(`bu sayacin tabani 0 oldugu icin esik 1'dir: yakalanan ${redSaat}/${OLAY_SAAT.length}, yanlis uyari 0`);
const olayKesme = OLAY_SAAT.reduce((t, h) => t + kesme[OLAY_GUN][OLAY_AP][h], 0);
const normalKesme = OLAY_SAAT.reduce((t, h) => t + ort(gunler.map((x) => kesme[x][OLAY_AP][h])), 0);
console.log(`olay saatlerinde kesme ${olayKesme}, ayni saatlerin normali ${normalKesme.toFixed(1)}, ` +
  `kat ${(olayKesme / normalKesme).toFixed(1)}`);
```

```
gun 30, erisim noktasi 6, saat 4320, olay saati 6
esik           yakalanan       kacirilan      yanlis uyari      yanlis/gun
2                    4/6               2               167            5.57
3                    4/6               2                20            0.67
4                    3/6               3                 2            0.07
5                    1/6               5                 0            0.00
6                    0/6               6                 0            0.00

koruma acik: reddedilen yonetim cercevesi 42, sapan saat 6
bu sayacin tabani 0 oldugu icin esik 1'dir: yakalanan 6/6, yanlis uyari 0
olay saatlerinde kesme 58, ayni saatlerin normali 23.8, kat 2.4
```

Bağlantı kesme sayacı zayıf bir belirtidir ve tablo bunun nedenini gösteriyor. Olay saatlerinde
sayaç normalin **iki virgül dört katına** çıkıyor; bu, dört bin üç yüz yirmi saatlik bir kayıtta
ayırt edilmesi zor bir sapmadır. Eşik iki seçildiğinde altı olay saatinin dördü yakalanıyor ama
otuz günde yüz altmış yedi yanlış uyarı üretiliyor: günde beş buçuk uyarı, hiçbiri gerçek
değil. Eşik dörde çıkarıldığında yanlış uyarı ikiye iniyor, yakalama üçe düşüyor. Eşik altıda
yanlış uyarı sıfır, yakalama da sıfır.

Beş satırın hiçbiri iyi bir seçenek değildir. Sayacın tabanı sıfır değil, günün saatine göre
değişen bir gürültüdür ve olayın kendisi de o gürültünün içine yayılmıştır. Bir sayacın belirti
üretebilmesi için sapmanın büyük olması yetmez; **tabanının küçük olması** gerekir.

Son üç satır korumanın ikinci kazancını veriyor ve bu, yol tablosunda görünmeyen bir kazançtır.
Koruma açıkken aynı çerçeveler bağlantıyı kesmez; bütünlük denetiminden geçemez ve reddedilir.
Reddedilen yönetim çerçevesi ayrı bir sayaçtır ve bu sayacın normal değeri **sıfırdır**. Kırk iki
çerçeve altı saatte birikiyor, eşik bir olarak alınıyor ve altı olay saatinin altısı da sıfır
yanlış uyarıyla yakalanıyor.

Korumanın kapattığı üç yol, bu yüzden ölçümün tamamı değildir. Koruma yalnız çerçeveyi
doğrulanabilir kılmıyor; savunmaya **tabanı sıfır olan bir sayaç** kazandırıyor. Doğrulanabilir
hale gelen her iddianın yan ürünü, doğrulamanın başarısız olduğu durumun sayılabilir olmasıdır.

#### Özet

- On iki çerçeve türünden tabanda yalnız **biri** bütünlük kanıtı taşıyor: veri çerçevesi.
  Korumalı yönetim çerçeveleri bu sayıyı dörde çıkarıyor.
- Sekiz yönetim çerçevesinin üçü korunuyor, beşi korunmuyor ve korunmayan beşinin hepsi
  **bağlantı öncesi** çerçevedir: ortak anahtar yokken kanıt üretilemez. İkiz erişim noktası
  yolu bu beş satırda yaşar ve koruma onu kapatmaz.
- Bağlantının kopmasına yol açan sekiz mekanizmadan üçü kapanıyor, beşi açık kalıyor. Açık
  kalan üçünü hiçbir doğrulama kapatamaz; fiziksel katmanda sıkışma bir iddia sorunu değildir.
- Bağlantı kesme sayacında olay normalin 2,4 katı. Eşik 2'de 4/6 yakalanıyor ama günde 5,57
  yanlış uyarı çıkıyor; eşik 4'te yakalama 3/6, eşik 6'da 0/6. Hiçbir eşik iyi bir seçenek değil.
- Koruma açıkken aynı çerçeveler reddedilen yönetim çerçevesi sayacına düşüyor; o sayacın tabanı
  sıfır olduğu için eşik 1 ile 6/6 yakalama ve 0 yanlış uyarı elde ediliyor. Korumanın ikinci
  kazancı, tabanı sıfır olan bir sayaçtır.

#### Sonraki Adım

Bu ders korumanın kapatamadığı üç yolu ayırdı ve üçünün de ortak bir yanı vardı: hiçbiri bir
iddianın doğrulanmasıyla ilgili değil. Fiziksel katmanda sıkışma, ortamın dolu gösterilmesi ve
bağlantı öncesi çerçevelerin taklidi, sinyalin **ulaştığı her yerde** yapılabilir. O yüzden
kablosuz savunmanın son sorusu bir protokol sorusu değil, bir coğrafya sorusudur: sinyal nereye
kadar gidiyor. Sonraki ders kapsama haritasını gerçekten hesaplar — sinyalin bina sınırının
dışına taştığı alan kaç metrekaredir, yetkisiz cihaz taraması bu alanda hangi kalemi bulur,
hangisini bulamaz. Aynı ders kursun yirmi dersini tek tabloda toplar.

### Kablosuz Ağ Denetimi

Source: https://academia.sh/tr/kurslar/ag-guvenligi/kablosuz-ag-denetimi

Kurgu bir şube binasının kapsama haritası bir metrelik ızgarada hesaplanır: bağlantı kurulabilen alanın bina dışına taşan bölümü bin sekiz yüz otuz sekiz metrekare, yalnız duyulabilen alan yirmi dokuz bin altı yüz yirmi iki metrekare ve iç alanın on iki katıdır. Gönderim gücünü düşürmek dış kullanılabilir alanı sıfırlar ama duyulabilir alanı kapatmaz; yetkisiz cihaz taraması iki saatte envanter dışı altı kaynağın üçünü bulur, biri sürekli izlemeyle de bulunamaz.

Bir önceki ders korumanın kapatamadığı üç yolu ayırdı ve üçünün ortak yanı, hiçbirinin bir
iddianın doğrulanmasıyla ilgili olmamasıydı. Sıkışma, ortamın dolu gösterilmesi ve bağlantı
öncesi çerçevelerin taklidi, sinyalin **ulaştığı her yerde** yapılabilir. Bu kursun bütün
savunmaları bir sınır varsaymıştı; kablosuz katmanda o sınır bir kural değil, bir yüzeydir.

Bu ders o yüzeyi hesaplar. Önce sinyalin bina duvarının dışına ne kadar taştığı ölçülür, sonra
yetkisiz cihaz taramasının bu yüzeyde neyi bulduğu ve neyi bulamadığı sayılır. **Kendi ağının
dışında tarama ve dinleme, yazılı yetki ve tanımlı kapsam olmadan hem yasadışı hem meslek
dışıdır**; aşağıdaki ölçümlerin tamamı kurgu bir envanterin üzerinde, model olarak yapılır.

- **KG24.** Kurgu şube binası altmış iki metreye otuz sekiz metredir ve dört erişim noktası
  taşır. Konumlar model kararıdır; gerçek bir bina, gerçek bir konum ve gerçek bir ölçüm yazılmaz.
- **KG25.** Yol kaybı hesabı gerçektir; üsteller, dış duvar kaybı ve eşikler model değeridir ve
  gerçek bir binada ölçülerek çıkarılır. Bina dışındaki noktalar için tek bir duvar geçişi
  varsayılır. Izgara bir metre adımlıdır ve bina alanı kenarlarını da içerir.
- **KG26.** İki eşik ayrılır: bağlantı kurulabilen güç ve yalnız duyulabilen güç. İkincisi,
  çerçevelerin alınabildiği ama bağlantının kurulamadığı düzeydir.
- **KG27.** Tarama modelinde bir kaynak ancak taranan bir kanaldaysa, dinleme penceresi kaynağın
  yayın aralığından uzunsa ve tarama sırasında açıksa bulunur.

#### Kapsama Haritasında Fiziksel Yüzey

Kapsama bir yönetim tercihi değil, bir yol kaybı hesabıdır. Bina ve çevresi bir metrelik ızgaraya
bölünür, her hücrede en güçlü erişim noktasından alınan güç hesaplanır ve iki eşiğe göre
sınıflandırılır.

```js
// kapsama.mjs — kurgu sube binasinin kapsama haritasi (model). Gercek konum ve gercek olcum
// yazilmiyor; yol kaybi hesabi gercektir, ortam sabitleri model degeridir.
const BINA = { x1: 62, y1: 38 }, AP = [[15, 10], [47, 10], [15, 28], [47, 28]];
const IC_US = 3.5, DIS_US = 2.6, DUVAR = 8;    // yol kaybi usteli ve dis duvar kaybi (dB)
const FSPL1 = 20 * Math.log10((4 * Math.PI * 5.2e9) / 2.998e8);   // 1 m referans kaybi
const KUL = -70, DUY = -85, DIZUSTU = 210;     // dBm esikleri ve bina icindeki dizustu
const icinde = (x, y) => x >= 0 && x <= BINA.x1 && y >= 0 && y <= BINA.y1;
const alinan = (x, y, eirp) => Math.max(...AP.map(([ax, ay]) => {
  const d = Math.max(1, Math.hypot(x - ax, y - ay));
  return eirp - (icinde(x, y) ? FSPL1 + 10 * IC_US * Math.log10(d)
    : FSPL1 + 10 * DIS_US * Math.log10(d) + DUVAR);
}));
function harita(eirp) {                        // izgara: her hucre 1 metrekare sayilir
  const h = { ic: 0, kapsanan: 0, disKul: 0, disDuy: 0, uzak: 0 };
  for (let x = -120; x <= 182; x++) for (let y = -120; y <= 158; y++) {
    const g = alinan(x, y, eirp);
    if (icinde(x, y)) { h.ic++; if (g > KUL) h.kapsanan++; continue; }
    if (g > KUL) h.disKul++;
    if (g > DUY) { h.disDuy++; h.uzak = Math.max(h.uzak, -x, x - BINA.x1, -y, y - BINA.y1); }
  }
  return h;
}
const E = [11, 13, 12, 16, 14, 11, 15];
const yaz = (a) => a.map((d, i) => String(d)[i ? 'padStart' : 'padEnd'](E[i])).join('');
console.log(`bina ${BINA.x1} x ${BINA.y1} m, erisim noktasi ${AP.length}, 1 m kaybi ` +
  `${FSPL1.toFixed(1)} dB, esik ${KUL} / ${DUY} dBm`);
console.log(yaz(['gonderim', 'ic kapsanan', 'ic bosluk', 'dis kullanilir', 'dis duyulur',
  'en uzak m', 'kesilen aygit']));
for (const eirp of [20, 17, 14, 11, 8]) {
  const h = harita(eirp);
  console.log(yaz([`${eirp} dBm`, h.kapsanan, h.ic - h.kapsanan, h.disKul, h.disDuy, h.uzak,
    Math.round((DIZUSTU * (h.ic - h.kapsanan)) / h.ic)]));
}
const t = harita(20);
console.log(`\ndis duyulur alan ic alanin ${(t.disDuy / t.ic).toFixed(1)} kati; 8 dBm'de dis ` +
  `kullanilir 0, dis duyulur hala ${harita(8).disDuy} m2`);
```

```
bina 62 x 38 m, erisim noktasi 4, 1 m kaybi 46.8 dB, esik -70 / -85 dBm
gonderim     ic kapsanan   ic bosluk  dis kullanilir   dis duyulur  en uzak m  kesilen aygit
20 dBm              2416          41            1838         29622         75              4
17 dBm              1998         459             612         18148         55             39
14 dBm              1554         903             124         11046         40             77
11 dBm              1158        1299               0          6558         28            111
8 dBm                740        1717               0          3702         19            147

dis duyulur alan ic alanin 12.1 kati; 8 dBm'de dis kullanilir 0, dis duyulur hala 3702 m2
```

Birinci satır bu dersin ana sayısını veriyor. Yirmi desibelmilivat gönderimde bina içinde iki bin
dört yüz on altı metrekare kapsanıyor ve kırk bir metrekarelik bir boşluk kalıyor. Aynı anda
**bina dışında** bin sekiz yüz otuz sekiz metrekarelik bir alanda bağlantı kurulabiliyor ve yirmi
dokuz bin altı yüz yirmi iki metrekarelik bir alanda çerçeveler duyulabiliyor. İkinci sayı iç
alanın **on iki katıdır** ve bina duvarından yetmiş beş metre dışarı uzanıyor.

Bu bölgenin hiçbir noktasında bir kural yazılamaz. Üçüncü ve dördüncü dersin ölçtüğü yolların
hepsi burada yaşıyor: ikiz bir erişim noktası ya da bağlantı öncesi çerçeveleri taklit eden bir
kaynak, yirmi dokuz bin metrekarenin herhangi bir noktasında bulunabilir.

Gönderim gücünü düşürmek akla gelen ilk savunmadır ve tablo bedelini sayıyor. On yedi
desibelmilivatta dış kullanılabilir alan altı yüz on ikiye iniyor; karşılığında iç kapsama
boşluğu kırk birden dört yüz elli dokuz metrekareye çıkıyor ve otuz dokuz dizüstü dışarıda
kalıyor. On bir desibelmilivatta dış kullanılabilir alan **sıfır** oluyor, iç boşluk bin iki yüz
doksan dokuz metrekare ve etkilenen aygıt yüz on bir.

Son satır asıl sonucu veriyor. Sekiz desibelmilivatta dış kullanılabilir alan sıfır olsa da dış
duyulabilir alan hâlâ üç bin yedi yüz iki metrekaredir. Gönderim gücü sıfırlanamayacağına göre bu
sayı da sıfırlanamaz: **bağlantı kurulabilen yüzey kapatılabilir, duyulabilen yüzey
kapatılamaz.** Fiziksel sınır bir savunma değil, olsa olsa bir daraltmadır.

Gücü düşürmenin tabloda görünmeyen bir yan etkisi de var: istemci aynı adı bildiren adaylardan
en güçlü sinyalliyi seçtiği için, kendi erişim noktalarını zayıflatmak ikiz bir noktanın o
karşılaştırmayı kazanmasını **kolaylaştırır**.

#### Taramanın Bulduğu ve Bulamadığı

İkinci ölçüm aynı yüzeyde kimin bulunduğunu soruyor. Tarama bir kanal listesi üzerinde dinler ve
duyduğu kaynakları envanterle karşılaştırır.

```js
// tarama.mjs — yetkisiz cihaz taramasinin buldugu ve bulamadigi kalem (model). Tarama yalniz
// kurgu envanter uzerinde kosar; gercek bir aga yonelik hicbir islem yoktur.
// [ad, kanal, yayin araligi (s), surekli acik mi, envanterde mi]
const KAYNAK = [
  ['sayac ucu', 6, 900, true, true], ['saha terminali', 36, 5, true, true],
  ['sube dizustu', 44, 2, true, true], ['pano ekrani', 36, 30, true, true],
  ['barkod yazicisi', 6, 600, true, true], ['bakim dizustu', 149, 2, true, true],
  ['kisisel erisim noktasi', 11, 0.1, true, false],
  ['adini yayinlamayan nokta', 157, 300, true, false],
  ['kablosuz kopru', 165, 1800, true, false],
  ['gecici ikiz nokta', 44, 0.1, false, false],
  ['eski kusakli test noktasi', 1, 0.1, true, false],
  ['taranmayan bantta nokta', 100, 0.1, true, false],
];
const KANAL = [1, 6, 11, 36, 40, 44, 48, 149, 153, 157, 161, 165];
const PLAN = [['8 kanal, 20 dakika', 8, 1200], ['12 kanal, 20 dakika', 12, 1200],
  ['12 kanal, 2 saat', 12, 7200], ['12 kanal, surekli', 12, 86400]];
const gorulur = ([, kanal, aralik, surekli], [, kanalSayisi, sure]) =>
  !KANAL.slice(0, kanalSayisi).includes(kanal) ? 'kanal disinda'
    : sure / kanalSayisi < aralik ? 'dinleme penceresi kisa'
      : (!surekli && sure < 86400) ? 'tarama aninda kapali' : 'bulundu';
const ic = KAYNAK.filter((k) => k[4]), dis = KAYNAK.filter((k) => !k[4]);
const E = [22, 12, 17, 16, 18];
const yaz = (a) => a.map((d, i) => String(d)[i ? 'padStart' : 'padEnd'](E[i])).join('');
console.log(`kaynak ${KAYNAK.length} (envanterde ${ic.length}, envanter disi ${dis.length}), ` +
  `taranabilen kanal ${KANAL.length}`);
console.log(yaz(['tarama plani', 'kanal/sure', 'envanter kalemi', 'envanter disi',
  'kanal basina (s)']));
for (const p of PLAN) {
  const b = (l) => l.filter((k) => gorulur(k, p) === 'bulundu').length;
  console.log(yaz([p[0], `${p[1]}/${p[2]}s`, `${b(ic)}/${ic.length}`, `${b(dis)}/${dis.length}`,
    (p[2] / p[1]).toFixed(0)]));
}
const A = [28, 13, 24, 22];
const yaz2 = (a) => a.map((d, i) => String(d)[i ? 'padStart' : 'padEnd'](A[i])).join('');
console.log('\n' + yaz2(['kaynak', 'envanterde', '2 saatlik tarama', 'surekli izleme']));
for (const k of KAYNAK)
  console.log(yaz2([k[0], k[4] ? 'evet' : 'hayir', gorulur(k, PLAN[2]), gorulur(k, PLAN[3])]));
```

```
kaynak 12 (envanterde 6, envanter disi 6), taranabilen kanal 12
tarama plani            kanal/sure  envanter kalemi   envanter disi  kanal basina (s)
8 kanal, 20 dakika         8/1200s              4/6             2/6               150
12 kanal, 20 dakika       12/1200s              4/6             2/6               100
12 kanal, 2 saat          12/7200s              5/6             3/6               600
12 kanal, surekli        12/86400s              6/6             5/6              7200

kaynak                         envanterde        2 saatlik tarama        surekli izleme
sayac ucu                            evet  dinleme penceresi kisa               bulundu
saha terminali                       evet                 bulundu               bulundu
sube dizustu                         evet                 bulundu               bulundu
pano ekrani                          evet                 bulundu               bulundu
barkod yazicisi                      evet                 bulundu               bulundu
bakim dizustu                        evet                 bulundu               bulundu
kisisel erisim noktasi              hayir                 bulundu               bulundu
adini yayinlamayan nokta            hayir                 bulundu               bulundu
kablosuz kopru                      hayir  dinleme penceresi kisa               bulundu
gecici ikiz nokta                   hayir    tarama aninda kapali               bulundu
eski kusakli test noktasi           hayir                 bulundu               bulundu
taranmayan bantta nokta             hayir           kanal disinda         kanal disinda
```

Birinci tablo tarama süresinin ne satın aldığını gösteriyor. Yirmi dakikalık bir tarama, kanal
sayısı sekiz de olsa on iki de olsa, envanterdeki altı kalemin dördünü ve envanter dışı altı
kaynağın ikisini buluyor: kanal sayısını artırmak tek başına hiçbir şey kazandırmıyor, çünkü
toplam süre sabitken kanal başına dinleme penceresi yüz elli saniyeden yüze **iniyor**. İki
saatte sayılar beşe ve üçe çıkıyor. Belirleyici olan dinleme penceresidir: kanal başına altı yüz
saniye dinleyen bir tarama, dokuz yüz saniyede bir konuşan bir kaynağı duyamaz.

İkinci tablonun ilk satırı bu dersin asıl bulgusudur. **Kurumun kendi dört bin yüz sayaç ucu iki
saatlik taramada görünmüyor** — yetkisiz cihaz değil, envanterin en kalabalık kalemi. Bir
taramanın "envanterle uyuşuyor" demesi envanterin doğrulandığı anlamına gelmez; yalnız taramanın
duyduğu kalemlerin uyuştuğu anlamına gelir.

Bulunamama nedenlerinin ikisi için çözüm süredir: sürekli izleme sayaç ucunu, kablosuz köprüyü
ve geçici ikiz noktayı yakalar. Üçüncüsü farklıdır — **kanal dışında** kalan kaynak sürekli
izlemeyle de bulunmaz, çünkü taramanın kapsamı süre değil kanal listesidir.

Aynı sınır ilk bölümün haritasına bağlanıyor: bir tarama yalnız tarayıcının duyduğu yeri kapsar.
İki ölçüm aynı yüzeyi veriyor — sinyalin taştığı alan hem savunmasız bölgedir hem de taramanın
kör noktası.

#### Özet

- Kapsama haritasında bina dışında 1.838 metrekarede bağlantı kurulabiliyor, 29.622 metrekarede
  çerçeveler duyulabiliyor: ikincisi iç alanın **12,1 katı** ve duvardan 75 metre dışarıda.
- Gönderim gücünü düşürmek dış kullanılabilir alanı 11 dBm'de sıfırlıyor; bedeli 1.299
  metrekarelik kapsama boşluğu ve 111 aygıttır. Dış **duyulabilir** alan hiçbir güç düzeyinde
  sıfırlanmıyor: 8 dBm'de bile 3.702 metrekare.
- Yirmi dakikalık tarama envanterdeki 6 kalemin 4'ünü buluyor; kanal sayısını artırmak kanal
  başına dinleme penceresini kısalttığı için tek başına hiçbir şey kazandırmıyor ve kurumun kendi
  4.100 sayaç ucu iki saatlik taramada görünmüyor.
- Envanter dışı 6 kaynağın 3'ü iki saatte, 5'i sürekli izlemede bulunuyor; taranmayan bantta
  çalışan kaynak hiçbir planda bulunmuyor.

#### Kurs Kapanışı

| Ders | Doğrulanmayan iddia | Savunmanın doğruladığı | Doğrulamanın bedeli |
|---|---|---|---|
| Katman modelleri ve saldırı yüzeyi | 18 iddia, 0 kanıt | 5 katman 11 iddia | 4 ek tur, 25 elle kalem |
| Bağlantı noktaları ve servisler | 49 kabul noktası, 21 kanıtsız | daraltma 27 noktaya iner | 4 dönemsel akış kesilir |
| Adres çözümleme saldırıları | 26 yanıtın 6 bozuk kaydı | üç savunma 6 kaydı kurtarır | 16 ek tur, 4 reddedilen yanıt |
| Ad çözümleme saldırıları | 7 bozuk ad, 38 servis | imzalı doğrulama 3 ad, 14 servis | katı kip 47 servisi durdurur |
| Adres dağıtımı riskleri | 14 uçta 70 iddia, 35'i sahte | havuz ve sabit ayırma 12 uç | 3 elle kalem, 2 uç yanlış |
| Hizmet engelleme saldırıları | 4.096 yuva 1,02 saniyede dolar | el sıkışma kanıtı yuvayı sıfırlar | meşru trafiğin %15'i elenir |
| Araya girme saldırıları | 36 adımın 16'sı içeriği okur | uç doğrulama ve kök sabitleme 16 adım | 84 kalemlik liste, 7 kesilen akış |
| Tekrar ve sahtecilik saldırıları | 10 türün 5'i tekrarla durum değiştirir | üç kanıt 3 tam, 5 kısmi tür | 503 reddedilen mesaj, 224 durum kalemi |
| Güvenlik duvarı nesilleri | 48 iddianın 40'ı kanıtsız | uygulama farkındalıklı nesil 45 iddia | 94.112 durum kaydı, 6 çözümleyici |
| Ağ bölütleme ve arındırılmış bölge | geçişli kalem 210 | bölütleme 25 kaleme indirir | 15 kural satırı, 2 kesilen akış |
| Vekil ve sıçrama sunucusu | bağlantıların %99,5'i kayıtsız | özne kimliği 3.118 bağlantıda | tek düşüşte 210.502 bağlantı |
| Saldırı tespit ve önleme | 14 sınıfın 3'ü ağdan görünmez | iki algılayıcı 7 sınıfın 6'sı | önleme 5.214 meşru olay keser |
| Bal küpleri ve yönlendirme kuyuları | imza düzeninde %29,8 yanlış pozitif | aldatma 594 uyarı, %1,2 yanlış | kuyuda 22.690 bağlantı kayıtsız |
| Sanal özel ağlar | uzak uç 136 kaleme doğrudan erişir | ayrı bölge 16 kaleme indirir | 8 saatlik kanıt, 97.100 denetimsiz bağlantı |
| Erişim denetim listeleri | 10 kuralda 2 sıraya duyarlı çift | yazıldığı sırada 16 akışın 15'i | ters sırada 16 akış reddedilir |
| Kablosuz şifreleme kuşakları | 10 iddia, eski kuşakta 0 kanıt | eşzamanlı kuşak 7 iddia | 4.321 aygıt dışarıda kalır |
| Kimlik doğrulama yöntemleri | 7 iddianın 6'sı kanıtsız | kurumsal mod ve sabit kök 7 iddia | 7 altyapı kalemi, 4.138 aygıt |
| Sahte erişim noktaları | 6 işaret 0 kanıt, 4 açık yol | üç savunma açık yolu sıfırlar | günde 976 elle onay |
| Kimlik doğrulama düşürme | 12 çerçeve türünün 11'i kanıtsız | koruma 3 çerçeve, 3 yol | 5 yol açık, koruma zorunlu |
| Kablosuz ağ denetimi | dış duyulur alan iç alanın 12,1 katı | 11 dBm'de dış kullanılır alan 0 | 1.299 m² boşluk, 111 aygıt |

İkinci sütun bu kursun kuralını yazıyor: **ağ güvenliği bir kutu listesi değil, mesajların
taşıdığı iddiaların kaçının kanıtlanabildiğidir; kanıtlanamayan her iddia bir yoldur.** Hiçbir
savunma "kurulur ve biter" biçiminde ölçülmedi; her biri bir iddia kümesinin üzerinde koşturuldu.

Üçüncü sütun dört kümede toplanıyor. **Ek tur ve anahtar kalemi** doğrulamanın protokole yazılan
bedelidir; **kesilen meşru iş** işe yazılan bedeldir; **dışarıda kalan aygıt** envantere yazılan
bedeldir ve kablosuz derslerde binlerle ölçülür; **elle yönetilen kalem** hem bakım yüküdür hem
de yanlış yapılandırılabilecek yer sayısıdır.

Yirmi dersin hiçbirinde açık iddia sayısı sıfıra inmedi ve kalan iddialar aynı türdendi: bir
öznenin kim olduğu, bir çerçevenin bağlantı kurulmadan önce gönderilmiş olması, bir sinyalin
duvarın dışında duyulabiliyor olması. Bütün bu ölçümün altında sorulmamış bir varsayım da
duruyor. Yirmi derste bir iddianın
"doğrulanabilir" sayılması, bir kanıtın sınanabildiği anlamına geliyordu: bir imza tutuyordu, bir
ortak sır biliniyordu, bir kimlik bir güven köküne bağlanıyordu. O kanıtın **neye dayandığı**
hiç sorulmadı. İmzayı doğrulayan anahtar nereden geldi, ortak sır kimin elinde duruyor, güven
kökü neden güvenilir? **M24/K04 Kimlik, Erişim ve Kriptografi** tam olarak bu soruyla başlar:
bir iddianın kanıtlanabilmesi neye dayanıyor, anahtar kimde duruyor ve güven nereden başlıyor?

