---
title: 'Uç Nokta ve Sistem Sertleştirme'
source: 'https://academia.sh/tr/kurslar/uc-nokta-guvenligi'
language: tr
updated: '2026-08-17T04:39:50+00:00'
license: 'CC BY-SA 4.0'
lessons: 16
outcomes:
    - 'Otomatik çalıştırılan kalemleri sayarak tutunma noktalarını envanterler'
    - 'Her denetimin kapattığı ile yalnız görünür kıldığı noktayı ayırır'
    - 'Uç nokta günlüklerinden şüpheli etkinliği çıkarır ve kaynak boşluğunu sayar'
---

# Uç Nokta ve Sistem Sertleştirme

Kod bir kez uçta çalıştığında tutunmanın kaç noktadan mümkün olduğu: gereksiz hizmetin kaldırılmasının kapattığı nokta, yama döngüsü ile acil yamanın açık bıraktığı pencere, yapılandırma kıyaslama kılavuzunun uygulanamayan maddeleri, uygulama izin listelerinin engellediği meşru iş, şüpheli kodun sanal alanda yalıtılması, tam disk şifrelemenin fiziksel erişimde koruduğu ve korumadığı kalem, kötü amaçlı yazılım türlerinin yayılma ve kalıcılık yöntemleri, imza ile davranış tabanlı tespitin yanlış pozitif ve kaçırma dengesi, uç nokta tespit ve yanıt telemetrisi, konak tabanlı filtreleme, yerleşik araçlarla saldırının imza tabanlı tespiti düşürmesi, kalıcılık mekanizmaları, olay ve kimlik doğrulama günlükleri, süreç oluşturma kayıtları ve günlük bütünlüğü.

## Sertleştirme

Uçtaki otomatik çalıştırılan kalemlerin sayılması: varsayılan kurulumun bıraktığı tutunma noktası, gereksiz kalemin ayıklanmasıyla kapanan nokta, yamanın açık bıraktığı pencere, yapılandırma kıyaslama kılavuzunun uygulanamayan maddeleri, uygulama izin listesinin engellediği meşru iş, sanal alanda çalıştırma kararı ve tam disk şifrelemenin fiziksel erişimde koruduğu kalem.

### Sertleştirme İlkeleri

Source: https://academia.sh/tr/kurslar/uc-nokta-guvenligi/sertlestirme-ilkeleri

Kursun ölçü birimi kurulur: varsayılan kurulumun dört makine sınıfında bıraktığı 84 tutunma noktası sayılır, gereksiz kalemin ayıklanması 40'ını kapatır, 44'ü yalnız taban çizgisine yazılır ve kapatmanın meşru işe bedeli 41 elle adım olarak çıkar.

Önceki kurs kimliği bir köke bağladı: anahtarın kime ait olduğu artık adlandırılmış bir zincire
dayanıyor. Zincirin tamamı doğru kurulmuş olsa bile o kök bir makinenin üzerinde duruyor ve makine
ele geçirilirse zincir saldırganın elinde geçerli kalmaya devam eder.

Bu kurs oradan başlar ve önceki dört kurstan farklı bir varsayımla açılır: **kod bir kez uçta
çalıştı**. Sayılan şey artık girişin engellenmesi değil, girişten sonra kalıcı olmanın kaç noktadan
mümkün olduğudur. Bir kez çalışan kod, makine yeniden başladığında ya da kullanıcı oturum açtığında
kendiliğinden yeniden çalışmıyorsa tek seferliktir; yeniden çalışabilmesi için makinenin kendi
otomatik çalıştırma düzenine bir kalem eklenmesi gerekir. O düzendeki her kalem bir **tutunma
noktasıdır** ve sayılabilir. Bu ders kursun ölçü birimini kurar.

#### Tutunma Noktası ve Kurulu Kalem

Bir envanter kalemi, çalıştırılması için kimsenin bir şey yapması gerekmiyorsa tutunma noktasıdır.
Beş tür bu tanıma girer: **açılış girişi**, **servis tanımı**, **zamanlanmış görev**, **oturum
betiği** ve **yapılandırma kancası**. Ortak yanları biçimsel değil işlevseldir — her biri bir
**tanım** taşır ve o tanımı yazabilen, makinenin bir sonraki açılışında ya da bir sonraki oturum
açılışında kendi seçtiği şeyin çalışmasını sağlar.

Kurulu bir paket bu tanıma girmez. Diskte duran bir ikili kendiliğinden çalışmaz; çalışması için ya
bir kullanıcının onu çağırması ya da yukarıdaki beş türden birinin onu adıyla anması gerekir. Ayrım
ölçümü küçültür ve keskinleştirir: envanterin tamamı değil, otomatik çalışan bölümü sayılır. Bu
kursta bir tutunma noktasının **nasıl** tanımlandığı — hangi dosyaya ne yazıldığı — hiçbir yerde
yazılmaz; sayılan şey türün var olması ve kaç tane olduğudur.

Ölçüm kurgu **bölgesel ölçüm ağı**nın dört makine sınıfında yapılır: saha ekiplerinin dizüstü
bilgisayarları, şube uçları, sayaç toplayıcı makineler ve merkezî işleme sunucuları.

- **SS1.** Otuz üç kalemlik envanter ve dört sınıf **modeldir**; gerçek bir makine taranmıyor,
  gerçek bir kaldırma yapılmıyor.
- **SS2.** Tutunma noktası sayımına yalnız beş otomatik tür girer; kurulu paket ayrı sayılır.
- **SS3.** "Gerekli" sütunu iş tanımından türetilmiş sayılır ve modelde sabittir. Gerçekte bu sütun
  bir envanter çalışmasıyla doldurulur ve rol değiştikçe değişir.
- **SS4.** Kaldırma bedeli, kalem kaldırıldığında elle adıma düşen meşru iş sayısıdır; elle yazıldı.
- **SS5.** Kaldırma tamdır: kalem ya vardır ya yoktur. Devre dışı bırakma ile kaldırma arasındaki
  ayrım modellenmiyor; ikincisi tanımı da siler, birincisi bırakır.
- **SS6.** Tanımı yazabilen alan tek değer taşır ve en geniş yetkiyi gösterir.

```js
// sert/envanter.mjs — varsayilan kurulumun biraktigi kalem envanteri MODELIDIR.
// Gercek bir makine taranmaz, gercek bir kaldirma yapilmaz; sayilar bu dosyadan turer.
export const SINIF = ['saha-dizustu', 'sube-ucu', 'toplayici', 'islem-sunucusu'];
// Otomatik calistirilan bes kalem turu tutunma noktasi sayilir; 'paket' sayilmaz.
export const NOKTA_TUR = ['acilis', 'servis', 'gorev', 'oturum', 'kanca'];
// satir: ad | tur | kurulu maskesi | gerekli maskesi | tanimini yazabilen | kaldirma bedeli
// maske dort karakter, sirasiyla SINIF; 'k' var, '.' yok.
// bedel: kalem kaldirilinca elle adima dusen mesru is sayisi.
export const KALEM = `
  acilis-yoneticisi-girisi     acilis kkkk kkkk yonetici       0
  kurtarma-acilis-girisi       acilis kkkk .... yonetici       2
  ag-uzerinden-acilis          acilis .kkk ..k. yonetici       0
  uzak-yonetim-hizmeti         servis kkkk .kkk yonetici       0
  yazdirma-kuyrugu             servis kk.. .k.. yonetici       0
  kesif-yayini                 servis kkkk .... yonetici       1
  uzak-masaustu                servis kk.. .k.. yonetici       0
  olcut-toplayici-ajani        servis kkkk kkkk yonetici       0
  gunluk-aktarim-ajani         servis kkkk kkkk yonetici       0
  yama-ajani                   servis kkkk kkkk yonetici       0
  yardimci-arac-hizmeti        servis kkkk .... yerel-yonetici 0
  bulut-esitleme-hizmeti       servis k... .... kullanici      2
  sayac-alim-hizmeti           servis ..k. ..k. yonetici       0
  is-kuyrugu-hizmeti           servis ...k ...k yonetici       0
  guncelleme-denetimi          gorev  kkkk kkkk yonetici       0
  disk-bakimi                  gorev  kkkk kkkk yonetici       0
  telemetri-gonderimi          gorev  kkkk .... yonetici       0
  yardimci-arac-guncellemesi   gorev  kkkk .... yerel-yonetici 1
  kullanici-gorev-klasoru      gorev  kk.. .... kullanici      3
  yedek-tetigi                 gorev  ..kk ..kk yonetici       0
  oturum-acilis-betigi         oturum kk.. kk.. yonetici       0
  kullanici-baslangic-klasoru  oturum kk.. .... kullanici      3
  kabuk-yapilandirma-dosyasi   oturum kkkk k.k. kullanici      2
  paket-yoneticisi-kancasi     kanca  kkkk ...k yonetici       1
  surucu-yukleme-kancasi       kanca  kkkk kk.. yonetici       0
  kimlik-dogrulama-eklentisi   kanca  kkkk .kkk yonetici       0
  kabuk-eklenti-dizini         kanca  kk.. .... kullanici      2
  belge-duzenleyici            paket  kk.. kk.. -              0
  arsiv-araci                  paket  kkkk kkkk -              0
  betik-calisma-zamani         paket  kkkk ..kk -              1
  veri-tabani-istemcisi        paket  ..kk ..kk -              0
  tanilama-araci-takimi        paket  kkkk .... -              3
  saha-olcum-uygulamasi        paket  k... k... -              0`
  .trim().split('\n').map((r) => {
    const [ad, tur, kurulu, gerek, yazan, bedel] = r.trim().split(/\s+/);
    return { ad, tur, kurulu, gerek, yazan, bedel: Number(bedel),
      nokta: NOKTA_TUR.includes(tur) };
  });

export const varMi = (k, i) => k.kurulu[i] === 'k';
export const gerekli = (k, i) => k.gerek[i] === 'k';
// Bir sinifta kurulu olan, gerekmeyen ve bu yuzden kaldirilabilen kalemler.
export const fazla = (i) => KALEM.filter((k) => varMi(k, i) && !gerekli(k, i));
export const noktalar = (i) => KALEM.filter((k) => k.nokta && varMi(k, i));
export const kalanlar = (i) => noktalar(i).filter((k) => gerekli(k, i));
export const olc = (i) => ({
  kurulu: KALEM.filter((k) => varMi(k, i)).length,
  nokta: noktalar(i).length,
  kapanan: fazla(i).filter((k) => k.nokta).length,
  kalan: kalanlar(i).length,
  bedel: fazla(i).filter((k) => k.nokta).reduce((a, k) => a + k.bedel, 0),
});
```

#### Envanterin Sayımı

```js
// sert/say.mjs — dort makine sinifinda tutunma noktasi, kapanan nokta ve kaldirma bedeli
import { SINIF, NOKTA_TUR, KALEM, olc, varMi, gerekli, noktalar, kalanlar, fazla } from './envanter.mjs';

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join('').trimEnd());
const top = (f) => SINIF.reduce((a, _, i) => a + f(i), 0);

console.log(`${KALEM.length} envanter kalemi; ${KALEM.filter((k) => k.nokta).length} tanesi ` +
  `otomatik calistirilan turden (${NOKTA_TUR.join(', ')})`);

const A = [-16, 8, 7, 9, 7, 8];
console.log('\n1. sinif basina sayim');
y(A, 'sinif', 'kurulu', 'nokta', 'kapanan', 'kalan', 'bedel');
for (const [i, s] of SINIF.entries()) {
  const o = olc(i);
  y(A, s, o.kurulu, o.nokta, o.kapanan, o.kalan, o.bedel);
}
y(A, 'toplam', top((i) => olc(i).kurulu), top((i) => olc(i).nokta),
  top((i) => olc(i).kapanan), top((i) => olc(i).kalan), top((i) => olc(i).bedel));

const B = [-8, 7, 9, 7, 8];
console.log('\n2. tur basina, dort sinifin toplami');
y(B, 'tur', 'nokta', 'kapanan', 'kalan', 'bedel');
for (const t of NOKTA_TUR)
  y(B, t, top((i) => noktalar(i).filter((k) => k.tur === t).length),
    top((i) => fazla(i).filter((k) => k.nokta && k.tur === t).length),
    top((i) => kalanlar(i).filter((k) => k.tur === t).length),
    top((i) => fazla(i).filter((k) => k.nokta && k.tur === t).reduce((a, k) => a + k.bedel, 0)));

console.log('\n3. sinifa gore ayrisan nokta (bir sinifta gerekli, otekinde fazla)');
const ayrisan = KALEM.filter((k) => k.nokta && SINIF.some((_, i) => varMi(k, i) && gerekli(k, i))
  && SINIF.some((_, i) => varMi(k, i) && !gerekli(k, i)));
for (const k of ayrisan) y([-30, -8, -6], k.ad, k.tur, k.gerek);

const yz = (i) => noktalar(i).filter((k) => k.yazan !== 'yonetici');
console.log(`\nayri karar isteyen nokta        ${ayrisan.length} kalem, ` +
  `${top((i) => ayrisan.filter((k) => varMi(k, i)).length)} karar`);
console.log(`yoneticisiz tanimlanabilen nokta ${top((i) => yz(i).length)} karar, ` +
  `kapanan ${top((i) => yz(i).filter((k) => !gerekli(k, i)).length)}, ` +
  `kalan ${top((i) => yz(i).filter((k) => gerekli(k, i)).length)}`);
console.log(`kaldirilabilir paket             ${top((i) => fazla(i).filter((k) => !k.nokta).length)} karar, ` +
  `bedel ${top((i) => fazla(i).filter((k) => !k.nokta).reduce((a, k) => a + k.bedel, 0))}`);
console.log(`toplam nokta karari ${top((i) => olc(i).nokta)}: ` +
  `kapatilan ${top((i) => olc(i).kapanan)}, ` +
  `yalniz taban cizgisine yazilan ${top((i) => olc(i).kalan)}`);
```

```
33 envanter kalemi; 27 tanesi otomatik calistirilan turden (acilis, servis, gorev, oturum, kanca)

1. sinif basina sayim
sinif             kurulu  nokta  kapanan  kalan   bedel
saha-dizustu          28     23       14      9      15
sube-ucu              27     23       11     12      15
toplayici             23     19        7     12       5
islem-sunucusu        23     19        8     11       6
toplam               101     84       40     44      41

2. tur basina, dort sinifin toplami
tur       nokta  kapanan  kalan   bedel
acilis       11        6      5       8
servis       31       12     19       6
gorev        20       10     10      10
oturum        8        4      4      10
kanca        14        8      6       7

3. sinifa gore ayrisan nokta (bir sinifta gerekli, otekinde fazla)
ag-uzerinden-acilis           acilis  ..k.
uzak-yonetim-hizmeti          servis  .kkk
yazdirma-kuyrugu              servis  .k..
uzak-masaustu                 servis  .k..
kabuk-yapilandirma-dosyasi    oturum  k.k.
paket-yoneticisi-kancasi      kanca   ...k
surucu-yukleme-kancasi        kanca   kk..
kimlik-dogrulama-eklentisi    kanca   .kkk

ayri karar isteyen nokta        8 kalem, 27 karar
yoneticisiz tanimlanabilen nokta 19 karar, kapanan 17, kalan 2
kaldirilabilir paket             6 karar, bedel 14
toplam nokta karari 84: kapatilan 40, yalniz taban cizgisine yazilan 44
```

#### Kapatılan Nokta ile Kayda Geçen Nokta

Toplam satırı kursun iki sütununu birden veriyor. Dört sınıfta 84 tutunma noktası kararı var;
gereksiz kalemin ayıklanması bunların **40'ını kapatıyor** ve **44'ü açık kalıyor**. Açık kalan
44 nokta için yapılabilecek tek şey tanımlarının bir taban çizgisine yazılması ve sonraki
sapmaların o çizgiyle karşılaştırılmasıdır. Bu bir kapatma değildir; kaydedilmiş bir nokta
kullanıldığında hâlâ çalışır, yalnız karşılaştırma yapıldığında görülür.

İki sütunun ayrı tutulması bu kursun kuralıdır. "Sertleştirildi" cümlesi tek başına hangi sütuna
yazıldığını söylemez. Kapatılan nokta bir daha kullanılamaz; kayda geçen nokta kullanılabilir ve
yalnız birileri kaydı okuduğunda fark edilir.

Model bir kalemi ya var ya yok sayıyor (SS5) ve bu, gerçekte iki ayrı işlemi tek sayıya indiriyor.
Bir servisi **devre dışı bırakmak** onun tanımını yerinde bırakır ve yalnız çalıştırma bayrağını
kapatır; **kaldırmak** tanımı da siler. Sayım açısından fark şudur: devre dışı bırakılmış bir kalem
kapatılan sütununa değil, kayda geçen sütununa aittir, çünkü tanımı yazabilen biri bayrağı geri
açabilir. Aradaki fark ölçüldüğünde çoğu envanterde 40 sayısı düşer — kaldırılamayan ama devre dışı
bırakılabilen kalemler kapatılmış sanılır. Bu dersin sayımı, kaldırmanın gerçekten yapıldığını
varsayar; bir uçta yapılmadıysa o kalem ikinci sütuna taşınır.

Sınıf satırları ters bir dağılım gösteriyor. Saha dizüstü bilgisayarı en çok kalem taşıyan sınıftır
(28 kurulu, 23 nokta) ve en çok temizlenen sınıftır: 14 nokta kapanıyor, 9 kalıyor. Toplayıcı
makinede 19 noktanın yalnız 7'si kapanıyor, çünkü kurulu olan neredeyse hep gereklidir. Yani
temizlik en çok, tek bir işi olmayan ve çok amaçlı kurulan makinede kazandırır; tek işi olan
makinede kazanılacak alan zaten dardır.

Tür tablosu kalan tarafın nerede toplandığını veriyor. Otuz bir servis tanımının yalnız 12'si
kapanıyor; 19 servis kalıyor ve bu, kalan 44 noktanın en büyük parçasıdır. Ölçüt toplayıcı, günlük
aktarımı, yama ajanı ve kimlik doğrulama eklentisi kaldırılamaz, çünkü makinenin yönetilebilir
olması bunlara bağlıdır. Sertleştirmenin sınırı burada görünür: bir uç noktayı yönetilebilir kılan
kalemler, o uçta kalıcı olmanın da yollarıdır.

#### Kimin Yazabildiği, Kaç Tane Olduğundan Önemli

Ayrı satır 84 noktanın 19'unu işaretliyor: yönetici yetkisi olmadan tanımlanabilen noktalar.
Kullanıcı görev klasörü, kullanıcı başlangıç klasörü, kabuk eklenti dizini, kabuk yapılandırma
dosyası, bulut eşitleme hizmeti ve yerel yönetici yetkisiyle gelen iki yardımcı araç kalemi bu
kümededir. Temizlik bunların **17'sini kapatıyor**, geriye **2** kalıyor.

Sayının küçüklüğü sonucun önemini azaltmaz. Yönetici yetkisi gerektiren bir tutunma noktası, o
yetkiyi zaten elde etmiş birinin kullanabileceği bir kalemdir; yönetici yetkisi gerektirmeyen bir
nokta, sıradan bir kullanıcı oturumunda çalışan koda açıktır. İki kalem arasındaki fark sayıda
değil, hangi adımdan sonra kullanılabildiğindedir. Kalan iki kalem — saha dizüstü bilgisayarında ve
toplayıcı makinede kabuk yapılandırma dosyası — kaldırılamaz, çünkü iki sınıfta da işin kendisi
kabuk üzerinden yürüyor.

#### Sınıfa Göre Ayrışan Kalem

Üçüncü blok sekiz kalemi ayırıyor: her biri bir sınıfta gerekli, ötekinde fazla. Uzak yönetim
hizmeti üç sınıfta zorunlu, saha dizüstü bilgisayarında gereksiz. Yazdırma kuyruğu yalnız şube
ucunda gerekli. Ağ üzerinden açılış yalnız toplayıcı makinede. Paket yöneticisi kancası yalnız
işleme sunucusunda.

Bu sekiz kalem 27 karar üretiyor ve tek bir kurumsal "kaldırılacaklar listesi" bunları
çözemez. Liste sekiz kalemi de kaldırırsa üç sınıfta yönetim erişimi kapanır; hiçbirini
kaldırmazsa saha dizüstü bilgisayarında gereksiz bir nokta açık kalır. Doğru olan sınıf başına ayrı
karar vermektir ve bakım maliyeti tam olarak budur: dört liste, 84 karar ve her rol değişikliğinde
yeniden bakılması gereken 8 sınır kalemi.

#### Kapatmanın Bedeli

Bedel sütunu 41 elle adım gösteriyor ve dağılımı da terstir: en çok nokta kapatılan iki sınıf en
yüksek bedeli ödüyor (15 ve 15), en az kapatılan iki sınıf en düşüğü (5 ve 6). Tür tablosunda oran
daha keskin: oturum betiklerinde 4 kapanan noktaya 10 bedel düşüyor, servis tanımlarında 12 kapanan
noktaya 6. Kullanıcının kendi kurduğu kalemleri kapatmak, servis tanımlarını kapatmaktan yaklaşık
beş kat pahalıdır — çünkü kullanıcı o kalemi bir işi yürütmek için kurmuştu ve kalem kapandığında iş
yönetime düşer.

Kalemler adıyla okunduğunda bedel somutlaşıyor. Kurtarma açılış girişi dört sınıfta da fazladır ve
kaldırıldığında yerinde onarım taşınabilir ortam ister; dört sınıfta 8 elle adım. Kullanıcı görev
klasörü ve başlangıç klasörü, kullanıcıların kendi zamanlamalarını kurma yoludur; kapatıldığında her
istek bir yönetim işine dönüşür.

Paket tarafı ayrı sayılıyor: 6 kaldırma kararı ve 14 elle adım. Tanılama araç takımı dört sınıfta da
fazladır ama sorun giderme onunla yapılır; kaldırılırsa her olayda yeniden kurulum gerekir. Bu paket
bir tutunma noktası değildir — kendiliğinden çalışmaz — ama disk üzerinde durduğu sürece onu
çağırabilecek bir noktanın işine yarar. Aynı kalem uygulama izin listesi dersinde yeniden sayılacak.

#### Özet

- Tutunma noktası, çalıştırılması için kimsenin bir şey yapması gerekmeyen kalemdir: açılış girişi,
  servis tanımı, zamanlanmış görev, oturum betiği ve yapılandırma kancası. Kurulu paket bu kümeye
  girmez ve ayrı sayılır.
- Dört makine sınıfında 101 kurulu kalem kararının 84'ü tutunma noktasıdır; gereksiz kalemin
  ayıklanması 40'ını kapatır, 44'ü açık bırakır. Açık kalanlar için yapılabilecek tek şey taban
  çizgisine yazmaktır — bu bir kapatma değil, görünür kılmadır.
- Servis tanımları kalan tarafın en büyük parçasıdır: 31 noktanın 19'u kaldırılamaz, çünkü uç
  noktayı yönetilebilir kılan kalemler aynı zamanda orada kalıcı olmanın yollarıdır.
- Yönetici yetkisi olmadan tanımlanabilen 19 noktanın 17'si kapanır, 2'si kalır. Bir noktanın
  kim tarafından yazılabildiği, kaç tane olduğundan daha çok karar taşır.
- Sekiz kalem sınıfa göre ayrışır ve 27 karar üretir; tek bir kurumsal liste bunları ya bir sınıfta
  gereksiz iş ya ötekinde eksik kapatma olarak çözer.
- Kapatmanın bedeli 41 elle adımdır ve en çok temizlenen sınıflarda en yüksektir; oturum
  betiklerinde kapanan nokta başına bedel, servis tanımlarının yaklaşık beş katıdır.

#### Sonraki Adım

Kalan 44 nokta kapatılamıyor, çünkü iş onları gerektiriyor. Ama bu noktaları taşıyan bileşenler
durdukları yerde eskiyor: bir servis tanımının arkasındaki ikilide kusur duyurulduğunda o nokta,
kaldırılamadığı için, yama uygulanana kadar kullanılabilir kalır. Sonraki dersin ölçüsü bu yüzden
**pencere**dir: yayımla uygulama arasında geçen gün, o pencerede açık kalan nokta sayısı ve ikisinin
çarpımı. Acil yama pencereyi kısaltır ama sınama adımlarının kaçını atladığı ve kaç kesinti ürettiği
ayrıca sayılır. Yamanın kapattığı şeyin ne olduğu da ayrı bir sorudur: bir yama tutunma noktasını
kaldırmaz, yalnız o noktaya ulaşmanın bilinen bir yolunu kapatır.

### Yama Yönetimi

Source: https://academia.sh/tr/kurslar/uc-nokta-guvenligi/yama-yonetimi

Yamanın ölçüsü pencere olarak alınır: 102 makinelik filoda 12 duyuru için yayımla uygulama arasındaki gün, o pencerede açık kalan 1038 tutunma noktasının nokta-günü karşılığı, acil yolun 48 sınama kaleminden 36'sını atlayarak ürettiği 939 plan dışı kesinti ve hiçbir düzende kapanmayan 12 nokta.

Önceki ders dört makine sınıfında 44 tutunma noktasını kapatılamaz olarak bıraktı: işin kendisi
onları gerektiriyor. Kapatılamayan bir nokta durduğu yerde eskimez, ama onu tanımlayan bileşen
eskir. Bir servis tanımının arkasındaki ikilide kusur duyurulduğunda o nokta — kaldırılamadığı için
— yama uygulanana kadar bilinen bir yolla kullanılabilir kalır.

Bu dersin ölçüsü **pencere**dir: duyurunun yayımlandığı gün ile yamanın uygulandığı gün arasındaki
süre. Pencere tek başına bir zaman aralığıdır; taşıdığı ağırlık, o aralıkta açık kalan nokta
sayısıyla çarpıldığında çıkar. Birim **nokta-günü**dür.

#### Yama Neyi Kapatır

Bu ders bir ayrımla başlar, çünkü ayrım yapılmadığında sonraki bütün sayılar yanlış sütuna yazılır.
Bir yama tutunma noktasını **kaldırmaz**. Yama uygulandıktan sonra servis tanımı yerinde durur,
zamanlanmış görev yerinde durur, açılış girişi yerinde durur. Değişen tek şey, o noktanın tanımını
yazmaya izin veren **bilinen bir kusurun** ortadan kalkmasıdır.

Bu, kursun iki sütunu açısından şu demektir: yamanın kapattığı nokta sayısı sıfırdır. Yamanın
azalttığı şey, noktanın **ulaşılabilir olduğu süredir**. Önceki dersin ayıklaması 40 noktayı
gerçekten kapattı; yama hiçbirini kapatmaz, yalnız kalan 44'ün ne kadar süreyle açık olduğunu
belirler. İki iş birbirinin yerine geçmez ve birbirini de gereksiz kılmaz.

Kurulum sonrası açık yüzey ve yama penceresinin dört parçası **Sunucu, Ağ ve Sertleştirme**
kursunda ölçüldü; burada tekrarlanmaz. Buradaki ölçü sunucu kalemi değil tutunma noktasıdır ve
sayım filo üzerinde yapılır.

- **SS7.** 102 makinelik filo, dört sınıf ve 12 duyuru **modeldir**; gerçek bir yama indirilmiyor,
  gerçek bir filo taranmıyor. Sınıf başına kalan nokta sayısı (9, 12, 12, 11) önceki dersten gelir.
- **SS8.** Her tutunma noktasının tanımı tek bir bileşene ait sayılır. Gerçekte bir nokta birden çok
  bileşene bağlı olabilir; bu, sayıları büyütür, yönünü değiştirmez.
- **SS9.** Rastgelelik yok: duyuru günleri, bileşenler ve takvim modelde yazılıdır.
- **SS10.** Kusurlu yama ve geri alma modellenmiyor; ikisi de önceki kursta ölçüldü ve burada girdi
  olarak alınır.
- **SS11.** Bakım takvimi sabit aralıklıdır. Çevrimdışı olduğu için turu kaçıran makine sayısı sınıf
  başına sabittir ve o makineler bir sonraki turda yamalanır.
- **SS12.** Acil yol 1,5 günde uygular ve dört sınama kaleminin üçünü atlar; turu kaçıran makineler
  acil yolu da kaçırır.

```js
// yama/model.mjs — pencere MODELIDIR: kurgu filoda duyuru gunu, uygulama gunu ve o araliktaki
// acik tutunma noktasi. Gercek bir yama indirilmez, gercek bir filo taranmaz.
// Sinif basina kalan nokta sayisi (9, 12, 12, 11) onceki dersten gelir.
export const SINIF = [
  // ad, makine, takvim araligi (gun), takvim ofseti, cevrimdisi kaldigi icin turu kaciran makine
  { ad: 'saha-dizustu',   makine: 60, takvim: 21, ofs: 6, kacan: 9 },
  { ad: 'sube-ucu',       makine: 24, takvim: 14, ofs: 3, kacan: 1 },
  { ad: 'toplayici',      makine: 12, takvim: 7,  ofs: 2, kacan: 0 },
  { ad: 'islem-sunucusu', makine: 6,  takvim: 30, ofs: 9, kacan: 0 },
];
// Her bilesen, sinif basina kac tutunma noktasinin tanimini tasiyor; agir: makine yeniden baslar.
export const BILESEN = {
  cekirdek:             { nokta: [2, 2, 2, 2], agir: true },
  'sistem-kitapligi':   { nokta: [1, 1, 1, 1], agir: true },
  'uzak-yonetim':       { nokta: [0, 1, 1, 1], agir: false },
  'gozetim-ajani':      { nokta: [2, 2, 2, 2], agir: false },
  'yama-ajani':         { nokta: [2, 2, 2, 2], agir: false },
  'kimlik-eklentisi':   { nokta: [0, 1, 1, 1], agir: false },
  kabuk:                { nokta: [2, 2, 2, 1], agir: false },
  'is-yazilimi':        { nokta: [0, 1, 1, 1], agir: false },
};
export const DUYURU = [                       // [gun, bilesen, acil mi]
  [4.0, 'sistem-kitapligi', false], [13.5, 'cekirdek', true], [21.0, 'kabuk', false],
  [28.5, 'gozetim-ajani', false], [34.0, 'uzak-yonetim', true], [42.5, 'sistem-kitapligi', false],
  [51.5, 'yama-ajani', false], [58.5, 'cekirdek', false], [66.0, 'is-yazilimi', false],
  [74.5, 'kimlik-eklentisi', true], [88.0, 'kabuk', false], [97.5, 'sistem-kitapligi', true],
];
export const UFUK = 120, ACIL_SURE = 1.5, SINAMA_KALEM = 4, ACIL_ATLANAN = 3;
// Yamalanamayan kalem: alim hizmeti surum uyumlulugu nedeniyle yukseltilemiyor.
export const YAMALANAMAZ = [['is-yazilimi', 'toplayici']];
export const yamalanir = (b, i) => !YAMALANAMAZ.some(([x, y]) => x === b && y === SINIF[i].ad);
export const takvimGunu = (i, g) => {
  const s = SINIF[i];
  return Math.ceil((g - s.ofs) / s.takvim) * s.takvim + s.ofs;
};
export const TOPLAM_NOKTA = SINIF.reduce((a, s, i) =>
  a + s.makine * Object.values(BILESEN).reduce((b, c) => b + c.nokta[i], 0), 0);

// Bir duyurunun bir siniftaki penceresi ve nokta-gunu. duzen: 'takvim' | 'karma' | 'hepsi-acil'
export function pencere(d, i, duzen) {
  const [g, b, acil] = d, n = BILESEN[b].nokta[i], s = SINIF[i];
  const bos = { nokta: 0, noktaGun: 0, acikNoktaGun: 0, kesinti: 0, acikKalan: 0 };
  if (n === 0) return bos;
  if (!yamalanir(b, i))
    return { ...bos, nokta: n * s.makine, acikNoktaGun: n * s.makine * (UFUK - g),
      acikKalan: n * s.makine };
  const acilYol = duzen === 'hepsi-acil' || (duzen === 'karma' && acil);
  const ilk = acilYol ? g + ACIL_SURE : takvimGunu(i, g);
  const sonra = takvimGunu(i, ilk + 0.001);          // ilk turu kaciran makineler
  const zamaninda = s.makine - s.kacan;
  return { ...bos, nokta: n * s.makine,
    noktaGun: n * (zamaninda * (ilk - g) + s.kacan * (sonra - g)),
    kesinti: acilYol ? zamaninda : 0 };
}

export function tara(duzen) {
  let noktaGun = 0, agirlik = 0, tam = 0, servis = 0, acik = 0, acikGun = 0, atlanan = 0;
  for (const d of DUYURU) {
    const acilYol = duzen === 'hepsi-acil' || (duzen === 'karma' && d[2]);
    if (acilYol) atlanan += ACIL_ATLANAN;
    for (let i = 0; i < SINIF.length; i += 1) {
      const p = pencere(d, i, duzen);
      noktaGun += p.noktaGun; acikGun += p.acikNoktaGun; acik += p.acikKalan;
      if (p.acikKalan === 0) agirlik += p.nokta;
      if (BILESEN[d[1]].agir) tam += p.kesinti; else servis += p.kesinti;
    }
  }
  return { ortPencere: noktaGun / agirlik, noktaGun, tam, servis, acik, acikGun, atlanan };
}
```

#### Duyuru Başına Pencere

```js
// yama/olc.mjs — pencere, penceredeki acik nokta ve acil yamanin bedeli
import { SINIF, BILESEN, DUYURU, UFUK, ACIL_SURE, SINAMA_KALEM, TOPLAM_NOKTA,
  YAMALANAMAZ, pencere, takvimGunu, tara } from './model.mjs';

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

console.log(`${SINIF.reduce((a, s) => a + s.makine, 0)} makine, ${TOPLAM_NOKTA} tutunma noktasi, ` +
  `${UFUK} gunde ${DUYURU.length} duyuru (${DUYURU.filter((d) => d[2]).length} acil isaretli)`);

const A = [-18, 6, 8, 8, 11, 9, 12, 12];
console.log('\n1. takvim duzeninde duyuru basina pencere (gun) ve acik nokta');
y(A, 'duyuru', 'gun', 'saha', 'sube', 'toplayici', 'sunucu', 'acik nokta', 'nokta-gunu');
for (const d of DUYURU) {
  const p = SINIF.map((_, i) => pencere(d, i, 'takvim'));
  y(A, d[1], s2(d[0]), ...SINIF.map((s, i) => (BILESEN[d[1]].nokta[i] === 0 ? '-'
    : s2(takvimGunu(i, d[0]) - d[0]))),
  p.reduce((a, x) => a + x.nokta, 0),
  p.reduce((a, x) => a + x.noktaGun + x.acikNoktaGun, 0));
}

const B = [-12, 14, 13, 10, 13, 14, 12];
console.log('\n2. uc duzen: pencere, nokta-gunu ve acil yamanin bedeli');
y(B, 'duzen', 'ort pencere', 'nokta-gunu', 'atlanan', 'tam kesinti', 'servis kes.', 'acik nokta');
for (const duzen of ['takvim', 'karma', 'hepsi-acil']) {
  const t = tara(duzen);
  y(B, duzen, s2(t.ortPencere), t.noktaGun, `${t.atlanan}/${SINAMA_KALEM * DUYURU.length}`,
    t.tam, t.servis, t.acik);
}

console.log('\n3. yamanin nokta sayisina etkisi');
const t = tara('karma');
y([-40, 12], 'yamadan onceki tutunma noktasi', TOPLAM_NOKTA);
y([-40, 12], 'yamanin kapattigi nokta', 0);
y([-40, 12], 'yamadan sonraki tutunma noktasi', TOPLAM_NOKTA);
y([-40, 12], 'bilinen yolu kapanan nokta-gunu', t.noktaGun);
for (const [b, sad] of YAMALANAMAZ) {
  const i = SINIF.findIndex((s) => s.ad === sad), d = DUYURU.find((x) => x[1] === b);
  y([-40, 12], `yamalanamayan ${b}/${sad}`,
    `${BILESEN[b].nokta[i] * SINIF[i].makine} nokta x ${s2(UFUK - d[0])} gun`);
}
y([-40, 12], 'acil yolun kisalttigi ortalama pencere',
  s2(tara('takvim').ortPencere - tara('hepsi-acil').ortPencere));
y([-40, 12], 'acil yolun uygulama suresi', `${s2(ACIL_SURE)} gun`);
```

```
102 makine, 1038 tutunma noktasi, 120 gunde 12 duyuru (4 acil isaretli)

1. takvim duzeninde duyuru basina pencere (gun) ve acik nokta
duyuru               gun    saha    sube  toplayici   sunucu  acik nokta  nokta-gunu
sistem-kitapligi     4.0     2.0    13.0        5.0      5.0         102         725
cekirdek            13.5    13.5     3.5        2.5     25.5         204        2560
kabuk               21.0     6.0    10.0        2.0     18.0         198        1762
gozetim-ajani       28.5    19.5     2.5        1.5     10.5         204        3028
uzak-yonetim        34.0       -    11.0        3.0      5.0          42         344
sistem-kitapligi    42.5     5.5     2.5        1.5     26.5         102         770
yama-ajani          51.5    17.5     7.5        6.5     17.5         204        3232
cekirdek            58.5    10.5     0.5        6.5     10.5         204        1972
is-yazilimi         66.0       -     7.0        6.0      3.0          42         848
kimlik-eklentisi    74.5       -    12.5        4.5     24.5          42         515
kabuk               88.0     2.0    13.0        5.0     11.0         198        1456
sistem-kitapligi    97.5    13.5     3.5        2.5      1.5         102        1136

2. uc duzen: pencere, nokta-gunu ve acil yamanin bedeli
duzen          ort pencere   nokta-gunu   atlanan  tam kesinti   servis kes.  acik nokta
takvim                10.8        17700      0/48            0             0          12
karma                  8.6      14080.5     12/48          184            82          12
hepsi-acil             2.3         3801     36/48          460           479          12

3. yamanin nokta sayisina etkisi
yamadan onceki tutunma noktasi                  1038
yamanin kapattigi nokta                            0
yamadan sonraki tutunma noktasi                 1038
bilinen yolu kapanan nokta-gunu              14080.5
yamalanamayan is-yazilimi/toplayici     12 nokta x 54.0 gun
acil yolun kisalttigi ortalama pencere           8.5
acil yolun uygulama suresi                   1.5 gun
```

#### Pencere Bileşenin Değil, Takvimin Ürünü

İlk tablonun satırları aynı duyuruyu dört ayrı pencere olarak gösteriyor. Yirmi birinci gündeki
kabuk duyurusunda saha dizüstü bilgisayarında pencere 6 gün, şube ucunda 10, toplayıcı makinede 2
ve işleme sunucusunda 18. Aradaki fark bileşenden gelmiyor; duyurunun bakım takvimine göre nereye
düştüğünden geliyor. Yedi günlük takvimi olan toplayıcı makinede en uzun pencere bile 6,5 günü
geçmiyor; otuz günlük takvimi olan işleme sunucusunda 26,5 güne çıkabiliyor.

Bu, "yama ne kadar hızlı uygulanıyor" sorusunun tek bir sayıyla yanıtlanamayacağı anlamına gelir.
Sunucu sınıfının takvimi en seyrek olandır ve gerekçesi vardır: yeniden başlatma iş kesintisi
demektir, dolayısıyla değişiklik onayı gerekir. Aynı gerekçe pencereyi otuz güne kadar uzatır.

Nokta-günü sütunu duyuruları büyüklüğe göre yeniden sıralıyor ve sıralama gün sayısını izlemiyor.
Elli birinci gündeki yama ajanı duyurusu 3232 nokta-günü taşıyor; kırk ikinci gündeki sistem
kitaplığı duyurusu, dört sınıfın hepsinde çok kısa pencerelere denk geldiği için 770. Aradaki
farkın bir bölümü etkilenen nokta sayısından geliyor (204'e karşı 102), bir bölümü takvim
hizalanmasından. İki duyuru "aynı önem düzeyinde" işaretlense bile taşıdıkları ağırlık dört kat
farklıdır ve fark ancak nokta-günü hesaplandığında görünür.

#### Üç Düzen ve Acil Yolun Bedeli

İkinci tablo üç düzeni karşılaştırıyor: her şey takvimle, yalnız acil işaretli duyurular acil yolla
ve her şey acil yolla. Ortalama pencere 10,8 günden 8,6'ya, oradan 2,3 güne iniyor. Nokta-günü
17.700'den 3801'e düşüyor — beşte bire yakın.

Aynı satırlarda üç bedel sütunu var. Kırk sekiz sınama kaleminin (on iki duyuru, dört kalem)
takvim düzeninde hiçbiri atlanmıyor; karma düzende 12'si, her şeyin acil yolla uygulandığı düzende
36'sı atlanıyor. Atlanan kalemler uyumluluk sınaması, geri alma provası ve kullanıcı bildirimidir;
pilot grup her düzende korunuyor.

Kesinti sütunları asıl bedeli veriyor. Takvim düzeninde yeniden başlatmalar bakım penceresine denk
geldiği için plan dışı kesinti sıfırdır. Karma düzende 184 makine plan dışı tam yeniden başlatma,
82 makine servis kesintisi yaşıyor. Her şey acil yolla uygulandığında bu sayılar 460 ve 479 oluyor:
120 günde 939 plan dışı kesinti, yüz iki makinelik bir filoda makine başına dokuzdan fazla. Sekiz
buçuk günlük pencere kazancının karşılığı budur ve kararı veren kişinin iki sayıyı yan yana
okuması gerekir.

Üçüncü blokta bir sayı bu bedeli sınırlıyor: acil yol 1,5 günde uyguluyor ama ortalama pencere 2,3
günde kalıyor. Aradaki 0,8 gün, sahada çevrimdışı olduğu için turu kaçıran dokuz dizüstü
bilgisayardan ve bir şube ucundan geliyor. Bu on makine acil yolu da kaçırıyor ve bir sonraki
takvim gününü bekliyor. Pencereyi kısaltmanın alt sınırı yamanın hazır olma süresi değil, filonun
**ulaşılabilirliğidir**.

#### Kapanmayan Nokta

Üçüncü blok dersin ayrımını sayıya bağlıyor. Filodaki tutunma noktası sayısı yamadan önce 1038,
sonra 1038. Yamanın kapattığı nokta sıfır. Kapanan şey 14.080,5 nokta-günüdür: noktaların bilinen
bir yolla ulaşılabilir olduğu sürenin toplamı.

Son sütundaki 12 sayısı üç düzende de aynı kalıyor. Toplayıcı makinelerdeki alım hizmeti sürüm
uyumluluğu nedeniyle yükseltilemiyor; duyurudan sonraki 54 gün boyunca 12 nokta açık kalıyor ve
hiçbir takvim değişikliği bunu kapatmıyor. Bu kalem için pencere kavramı anlamını yitirir, çünkü
pencerenin kapanacağı bir gün yoktur.

Yamalanamayan bir kalemin karşılığı yamada değil, önceki dersin sütunundadır: nokta kapatılamıyorsa
en azından **görünür kılınmalıdır**. On iki noktanın tanımı taban çizgisine yazılır ve değişip
değişmediği karşılaştırılır. Bu, kusuru gidermez; kusurun kullanıldığı anı kayda geçirilebilir
kılar. İki sütun arasındaki fark tam olarak budur ve bu kalemde ikinci sütundan başkası yoktur.

#### Özet

- Yama bir tutunma noktasını kaldırmaz: filodaki nokta sayısı yamadan önce de sonra da 1038'dir.
  Yamanın azalttığı şey noktanın bilinen bir yolla ulaşılabilir olduğu süredir; kapattığı nokta
  sayısı sıfırdır.
- Pencere bileşenin değil takvimin ürünüdür: aynı duyuru yedi günlük takvimde 2, otuz günlük
  takvimde 18 gün açık kalır. Tek bir "ortalama yama süresi" bu farkı gizler.
- Nokta-günü duyuruları yeniden sıralar: 204 nokta etkileyen bir duyuru 3232, 102 nokta etkileyen
  bir başkası 770 nokta-günü taşır. Aynı önem düzeyi aynı ağırlık demek değildir.
- Acil yol ortalama pencereyi 10,8 günden 2,3 güne indirir; karşılığında 48 sınama kaleminin 36'sı
  atlanır ve 120 günde 939 plan dışı kesinti üretilir.
- Pencerenin alt sınırını yamanın hazır olma süresi değil filonun ulaşılabilirliği belirler: acil
  yol 1,5 günde uygulanır, ortalama 2,3 günde kalır, fark çevrimdışı 10 makineden gelir.
- Yamalanamayan kalem üç düzende de 12 nokta açık bırakır ve 54 gün boyunca kapanmaz; bu kalemin
  tek karşılığı ikinci sütundur — kapatma değil, taban çizgisine yazıp karşılaştırma.

#### Sonraki Adım

Buraya kadar iki iş yapıldı: gereksiz kalem ayıklandı ve kalanların bilinen kusurları kapatıldı.
İkisinin de dayandığı liste bu iki derste elle yazıldı — hangi kalemin gerekli olduğuna ve hangi
takvimin uygun olduğuna karar veren biri vardı ve kararların gerekçesi yazılmadı. Sonraki dersin
konusu bu boşluktur: **yapılandırma kıyaslama kılavuzları** aynı kararları madde madde toplar ve bir
taban çizgisi önerir. Ölçü, kılavuzun kaç madde içerdiği değil, o maddelerin bu ortamda ne yaptığıdır:
kaç madde uçların taban çizgisiyle uyumsuz, kaç madde bu ortamda **hiç uygulanamıyor** ve kaç madde
uygulandığında meşru bir işi durduruyor. Üçü ayrı sayılmadığında tek bir uyum yüzdesi kalır ve o
yüzde, kapanan nokta sayısı hakkında hiçbir şey söylemez.

### Yapılandırma Kıyaslamaları

Source: https://academia.sh/tr/kurslar/uc-nokta-guvenligi/yapilandirma-kiyaslamalari

Kıyaslama kılavuzunun 26 maddesi dört makine sınıfının taban çizgisine uygulanır: 104 kararın 11'i bu ortamda uygulanamaz, 42'si uyumsuz, uyum oranı iki ayrı paydayla iki ayrı sayı verir ve maddelerin tamamı uygulandığında 588 noktanın yazma yetkisi daralırken 48 meşru iş elle adıma düşer.

Önceki iki derste hangi kalemin gerekli olduğuna ve hangi takvimin uygun olduğuna karar veren biri
vardı; kararların gerekçesi hiçbir yerde yazılmadı. **Yapılandırma kıyaslama kılavuzları** bu
boşluğu doldurmak için vardır: aynı kararları madde madde toplar ve bir taban çizgisi önerir.
Kılavuzun kendisi bir dış kaynaktır, ortamı bilmez ve maddeleri bir uç noktanın hangi işi yaptığına
göre yazılmamıştır.

Bu dersin ölçüsü kılavuzun kaç madde içerdiği değil, o maddelerin bu ortamda ne yaptığıdır. Üç ayrı
durum tek bir orana sıkıştırıldığında karar taşıyan bilgi kaybolur.

#### Üç Ayrı Durum

Bir kılavuz maddesi bir makine sınıfına uygulandığında üç sonuçtan biri çıkar. **Uyumlu**: taban
çizgi maddeyi zaten karşılıyor. **Uyumsuz**: taban çizgi maddeyi karşılamıyor ve karşılaması
mümkün. **Uygulanamaz**: madde bu ortamda anlamlı değil ya da makinenin işini olanaksız kılar.
Üçüncü durum ilk ikisinden farklıdır; ekran kilidi süresi ekranı olmayan bir makinede bir eksiklik
değildir, kılavuzun o makine için yazılmamış olmasıdır.

Dördüncü bir eksen bunların üzerine biner: madde uygulandığında **meşru bir iş duruyor mu**. Bir
maddenin uygulanabilir olması onun bedelsiz olduğu anlamına gelmez.

Bu dersin nokta sütunu da dikkatli okunmalıdır. Kılavuz maddeleri bir tutunma noktasını
kaldırmaz — kaldırma işi ilk derste yapıldı ve kalan noktalar iş gerektirdiği için duruyor. Kılavuz
maddesinin yaptığı şey, o noktanın **tanımını yazabilen özne kümesini** daraltmaktır. Üç dersin
ölçüsü böylece sıralanır: birincisi noktanın kendisini kapattı, ikincisi noktanın bilinen bir yolla
ulaşılabilir olduğu **süreyi** kısalttı, üçüncüsü noktaya yazabilen **özne kümesini** daraltıyor.
Kapatılan nokta sayısı burada da sıfırdır.

- **SS13.** Yirmi altı maddelik kılavuz, dört makine sınıfı ve taban çizgi **modeldir**. Kılavuzun
  adı yazılmaz; maddeler tür düzeyinde yazılır ve gerçek bir denetim koşturulmaz.
- **SS14.** Bir madde bir sınıfta ya uygulanabilir ya uygulanamaz; kısmi uygulama modellenmiyor.
- **SS15.** Uyumluluk durumu taban çizgiden okunmuş sayılır ve modelde sabittir.
- **SS16.** Nokta sütunu, madde uygulandığında yazma yetkisi yöneticiye daralan nokta sayısıdır ve
  makine başınadır.
- **SS17.** Bedel, madde uygulandığında elle adıma düşen meşru iş sayısıdır; sınıf başına yazıldı.
- **SS18.** Makine sayıları önceki dersten gelir: 60, 24, 12 ve 6.

```js
// kiyas/kilavuz.mjs — yapilandirma kiyaslama kilavuzunun taban cizgiye uygulanmasi MODELIDIR.
// Kilavuz adi yazilmaz; maddeler tur duzeyinde yazilir. Gercek bir denetim kosturulmaz.
export const SINIF = [
  { ad: 'saha-dizustu', makine: 60 }, { ad: 'sube-ucu', makine: 24 },
  { ad: 'toplayici', makine: 12 }, { ad: 'islem-sunucusu', makine: 6 },
];
// satir: madde | yazma yetkisi daralan nokta (makine basina) | uygulanabilirlik | uyumluluk | bedel
// uygulanabilirlik: u = uygulanabilir, x = bu ortamda uygulanamaz
// uyumluluk: v = taban cizgi zaten uyumlu, a = uyumsuz, - = uygulanamadigi icin yok
// bedel: madde uygulandiginda elle adima dusen mesru is sayisi (sinif basina rakam)
export const MADDE = `
  gereksiz-servis-kapatma            2 uuuu vvvv 0000
  otomatik-calistirma-kisitlama      1 uuuu avvv 2000
  zamanlanmis-gorev-yazma-kisiti     1 uuuu aavv 1100
  oturum-betigi-yazma-kisiti         1 uuxu av-v 2001
  surucu-imza-zorunlulugu            1 uuuu vvaa 0011
  acilis-sirasi-kilidi               1 uuuu vvaa 0000
  yerel-yonetici-uyeligi-kisiti      1 uuuu aavv 3200
  uzak-yonetim-kisitlamasi           1 uuuu vvva 0001
  yazilim-kaynagi-kisitlamasi        1 uuuu aaav 4210
  betik-calisma-zamani-kisiti        1 uuxx aa-- 3200
  eklenti-dizini-kilidi              1 uuxx av-- 1000
  yonetim-araci-erisim-kisiti        1 xuuu -vaa 0011
  varsayilan-hesap-devre-disi        0 uuuu vvvv 0000
  parola-uzunlugu                    0 uuuu vvvv 0000
  hesap-kilitleme-esigi              0 uuuu vvva 0001
  oturum-zaman-asimi                 0 uuuu avvv 1000
  ekran-kilidi-suresi                0 uuxx aa-- 2100
  konak-guvenlik-duvari-varsayilani  0 uuuu aavv 1100
  gelen-baglanti-kisitlamasi         0 uuuu vvaa 0022
  paylasim-kapatma                   0 uuuu avvv 1000
  gunluk-saklama-suresi              0 uuuu aaav 0000
  surec-olusturma-kaydi              0 uuuu aaaa 0000
  gunluk-merkezilestirme             0 uxuu a-vv 0000
  disk-sifreleme-zorunlulugu         0 uuuu avva 0000
  tasinabilir-ortam-kisitlamasi      0 uuxu aa-v 3200
  otomatik-guncelleme-zorunlulugu    0 uxuu v-aa 0011`
  .trim().split('\n').map((r) => {
    const [ad, nokta, uygul, uyum, bedel] = r.trim().split(/\s+/);
    return { ad, nokta: Number(nokta), uygul, uyum, bedel };
  });

export const uygulanir = (m, i) => m.uygul[i] === 'u';
export const uyumlu = (m, i) => m.uyum[i] === 'v';
export const uyumsuz = (m, i) => m.uyum[i] === 'a';
export const bedeli = (m, i) => Number(m.bedel[i]);
// Bir senaryo: hangi uyumsuz maddeler uygulaniyor. 'yok' | 'bedelsiz' | 'hepsi'
export const uygulanan = (m, i, sen) => uyumsuz(m, i)
  && (sen === 'hepsi' || (sen === 'bedelsiz' && bedeli(m, i) === 0));

export function tara(sen) {
  let hucre = 0, uygulanamaz = 0, zatenUyumlu = 0, daralan = 0, duran = 0, istisna = 0;
  for (const m of MADDE)
    for (const [i, s] of SINIF.entries()) {
      hucre += 1;
      if (!uygulanir(m, i)) { uygulanamaz += 1; continue; }
      if (uyumlu(m, i)) { zatenUyumlu += 1; continue; }
      if (uygulanan(m, i, sen)) { daralan += m.nokta * s.makine; duran += bedeli(m, i); }
      else istisna += 1;
    }
  const uyumluSayi = zatenUyumlu + (hucre - uygulanamaz - zatenUyumlu - istisna);
  return { hucre, uygulanamaz, zatenUyumlu, daralan, duran, istisna,
    hamYuzde: (100 * uyumluSayi) / hucre,
    uygulanabilirYuzde: (100 * uyumluSayi) / (hucre - uygulanamaz) };
}
```

#### Maddelerin Taban Çizgiye Uygulanması

```js
// kiyas/olc.mjs — uyumsuz kalem ile uygulanamayan kalem ayrilir; uyum yuzdesi ile daralan nokta
import { SINIF, MADDE, uygulanir, uyumlu, uyumsuz, bedeli, tara } from './kilavuz.mjs';

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join('').trimEnd());
const p1 = (x) => x.toFixed(1);
const noktali = MADDE.filter((m) => m.nokta > 0);

console.log(`${MADDE.length} kilavuz maddesi x ${SINIF.length} makine sinifi = ` +
  `${MADDE.length * SINIF.length} karar; ${noktali.length} madde tutunma noktasina dokunuyor`);

const A = [-18, 7, 13, 8, 10, 12, 17, 8];
console.log('\n1. sinif basina madde durumu');
y(A, 'sinif', 'madde', 'uygulanamaz', 'uyumlu', 'uyumsuz', 'ham uyum %', 'uygulanabilir %', 'bedel');
for (const [i, s] of SINIF.entries()) {
  const ux = MADDE.filter((m) => !uygulanir(m, i)).length;
  const uv = MADDE.filter((m) => uyumlu(m, i)).length;
  const ua = MADDE.filter((m) => uyumsuz(m, i)).length;
  y(A, s.ad, MADDE.length, ux, uv, ua, p1((100 * uv) / MADDE.length),
    p1((100 * uv) / (MADDE.length - ux)),
    MADDE.filter((m) => uyumsuz(m, i)).reduce((a, m) => a + bedeli(m, i), 0));
}

const B = [-34, 7, 13, 10, 15, 8];
console.log('\n2. tutunma noktasina dokunan maddeler');
y(B, 'madde', 'nokta', 'uygulanamaz', 'uyumsuz', 'daralan nokta', 'bedel');
for (const m of noktali)
  y(B, m.ad, m.nokta, SINIF.filter((_, i) => !uygulanir(m, i)).length,
    SINIF.filter((_, i) => uyumsuz(m, i)).length,
    SINIF.reduce((a, s, i) => a + (uyumsuz(m, i) ? m.nokta * s.makine : 0), 0),
    SINIF.reduce((a, _, i) => a + (uyumsuz(m, i) ? bedeli(m, i) : 0), 0));

const C = [-24, 12, 18, 15, 11, 10];
console.log('\n3. uc senaryo');
y(C, 'senaryo', 'ham uyum %', 'uygulanabilir %', 'daralan nokta', 'duran is', 'istisna');
for (const [ad, sen] of [['hicbiri uygulanmadi', 'yok'], ['bedelsizler uygulandi', 'bedelsiz'],
  ['hepsi uygulandi', 'hepsi']]) {
  const t = tara(sen);
  y(C, ad, p1(t.hamYuzde), p1(t.uygulanabilirYuzde), t.daralan, t.duran, t.istisna);
}
const t0 = tara('yok'), t1 = tara('bedelsiz'), t2 = tara('hepsi');
console.log(`\nuygulanamayan karar            ${t0.uygulanamaz} / ${t0.hucre}`);
console.log(`nokta kapatmayan madde         ${MADDE.length - noktali.length} / ${MADDE.length}`);
console.log(`uyum %${p1(t0.hamYuzde)} -> %${p1(t2.hamYuzde)} kazanci  ` +
  `${t2.daralan} nokta, ${t2.duran} elle adim`);
console.log(`bedelsiz adimin payi           ${t1.daralan}/${t2.daralan} nokta, ` +
  `${t1.duran}/${t2.duran} elle adim`);
```

```
26 kilavuz maddesi x 4 makine sinifi = 104 karar; 12 madde tutunma noktasina dokunuyor

1. sinif basina madde durumu
sinif               madde  uygulanamaz  uyumlu   uyumsuz  ham uyum %  uygulanabilir %   bedel
saha-dizustu           26            1       9        16        34.6             36.0      24
sube-ucu               26            2      15         9        57.7             62.5      11
toplayici              26            5      13         8        50.0             61.9       6
islem-sunucusu         26            3      14         9        53.8             60.9       7

2. tutunma noktasina dokunan maddeler
madde                               nokta  uygulanamaz   uyumsuz  daralan nokta   bedel
gereksiz-servis-kapatma                 2            0         0              0       0
otomatik-calistirma-kisitlama           1            0         1             60       2
zamanlanmis-gorev-yazma-kisiti          1            0         2             84       2
oturum-betigi-yazma-kisiti              1            1         1             60       2
surucu-imza-zorunlulugu                 1            0         2             18       2
acilis-sirasi-kilidi                    1            0         2             18       0
yerel-yonetici-uyeligi-kisiti           1            0         2             84       5
uzak-yonetim-kisitlamasi                1            0         1              6       1
yazilim-kaynagi-kisitlamasi             1            0         3             96       7
betik-calisma-zamani-kisiti             1            2         2             84       5
eklenti-dizini-kilidi                   1            2         1             60       1
yonetim-araci-erisim-kisiti             1            1         2             18       2

3. uc senaryo
senaryo                   ham uyum %   uygulanabilir %  daralan nokta   duran is   istisna
hicbiri uygulanmadi             49.0              54.8              0          0        42
bedelsizler uygulandi           60.6              67.7             18          0        30
hepsi uygulandi                 89.4             100.0            588         48         0

uygulanamayan karar            11 / 104
nokta kapatmayan madde         14 / 26
uyum %49.0 -> %89.4 kazanci  588 nokta, 48 elle adim
bedelsiz adimin payi           18/588 nokta, 0/48 elle adim
```

#### İki Uyum Yüzdesi

Birinci tablonun son iki yüzde sütunu aynı taban çizgiden iki farklı sayı üretiyor. **Ham uyum**,
uyumlu maddeyi kılavuzun madde sayısına böler. **Uygulanabilir uyum**, aynı payı uygulanamayan
maddeler düşüldükten sonraki paydaya böler. İkinci sayı her zaman birinciden büyüktür ve raporlarda
yazılan genellikle odur.

Toplayıcı makine satırı farkın kaynağını gösteriyor. Ham uyum yüzde 50,0; uygulanabilir uyum yüzde
61,9. Aradaki 11,9 puanın tamamı beş maddenin paydadan düşmesinden geliyor — ekranı olmayan bir
makinede ekran kilidi süresi, işini betikle yapan bir makinede betik çalışma zamanı kısıtı, sayaç
verisi taşınabilir ortamla alındığı için taşınabilir ortam kısıtlaması. Bu beş maddenin uygulanamaz
sayılması doğrudur. Yanlış olan, doğru bir kararın bir **iyileşme** gibi görünmesidir: hiçbir
nokta daralmadı, hiçbir yapılandırma değişmedi, yüzde 11,9 puan arttı.

Üçüncü tablo bunun sınırını veriyor. Uyumsuz maddelerin **hepsi** uygulandığında uygulanabilir uyum
yüzde 100'e çıkıyor, ham uyum yüzde 89,4'te kalıyor. On bir karar hiçbir zaman uyumlu olamaz, çünkü
madde o ortamda anlamlı değil. "Yüzde yüz uyum" hedefi bu yüzden ölçülemez bir hedeftir; ölçülebilir
hedef, uygulanamayan maddelerin **adıyla yazılmasıdır**.

Saha dizüstü bilgisayarı iki sayının da en düşük olduğu sınıftır (34,6 ve 36,0) ve bedeli en yüksek
olan sınıftır (24 elle adım). İki sayı birlikte okunduğunda neden düşük olduğu görünür: on altı
uyumsuz maddenin çoğu, kullanıcının kendi kurduğu kalemleri kısıtlıyor ve uygulanmaları meşru işi
durduruyor. Uyumsuzluk burada bir ihmal değil, ödenmemiş bir bedeldir.

#### Nokta Kapatmayan Maddeler

Yirmi altı maddenin 14'ü hiçbir tutunma noktasına dokunmuyor. Parola uzunluğu, oturum zaman aşımı,
günlük saklama süresi, süreç oluşturma kaydı ve gelen bağlantı kısıtlaması gerçek denetimlerdir ve
başka şeyler için değerlidir; bu kursun ölçüsüne bir sayı eklemezler. Yine de uyum oranının
paydasında öteki maddelerle aynı ağırlığı taşırlar.

Sonuç şudur: uyum oranı ile daralan nokta sayısı arasında sabit bir ilişki yoktur. Yüzde 49,0'dan
89,4'e çıkmak 588 noktanın yazma yetkisini daraltıyor, ama aynı 40 puanın büyük bir bölümü nokta
sütununa hiç dokunmayan maddelerden geliyor. Tersi de mümkündür: yalnız nokta kapatmayan maddeleri
uygulayan bir ekip oranı yükseltir ve nokta sütununda sıfır ilerleme kaydeder.

İkinci tablodaki `gereksiz-servis-kapatma` satırı aynı ilişkinin öbür ucudur. Makine başına 2 nokta
daraltan en güçlü maddedir ve dört sınıfta da **zaten uyumludur** — çünkü ilk derste yapılan iş tam
olarak buydu. Kılavuz bu maddede hiçbir şey eklemiyor; onaylıyor. Kılavuzun katkısı yalnız uyumsuz
sütununda ölçülebilir.

#### İstisna Listesi ve Bakım

Son iki satır kararı verecek kişinin önündeki takası veriyor. Bedeli sıfır olan uyumsuz maddeler
uygulandığında uyum yüzde 60,6'ya çıkıyor, hiçbir meşru iş durmuyor — ve daralan nokta 588'in
yalnız 18'i, yüzde 3'ü. Daraltmanın neredeyse tamamı bedelli maddelerdedir. Yazılım kaynağı
kısıtlaması tek başına 96 nokta daraltıyor ve 7 elle adım getiriyor; yerel yönetici üyeliği kısıtı
84 nokta ve 5 adım. Ucuz olan çok az şey yapıyor, iş yapan hiçbir şey ucuz değil.

Uygulanmayan her uyumsuz karar bir **istisna kalemidir** ve istisna bir kerelik bir iş değildir.
Bedelsiz senaryoda 30, hiçbir şey uygulanmadığında 42 istisna kalemi kalıyor. Her kalem bir gerekçe,
bir sahip ve bir yeniden değerlendirme tarihi ister; kılavuzun her yeni sürümünde maddeler yeniden
eşlenir ve uygulanamaz işaretleri yeniden sınanır. Uygulanamayan 11 karar da aynı listede durur,
çünkü bir makinenin işi değiştiğinde uygulanamaz olan uygulanabilir hâle gelir.

Bakımın ölçüsü budur: 104 kararın 53'ü — 42 uyumsuz artı 11 uygulanamaz — sürekli bakılan bir liste
oluşturur. Bu, kılavuzu uygulamanın kılavuzu okumaktan çok daha pahalı olduğunu gösteren sayıdır.

İki işaret arasındaki sınır bu yüzden korunmalıdır. "Uygulanamaz" bir ortam gerçeğini anlatır ve
paydayı küçültür; "uygulanmadı" bir kararı anlatır ve paydada kalır. İkisi arasındaki tek fark bir
harftir ve harfi yazan kişi aynı zamanda oranı raporlayan kişidir. Bedeli yüksek bir maddenin
uygulanamaz işaretlenmesi hem işi bitirir hem oranı yükseltir; sonuç, uyumsuz sütunu boş, ham uyum
oranı yüksek ve daralan nokta sayısı sıfır olan bir tablodur. Bu tabloyu yanlıştan ayıran tek şey,
her uygulanamaz işaretinin yanında **hangi ortam koşulunun** o maddeyi anlamsız kıldığının
yazılmasıdır. Ekranı olmayan bir makine sınanabilir bir gerekçedir; "kısıtlama işimizi zorlaştırıyor"
bir bedel bildirimidir ve uyumsuz sütununa yazılır.

#### Özet

- Bir kılavuz maddesi bir sınıfa uygulandığında üç sonuç çıkar: uyumlu, uyumsuz, uygulanamaz. 104
  kararın 51'i uyumlu, 42'si uyumsuz, 11'i bu ortamda uygulanamaz.
- İki uyum oranı aynı taban çizgiden iki ayrı sayı verir: toplayıcı makinede ham 50,0, uygulanabilir
  61,9. Aradaki 11,9 puan tek bir yapılandırma değişmeden, yalnız payda küçülerek kazanılır.
- Maddelerin tamamı uygulansa bile ham uyum yüzde 89,4'te kalır; 11 karar hiçbir zaman uyumlu
  olamaz. Ölçülebilir hedef yüzde yüz uyum değil, uygulanamayan maddelerin adıyla yazılmasıdır.
- Kılavuz maddesi tutunma noktasını kapatmaz, tanımını yazabilen özne kümesini daraltır: kapatılan
  nokta sıfır, daralan nokta 588. Üç dersin ölçüsü sırayla noktanın kendisi, açık kalma süresi ve
  yazabilen özne kümesidir.
- Yirmi altı maddenin 14'ü hiçbir noktaya dokunmaz ama uyum oranında ötekilerle aynı ağırlığı taşır;
  en güçlü madde ise dört sınıfta da zaten uyumludur, çünkü o iş ilk derste yapılmıştı.
- Bedelsiz uyumsuz maddeler 588 noktanın yalnız 18'ini daraltır; daraltmanın yüzde 97'si 48 elle
  adım karşılığında gelir. Uygulanmayan her karar bir istisna kalemidir ve 53 kalem sürekli bakım
  ister.

#### Sonraki Adım

Bu dersin en pahalı maddesi yazılım kaynağı kısıtlamasıydı: 96 nokta daraltıyor, 7 meşru işi elle
adıma düşürüyor ve bir sınıfta zaten uyumlu. Maddenin arkasında tek satırla anılan bir karar var —
uçta hangi yazılımın çalışabileceğine önceden karar verilmesi. Sonraki dersin konusu budur.
**Uygulama izin listesi** bir yapılandırma maddesi değil, her çalıştırma denemesinde verilen bir
karardır ve doğruluğu ancak gerçek bir çalıştırma kümesi üzerinde ölçülebilir: listenin kaç meşru
kalemi engellediği, kaç kalemi elle onaya düşürdüğü ve imza tabanlı kuralla yol tabanlı kuralın
birbirinden farklı olarak neyi kaçırdığı.

### Uygulama İzin Listeleri

Source: https://academia.sh/tr/kurslar/uc-nokta-guvenligi/uygulama-izin-listeleri

İzin listesi 25 kalemlik bir çalıştırma kümesinde değerlendirilir: yol tabanlı ve imza tabanlı kuralın aynı sayıda ama farklı kalemleri kaçırdığı, birleşim biçiminin yanlış engeli 1'den 7 kaleme çıkardığı, filodaki 1038 tutunma noktasının 972'sinin onaylanmamış kod çalıştıramaz hâle geldiği ve 66'sının açık kaldığı sayılır.

Önceki dersin en pahalı maddesi yazılım kaynağı kısıtlamasıydı: 96 noktanın yazma yetkisini
daraltıyor, yedi meşru işi elle adıma düşürüyordu. Maddenin arkasında tek satırla anılan bir karar
var — uçta hangi yazılımın çalışabileceğine önceden karar verilmesi. **Uygulama izin listesi** bu
kararı bir yapılandırma maddesi olmaktan çıkarıp her çalıştırma denemesinde verilen bir karara
dönüştürür.

Bir yapılandırma maddesi bir kez uygulanır ve uyumluluğu sorulur. Bir izin listesi her çalıştırmada
yeniden değerlendirilir ve doğruluğu ancak **gerçek bir çalıştırma kümesi** üzerinde ölçülebilir:
bir dönemde uçlarda çalışan kalemler tek tek listeye sorulur ve iki tür yanlış sayılır — engellenen
meşru kalem ve geçen meşru olmayan kalem.

#### İki Kural Türü

İzin listesi kuralları iki eksende yazılır. **Yol tabanlı kural**, çalıştırılan dosyanın hangi dizin
sınıfında durduğuna bakar: sistem dizini ve program dizini izinli, kullanıcı dizini, geçici dizin,
ağ payı ve taşınabilir ortam değil. **İmza tabanlı kural**, dosyayı kimin imzaladığına bakar:
işletim sistemi sağlayıcısı, iş yazılımı sağlayıcısı ve kurum içi imza izinli, imzasız ve bilinmeyen
imzalı kalemler değil.

İki kural birleştirilebilir. **Ya da** biçiminde bir kalem tek bir ölçütten geçmesi yeterlidir; **ve**
biçiminde ikisinden de geçmesi gerekir. Aynı iki kural, iki farklı birleşimle çok farklı sonuç
üretir ve fark ancak bir kümede ölçüldüğünde görünür.

- **SS19.** Yirmi beş kalemlik çalıştırma kümesi, dönem ve koşum sayıları **modeldir**; gerçek bir
  uçta çalıştırma engellenmiyor.
- **SS20.** Meşru olmayan kalemler yalnız tür, yol sınıfı ve imza sınıfıyla anılır; ne yaptıkları ve
  nasıl geldikleri yazılmaz.
- **SS21.** Yol sınıfı altı, imza sınıfı beş değerlidir. Gerçekte alt dizin ve sertifika ayrıntısı
  kalem sayısını büyütür, kuralların birbirine göre davranışını değiştirmez.
- **SS22.** Karar ikilidir: geçer ya da engellenir. Yalnız uyaran, engellemeyen kip modellenmiyor.
- **SS23.** Betik kalemlerinde karar çalıştırılan yorumlayıcı üzerinde verilir; betik denetimi
  açıkken betiğin kendisi de aynı kuralla değerlendirilir.
- **SS24.** Betik denetiminin iki sınıfta uygulanamaz olması önceki dersten gelir: o iki sınıfta iş
  betikle yürüyor.

```js
// izin/liste.mjs — uygulama izin listesinin bir calistirma kumesi uzerinde degerlendirilmesi
// MODELIDIR. Gercek bir uc noktada calistirma engellenmez; kalemler tur duzeyinde yazilir.
export const YOL_IZIN = ['sistem', 'program'];
export const IMZA_IZIN = ['isletim', 'is-saglayici', 'ic-imza'];
// satir: ad | tur | yol sinifi | imza sinifi | mesru mu | kac makinede kostu | donemdeki kosum
export const KALEM = `
  olcut-ajani              ikili sistem      isletim       e  102  91800
  gunluk-aktarici          ikili sistem      isletim       e  102   3060
  yama-ajani               ikili program     is-saglayici  e  102    408
  surucu-guncelleyici      ikili program     isletim       e  102    204
  arsiv-araci              ikili program     is-saglayici  e  102   1224
  belge-duzenleyici        ikili program     is-saglayici  e   84   5040
  saha-olcum-uygulamasi    ikili program     is-saglayici  e   60   7200
  veri-tabani-istemcisi    ikili program     is-saglayici  e   18    540
  ic-rapor-araci           ikili program     imzasiz       e   24    480
  bakim-betigi             betik sistem      ic-imza       e  102   3060
  tanilama-araci           ikili gecici      ic-imza       e   30     90
  yeni-surum-yukleyici     ikili gecici      is-saglayici  e   40     40
  ic-yardimci-arac         ikili kullanici   imzasiz       e   18    360
  sayac-okuma-araci        ikili tasinabilir is-saglayici  e   12    720
  saha-kurulum-betigi      betik kullanici   imzasiz       e   60    180
  ceyrek-raporu-betigi     betik ag-payi     ic-imza       e   24     96
  bilinmeyen-ikili-1       ikili gecici      imzasiz       h    4     11
  bilinmeyen-ikili-2       ikili kullanici   imzasiz       h    7     23
  bilinmeyen-ikili-3       ikili ag-payi     bilinmeyen    h    2      4
  bilinmeyen-ikili-4       ikili tasinabilir bilinmeyen    h    1      1
  yorumlanan-kalem-1       betik kullanici   imzasiz       h    6     19
  yorumlanan-kalem-2       betik gecici      imzasiz       h    3      8
  imzali-arac-kotuye-kullanim ikili program  is-saglayici  h    2      5
  izinli-yolda-imzasiz     ikili program     imzasiz       h    5     14
  imzali-kalem-kullanici-yolunda ikili kullanici is-saglayici h  3      9`
  .trim().split('\n').map((r) => {
    const [ad, tur, yol, imza, m, makine, kosum] = r.trim().split(/\s+/);
    return { ad, tur, yol, imza, mesru: m === 'e', makine: Number(makine), kosum: Number(kosum) };
  });

export const KURAL = {
  yol: { satir: YOL_IZIN.length, gecer: (k) => YOL_IZIN.includes(k.yol) },
  imza: { satir: IMZA_IZIN.length, gecer: (k) => IMZA_IZIN.includes(k.imza) },
  'yol-veya-imza': { satir: YOL_IZIN.length + IMZA_IZIN.length,
    gecer: (k) => YOL_IZIN.includes(k.yol) || IMZA_IZIN.includes(k.imza) },
  'yol-ve-imza': { satir: YOL_IZIN.length + IMZA_IZIN.length,
    gecer: (k) => YOL_IZIN.includes(k.yol) && IMZA_IZIN.includes(k.imza) },
};
// Betik kalemleri: karar calistirilan yorumlayici uzerinde verilir, betigin kendisi degerlendirilmez.
// Betik denetimi acikken betik de ayni kuralla degerlendirilir.
export const gecer = (k, kural, betikDenetimi) =>
  (k.tur === 'betik' && !betikDenetimi ? true : KURAL[kural].gecer(k));

export function olc(kural, betikDenetimi) {
  const engel = KALEM.filter((k) => k.mesru && !gecer(k, kural, betikDenetimi));
  const kacan = KALEM.filter((k) => !k.mesru && gecer(k, kural, betikDenetimi));
  const say = (l, alan) => l.reduce((a, k) => a + k[alan], 0);
  return { engelKalem: engel.length, engelMakine: say(engel, 'makine'),
    engelKosum: say(engel, 'kosum'), kacanKalem: kacan.length,
    kacanMakine: say(kacan, 'makine'), kacanKosum: say(kacan, 'kosum'),
    satir: KURAL[kural].satir + (betikDenetimi ? 1 : 0) + engel.length };
}

// Filodaki tutunma noktalarinin kaci izin listesiyle kullanilamaz hale geliyor.
// Betik tasiyabilen nokta, izinli bir yorumlayiciyi cagirabildigi icin kapanmaz.
export const SINIF = [
  { ad: 'saha-dizustu', makine: 60, kalan: 9, betikli: 3, betikDenetimi: true },
  { ad: 'sube-ucu', makine: 24, kalan: 12, betikli: 3, betikDenetimi: true },
  { ad: 'toplayici', makine: 12, kalan: 12, betikli: 4, betikDenetimi: false },
  { ad: 'islem-sunucusu', makine: 6, kalan: 11, betikli: 3, betikDenetimi: false },
];
export const noktaOlc = (s) => ({
  nokta: s.kalan * s.makine,
  kapanan: (s.betikDenetimi ? s.kalan : s.kalan - s.betikli) * s.makine,
  acik: (s.betikDenetimi ? 0 : s.betikli) * s.makine,
});
```

#### Dört Kural Kümesi, Aynı Küme

```js
// izin/olc.mjs — dort kural kumesi ayni calistirma kumesinde degerlendirilir
import { KALEM, KURAL, SINIF, gecer, olc, noktaOlc } from './liste.mjs';

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join('').trimEnd());
const say = (f, alan) => KALEM.filter(f).reduce((a, k) => a + k[alan], 0);

console.log(`${KALEM.length} calistirma kalemi, ${say(() => true, 'kosum')} kosum; ` +
  `${KALEM.filter((k) => !k.mesru).length} kalem mesru degil, ` +
  `${KALEM.filter((k) => k.tur === 'betik').length} kalem betik`);

const A = [-16, 7, 10, 14, 10, 14, 13, 8];
console.log('\n1. kural kumeleri (betik denetimi yok / var)');
y(A, 'kural', 'betik', 'engel k.', 'engel makine', 'kacan k.', 'kacan makine', 'kacan kosum', 'satir');
for (const kural of Object.keys(KURAL))
  for (const bd of [false, true]) {
    const o = olc(kural, bd);
    y(A, kural, bd ? 'var' : 'yok', o.engelKalem, o.engelMakine, o.kacanKalem,
      o.kacanMakine, o.kacanKosum, o.satir);
  }

const B = [-32, 8, 13, 14, 8, 9];
console.log('\n2. yol-veya-imza kuralinda yanlis karar verilen kalemler (betik denetimi var)');
y(B, 'kalem', 'tur', 'yol', 'imza', 'mesru', 'sonuc');
for (const k of KALEM) {
  const g = gecer(k, 'yol-veya-imza', true);
  if (g === k.mesru) continue;                      // dogru karar verilen kalemler atlanir
  y(B, k.ad, k.tur, k.yol, k.imza, k.mesru ? 'evet' : 'hayir', g ? 'gecti' : 'engel');
}

const C = [-16, 8, 10, 8, 16];
console.log('\n3. izin listesinin tutunma noktalarina etkisi');
y(C, 'sinif', 'nokta', 'kapanan', 'acik', 'betik denetimi');
let t = { nokta: 0, kapanan: 0, acik: 0 };
for (const s of SINIF) {
  const o = noktaOlc(s);
  for (const a of Object.keys(t)) t[a] += o[a];
  y(C, s.ad, o.nokta, o.kapanan, o.acik, s.betikDenetimi ? 'var' : 'yok');
}
y(C, 'toplam', t.nokta, t.kapanan, t.acik, '');
console.log('\nsecilen kural kumesi: yol-veya-imza');
for (const bd of [false, true]) {
  const v = olc('yol-veya-imza', bd);
  console.log(`  betik denetimi ${bd ? 'var' : 'yok'}: engel ${v.engelKalem} kalem / ` +
    `${v.engelMakine} makine / ${v.engelKosum} kosum; kacan ${v.kacanKalem} kalem / ` +
    `${v.kacanMakine} makine; ${v.satir} satir`);
}
console.log(`  betik denetimi uygulanabilen sinif: ` +
  `${SINIF.filter((s) => s.betikDenetimi).length}/${SINIF.length}`);
```

```
25 calistirma kalemi, 114596 kosum; 9 kalem mesru degil, 5 kalem betik

1. kural kumeleri (betik denetimi yok / var)
kural             betik  engel k.  engel makine  kacan k.  kacan makine  kacan kosum   satir
yol                 yok         4           100         4            16           46       6
yol                 var         6           184         2             7           19       9
imza                yok         2            42         4            14           41       5
imza                var         3           102         2             5           14       7
yol-veya-imza       yok         1            18         5            19           55       6
yol-veya-imza       var         2            78         3            10           28       8
yol-ve-imza         yok         5           124         3            11           32      10
yol-ve-imza         var         7           208         1             2            5      13

2. yol-veya-imza kuralinda yanlis karar verilen kalemler (betik denetimi var)
kalem                                tur          yol          imza   mesru    sonuc
ic-yardimci-arac                   ikili    kullanici       imzasiz    evet    engel
saha-kurulum-betigi                betik    kullanici       imzasiz    evet    engel
imzali-arac-kotuye-kullanim        ikili      program  is-saglayici   hayir    gecti
izinli-yolda-imzasiz               ikili      program       imzasiz   hayir    gecti
imzali-kalem-kullanici-yolunda     ikili    kullanici  is-saglayici   hayir    gecti

3. izin listesinin tutunma noktalarina etkisi
sinif              nokta   kapanan    acik  betik denetimi
saha-dizustu         540       540       0             var
sube-ucu             288       288       0             var
toplayici            144        96      48             yok
islem-sunucusu        66        48      18             yok
toplam              1038       972      66

secilen kural kumesi: yol-veya-imza
  betik denetimi yok: engel 1 kalem / 18 makine / 360 kosum; kacan 5 kalem / 19 makine; 6 satir
  betik denetimi var: engel 2 kalem / 78 makine / 540 kosum; kacan 3 kalem / 10 makine; 8 satir
  betik denetimi uygulanabilen sinif: 2/4
```

#### Aynı Sayı, Farklı Kalemler

Betik denetimi kapalıyken yol tabanlı kural 4 meşru olmayan kalemi kaçırıyor; imza tabanlı kural da
4 kaçırıyor. İki sayı eşit, kalemler değil. Yol kuralı, izinli bir dizinde duran imzasız bir kalemi
geçiriyor — izinli yol sınıfı içinde yazılabilir bir alt dizin bulunduğu anda kural o alt dizini de
kapsar. İmza kuralı ise kullanıcı dizininde duran, tanınan bir imzayla imzalanmış bir kalemi
geçiriyor — imza dosyanın kim tarafından üretildiğini söyler, nereye konduğunu değil.

Bu, "hangi kural türü daha iyi" sorusunun yanıtsız olduğu anlamına gelir. Sorulacak soru hangi
kalemleri kaçırdıklarıdır ve iki liste birbirini kapsamaz. İki kuralı **ve** ile birleştirmek kaçan
kalemi 4'ten 3'e indiriyor; her iki ölçütten de geçmek gerektiği için tek başına birinden geçenler
duruyor.

Birleşim biçiminin bedeli aynı satırlarda okunuyor. **Ya da** biçimi yanlış engeli 1 kaleme ve 18
makineye indiriyor ama kaçan kalemi 5'e çıkarıyor. **Ve** biçimi kaçanı 3'e indirirken yanlış engeli
5 kaleme ve 124 makineye çıkarıyor. Aynı iki kural, aynı beş satır, iki farklı birleşimle beş kat
farklı yanlış engel üretiyor. Kural sayısı bu kararı hiç anlatmaz; anlatan şey birleşim biçimidir.

#### Her İki Kuralın da Geçirdiği Kalem

İkinci tablo seçilen kural kümesinde yanlış karar verilen beş kalemi listeliyor. Üçüncü satır bu
dersin sınırıdır: izinli bir dizinde duran ve tanınan bir imzayla imzalanmış bir aracın kötüye
kullanımı. Bu kalem `yol-ve-imza` dâhil bütün kural kümelerinden geçiyor ve betik denetimi de onu
durdurmuyor.

Nedeni kuralda bir eksiklik değil, sorunun kendisidir. İzin listesi "bu ikili çalışabilir mi"
sorusuna yanıt verir; "bu ikili şu anda ne yapıyor" sorusuna bakmaz. Onaylı bir aracın onaylanmamış
bir iş için çağrılması, izin listesinin tanım gereği göremediği kalemdir. Sayısı küçüktür — iki
makine, beş koşum — ama bütün kural kümelerinde aynı kalır ve daha sıkı bir liste onu azaltmaz. Bu
kalemin ölçümü sonraki konuya, davranışa bakan denetimlere aittir.

#### Engellenen Meşru İş

En sıkı yapılandırma — `yol-ve-imza` artı betik denetimi — kaçan kalemi 1'e, kaçan koşumu 5'e
indiriyor. Aynı satırda yanlış engel 7 kaleme ve 208 makineye çıkıyor. Yüz iki makinelik bir filoda
208 makine-kalem, bazı makinelerin birden çok engelle karşılaştığı anlamına gelir.

Engellenen kalemler adıyla okunduğunda hepsinin bir gerekçesi var. Tanılama aracı geçici dizinden
çalışıyor, çünkü olay sırasında oraya indiriliyor. Yeni sürüm yükleyicisi tanım gereği geçici
dizindedir. Sayaç okuma aracı taşınabilir ortamdan çalışıyor, çünkü sahada ağ yok. Kurum içi rapor
aracı imzasız, çünkü imzalayacak bir süreç kurulmamış. Saha kurulum betiği kullanıcı dizininde ve
imzasız. Bunların hiçbiri bir hata değil; hepsi listenin varsaydığı düzenin dışında kalan gerçek
işlerdir.

Her engellenen kalem bir istisna satırı ya da her koşumda bir elle onay üretir. Satır sütunu bunu
sayıyor: en gevşek yapılandırmada 6 satır, en sıkısında 13. Bakım maliyeti listenin kendisinden
değil, istisnalardan gelir ve her yeni araç, her yeni sürüm ve her yeni saha yordamı bu listeyi
yeniden açar.

#### Yorumlanan Kalem ve Tutunma Noktası

Beş kalem betiktir ve bunların kararı çalıştırılan yorumlayıcı üzerinde verilir. Betik denetimi
kapalıyken her kural kümesi bu beş kalemi geçirir, çünkü yorumlayıcı izinli bir ikilidir ve listeye
sorulan şey odur. Betik denetimi açıldığında kaçan kalem her kural kümesinde düşüyor ama oran aynı
değil: `yol` ve
`imza` kuralında yarıya (4'ten 2'ye), `ve` kuralında üçte bire (3'ten 1'e).

Üçüncü tablo bunun tutunma noktalarına karşılığını veriyor ve ilk dersten beri ilk kez kapatılan
sütununa büyük bir sayı yazılıyor. Filodaki 1038 noktanın 972'si onaylanmamış kod çalıştıramaz hâle
geliyor: bir açılış girişi, servis tanımı ya da zamanlanmış görev yerinde durur ama çağırdığı şey
listeden geçmezse çalışmaz.

Açık kalan 66 nokta ise iki sınıftan geliyor. Toplayıcı makinede ve işleme sunucusunda betik denetimi
uygulanamıyor, çünkü önceki derste ölçüldüğü gibi o iki sınıfta işin kendisi betikle yürüyor. Bu
sınıflarda betik taşıyabilen noktalar izinli bir yorumlayıcıyı çağırarak listeyi atlayabilir. Sayı
küçüktür (1038'in yüzde 6'sı) ve tam olarak listenin uygulanamadığı yerde durur. Kapatılamayan
noktanın kuralı burada da geçerlidir: 66 nokta en azından taban çizgisine yazılır ve değişip
değişmediği karşılaştırılır.

#### Özet

- İzin listesi bir yapılandırma maddesi değil, her çalıştırmada verilen bir karardır; doğruluğu
  ancak gerçek bir çalıştırma kümesinde ölçülür. Yirmi beş kalemin 9'u meşru değil, 5'i betiktir.
- Yol tabanlı ve imza tabanlı kural aynı sayıda (4) kalem kaçırır ama aynı kalemleri değil: biri
  izinli dizindeki imzasız kalemi, öteki kullanıcı dizinindeki imzalı kalemi geçirir.
- Birleşim biçimi kural sayısından daha çok karar taşır: aynı beş satır **ya da** biçiminde 1 kalem
  yanlış engelleyip 5 kaçırır, **ve** biçiminde 5 kalem yanlış engelleyip 3 kaçırır.
- En sıkı yapılandırma kaçan kalemi 1'e indirir, karşılığında 7 meşru kalemi 208 makinede engeller
  ve istisna satırını 6'dan 13'e çıkarır. Engellenen kalemlerin hepsinin geçerli bir gerekçesi vardır.
- İzinli dizinde duran ve tanınan bir imzayla imzalanmış bir aracın kötüye kullanımı bütün kural
  kümelerinden geçer; izin listesi "ne çalışabilir" sorusuna bakar, "ne yapıyor" sorusuna değil.
- İzin listesi 1038 tutunma noktasının 972'sini onaylanmamış kod çalıştıramaz hâle getirir; 66'sı
  betik denetiminin uygulanamadığı iki sınıfta açık kalır ve yalnız taban çizgisine yazılabilir.

#### Sonraki Adım

Bu ders bir kalemin çalışıp çalışamayacağına yol ve imzaya bakarak karar verdi. Her iki ölçüt de
kalemin **ne yaptığını** hiç sormuyor ve tam olarak orada kaçıran bir kalem bıraktı. Bir kalemin ne
yaptığını öğrenmenin tek yolu onu çalıştırmaktır — ama uçta çalıştırmak, kararın kendisini
gereksiz kılar. Sonraki dersin konusu bu çıkmazın karşılığıdır: **sanal alan**, şüpheli bir kalemi
üretim ortamından yalıtılmış bir yerde çalıştırıp davranışını gözlemleme kararıdır. Ölçülecek olan
yalıtımın gücü değil — o önceki kursta ölçüldü ve burada girdi olarak alınır — çalıştırma kararının
kendisidir: kaç şüpheli kalem yalıtımda gerçekten çalıştırılabiliyor, gözlem penceresinde kaç
davranış görünüyor, kaç davranış hiç ortaya çıkmıyor ve karar kaç kalemde elle incelemeye düşüyor.

### Sanal Alan Kullanımı

Source: https://academia.sh/tr/kurslar/uc-nokta-guvenligi/sanal-alan-kullanimi

Sanal alan bir çalıştırma kararı olarak ölçülür: 18 şüpheli kalemin 15'i yalıtımda çalışabiliyor, dört yapılandırma görülen davranışı 23'ten 33'e çıkarıyor, 5 kalem hiçbir yapılandırmada karara bağlanamıyor, yanlış izin ile yanlış engel hiçbir yapılandırmada değişmiyor ve kapatılan tutunma noktası her satırda sıfır.

Önceki ders bir kalemin çalışıp çalışamayacağına yola ve imzaya bakarak karar verdi; iki ölçüt de
kalemin **ne yaptığını** hiç sormadı ve tam olarak orada kaçıran kalemler bıraktı. Bir kalemin ne
yaptığını öğrenmenin tek yolu onu çalıştırmaktır — ama uçta çalıştırmak kararın kendisini gereksiz
kılar.

**Sanal alan** bu çıkmazın karşılığıdır: şüpheli kalem üretim ortamından yalıtılmış bir yerde
çalıştırılır ve davranışı gözlenir. Yalıtımın ne kadar güçlü olduğu **Bilgi Teknolojileri ve Sistem
Temelleri** kursunda ölçüldü ve burada girdi olarak alınır. Ölçülen şey yalıtım değil, kararın
kendisidir.

#### Denetim Değil, Karar

Bu dersin sonucu ilk satırda yazılabilir: sanal alan hiçbir tutunma noktasını kapatmaz. Bir açılış
girişi, bir servis tanımı ya da bir zamanlanmış görev, sanal alan kurulduktan sonra da kurulmadan
önceki hâlindedir. Sanal alanın ürettiği tek şey bir **karardır** ve o karar başka bir denetime —
izin listesine — girdi olur. Kursun iki sütunundan yalnız ikincisine, görünür kılma sütununa yazılır
ve bu ders o sütunun en saf örneğidir.

Kararın üç değeri vardır. **Engelle**: gözlemde belirleyici bir davranış görüldü. **İzin**: kalemin
bütün davranışları görüldü ve hiçbiri belirleyici değildi. **Belirsiz**: kalem çalıştı ama en az bir
davranış görülemedi, dolayısıyla görülmemiş olması yokluk anlamına gelmiyor. Üçüncü değer bu dersin
asıl konusudur; iki değerli bir karar tablosu belirsizi ikinciye katar ve ölçüm bozulur.

Şüpheli bir kalem çalıştırıldığında dışarıya bağlantı kurmayı deneyebilir; sanal alanın denetimli
ağı gerçek bir hedefe ulaşmamalıdır ve başka bir kuruma ait bir kalemin incelenmesi **yazılı yetki
ve tanımlı kapsam** olmadan hem yasadışı hem meslek dışıdır.

- **SS25.** On sekiz kalemlik kuyruk, sekiz davranış sınıfı ve dört yapılandırma **modeldir**;
  gerçek bir kalem çalıştırılmıyor. Şüpheli kalemler yalnız tür ve gözlenen davranış sınıfıyla
  anılır; ne oldukları ve nasıl geldikleri yazılmaz.
- **SS26.** Yalıtımın gücü burada ölçülmüyor, girdi olarak alınıyor.
- **SS27.** Bir davranışın görünmesi tek bir ortam koşuluna bağlı sayılır. Gerçekte bir davranış
  birden çok koşul isteyebilir; bu, görülmeyen sütununu büyütür.
- **SS28.** Kalemin çalışabilmesi tek bir zorunlu koşula bağlıdır; koşul sağlanmazsa kalem hiç
  çalıştırılamaz.
- **SS29.** Gözlem penceresi ve elle inceleme süreleri elle yazıldı; rastgelelik yok.
- **SS30.** Belirleyici işareti davranışa aittir, kaleme değil. Aynı davranış meşru bir kalemde de
  görülebilir ve model bunu böyle işaretledi.

```js
// alan/kuyruk.mjs — sanal alanda calistirma karari MODELIDIR. Gercek bir kalem calistirilmaz;
// supheli kalemler yalniz tur ve gozlenen davranis sinifiyla anilir.
// Bir davranisin gorunmesi, ortam kosulunun sanal alanda saglanmasina baglidir.
export const DAVRANIS = {
  'dosya-yazma': '-', 'surec-olusturma': '-', 'kalicilik-tanimi': '-',
  'ag-baglantisi': 'ag', 'kimlik-bilgisi-okuma': 'alan-kimligi',
  'zamanlanmis-tetik': 'uzun-sure', 'kullanici-eylemi': 'kullanici-etkilesimi',
  'cihaz-erisimi': 'ozgun-donanim',
};
// Yapilandirma: sagladigi ortam kosullari, gozlem penceresi (dk), operator gerektiriyor mu.
export const YAPI = {
  yalitik: { saglar: [], pencere: 5, operator: false },
  'denetimli-ag': { saglar: ['ag'], pencere: 5, operator: false },
  'uzun-pencere': { saglar: ['ag', 'uzun-sure'], pencere: 60, operator: false },
  etkilesimli: { saglar: ['ag', 'uzun-sure', 'kullanici-etkilesimi'], pencere: 60, operator: true },
};
export const ELLE_DK = 25;                    // belirsiz kalem basina elle inceleme suresi
// satir: ad | tur | calismasi icin zorunlu kosul | gercek | davranislar ('*' belirleyici)
export const KALEM = `
  tanilama-araci         ikili -             mesru dosya-yazma,surec-olusturma
  yeni-surum-yukleyici   ikili -             mesru dosya-yazma,ag-baglantisi,*kalicilik-tanimi
  ic-yardimci-arac       ikili -             mesru dosya-yazma,surec-olusturma,ag-baglantisi
  sayac-okuma-araci      ikili ozgun-donanim mesru cihaz-erisimi,dosya-yazma
  saha-kurulum-betigi    betik -             mesru dosya-yazma,*kalicilik-tanimi,kullanici-eylemi
  ceyrek-raporu-betigi   betik -             mesru dosya-yazma,ag-baglantisi
  ic-rapor-araci         ikili -             mesru dosya-yazma,ag-baglantisi
  yeni-belge-sablonu     belge -             mesru dosya-yazma,kullanici-eylemi
  tedarikci-arsivi       arsiv -             mesru dosya-yazma,surec-olusturma
  alan-yonetim-betigi    betik alan-kimligi  mesru ag-baglantisi,*kimlik-bilgisi-okuma
  supheli-kalem-1        ikili -             kotu  dosya-yazma,surec-olusturma,*kalicilik-tanimi
  supheli-kalem-2        betik -             kotu  dosya-yazma,ag-baglantisi,*kimlik-bilgisi-okuma
  supheli-kalem-3        ikili -             kotu  dosya-yazma,*zamanlanmis-tetik
  supheli-kalem-4        ikili -             kotu  surec-olusturma,*kimlik-bilgisi-okuma
  supheli-kalem-5        belge -             kotu  dosya-yazma,*kullanici-eylemi
  supheli-kalem-6        ikili -             kotu  dosya-yazma,surec-olusturma
  supheli-kalem-7        arsiv -             kotu  dosya-yazma,*ag-baglantisi
  supheli-kalem-8        ikili ozgun-donanim kotu  dosya-yazma,*cihaz-erisimi`
  .trim().split('\n').map((r) => {
    const [ad, tur, zorunlu, gercek, dav] = r.trim().split(/\s+/);
    return { ad, tur, zorunlu, kotu: gercek === 'kotu',
      davranis: dav.split(',').map((d) => ({ ad: d.replace('*', ''), belirleyici: d.startsWith('*') })) };
  });

export const kosul = (d) => DAVRANIS[d.ad];
export const gorunur = (d, y) => kosul(d) === '-' || YAPI[y].saglar.includes(kosul(d));
export const calisir = (k, y) => k.zorunlu === '-' || YAPI[y].saglar.includes(k.zorunlu);

// Bir kalemin bir yapilandirmadaki karari: engelle | izin | belirsiz | calismadi
export function karar(k, y) {
  if (!calisir(k, y)) return 'calismadi';
  const gorulen = k.davranis.filter((d) => gorunur(d, y));
  if (gorulen.some((d) => d.belirleyici)) return 'engelle';
  return gorulen.length === k.davranis.length ? 'izin' : 'belirsiz';
}

export function tara(y) {
  const s = { calisan: 0, calismayan: 0, gorulen: 0, gorulmeyen: 0,
    engelle: 0, izin: 0, belirsiz: 0, yanlisIzin: 0, yanlisEngel: 0 };
  for (const k of KALEM) {
    const kr = karar(k, y);
    if (kr === 'calismadi') { s.calismayan += 1; continue; }
    s.calisan += 1;
    s.gorulen += k.davranis.filter((d) => gorunur(d, y)).length;
    s.gorulmeyen += k.davranis.filter((d) => !gorunur(d, y)).length;
    s[kr] += 1;
    if (kr === 'izin' && k.kotu) s.yanlisIzin += 1;
    if (kr === 'engelle' && !k.kotu) s.yanlisEngel += 1;
  }
  s.gozlemDk = s.calisan * YAPI[y].pencere;
  s.operatorDk = YAPI[y].operator ? s.gozlemDk : 0;
  s.elleDk = (s.belirsiz + s.calismayan) * ELLE_DK;
  return s;
}
```

#### Dört Yapılandırma, Aynı Kuyruk

```js
// alan/olc.mjs — dort sanal alan yapilandirmasi ayni supheli kalem kuyrugunda degerlendirilir
import { DAVRANIS, YAPI, KALEM, ELLE_DK, kosul, gorunur, calisir, karar, tara } from './kuyruk.mjs';

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join('').trimEnd());
const hicSaglanmaz = [...new Set(Object.values(DAVRANIS))]
  .filter((c) => c !== '-' && !Object.values(YAPI).some((v) => v.saglar.includes(c)));

console.log(`${KALEM.length} supheli kalem, ${KALEM.filter((k) => k.kotu).length} tanesi kotu; ` +
  `${Object.keys(DAVRANIS).length} davranis sinifi, ${Object.keys(YAPI).length} yapilandirma`);
console.log(`hicbir yapilandirmada saglanamayan kosul: ${hicSaglanmaz.join(', ')}`);

const A = [-14, 9, 12, 10, 12, 9, 7, 10, 13, 14];
console.log('\n1. yapilandirma basina sonuc');
y(A, 'yapilandirma', 'calisan', 'calismayan', 'gorulen', 'gorulmeyen', 'engelle', 'izin',
  'belirsiz', 'yanlis izin', 'yanlis engel');
for (const yp of Object.keys(YAPI)) {
  const s = tara(yp);
  y(A, yp, s.calisan, s.calismayan, s.gorulen, s.gorulmeyen, s.engelle, s.izin, s.belirsiz,
    s.yanlisIzin, s.yanlisEngel);
}

const B = [-22, 8, 14, 14, 14, 14];
console.log('\n2. kalem basina karar');
y(B, 'kalem', 'gercek', ...Object.keys(YAPI));
for (const k of KALEM)
  y(B, k.ad, k.kotu ? 'kotu' : 'mesru', ...Object.keys(YAPI).map((yp) => karar(k, yp)));

const C = [-14, 9, 11, 13, 9, 11, 15];
console.log('\n3. karar suresi (dk) ve kapanan tutunma noktasi');
y(C, 'yapilandirma', 'pencere', 'gozlem dk', 'operator dk', 'elle dk', 'toplam dk', 'kapanan nokta');
for (const yp of Object.keys(YAPI)) {
  const s = tara(yp);
  y(C, yp, YAPI[yp].pencere, s.gozlemDk, s.operatorDk, s.elleDk,
    s.gozlemDk + s.operatorDk + s.elleDk, 0);
}
const u = tara('uzun-pencere'), e = tara('etkilesimli');
console.log(`\nelle incelemeye dusen kalem (uzun-pencere)   ${u.belirsiz + u.calismayan} / ${KALEM.length}`);
console.log(`hicbir yapilandirmada karara baglanamayan    ${e.belirsiz + e.calismayan} / ${KALEM.length}`);
console.log(`  en iyi yapilandirmada durdurulamayan kotu  ` +
  `${KALEM.filter((k) => k.kotu && karar(k, 'etkilesimli') !== 'engelle').length}`);
console.log(`her yapilandirmada yanlis izin / yanlis engel ${e.yanlisIzin} / ${e.yanlisEngel}`);
console.log(`elle inceleme suresi                         ${ELLE_DK} dk/kalem`);
```

```
18 supheli kalem, 8 tanesi kotu; 8 davranis sinifi, 4 yapilandirma
hicbir yapilandirmada saglanamayan kosul: alan-kimligi, ozgun-donanim

1. yapilandirma basina sonuc
yapilandirma    calisan  calismayan   gorulen  gorulmeyen  engelle   izin  belirsiz  yanlis izin  yanlis engel
yalitik              15           3        23          12        3      3         9            1             2
denetimli-ag         15           3        29           6        4      6         5            1             2
uzun-pencere         15           3        30           5        5      6         4            1             2
etkilesimli          15           3        33           2        6      7         2            1             2

2. kalem basina karar
kalem                   gercek       yalitik  denetimli-ag  uzun-pencere   etkilesimli
tanilama-araci           mesru          izin          izin          izin          izin
yeni-surum-yukleyici     mesru       engelle       engelle       engelle       engelle
ic-yardimci-arac         mesru      belirsiz          izin          izin          izin
sayac-okuma-araci        mesru     calismadi     calismadi     calismadi     calismadi
saha-kurulum-betigi      mesru       engelle       engelle       engelle       engelle
ceyrek-raporu-betigi     mesru      belirsiz          izin          izin          izin
ic-rapor-araci           mesru      belirsiz          izin          izin          izin
yeni-belge-sablonu       mesru      belirsiz      belirsiz      belirsiz          izin
tedarikci-arsivi         mesru          izin          izin          izin          izin
alan-yonetim-betigi      mesru     calismadi     calismadi     calismadi     calismadi
supheli-kalem-1           kotu       engelle       engelle       engelle       engelle
supheli-kalem-2           kotu      belirsiz      belirsiz      belirsiz      belirsiz
supheli-kalem-3           kotu      belirsiz      belirsiz       engelle       engelle
supheli-kalem-4           kotu      belirsiz      belirsiz      belirsiz      belirsiz
supheli-kalem-5           kotu      belirsiz      belirsiz      belirsiz       engelle
supheli-kalem-6           kotu          izin          izin          izin          izin
supheli-kalem-7           kotu      belirsiz       engelle       engelle       engelle
supheli-kalem-8           kotu     calismadi     calismadi     calismadi     calismadi

3. karar suresi (dk) ve kapanan tutunma noktasi
yapilandirma    pencere  gozlem dk  operator dk  elle dk  toplam dk  kapanan nokta
yalitik               5         75            0      300        375              0
denetimli-ag          5         75            0      200        275              0
uzun-pencere         60        900            0      175       1075              0
etkilesimli          60        900          900      125       1925              0

elle incelemeye dusen kalem (uzun-pencere)   7 / 18
hicbir yapilandirmada karara baglanamayan    5 / 18
  en iyi yapilandirmada durdurulamayan kotu  4
her yapilandirmada yanlis izin / yanlis engel 1 / 2
elle inceleme suresi                         25 dk/kalem
```

#### Görülen ve Görülmeyen Davranış

On sekiz kalemin 15'i çalıştırılabiliyor, 3'ü hiç çalıştırılamıyor. Çalıştırılamayanların ikisi
özgün donanım isteyen kalemler — sayaç okuma aracı ve şüpheli bir ikili — biri de alan kimliği
isteyen bir yönetim betiği. Sanal alan bu üç kalem hakkında hiçbir şey söylemez; kuyruğun altıda
biri, henüz hiçbir gözlem yapılmadan elle incelemeye düşer.

Yalıtımı gevşetmek görülen davranışı artırıyor: 23'ten 33'e, görülmeyen 12'den 2'ye. Ama gevşetilen
şey tam olarak yalıtımın kendisidir. Denetimli ağ eklenmesi altı davranışı daha görünür kılıyor;
gözlem penceresinin beş dakikadan altmış dakikaya çıkarılması yalnız bir davranış ekliyor; operatör
etkileşimi üç davranış ekliyor. Kazanç birbirine eşit değil ve maliyetleri de değil.

İki koşul hiçbir yapılandırmada sağlanmıyor: **alan kimliği** ve **özgün donanım**. Birincisi
sağlanamaz, çünkü sanal alana gerçek bir alan kimliği vermek yalıtımı ortadan kaldırır — o kimlikle
erişilebilecek her şey sanal alanın içine girer. İkincisi sağlanamaz, çünkü donanım orada yoktur.
Bu iki koşul bir yapılandırma eksikliği değil, yöntemin sınırıdır: sanal alan üretim ortamının
kendisi olmadığı sürece üretim ortamına bağlı davranışlar görünmez, üretim ortamının kendisi
olduğunda ise sanal alan olmaktan çıkar.

#### Kararsız Kalan Kalem

İkinci tablo kararların yapılandırmadan yapılandırmaya nasıl değiştiğini gösteriyor. Yalıtık
yapılandırmada 15 çalışan kalemin 9'u belirsiz kalıyor; en yetenekli yapılandırmada bu sayı 2'ye
iniyor. Ama üç değer aynı kalıyor: yanlış izin 1, yanlış engel 2 ve çalıştırılamayan kalem 3.

**Yanlış izin** tek bir kalemdedir ve hiçbir yapılandırmada düzelmiyor. O kalemin bütün davranışları
gözlemde görünüyor — dosya yazma ve süreç oluşturma — ve hiçbiri belirleyici değil. Gözlem
penceresini uzatmak, ağ eklemek ya da operatör oturtmak bu kalemde bir şey değiştirmez, çünkü
eksik olan gözlem değil ayrımın kendisidir. Bir kalemin sanal alandaki davranışı meşru bir kalemden
ayırt edilemiyorsa sanal alan o kalem hakkında karar üretemez.

**Yanlış engel** iki kalemdedir ve nedeni aynıdır, tersinden. Yeni sürüm yükleyicisi ile saha
kurulum betiği bir kalıcılık tanımı yazıyor — bu kursun ölçtüğü şeyin ta kendisi, bir tutunma
noktası tanımı. Belirleyici davranış görülüyor ve karar "engelle" oluyor. İkisi de meşru işlerdir.
Sanal alan davranışı görür, **kimin hangi yetkiyle** yaptığını görmez; kurulum sırasında kalıcılık
tanımı yazmak bir yükleyicinin işidir.

Beş kalem hiçbir yapılandırmada karara bağlanamıyor ve **üçü kötü**. Üçü çalıştırılamayan
kalemlerden, ikisi alan kimliği isteyen davranışı olan kalemlerden geliyor. Kuyruğun sekiz kötü
kaleminin yalnız dördü sanal alanla durduruluyor; kalan dördün üçü için sanal alan bir yanıt
üretmiyor, soruyu elle incelemeye devrediyor — dördüncüsü ise dört yapılandırmada da yanlış bir
**izin** kararıyla geçiyor ve hiç incelemeye düşmüyor.

#### Kararın Süresi

Üçüncü tablo bedeli veriyor ve tek yönlü değil. Gözlem süresi yalıtık yapılandırmada 75 dakika,
uzun pencerede 900. Elle inceleme süresi ise ters yönde gidiyor: 300 dakikadan 125'e. İkisi
toplandığında en ucuz yapılandırma **denetimli ağ** oluyor — 275 dakika — ve en pahalısı
etkileşimli, 1925 dakika. Aradaki fark tam yedi kat ve karşılığında belirsiz kalem 5'ten 2'ye
iniyor, yanlış kararlar hiç değişmiyor.

Bu, kararın nerede duracağını belirleyen sayıdır. Beş dakikalık pencereye denetimli ağ eklemek
görülen davranışı 23'ten 29'a çıkarıyor ve toplam süreyi 375'ten 275'e **düşürüyor**, çünkü elle
incelemeye düşen kalem azalıyor. Pencereyi altmış dakikaya çıkarmak ise bir tek davranış kazandırıp
süreyi dört kat artırıyor. Ucuz olan adım ağın eklenmesidir; pahalı olan sürenin uzatılmasıdır.

Tabloda görünmeyen bir bedel daha var: sanal alanın kendisi bakım ister. Gözlemin işe yaraması için
ortam üretimdeki uçlara benzemelidir — aynı yazılım kümesi, aynı sürümler, aynı yapılandırma — ve
benzedikçe yalıtım azalır. Uçlardaki taban çizgi her değiştiğinde sanal alan görüntüsünün de
güncellenmesi gerekir; güncellenmediğinde kalem, çalıştığı ortamı tanımadığı için hiçbir davranış
göstermeyebilir ve karar sessizce "izin"e kayar. Buna sanal alanı işleten makinelerin kendi
envanteri eklenir: onlar da birer uçtur ve bu kursun ilk dersindeki sayıma girer.

Son sütun bütün satırlarda sıfır. Bir yapılandırmadan ötekine kaç davranış daha görülürse görülsün,
kapatılan tutunma noktası sayısı değişmiyor. Sanal alanın ürettiği karar izin listesine bir satır
ekler ya da eklemez; noktayı kapatan şey o satırdır, sanal alan değil.

#### Özet

- Sanal alan bir denetim değil bir çalıştırma kararıdır: dört yapılandırmanın hepsinde kapatılan
  tutunma noktası sıfırdır. Ürettiği karar izin listesine girdi olur ve nokta orada kapanır.
- Karar üç değerlidir; belirsiz değeri ayrı tutulmazsa ölçüm bozulur. Yalıtık yapılandırmada çalışan
  15 kalemin 9'u belirsiz, en yetenekli yapılandırmada 2'si.
- İki ortam koşulu hiçbir yapılandırmada sağlanamaz — alan kimliği ve özgün donanım. Birincisi
  sağlandığında yalıtım ortadan kalkar; bu bir eksiklik değil, yöntemin sınırıdır.
- Yanlış izin (1) ve yanlış engel (2) hiçbir yapılandırmada değişmez. Yanlış engelin nedeni,
  meşru bir yükleyicinin de bir kalıcılık tanımı yazmasıdır: sanal alan davranışı görür, yetkiyi
  görmez.
- Sekiz kötü kalemin yalnız dördü sanal alanla durdurulur; üçü karara bağlanamayıp elle incelemeye
  devredilir, biri de dört yapılandırmada yanlış bir izin kararıyla geçer.
- Süre iki yönlü çalışır: denetimli ağ eklemek toplam süreyi 375 dakikadan 275'e düşürür, pencereyi
  altmış dakikaya çıkarmak bir davranış kazandırıp süreyi 1075 dakikaya taşır.

#### Sonraki Adım

Buraya kadar sayılan her şey makine açıkken ve bir işletim sistemi çalışırken geçerliydi. Envanter
o sistemin içinden çıkarıldı, izin listesi o sistemin çalıştırma kararlarını denetledi, sanal alan
bir kalemi o sistemin bir kopyasında koşturdu. Hepsinin ortak varsayımı, makineye erişmenin tek
yolunun çalışan sistemden geçmesidir.

Sonraki ders bu varsayımı kaldırır. Disk makineden çıkarılıp başka bir yere takıldığında çalışan
sistem devreden çıkar ve onunla birlikte bütün denetimler düşer: izin listesi değerlendirme yapmaz,
sertleştirme taban çizgisi okunmaz, hiçbir kayıt tutulmaz. Ölçülecek olan şudur: şifrelenmemiş ve
şifrelenmiş diskte fiziksel erişimle kaç kalem okunabiliyor, tam disk şifreleme hangi tutunma
noktası sınıfını kapatıyor ve makine açıkken, oturum açıkken ya da ekran kilitliyken şifrelemenin
**neyi korumadığı** kalem kalem nedir. Konu bu ölçümle kapanır.

### Disk Şifreleme

Source: https://academia.sh/tr/kurslar/uc-nokta-guvenligi/disk-sifreleme

Fiziksel erişimde okunabilen kalem şifrelenmiş ve şifrelenmemiş diskte karşılaştırılır: makine kapalıyken 18 kalemin 15'i korunuyor, öteki üç durumda şifrelemenin katkısı sıfır, filodaki 1038 nokta tanımının 936'sı çevrimdışı yazma yoluna karşı kapanıyor ve bedel 204 anahtar kopyası ile yılda 14.112 dakikalık elle müdahale.

Önceki beş dersin ortak bir varsayımı vardı: makineye erişmenin tek yolu çalışan sistemden geçer.
Envanter o sistemin içinden çıkarıldı, yama o sistemin bileşenlerine uygulandı, kılavuz maddeleri o
sistemin yapılandırmasını değiştirdi, izin listesi o sistemin çalıştırma kararlarını denetledi ve
sanal alan bir kalemi o sistemin bir kopyasında koşturdu.

Disk makineden çıkarılıp başka bir yere takıldığında bu varsayım düşer. Çalışan sistem devreden
çıkar ve onunla birlikte bütün denetimler: izin listesi değerlendirme yapmaz, taban çizgi okunmaz,
hiçbir kayıt tutulmaz. Geriye yalnız diskin üzerindeki baytlar kalır. Bu dersin ölçüsü, o baytların
kaçının okunabildiği ve kaçının yazılabildiğidir.

#### Şifreleme Neyi Yerinden Kaldırır

**Tam disk şifreleme** diskin içeriğini bir anahtara bağlar. Anahtar sunulmadıkça birim
çözülemez; birim çözülmedikçe üzerindeki hiçbir kalem okunamaz ve hiçbir kalem yazılamaz. İki fiil
ayrı ayrı önemlidir. Okuma tarafı bilinen bir konudur: kimlik bilgileri, iş verisi ve kayıtlar
korunur. Bu kursun ölçüsü açısından asıl değişen **yazma** tarafıdır.

Çevrimdışı yazma, bu kursta ilk kez görülen bir tutunma yoludur. Disk çıkarılıp başka bir makinede
bağlandığında ya da makine harici bir ortamdan açıldığında, bir servis tanımı ya da zamanlanmış
görev tanımı doğrudan dosya olarak değiştirilebilir. Bu yolda izin listesi çalışmaz, çünkü kimse
bir şey çalıştırmıyor; dosya yazılıyor ve makine bir sonraki açılışında onu kendisi çalıştırıyor.

Anahtarın nasıl saklandığı ve nasıl döndürüldüğü burada ölçülmez; anahtar yönetimi ayrı bir
konudur. Açılış zincirinin ölçülmesi ise **Kimlik, Erişim ve Kriptografi** kursunda yapıldı ve
burada girdi olarak alınır: makineye bağlı bir anahtarın koruma değeri, o zincirin bozulmadan
kalmasına bağlıdır.

- **SS31.** On sekiz kalemlik disk içeriği, dört makine durumu ve iki şifreleme ayarı **modeldir**;
  gerçek bir disk okunmuyor, gerçek bir şifreleme kurulmuyor.
- **SS32.** Kalemler sınıf düzeyinde yazılır; dosya yolu ve biçim modellenmiyor.
- **SS33.** Birim ya çözülmüştür ya değil; kısmi şifreleme ve dosya düzeyinde şifreleme yok.
- **SS34.** Çevrimdışı yazma yalnız makine kapalıyken mümkün sayılır. Çalışan bir makinede diski
  çıkarmak makineyi kapatmak demektir ve bu, kapalı duruma geçiştir.
- **SS35.** Uyku durumunda anahtar bellekte bulunur; model bu durumu birim çözülmüş sayar.
- **SS36.** Sınıf başına makine, kalan nokta ve yeniden başlatma sayıları önceki derslerden gelir.

```js
// disk/model.mjs — fiziksel erisimde okunabilen kalem MODELIDIR. Gercek bir disk okunmaz,
// gercek bir sifreleme kurulmaz; kalemler sinif duzeyinde yazilir.
// satir: kalem | sinif | sifreli birimin icinde mi | acik oturumda okuyabilen | tasidigi nokta
export const KALEM = `
  acilis-bolumu-yapilandirmasi acilis      disi yonetici  1
  acilis-imza-kaydi            acilis      disi yonetici  0
  kurtarma-anahtari-ipucu      kimlik      disi yonetici  0
  servis-tanimlari             tanim       ici  yonetici  4
  zamanlanmis-gorev-tanimlari  tanim       ici  yonetici  2
  oturum-betikleri             tanim       ici  kullanici 1
  yapilandirma-kancalari       tanim       ici  yonetici  1
  sistem-yapilandirmasi        yapilandirma ici yonetici  0
  kimlik-bilgisi-deposu        kimlik      ici  kullanici 0
  kayitli-oturum-belirteci     kimlik      ici  kullanici 0
  istemci-onbellegi            veri        ici  kullanici 0
  yerel-gunlukler              kayit       ici  yonetici  0
  sayfa-dosyasi                bellek      ici  yonetici  0
  uyku-imgesi                  bellek      ici  yonetici  0
  gecici-dosya-dizini          veri        ici  kullanici 0
  sayac-okuma-verisi           veri        ici  kullanici 0
  yerel-yedek-dizini           veri        ici  yonetici  0
  tasinabilir-ortam-eslesmesi  veri        ici  kullanici 0`
  .trim().split('\n').map((r) => {
    const [ad, sinif, yer, okur, nokta] = r.trim().split(/\s+/);
    return { ad, sinif, ici: yer === 'ici', okur, nokta: Number(nokta) };
  });
// Makine durumu: birimin kilidi acik mi, cevrimdisi yazma yolu var mi (disk cikarma / harici acilis)
export const DURUM = {
  kapali: { kilitAcik: false, cevrimdisiYazma: true },
  uyku: { kilitAcik: true, cevrimdisiYazma: false },
  'kilitli-ekran': { kilitAcik: true, cevrimdisiYazma: false },
  'acik-oturum': { kilitAcik: true, cevrimdisiYazma: false },
};
export const NOKTA = KALEM.reduce((a, k) => a + k.nokta, 0);
export const DISI_NOKTA = KALEM.filter((k) => !k.ici).reduce((a, k) => a + k.nokta, 0);

// Bir durumda ve sifreleme ayarinda fiziksel erisimle okunabilen kalem ve yazilabilen nokta.
export function olc(durum, sifreli) {
  const d = DURUM[durum];
  const acik = !sifreli || d.kilitAcik;             // birim icerigi okunabilir mi
  const okunan = KALEM.filter((k) => acik || !k.ici);
  const yazilan = d.cevrimdisiYazma
    ? KALEM.filter((k) => acik || !k.ici).reduce((a, k) => a + k.nokta, 0) : 0;
  return { okunan: okunan.length, nokta: yazilan,
    katki: KALEM.length - okunan.length };          // sifrelemenin engelledigi kalem
}

// Filo: sinif basina kalan nokta (onceki derslerden) ve birim disinda kalan nokta.
// oncedenDogrulama: acilis oncesi kimlik dogrulama isteniyor mu; istenmiyorsa anahtar makineye bagli.
export const SINIF = [
  { ad: 'saha-dizustu', makine: 60, kalan: 9, disi: 1, yeniden: 14, oncedenDogrulama: true, kayip: 5 },
  { ad: 'sube-ucu', makine: 24, kalan: 12, disi: 1, yeniden: 14, oncedenDogrulama: true, kayip: 1 },
  { ad: 'toplayici', makine: 12, kalan: 12, disi: 1, yeniden: 26, oncedenDogrulama: false, kayip: 0 },
  { ad: 'islem-sunucusu', makine: 6, kalan: 11, disi: 1, yeniden: 12, oncedenDogrulama: false, kayip: 0 },
];
export const ANAHTAR_KOPYA = 2;                     // makine basina kurtarma anahtari kopyasi
export const ELLE_DK = 12;                          // gozetimsiz yeniden baslatmada elle mudahale (dk)
```

#### Dört Durumda Fiziksel Erişim

```js
// disk/olc.mjs — sifrelenmemis ve sifrelenmis diskte okunabilen kalem, kapanan nokta ve bedel
import { KALEM, DURUM, NOKTA, DISI_NOKTA, SINIF, ANAHTAR_KOPYA, ELLE_DK, olc } from './model.mjs';

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

console.log(`${KALEM.length} disk kalemi, ${KALEM.filter((k) => !k.ici).length} tanesi sifreli ` +
  `birimin disinda; makine basina ${NOKTA} tutunma noktasi tanimi, ${DISI_NOKTA} tanesi disarida`);

const A = [-16, 13, 16, 16, 15, 22];
console.log('\n1. fiziksel erisimle okunabilen kalem ve yazilabilen nokta tanimi');
y(A, 'durum', 'sifresiz ok.', 'sifresiz nokta', 'sifreli okunan', 'sifreli nokta', 'sifrelemenin katkisi');
for (const d of Object.keys(DURUM)) {
  const a = olc(d, false), b = olc(d, true);
  y(A, d, a.okunan, a.nokta, b.okunan, b.nokta, b.katki);
}

const B = [-30, -14, 7, 8, 12, 16];
console.log('\n2. birim disinda kalan ve nokta tasiyan kalemler');
y(B, 'kalem', 'sinif', 'yer', 'nokta', 'kapaliyken', 'acik oturumda');
for (const k of KALEM.filter((x) => !x.ici || x.nokta > 0))
  y(B, k.ad, k.sinif, k.ici ? 'ici' : 'disi', k.nokta,
    k.ici ? 'korunur' : 'okunur', `${k.okur} okur`);

const C = [-16, 9, 8, 15, 12, 13, 13];
console.log('\n3. filo: kapanan nokta ve sifrelemenin bedeli');
y(C, 'sinif', 'makine', 'nokta', 'kapanan nokta', 'acik nokta', 'elle dk/yil', 'kayip cihaz');
const t = { nokta: 0, kapanan: 0, acik: 0, dk: 0, kayip: 0 };
for (const s of SINIF) {
  const nokta = s.kalan * s.makine, acik = s.disi * s.makine;
  const dk = s.oncedenDogrulama ? s.makine * s.yeniden * ELLE_DK : 0;
  t.nokta += nokta; t.kapanan += nokta - acik; t.acik += acik; t.dk += dk; t.kayip += s.kayip;
  y(C, s.ad, s.makine, nokta, nokta - acik, acik, dk, s.kayip);
}
y(C, 'toplam', SINIF.reduce((a, s) => a + s.makine, 0), t.nokta, t.kapanan, t.acik, t.dk, t.kayip);

const m = SINIF.reduce((a, s) => a + s.makine, 0);
console.log(`\nkurtarma anahtari kopyasi        ${m * ANAHTAR_KOPYA} (makine basina ${ANAHTAR_KOPYA})`);
console.log(`kayip cihazda okunabilen kalem   sifresiz ${t.kayip * KALEM.length}, ` +
  `sifreli ${t.kayip * KALEM.filter((k) => !k.ici).length}`);
console.log(`acik oturumda kullanicinin okudugu kalem ` +
  `${KALEM.filter((k) => k.okur === 'kullanici').length} / ${KALEM.length}`);
console.log(`sifrelemenin korumadigi durum    ` +
  `${Object.keys(DURUM).filter((d) => olc(d, true).katki === 0).length} / ${Object.keys(DURUM).length}`);
```

```
18 disk kalemi, 3 tanesi sifreli birimin disinda; makine basina 9 tutunma noktasi tanimi, 1 tanesi disarida

1. fiziksel erisimle okunabilen kalem ve yazilabilen nokta tanimi
durum            sifresiz ok.  sifresiz nokta  sifreli okunan  sifreli nokta  sifrelemenin katkisi
kapali                     18               9               3              1                    15
uyku                       18               0              18              0                     0
kilitli-ekran              18               0              18              0                     0
acik-oturum                18               0              18              0                     0

2. birim disinda kalan ve nokta tasiyan kalemler
kalem                         sinif             yer   nokta  kapaliyken   acik oturumda
acilis-bolumu-yapilandirmasi  acilis           disi       1      okunur   yonetici okur
acilis-imza-kaydi             acilis           disi       0      okunur   yonetici okur
kurtarma-anahtari-ipucu       kimlik           disi       0      okunur   yonetici okur
servis-tanimlari              tanim             ici       4     korunur   yonetici okur
zamanlanmis-gorev-tanimlari   tanim             ici       2     korunur   yonetici okur
oturum-betikleri              tanim             ici       1     korunur  kullanici okur
yapilandirma-kancalari        tanim             ici       1     korunur   yonetici okur

3. filo: kapanan nokta ve sifrelemenin bedeli
sinif              makine   nokta  kapanan nokta  acik nokta  elle dk/yil  kayip cihaz
saha-dizustu           60     540            480          60        10080            5
sube-ucu               24     288            264          24         4032            1
toplayici              12     144            132          12            0            0
islem-sunucusu          6      66             60           6            0            0
toplam                102    1038            936         102        14112            6

kurtarma anahtari kopyasi        204 (makine basina 2)
kayip cihazda okunabilen kalem   sifresiz 108, sifreli 18
acik oturumda kullanicinin okudugu kalem 7 / 18
sifrelemenin korumadigi durum    3 / 4
```

#### Kapatılan Nokta ve Kapatıldığı Yol

Filo tablosu bu kursun kapatılan sütununa 936 yazıyor: 1038 nokta tanımının 936'sı şifreli birimin
içindedir ve çevrimdışı olarak yazılamaz. Kalan 102, her makinede birer tane bulunan açılış bölümü
girişleridir; birim çözülmeden okunması gereken bölüm şifrelenemez.

Sayının yanına yolun adı yazılmadığında yanlış okunur. Şifreleme bu 936 noktayı **çevrimdışı yazma
yoluna karşı** kapatır. Aynı 936 nokta, makine çalışırken üzerinde kod çalıştırabilen biri için
tümüyle açıktır; ne şifreleme ne de anahtar orada bir şey yapar. Kursun ilk dersinde kapatılan 40
nokta gerçekten kaldırılmıştı ve hiçbir yolda geri gelmiyordu; buradaki kapatma tek bir yola aittir.

Bu, altı dersin ortak sonucudur. Bir kapatma sayısı ancak hangi yola karşı olduğu yazıldığında
karşılaştırılabilir: kaldırma bütün yollara karşı kapatır, yama bilinen bir kusuru kapatır, kılavuz
maddesi yazabilen özneyi daraltır, izin listesi çalıştırmayı reddeder, şifreleme çevrimdışı yazmayı
durdurur. Beşi de "nokta kapandı" cümlesiyle anlatılabilir ve beşi farklı şeydir.

#### Şifrelemenin Korumadığı Üç Durum

Birinci tablonun son sütunu dört durumdan üçünde sıfır. Makine uykudayken, ekran kilitliyken ve
oturum açıkken şifrelemenin katkısı yoktur, çünkü birim çözülmüştür. On sekiz kalemin on sekizi
okunabilir durumdadır ve onları koruyan şey ekran kilidi ile işletim sisteminin erişim denetimidir.

Bu, şifrelemenin bir eksikliği değil, tanımıdır: birim çözülmeden makine çalışamaz. Ama ölçüm
açısından sonuç nettir — bir uç noktanın **çalışır durumda** geçirdiği süre boyunca tam disk
şifrelemenin koruma değeri sıfırdır. Saha dizüstü bilgisayarları günün büyük bölümünü uyku
durumunda geçirir ve o durumda anahtar bellektedir.

Bunun doğrudan bir karşılığı var. Şifrelemenin koruma değerini artıran şey daha güçlü bir algoritma
değil, makinenin **kapalı durumda geçirdiği süredir**. Bir cihaz kaybedildiğinde okunabilen kalem
sayısı, cihazın o an hangi durumda olduğuna bağlıdır: kapalıysa 3, uykudaysa 18. Bu yüzden ölçülecek
kalem şifreleme ayarı değil, uykudan kapanmaya geçiş süresidir — kaç dakika sonra makinenin
belleğindeki anahtar siliniyor. Süreyi kısaltmak kapalı durumda geçen süreyi uzatır ve bedeli
kullanıcının her dönüşte yeniden açılış beklemesidir. İki sayı yan yana konduğunda karar
sayılabilir hâle gelir: kaç dakika bekleme karşılığında kaç saat kapalı durum.

Alt satırlardan biri ikinci bir sınırı veriyor: açık oturumda 18 kalemin 7'si sıradan bir kullanıcı
yetkisiyle okunabiliyor. Kimlik bilgisi deposu, kayıtlı oturum belirteci, istemci önbelleği, geçici
dosya dizini ve sayaç okuma verisi bunların içindedir. Bir uçta kullanıcı yetkisiyle çalışan kod bu
yedi kalemi okur ve disk şifrelemesi bu okumanın hiçbirini görmez.

İkinci tablo üçüncü sınırı gösteriyor. Şifreli birimin dışında üç kalem duruyor ve biri kurtarma
anahtarı ipucudur — koruma düzeninin kendi kurtarma yolu, koruduğu alanın dışında bulunuyor.
Ötekiler açılış bölümü yapılandırması ve açılış imza kaydıdır; ikisi de birim çözülmeden okunmak
zorundadır ve bu yüzden şifrelenemezler.

#### Bedel

Şifrelemenin karşılığı üç kalemde toplanıyor. Birincisi **kurtarma anahtarı**: 102 makine için 204
kopya. Her kopya bir yerde durur ve o yeri okuyabilen biri, o makinenin diskini çözebilir. Sayı
makine sayısıyla doğru orantılıdır ve azaltılamaz — anahtarı kaybedilen makine kurtarılamaz, diskin
üzerindeki iş verisiyle birlikte gider. Kopya sayısını bire indirmek okuyabilen yeri yarıya düşürür
ve aynı oranda kurtarılamama riskini yükseltir; iki sayı ters yönde çalışır.

İkincisi **gözetimsiz yeniden başlatma**. Açılış öncesi kimlik doğrulama isteyen iki sınıfta, uzaktan
yapılan her yeniden başlatma makinenin başında birini gerektirir: yılda 14.112 dakika, yaklaşık 235
saat. Bu doğrudan ikinci dersle çelişir; orada pencereyi kısaltan şey gözetimsiz uygulanan yamaydı.
Toplayıcı ve işleme sunucusunda bu bedel sıfırdır, çünkü anahtar makineye bağlıdır ve makine kendi
diskini açar. Karşılığı da sıfır değildir: kendi diskini açan bir makinede şifreleme yalnız diskin
**çıkarılmasına** karşı korur, makinenin kendisinin açılmasına karşı değil. Korumanın sürmesi açılış
zincirinin bozulmamasına bağlıdır.

Üçüncüsü kaybedilen cihazlarda görünüyor: yılda 6 cihaz kayboluyor. Şifreleme yoksa 108 kalem
sınıfı okunabilir hâle geliyor; şifreleme varsa 18. Bu, tablodaki en büyük tek kazançtır ve kaybın
cihaz sınıfına göre dağıldığını gösteriyor — kayıpların altısı da taşınabilir iki sınıftan geliyor.

#### Özet

- Tam disk şifreleme okuma ile yazmayı birlikte kapatır; bu kursun ölçüsünü değiştiren şey yazma
  tarafıdır. Çevrimdışı yazma, izin listesinin hiç görmediği bir tutunma yoludur.
- Makine kapalıyken 18 disk kaleminin 15'i korunur; öteki üç durumda — uyku, kilitli ekran, açık
  oturum — şifrelemenin katkısı sıfırdır, çünkü birim çözülmüştür.
- Filodaki 1038 nokta tanımının 936'sı çevrimdışı yazmaya karşı kapanır, 102'si açılış bölümünde
  kalır. Kapatma sayısı ancak hangi yola karşı olduğu yazıldığında karşılaştırılabilir.
- Açık oturumda 18 kalemin 7'si sıradan kullanıcı yetkisiyle okunur; şifreli birimin dışında kalan
  üç kalemden biri korumanın kendi kurtarma ipucudur.
- Bedel 204 kurtarma anahtarı kopyası ve açılış öncesi doğrulama isteyen iki sınıfta yılda 14.112
  dakikalık elle müdahaledir; ikinci dersteki gözetimsiz yama uygulamasıyla doğrudan çelişir.
- Anahtarı makineye bağlı iki sınıfta elle müdahale sıfırdır ve koruma yalnız diskin çıkarılmasına
  karşıdır; yılda 6 kayıp cihazda okunabilen kalem 108'den 18'e iner.

#### Sonraki Adım

Konu altı ölçümle kapanıyor. Varsayılan kurulumun bıraktığı 84 nokta kararının 40'ı kaldırıldı, 44'ü
taban çizgisine yazıldı; yama noktaların açık kaldığı süreyi 10,8 günden 2,3 güne indirdi; kıyaslama
kılavuzu 588 noktanın yazabilen özne kümesini daralttı; izin listesi 972 noktayı onaylanmamış kod
çalıştıramaz kıldı; sanal alan hiçbir nokta kapatmadı, yalnız karar üretti; şifreleme 936 noktayı
çevrimdışı yazmaya karşı kapattı. Uçtaki kalem sayısı daraltıldı ve tutunma noktaları kapatıldı.

Bütün bu ölçümün altında sınanmamış tek bir varsayım duruyor: **hiçbir şeyin çalışmadığı**. Her
sayı, uçta kötü amaçlı bir kod bulunmadığı ya da henüz çalışmadığı varsayımıyla alındı. Kod bir kez
çalıştığında kapatılmış noktaların ne kadarı gerçekten durdurur, kaçı yalnız yavaşlatır ve
kapatılmamış olanlar üzerinden neler yapılabilir — hiçbiri sorulmadı. Sonraki konu **Uç Nokta
Koruma** bu soruyla açılır: kötü amaçlı yazılım türleri yayılma ve kalıcılık davranışıyla
sınıflandırılır, imza ile davranış tabanlı tespit aynı olay kümesinde koşturulur ve her katmanın
kaçırdığı kalem ayrı ayrı sayılır.

## Uç Nokta Koruma

Kod bir kez uçta çalıştıktan sonra koruma katmanlarının kaç tutunma noktasını kapattığı, kaçını yalnız görünür kıldığı: kötü amaçlı yazılım türlerinin yayılma ve kalıcılık davranışı, imza ile davranış tabanlı tespitin aynı olay kümesindeki yanlış pozitif ve kaçırma dengesi, uç nokta tespit ve yanıt telemetrisinin görünürlük kapsamı ile saklama penceresi çatışması, çevre kuralının hiç görmediği uçtan uca trafiğin konak tabanlı filtrelemeyle kapanması, yerleşik ve imzalı ikililerin kötüye kullanımının imza tabanlı tespiti düşürmesi ve kalıcılık mekanizması envanterinin denetim başına kapanan ile kayda düşen bölünmesi.

### Kötü Amaçlı Yazılım Türleri

Source: https://academia.sh/tr/kurslar/uc-nokta-guvenligi/kotu-amacli-yazilim-turleri

On tür yayılma biçimi ve kullandığı tutunma noktasıyla sınıflandırılır: tür başına düşen nokta sayısı, hiç kalıcılık kurmayan iki tür, her nokta türünü kullanan tür sayısı ile aynı noktadaki meşru kalem sayısı ve nokta türlerini ucuzdan pahalıya kapatınca tamamen duran, kısmen duran ve hiç etkilenmeyen tür sayısı.

Önceki konu uçtaki kalem sayısını daralttı ve otomatik çalıştırılan noktaları tek tek kapattı.
Bütün o ölçüm sessiz bir varsayım taşıyordu: uçta henüz hiçbir şey çalışmamıştı. Bu ders o
varsayımı kaldırır ve tersinden sorar — kod bir kez çalıştıysa, kapatılmış noktalar bunun ne
kadarını durdurur?

Sorunun cevabı çalışan şeyin **ne olduğuna** değil, **nasıl yayıldığına ve nereye tutunduğuna**
bağlıdır. Bu yüzden sınıflandırma aile adıyla değil, iki ölçülebilir davranışla yapılır: yayılma
biçimi ve kullanılan tutunma noktası türü. Ölçülen üç sayı var: bir tür kaç tutunma noktası
kullanıyor, bir nokta türünü kaç tür kullanıyor ve o noktayı kapatmak uçtaki kaç meşru kalemi
birlikte götürüyor. Bu derste hiçbir bulaşma yöntemi yazılmadı; sayılan şey bulaşmanın bıraktığı
kalemdir.

- **UK1.** On tür, sekiz nokta türü ve uçtaki meşru kalem sayıları kurgusal bölgesel ölçüm ağının
  saha dizüstü taban çizgisine aittir. Gerçek bir örnek çalıştırılmıyor; ölçülen şey `node` ile
  kurulan modeldir.
- **UK2.** Tür adları davranış tanımıdır. Aile adı, kampanya adı ve örnek adı modelde hiç geçmez;
  aynı davranışı gösteren iki farklı örnek modelde tek satırdır.
- **UK3.** Bir tür ya bir nokta türünü kullanır ya kullanmaz. Gerçekte aynı tür ortama göre farklı
  nokta seçer; modelde seçim sabittir, bu da nokta sayısını olduğundan küçük gösterir.
- **UK4.** Meşru kalem sayıları tek bir ucun taban çizgisinden alındı. Sunucularda bu sayılar daha
  büyük, şube uçlarında daha küçüktür; oranların yönü değişmez.
- **UK5.** "Kapatmak" bir nokta türüne yeni kalem eklenmesinin engellenmesi demektir. Var olan
  meşru kalemlerin de aynı denetimden geçmesi gerektiği için bedel sütunu o kalemleri sayar.
- **UK6.** Tespit bu derste yok. Kapatılan nokta sayılıyor, görülen nokta sayılmıyor; görünürlük
  sonraki iki dersin konusudur.

#### İki Eksen: Yayılma ve Kalıcılık

Model her tür için dört şey tutuyor: davranış tanımı, yayılma biçimi, kullandığı nokta türleri ve
döndüğü sonuç. Yayılma biçimi kodun uca **nasıl geldiğini**, nokta listesi ise geldikten sonra
**nereye yazıldığını** söyler. İki eksen birbirinden bağımsızdır ve karıştırılmaları yaygın bir
ölçüm hatasıdır: yayılması hızlı olan tür kalıcılığı zayıf olabilir, hiç yayılmayan tür en çok
noktaya tutunabilir.

```js
// tur.mjs — kotu amacli yazilim turleri, yayilma bicimi ve kullandigi tutunma noktalari; model
// [tur adi, yayilma bicimi, kullandigi nokta turleri, dondugu sonuc]
export const TUR = [
  ['ag uzerinden yayilan bilesen', 'otomatik ag', ['servis-tanimi', 'zamanlanmis-gorev'], 'yayilma'],
  ['kullanici tarafindan acilan bilesen', 'kullanici acmasi', ['acilis-girisi', 'oturum-betigi'], 'uzak erisim'],
  ['veriyi sifreleyen bilesen', 'ikincil yerlestirme', [], 'erisilebilirlik kaybi'],
  ['tus ve ekran kaydeden bilesen', 'kullanici acmasi', ['oturum-betigi', 'yukleme-yolu-kancasi', 'olay-aboneligi'], 'gizlilik kaybi'],
  ['uzaktan komut bekleyen bilesen', 'ikincil yerlestirme', ['servis-tanimi', 'olay-aboneligi'], 'erisim surdurme'],
  ['merkezden yonetilen ajan', 'otomatik ag', ['acilis-girisi', 'zamanlanmis-gorev', 'servis-tanimi'], 'kaynak devri'],
  ['islem gucu tuketen bilesen', 'ikincil yerlestirme', ['zamanlanmis-gorev'], 'kaynak tuketimi'],
  ['bellekte kalan yukleyici', 'kullanici acmasi', [], 'ikinci asamayi getirme'],
  ['mesru ikiliye ilisen bilesen', 'dosya ilistirme', ['mesru-ikiliye-ilisme'], 'yayilma'],
  ['cikarilabilir ortamla tasinan bilesen', 'cikarilabilir ortam', ['ortam-otomatik-calistirma'], 'yayilma'],
];
// nokta turu -> bir uctaki mesru kalem sayisi (kurgusal saha dizustu taban cizgisi)
export const MESRU = {
  'acilis-girisi': 14, 'servis-tanimi': 63, 'zamanlanmis-gorev': 41, 'oturum-betigi': 6,
  'yukleme-yolu-kancasi': 3, 'olay-aboneligi': 2, 'mesru-ikiliye-ilisme': 0,
  'ortam-otomatik-calistirma': 1,
};
export const NOKTA = Object.keys(MESRU);
export const kullanan = (n) => TUR.filter((t) => t[2].includes(n));
export const durum = (t, kapali) => t[2].length === 0 ? 'nokta yok'
  : t[2].every((n) => kapali.includes(n)) ? 'tamamen durur'
  : t[2].some((n) => kapali.includes(n)) ? 'kismen durur' : 'etkilenmez';
```

Sekiz nokta türü, önceki konuda envanterlenen otomatik çalıştırma kalemlerinin sınıflarıdır:
açılışta çalışan giriş, servis tanımı, zamanlanmış görev, kullanıcı oturum betiği, kütüphane
yükleme yolu kancası, kalıcı olay aboneliği, meşru bir ikiliye iliştirilme ve çıkarılabilir ortamın
otomatik çalıştırma girişi. Son ikisi ötekilerden ayrılır: bir dosyaya iliştirilme uçta yeni bir
giriş üretmez, çıkarılabilir ortamın girişi ise uçta değil takılan ortamda durur.

#### Tür Başına Nokta, Nokta Başına Tür

```js
// kosum1.mjs — turleri yayilma ve kalicilik davranisiyla siniflandirir, nokta turlerini sayar
import { TUR, NOKTA, MESRU, kullanan } from './tur.mjs';

const kalicisiz = TUR.filter((t) => t[2].length === 0);
console.log(`${TUR.length} tur, ${NOKTA.length} nokta turu; kalicilik kurmayan tur: ${kalicisiz.length}\n`);
console.log(`${'tur'.padEnd(38)} ${'yayilma'.padStart(20)} ${'nokta'.padStart(5)} ${'sonuc'.padStart(22)}`);
for (const t of TUR)
  console.log(`${t[0].padEnd(38)} ${t[1].padStart(20)} ${String(t[2].length).padStart(5)} ${t[3].padStart(22)}`);

const yayilma = [...new Set(TUR.map((t) => t[1]))];
console.log(`\n${'yayilma bicimi'.padEnd(20)} ${'tur'.padStart(4)} ${'toplam nokta'.padStart(12)} ${'tur basina'.padStart(10)}`);
for (const y of yayilma) {
  const g = TUR.filter((t) => t[1] === y), n = g.reduce((a, t) => a + t[2].length, 0);
  console.log(`${y.padEnd(20)} ${String(g.length).padStart(4)} ${String(n).padStart(12)} ${(n / g.length).toFixed(1).padStart(10)}`);
}

console.log(`\n${'nokta turu'.padEnd(26)} ${'kullanan tur'.padStart(12)} ${'uctaki mesru kalem'.padStart(18)}`);
for (const n of NOKTA)
  console.log(`${n.padEnd(26)} ${String(kullanan(n).length).padStart(12)} ${String(MESRU[n]).padStart(18)}`);
console.log(`${'toplam'.padEnd(26)} ${String(TUR.reduce((a, t) => a + t[2].length, 0)).padStart(12)} ` +
  `${String(Object.values(MESRU).reduce((a, b) => a + b, 0)).padStart(18)}`);
```

```
10 tur, 8 nokta turu; kalicilik kurmayan tur: 2

tur                                                 yayilma nokta                  sonuc
ag uzerinden yayilan bilesen                    otomatik ag     2                yayilma
kullanici tarafindan acilan bilesen        kullanici acmasi     2            uzak erisim
veriyi sifreleyen bilesen               ikincil yerlestirme     0  erisilebilirlik kaybi
tus ve ekran kaydeden bilesen              kullanici acmasi     3         gizlilik kaybi
uzaktan komut bekleyen bilesen          ikincil yerlestirme     2        erisim surdurme
merkezden yonetilen ajan                        otomatik ag     3           kaynak devri
islem gucu tuketen bilesen              ikincil yerlestirme     1        kaynak tuketimi
bellekte kalan yukleyici                   kullanici acmasi     0 ikinci asamayi getirme
mesru ikiliye ilisen bilesen                dosya ilistirme     1                yayilma
cikarilabilir ortamla tasinan bilesen   cikarilabilir ortam     1                yayilma

yayilma bicimi        tur toplam nokta tur basina
otomatik ag             2            5        2.5
kullanici acmasi        3            5        1.7
ikincil yerlestirme     3            3        1.0
dosya ilistirme         1            1        1.0
cikarilabilir ortam     1            1        1.0

nokta turu                 kullanan tur uctaki mesru kalem
acilis-girisi                         2                 14
servis-tanimi                         3                 63
zamanlanmis-gorev                     3                 41
oturum-betigi                         2                  6
yukleme-yolu-kancasi                  1                  3
olay-aboneligi                        2                  2
mesru-ikiliye-ilisme                  1                  0
ortam-otomatik-calistirma             1                  1
toplam                               15                130
```

İlk sayı iki türün hiç kalıcılık kurmamasıdır ve bunun iki ayrı nedeni var. Veriyi şifreleyen
bileşen tek koşumda işini bitirir; yeniden başlatmadan sonra çalışmasına gerek yoktur, çünkü
verdiği zarar diskte durmaktadır. Bellekte kalan yükleyici ise ikinci aşamayı getirdikten sonra
görevini tamamlar. İkisi de yeniden başlatmayla ortadan kalkar ve ikisi için de bu bir kayıp
değildir. Kalıcılık noktası kapatmaya dayanan bir savunma bu iki türe hiçbir şey yapmaz — sayılan
on beş noktanın hiçbiri onlara ait değildir.

Yayılma tablosu ikinci farkı veriyor. Ağ üzerinden otomatik yayılan iki tür, tür başına 2,5 nokta
kullanıyor; ikincil yerleştirmeyle gelen üç tür yalnızca 1,0. Yayılma otomatikleştikçe kalıcılık
da genişliyor, çünkü otomatik yayılan bir bileşen hangi uca düştüğünü bilmez ve birden çok noktaya
yazmak orada kalma olasılığını artırır. Elle yerleştirilen bir bileşen ise hedefi bilir; tek doğru
nokta yeter.

Üçüncü tablo ölçünün asıl gerilimini gösteriyor. Nokta türlerinin kullanım sıklığı ile o noktadaki
meşru kalem sayısı **aynı yönde** gidiyor. En çok tür tarafından kullanılan iki nokta türü servis
tanımı ve zamanlanmış görevdir — üçer tür — ve uçtaki meşru kalemlerin 104'ü, yani toplam 130'un
dörtte üçünden fazlası tam olarak bu iki noktada durur. Kötü amaçlı kod bu noktaları rastgele
seçmiyor; işletim sisteminin de meşru yazılımın da düzenli iş için kullandığı yeri seçiyor.
Kalabalığın içinde durmak, kalabalığın kendisi bir savunmadır.

#### Kapatma Sırası ve Üç Sonuç

```js
// kosum2.mjs — nokta turlerini ucuzdan pahaliya kapatir, duran ve etkilenmeyen turu sayar
import { TUR, NOKTA, MESRU, durum } from './tur.mjs';

const sira = [...NOKTA].sort((a, b) => MESRU[a] - MESRU[b]);
const sayim = (kapali) => ['tamamen durur', 'kismen durur', 'etkilenmez', 'nokta yok']
  .map((d) => TUR.filter((t) => durum(t, kapali) === d).length);

console.log(`${'kapatilan nokta turu'.padEnd(26)} ${'bedel'.padStart(5)} ${'tam'.padStart(4)} ${'kismi'.padStart(5)} ` +
  `${'etkisiz'.padStart(7)} ${'noktasiz'.padStart(8)}`);
const kapali = [];
for (const n of [null, ...sira]) {
  if (n) kapali.push(n);
  const [tam, kismi, etkisiz, yok] = sayim(kapali);
  const bedel = kapali.reduce((a, k) => a + MESRU[k], 0);
  console.log(`${(n ?? 'hicbiri').padEnd(26)} ${String(bedel).padStart(5)} ${String(tam).padStart(4)} ` +
    `${String(kismi).padStart(5)} ${String(etkisiz).padStart(7)} ${String(yok).padStart(8)}`);
}

const ucuz = sira.slice(0, 5);
console.log(`\nucuz bes nokta turu kapaliyken (bedel ${ucuz.reduce((a, k) => a + MESRU[k], 0)} mesru kalem):`);
for (const t of TUR)
  console.log(`  ${t[0].padEnd(38)} ${durum(t, ucuz).padStart(14)} ` +
    `${t[2].filter((n) => !ucuz.includes(n)).join(', ') || '-'}`);
```

```
kapatilan nokta turu       bedel  tam kismi etkisiz noktasiz
hicbiri                        0    0     0       8        2
mesru-ikiliye-ilisme           0    1     0       7        2
ortam-otomatik-calistirma      1    2     0       6        2
olay-aboneligi                 3    2     2       4        2
yukleme-yolu-kancasi           6    2     2       4        2
oturum-betigi                 12    3     2       3        2
acilis-girisi                 26    4     2       2        2
zamanlanmis-gorev             67    5     3       0        2
servis-tanimi                130    8     0       0        2

ucuz bes nokta turu kapaliyken (bedel 12 mesru kalem):
  ag uzerinden yayilan bilesen               etkilenmez servis-tanimi, zamanlanmis-gorev
  kullanici tarafindan acilan bilesen      kismen durur acilis-girisi
  veriyi sifreleyen bilesen                   nokta yok -
  tus ve ekran kaydeden bilesen           tamamen durur -
  uzaktan komut bekleyen bilesen           kismen durur servis-tanimi
  merkezden yonetilen ajan                   etkilenmez acilis-girisi, zamanlanmis-gorev, servis-tanimi
  islem gucu tuketen bilesen                 etkilenmez zamanlanmis-gorev
  bellekte kalan yukleyici                    nokta yok -
  mesru ikiliye ilisen bilesen            tamamen durur -
  cikarilabilir ortamla tasinan bilesen   tamamen durur -
```

Kapatma sırası ucuz uçtan başlatıldı ve eğri baştan sonuna kadar yatık değil. İlk üç adım toplam
üç meşru kalem bedeliyle iki türü tamamen, iki türü kısmen durduruyor. Dördüncü adım — kütüphane
yükleme yolu kancası — üç kalem daha harcıyor ve **hiçbir sütunu değiştirmiyor**: o noktayı tek bir
tür kullanıyor ve o türün başka iki noktası zaten açık. Bedeli olan ve karşılığında sıfır getiren
bir adım, katman eklemenin bedava olduğu varsayımının nerede kırıldığını gösterir.

Son iki adım tersine dönüyor. Zamanlanmış görevi kapatmak 41, servis tanımını kapatmak 63 meşru
kalem demektir; ikisi birlikte bedeli 26'dan 130'a çıkarıyor ve karşılığında dört tamamen duran
türü sekize taşıyor. Bu, uçtaki meşru otomatik çalıştırma kalemlerinin **tamamının** elden
geçirilmesi karşılığında dört tür kazanmaktır. Ölçüm bu noktada bir karar sunar, tavsiye değil:
dört tür yüz otuz kalemin her uçta tek tek onaylanmasına değer mi, yoksa bu iki nokta türü
kapatılamayacak kadar kalabalık olduğu için başka bir savunmaya mı bırakılmalı?

Alt liste ucuz beşlinin durumunu tek tek yazıyor ve iki sütunun neden ayrı tutulduğunu gösteriyor.
Üç tür tamamen duruyor; ikisi kısmen duruyor, yani hâlâ çalışabiliyor ama nokta seçeneği bire
iniyor; üçü hiç etkilenmiyor; ikisinin ise kapatılacak noktası yok. On iki meşru kalem bedeliyle on
türün üçü durdu. Kalan yedi tür için nokta kapatmak bitmiş bir savunmadır — geriye kalan tek soru
onların **çalışırken** görülüp görülmediğidir.

#### Sıralamanın Kendisi Bir Karar

Ucuzdan pahalıya kapatmak tek seçenek değil. Sezgisel olarak daha akla yakın gelen ikinci bir
sıralama var: en çok tür tarafından kullanılan noktayı önce kapatmak. İki sıralama aynı sekiz
noktayı içerir ve sonunda aynı yere varır; ayrıştıkları yer **arada** durduğunuz noktadır.

```js
// kosum3.mjs — iki kapatma siralamasi: ucuzdan pahaliya ve cok tur etkileyenden aza
import { TUR, NOKTA, MESRU, kullanan, durum } from './tur.mjs';

const ucuz = [...NOKTA].sort((a, b) => MESRU[a] - MESRU[b]);
const genis = [...NOKTA].sort((a, b) => kullanan(b).length - kullanan(a).length || MESRU[a] - MESRU[b]);
const tam = (k) => TUR.filter((t) => durum(t, k) === 'tamamen durur').length;
function egri(sira) {
  const k = [], nokta = {};
  for (const n of sira) {
    k.push(n);
    const d = tam(k);
    if (nokta[d] === undefined) nokta[d] = { adim: k.length, bedel: k.reduce((a, x) => a + MESRU[x], 0) };
  }
  return nokta;
}
const [a, b] = [egri(ucuz), egri(genis)];
console.log(`ucuz sira : ${ucuz.join(' > ')}`);
console.log(`genis sira: ${genis.join(' > ')}\n`);
console.log(`${'hedef tam duran tur'.padEnd(19)} ${'ucuz adim'.padStart(9)} ${'ucuz bedel'.padStart(10)} ` +
  `${'genis adim'.padStart(10)} ${'genis bedel'.padStart(11)}`);
for (let d = 1; d <= 8; d++) {
  if (!a[d] && !b[d]) continue;
  const f = (x) => x ? [String(x.adim), String(x.bedel)] : ['-', '-'];
  const [aa, ab] = f(a[d]), [ba, bb] = f(b[d]);
  console.log(`${String(d).padEnd(19)} ${aa.padStart(9)} ${ab.padStart(10)} ${ba.padStart(10)} ${bb.padStart(11)}`);
}
```

```
ucuz sira : mesru-ikiliye-ilisme > ortam-otomatik-calistirma > olay-aboneligi > yukleme-yolu-kancasi > oturum-betigi > acilis-girisi > zamanlanmis-gorev > servis-tanimi
genis sira: zamanlanmis-gorev > servis-tanimi > olay-aboneligi > oturum-betigi > acilis-girisi > mesru-ikiliye-ilisme > ortam-otomatik-calistirma > yukleme-yolu-kancasi

hedef tam duran tur ucuz adim ucuz bedel genis adim genis bedel
1                           1          0          1          41
2                           2          1          2         104
3                           5         12          3         106
4                           6         26          -           -
5                           7         67          5         126
6                           -          -          6         126
7                           -          -          7         127
8                           8        130          8         130
```

İki eğri her hedefte ayrışıyor ve ucuz sıralama baştan sona önde. Bir türü tamamen durdurmak ucuz
sırada sıfır meşru kalem, geniş sırada kırk bir kalem istiyor. Üç türe varmak ucuz sırada on iki,
geniş sırada yüz altı kalem tutuyor — dokuz kata yakın fark. Neden böyle olduğu üçüncü tablodaki
hizalanmadan geliyor: en çok tür tarafından kullanılan noktalar aynı zamanda en kalabalık meşru
noktalardır ve tek başına kapatıldıklarında hiçbir türü **tamamen** durdurmazlar, çünkü o türlerin
başka noktaları da vardır. Geniş sıralama iki pahalı adımı harcayıp yalnız iki tür kazanıyor.

Geniş sıranın dört türde boş kalması da aynı nedenle: üçüncü adımdan beşinci adıma geçerken sayı
üçten beşe atlıyor, dört hiç görünmüyor. Sıralama düzgün bir eğri üretmez; hangi türün hangi nokta
kümesini kullandığına bağlı sıçramalar üretir. Sekizinci satırda ikisi de aynı yere, yüz otuz
kaleme varıyor — hepsini kapatmak istendiğinde sıralamanın bir önemi kalmaz. Sıralama yalnız
**yolun ortasında durulacaksa** anlamlıdır ve savunmalar hemen her zaman yolun ortasında durur.

#### Özet

- 10 tür yayılma biçimi ve tutunma noktasıyla sınıflandırıldı; aile adı hiç kullanılmadı. Toplam
  15 nokta kullanımı 8 nokta türüne dağılıyor.
- 2 tür hiç kalıcılık kurmuyor: biri tek koşumda işini bitiriyor, öteki ikinci aşamayı getirip
  bırakıyor. Nokta kapatmaya dayanan savunma bu ikisine hiçbir şey yapmaz.
- Otomatik ağ yayılımı tür başına 2,5 nokta, ikincil yerleştirme 1,0 nokta kullanıyor: yayılma
  otomatikleştikçe kalıcılık genişliyor, çünkü hedef önceden bilinmiyor.
- En çok kullanılan iki nokta türü (servis tanımı, zamanlanmış görev) uçtaki 130 meşru kalemin
  104'ünü barındırıyor. Kötü amaçlı kod kalabalık noktayı seçer; kalabalık kapatmayı pahalılaştırır.
- 12 meşru kalem bedeliyle 3 tür tamamen, 2 tür kısmen duruyor; 3 tür hiç etkilenmiyor. Bütün
  noktaları kapatmak 130 kalem bedeliyle 8 türü durdurur, 2 tür yine dışarıda kalır.
- Bedeli olup hiçbir sütunu değiştirmeyen bir adım var (yükleme yolu kancası, 3 kalem). Sıralama
  da bir karardır: 3 türü durdurmak ucuz sırada 12, en çok tür etkileyenden başlayan sırada 106
  kalem tutuyor. Sekiz türün hepsinde ikisi de 130'a varır; sıralama yalnız yolun ortasında durulursa
  anlamlıdır.

#### Sonraki Adım

Bu dersin kapatamadığı yedi tür ve hiç kalıcılık kurmayan iki tür aynı yere bakıyor: bir şey
çalıştığı anda görülüp durdurulmalı. Bunu üstlenen katman iki ayrı soru sorabilir — "bu kalemi
daha önce gördüm mü" ve "bu kalem ne yapıyor". İki soru aynı olay kümesinde farklı cevap verir ve
ikisinin de iki tür yanlışı vardır. Sonraki dersin sorusu budur: aynı çalıştırma kümesinde imza
tabanlı ve davranış tabanlı tespit kaç kötü kalemi yakalıyor, kaçını kaçırıyor, kaç meşru kalemi
yanlışlıkla işaretliyor ve karar eşiği oynatıldığında bu iki yanlış neden ters yönde hareket ediyor.

### Kötü Amaçlı Yazılım Karşıtı Yazılımlar

Source: https://academia.sh/tr/kurslar/uc-nokta-guvenligi/kotu-amacli-yazilim-karsiti

Yirmi çalıştırma kalemi aynı kümede iki tespit türüyle değerlendirilir: imza tabanlı tespitin yakaladığı, kaçırdığı ve yanlış işaretlediği kalem; altı belirtiden türetilen davranış puanının eşik taraması; eşik düştükçe kaçırılanın azalıp yanlış pozitifin artması; engelleme kipinde kapanan tutunma noktası ile kesilen meşru iş ve uyarı kipinde yalnız görünür kılınan aynı nokta.

Önceki ders on türün yedisini nokta kapatmayla durduramadı ve ikisinin kapatılacak noktası bile
yoktu. O yediyi durduracak katman farklı bir soru sorar: uçta bir şey çalıştığında bu kalemin
sakıncalı olduğu **nereden bilinir**? İki ayrı cevap var ve ikisi de aynı çalıştırma kümesi
üzerinde ölçülebilir.

Birinci cevap tanımaya dayanır: bu kalemi daha önce gördüm ve sakıncalı olarak işaretlemiştim.
İkinci cevap davranışa dayanır: bu kalemin yaptığı işler sakıncalı kalemlerin yaptıklarına
benziyor. Birincinin tek bir ayarı yoktur, ikincinin bir eşiği vardır ve bu ders o eşiği uçtan uca
tarar. Ölçülen üç sayı her koşumda birlikte yazılır: kaç kötü kalem yakalandı, kaçı kaçtı, kaç
meşru kalem yanlışlıkla işaretlendi. Ağ tarafında tespit başka bir kursta ölçülmüştü ve orada eşik
modellenmemişti; burada ölçülen tam olarak eşiğin kendisidir.

- **UK7.** Yirmi çalıştırma kalemi, altı belirti ve ağırlıkları kurgusal bölgesel ölçüm ağının bir
  saha dizüstü ucuna aittir. Gerçek bir kalem çalıştırılmıyor; ölçülen şey `node` ile kurulan
  modeldir.
- **UK8.** Kalemlerin gerçek sınıfı modelde bilinir. Gerçekte bu sınıf ancak inceleme sonrası
  bilinir; bilindiği varsayılıyor ki kaçırılan ile yanlış pozitif ayrı ayrı sayılabilsin.
- **UK9.** Davranış puanı belirti ağırlıklarının toplamıdır ve ağırlıklar sabittir. Gerçek
  düzeneklerde ağırlık öğrenilir ve zamanla kayar; sabit ağırlık eğrinin biçimini basitleştirir,
  iki yanlışın ters yönünü değiştirmez.
- **UK10.** İmza üç değerle modellendi: kesin eşleşme, geniş eşleşme ve eşleşmeme. Geniş eşleşme
  bir paketleme biçimine bakan kural demektir ve meşru bir kaleme de değebilir.
- **UK11.** Bir kalem ya çalışır ya engellenir; kısmi engelleme, karantinaya alma ve geri alma
  modellenmedi.
- **UK12.** Tutunma noktası sütunu önceki dersin envanterinden gelir: kalemin yazdığı nokta
  sayısıdır. Puanla ilişkisi yoktur; ayrı bir sütun olarak taşınır.

#### Belirtiden Türetilen Puan

Davranış puanı elle verilmiş bir sayı değil, altı belirtinin ağırlıklarının toplamıdır. Ağırlıklar
belirtinin ne kadar ayırt edici olduğunu söyler: başka bir sürecin belleğine yazmak ve otomatik
çalıştırılan bir noktaya kalem eklemek en yüksek ağırlığı taşır, alışılmadık saatte çalışmak en
düşüğü. Belirtilerin hiçbiri tek başına sakıncalı değildir; meşru yönetim araçları da aynı işleri
yapar ve modelin gerilimi buradan çıkar.

```js
// olay.mjs — uctaki calistirma olaylari, belirti agirliklari ve iki tespit turu; model
export const BELIRTI = {
  'tutunma noktasina yazma': 3, 'baska surece yazma': 3, 'imzasiz ikili': 2,
  'toplu dosya degisikligi': 2, 'dis adrese surekli baglanti': 2, 'kullanici disi saatte calisma': 1,
};
const B = Object.keys(BELIRTI);
const [N, S, I, D, G, Z] = B;
// [kalem, gercek sinif, imza durumu, belirtiler, yazdigi tutunma noktasi sayisi]
export const OLAY = [
  ['ag uzerinden gelen bilesen', 'kotu', 'kesin', [N, I, G, Z], 2],
  ['uzaktan komut bekleyen bilesen', 'kotu', 'yok', [N, S, G], 2],
  ['veriyi sifreleyen bilesen', 'kotu', 'kesin', [I, D, G, Z], 0],
  ['tus ve ekran kaydeden bilesen', 'kotu', 'yok', [N, S, Z], 3],
  ['bellekte kalan yukleyici', 'kotu', 'yok', [I, G], 0],
  ['yerlesik araclarla kosan adim', 'kotu', 'yok', [G, Z], 0],
  ['uc nokta yonetim ajani', 'mesru', 'yok', [N, S, G], 2],
  ['yama dagitim ajani', 'mesru', 'yok', [N, D, Z], 1],
  ['yedekleme araci', 'mesru', 'yok', [D, G, Z], 0],
  ['envanter tarama araci', 'mesru', 'yok', [N, G], 1],
  ['kurumsal kurulum paketi', 'mesru', 'genel', [N, I], 1],
  ['uzak destek istemcisi', 'mesru', 'yok', [S, G], 0],
  ['saha olcum yukleyicisi', 'mesru', 'yok', [I, G, Z], 0],
  ['derleyici cikti dizini', 'mesru', 'yok', [I, D], 0],
  ['zamanlanmis rapor betigi', 'mesru', 'yok', [N, Z], 1],
  ['gunluk toplayici', 'mesru', 'yok', [G, Z], 0],
  ['disk sifreleme yardimcisi', 'mesru', 'yok', [D, Z], 0],
  ['arsivleme araci', 'mesru', 'yok', [D], 0],
  ['tarayici', 'mesru', 'yok', [G], 0],
  ['belge duzenleyici', 'mesru', 'yok', [], 0],
];
export const puan = (o) => o[3].reduce((a, b) => a + BELIRTI[b], 0);
export const ENUST = Object.values(BELIRTI).reduce((a, b) => a + b, 0);
export const imzaUyarir = (o) => o[2] !== 'yok';
export const davranisUyarir = (o, esik) => puan(o) >= esik;
export function say(uyarir) {
  const k = OLAY.filter((o) => o[1] === 'kotu');
  const yakalanan = k.filter(uyarir), yanlis = OLAY.filter((o) => o[1] === 'mesru' && uyarir(o));
  return { yakalanan, kacan: k.filter((o) => !uyarir(o)), yanlis,
    nokta: yakalanan.reduce((a, o) => a + o[4], 0), mesruNokta: yanlis.reduce((a, o) => a + o[4], 0) };
}
```

#### İmzanın Üç Sayısı

```js
// kosum1.mjs — olay kumesi, belirtiden turetilen davranis puani ve imza tabanli tespitin uc sayisi
import { OLAY, BELIRTI, ENUST, puan, imzaUyarir, say } from './olay.mjs';

console.log(`${OLAY.length} calistirma kalemi, ${OLAY.filter((o) => o[1] === 'kotu').length} kotu; ` +
  `${Object.keys(BELIRTI).length} belirti, en yuksek puan ${ENUST}\n`);
console.log(`${'belirti'.padEnd(30)} ${'agirlik'.padStart(7)} ${'kotu kalemde'.padStart(12)} ${'mesru kalemde'.padStart(13)}`);
for (const [b, a] of Object.entries(BELIRTI)) {
  const g = OLAY.filter((o) => o[3].includes(b));
  console.log(`${b.padEnd(30)} ${String(a).padStart(7)} ${String(g.filter((o) => o[1] === 'kotu').length).padStart(12)} ` +
    `${String(g.filter((o) => o[1] === 'mesru').length).padStart(13)}`);
}
console.log(`\n${'kalem'.padEnd(30)} ${'sinif'.padStart(5)} ${'imza'.padStart(5)} ${'puan'.padStart(4)} ${'nokta'.padStart(5)}`);
for (const o of [...OLAY].sort((a, b) => puan(b) - puan(a)))
  console.log(`${o[0].padEnd(30)} ${o[1].padStart(5)} ${o[2].padStart(5)} ${String(puan(o)).padStart(4)} ${String(o[4]).padStart(5)}`);
const r = say(imzaUyarir);
console.log(`\nimza tabanli tespit: yakalanan ${r.yakalanan.length}/${r.yakalanan.length + r.kacan.length}, ` +
  `kacan ${r.kacan.length}, yanlis pozitif ${r.yanlis.length}`);
console.log(`  kacanlar: ${r.kacan.map((o) => o[0]).join('; ')}`);
console.log(`  yanlis pozitif: ${r.yanlis.map((o) => `${o[0]} (${o[2]} imza)`).join('; ')}`);
```

```
20 calistirma kalemi, 6 kotu; 6 belirti, en yuksek puan 13

belirti                        agirlik kotu kalemde mesru kalemde
tutunma noktasina yazma              3            3             5
baska surece yazma                   3            2             2
imzasiz ikili                        2            3             3
toplu dosya degisikligi              2            1             5
dis adrese surekli baglanti          2            5             7
kullanici disi saatte calisma        1            4             6

kalem                          sinif  imza puan nokta
ag uzerinden gelen bilesen      kotu kesin    8     2
uzaktan komut bekleyen bilesen  kotu   yok    8     2
uc nokta yonetim ajani         mesru   yok    8     2
veriyi sifreleyen bilesen       kotu kesin    7     0
tus ve ekran kaydeden bilesen   kotu   yok    7     3
yama dagitim ajani             mesru   yok    6     1
yedekleme araci                mesru   yok    5     0
envanter tarama araci          mesru   yok    5     1
kurumsal kurulum paketi        mesru genel    5     1
uzak destek istemcisi          mesru   yok    5     0
saha olcum yukleyicisi         mesru   yok    5     0
bellekte kalan yukleyici        kotu   yok    4     0
derleyici cikti dizini         mesru   yok    4     0
zamanlanmis rapor betigi       mesru   yok    4     1
yerlesik araclarla kosan adim   kotu   yok    3     0
gunluk toplayici               mesru   yok    3     0
disk sifreleme yardimcisi      mesru   yok    3     0
arsivleme araci                mesru   yok    2     0
tarayici                       mesru   yok    2     0
belge duzenleyici              mesru   yok    0     0

imza tabanli tespit: yakalanan 2/6, kacan 4, yanlis pozitif 1
  kacanlar: uzaktan komut bekleyen bilesen; tus ve ekran kaydeden bilesen; bellekte kalan yukleyici; yerlesik araclarla kosan adim
  yanlis pozitif: kurumsal kurulum paketi (genel imza)
```

Belirti tablosu ilk sonucu veriyor ve hiç ümit verici değil: altı belirtinin dördü meşru
kalemlerde kötü kalemlerde olduğundan daha **çok**, ikisi de tam olarak aynı sayıda geçiyor;
hiçbiri kötü tarafta öne çıkmıyor. Dış adrese sürekli bağlantı beş kötü,
yedi meşru kalemde var; tutunma noktasına yazma üç kötü, beş meşru kalemde. Bu bir modelleme
kusuru değil, uçların gerçeğidir: bir uçta çalışan meşru yazılım sayısı kötü kalem sayısından çok
büyüktür, dolayısıyla hiçbir belirti mutlak sayıyla kötü tarafta öne çıkmıyor.

Sıralı liste bunun sonucunu tek satırda gösteriyor. En yüksek puanlı üç kalemden biri meşrudur ve
sekiz puanla iki kötü kalemle **aynı** yerde durur: uç nokta yönetim ajanı otomatik çalıştırılan
noktalara yazar, başka süreçlere kod enjekte eder ve dışarıya sürekli bağlanır. Davranış tabanlı
hiçbir eşik bu kalemi ikisinden ayıramaz, çünkü ayıracak bir sayı yoktur.

İmza tabanlı tespitin üç sayısı listenin altında. Altı kötü kalemin ikisini yakalıyor, dördünü
kaçırıyor ve bir meşru kalemi işaretliyor. Kaçırdıklarının ortak yanı önceden görülmemiş olmaktır;
işaretlediği meşru kalem ise geniş bir imzaya değiyor. Sıfır yanlış pozitif, imza tabanlı tespitin
sık dile getirilen üstünlüğüdür ve modelde bile doğru değildir: geniş yazılan tek bir kural bu
üstünlüğü bitirir.

#### Eşiği Oynatmak

```js
// kosum2.mjs — davranis esigi taramasi; iki yanlisin ters yonu ve birlesik tespitin bedeli
import { OLAY, puan, imzaUyarir, davranisUyarir, say } from './olay.mjs';

const KOTU = OLAY.filter((o) => o[1] === 'kotu').length;
console.log(`${'esik'.padStart(4)} ${'yakalanan'.padStart(9)} ${'kacan'.padStart(5)} ${'yanlis'.padStart(6)} ` +
  `${'birlesik yak.'.padStart(13)} ${'birlesik yanlis'.padStart(15)} ${'toplam yanlis'.padStart(13)}`);
const sonuc = [];
for (let e = 1; e <= 10; e++) {
  const d = say((o) => davranisUyarir(o, e));
  const b = say((o) => imzaUyarir(o) || davranisUyarir(o, e));
  sonuc.push({ e, d, b });
  console.log(`${String(e).padStart(4)} ${`${d.yakalanan.length}/${KOTU}`.padStart(9)} ${String(d.kacan.length).padStart(5)} ` +
    `${String(d.yanlis.length).padStart(6)} ${`${b.yakalanan.length}/${KOTU}`.padStart(13)} ${String(b.yanlis.length).padStart(15)} ` +
    `${String(b.kacan.length + b.yanlis.length).padStart(13)}`);
}
const enaz = sonuc.reduce((a, s) => (s.b.kacan.length + s.b.yanlis.length < a.b.kacan.length + a.b.yanlis.length ? s : a));
const tam = sonuc.filter((s) => s.b.kacan.length === 0);
console.log(`\ntoplam yanlisi en aza indiren esik: ${enaz.e} (kacan ${enaz.b.kacan.length} + yanlis ${enaz.b.yanlis.length})`);
console.log(`hic kacirmayan esikler: ${tam.map((s) => `${s.e} (yanlis ${s.b.yanlis.length})`).join(', ')}`);
console.log(`sifir yanlis pozitifli esik: ${sonuc.filter((s) => s.b.yanlis.length === 0).map((s) => `${s.e} (kacan ${s.b.kacan.length})`).join(', ') || 'yok'}`);

console.log(`\n${'esik'.padStart(4)} ${'kapanan nokta'.padStart(13)} ${'kesilen mesru is'.padStart(16)} ` +
  `${'gorunen nokta'.padStart(13)} ${'kesilen is'.padStart(10)} ${'elle bakilacak uyari'.padStart(20)}`);
for (const { e, b } of sonuc.filter((s) => [3, 6, 8, 9].includes(s.e)))
  console.log(`${String(e).padStart(4)} ${String(b.nokta).padStart(13)} ${String(b.yanlis.length).padStart(16)} ` +
    `${String(b.nokta).padStart(13)} ${'0'.padStart(10)} ${String(b.yakalanan.length + b.yanlis.length).padStart(20)}`);
const alti = say((o) => imzaUyarir(o) || davranisUyarir(o, 6));
console.log(`\nesik 6'da kacan kotu kalemler: ${alti.kacan.map((o) => `${o[0]} (puan ${puan(o)})`).join('; ')}`);
console.log(`esik 6'da kesilen mesru is  : ${alti.yanlis.map((o) => `${o[0]} (puan ${puan(o)})`).join('; ')}`);
```

```
esik yakalanan kacan yanlis birlesik yak. birlesik yanlis toplam yanlis
   1       6/6     0     13           6/6              13            13
   2       6/6     0     13           6/6              13            13
   3       6/6     0     11           6/6              11            11
   4       5/6     1      9           5/6               9            10
   5       4/6     2      7           4/6               7             9
   6       4/6     2      2           4/6               3             5
   7       4/6     2      1           4/6               2             4
   8       2/6     4      1           3/6               2             5
   9       0/6     6      0           2/6               1             5
  10       0/6     6      0           2/6               1             5

toplam yanlisi en aza indiren esik: 7 (kacan 2 + yanlis 2)
hic kacirmayan esikler: 1 (yanlis 13), 2 (yanlis 13), 3 (yanlis 11)
sifir yanlis pozitifli esik: yok

esik kapanan nokta kesilen mesru is gorunen nokta kesilen is elle bakilacak uyari
   3             7               11             7          0                   17
   6             7                3             7          0                    7
   8             4                2             4          0                    5
   9             2                1             2          0                    3

esik 6'da kacan kotu kalemler: bellekte kalan yukleyici (puan 4); yerlesik araclarla kosan adim (puan 3)
esik 6'da kesilen mesru is  : uc nokta yonetim ajani (puan 8); yama dagitim ajani (puan 6); kurumsal kurulum paketi (puan 5)
```

Tarama iki sütunun ters yönünü satır satır veriyor. Eşik üçte altı kötü kalemin altısı da
yakalanıyor ve on bir meşru kalem birlikte işaretleniyor. Eşik dokuzda yanlış pozitif sıfıra
iniyor ve davranış tabanlı tespit hiçbir kötü kalemi yakalamıyor. Aradaki her satır bir takastır ve
takasın oranı sabit değil: beşten altıya çıkmak yanlış pozitifi yediden ikiye düşürürken
yakalananı hiç değiştirmiyor — bu, eğrinin en dik yeridir. Yediden sekize çıkmak ise yanlış
pozitifi hiç düşürmeden yakalananı dörtten ikiye indiriyor.

İmzayı davranışla birleştirmek üçüncü ve dördüncü sütun arasındaki farkta okunuyor. Yüksek eşikte
kazanç var: eşik dokuzda davranış hiçbir şey yakalamazken birleşik tespit iki kalem yakalıyor.
Düşük eşikte imzanın hiçbir katkısı yok, yalnız yanlış pozitifi bir artırıyor. İki tespit türü
birbirini bu yüzden tamamlar: biri bilinenin üzerinde, öteki bilinmeyenin üzerinde çalışır ve
bilinen küme küçüldükçe eşiğin taşıdığı yük büyür.

Alt tabloda kursun iki sütunu ayrılıyor. Eşik altıda dört kötü kalem yakalanıyor ve engelleme
kipinde yedi tutunma noktası kapanıyor; karşılığında üç meşru iş kesiliyor ve kesilenlerin arasında
yama dağıtım ajanı ile uç nokta yönetim ajanı var — yani uçları koruyan iki düzeneğin kendisi.
Uyarı kipinde aynı yedi nokta yalnız **görünür** oluyor, hiçbir meşru iş kesilmiyor ve karşılığında
yedi kalem elle bakılmayı bekliyor. Kapanan nokta ile görünen nokta sayıca aynıdır; farkı yaratan,
birinde noktanın ortadan kalkması, ötekinde yalnız bir kayda yazılmasıdır.

Eşiği üçe indirmek bu tabloda ölçülebilir bir tuzak gösteriyor. Yakalanan kötü kalem dörtten altıya
çıkıyor ama kapanan tutunma noktası yedide kalıyor, çünkü eklenen iki kalemin kalıcılık noktası
yok. Kesilen meşru iş üçten on bire çıkıyor. Yakalanan kalem sayısıyla karar veren bir ayar bunu
bir iyileşme sayar; tutunma noktasıyla karar veren bir ayar hiçbir kazanç görmez.

Kaçan iki kalemin puanları listenin altına bakıldığında ayrı bir soru açıyor. Bellekte kalan
yükleyici dört puanla üç meşru kalemin altında, yerleşik araçlarla koşan adım ise üç puanla iki
meşru kalemle aynı yerde duruyor. İkisini yakalayacak eşik, kendilerinden yüksek puanlı bütün
meşru kalemleri de yakalar; bu, eşik ayarıyla çözülebilecek bir sorun değildir. Puanı düşük olan
kalem az iş yapmıyor — az **belirti bırakan** iş yapıyor, çünkü kullandığı araçların hepsi zaten
uçta duruyor ve imzalıdır. Bu ayrım bir sonraki derste değil, beşinci derste sayıyla ölçülecek.

#### Özet

- 6 belirtinin 4'ü meşru kalemlerde kötü kalemlerde olduğundan daha çok, 2'si tam olarak aynı
  sayıda geçiyor. Bir uçta meşru yazılım sayısı çok daha büyük olduğu için hiçbir belirti mutlak
  sayıyla kötü tarafta öne çıkmaz.
- En yüksek puanlı 3 kalemden biri meşrudur ve 2 kötü kalemle aynı puandadır (8): uç nokta yönetim
  ajanı. Hiçbir davranış eşiği bu üçünü birbirinden ayıramaz.
- İmza tabanlı tespit 6 kötü kalemin 2'sini yakalıyor, 4'ünü kaçırıyor ve geniş yazılmış tek bir
  kural yüzünden 1 meşru kalemi işaretliyor. "İmza yanlış pozitif üretmez" modelde bile yanlıştır.
- Eşik 3'te 6/6 yakalanıyor ve 11 meşru kalem kesiliyor; eşik 9'da yanlış pozitif sıfır ve davranış
  hiçbir şey yakalamıyor. Toplam yanlışı en aza indiren eşik 7'dir (2 kaçan + 2 yanlış); iki hatayı
  birden sıfırlayan eşik yoktur.
- Eşik 6'da 7 tutunma noktası kapanıyor, 3 meşru iş kesiliyor ve kesilenler arasında yama dağıtım
  ajanı ile uç nokta yönetim ajanı var. Uyarı kipinde aynı 7 nokta yalnız görünür oluyor, kesilen
  iş 0, elle bakılacak uyarı 7.
- Eşiği 6'dan 3'e indirmek yakalananı 4'ten 6'ya çıkarıyor ama kapanan noktayı 7'de bırakıyor: iki
  yeni kalemin kalıcılık noktası yok. Kesilen meşru iş 3'ten 11'e çıkıyor.

#### Sonraki Adım

Uyarı kipi bu dersin en ucuz seçeneğiydi: hiçbir meşru iş kesilmiyordu. Bedeli o zaman yedi
kalemlik bir kuyruk gibi göründü, ama asıl bedeli başka yerdedir. Bir kalemin yalnız görünür olması
için birinin onu **kaydetmiş** olması gerekir ve uçta her şey kaydedilmez. Eşik altıda kaçan iki
kalemin ortak yanı da buydu: ikisi de diske hiçbir şey yazmadı. Sonraki dersin sorusu budur: uç
nokta telemetrisi tutunma noktalarının kaçını görüyor, kaçı hiçbir kaynakta hiç görünmüyor ve
toplanan verinin hacmi saklama penceresini ne kadar kısaltıyor.

### Uç Nokta Tespit ve Yanıt

Source: https://academia.sh/tr/kurslar/uc-nokta-guvenligi/uc-nokta-tespit-ve-yanit

Yedi telemetri kaynağı sekiz tutunma noktası türü üzerinde ölçülür: hangi nokta hangi kaynakta görünüyor, hiçbir kaynakta görünmeyen iki nokta türü, hiçbir nokta görmeyen iki kaynak, nokta kazancı başına hacim sırasıyla kaynak eklendikçe görünen noktanın altıda durması, günlük hacmin saklama penceresini 6657 günden 19,5 güne indirmesi ve pencereye sığmayan tespitler.

Önceki dersin uyarı kipi hiçbir meşru işi kesmiyordu ve bu yüzden ucuz göründü. Bir kalemin
görünür olması için ondan geriye bir kayıt kalmış olması gerekir ve o kayıt kendiliğinden var
olmaz: uçta toplanmalı, bir yere taşınmalı ve bakılana kadar saklanmalıdır. Bu dersin konusu o
kayıtları üreten katmandır.

Ölçülen üç sayı var. Birincisi kapsamdır: sekiz tutunma noktası türünün kaçı en az bir telemetri
kaynağında görünüyor, kaçı hiçbirinde. İkincisi hacimdir: her kaynak günde kaç bayt üretiyor.
Üçüncüsü penceredir: sabit bir saklama bütçesi altında toplanan veri kaç gün geriye bakmaya yeter.
Üçü bağımsız değildir — kapsamı büyütmenin tek yolu kaynak eklemektir ve her kaynak pencereyi
kısaltır. Bu katmanın kursun iki sütunundan hangisine yazıldığı da bu derste netleşir: kapattığı
nokta sayısı sıfırdır.

- **UK13.** Yedi kaynak, olay oranları, olay boyutları ve saklama bütçesi kurgusal bölgesel ölçüm
  ağına aittir; 432 uç dört sınıftan oluşur. Ölçülen şey `node` ile kurulan modeldir.
- **UK14.** Olay oranları uç başına sabit ortalamadır. Gerçekte sunucular saha dizüstülerinden çok
  daha fazla olay üretir ve oran gün içinde dalgalanır; ortalama pencere hesabının yönünü
  değiştirmez.
- **UK15.** Bir nokta türü ya bir kaynakta görünür ya görünmez. Kısmi görünürlük — noktanın
  yazılmasının değil yalnız çalışmasının görülmesi — modellenmedi; bu, kapsamı olduğundan iyi
  gösterir.
- **UK16.** Sıkıştırma, örnekleme ve soğuk katmana taşıma modellenmedi. Üçü de pencereyi uzatır ve
  üçünün de kendi bedeli vardır; eğrinin biçimi değişmez.
- **UK17.** Tespit gecikmeleri kurgu bir listedir: geçmiş olayların fark edilmesine kadar geçen
  gün sayısı. Gerçek dağılım uzun kuyrukludur.
- **UK18.** Uçta çalışan telemetri ajanının kendisi bir yazılımdır ve envantere kalem ekler; bu
  kalem sayılıyor, ajanın kendi güvenliği ölçülmüyor.

#### Kaynaklar ve Gördükleri

Model iki tablodan oluşuyor. Birincisi her telemetri kaynağının uç başına günlük olay sayısını ve
olay başına bayt boyunu tutuyor; ikincisi hangi tutunma noktası türünün hangi kaynakta iz
bıraktığını. İkinci tablo teknik bir gerçeği kodluyor: bir nokta türü ancak onu **yazan** ya da
**çalıştıran** eylem kaydedildiğinde görünür olur.

```js
// telemetri.mjs — uc nokta telemetri kaynaklari, gorunurluk matrisi ve saklama butcesi; model
export const UC = 432;                       // kurgusal filo: saha dizustu, sube ucu, toplayici, sunucu
export const BUTCE = 120 * 1024 ** 3;        // saklama butcesi, bayt (kurgu)
// kaynak -> [uc basina gunluk olay, olay basina bayt]
export const KAYNAK = {
  'yapilandirma degisikligi kaydi': [140, 320],
  'betik blok kaydi': [260, 4096],
  'modul yukleme kaydi': [9800, 384],
  'dosya degisikligi kaydi': [31000, 256],
  'surec olusturma kaydi': [2400, 512],
  'ag baglanti kaydi': [5600, 224],
  'oturum acma kaydi': [18, 448],
};
// tutunma noktasi turu -> onu goren kaynaklar
export const GORUNURLUK = {
  'acilis-girisi': ['yapilandirma degisikligi kaydi', 'surec olusturma kaydi'],
  'servis-tanimi': ['yapilandirma degisikligi kaydi', 'surec olusturma kaydi'],
  'zamanlanmis-gorev': ['yapilandirma degisikligi kaydi', 'surec olusturma kaydi'],
  'oturum-betigi': ['betik blok kaydi', 'surec olusturma kaydi', 'dosya degisikligi kaydi'],
  'yukleme-yolu-kancasi': ['modul yukleme kaydi', 'dosya degisikligi kaydi'],
  'mesru-ikiliye-ilisme': ['dosya degisikligi kaydi'],
  'olay-aboneligi': [],
  'ortam-otomatik-calistirma': [],
};
export const NOKTA = Object.keys(GORUNURLUK);
export const gunluk = (k) => KAYNAK[k][0] * KAYNAK[k][1] * UC;
export const gorunen = (kume) => NOKTA.filter((n) => GORUNURLUK[n].some((k) => kume.includes(k)));
export const pencere = (kume) => BUTCE / kume.reduce((a, k) => a + gunluk(k), 0);
export const gib = (b) => (b / 1024 ** 3).toFixed(2);
// kurgu: gecmis olaylarin tespit edilene kadar gectigi gun
export const GECIKME = [3, 7, 12, 18, 21, 26, 34, 45, 60, 90];
```

```js
// kosum1.mjs — kaynak hacimleri ve gorunurluk matrisi: hangi nokta hangi kaynakta gorunuyor
import { KAYNAK, GORUNURLUK, NOKTA, UC, BUTCE, gunluk, gib } from './telemetri.mjs';

const kaynaklar = Object.keys(KAYNAK);
console.log(`${UC} uc, ${kaynaklar.length} telemetri kaynagi, ${NOKTA.length} tutunma noktasi turu; ` +
  `saklama butcesi ${gib(BUTCE)} GiB\n`);
console.log(`${'kaynak'.padEnd(31)} ${'olay/uc/gun'.padStart(11)} ${'bayt/olay'.padStart(9)} ` +
  `${'GiB/gun'.padStart(8)} ${'gordugu nokta'.padStart(13)}`);
for (const k of kaynaklar)
  console.log(`${k.padEnd(31)} ${String(KAYNAK[k][0]).padStart(11)} ${String(KAYNAK[k][1]).padStart(9)} ` +
    `${gib(gunluk(k)).padStart(8)} ${String(NOKTA.filter((n) => GORUNURLUK[n].includes(k)).length).padStart(13)}`);
const toplam = kaynaklar.reduce((a, k) => a + gunluk(k), 0);
console.log(`${'toplam'.padEnd(31)} ${''.padStart(11)} ${''.padStart(9)} ${gib(toplam).padStart(8)}`);

console.log(`\n${'tutunma noktasi turu'.padEnd(26)} ${'kaynak'.padStart(6)}  goren kaynaklar`);
for (const n of NOKTA)
  console.log(`${n.padEnd(26)} ${String(GORUNURLUK[n].length).padStart(6)}  ${GORUNURLUK[n].join(', ') || '-'}`);
const kor = NOKTA.filter((n) => GORUNURLUK[n].length === 0);
console.log(`\nhicbir kaynakta gorunmeyen nokta turu: ${kor.length}/${NOKTA.length} (${kor.join(', ')})`);
console.log(`hicbir nokta turu gormeyen kaynak: ` +
  kaynaklar.filter((k) => !NOKTA.some((n) => GORUNURLUK[n].includes(k))).join(', '));
```

```
432 uc, 7 telemetri kaynagi, 8 tutunma noktasi turu; saklama butcesi 120.00 GiB

kaynak                          olay/uc/gun bayt/olay  GiB/gun gordugu nokta
yapilandirma degisikligi kaydi          140       320     0.02             3
betik blok kaydi                        260      4096     0.43             1
modul yukleme kaydi                    9800       384     1.51             1
dosya degisikligi kaydi               31000       256     3.19             3
surec olusturma kaydi                  2400       512     0.49             4
ag baglanti kaydi                      5600       224     0.50             0
oturum acma kaydi                        18       448     0.00             0
toplam                                                    6.16

tutunma noktasi turu       kaynak  goren kaynaklar
acilis-girisi                   2  yapilandirma degisikligi kaydi, surec olusturma kaydi
servis-tanimi                   2  yapilandirma degisikligi kaydi, surec olusturma kaydi
zamanlanmis-gorev               2  yapilandirma degisikligi kaydi, surec olusturma kaydi
oturum-betigi                   3  betik blok kaydi, surec olusturma kaydi, dosya degisikligi kaydi
yukleme-yolu-kancasi            2  modul yukleme kaydi, dosya degisikligi kaydi
mesru-ikiliye-ilisme            1  dosya degisikligi kaydi
olay-aboneligi                  0  -
ortam-otomatik-calistirma       0  -

hicbir kaynakta gorunmeyen nokta turu: 2/8 (olay-aboneligi, ortam-otomatik-calistirma)
hicbir nokta turu gormeyen kaynak: ag baglanti kaydi, oturum acma kaydi
```

İki sayı hemen okunuyor ve ikisi de tersini bekleyenleri şaşırtır. Sekiz nokta türünün ikisi
**hiçbir** kaynakta görünmüyor. Kalıcı olay aboneliği ve çıkarılabilir ortamın otomatik çalıştırma
girişi telemetrinin dışında kalıyor; birincisi yönetim düzeneğinin kendi kayıt alanına yazıldığı,
ikincisi uçta değil takılan ortamda durduğu için. Bu iki nokta türü, önceki derste en ucuz
kapatılabilen noktalardı — kapatılmadıklarında yerlerine geçecek bir görünürlük de yoktur.

İkinci sayı ters yönde: iki kaynak hiçbir tutunma noktası görmüyor. Ağ bağlantı kaydı günde yarım
GiB üretiyor ve tek bir noktayı görünür kılmıyor. Bu, o kaynağın gereksiz olduğu anlamına gelmez;
bir kalem yakalandıktan sonra nereye bağlandığını, hangi uçlarla konuştuğunu yalnız o kaynak
söyler. Ama tutunma noktası ölçüsünde karşılığı sıfırdır ve bütçeden payını alır.

Hacim sütunu üçüncü şaşırtıcı sayıyı veriyor. En çok nokta gören süreç oluşturma kaydı dört,
yapılandırma değişikliği kaydı üç nokta görüyor; ikincisi en ucuz iki kaynaktan biridir ve ikisi
birlikte günde yarım GiB'nin biraz üstünde durur. En pahalı kaynak olan dosya değişikliği kaydı da
üç nokta türü görüyor ama günde 3,19 GiB üretiyor; gördüğü üçün ikisini zaten başka kaynaklar
görüyor. Kapsam ile hacim arasında
düzgün bir orantı yok.

#### Kapsam Büyürken Pencere Kısalır

```js
// kosum2.mjs — kaynaklari nokta kazanci / hacim oranina gore ekler; pencere ve kacan tespit
import { KAYNAK, NOKTA, GECIKME, gunluk, gorunen, pencere, gib } from './telemetri.mjs';

const kalan = Object.keys(KAYNAK), secili = [];
console.log(`${'eklenen kaynak'.padEnd(31)} ${'yeni nokta'.padStart(10)} ${'gorunen'.padStart(7)} ` +
  `${'GiB/gun'.padStart(7)} ${'pencere gun'.padStart(11)} ${'penceredeki tespit'.padStart(18)}`);
while (kalan.length) {
  let en = null;
  for (const k of kalan) {
    const yeni = gorunen([...secili, k]).length - gorunen(secili).length;
    const oran = yeni / gunluk(k);
    if (!en || oran > en.oran || (oran === en.oran && gunluk(k) < gunluk(en.k))) en = { k, yeni, oran };
  }
  secili.push(en.k);
  kalan.splice(kalan.indexOf(en.k), 1);
  const p = pencere(secili), hacim = secili.reduce((a, k) => a + gunluk(k), 0);
  console.log(`${en.k.padEnd(31)} ${String(en.yeni).padStart(10)} ${`${gorunen(secili).length}/${NOKTA.length}`.padStart(7)} ` +
    `${gib(hacim).padStart(7)} ${p.toFixed(1).padStart(11)} ${`${GECIKME.filter((g) => g <= p).length}/${GECIKME.length}`.padStart(18)}`);
}
const dort = Object.keys(KAYNAK).slice(0, 4);
console.log(`\ndort kaynakli kurulum : gorunen ${gorunen(dort).length}/${NOKTA.length}, ` +
  `pencere ${pencere(dort).toFixed(1)} gun, penceredeki tespit ${GECIKME.filter((g) => g <= pencere(dort)).length}/${GECIKME.length}`);
const hepsi = Object.keys(KAYNAK);
console.log(`yedi kaynakli kurulum : gorunen ${gorunen(hepsi).length}/${NOKTA.length}, ` +
  `pencere ${pencere(hepsi).toFixed(1)} gun, penceredeki tespit ${GECIKME.filter((g) => g <= pencere(hepsi)).length}/${GECIKME.length}`);
console.log(`\nyedi kaynakla 21 gunluk pencere icin gereken butce: ` +
  `${gib(21 * hepsi.reduce((a, k) => a + gunluk(k), 0))} GiB (mevcut butcenin ` +
  `${(21 * hepsi.reduce((a, k) => a + gunluk(k), 0) / (120 * 1024 ** 3)).toFixed(2)} kati)`);
console.log(`kapanan tutunma noktasi: 0 — bu katman nokta kapatmaz, gorunur kilar`);
console.log(`telemetri ajaninin uca ekledigi nokta: 2 (servis-tanimi, yukleme-yolu-kancasi)`);
```

```
eklenen kaynak                  yeni nokta gorunen GiB/gun pencere gun penceredeki tespit
yapilandirma degisikligi kaydi           3     3/8    0.02      6657.6              10/10
betik blok kaydi                         1     4/8    0.45       268.8              10/10
modul yukleme kaydi                      1     5/8    1.96        61.2               9/10
dosya degisikligi kaydi                  1     6/8    5.15        23.3               5/10
oturum acma kaydi                        0     6/8    5.16        23.3               5/10
surec olusturma kaydi                    0     6/8    5.65        21.2               5/10
ag baglanti kaydi                        0     6/8    6.16        19.5               4/10

dort kaynakli kurulum : gorunen 6/8, pencere 23.3 gun, penceredeki tespit 5/10
yedi kaynakli kurulum : gorunen 6/8, pencere 19.5 gun, penceredeki tespit 4/10

yedi kaynakla 21 gunluk pencere icin gereken butce: 129.27 GiB (mevcut butcenin 1.08 kati)
kapanan tutunma noktasi: 0 — bu katman nokta kapatmaz, gorunur kilar
telemetri ajaninin uca ekledigi nokta: 2 (servis-tanimi, yukleme-yolu-kancasi)
```

Ekleme sırası nokta kazancının bayt başına oranıyla belirlendi ve eğri dört adımda tükeniyor.
Yapılandırma değişikliği kaydı tek başına üç nokta türü görünür kılıyor ve günde 0,02 GiB
tutuyor — pencere altı bin altı yüz elli yedi gün, yani bütçe pratikte sınırsız. Dördüncü adımdan
sonra hiçbir kaynak yeni nokta getirmiyor: kapsam altıda kalıyor ve kalan üç kaynak yalnız hacim
ekliyor. Pencere yirmi üç günden on dokuz buçuğa iniyor.

Bu son üç satır bir israf listesi değildir ve öyle okunursa ölçüm yanlış kullanılmış olur. Süreç
oluşturma kaydı en çok nokta türü gören kaynaktır; sırada geç kalmasının nedeni gördüğü dört
noktanın hepsinin daha ucuz kaynaklarca zaten görülmesidir. Ama bir kalem fark edildikten sonra
**neyin neyi başlattığını** yalnız o kaynak söyler; beşinci derste ölçülecek olan bağlam tam olarak
budur. Ağ bağlantı kaydı ile oturum açma kaydı da aynı sınıftadır. Tutunma noktası ölçüsü bu üç
kaynağın değerini göstermez; gösterdiği şey, bu üç kaynağın **kapsam** gerekçesiyle savunulamayacağıdır.

Alt satırlar dersin asıl gerilimini veriyor. Yedi kaynağın hepsi toplandığında pencere on dokuz
buçuk gün; kurgu tespit gecikmelerinin onda dördü bu pencereye sığıyor. Yirmi bir günde fark edilen
bir olay için uçtan gelen kayıt artık silinmiştir — tespit çalıştı, kanıt yok. Dört kaynakla aynı
kapsam yirmi üç günlük pencereyle elde ediliyor ve onda beş tespit içeride kalıyor. Aynı bütçeyle
daha az toplamak, bu modelde daha fazla görmek demektir.

Son üç satır bu katmanın kursun iki sütunundaki yerini yazıyor. Kapattığı tutunma noktası sayısı
sıfırdır; sekiz nokta türünün altısını **görünür** kılar, ikisini hiç görmez. Bunun üstüne uçta
kendi ajanı için bir servis tanımı ve bir yükleme yolu kancası ister: envantere iki nokta ekler.
Görünürlük katmanının bedeli yalnız depolama değil, ölçtüğü şeyin kendisinden iki kalemdir.

#### Görünürlüğün Derinliği

Kapsam sütunu bir noktanın görünüp görünmediğini söyler, kaç kaynaktan göründüğünü söylemez. Fark
önemlidir: tek bir kaynağa bağlı bir nokta, o kaynak sustuğunda görünmez olur ve bir kaynağı
susturmak uçta tek bir yapılandırma kalemidir.

```js
// kosum3.mjs — gorunurluk derinligi: bir nokta turu kac kaynakta gorunuyor, tek kaynaga bagli kac nokta
import { KAYNAK, GORUNURLUK, NOKTA, gorunen, pencere } from './telemetri.mjs';

const DORT = Object.keys(KAYNAK).slice(0, 4), HEPSI = Object.keys(KAYNAK);
const derinlik = (kume, n) => GORUNURLUK[n].filter((k) => kume.includes(k)).length;
console.log(`${'tutunma noktasi turu'.padEnd(26)} ${'dort kaynakta'.padStart(13)} ${'yedi kaynakta'.padStart(13)}`);
for (const n of NOKTA)
  console.log(`${n.padEnd(26)} ${String(derinlik(DORT, n)).padStart(13)} ${String(derinlik(HEPSI, n)).padStart(13)}`);
for (const [ad, kume] of [['dort kaynak', DORT], ['yedi kaynak', HEPSI]]) {
  const g = gorunen(kume);
  console.log(`\n${ad}: gorunen ${g.length}/${NOKTA.length}, pencere ${pencere(kume).toFixed(1)} gun`);
  console.log(`  tek kaynaga bagli nokta : ${g.filter((n) => derinlik(kume, n) === 1).length}`);
  console.log(`  iki ve uzeri kaynakli   : ${g.filter((n) => derinlik(kume, n) >= 2).length}`);
  const bir = g.filter((n) => derinlik(kume, n) === 1)
    .map((n) => GORUNURLUK[n].find((k) => kume.includes(k)));
  const enkritik = [...new Set(bir)].map((k) => [k, bir.filter((x) => x === k).length])
    .sort((a, b) => b[1] - a[1])[0];
  console.log(`  susturuldugunda en cok nokta karartan kaynak: ${enkritik[0]} (${enkritik[1]} nokta)`);
}
```

```
tutunma noktasi turu       dort kaynakta yedi kaynakta
acilis-girisi                          1             2
servis-tanimi                          1             2
zamanlanmis-gorev                      1             2
oturum-betigi                          2             3
yukleme-yolu-kancasi                   2             2
mesru-ikiliye-ilisme                   1             1
olay-aboneligi                         0             0
ortam-otomatik-calistirma              0             0

dort kaynak: gorunen 6/8, pencere 23.3 gun
  tek kaynaga bagli nokta : 4
  iki ve uzeri kaynakli   : 2
  susturuldugunda en cok nokta karartan kaynak: yapilandirma degisikligi kaydi (3 nokta)

yedi kaynak: gorunen 6/8, pencere 19.5 gun
  tek kaynaga bagli nokta : 1
  iki ve uzeri kaynakli   : 5
  susturuldugunda en cok nokta karartan kaynak: dosya degisikligi kaydi (1 nokta)
```

İki kurulum aynı kapsamı veriyor ve derinlikleri farklı. Dört kaynaklı kurulumda görünen altı
noktanın dördü tek bir kaynağa bağlı ve üçü aynı kaynağa: yapılandırma değişikliği kaydı
susturulduğunda açılış girişi, servis tanımı ve zamanlanmış görev aynı anda karanlıkta kalır. Yedi
kaynaklı kurulumda tek kaynağa bağlı nokta bire iniyor. Fazladan toplanan üç kaynak kapsam
sütununda hiçbir şey getirmiyordu; derinlik sütununda üç noktayı ikiye, birini üçe çıkarıyor.

Bu, önceki tablonun okunuşunu değiştirir. "Yeni nokta getirmeyen kaynak" ile "hiçbir işe yaramayan
kaynak" aynı şey değildir. Üç ölçü birbiriyle çelişiyor: kapsam dördüncü kaynakta doyuyor, derinlik
yedincide en yüksek, pencere ise her eklemede kısalıyor. Üçünü aynı anda en iyi yapan bir kurulum
modelde yok. Karar, hangi ölçünün ne kadar kaybedileceğinin yazılmasıyla verilir — ve o yazımın
kendisi bu tablodur.

#### Özet

- 8 tutunma noktası türünün 2'si hiçbir telemetri kaynağında görünmüyor (kalıcı olay aboneliği,
  çıkarılabilir ortam girişi). Bu ikisi önceki derste en ucuz kapatılabilen noktalardı.
- 2 kaynak hiçbir nokta türü görmüyor (ağ bağlantı kaydı, oturum açma kaydı) ve birlikte günde
  0,50 GiB tutuyor. Değerleri yanıt bağlamındadır, kapsamda değil.
- Nokta kazancı bayt başına sıralandığında kapsam 4 kaynakta 6/8'e ulaşıp duruyor; kalan 3 kaynak
  yeni nokta getirmeden günlük hacmi 5,15 GiB'den 6,16 GiB'ye çıkarıyor.
- 120 GiB bütçede pencere 4 kaynakla 23,3 gün, 7 kaynakla 19,5 gündür. Kurgu tespit
  gecikmelerinden 21 günlük olan ikinci durumda pencerenin dışında kalır: tespit çalışır, kanıt
  bulunmaz. Aynı pencereyi 7 kaynakla tutmak bütçenin 1,08 katını ister.
- Bu katmanın kapattığı nokta sayısı 0'dır; 6 noktayı görünür kılar ve uca kendi ajanı için 2
  nokta ekler. Görünürlük kapatma değildir ve bedeli yalnız depolama değildir.

#### Sonraki Adım

Bu dersin telemetrisi uçta olan biteni kaydetti, ama uçların birbiriyle olan ilişkisini yalnız bir
kaynak gördü ve o kaynak kapsam gerekçesiyle savunulamadı. Uçlar arasındaki bağlantının kendisi
başka bir yerde ölçülmüştü: ağın sınırında duran kutu, bölgeler arasında geçen akışı sayabiliyordu.
O ölçümün göremediği bir küme var — aynı bölgede duran iki ucun arasındaki bağlantı sınırdan hiç
geçmez. Sonraki dersin sorusu budur: aynı ağdaki uçlar arasında kaç bağlantı yolu var, çevre kuralı
bunların kaçını hiç görmüyor ve konak tarafında duran bir filtre bu yolların kaçını kapatırken kaç
meşru işi birlikte kesiyor.

### Konak Tabanlı Güvenlik Duvarı ve Önleme

Source: https://academia.sh/tr/kurslar/uc-nokta-guvenligi/konak-tabanli-guvenlik-duvari

432 uçlu bir modelde 729.252 bağlantı yolu sayılır ve bölge sınırında duran kuralın hiç görmediği 290.772 bölge içi yol ayrılır: on iki kalemlik konak tabanlı izin listesinin kapattığı yol, açık bırakmak zorunda kaldığı eşler arası akış, listeye yazılmadığı için kesilen iki meşru akış, reddedilen yolun kayda düşmesi ve ele geçen bir uçtan tek atlamada ulaşılan uç sayısı.

Önceki ders uçtaki telemetriyi ölçtü ve uçlar arasındaki bağlantıyı gören tek kaynağın kapsam
gerekçesiyle savunulamadığını gösterdi. Bu ders o bağlantının kendisini sayar. Ağın sınırında duran
kutu başka bir kursta ölçülmüştü ve orada bölgeler arasındaki akış sayılmıştı; o ölçümün yapısal
bir kör noktası vardı: aynı bölgedeki iki ucun arasındaki bağlantı sınırdan hiç geçmez, dolayısıyla
sınırdaki hiçbir kural onu ne görür ne değerlendirir.

Ölçülen üç sayı var. Birincisi bölge içinde kaç bağlantı yolu olduğudur — çevre kuralının hiç
görmediği küme budur. İkincisi konak tarafında duran bir filtrenin bunların kaçını kapattığıdır.
Üçüncüsü kapatmanın bedelidir: kaç meşru akış listeye yazılmak zorunda, listeye yazılmayan kaç akış
kesiliyor ve kapatılamayan yol hangileri. Bu derste hiçbir saldırı adımı yazılmadı; sayılan şey
yolun kendisidir.

- **UK19.** 432 uç, dört uç sınıfı, on sekiz dinleyen hizmet tanımı ve on iki meşru akış kurgusal
  bölgesel ölçüm ağına aittir. Ölçülen şey `node` ile kurulan modeldir.
- **UK20.** Yol tanımı sabittir: bir yol, yönlü bir uç çifti ile hedefte dinleyen bir hizmetin
  bileşimidir. Aynı hizmete iki farklı yoldan ulaşmak modelde tek yoldur.
- **UK21.** Bir uç sınıfındaki bütün uçlar aynı hizmetleri dinler. Gerçekte uçlar sapar ve sapma
  yol sayısını büyütür; sabit sınıf sayıyı olduğundan küçük gösterir.
- **UK22.** İzin listesi uç **sınıfı** düzeyinde yazıldı. Uç adresine yazılmış bir liste daha çok
  yol kapatır ve bakım kalemini uç sayısıyla çarpar.
- **UK23.** Konak tarafındaki kural kümesinin uçta değiştirilemediği varsayıldı; kuralı kaldırabilen
  bir yetki varsa bu ölçüm geçersizdir.
- **UK24.** Bölge sınırındaki kural yalnız bölgeler arası yolu değerlendirir. Bu sınırın tanımıdır;
  o kuralın kapattığı yol burada girdi olarak alınıyor.

#### Sınırın Görmediği Küme

```js
// ag.mjs — uc siniflari, dinleyen hizmetler ve mesru ic akislar; model, gercek ag degil
// sinif -> [bolge, uc sayisi, dinleyen hizmetler]
export const SINIF = {
  'saha dizustu': ['saha', 120, ['uzak destek', 'dosya paylasimi', 'yazici kesfi']],
  'sube ucu': ['sube', 240, ['uzak destek', 'dosya paylasimi', 'yazici kesfi', 'yerel onbellek']],
  'toplayici': ['toplayici', 60, ['uzak destek', 'olcum alimi', 'durum sorgusu', 'dosya paylasimi', 'yonetim arayuzu']],
  'merkez sunucu': ['merkez', 12, ['uzak destek', 'olcum alimi', 'durum sorgusu', 'veritabani', 'yonetim arayuzu', 'rapor arayuzu']],
};
export const AD = Object.keys(SINIF);
export const bolge = (s) => SINIF[s][0];
export const sayi = (s) => SINIF[s][1];
export const hizmet = (s) => SINIF[s][2];
// [kaynak sinifi, hedef sinifi, hizmet] — listeye yazilmis mesru akislar
export const IZIN = [
  ['toplayici', 'merkez sunucu', 'olcum alimi'],
  ['merkez sunucu', 'toplayici', 'durum sorgusu'],
  ['saha dizustu', 'merkez sunucu', 'rapor arayuzu'],
  ['sube ucu', 'merkez sunucu', 'rapor arayuzu'],
  ['merkez sunucu', 'saha dizustu', 'uzak destek'],
  ['merkez sunucu', 'sube ucu', 'uzak destek'],
  ['merkez sunucu', 'toplayici', 'uzak destek'],
  ['sube ucu', 'sube ucu', 'yerel onbellek'],
  ['sube ucu', 'sube ucu', 'yazici kesfi'],
  ['saha dizustu', 'saha dizustu', 'dosya paylasimi'],
  ['toplayici', 'toplayici', 'dosya paylasimi'],
  ['merkez sunucu', 'merkez sunucu', 'veritabani'],
];
// listeye yazilmamis, sonradan ortaya cikan mesru akislar
export const UNUTULAN = [
  ['sube ucu', 'saha dizustu', 'dosya paylasimi'],
  ['saha dizustu', 'toplayici', 'durum sorgusu'],
];
export const cift = (a, b) => (a === b ? sayi(a) * (sayi(a) - 1) : sayi(a) * sayi(b));
export function yollar() {
  const l = [];
  for (const a of AD) for (const b of AD) for (const h of hizmet(b)) l.push([a, b, h, cift(a, b)]);
  return l;
}
export const ici = (y) => bolge(y[0]) === bolge(y[1]);
export const izinli = (y, liste) => liste.some((i) => i[0] === y[0] && i[1] === y[1] && i[2] === y[2]);
export const topla = (l) => l.reduce((a, y) => a + y[3], 0);
```

```js
// kosum1.mjs — bolge ici ve bolgeler arasi yol sayimi: cevre kuralinin gordugu ve hic gormedigi
import { SINIF, AD, sayi, hizmet, yollar, ici, topla } from './ag.mjs';

const Y = yollar(), N = AD.reduce((a, s) => a + sayi(s), 0);
console.log(`${N} uc, ${AD.length} uc sinifi, ${AD.reduce((a, s) => a + hizmet(s).length, 0)} dinleyen hizmet tanimi\n`);
console.log(`${'uc sinifi'.padEnd(14)} ${'bolge'.padStart(9)} ${'uc'.padStart(4)} ${'hizmet'.padStart(6)} ` +
  `${'bolge ici yol'.padStart(13)} ${'bolgeler arasi'.padStart(14)}`);
for (const s of AD) {
  const hedef = Y.filter((y) => y[1] === s);
  console.log(`${s.padEnd(14)} ${SINIF[s][0].padStart(9)} ${String(sayi(s)).padStart(4)} ${String(hizmet(s).length).padStart(6)} ` +
    `${String(topla(hedef.filter(ici))).padStart(13)} ${String(topla(hedef.filter((y) => !ici(y)))).padStart(14)}`);
}
const [ic, dis] = [topla(Y.filter(ici)), topla(Y.filter((y) => !ici(y)))];
console.log(`${'toplam'.padEnd(14)} ${''.padStart(9)} ${String(N).padStart(4)} ${''.padStart(6)} ` +
  `${String(ic).padStart(13)} ${String(dis).padStart(14)}`);
console.log(`\ntoplam yol            : ${ic + dis}`);
console.log(`cevre kuralinin gordugu: ${dis} (%${(dis * 100 / (ic + dis)).toFixed(1)})`);
console.log(`cevre kuralinin hic gormedigi: ${ic} (%${(ic * 100 / (ic + dis)).toFixed(1)})`);
```

```
432 uc, 4 uc sinifi, 18 dinleyen hizmet tanimi

uc sinifi          bolge   uc hizmet bolge ici yol bolgeler arasi
saha dizustu        saha  120      3         42840         112320
sube ucu            sube  240      4        229440         184320
toplayici      toplayici   60      5         17700         111600
merkez sunucu     merkez   12      6           792          30240
toplam                    432               290772         438480

toplam yol            : 729252
cevre kuralinin gordugu: 438480 (%60.1)
cevre kuralinin hic gormedigi: 290772 (%39.9)
```

Toplam yedi yüz yirmi dokuz bin iki yüz elli iki yolun iki yüz doksan bin yedi yüz yetmiş ikisi
bölge içinde kalıyor: yüzde otuz dokuz virgül dokuz. Bu küme sınırdaki hiçbir kural tarafından
değerlendirilmiyor — reddedilmiyor, izin verilmiyor, kaydedilmiyor. Sınır kuralı bu yollara "izin
verir" bile denemez; onları hiç görmez.

Dağılım da tek yönlü değil. Bölge içi yolun iki yüz yirmi dokuz bin dört yüz kırkı şube
bölgesinden geliyor; nedeni yol tanımının kendisinde, çünkü yol sayısı uç sayısının karesiyle
büyür. Merkez bölgesi en çok hizmeti dinliyor ve bölge içi yolu yalnızca yedi yüz doksan iki.

#### İzin Listesinin Kapattığı ve Kestiği

```js
// kosum2.mjs — konak tabanli varsayilan reddet: kapanan yol, kalan yol ve kesilen mesru is
import { AD, IZIN, UNUTULAN, sayi, yollar, ici, izinli, topla } from './ag.mjs';

const Y = yollar(), IC = Y.filter(ici), DIS = Y.filter((y) => !ici(y));
const kur = (liste) => ({
  ic: topla(IC.filter((y) => izinli(y, liste))), dis: topla(DIS.filter((y) => izinli(y, liste))),
  kesilen: UNUTULAN.filter((u) => !liste.some((i) => i.join() === u.join())),
});
console.log(`${'yerlesim'.padEnd(30)} ${'bolge ici kalan'.padStart(15)} ${'bolge disi kalan'.padStart(16)} ` +
  `${'toplam kalan'.padStart(12)} ${'kesilen mesru akis'.padStart(18)}`);
for (const [ad, liste] of [['konak filtresi yok', Y.map((y) => [y[0], y[1], y[2]])],
  ['izin listesi (12 kalem)', IZIN], ['+ unutulan iki akis eklendi', [...IZIN, ...UNUTULAN]]]) {
  const r = kur(liste);
  console.log(`${ad.padEnd(30)} ${String(r.ic).padStart(15)} ${String(r.dis).padStart(16)} ` +
    `${String(r.ic + r.dis).padStart(12)} ${String(r.kesilen.length).padStart(18)}`);
}
const r = kur(IZIN), t = topla(IC), d = topla(DIS);
console.log(`\nbolge ici yolun kapanani : ${t - r.ic}/${t} (%${((t - r.ic) * 100 / t).toFixed(1)})`);
console.log(`bolgeler arasi kapanani  : ${d - r.dis}/${d} (%${((d - r.dis) * 100 / d).toFixed(1)})`);
console.log(`cevrenin hic gormedigi kumede kapanan yol: ${t - r.ic}`);
console.log(`kayda dusen reddedilen yol turu: ${IC.filter((y) => !izinli(y, IZIN)).length} ic + ` +
  `${DIS.filter((y) => !izinli(y, IZIN)).length} dis = ${Y.filter((y) => !izinli(y, IZIN)).length}`);
console.log(`\nizin listesinde acik kalan bolge ici akislar:`);
for (const y of IC.filter((y) => izinli(y, IZIN)))
  console.log(`  ${`${y[0]} -> ${y[1]}`.padEnd(32)} ${y[2].padEnd(16)} ${String(y[3]).padStart(6)} yol`);
console.log(`\nlisteye yazilmadigi icin kesilen mesru akislar:`);
for (const u of kur(IZIN).kesilen) {
  const y = Y.find((y) => y[0] === u[0] && y[1] === u[1] && y[2] === u[2]);
  console.log(`  ${`${u[0]} -> ${u[1]}`.padEnd(32)} ${u[2].padEnd(16)} ${String(y[3]).padStart(6)} yol`);
}

console.log(`\n${'ele gecen uc sinifi'.padEnd(16)} ${'filtresiz'.padStart(9)} ${'izin listesiyle'.padStart(15)} ${'kapanan'.padStart(7)}`);
for (const a of AD) {
  const hedefler = AD.filter((b) => IZIN.some((i) => i[0] === a && i[1] === b));
  const ulasan = hedefler.reduce((t, b) => t + (a === b ? sayi(b) - 1 : sayi(b)), 0);
  const N = AD.reduce((t, s) => t + sayi(s), 0) - 1;
  console.log(`${a.padEnd(16)} ${String(N).padStart(9)} ${String(ulasan).padStart(15)} ${String(N - ulasan).padStart(7)}`);
}
```

```
yerlesim                       bolge ici kalan bolge disi kalan toplam kalan kesilen mesru akis
konak filtresi yok                      290772           438480       729252                  0
izin listesi (12 kalem)                 132672            10800       143472                  2
+ unutulan iki akis eklendi             132672            46800       179472                  0

bolge ici yolun kapanani : 158100/290772 (%54.4)
bolgeler arasi kapanani  : 427680/438480 (%97.5)
cevrenin hic gormedigi kumede kapanan yol: 158100
kayda dusen reddedilen yol turu: 13 ic + 47 dis = 60

izin listesinde acik kalan bolge ici akislar:
  saha dizustu -> saha dizustu     dosya paylasimi   14280 yol
  sube ucu -> sube ucu             yazici kesfi      57360 yol
  sube ucu -> sube ucu             yerel onbellek    57360 yol
  toplayici -> toplayici           dosya paylasimi    3540 yol
  merkez sunucu -> merkez sunucu   veritabani          132 yol

listeye yazilmadigi icin kesilen mesru akislar:
  sube ucu -> saha dizustu         dosya paylasimi   28800 yol
  saha dizustu -> toplayici        durum sorgusu      7200 yol

ele gecen uc sinifi filtresiz izin listesiyle kapanan
saha dizustu           431             131     300
sube ucu               431             251     180
toplayici              431              71     360
merkez sunucu          431             431       0
```

On iki kalemlik bir liste bölge içi yolun yüzde elli dört virgül dördünü kapatıyor. Kalan yüz otuz
iki bin altı yüz yetmiş ikinin nereden geldiği alt listede yazıyor ve tek bir satırda toplanıyor:
şube uçlarının birbirine açtığı yazıcı keşfi ile yerel önbellek akışları, ikisi birlikte yüz on
dört bin yedi yüz yirmi yol. Bunlar meşru akışlardır ve listeden çıkarıldıklarında iki yüz kırk uç
birbirini görmeyi bırakır. Eşler arası meşru trafiği olan bir bölgede konak tabanlı filtrelemenin
kapatabileceği yolun bir tavanı vardır ve o tavanı belirleyen şey saldırı değil, işin kendisidir.

Bölgeler arası sütun tersini gösteriyor: yüzde doksan yedi virgül beş kapanıyor. Fark, bölgeler
arasında meşru akış sayısının azlığındandır — yedi kalem. Aynı liste iki kümede bu kadar farklı
davranıyorsa, konak tabanlı filtrelemenin değeri sınırdaki kuralın **yerine geçmesinde** değil,
sınırın hiç bakmadığı kümede bir şey yapmasındadır: yüz elli sekiz bin yüz yol, sınırdaki hiçbir
kural değişmeden kapanıyor.

Üçüncü satır bedelin biçimini veriyor. İzin listesi yazıldığında iki meşru akış listede yoktu ve
kesildi: şube ucundan saha dizüstüne dosya paylaşımı ve saha dizüstünden toplayıcıya durum
sorgusu. İkisi eklendiğinde bölge içi kalan hiç değişmiyor — ikisi de bölgeler arası — ama bölgeler
arası kalan on bin sekiz yüzden kırk altı bin sekiz yüze çıkıyor. İki kalem eklemek bölgeler arası
açık yolu dört katına çıkarıyor. Listeye yazılan her kalem böyle davranır ve bakımın asıl bedeli
budur: on iki kalemlik liste bir kereye mahsus bir iş değil, sürekli büyüyen bir envanterdir.

Reddedilen altmış yol türü ise ikinci sütuna, görünürlüğe yazılır. Konak tarafındaki filtre bu
dersteki tek katmandır ki aynı hamlede hem kapatıyor hem kaydediyor: reddettiği bağlantı denemesi
bir kayıt üretir ve o kayıt önceki dersin telemetri kaynaklarına eklenir. Kapatılan yol ile kayda
düşen yol burada aynı kümedir — kursta bu iki sütunun çakıştığı ender yerlerden biri.

Son tablo dersin en sert sayısını veriyor. Ele geçen bir toplayıcıdan tek atlamada ulaşılan uç
dört yüz otuz birden yetmiş bire, bir saha dizüstünden yüz otuz bire iniyor. Ele geçen bir merkez
sunucusundan ise dört yüz otuz bir uça ulaşılmaya devam ediyor ve kapanan sıfırdır. Neden açık:
uzak destek akışı merkezden üç uç sınıfının hepsine yazılıdır ve o akış kaldırılırsa uzaktan destek
diye bir iş kalmaz. Yönetim yolunun kendisi kapatılamaz; kapatılamayan yol da en azından görünür
kılınmalıdır.

#### Her Kalem Ne Kadar Açıyor

Liste kalemleri eşit değildir. Boş bir listeden başlayıp kalemleri tek tek eklemek, her kalemin
kaç yol açtığını ve karşılığında kaç meşru akışı kurtardığını ayrı ayrı gösterir.

```js
// kosum3.mjs — liste buyudukce acilan yol: her kalem kac yol aciyor, kac mesru akisi kurtariyor
import { IZIN, UNUTULAN, yollar, ici, izinli, topla } from './ag.mjs';

const Y = yollar(), TAM = [...IZIN, ...UNUTULAN];
console.log(`${'liste kalemi'.padEnd(4)} ${'eklenen akis'.padEnd(46)} ${'actigi yol'.padStart(10)} ` +
  `${'kalan yol'.padStart(10)} ${'kesilen akis'.padStart(12)}`);
for (let n = 0; n <= TAM.length; n++) {
  const liste = TAM.slice(0, n);
  const kalan = topla(Y.filter((y) => izinli(y, liste)));
  const yeni = n === 0 ? 0 : kalan - topla(Y.filter((y) => izinli(y, TAM.slice(0, n - 1))));
  const ad = n === 0 ? '(bos liste: her sey reddedilir)' : `${TAM[n - 1][0]} -> ${TAM[n - 1][1]} / ${TAM[n - 1][2]}`;
  console.log(`${String(n).padEnd(4)} ${ad.padEnd(46)} ${String(yeni).padStart(10)} ${String(kalan).padStart(10)} ` +
    `${String(TAM.length - n).padStart(12)}`);
}
const ilkUc = topla(Y.filter((y) => izinli(y, TAM.slice(0, 3))));
console.log(`\nilk 3 kalem toplam yolun %${(ilkUc * 100 / topla(Y)).toFixed(2)}'sini aciyor`);
const ic = TAM.filter((i) => ici([i[0], i[1]]));
console.log(`bolge ici kalem sayisi: ${ic.length}/${TAM.length}; actiklari yol: ` +
  `${topla(Y.filter((y) => izinli(y, ic)))} (kalanin %${(topla(Y.filter((y) => izinli(y, ic))) * 100 / topla(Y.filter((y) => izinli(y, TAM)))).toFixed(1)}'i)`);
```

```
liste kalemi eklenen akis                                   actigi yol  kalan yol kesilen akis
0    (bos liste: her sey reddedilir)                         0          0           14
1    toplayici -> merkez sunucu / olcum alimi              720        720           13
2    merkez sunucu -> toplayici / durum sorgusu            720       1440           12
3    saha dizustu -> merkez sunucu / rapor arayuzu        1440       2880           11
4    sube ucu -> merkez sunucu / rapor arayuzu            2880       5760           10
5    merkez sunucu -> saha dizustu / uzak destek          1440       7200            9
6    merkez sunucu -> sube ucu / uzak destek              2880      10080            8
7    merkez sunucu -> toplayici / uzak destek              720      10800            7
8    sube ucu -> sube ucu / yerel onbellek               57360      68160            6
9    sube ucu -> sube ucu / yazici kesfi                 57360     125520            5
10   saha dizustu -> saha dizustu / dosya paylasimi      14280     139800            4
11   toplayici -> toplayici / dosya paylasimi             3540     143340            3
12   merkez sunucu -> merkez sunucu / veritabani           132     143472            2
13   sube ucu -> saha dizustu / dosya paylasimi          28800     172272            1
14   saha dizustu -> toplayici / durum sorgusu            7200     179472            0

ilk 3 kalem toplam yolun %0.39'sini aciyor
bolge ici kalem sayisi: 5/14; actiklari yol: 132672 (kalanin %73.9'i)
```

Eğri iki bölgeye ayrılıyor. İlk yedi kalem — bölgeler arası akışların hepsi — toplam on bin sekiz
yüz yol açıyor; on dört kalemin yarısı, kalan yolun yüzde altısını üretiyor. Sekizinci ve dokuzuncu
kalemler tek başına yüz on dört bin yedi yüz yirmi yol açıyor. İki kalem, öteki on ikinin
toplamının yaklaşık iki katını açıyor ve ikisi de aynı cümleyle savunulabilir: şube uçlarının
birbirini görmesi gerekiyor.

Kalem sayısıyla ölçülen bir liste bu yüzden yanıltıcıdır. On dört kalemin beşi bölge içidir ve
kalan yolun yüzde yetmiş üç virgül dokuzunu açar. Bir izin listesini gözden geçirmek kalemleri
saymak değil, her kalemin açtığı yolu yanına yazmaktır.

#### Özet

- 432 uçlu modelde 729.252 bağlantı yolu var; 290.772'si (%39,9) bölge içindedir ve sınırdaki kural
  bu kümeyi ne reddeder ne kaydeder — hiç görmez.
- Bölge içi yolun %79'u tek bir bölgeden (şube) geliyor: yol sayısı uç sayısının karesiyle büyür,
  hizmet sayısıyla doğrusal büyür.
- 12 kalemlik konak tabanlı izin listesi bölge içi yolun %54,4'ünü (158.100 yol), bölgeler arası
  yolun %97,5'ini kapatıyor. Farkı yaratan, bölge içinde meşru eşler arası akış olmasıdır: şube
  uçlarının yazıcı keşfi ve yerel önbellek akışları tek başına 114.720 yol açık bırakır.
- Bedel iki kalemdir: listeye yazılmayan 2 meşru akış kesildi; eklendiklerinde bölgeler arası açık
  yol 10.800'den 46.800'e çıktı. Liste bir kerelik iş değil, her eklemede yüzeyi büyüten bir
  envanterdir.
- Reddedilen 60 yol türü aynı hamlede kayda düşüyor: konak tabanlı filtre kapatan ve görünür kılan
  sütunların çakıştığı ender katmandır.
- Ele geçen bir uçtan tek atlamada ulaşılan uç sayısı toplayıcıda 431'den 71'e, saha dizüstünde
  131'e iniyor; merkez sunucusunda 431'de kalıyor ve kapanan sıfırdır — uzak destek akışı
  kaldırılamaz.

#### Sonraki Adım

Bu dersin izin listesi bir varsayıma dayanıyordu: kapatılan yolu kullanmak isteyen şeyin **kendine
ait** bir aracı olduğu. Listeye yazılı meşru akışlar zaten açıktı ve o akışları yürüten araçlar
uçta duruyordu. Uzak destek akışını yürüten aracın kendisi kötü niyetle çalıştırılırsa hiçbir kural
ihlal edilmez; hiçbir yol kapanmaz, hiçbir ret kaydı üretilmez. Sonraki dersin sorusu budur: uçtaki
yerleşik ve imzalı araçlardan kaçı aynı işi yapabiliyor, imza tabanlı bir kural bunları neden
birbirinden ayıramıyor ve üst süreç, komut deseni ve zamanlama gibi davranış bağlamları kaçını
ayırabiliyor.

### Yaşayan Toprakta Saldırı

Source: https://academia.sh/tr/kurslar/uc-nokta-guvenligi/yasayan-toprakta-saldiri

On dört yerleşik ve imzalı aracın yedi yetenek sınıfı üzerindeki çakışması sayılır: aynı yeteneği ortalama 3,4 aracın taşıması, üç imza kuralının yirmi dört koşumdan sıfırını işaretlemesi ve üç bağlam boyutunun — üst süreç, komut deseni, zamanlama — tek tek, birleşik ve kesişimli değerlendirilmesi; altı şüpheli koşumun beşi ayrılıyor, biri dört boyutta bir meşru koşumla birebir aynı.

Önceki dersin izin listesi kapatabildiği yolu kapattı ve kapatamadığı yolları adlandırdı: uzak
destek akışı kaldırılamazdı. O akışı yürüten araç uçta duruyor, imzalı ve envanterin taban
çizgisinde kayıtlı. Bu ders o aracın — ve onun gibi on üç aracın — kötü niyetle çalıştırıldığında
tespit tarafında ne olduğunu sayar.

Ölçülen üç şey var. Birincisi çakışmadır: bir işi kaç ayrı yerleşik araç yapabiliyor. İkincisi imza
tabanlı kuralın bu koşumlarda kaç kalem işaretlediğidir. Üçüncüsü davranış bağlamının — üst süreç,
komut deseni ve zamanlama — kaç şüpheli koşumu ayırabildiği ve karşılığında kaç meşru koşumu
işaretlediğidir. Bu derste hiçbir komut, parametre ya da adım dizisi yazılmadı; koşumlar tür ve
sayı düzeyinde modellendi. Bu tekniklerin bir sistem üzerinde denenmesi, yazılı yetki ve tanımlı
kapsam olmadan hem yasadışı hem meslek dışıdır.

- **UK25.** On dört araç, yedi yetenek sınıfı ve yirmi dört koşum kurgusal bölgesel ölçüm ağının
  bir ucuna aittir. Ölçülen şey `node` ile kurulan modeldir.
- **UK26.** Araçların hepsi yerleşik, imzası geçerli ve taban çizgisinde kayıtlıdır. Bu, dersin
  varsayımı değil tanımıdır: envanterde olmayan bir araç zaten başka bir derste ölçüldü.
- **UK27.** Koşumların gerçek sınıfı modelde bilinir. Gerçekte ancak inceleme sonrası bilinir;
  bilindiği varsayılıyor ki ayrılan ile yanlış pozitif ayrı sayılabilsin.
- **UK28.** Bağlam üç ayrık boyutla modellendi. Gerçekte her boyut sürekli değerlidir ve eşik
  ister; ayrık değer kuralların sayısını küçültür, birleşimlerin yönünü değiştirmez.
- **UK29.** Komut deseni sınıfları içerik değil **biçim** tanımıdır; hiçbir örnek komut yazılmadı.
- **UK30.** Bir koşum ya bir kurala uyar ya uymaz; sıklık, art arda gelme ve aynı uçtaki başka
  koşumlarla ilişki modellenmedi. Üçü de ayırma gücünü artırır ve üçü de daha çok veri ister.

#### Aynı İşi Kaç Araç Yapabiliyor

```js
// arac.mjs — uctaki yerlesik ve imzali arac envanteri, yetenekler ve kosum kaydi; model
// arac turu -> tasidigi yetenek siniflari (hepsi yerlesik ve imzali kabul edilir)
export const ARAC = {
  'betik yorumlayicisi': ['kodu yorumlama', 'surec baslatma', 'agdan veri getirme'],
  'kabuk yorumlayicisi': ['kodu yorumlama', 'surec baslatma'],
  'dosya aktarim araci': ['agdan veri getirme'],
  'paket yoneticisi': ['agdan veri getirme', 'surec baslatma'],
  'kurulum motoru': ['agdan veri getirme', 'surec baslatma'],
  'sertifika yardimcisi': ['agdan veri getirme'],
  'uzak yonetim istemcisi': ['uzak makineye baglanma', 'surec baslatma'],
  'yonetim betigi arayuzu': ['uzak makineye baglanma', 'surec baslatma', 'kodu yorumlama'],
  'arsivleyici': ['arsivleme'],
  'yedekleme yardimcisi': ['arsivleme', 'zamanlama'],
  'zamanlayici arayuzu': ['zamanlama', 'surec baslatma'],
  'sistem bilgi araci': ['envanter okuma'],
  'yapilandirma sorgulama araci': ['envanter okuma'],
  'gunluk sorgulama araci': ['envanter okuma'],
};
export const AD = Object.keys(ARAC);
export const YETENEK = [...new Set(Object.values(ARAC).flat())];
export const tasiyan = (y) => AD.filter((a) => ARAC[a].includes(y));
// imza tabanli kural kumesi: her kural bir kosumun hangi alanina bakar
export const IMZA_KURALI = [
  ['bilinmeyen dosya kimligi', (k) => k.kimlik === 'bilinmeyen'],
  ['imzasiz ikili', (k) => k.imza === 'yok'],
  ['tabanda olmayan kalem', (k) => k.taban === false],
];
// kosum: [arac, ust surec sinifi, komut deseni, zaman dilimi, gercek sinif]
export const KOSUM = [
  ['betik yorumlayicisi', 'zamanlayici', 'olagan', 'bakim penceresi', 'mesru'],
  ['betik yorumlayicisi', 'yonetim ajani', 'olagan', 'mesai', 'mesru'],
  ['kabuk yorumlayicisi', 'zamanlayici', 'olagan', 'mesai disi', 'mesru'],
  ['arsivleyici', 'zamanlayici', 'olagan', 'bakim penceresi', 'mesru'],
  ['dosya aktarim araci', 'yonetim ajani', 'olagan', 'mesai', 'mesru'],
  ['dosya aktarim araci', 'zamanlayici', 'dis kaynaktan parametre', 'bakim penceresi', 'mesru'],
  ['uzak yonetim istemcisi', 'kullanici oturumu', 'olagan', 'mesai', 'mesru'],
  ['uzak yonetim istemcisi', 'uzak oturum', 'olagan', 'mesai', 'mesru'],
  ['zamanlayici arayuzu', 'yonetim ajani', 'olagan', 'mesai', 'mesru'],
  ['sertifika yardimcisi', 'servis', 'olagan', 'mesai', 'mesru'],
  ['sistem bilgi araci', 'yonetim ajani', 'olagan', 'mesai', 'mesru'],
  ['yapilandirma sorgulama araci', 'kullanici oturumu', 'olagan', 'mesai', 'mesru'],
  ['gunluk sorgulama araci', 'yonetim ajani', 'uzun tek satir', 'mesai disi', 'mesru'],
  ['yedekleme yardimcisi', 'zamanlayici', 'olagan', 'mesai disi', 'mesru'],
  ['kurulum motoru', 'kullanici oturumu', 'olagan', 'mesai', 'mesru'],
  ['paket yoneticisi', 'yonetim ajani', 'olagan', 'bakim penceresi', 'mesru'],
  ['yonetim betigi arayuzu', 'servis', 'olagan', 'mesai', 'mesru'],
  ['kabuk yorumlayicisi', 'belge uygulamasi', 'olagan', 'mesai', 'mesru'],
  ['betik yorumlayicisi', 'belge uygulamasi', 'kodlanmis girdi', 'mesai', 'supheli'],
  ['kabuk yorumlayicisi', 'uzak oturum', 'uzun tek satir', 'mesai disi', 'supheli'],
  ['dosya aktarim araci', 'kullanici oturumu', 'dis kaynaktan parametre', 'mesai disi', 'supheli'],
  ['arsivleyici', 'servis', 'olagan', 'mesai disi', 'supheli'],
  ['uzak yonetim istemcisi', 'kullanici oturumu', 'olagan', 'mesai', 'supheli'],
  ['zamanlayici arayuzu', 'uzak oturum', 'olagan', 'mesai', 'supheli'],
];
export const kayit = (k) => ({ arac: k[0], kimlik: 'bilinen', imza: 'gecerli', taban: true });
export const BAGLAM = [
  ['ust surec', (k) => ['belge uygulamasi', 'uzak oturum'].includes(k[1])],
  ['komut deseni', (k) => ['kodlanmis girdi', 'dis kaynaktan parametre'].includes(k[2])],
  ['zamanlama', (k) => k[3] === 'mesai disi' && k[1] !== 'zamanlayici'],
];
```

```js
// kosum1.mjs — ayni yetenegi tasiyan arac sayisi ve imza tabanli kural kumesinin isaretledigi kalem
import { ARAC, AD, YETENEK, KOSUM, IMZA_KURALI, tasiyan, kayit } from './arac.mjs';

console.log(`${AD.length} yerlesik arac, ${YETENEK.length} yetenek sinifi, ${KOSUM.length} kosum kaydi\n`);
console.log(`${'yetenek sinifi'.padEnd(24)} ${'tasiyan arac'.padStart(12)} ${'biri engellenirse kalan'.padStart(23)}`);
for (const y of YETENEK)
  console.log(`${y.padEnd(24)} ${String(tasiyan(y).length).padStart(12)} ${String(tasiyan(y).length - 1).padStart(23)}`);
const cok = YETENEK.filter((y) => tasiyan(y).length > 1);
console.log(`\ntek araca bagli yetenek : ${YETENEK.length - cok.length}/${YETENEK.length}`);
console.log(`birden cok araci olan   : ${cok.length}/${YETENEK.length}, ortalama ` +
  `${(cok.reduce((a, y) => a + tasiyan(y).length, 0) / cok.length).toFixed(1)} arac`);

const supheli = KOSUM.filter((k) => k[4] === 'supheli');
console.log(`\n${'imza tabanli kural'.padEnd(26)} ${'isaretledigi kosum'.padStart(18)} ${'supheli kosumdan'.padStart(16)}`);
for (const [ad, f] of IMZA_KURALI) {
  const isaret = KOSUM.filter((k) => f(kayit(k)));
  console.log(`${ad.padEnd(26)} ${String(isaret.length).padStart(18)} ` +
    `${`${isaret.filter((k) => k[4] === 'supheli').length}/${supheli.length}`.padStart(16)}`);
}
console.log(`\nsupheli kosumlarin kullandigi arac sayisi: ${new Set(supheli.map((k) => k[0])).size}`);
console.log(`bu araclarin kacinin imzasi gecerli ve tabanda kayitli: ` +
  `${[...new Set(supheli.map((k) => k[0]))].filter((a) => AD.includes(a)).length}/${new Set(supheli.map((k) => k[0])).size}`);
```

```
14 yerlesik arac, 7 yetenek sinifi, 24 kosum kaydi

yetenek sinifi           tasiyan arac biri engellenirse kalan
kodu yorumlama                      3                       2
surec baslatma                      7                       6
agdan veri getirme                  5                       4
uzak makineye baglanma              2                       1
arsivleme                           2                       1
zamanlama                           2                       1
envanter okuma                      3                       2

tek araca bagli yetenek : 0/7
birden cok araci olan   : 7/7, ortalama 3.4 arac

imza tabanli kural         isaretledigi kosum supheli kosumdan
bilinmeyen dosya kimligi                    0              0/6
imzasiz ikili                               0              0/6
tabanda olmayan kalem                       0              0/6

supheli kosumlarin kullandigi arac sayisi: 6
bu araclarin kacinin imzasi gecerli ve tabanda kayitli: 6/6
```

Birinci tablo bir savunma hamlesinin neden işe yaramadığını sayıyla veriyor. Yedi yetenek sınıfının
hiçbiri tek bir araca bağlı değil; ortalama 3,4 araç aynı yeteneği taşıyor. Süreç başlatabilen yedi
araç var; ağdan veri getirebilen beş. Bir aracı uygulama izin listesinden çıkarmak o yeteneği
kaldırmaz, yalnız seçenek sayısını bir azaltır — ve kaldırılan araç meşru bir işte kullanılıyorsa o
işi de durdurur. Çakışmanın ölçüsü budur: engellemenin kazancı bir, bedeli bir.

İkinci tablo dersin adını taşıyan sonucu veriyor. Üç imza tabanlı kural yirmi dört koşumun
sıfırını işaretliyor ve şüpheli altı koşumun sıfırını yakalıyor. Bunun nedeni kuralların kötü
yazılmış olması değil, baktıkları alanın bu koşumlarda hep aynı değeri taşımasıdır: dosya kimliği
bilinen, imza geçerli, kalem taban çizgisinde kayıtlı. Şüpheli koşumların kullandığı altı aracın
altısı da bu üç ölçütü geçiyor. İmza tabanlı tespit yanlış cevap vermiyor; **hiç cevap vermiyor**,
çünkü sorduğu soru burada ayırt edici değil.

#### Üç Bağlam Boyutu

Ayırt edici olabilecek soru araca değil koşuma bakar: bu aracı ne başlattı, nasıl çağrıldı, ne
zaman çalıştı. Üç boyut da uçta zaten kaydedilebilir; üçünün ayırma gücü ayrı ayrı ve birlikte
ölçülüyor.

```js
// kosum2.mjs — uc baglam boyutu tek tek, birlesik ve kesisimli; ayrilamayan kosum
import { KOSUM, BAGLAM } from './arac.mjs';

const S = KOSUM.filter((k) => k[4] === 'supheli'), M = KOSUM.filter((k) => k[4] === 'mesru');
const uyan = (k) => BAGLAM.filter(([, f]) => f(k)).map(([a]) => a);
const olc = (kural) => [S.filter(kural).length, M.filter(kural).length];
console.log(`${'baglam kumesi'.padEnd(42)} ${'ayrilan supheli'.padStart(15)} ${'yanlis pozitif'.padStart(14)}`);
for (let m = 1; m < 8; m++) {
  const secili = BAGLAM.filter((_, i) => m & (1 << i));
  const [a, y] = olc((k) => secili.some(([, f]) => f(k)));
  console.log(`${secili.map(([ad]) => ad).join(' veya ').padEnd(42)} ${`${a}/${S.length}`.padStart(15)} ${`${y}/${M.length}`.padStart(14)}`);
}
for (const n of [2, 3]) {
  const [a, y] = olc((k) => uyan(k).length >= n);
  console.log(`${`en az ${n} boyut birden`.padEnd(42)} ${`${a}/${S.length}`.padStart(15)} ${`${y}/${M.length}`.padStart(14)}`);
}

console.log(`\n${'kosum'.padEnd(30)} ${'ust surec'.padStart(17)} ${'desen'.padStart(23)} ${'zaman'.padStart(15)}  uyan boyut`);
for (const k of S)
  console.log(`${k[0].padEnd(30)} ${k[1].padStart(17)} ${k[2].padStart(23)} ${k[3].padStart(15)}  ${uyan(k).join(', ') || '-'}`);

const anahtar = (k) => k.slice(0, 4).join('|');
const ikiz = S.filter((s) => M.some((m) => anahtar(m) === anahtar(s)));
console.log(`\ndort boyutta bir mesru kosumla ayni olan supheli kosum: ${ikiz.length}/${S.length}`);
for (const s of ikiz) console.log(`  ${s[0]} / ${s[1]} / ${s[2]} / ${s[3]}`);
console.log(`hicbir baglam boyutuna uymayan supheli kosum: ${S.filter((k) => uyan(k).length === 0).length}/${S.length}`);
```

```
baglam kumesi                              ayrilan supheli yanlis pozitif
ust surec                                              3/6           2/18
komut deseni                                           2/6           1/18
ust surec veya komut deseni                            4/6           3/18
zamanlama                                              3/6           1/18
ust surec veya zamanlama                               5/6           3/18
komut deseni veya zamanlama                            4/6           2/18
ust surec veya komut deseni veya zamanlama             5/6           4/18
en az 2 boyut birden                                   3/6           0/18
en az 3 boyut birden                                   0/6           0/18

kosum                                  ust surec                   desen           zaman  uyan boyut
betik yorumlayicisi             belge uygulamasi         kodlanmis girdi           mesai  ust surec, komut deseni
kabuk yorumlayicisi                  uzak oturum          uzun tek satir      mesai disi  ust surec, zamanlama
dosya aktarim araci            kullanici oturumu dis kaynaktan parametre      mesai disi  komut deseni, zamanlama
arsivleyici                               servis                  olagan      mesai disi  zamanlama
uzak yonetim istemcisi         kullanici oturumu                  olagan           mesai  -
zamanlayici arayuzu                  uzak oturum                  olagan           mesai  ust surec

dort boyutta bir mesru kosumla ayni olan supheli kosum: 1/6
  uzak yonetim istemcisi / kullanici oturumu / olagan / mesai
hicbir baglam boyutuna uymayan supheli kosum: 1/6
```

Tek boyutlar zayıf: en iyisi altı şüpheli koşumun üçünü ayırıyor. Birleşimler daha iyi ama düzgün
toplanmıyorlar. Üst süreç ile zamanlama birlikte beşini ayırıyor ve üç meşru koşumu işaretliyor.
Üçüncü boyutu eklemek — komut deseni — ayrılan sayısını **hiç değiştirmiyor** ve yanlış pozitifi
üçten dörde çıkarıyor. Komut deseni tek başına iki koşum ayırıyordu; ikisi de öteki iki boyutun
zaten yakaladığı koşumlardı. Katman eklemenin kapattığı yol sıfırsa o katman ölçülmemiş sayılır ve
bu kural burada tespit tarafında da geçerlidir.

Kesişim satırları ters yöndeki kazancı gösteriyor. En az iki boyutun birden uyması istendiğinde
ayrılan sayı üçe düşüyor ama yanlış pozitif sıfırlanıyor: on sekiz meşru koşumun hiçbiri iki
boyutta birden uymuyor. Bu, bakılacak uyarı sayısını üçe indirir ve üçünün üçü de gerçektir.
Aradaki seçim önceki derslerdekiyle aynı biçimdedir — beş ayrılan ve dört yanlış mı, üç ayrılan ve
sıfır yanlış mı.

Alt liste ayrılamayan koşumu adıyla veriyor ve nedeni ölçülebilir: uzak yönetim istemcisinin bir
kullanıcı oturumundan olağan bir desenle mesai içinde çalışması, listedeki bir meşru koşumla dört
boyutta birebir aynıdır. Ayıracak bir alan yok. Bu koşumu ayırmanın modeldeki tek yolu dördüncü bir
boyut eklemektir — bağlandığı uç, taşınan veri hacmi, aynı kullanıcının o gün yaptığı öteki
işler — ve dördüncü boyutun her biri yeni bir telemetri kaynağı, yani üçüncü derste ölçülen
pencereden yeni bir kesinti demektir.

#### Engellemenin İki Sütunu

Ayırmak yerine engellemek de bir seçenektir: şüpheli koşumlarda geçen araçları uygulama izin
listesinden çıkarmak. Bu hamlenin kazancı ile bedeli aynı model üzerinde sayılabilir.

```js
// kosum3.mjs — bir araci engellemenin kazanci ve bedeli: duran kosumlar ve kalan alternatif arac
import { ARAC, KOSUM, tasiyan } from './arac.mjs';

const kullanilan = [...new Set(KOSUM.map((k) => k[0]))];
console.log(`${'engellenen arac'.padEnd(30)} ${'duran mesru'.padStart(11)} ${'duran supheli'.padStart(13)} ` +
  `${'ayni yetenekli diger arac'.padStart(24)}`);
let toplamMesru = 0, toplamSupheli = 0;
for (const a of kullanilan) {
  const k = KOSUM.filter((x) => x[0] === a);
  const [m, s] = [k.filter((x) => x[4] === 'mesru').length, k.filter((x) => x[4] === 'supheli').length];
  const alternatif = new Set(ARAC[a].flatMap((y) => tasiyan(y)).filter((x) => x !== a));
  if (s > 0) { toplamMesru += m; toplamSupheli += s; }
  console.log(`${a.padEnd(30)} ${String(m).padStart(11)} ${String(s).padStart(13)} ${String(alternatif.size).padStart(24)}`);
}
const supheliArac = kullanilan.filter((a) => KOSUM.some((x) => x[0] === a && x[4] === 'supheli'));
const devredilebilir = supheliArac.filter((a) => ARAC[a].some((y) => tasiyan(y).length > 1));
console.log(`\nsupheli kosum kullanan arac: ${supheliArac.length}`);
console.log(`hepsini engellemenin bedeli: ${toplamMesru} mesru kosum durur, ${toplamSupheli} supheli kosum durur`);
console.log(`bu araclardan yetenegi baska bir araca devredilebilenler: ${devredilebilir.length}/${supheliArac.length}`);
```

```
engellenen arac                duran mesru duran supheli ayni yetenekli diger arac
betik yorumlayicisi                      2             1                        8
kabuk yorumlayicisi                      2             1                        6
arsivleyici                              1             1                        1
dosya aktarim araci                      2             1                        4
uzak yonetim istemcisi                   2             1                        6
zamanlayici arayuzu                      1             1                        7
sertifika yardimcisi                     1             0                        4
sistem bilgi araci                       1             0                        2
yapilandirma sorgulama araci             1             0                        2
gunluk sorgulama araci                   1             0                        2
yedekleme yardimcisi                     1             0                        2
kurulum motoru                           1             0                        8
paket yoneticisi                         1             0                        8
yonetim betigi arayuzu                   1             0                        6

supheli kosum kullanan arac: 6
hepsini engellemenin bedeli: 10 mesru kosum durur, 6 supheli kosum durur
bu araclardan yetenegi baska bir araca devredilebilenler: 6/6
```

Altı aracın hepsini engellemek altı şüpheli koşumu durdurur ve on meşru koşumu birlikte durdurur:
oran birden büyük, yani her kazanılan koşum için birden fazla meşru iş kesiliyor. Sağdaki sütun ise
kazancın kalıcı olmadığını gösteriyor. Engellenen her aracın taşıdığı yetenekleri taşıyan başka
araçlar uçta duruyor — betik yorumlayıcısı için sekiz, zamanlayıcı arayüzü için yedi, en dar
durumda arşivleyici için bir. Altı aracın altısı da yeteneğini başka bir araca devredebiliyor.

Bu tablonun okunuşu kursun iki sütununu bir kez daha ayırıyor. Engelleme burada gerçekten kapatıyor
ama kapattığı şey **araç**tır, yetenek değil; yetenek envanterde kaldığı sürece kapanan bir yol
yoktur. Ayırma ise hiçbir şey kapatmaz, yalnız görünür kılar — ve görünür kıldığı beş şüpheli
koşuma karşılık dört meşru koşumu da işaretler.

#### Özet

- 7 yetenek sınıfının hiçbiri tek araca bağlı değil; ortalama 3,4 yerleşik araç aynı yeteneği
  taşıyor. Süreç başlatabilen 7 araç var. Bir aracı engellemek yeteneği kaldırmaz, seçeneği bir
  azaltır ve meşru bir işi durdurur.
- 3 imza tabanlı kural 24 koşumun 0'ını işaretliyor. Şüpheli koşumların kullandığı 6 aracın 6'sı da
  bilinen kimliğe, geçerli imzaya ve taban çizgisi kaydına sahiptir; kural yanlış cevap vermiyor,
  hiç cevap vermiyor.
- Tek bağlam boyutunun en iyisi 6 şüpheli koşumun 3'ünü ayırıyor. Üst süreç ile zamanlama birlikte
  5'ini ayırıyor ve 3 yanlış pozitif üretiyor.
- Üçüncü boyutu eklemek ayrılan sayısını değiştirmeden yanlış pozitifi 3'ten 4'e çıkarıyor: kapattığı
  yol sıfır olan katman burada da ölçülmemiş sayılır.
- En az 2 boyutun birden uyması istendiğinde ayrılan 3'e düşüyor, yanlış pozitif 0 oluyor. 18 meşru
  koşumun hiçbiri iki boyutta birden uymuyor.
- 1 şüpheli koşum dört boyutta bir meşru koşumla birebir aynıdır ve hiçbir bağlam boyutuna uymaz.
  Ayırmak dördüncü bir boyut, yani yeni bir telemetri kaynağı ister.

#### Sonraki Adım

Bu ders bir aracın kötüye kullanılmasını ayırmanın sınırını sayıyla verdi, ama ölçtüğü şey tek tek
koşumlardı. Koşum geçicidir: biter ve arkasında yalnız bir kayıt bırakır. Kalıcı olan, o koşumun
uçta yazdığı kalemdir — ilk derste sayılan tutunma noktaları. Konu bu yüzden başladığı yere döner.
Sonraki dersin sorusu budur: uçtaki kalıcılık noktası türleri bir envanter olarak kaç kalemdir, beş
ayrı denetim bunların kaçını kapatıyor, kaçını yalnız kayda düşürüyor ve hiçbir denetimin ne
kapattığı ne gördüğü kaç nokta kalıyor.

### Kalıcılık Mekanizmaları

Source: https://academia.sh/tr/kurslar/uc-nokta-guvenligi/kalicilik-mekanizmalari

On kalıcılık noktası türü bir envanter olarak sayılır ve altı denetim dört uç sınıfı üzerinde koşturulur: hangi denetim kaç türü kapatıyor, kaçını yalnız görünür kılıyor, hangi denetim hangi uç sınıfında uygulanamıyor; dört sınıfın dördünde birden kapanan tür sayısı sıfır, hiçbir denetimin dokunmadığı tür bir ve kapatmanın bedeli 36 engellenen meşru kalem ile 52 elle onay kalemidir.

Önceki ders koşumları ölçtü ve bir koşumun geçici olduğunu gösterdi: biter, arkasında yalnız bir
kayıt bırakır. Kalıcı olan, o koşumun uçta yazdığı kalemdir. Konu bu yüzden başladığı yere döner —
birinci derste türlerin kullandığı noktalar sayılmıştı, bu ders o noktaları uçtaki bir envanter
olarak sayar ve üzerlerine altı denetim koşturur.

Ölçülen üç sütun kursun üç sütunudur. Kaç nokta türü var; her denetim kaçını **kapatıyor**, kaçını
yalnız **görünür** kılıyor; kapatmanın meşru işe bedeli ne. Buna dördüncü bir ayrım ekleniyor:
bir denetim her uç sınıfında uygulanamaz. Bu derste hiçbir kalıcılık kurma yöntemi yazılmadı;
sayılan şey noktanın kendisi ve üzerindeki denetimdir.

- **UK31.** On nokta türü, meşru kalem sayıları, altı denetim ve uygulanabilirlikleri kurgusal
  bölgesel ölçüm ağına aittir. Ölçülen şey `node` ile kurulan modeldir.
- **UK32.** Bir denetimin bir nokta türü üzerindeki etkisi üç değerden biridir: kapatır, görünür
  kılar, dokunmaz. Kısmi kapatma modellenmedi; bu, kapalı sütununu olduğundan iyi gösterir.
- **UK33.** Uygulanabilirlik uç **sınıfı** düzeyindedir. Gerçekte aynı sınıftaki uçların bir kısmı
  denetimi taşımaz; sapma ölçümü önceki konunun konusuydu ve burada girdi olarak alınıyor.
- **UK34.** Bedel iki kalemle sayıldı: engellenen meşru kalem ve elle onaya düşen iş. Süregelen
  bakım yükü sayılmadı; sayılsaydı görünürlük veren denetimlerin bedeli büyürdü.
- **UK35.** Kapatan bir denetim aynı noktayı kayda da düşürebilir; modelde önce kapatma sayılır.
  İki sütun bu yüzden ayrıktır: bir tür ya kapalıdır ya yalnız görünürdür.

#### Envanter ve Altı Denetim

```js
// envanter.mjs — kalicilik noktasi turleri, uc siniflari ve denetimlerin etkisi; model
// nokta turu -> bir uctaki mesru kalem sayisi
export const NOKTA = {
  'acilis-girisi': 14, 'servis-tanimi': 63, 'zamanlanmis-gorev': 41, 'oturum-betigi': 6,
  'yukleme-yolu-kancasi': 3, 'olay-aboneligi': 2, 'mesru-ikiliye-ilisme': 0,
  'ortam-otomatik-calistirma': 1, 'uygulama-uzantisi': 27, 'onyukleme-girisi': 4,
};
export const TUR = Object.keys(NOKTA);
export const UC = { 'saha dizustu': 120, 'sube ucu': 240, 'toplayici': 60, 'merkez sunucu': 12 };
export const SINIF = Object.keys(UC);
// denetim -> [etki haritasi, uygulanabildigi uc siniflari, engellenen mesru kalem, elle onaya dusen is]
export const DENETIM = {
  'yazma izni daraltma': [
    { 'oturum-betigi': 'kapatir', 'uygulama-uzantisi': 'kapatir', 'acilis-girisi': 'kapatir' },
    ['sube ucu', 'toplayici', 'merkez sunucu'], 8, 4],
  'uygulama izin listesi': [
    { 'acilis-girisi': 'kapatir', 'servis-tanimi': 'kapatir', 'zamanlanmis-gorev': 'kapatir',
      'ortam-otomatik-calistirma': 'kapatir', 'oturum-betigi': 'gorunur' },
    ['sube ucu', 'toplayici'], 22, 31],
  'imzali kod zorunlulugu': [
    { 'mesru-ikiliye-ilisme': 'kapatir', 'yukleme-yolu-kancasi': 'kapatir', 'uygulama-uzantisi': 'gorunur' },
    ['saha dizustu', 'sube ucu', 'toplayici'], 6, 3],
  'guvenli onyukleme zinciri': [
    { 'onyukleme-girisi': 'kapatir' },
    ['saha dizustu', 'sube ucu', 'merkez sunucu'], 0, 2],
  'taban cizgisi karsilastirmasi': [
    { 'acilis-girisi': 'gorunur', 'servis-tanimi': 'gorunur', 'zamanlanmis-gorev': 'gorunur',
      'oturum-betigi': 'gorunur', 'yukleme-yolu-kancasi': 'gorunur', 'uygulama-uzantisi': 'gorunur',
      'ortam-otomatik-calistirma': 'gorunur' },
    ['saha dizustu', 'sube ucu', 'toplayici', 'merkez sunucu'], 0, 12],
  'surec olusturma kaydi': [
    { 'acilis-girisi': 'gorunur', 'servis-tanimi': 'gorunur', 'zamanlanmis-gorev': 'gorunur',
      'oturum-betigi': 'gorunur' },
    ['saha dizustu', 'sube ucu', 'toplayici', 'merkez sunucu'], 0, 0],
};
export const AD = Object.keys(DENETIM);
export const gecerli = (d, s) => DENETIM[d][1].includes(s);
export function durum(tur, sinif) {
  const etkiler = AD.filter((d) => gecerli(d, sinif)).map((d) => DENETIM[d][0][tur]).filter(Boolean);
  return etkiler.includes('kapatir') ? 'kapali' : etkiler.includes('gorunur') ? 'gorunur' : 'karanlik';
}
export const uc = (s) => UC[s];
export const TOPLAM_UC = Object.values(UC).reduce((a, b) => a + b, 0);
```

```js
// kosum1.mjs — nokta turu envanteri ve her denetimin kapattigi / gorunur kildigi tur
import { NOKTA, TUR, DENETIM, AD, SINIF, TOPLAM_UC } from './envanter.mjs';

const kalem = Object.values(NOKTA).reduce((a, b) => a + b, 0);
console.log(`${TUR.length} kalicilik noktasi turu, uc basina ${kalem} mesru kalem, ${TOPLAM_UC} uc\n`);
console.log(`${'nokta turu'.padEnd(26)} ${'mesru kalem'.padStart(11)} ${'kapatan denetim'.padStart(15)} ${'goren denetim'.padStart(13)}`);
for (const t of TUR) {
  const k = AD.filter((d) => DENETIM[d][0][t] === 'kapatir'), g = AD.filter((d) => DENETIM[d][0][t] === 'gorunur');
  console.log(`${t.padEnd(26)} ${String(NOKTA[t]).padStart(11)} ${String(k.length).padStart(15)} ${String(g.length).padStart(13)}`);
}
console.log(`\n${'denetim'.padEnd(30)} ${'kapatir'.padStart(7)} ${'gorunur kilar'.padStart(13)} ${'uc sinifi'.padStart(9)} ` +
  `${'engellenen kalem'.padStart(16)} ${'elle onay'.padStart(9)}`);
for (const d of AD) {
  const e = DENETIM[d][0];
  console.log(`${d.padEnd(30)} ${String(Object.values(e).filter((x) => x === 'kapatir').length).padStart(7)} ` +
    `${String(Object.values(e).filter((x) => x === 'gorunur').length).padStart(13)} ` +
    `${`${DENETIM[d][1].length}/${SINIF.length}`.padStart(9)} ${String(DENETIM[d][2]).padStart(16)} ${String(DENETIM[d][3]).padStart(9)}`);
}
const hic = TUR.filter((t) => !AD.some((d) => DENETIM[d][0][t]));
console.log(`\nhicbir denetimin dokunmadigi nokta turu: ${hic.length}/${TUR.length} (${hic.join(', ') || '-'})`);
console.log(`toplam engellenen mesru kalem: ${AD.reduce((a, d) => a + DENETIM[d][2], 0)}; ` +
  `elle onaya dusen is: ${AD.reduce((a, d) => a + DENETIM[d][3], 0)}`);
```

```
10 kalicilik noktasi turu, uc basina 161 mesru kalem, 432 uc

nokta turu                 mesru kalem kapatan denetim goren denetim
acilis-girisi                       14               2             2
servis-tanimi                       63               1             2
zamanlanmis-gorev                   41               1             2
oturum-betigi                        6               1             3
yukleme-yolu-kancasi                 3               1             1
olay-aboneligi                       2               0             0
mesru-ikiliye-ilisme                 0               1             0
ortam-otomatik-calistirma            1               1             1
uygulama-uzantisi                   27               1             2
onyukleme-girisi                     4               1             0

denetim                        kapatir gorunur kilar uc sinifi engellenen kalem elle onay
yazma izni daraltma                  3             0       3/4                8         4
uygulama izin listesi                4             1       2/4               22        31
imzali kod zorunlulugu               2             1       3/4                6         3
guvenli onyukleme zinciri            1             0       3/4                0         2
taban cizgisi karsilastirmasi        0             7       4/4                0        12
surec olusturma kaydi                0             4       4/4                0         0

hicbir denetimin dokunmadigi nokta turu: 1/10 (olay-aboneligi)
toplam engellenen mesru kalem: 36; elle onaya dusen is: 52
```

Alt tablo iki denetim ailesini kesin bir çizgiyle ayırıyor. Kapatan dört denetim toplam on nokta
türü kapatıyor ve karşılığında otuz altı meşru kalem engelliyor. Görünürlük veren iki denetim
hiçbir tür kapatmıyor, on bir tür görünür kılıyor ve tek bir meşru kalem engellemiyor. Bedelleri
farklı yerdedir: kapatan denetimlerin bedeli engellenen kalemde, gören denetimlerinki elle onaya
düşen işte — ve toplam elli iki kalemlik elle onay yükünün on ikisi tek bir görünürlük
denetiminden geliyor.

Uygulanabilirlik sütunu üçüncü ayrımı veriyor ve kapatan denetimlerin hepsi burada zayıf. Dört uç
sınıfının dördünde birden uygulanabilen iki denetim var ve ikisi de yalnız görünürlük veriyor.
Kapatan denetimlerin hiçbiri dört sınıfın dördünde uygulanamıyor; en dar olan uygulama izin listesi
yalnız ikisinde. Kapatmak ile yaymak arasında bir gerilim var: bir denetim ne kadar çok şey
kapatıyorsa o kadar az uçta uygulanabiliyor.

Üst tablodaki iki satır ayrıca dikkat çekiyor. Kalıcı olay aboneliğine hiçbir denetim dokunmuyor —
ne kapatan var ne gören. Önyükleme girişini bir denetim kapatıyor ama hiçbiri görmüyor: kapatmanın
uygulanamadığı bir uçta o tür tamamen karanlıkta kalır. En kalabalık iki nokta türü olan servis
tanımı ve zamanlanmış görev ise birer denetimle kapanıyor ve ikişer denetimle görünüyor.

#### Uç Sınıfına Göre Üç Sütun

```js
// kosum2.mjs — uc sinifi basina kapali / yalniz gorunur / karanlik nokta turu sayimi
import { TUR, NOKTA, SINIF, AD, DENETIM, durum, uc, TOPLAM_UC } from './envanter.mjs';

console.log(`${'nokta turu'.padEnd(26)} ${SINIF.map((s) => s.padStart(14)).join(' ')}`);
for (const t of TUR)
  console.log(`${t.padEnd(26)} ${SINIF.map((s) => durum(t, s).padStart(14)).join(' ')}`);
console.log(`\n${'uc sinifi'.padEnd(14)} ${'uc'.padStart(4)} ${'uygulanan denetim'.padStart(17)} ${'kapali'.padStart(6)} ` +
  `${'yalniz gorunur'.padStart(14)} ${'karanlik'.padStart(8)} ${'karanlik kalem'.padStart(14)}`);
const say = (s, d) => TUR.filter((t) => durum(t, s) === d);
for (const s of SINIF)
  console.log(`${s.padEnd(14)} ${String(uc(s)).padStart(4)} ${String(AD.filter((d) => DENETIM[d][1].includes(s)).length).padStart(17)} ` +
    `${String(say(s, 'kapali').length).padStart(6)} ${String(say(s, 'gorunur').length).padStart(14)} ` +
    `${String(say(s, 'karanlik').length).padStart(8)} ${String(say(s, 'karanlik').reduce((a, t) => a + NOKTA[t], 0)).padStart(14)}`);
const agirlik = (d) => SINIF.reduce((a, s) => a + uc(s) * say(s, d).length, 0) / TOPLAM_UC;
console.log(`${'filo ortalamasi'.padEnd(14)} ${String(TOPLAM_UC).padStart(4)} ${''.padStart(17)} ` +
  `${agirlik('kapali').toFixed(1).padStart(6)} ${agirlik('gorunur').toFixed(1).padStart(14)} ${agirlik('karanlik').toFixed(1).padStart(8)}`);

const herYerde = TUR.filter((t) => SINIF.every((s) => durum(t, s) === 'kapali'));
const hicKapali = TUR.filter((t) => SINIF.every((s) => durum(t, s) !== 'kapali'));
console.log(`\ndort uc sinifinin dordunde de kapali nokta turu: ${herYerde.length}/${TUR.length} (${herYerde.join(', ') || '-'})`);
console.log(`hicbir uc sinifinda kapanmayan nokta turu    : ${hicKapali.length}/${TUR.length} (${hicKapali.join(', ')})`);
const enKor = SINIF.map((s) => [s, say(s, 'karanlik').length]).sort((a, b) => b[1] - a[1])[0];
console.log(`en cok karanlik nokta turu tasiyan uc sinifi : ${enKor[0]} (${enKor[1]} tur, ${uc(enKor[0])} uc)`);
```

```
nokta turu                   saha dizustu       sube ucu      toplayici  merkez sunucu
acilis-girisi                     gorunur         kapali         kapali         kapali
servis-tanimi                     gorunur         kapali         kapali        gorunur
zamanlanmis-gorev                 gorunur         kapali         kapali        gorunur
oturum-betigi                     gorunur         kapali         kapali         kapali
yukleme-yolu-kancasi               kapali         kapali         kapali        gorunur
olay-aboneligi                   karanlik       karanlik       karanlik       karanlik
mesru-ikiliye-ilisme               kapali         kapali         kapali       karanlik
ortam-otomatik-calistirma         gorunur         kapali         kapali        gorunur
uygulama-uzantisi                 gorunur         kapali         kapali         kapali
onyukleme-girisi                   kapali         kapali       karanlik         kapali

uc sinifi        uc uygulanan denetim kapali yalniz gorunur karanlik karanlik kalem
saha dizustu    120                 4      3              6        1              2
sube ucu        240                 6      9              0        1              2
toplayici        60                 5      8              0        2              6
merkez sunucu    12                 4      4              4        2              2
filo ortalamasi  432                      7.1            1.8      1.2

dort uc sinifinin dordunde de kapali nokta turu: 0/10 (-)
hicbir uc sinifinda kapanmayan nokta turu    : 1/10 (olay-aboneligi)
en cok karanlik nokta turu tasiyan uc sinifi : toplayici (2 tur, 60 uc)
```

Sıfır, bu tablonun en önemli sayısıdır. On nokta türünün hiçbiri dört uç sınıfının dördünde birden
kapalı değil. Filo ortalaması yedi virgül bir kapalı, bir virgül sekiz yalnız görünür ve bir virgül
iki karanlık türdür; ama ortalama bu tabloyu yanlış özetler, çünkü dağılım sınıflara göre keskin
biçimde ayrışıyor. Şube uçlarında on türün dokuzu kapalı, saha dizüstülerinde üçü. Aynı envanter,
aynı denetim listesi, farklı uygulanabilirlik.

Saha dizüstü sütunu kapatmanın nerede tıkandığını gösteriyor. Dört denetim uygulanabiliyor ve altı
nokta türü yalnız görünür kalıyor. Bu uçlarda meşru işin çeşitliliği uygulama izin listesini ve
yazma izni daraltmasını uygulanamaz kılıyor; karşılığında bu uçlar kapatılamayan altı türü kayda
düşürüyor. Ölçüm burada bir seçim değil bir sonuç veriyor: kapatılamayan yerde kalan tek şey
görünürlüktür ve bu uçlarda görünürlük altı türün tamamını taşıyor.

Karanlık sütunu ise ne kapatılan ne görülen türleri sayıyor. Tür sayısında iki sınıf başa baş
gidiyor — toplayıcı ve merkez sunucu, ikisi de iki tür — ama karanlıkta kalan meşru kalem
toplayıcıda en yüksektir. Toplayıcılarda iki tür karanlık: kalıcı olay aboneliği ve önyükleme
girişi. İkincisinin
nedeni donanım — güvenli önyükleme zinciri bu sınıfta uygulanamıyor ve o türü gören hiçbir denetim
yok. Altı meşru kalem bu iki türde duruyor ve hiçbir denetim onlara bakmıyor. Merkez sunucularında
da iki tür karanlık; on iki uç için küçük bir sayı gibi görünür, ama bu on iki uç kursun ölçtüğü en
değerli veriyi taşıyor.

#### Filo Ölçeğinde Bedel

Uç başına sayılan bedel bir kararı taşımaz; kararı taşıyan sayı, denetimin uygulandığı uç sayısıyla
çarpılmış hâlidir. Aynı model filo ölçeğinde de koşturulabilir.

```js
// kosum3.mjs — filo olceginde bedel: denetim basina kapsanan uc, engellenen kalem ve onay yuku
import { TUR, NOKTA, SINIF, AD, DENETIM, durum, uc, TOPLAM_UC } from './envanter.mjs';

console.log(`${'denetim'.padEnd(30)} ${'kapsanan uc'.padStart(11)} ${'engellenen kalem'.padStart(16)} ` +
  `${'onay kalemi'.padStart(11)} ${'kapattigi nokta-uc'.padStart(18)}`);
let [eng, onay] = [0, 0];
for (const d of AD) {
  const n = DENETIM[d][1].reduce((a, s) => a + uc(s), 0);
  const kapali = Object.entries(DENETIM[d][0]).filter(([, v]) => v === 'kapatir').length;
  eng += n * DENETIM[d][2]; onay += n * DENETIM[d][3];
  console.log(`${d.padEnd(30)} ${String(n).padStart(11)} ${String(n * DENETIM[d][2]).padStart(16)} ` +
    `${String(n * DENETIM[d][3]).padStart(11)} ${String(n * kapali).padStart(18)}`);
}
console.log(`${'toplam'.padEnd(30)} ${String(TOPLAM_UC).padStart(11)} ${String(eng).padStart(16)} ${String(onay).padStart(11)}`);

const cift = (d) => SINIF.reduce((a, s) => a + uc(s) * TUR.filter((t) => durum(t, s) === d).length, 0);
const kalemCift = (d) => SINIF.reduce((a, s) =>
  a + uc(s) * TUR.filter((t) => durum(t, s) === d).reduce((x, t) => x + NOKTA[t], 0), 0);
console.log(`\n${'sutun'.padEnd(16)} ${'nokta-uc cifti'.padStart(14)} ${'pay'.padStart(6)} ${'mesru kalem'.padStart(11)}`);
const toplamCift = TOPLAM_UC * TUR.length;
for (const d of ['kapali', 'gorunur', 'karanlik'])
  console.log(`${d.padEnd(16)} ${String(cift(d)).padStart(14)} ${`%${(cift(d) * 100 / toplamCift).toFixed(1)}`.padStart(6)} ` +
    `${String(kalemCift(d)).padStart(11)}`);
console.log(`${'toplam'.padEnd(16)} ${String(toplamCift).padStart(14)}`);
```

```
denetim                        kapsanan uc engellenen kalem onay kalemi kapattigi nokta-uc
yazma izni daraltma                    312             2496        1248                936
uygulama izin listesi                  300             6600        9300               1200
imzali kod zorunlulugu                 420             2520        1260                840
guvenli onyukleme zinciri              372                0         744                372
taban cizgisi karsilastirmasi          432                0        5184                  0
surec olusturma kaydi                  432                0           0                  0
toplam                                 432            11616       17736

sutun            nokta-uc cifti    pay mesru kalem
kapali                     3048  %70.6       48912
gorunur                     768  %17.8       19536
karanlik                    504  %11.7        1104
toplam                     4320
```

Filo ölçeğinde sıralama değişiyor. Uygulama izin listesi uç başına en çok tür kapatan denetimdi;
filo ölçeğinde en pahalı olan da odur: altı bin altı yüz engellenen kalem ve dokuz bin üç yüz onay
kalemi. Buna karşılık güvenli önyükleme zinciri üç yüz yetmiş iki nokta-uç çiftini sıfır engellenen
kalemle kapatıyor. İki denetim arasındaki fark, kapattıkları nokta türünün meşru kalem yoğunluğudur:
biri uçtaki en kalabalık noktalara dokunuyor, öteki neredeyse boş olan bir noktaya.

Alt tablo konunun kapanış sayısını veriyor. Dört yüz otuz iki uç ve on nokta türü dört bin üç yüz
yirmi nokta-uç çifti eder; bunun yüzde yetmiş virgül altısı kapalı, yüzde on yedi virgül sekizi
yalnız görünür ve yüzde on bir virgül yedisi karanlıktır. Karanlık çiftlerin taşıdığı meşru kalem
yalnızca bin yüz dört — yani karanlıkta kalan noktalar uçtaki en seyrek noktalar. Bu, iyi bir haber
gibi okunabilir ama tersi de doğrudur: seyrek nokta, üzerine bir kalem eklendiğinde en kolay
fark edilecek noktadır — eğer bakan bir kayıt varsa. Karanlık sütununun tanımı tam olarak böyle bir
kaydın olmamasıdır.

#### Özet

- 10 kalıcılık noktası türü uç başına 161 meşru kalem barındırıyor. 4 kapatan denetim toplam 10 tür
  kapatıyor ve 36 meşru kalem engelliyor; 2 görünürlük denetimi hiç tür kapatmıyor, 11 tür görünür
  kılıyor ve 0 kalem engelliyor.
- Kapatan denetimlerin hiçbiri 4 uç sınıfının dördünde birden uygulanamıyor; dört sınıfta da
  uygulanabilen iki denetim yalnız görünürlük veriyor. Ne kadar çok kapatan, o kadar az uçta.
- 4 uç sınıfının dördünde birden kapalı nokta türü sayısı **0/10**. Şube uçlarında 9 tür kapalı,
  saha dizüstülerinde 3; aynı envanter, farklı uygulanabilirlik.
- Kalıcı olay aboneliğine hiçbir denetim dokunmuyor: ne kapatan var ne gören. Önyükleme girişini
  bir denetim kapatıyor, hiçbiri görmüyor — kapatmanın uygulanamadığı uçta tamamen karanlıkta kalır.
- Karanlık tür sayısı iki sınıfta eşit en yüksektir (toplayıcı ve merkez sunucu, ikisi de 2 tür);
  karanlıkta kalan meşru kalem ise toplayıcıda en yüksektir — 6 kalem, merkez sunucuda 2.
  Filo ortalaması 7,1 kapalı, 1,8 yalnız görünür, 1,2 karanlıktır.
- Kapatmanın toplam bedeli 36 engellenen meşru kalem ve 52 elle onay kalemidir; 52'nin 31'i tek bir
  denetimden (uygulama izin listesi), 12'si tek bir görünürlük denetiminden gelir.

#### Sonraki Adım

Bu konu altı derste koruma katmanlarını tek tek saydı ve her katmanın neyi kaçırdığını yazdı:
kalıcılık noktası kapatmanın on türün yedisini durduramadığını, imza ile davranışın iki yanlışını
birden sıfırlayan bir eşiğin olmadığını, telemetrinin sekiz noktanın ikisini hiç görmediğini, konak
tabanlı filtrenin eşler arası meşru trafiği kapatamadığını, yerleşik araçların imza kuralına hiç
görünmediğini ve dört uç sınıfının dördünde birden kapalı hiçbir noktanın bulunmadığını. Her
derste kaçırılan bir küme kaldı ve her seferinde aynı cümle yazıldı: kapatılamayan nokta en azından
görünür kılınmalıdır.

Ama görünürlük bir varsayıma yaslanıyordu ve o varsayım hiç sınanmadı. Bir noktanın "kayda düştüğü"
söylendiğinde o kaydın nerede durduğu, kimin okuyabildiği, ne kadar süre kaldığı ve — en önemlisi —
üzerinde oynanmadığını neyin kanıtladığı sorulmadı. Kaçırılanın kaçırıldığını ancak bir kayıt
gösterebilir; o kayıt kendisi kaçırılabiliyorsa geriye ölçülecek bir şey kalmaz. Sonraki konu
**Sistem Günlükleri** bu soruyla başlar: uçtaki kayıtlar hangi kaynaklarda tutuluyor, o kaynakların
hangisi uçta duran birinin erişebildiği bir yerde ve bir günlük kümesinin kurcalanmadığı hangi
kanıtla söylenir.

## Sistem Günlükleri

Uç noktadaki günlük kaynaklarının hangi tutunma noktasını gördüğü, başarısız giriş örüntülerinde eşik seçiminin kaçırdığı ile gereksiz uyandırdığı olay, süreç oluşturma kayıtlarından çıkarılan süreç ağacı ve kurcalanmış bir günlük kümesinde zincir kopukluğunun tespiti.

### Olay Günlükleri

Source: https://academia.sh/tr/kurslar/uc-nokta-guvenligi/olay-gunlukleri

Kurgu bir uç filosunda on iki tutunma noktası türü yedi günlük kaynağına karşı ölçülür: varsayılan yapılandırmada 3.078 (makine, tür) çiftinin 932'si adıyla görünüyor, 1.092'si hiçbir kaynakta yok; bütün kaynaklar açıldığında adıyla görünen 2.356'ya çıkıyor, 250 çift kör kalıyor ve bedeli günde 10,2 milyon ek kayıt ile rol profili başına 5 yapılandırma kalemi.

Bir önceki ders kalıcılık mekanizmalarını tür tür saydı ve koruma katmanlarının her birinin
kaçırdığını yazdı. Kaçırılan bir şeyin kaçırıldığını gösterebilecek tek şey bir kayıttır: koruma
durduramadıysa, geriye yalnız gördüğü kalır. Bu konu o kayıtları ölçer ve ilk soru en yalın
olanıdır — uçtaki bir tutunma noktası kurulduğunda, bunu hangi kaynak yazar.

Bu konunun ölçüsü **görünürlüktür** ve iki sütunu birbirine karıştırmamak gerekir. Bir kayıt ya
kalemi **adıyla** yazar (hangi zamanlanmış görev, hangi servis tanımı, hangi oturum betiği) ya da
yalnız bir şeyin olduğunu gösterir: oturum açıldı, bir süreç başladı, bir yapılandırma değişti.
İkincisi soruşturmayı başlatır, yanıtlamaz. Aşağıdaki ölçüm bir **modeldir** ve bölgesel ölçüm ağı
**kurgudur**; ürün adı değil, kaynak türü kullanılır.

- **SG1.** Uç filosu kurgudur: 84 saha dizüstü, 46 şube ucu, 120 sayaç toplayıcı makinesi, 18
  merkezî işleme sunucusu. Platform aileleri Bilgi Teknolojileri ve Sistem Temelleri kursundaki
  gibi güvenlik modeliyle anılır: ayrık kullanıcı ve grup izni taşıyan aile, erişim denetim listesi
  taşıyan aile, imzalı uygulama deposuna dayanan aile.
- **SG2.** Tutunma noktası türü on ikidir ve her tür her ailede bulunmaz; erişim denetim listesi
  taşıyan ailede üç tür karşılıksızdır.
- **SG3.** Bir kaynak bir türü **tam** görür (kalemi adıyla yazar), **dolaylı** görür (olay kayda
  düşer, kalem adsız kalır) ya da hiç görmez.
- **SG4.** İki kaynak varsayılan olarak kapalıdır: süreç oluşturma kaydı ve zamanlayıcı kaydı.
  Açılmaları yapılandırma kalemi ister ve hacim getirir. Günlük hacimler makine başına ortalamadır
  ve kurgudur.
- **SG5.** Uygulama denetim kaydı yalnız uygulama çalıştıran makinelerde, yönetim düzlemi denetim
  günlüğü yalnız merkezden yönetilen makinelerde vardır. İkisi de önceki kurslarda ölçülmüştür;
  burada yalnız birer kaynaktır.

#### Kaynakların Gördüğü

```js
// kaynak.mjs — gunluk kaynaklari ile tutunma noktasi turleri arasindaki kapsam. MODELDIR.
// Bolgesel olcum agi KURGUDUR; gercek kurum, gercek makine ve urun adi yazilmaz.

// Tutunma noktasi turu -> hangi platform ailelerinde var.
// a: ayrik kullanici ve grup izni tasiyan aile, e: erisim denetim listesi tasiyan aile,
// i: imzali uygulama deposuna dayanan aile.
export const NOKTA = {
  "acilis girisi": "aei", "sistem servis tanimi": "aei", "kullanici servis tanimi": "ai",
  "zamanlanmis gorev": "aei", "oturum betigi": "aei", "masaustu acilis girdisi": "aei",
  "paket kurulum kancasi": "ai", "cekirdek modulu": "aei", "yukleyici onyukleme ayari": "ai",
  "yonetim ajani eklentisi": "aei", "uygulama ici zamanlanmis is": "aei",
  "bellenim acilis girdisi": "aei",
};

// Kaynak: varsayilan acik mi, gunluk kayit/makine (kurgu), acmanin yapilandirma kalemi,
// gordugu tur -> "tam" (kalemi adiyla yazar) ya da "dolayli" (olay gorunur, kalem adsiz).
export const KAYNAK = {
  "sistem olay gunlugu": { acik: true, hacim: 4200, kalem: 0, gorur: {
    "sistem servis tanimi": "tam", "cekirdek modulu": "tam",
    "acilis girisi": "dolayli", "yonetim ajani eklentisi": "dolayli" } },
  "kimlik dogrulama gunlugu": { acik: true, hacim: 1900, kalem: 0, gorur: {
    "oturum betigi": "dolayli", "masaustu acilis girdisi": "dolayli" } },
  "surec olusturma kaydi": { acik: false, hacim: 38000, kalem: 3, gorur: {
    "acilis girisi": "tam", "sistem servis tanimi": "tam", "kullanici servis tanimi": "tam",
    "zamanlanmis gorev": "tam", "oturum betigi": "tam", "masaustu acilis girdisi": "tam",
    "paket kurulum kancasi": "tam", "uygulama ici zamanlanmis is": "tam",
    "yukleyici onyukleme ayari": "dolayli", "cekirdek modulu": "dolayli",
    "yonetim ajani eklentisi": "dolayli" } },
  "paket ve yukleme kaydi": { acik: true, hacim: 40, kalem: 0, gorur: {
    "paket kurulum kancasi": "tam", "cekirdek modulu": "dolayli" } },
  "zamanlayici kaydi": { acik: false, hacim: 320, kalem: 2, gorur: {
    "zamanlanmis gorev": "tam" } },
  "uygulama denetim kaydi": { acik: true, hacim: 2400, kalem: 0, gorur: {
    "uygulama ici zamanlanmis is": "tam" } },
  "yonetim duzlemi denetim gunlugu": { acik: true, hacim: 60, kalem: 0, gorur: {
    "yonetim ajani eklentisi": "tam", "bellenim acilis girdisi": "tam" } },
};

// Makine grubu: aile, makine sayisi, uzerinde bulunan kaynaklar (kurgu envanter).
export const GRUP = [
  ["saha dizustu", "i", 84, ["sistem olay gunlugu", "kimlik dogrulama gunlugu",
    "surec olusturma kaydi", "paket ve yukleme kaydi", "zamanlayici kaydi"]],
  ["sube ucu", "e", 46, ["sistem olay gunlugu", "kimlik dogrulama gunlugu",
    "surec olusturma kaydi", "paket ve yukleme kaydi", "zamanlayici kaydi"]],
  ["sayac toplayici", "a", 120, ["sistem olay gunlugu", "kimlik dogrulama gunlugu",
    "surec olusturma kaydi", "paket ve yukleme kaydi", "zamanlayici kaydi",
    "uygulama denetim kaydi"]],
  ["merkezi isleme", "a", 18, Object.keys(KAYNAK)],
];

// Bir grupta bir tur: acik kaynaklarin en iyisi "tam", "dolayli" ya da "yok".
export const gorunum = (tur, kaynaklar, hepsiAcik) => {
  let en = "yok";
  for (const k of kaynaklar) {
    if (!hepsiAcik && !KAYNAK[k].acik) continue;
    const g = KAYNAK[k].gorur[tur];
    if (g === "tam") return "tam";
    if (g === "dolayli") en = "dolayli";
  }
  return en;
};
export const turler = (aile) => Object.keys(NOKTA).filter((t) => NOKTA[t].includes(aile));

const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const yz = gen([33, 12, 8, 11, 9, 16]);

if (import.meta.url === `file://${process.argv[1]}`) {
  console.log(`model: ${Object.keys(NOKTA).length} tutunma noktasi turu, ` +
    `${Object.keys(KAYNAK).length} gunluk kaynagi, ${GRUP.length} makine grubu (kurgu)`);
  console.log(yz(["gunluk kaynagi", "varsayilan", "tam", "dolayli", "gormez",
    "kayit/gun/mak."]));
  for (const [ad, k] of Object.entries(KAYNAK)) {
    const d = Object.values(k.gorur);
    console.log(yz([ad, k.acik ? "acik" : "kapali", d.filter((x) => x === "tam").length,
      d.filter((x) => x === "dolayli").length,
      Object.keys(NOKTA).length - d.length, k.hacim]));
  }
  const varsayilan = Object.keys(NOKTA).filter((t) =>
    gorunum(t, Object.keys(KAYNAK), false) === "yok");
  const hepsi = Object.keys(NOKTA).filter((t) =>
    gorunum(t, Object.keys(KAYNAK), true) !== "tam");
  console.log(`\nbutun kaynaklar acikken hicbir kaynagin adiyla yazmadigi tur: ` +
    `${hepsi.length} (${hepsi.join(", ")})`);
  console.log(`varsayilan acik kaynaklarla hicbir kayit birakmayan tur: ` +
    `${varsayilan.length} (${varsayilan.join(", ")})`);
}
```

```
model: 12 tutunma noktasi turu, 7 gunluk kaynagi, 4 makine grubu (kurgu)
gunluk kaynagi                     varsayilan     tam    dolayli   gormez  kayit/gun/mak.
sistem olay gunlugu                      acik       2          2        8            4200
kimlik dogrulama gunlugu                 acik       0          2       10            1900
surec olusturma kaydi                  kapali       8          3        1           38000
paket ve yukleme kaydi                   acik       1          1       10              40
zamanlayici kaydi                      kapali       1          0       11             320
uygulama denetim kaydi                   acik       1          0       11            2400
yonetim duzlemi denetim gunlugu          acik       2          0       10              60

butun kaynaklar acikken hicbir kaynagin adiyla yazmadigi tur: 1 (yukleyici onyukleme ayari)
varsayilan acik kaynaklarla hicbir kayit birakmayan tur: 3 (kullanici servis tanimi, zamanlanmis gorev, yukleyici onyukleme ayari)
```

Tabloda dikkat çeken ilk şey, her makinede varsayılan olarak açık olan üç kaynağın hiçbirinin
geniş olmamasıdır.
Sistem olay günlüğü on iki türden ikisini adıyla yazar, kimlik doğrulama günlüğü **hiçbirini**
yazmaz — o kaynağın işi kalem izlemek değil, oturum izlemektir ve iki türü yalnız dolaylı görür.
Paket ve yükleme kaydı bir tür yazar. Varsayılan yapılandırmanın kapsamı bu üç satırdır.

Sekiz türü adıyla yazan tek kaynak **kapalı** olandır. Süreç oluşturma kaydı geniştir çünkü
tutunma noktalarının ortak yanı sonunda bir şey **çalıştırmalarıdır**; kalemi kuran işlem de,
kalemin çalıştırdığı iş de bir süreç yaratır. Aynı satır bedeli de taşıyor: makine başına günde
38.000 kayıt, öteki altı kaynağın toplamının dört katından fazla.

Son iki satır üç türü kurtarıyor. Uygulama içi zamanlanmış iş yalnız uygulamanın kendi denetim
kaydında görünür; yönetim ajanı eklentisi ile bellenim açılış girdisi yalnız yönetim düzlemi
denetim günlüğünde. Bunlar uç noktanın **içinden** görülemeyen türlerdir: bellenim işletim
sisteminden önce çalışır, ajan eklentisi ise merkezden itilir ve makinede bir kurulum kaydı
bırakmaz.

Son satır ölçünün sınırını veriyor. Bütün kaynaklar açıkken bile bir tür hiçbir kaynakta adıyla
yazılmıyor: yükleyici önyükleme ayarı yalnız dolaylı görünüyor, yani süreç oluşturma kaydında o
ayarla başlatılmış süreçler var ama ayarın kendisi hiçbir yerde adlandırılmıyor.

#### Makine Grubunda Kapsam

```js
// kapsam.mjs — makine grubu basina kapsam: varsayilan yapilandirma ile hepsi acik.
import { NOKTA, KAYNAK, GRUP, gorunum, turler } from "./kaynak.mjs";

const say = (grup, hepsiAcik) => {
  const [, aile, , kaynaklar] = grup;
  const d = { tam: 0, dolayli: 0, yok: 0, korNokta: [] };
  for (const t of turler(aile)) {
    const g = gorunum(t, kaynaklar, hepsiAcik);
    d[g === "yok" ? "yok" : g]++;
    if (g === "yok") d.korNokta.push(t);
  }
  return d;
};
const ek = (grup) => grup[3].filter((k) => !KAYNAK[k].acik)
  .reduce((a, k) => ({ kalem: a.kalem + KAYNAK[k].kalem, hacim: a.hacim + KAYNAK[k].hacim }),
    { kalem: 0, hacim: 0 });

const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const yz = gen([17, 7, 8, 7, 7, 9, 7, 7, 9, 8, 13]);

console.log(yz(["makine grubu", "aile", "makine", "tur", "tam", "dolayli", "yok",
  "tam+", "dolayli+", "yok+", "ek kalem"]));
let cift = 0, tamV = 0, tamH = 0, yokV = 0, yokH = 0, gunlukEk = 0;
for (const g of GRUP) {
  const v = say(g, false), h = say(g, true), e = ek(g), n = g[2];
  cift += n * turler(g[1]).length;
  tamV += n * v.tam; tamH += n * h.tam; yokV += n * v.yok; yokH += n * h.yok;
  gunlukEk += n * e.hacim;
  console.log(yz([g[0], g[1], n, turler(g[1]).length, v.tam, v.dolayli, v.yok,
    h.tam, h.dolayli, h.yok, e.kalem]));
}
const makine = GRUP.reduce((a, g) => a + g[2], 0);
console.log(`\nfilo ${makine} makine, ${cift} (makine, tur) cifti`);
console.log(`varsayilan yapilandirma: ${tamV} cift adiyla gorunuyor, ${yokV} cift hicbir ` +
  `kaynakta yok`);
console.log(`butun kaynaklar acik: ${tamH} cift adiyla gorunuyor, ${yokH} cift hicbir ` +
  `kaynakta yok`);
for (const g of GRUP) {
  const h = say(g, true);
  console.log(`${g[0].padEnd(17)} kor nokta: ${h.korNokta.join(", ") || "-"}`);
}
const gunlukVar = GRUP.reduce((a, g) => a + g[2] * g[3]
  .filter((k) => KAYNAK[k].acik).reduce((s, k) => s + KAYNAK[k].hacim, 0), 0);
console.log(`\ngunluk kayit: varsayilan ${gunlukVar.toLocaleString("tr-TR")}, ` +
  `hepsi acik ${(gunlukVar + gunlukEk).toLocaleString("tr-TR")} ` +
  `(${((gunlukVar + gunlukEk) / gunlukVar).toFixed(1)} kat)`);
console.log(`kazanc: +${tamH - tamV} cift adiyla gorunur oluyor; ` +
  `bedeli ${GRUP.reduce((a, g) => a + ek(g).kalem, 0)} yapilandirma kalemi ` +
  `(rol profili basina ${ek(GRUP[0]).kalem}) ve gunde ` +
  `${gunlukEk.toLocaleString("tr-TR")} ek kayit`);
console.log(`butun kaynaklar acikken bile ${yokH} cift kor kaliyor; hepsi ayni turdur ` +
  `ve ${Object.keys(NOKTA).length} turden birine karsilik gelir`);
```

```
makine grubu        aile  makine    tur    tam  dolayli    yok   tam+ dolayli+    yok+     ek kalem
saha dizustu           i      84     12      3        4      5      9        2       1            5
sube ucu               e      46      9      2        4      3      7        1       1            5
sayac toplayici        a     120     12      4        4      4      9        2       1            5
merkezi isleme         a      18     12      6        3      3     11        1       0            5

filo 268 makine, 3078 (makine, tur) cifti
varsayilan yapilandirma: 932 cift adiyla gorunuyor, 1092 cift hicbir kaynakta yok
butun kaynaklar acik: 2356 cift adiyla gorunuyor, 250 cift hicbir kaynakta yok
saha dizustu      kor nokta: bellenim acilis girdisi
sube ucu          kor nokta: bellenim acilis girdisi
sayac toplayici   kor nokta: bellenim acilis girdisi
merkezi isleme    kor nokta: -

gunluk kayit: varsayilan 1.977.800, hepsi acik 12.247.560 (6.2 kat)
kazanc: +1424 cift adiyla gorunur oluyor; bedeli 20 yapilandirma kalemi (rol profili basina 5) ve gunde 10.269.760 ek kayit
butun kaynaklar acikken bile 250 cift kor kaliyor; hepsi ayni turdur ve 12 turden birine karsilik gelir
```

Filo ölçeğinde soru şudur: 3.078 (makine, tür) çiftinin kaçı adıyla görünüyor. Varsayılan
yapılandırmada yanıt **932**, yani üçte birden az; 1.092 çift ise hiçbir kaynakta hiç görünmüyor.
Bu ikinci sayı dersin ana bulgusudur, çünkü kapsam eksikliği bir uyarı üretmez: kapalı bir kaynak
sessizdir ve envanterde "günlük toplanıyor" satırı yine de doğrudur.

Grup satırları farkın nereden geldiğini gösteriyor. Merkezî işleme sunucuları varsayılanda on iki
türün altısını adıyla görüyor, saha dizüstüler üçünü. Aradaki fark iki kaynağın **varlığıdır**;
uygulama denetim kaydı ile yönetim düzlemi denetim günlüğü, dizüstü bilgisayarda karşılığı olmayan
kaynaklardır. Uçtaki en zayıf görünürlük, kurumun en dağınık ve fiziksel olarak en korunmasız
makinelerindedir.

Şube uçları satırı bir ayrımı okumayı gerektiriyor. O grupta tür sayısı on iki değil dokuzdur ve
görünmeyen çift sayısı bu yüzden düşüktür — üç tür o ailede **yoktur**, yani kapatılmış değil,
hiç var olmamıştır. Bir kapsam tablosunda yüzde hesabı bu iki durumu ayırmazsa en dar platform en
iyi korunan platform gibi okunur. Sayılan şey oran değil, kalan kör nokta sayısı olmalıdır.

Dolaylı görünürlük sütunu da bir bedel taşır ve bu bedel tabloda görünmez. Bir soruşturma dolaylı
bir kayıttan başladığında yanıtı makineye gidip aramak zorundadır: kayıt bir oturum açıldığını
söyler, o oturumda hangi betiğin çalıştığını söylemez. Adıyla yazan kayıt bir sorguyla, dolaylı
kayıt bir saha ziyaretiyle yanıtlanır.

Kapalı iki kaynağı açmak 1.424 çifti adıyla görünür kılıyor. Bedeli iki kalemdir: rol profili
başına 5 yapılandırma kalemi — filo genelinde 20, çünkü ayar makine başına değil profil başına
yazılır — ve günde 10.269.760 ek kayıt. Toplam hacim 1,98 milyondan 12,25 milyona çıkıyor, yani
**6,2 kat**. Bu satır konunun ilerleyen derslerinin sorusunu da kuruyor: hacim tek başına bir sayı
değil, saklama süresi ve arama maliyeti demektir.

Kalan 250 çift kapatılamıyor. Bunların hepsi aynı türdür — bellenim açılış girdisi — ve yönetim
düzlemi denetim günlüğü taşımayan 250 makinede hiçbir kaynak onu görmüyor. Bu türün görünür
kılınması bir günlük ayarı değil, bir yönetim mimarisi kararıdır: uçların merkezden yönetilen bir
düzleme bağlanması gerekir. Kapatılamayan noktayı **en azından görünür kılmak** bu kursun kuralıdır
ve burada o da yapılamıyor; kalan tek seçenek, o türü periyodik bir bütünlük ölçümüyle dışarıdan
karşılaştırmaktır.

#### Özet

- Her makinede varsayılan olarak açık üç kaynak on iki tutunma noktası türünün üçünü adıyla
  yazıyor; sekiz
  türü adıyla yazan tek kaynak varsayılan olarak **kapalı** olan süreç oluşturma kaydıdır.
- Kayıt üç durumda olur: kalemi adıyla yazan **tam** görünürlük, olayı gösterip kalemi adlandırmayan
  **dolaylı** görünürlük ve hiçbir kaydın olmadığı kör nokta. Kimlik doğrulama günlüğü hiçbir türü
  tam görmez, ikisini dolaylı görür.
- Filoda 3.078 (makine, tür) çiftinin varsayılanda 932'si adıyla görünüyor, 1.092'si hiçbir
  kaynakta yok; iki kapalı kaynak açıldığında adıyla görünen 2.356'ya, kör kalan 250'ye iniyor.
- Bedel rol profili başına 5 yapılandırma kalemi ve günde 10,2 milyon ek kayıttır; toplam hacim
  6,2 katına çıkıyor.
- Kalan 250 kör çiftin hepsi bellenim açılış girdisidir ve uç noktanın içinden görülemez; yükleyici
  önyükleme ayarı ise hiçbir kaynakta adlandırılmıyor, yalnız dolaylı iz bırakıyor.

#### Sonraki Adım

Bu dersin kapsam tablosunda kimlik doğrulama günlüğü tek bir türü bile adıyla yazmadığı için en
zayıf kaynak gibi görünüyor. Oysa o kaynak başka bir soruya bakar: kalemin kurulmasına değil,
hesabın ele geçirilmesine. Sonraki ders o günlüğü tek başına ele alır ve başarısız giriş
örüntülerini gerçek bir kurgu kayıt kümesinde ayrıştırır: bir eşik seçildiğinde kaç olay
kaçırılıyor, kaç kez gereksiz yere uyarı üretiliyor ve hesap başına sayılan bir eşiğin neden
tamamen sessiz kaldığı bir deneme biçimi var.

### Kimlik Doğrulama Günlükleri

Source: https://academia.sh/tr/kurslar/uc-nokta-guvenligi/kimlik-dogrulama-gunlukleri

Bir günlük 1.168 satırlık kurgu kimlik doğrulama kümesi ayrıştırılır ve altı başarısızlık kümesi eşik kurallarına karşı ölçülür: hesap başına eşik 216 kampanya olayının 206'sını kaçırıyor, 5 yanlış pozitif üretiyor ve 9 meşru girişi durduruyor; pencereyi 24 saate açmak iki kampanyayı da yakalıyor ama 70 hesabı kilitleyip 49 meşru girişi kesiyor. Püskürtme hesap başına en çok 2 deneme yaptığı için hiçbir eşikte görünmüyor; bölge ekseninde sayan kural onu ayırıyor, çünkü en büyük meşru toplu başarısızlık 62 hesapta kalıyor.

Bir önceki dersin kapsam tablosunda kimlik doğrulama günlüğü on iki tutunma noktası türünün
hiçbirini adıyla yazmıyordu. O kaynağın işi kalem izlemek değildir: bir tutunma noktasının
kurulabilmesi için önce bir oturumun açılması gerekir ve kimlik doğrulama günlüğü tam olarak o
adımı görür. Kapattığı nokta sayısı sıfırdır; görünür kıldığı şey noktaların **öncesidir**.

Bu ders o günlüğü tek başına ele alır. Soru bir uyarı kuralının nasıl yazılacağı değil, seçilen
eşiğin ne kaçırdığı ve karşılığında kaç meşru işi durdurduğudur. Aşağıdaki günlük kümesi bir
**modeldir** ve bölgesel ölçüm ağı **kurgudur**; hesap adları, makine adları ve bölge adları
uydurmadır. **Bir hesap kümesine parola denemesi, yazılı yetki ve tanımlı kapsam olmadan hem
yasadışı hem meslek dışıdır**; burada denemenin kendisi değil, geride bıraktığı kayıt ölçülür.

- **SG6.** Günlük kümesi bir günü kapsar: 96 personel hesabı, 14 servis kimliği, beş ağ bölgesi.
  Satırlar metindir; alanlar düzenli ifadeyle çıkarılır.
- **SG7.** Modelin bildiği küme etiketi günlük satırına **yazılmaz**. Ayrıştırıcı onu göremez;
  kuralların yalnız satırlardaki alanları vardır.
- **SG8.** Altı küme vardır. Dördü meşrudur: yazım hatası, unutulmuş parola, kimliği eskimiş
  servis hesabı, sunucu tarafı kimlik ayarı değişikliği. İkisi kampanyadır: odaklı deneme ve
  püskürtme.
- **SG9.** Kural 1 hesap başına başarısızlık, kural 2 bölge başına **ayrı hesap** sayar. İkisi de
  kayan pencere kullanır; bir anahtar için yalnız ilk geçiş uyarı üretir.
- **SG10.** Eşik kilitlemeye bağlıdır: eşiği geçen hesap günün kalanında giremez. Durdurulan
  giriş sayısı bu varsayımdan çıkar.

#### Günlüğü Ayrıştırmak

```js
// giris.mjs — kurgu kimlik dogrulama gunlugu uretilir ve ayristirilir. MODELDIR.
// Gercek kurum, gercek hesap ve gercek adres yoktur; bolge adlari kurgudur.
// Uretec kendi yazilmistir; tohum asagida gorunur.
export const TOHUM = 20260314;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r = uretec(TOHUM);
const tam = (n) => Math.floor(r() * n);
const saat = (s) => [s / 3600, (s / 60) % 60, s % 60]
  .map((v) => String(Math.floor(v)).padStart(2, "0")).join(":");

export const HESAP = Array.from({ length: 96 }, (_, i) => `sh-${101 + i}`);
export const SERVIS = Array.from({ length: 14 }, (_, i) => `sv-${201 + i}`);
export const BOLGE = ["sube-ag", "saha-vpn", "toplayici-ag", "yonetim-ag", "dis-erisim"];

// Ham kayit: [saniye, makine, sonuc, hesap, bolge, etiket]. Etiket modelin bildigi dogrudur
// ve gunluk satirina YAZILMAZ; ayristirma onu goremez.
const ham = [];
const ekle = (s, mak, sonuc, hesap, bolge, etiket) =>
  ham.push([s, mak, sonuc, hesap, bolge, etiket]);

// 1) Vardiya basinda normal giris; bir bolumunde yazim hatasi.
for (const [i, h] of HESAP.entries()) {
  const b = BOLGE[i % 3], mak = `uc-${String(1 + (i % 268)).padStart(3, "0")}`;
  let t = 25200 + tam(7200);                       // 07:00 - 09:00 arasi
  if (r() < 0.22) for (let k = 0, n = 1 + tam(2); k < n; k++)
    ekle(t += 20 + tam(40), mak, "basarisiz", h, b, "yazim-hatasi");
  ekle(t + 15, mak, "basarili", h, b, "yazim-hatasi");
  for (let k = 0, n = tam(3); k < n; k++)
    ekle(36000 + tam(28800), mak, "basarili", h, b, "yazim-hatasi");
}
// 2) Parolasini unutan uc hesap: yogun basarisizlik, sonra sifirlama ve giris.
for (const h of [HESAP[7], HESAP[41], HESAP[70]]) {
  let t = 27000 + tam(9000);
  const n = 9 + tam(8);
  for (let k = 0; k < n; k++)
    ekle(t += 30 + tam(90), "uc-114", "basarisiz", h, "saha-vpn", "unutulmus-parola");
  ekle(t + 2400, "uc-114", "basarili", h, "saha-vpn", "unutulmus-parola");
}
// 3) Kimligi eskimis iki servis hesabi: gun boyu duzenli yeniden deneme.
for (const [j, h] of [SERVIS[3], SERVIS[9]].entries())
  for (let t = 600 + j * 130; t < 86400; t += 300)
    ekle(t, "uc-207", "basarisiz", h, "toplayici-ag", "eskimis-servis-kimligi");
// 4) Tek hesaba odakli deneme: uc saat boyunca ayni hesap.
for (let k = 0, t = 68400; k < 40; k++)
  ekle(t += 240 + tam(60), "uc-018", "basarisiz", HESAP[92], "dis-erisim", "odakli-deneme");
// 5) Puskurtme: 88 hesabin her birine iki deneme, elli dakikalik pencere.
for (const [j, h] of HESAP.slice(0, 88).entries()) {
  ekle(48000 + j * 17, "uc-018", "basarisiz", h, "dis-erisim", "puskurtme");
  ekle(49500 + j * 17, "uc-018", "basarisiz", h, "dis-erisim", "puskurtme");
}
ekle(51100, "uc-018", "basarili", HESAP[63], "dis-erisim", "puskurtme");
// 6) Sunucu tarafi kimlik ayari degisikligi: 62 sube hesabi bir kez basarisiz, sonra girer.
for (const [j, h] of HESAP.slice(20, 82).entries()) {
  ekle(36000 + j * 19, "uc-061", "basarisiz", h, "sube-ag", "ayar-degisikligi");
  ekle(36300 + j * 19, "uc-061", "basarili", h, "sube-ag", "ayar-degisikligi");
}

ham.sort((a, b) => a[0] - b[0]);
export const SATIR = ham.map(([s, mak, sonuc, hesap, bolge]) =>
  `2026-03-14T${saat(s)} ${mak} kimlik-dogrulama sonuc=${sonuc} hesap=${hesap} ` +
  `bolge=${bolge} yontem=parola`);
export const ETIKET = ham.map((k) => k[5]);

// Ayristirma: gunluk satiri metindir, alanlari duzenli ifadeyle cikarilir.
const DESEN = /^(\S+)T(\S+) (\S+) kimlik-dogrulama sonuc=(\w+) hesap=(\S+) bolge=(\S+) /;
export const ayristir = (satir) => {
  const m = DESEN.exec(satir);
  if (!m) return null;
  const [, , sa, makine, sonuc, hesap, bolge] = m;
  const [h, d, s] = sa.split(":").map(Number);
  return { t: h * 3600 + d * 60 + s, makine, sonuc, hesap, bolge };
};
export const OLAY = SATIR.map(ayristir);

if (import.meta.url === `file://${process.argv[1]}`) {
  console.log(`model (tohum ${TOHUM}): ${SATIR.length} gunluk satiri, ` +
    `${HESAP.length} personel ve ${SERVIS.length} servis hesabi (kurgu)`);
  for (const i of [0, 1]) console.log(SATIR[i]);
  const bozuk = OLAY.filter((o) => o === null).length;
  const bas = OLAY.filter((o) => o.sonuc === "basarisiz");
  console.log(`\nayristirilamayan satir ${bozuk}; basarisiz ${bas.length}, ` +
    `basarili ${OLAY.length - bas.length}`);
  const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
    : String(v).padEnd(B[0]))).join("");
  const yz = gen([26, 12, 9, 10, 17]);
  console.log(yz(["kume (modelin dogrusu)", "basarisiz", "hesap", "bolge",
    "hesap basina en"]));
  for (const e of [...new Set(ETIKET)]) {
    const l = SATIR.map((_, i) => i).filter((i) => ETIKET[i] === e &&
      OLAY[i].sonuc === "basarisiz");
    const h = {};
    for (const i of l) h[OLAY[i].hesap] = (h[OLAY[i].hesap] || 0) + 1;
    console.log(yz([e, l.length, Object.keys(h).length,
      new Set(l.map((i) => OLAY[i].bolge)).size, Math.max(0, ...Object.values(h))]));
  }
}
```

```
model (tohum 20260314): 1168 gunluk satiri, 96 personel ve 14 servis hesabi (kurgu)
2026-03-14T00:10:00 uc-207 kimlik-dogrulama sonuc=basarisiz hesap=sv-204 bolge=toplayici-ag yontem=parola
2026-03-14T00:12:10 uc-207 kimlik-dogrulama sonuc=basarisiz hesap=sv-210 bolge=toplayici-ag yontem=parola

ayristirilamayan satir 0; basarisiz 916, basarili 252
kume (modelin dogrusu)       basarisiz    hesap     bolge  hesap basina en
eskimis-servis-kimligi             572        2         1              286
yazim-hatasi                        29       19         3                2
unutulmus-parola                    37        3         1               14
ayar-degisikligi                    62       62         1                1
puskurtme                          176       88         1                2
odakli-deneme                       40        1         1               40
```

Kümeler tablosu dersin bütün gerilimini tek ekranda veriyor. Günün 916 başarısız girişinin **572'si
tek bir sorundan** geliyor: kimliği eskimiş iki servis hesabı beş dakikada bir yeniden deniyor ve
hesap başına 286 başarısızlık üretiyor. Bu sayı, en derin kampanyanın tek hesapta bıraktığı 40
başarısızlığın yedi katıdır ve tamamen meşrudur.

Alt iki satırdaki kampanyaların biçimi birbirinin tersidir. Odaklı deneme tek hesapta 40
başarısızlık bırakıyor — derin ve dar. Püskürtme 88 hesaba yayılıyor ama **hesap başına yalnız iki
deneme** yapıyor — sığ ve geniş. Dördüncü satır ikinci biçimi ayırmanın neden zor olduğunu
söylüyor: sunucu tarafı bir ayar değişikliği 62 hesapta birer başarısızlık üretti ve şekli
püskürtmeye benziyor.

#### Hesap Başına Eşik

```js
// esik.mjs — esik secimi: kacirilan olay, gereksiz uyari ve kilitlemenin durdurdugu mesru is.
import { OLAY, ETIKET, SATIR } from "./giris.mjs";

const KAMPANYA = ["odakli-deneme", "puskurtme"];
const bas = [];
OLAY.forEach((o, i) => { if (o.sonuc === "basarisiz")
  bas.push({ ...o, etiket: ETIKET[i], id: bas.length }); });
const basarili = OLAY.map((o, i) => ({ ...o, etiket: ETIKET[i] }))
  .filter((o) => o.sonuc === "basarili");
const kampanyaOlay = bas.filter((o) => KAMPANYA.includes(o.etiket));

// Kayan pencerede bir anahtarin (hesap ya da bolge) esigi ilk gectigi an ve o penceredeki olaylar.
function gecis(anahtar, olcu, esik, pencere) {
  const ilk = new Map();
  for (const [i, o] of bas.entries()) {
    const k = anahtar(o);
    if (ilk.has(k)) continue;
    const p = bas.slice(0, i + 1).filter((x) => anahtar(x) === k && x.t > o.t - pencere);
    if (olcu(p) >= esik) ilk.set(k, { t: o.t, p });
  }
  return ilk;
}
const sayi = (p) => p.length;
const ayriHesap = (p) => new Set(p.map((x) => x.hesap)).size;

// Degerlendirme uyarinin PENCERESINE bakar: kampanya olayi iceriyor mu.
function degerlendir(uyari) {
  const kapsanan = new Set();
  let bos = 0;
  for (const [, v] of uyari) {
    const k = v.p.filter((o) => KAMPANYA.includes(o.etiket));
    if (k.length === 0) bos++;
    for (const o of k) kapsanan.add(o.id);
  }
  const yakalanan = new Set(kampanyaOlay.filter((o) => kapsanan.has(o.id))
    .map((o) => o.etiket));
  return { yakalanan: yakalanan.size, kacan: kampanyaOlay.length - kapsanan.size, bos };
}

const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const y1 = gen([10, 7, 12, 12, 12, 11, 19]);
const y2 = gen([7, 8, 12, 12, 11, 19]);

console.log(`${SATIR.length} satir, ${bas.length} basarisiz giris; iki kampanya ` +
  `(${KAMPANYA.join(", ")}) toplam ${kampanyaOlay.length} olay uretti`);
console.log("\nkural 1 — hesap basina basarisizlik sayisi");
console.log(y1(["pencere", "esik", "kilitlenen", "yakalanan", "kacan olay", "gereksiz",
  "durdurulan giris"]));
for (const [ad, pencere] of [["1 saat", 3600], ["24 saat", 86400]])
  for (const esik of [3, 5, 10, 20]) {
    const u = gecis((o) => o.hesap, sayi, esik, pencere);
    const d = degerlendir(u);
    const durdurulan = [...u].reduce((a, [k, v]) => a + basarili
      .filter((b) => b.hesap === k && b.t >= v.t && b.etiket !== "puskurtme").length, 0);
    console.log(y1([ad, esik, u.size, `${d.yakalanan}/2`, d.kacan, d.bos, durdurulan]));
  }

console.log("\nkural 2 — bolge basina AYRI hesap sayisi (pencere 1 saat)");
console.log(y2(["esik", "uyari", "yakalanan", "kacan olay", "gereksiz", "engellenen hesap"]));
for (const esik of [10, 20, 40, 70, 90]) {
  const u = gecis((o) => o.bolge, ayriHesap, esik, 3600);
  const d = degerlendir(u);
  const engel = new Set([...u].filter(([, v]) => !v.p.some((o) =>
    KAMPANYA.includes(o.etiket))).flatMap(([, v]) => v.p.map((o) => o.hesap))).size;
  console.log(y2([esik, u.size, `${d.yakalanan}/2`, d.kacan, d.bos, engel]));
}

const enBuyuk = Math.max(...bas.map((o, i) => new Set(bas.slice(0, i + 1)
  .filter((x) => x.bolge === o.bolge && x.t > o.t - 3600 && !KAMPANYA.includes(x.etiket))
  .map((x) => x.hesap)).size));
const p = bas.filter((o) => o.etiket === "puskurtme");
const hesapBasi = [...new Set(p.map((o) => o.hesap))]
  .map((h) => p.filter((o) => o.hesap === h).length);
console.log(`\npuskurtme: ${new Set(p.map((o) => o.hesap)).size} hesap, hesap basina en cok ` +
  `${Math.max(...hesapBasi)} deneme, 1 basarili giris`);
console.log(`en buyuk MESRU toplu basarisizlik: bir saatte ${enBuyuk} ayri hesap`);
```

```
1168 satir, 916 basarisiz giris; iki kampanya (odakli-deneme, puskurtme) toplam 216 olay uretti

kural 1 — hesap basina basarisizlik sayisi
pencere      esik  kilitlenen   yakalanan  kacan olay   gereksiz   durdurulan giris
1 saat          3           6         1/2         213          5                  9
1 saat          5           6         1/2         211          5                  9
1 saat         10           6         1/2         206          5                  9
1 saat         20           0         0/2         216          0                  0
24 saat         3          70         2/2         104         11                 49
24 saat         5          12         2/2         199          5                 16
24 saat        10           6         1/2         206          5                  9
24 saat        20           3         1/2         196          2                  0

kural 2 — bolge basina AYRI hesap sayisi (pencere 1 saat)
esik      uyari   yakalanan  kacan olay   gereksiz   engellenen hesap
10            2         1/2         206          1                 10
20            2         1/2         196          1                 20
40            2         1/2         176          1                 40
70            1         1/2         146          0                  0
90            0         0/2         216          0                  0

puskurtme: 88 hesap, hesap basina en cok 2 deneme, 1 basarili giris
en buyuk MESRU toplu basarisizlik: bir saatte 62 ayri hesap
```

Birinci tablonun ilk üç satırı üç ayrı eşiği deniyor ve **üçü de aynı sonucu veriyor**: altı hesap
kilitleniyor, iki kampanyanın biri yakalanıyor, 216 kampanya olayının 206 ile 213 arası kaçıyor.
Üçe, beşe ve ona ayarlanmış eşikler arasında ölçülebilir bir tespit farkı yoktur; üçü de aynı beş
meşru hesabı yakalar, çünkü bir saatlik pencerede on başarısızlığı geçen tek şeyler eskimiş servis
kimlikleri, parolasını unutan kullanıcılar ve odaklı denemedir.

Tablodaki `gereksiz` sütunu penceresinde kampanya olayı bulunmayan uyarıyı, yani **yanlış
pozitifi** sayar: her eşikte beş uyarı meşru bir nedenden geliyor ve kilitleme açıksa dokuz meşru
giriş duruyor. İkisi servis hesabıdır; kilitlendiklerinde duran şey bir kullanıcı
değil, sayaç toplama işidir. Eşiği yirmiye çekmek yanlış pozitifle birlikte tespiti de sıfırlıyor:
yakalanan kampanya sıfır, kaçan olay 216.

Pencereyi yirmi dört saate açmak tabloyu değiştiriyor ama sorunu çözmüyor. Üç eşiğinde her iki
kampanya da yakalanıyor ve kaçan olay 104'e iniyor; bedeli **70 kilitlenen hesap**, 11 yanlış
pozitif ve 49 durdurulmuş meşru giriştir. Bu, gün içinde bir kez parolasını yanlış yazan herkesin
akşama kadar sisteme girememesi demektir. Duyarlılığı pencereden almanın faturası budur.

Yakalamanın nasıl olduğu da önemlidir: püskürtme, hesap başına iki denemesi gün içindeki meşru bir
başarısızlıkla **toplandığı için** görünüyor. Kural onu püskürtme olarak değil, üç başarısızlık
biriktirmiş bir hesap olarak görüyor ve hiç meşru başarısızlığı olmayan hesaplarda hâlâ görmüyor.

#### Aynı Olayı Bölge Ekseninde Saymak

Hesap başına sayan bir kural püskürtmeyi hiçbir eşikte tek başına göremez, çünkü ölçtüğü büyüklük
yanlıştır: kampanya hesap başına iki denemede kalıyor ve **iki**, meşru yazım hatası düzeyinin
altındadır. Eşiği düşürmek burada yardım etmez, yalnız yazım hatalarını uyarıya çevirir. Değişmesi
gereken şey eşik değil, sayılan **anahtardır**.

İkinci tablo aynı günlüğü bölge başına ayrı hesap sayarak okuyor. On, yirmi ve kırk eşiklerinde iki
uyarı çıkıyor ve biri yanlış pozitiftir: sunucu tarafı ayar değişikliği 62 şube hesabında birer
başarısızlık üretmişti ve bu kural onu bir kampanya gibi görüyor. Bölge engellemeye bağlanmış bir
kuralda bedel doğrudan okunuyor — kırk eşiğinde 40 meşru hesap engellenir.

Yetmiş eşiğinde uyarı tek kalıyor, yanlış pozitif sıfırlanıyor ve püskürtme ayrılıyor. Bu satır
umut verici görünür, ama son çıktı satırı sınırı yazıyor: **en büyük meşru toplu başarısızlık bir
saatte 62 hesaptır.** Kural yalnız bundan geniş yayılan denemeleri yanlış pozitif üretmeden
ayırabilir. Aynı kampanya 50 hesaba yayılsaydı hiçbir eşikte ayrılamayacaktı; doksan eşiğinde ise
bu kampanya da kaçıyor ve 216 olayın tamamı görünmez oluyor.

Kursun ölçüsüne çevrildiğinde tablo şunu söylüyor: kimlik doğrulama günlüğü **hiçbir tutunma
noktasını kapatmıyor**, yalnız noktaların kurulmasından önceki adımı görünür kılıyor ve o
görünürlük eşiğe bağlı. Püskürtmenin ürettiği tek başarılı giriş de kayıtta duruyor, ama
başarısızlık eşiği başarılı girişlere hiç bakmaz.

#### Özet

- Günün 916 başarısız girişinin 572'si tek bir meşru sorundan geliyor: kimliği eskimiş iki servis
  hesabı, hesap başına 286 başarısızlıkla en derin kampanyanın tek hesaptaki 40 başarısızlığının
  yedi katını üretiyor.
- Hesap başına sayan kural bir saatlik pencerede üç, beş ve on eşiklerinde aynı altı hesabı
  kilitliyor — yirmi eşiğinde hiçbirini; on eşiğinde 216 kampanya olayının 206'sı kaçıyor, 5 uyarı
  yanlış pozitif ve 9 meşru giriş duruyor.
- Pencereyi 24 saate açmak iki kampanyayı da yakalıyor ve kaçan olayı 104'e indiriyor; bedeli 70
  kilitlenen hesap, 11 yanlış pozitif ve 49 durdurulmuş meşru giriştir.
- Püskürtme hesap başına en çok 2 deneme yaptığı için hesap eksenli hiçbir eşikte görünmez; iki
  sayısı meşru yazım hatası düzeyinin altındadır ve eşiği düşürmek yalnız yazım hatalarını uyarıya
  çevirir.
- Bölge başına ayrı hesap sayan kural 70 eşiğinde püskürtmeyi yanlış pozitif üretmeden ayırıyor;
  bunun tabanı meşru toplu başarısızlığın büyüklüğüdür — bir saatte 62 hesap.

#### Sonraki Adım

Her iki kural da tek bir alana bakıyordu: giriş başarısız mı, hangi hesapta, hangi bölgede. Oturum
açıldıktan sonra ne olduğu bu günlükte yoktur; püskürtmenin ürettiği başarılı giriş, öteki 251
başarılı girişten ayırt edilemez. Bir sonraki ders o oturumun içine bakar ve ilk dersin tablosunda
sekiz türü tek başına adıyla yazan kaynağı açar: süreç oluşturma kayıtları. Ölçü orada üst süreç
bağlamıdır — aynı komut listesi düz bir dizi olarak okunduğunda kaç kalem şüpheli görünüyor, ağaç
olarak okunduğunda kaçı ayrılıyor ve kaydın hacmi ne.

### Komut Satırı Denetimi

Source: https://academia.sh/tr/kurslar/uc-nokta-guvenligi/komut-satiri-denetimi

5.110 kayıtlık bir süreç oluşturma örnekleminde yalnız alt süreç adına bakan kural 1.702 kaydı işaretliyor; üst süreç bağlamı aynı kümeyi 40 kayda ve 9 çifte indiriyor, yeni ve seyrek ölçütü beş şüpheli kalemin beşini de bir meşru yenilikle birlikte ayırıyor. Beş kalemin üçünün başka hiçbir kaynakta izi yok. Filoda kayıt günde 10,18 milyon satır ve 4,55 GiB tutuyor; taban çizgisi dışı çifti saklamak hacmi 128'e bölüyor ama dört soruşturma sorusunun üçünü yanıtsız bırakıyor.

Bir önceki ders kimlik doğrulama günlüğünü tek başına ölçtü ve oturum açıldıktan sonrasını
göremediğini gösterdi. İlk dersin kapsam tablosunda on iki tutunma noktası türünden sekizini tek
başına adıyla yazan bir kaynak vardı ve varsayılan olarak kapalıydı: süreç oluşturma kaydı. Bu ders
o kaydı açar ve iki soruyu birlikte sorar — kayıt neyi ayırt edebiliyor ve ne kadar yer tutuyor.

Ayırt etmenin anahtarı tek bir alandır: **üst süreç**. Bir süreç oluşturma kaydı yalnız çalışan
kalemin adını taşırsa elde düz bir liste kalır; üst süreç kimliğini de taşırsa aynı kayıtlar bir
**süreç ağacına** dönüşür ve soru "bu araç çalıştı mı" olmaktan çıkıp "bu aracı ne çalıştırdı"
olur. Aşağıdaki ölçüm bir **modeldir**, bölgesel ölçüm ağı **kurgudur** ve süreç adları ürün değil
**tür** adıdır. Şüpheli kalemler yalnız **çift** olarak anılır; hiçbir komut, betik ya da kullanım
biçimi yazılmaz.

- **SG11.** Örneklem bir günün süreç oluşturma kaydından 5.110 satırdır ve 8 makineyi kapsar. Filo
  hacmi ilk dersteki makine başına 38.000 kayıt varsayımından ölçeklenir.
- **SG12.** Taban çizgisi, öğrenme döneminde görülmüş 16 (üst, alt) çiftidir. Bir çift taban
  çizgisinde yoksa "yeni çift" sayılır.
- **SG13.** Kural 1 yalnız alt sürecin adına bakar ve üç adı ilgi çekici sayar. Kural 2 (üst, alt)
  çiftinin taban çizgisinde olup olmadığına bakar. Kurallar etiket alanını görmez.
- **SG14.** Modelin bildiği doğru şudur: dört yeni çift meşru bir yeniliktir, beş yeni çift
  şüphelidir. Şüpheli kalemlerin bir bölümünün başka bir kaynakta izi vardır; bu iz ilk dersteki
  kapsam tablosundan okunur.
- **SG15.** Kayıt boyutu 480 bayttır ve saklama karşılaştırması 90 gün üzerinden yapılır.

#### Düz Liste ve Süreç Ağacı

```js
// surec.mjs — surec olusturma kaydi orneklemi ve iki kural: ad listesi ile ust surec cifti.
// MODELDIR; surec adlari urun degil TUR adidir. Kurallar yalniz ust/alt/makine alanlarini okur;
// etiket alani modelin dogrusudur ve kurallara verilmez.
export const TOHUM = 20260401;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r = uretec(TOHUM);

// Taban cizgisi: ogrenme doneminde gorulmus (ust, alt) cifti ve gunluk sayisi.
export const TABAN = [
  ["oturum-yoneticisi", "kabuk", 620], ["kabuk", "olcum-istemcisi", 840],
  ["kabuk", "arsivleyici", 180], ["kabuk", "ag-aktarim", 210],
  ["zamanlayici", "betik-yorumlayici", 460], ["zamanlayici", "yedekleme", 120],
  ["yonetim-ajani", "paket-yoneticisi", 90], ["yonetim-ajani", "betik-yorumlayici", 260],
  ["servis-yoneticisi", "olcum-toplayici", 40], ["olcum-toplayici", "olcum-istemcisi", 1300],
  ["belge-isleyici", "yazdirma-yardimcisi", 70], ["posta-istemcisi", "belge-isleyici", 150],
  ["tarayici", "belge-isleyici", 130], ["paket-yoneticisi", "kurulum-kancasi", 210],
  ["yedekleme", "arsivleyici", 260], ["kurulum-kancasi", "kabuk", 130],
];
// Taban cizgisinde olmayan cift: dort mesru yenilik, bes supheli kalem.
// "iz" alani: kalemin etkisini goren BASKA kaynak (ilk dersin kapsam tablosu), yoksa null.
export const YENI = [
  ["yonetim-ajani", "ag-aktarim", 14, "mesru-yenilik", null],
  ["zamanlayici", "arsivleyici", 6, "mesru-yenilik", null],
  ["kabuk", "paket-yoneticisi", 9, "mesru-yenilik", "paket ve yukleme kaydi"],
  ["yedekleme", "ag-aktarim", 2, "mesru-yenilik", null],
  ["belge-isleyici", "betik-yorumlayici", 2, "supheli", null],
  ["posta-istemcisi", "kabuk", 1, "supheli", null],
  ["olcum-toplayici", "arsivleyici", 3, "supheli", null],
  ["yazdirma-yardimcisi", "kabuk", 1, "supheli", "zamanlayici kaydi"],
  ["tarayici", "betik-yorumlayici", 2, "supheli", "sistem olay gunlugu"],
];
export const MAKINE = 8;

const kayitlar = [];
const ekle = (ust, alt, etiket) => kayitlar.push({
  t: Math.floor(r() * 86400), makine: `uc-${String(1 + Math.floor(r() * MAKINE))
    .padStart(3, "0")}`, ust, alt, etiket });
for (const [ust, alt, n] of TABAN) for (let i = 0; i < n; i++) ekle(ust, alt, "taban");
for (const [ust, alt, n, tur] of YENI) for (let i = 0; i < n; i++) ekle(ust, alt, tur);
kayitlar.sort((a, b) => a.t - b.t);
export const KAYIT = kayitlar;

// Kural 1: yalniz alt surecin adina bakar.
export const ILGI = ["kabuk", "betik-yorumlayici", "ag-aktarim"];
// Kural 2: (ust, alt) cifti taban cizgisinde mi.
const tabanKume = new Set(TABAN.map(([u, a]) => `${u}>${a}`));
export const cift = (k) => `${k.ust}>${k.alt}`;
export const yeniCift = (k) => !tabanKume.has(cift(k));
export const supheliCift = new Set(YENI.filter((y) => y[3] === "supheli")
  .map(([u, a]) => `${u}>${a}`));

if (import.meta.url === `file://${process.argv[1]}`) {
  const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
    : String(v).padEnd(B[0]))).join("");
  const yz = gen([42, 8, 10, 18, 24]);
  console.log(`model (tohum ${TOHUM}): ${KAYIT.length} surec olusturma kaydi orneklemi, ` +
    `${MAKINE} makine, ${new Set(KAYIT.map(cift)).size} ayri (ust, alt) cifti (kurgu)`);
  const ad = KAYIT.filter((k) => ILGI.includes(k.alt));
  const agac = KAYIT.filter(yeniCift);
  console.log(`kural 1 (yalniz alt surec adi): ${ad.length} kayit isaretleniyor, ` +
    `${new Set(ad.map(cift)).size} ayri cift`);
  console.log(`kural 2 (taban cizgisi disi cift): ${agac.length} kayit, ` +
    `${new Set(agac.map(cift)).size} ayri cift`);
  console.log("\n" + yz(["taban cizgisi disi cift", "kayit", "makine", "kural 1 gorur mu",
    "baska kaynakta izi"]));
  for (const [u, a, , tur, iz] of YENI) {
    const l = KAYIT.filter((k) => cift(k) === `${u}>${a}`);
    console.log(yz([`${u} > ${a}`, l.length, new Set(l.map((k) => k.makine)).size,
      ILGI.includes(a) ? "evet" : "hayir", iz ?? "yok"]));
  }
  const seyrek = [...new Set(agac.map(cift))]
    .filter((c) => agac.filter((k) => cift(k) === c).length <= 3);
  console.log(`\nyeni VE seyrek (3 kayit ve alti) cift: ${seyrek.length}; bunlarin ` +
    `${seyrek.filter((c) => supheliCift.has(c)).length} tanesi supheli kalemdir, ` +
    `${seyrek.filter((c) => !supheliCift.has(c)).length} tanesi mesru yeniliktir`);
  console.log(`bes supheli kalemin ${YENI.filter((y) => y[3] === "supheli" && y[4]).length} ` +
    `tanesinin baska bir kaynakta izi var; ` +
    `${YENI.filter((y) => y[3] === "supheli" && !y[4]).length} tanesi yalnizca surec ` +
    `olusturma kaydinda gorunuyor`);
}
```

```
model (tohum 20260401): 5110 surec olusturma kaydi orneklemi, 8 makine, 25 ayri (ust, alt) cifti (kurgu)
kural 1 (yalniz alt surec adi): 1702 kayit isaretleniyor, 11 ayri cift
kural 2 (taban cizgisi disi cift): 40 kayit, 9 ayri cift

taban cizgisi disi cift                      kayit    makine  kural 1 gorur mu      baska kaynakta izi
yonetim-ajani > ag-aktarim                      14         6              evet                     yok
zamanlayici > arsivleyici                        6         5             hayir                     yok
kabuk > paket-yoneticisi                         9         6             hayir  paket ve yukleme kaydi
yedekleme > ag-aktarim                           2         2              evet                     yok
belge-isleyici > betik-yorumlayici               2         1              evet                     yok
posta-istemcisi > kabuk                          1         1              evet                     yok
olcum-toplayici > arsivleyici                    3         3             hayir                     yok
yazdirma-yardimcisi > kabuk                      1         1              evet       zamanlayici kaydi
tarayici > betik-yorumlayici                     2         2              evet     sistem olay gunlugu

yeni VE seyrek (3 kayit ve alti) cift: 6; bunlarin 5 tanesi supheli kalemdir, 1 tanesi mesru yeniliktir
bes supheli kalemin 2 tanesinin baska bir kaynakta izi var; 3 tanesi yalnizca surec olusturma kaydinda gorunuyor
```

İki kuralın çıktısı arasındaki oran dersin ilk sayısıdır. Yalnız alt sürecin adına bakan kural 5.110
kaydın **1.702'sini** işaretliyor, yani üçte birini. Bunun nedeni işaretlenen adların gerçekten
şüpheli olması değil, kurumun bu araçları gün boyu meşru biçimde kullanmasıdır: kabuk oturum
yöneticisinden 620 kez, betik yorumlayıcı zamanlayıcıdan 460 kez, ağ aktarım aracı kabuktan 210 kez
başlıyor. Bir uyarı listesi olarak bu sayı işe yaramaz.

Aynı kayıt kümesi üst süreçle birlikte okunduğunda 1.702 kayıt **40'a**, on bir çift dokuza iniyor.
Değişen tek şey ölçütün alan sayısıdır: bir yerine iki. Süreç ağacının verdiği şey, bir aracın
çalışmış olmasının değil, **beklenmeyen bir üstten** çalışmış olmasının sayılabilmesidir.

Tablo bu dokuz çiftin ikiye ayrıldığını gösteriyor. Dördü meşru yeniliktir — yeni bir dağıtım
adımı, yeni bir yedek işi, yöneticinin elle kurulum yapması. Beşi şüphelidir ve ortak yanları
biçimlerinde: belge işleyen, posta alan ya da tarayan bir sürecin altında bir yorumlayıcı ya da
kabuk, dış veriye dokunan bir servisin altında bir arşivleyici. Bunlar ayrı ayrı hiçbir yasak komut
içermez; şüpheli olan **konumdur**.

Sonuncu iki satır iki ayrı sınırı yazıyor. Yeni ve seyrek olma ölçütü altı çift veriyor; beşi
şüpheli kalemdir, biri meşru yeniliktir — yani bu ölçüt beş kalemi de ayırıyor ve karşılığında bir
gereksiz inceleme üretiyor. İkinci sınır daha ağırdır: beş şüpheli kalemin **üçünün başka hiçbir
kaynakta izi yoktur**. Kayıt kapalıysa o üç kalem için elde hiçbir şey kalmaz. Kalan ikisinden biri
yalnız zamanlayıcı kaydında görünür ve o kaynak da ilk dersin tablosunda varsayılan olarak
kapalıdır.

Bu ölçütün meşru işe bedeli tabloda dördüncü sütun olarak durmuyor, ama sayılabilir. Bir günde
dokuz yeni çift çıktı ve **dördü** taban çizgisine eklenmesi gereken meşru yeniliktir: yeni bir
dağıtım aracı, yeni bir yedek işi, bir yöneticinin elle kurulumu. Uyarıların yaklaşık yarısı bir
tehdit değil, bir bakım kalemidir ve her biri bir kişinin bakıp karar vermesini ister. Taban
çizgisi bir kez yazılıp bırakılan bir dosya değildir; kurumdaki her yazılım değişikliği onu
eskitir. Bedeli ödenmezse ölçüt kendiliğinden bozulur — biriken meşru yenilikler listeyi
kalabalıklaştırır ve bir süre sonra kimse dokuz satıra bakmaz.

#### Kaydın Hacmi ve Saklama Kararı

```js
// hacim.mjs — uc saklama politikasinin hacmi, tuttugu supheli kalem ve yanitladigi soru.
import { KAYIT, ILGI, yeniCift, cift, supheliCift } from "./surec.mjs";

const FILO = 268, GUNLUK = 38000, BAYT = 480;      // onceki dersteki makine basina kayit
const POLITIKA = [
  ["hepsini sakla", () => true],
  ["yalniz ilgi ceken ad", (k) => ILGI.includes(k.alt)],
  ["yalniz taban disi cift", yeniCift],
];
// Sorular tam kume uzerinde yanitlanir; suzulmus kumede ayni yaniti veriyorsa "evet".
const SORU = [
  ["belge isleyici baska ne calistirdi",
    (l) => new Set(l.filter((k) => k.ust === "belge-isleyici").map((k) => k.alt)).size],
  ["arsivleyici cifti ilk hangi makinede",
    (l) => l.filter((k) => cift(k) === "olcum-toplayici>arsivleyici")
      .sort((a, b) => a.t - b.t)[0]?.makine ?? "-"],
  ["olcum istemcisi kac kez calisti",
    (l) => l.filter((k) => k.alt === "olcum-istemcisi").length],
  ["kabugu kac ayri ust surec calistirdi",
    (l) => new Set(l.filter((k) => k.alt === "kabuk").map((k) => k.ust)).size],
];
const tamYanit = SORU.map(([, f]) => f(KAYIT));

const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const yz = gen([25, 10, 9, 15, 14, 13, 10]);
const gib = (n) => (n * BAYT) / 1024 ** 3;

console.log(`filo ${FILO} makine x ${GUNLUK} kayit/gun = ` +
  `${(FILO * GUNLUK).toLocaleString("tr-TR")} kayit/gun, kayit ${BAYT} bayt`);
console.log(yz(["politika", "orneklem", "oran", "filo kayit/gun", "GiB/gun", "90 gun GiB",
  "supheli"]));
const yanitlar = [];
for (const [ad, suz] of POLITIKA) {
  const l = KAYIT.filter(suz);
  const oran = l.length / KAYIT.length;
  const s = new Set(l.filter((k) => supheliCift.has(cift(k))).map(cift)).size;
  yanitlar.push(SORU.map(([, f], i) => f(l) === tamYanit[i]));
  console.log(yz([ad, l.length, `%${(100 * oran).toFixed(1)}`,
    Math.round(FILO * GUNLUK * oran).toLocaleString("tr-TR"),
    gib(FILO * GUNLUK * oran).toFixed(2), Math.round(gib(FILO * GUNLUK * oran) * 90),
    `${s}/${supheliCift.size}`]));
}
const ys = gen([38, 15, 22, 24]);
console.log("\n" + ys(["sorusturma sorusu", ...POLITIKA.map((p) => p[0])]));
for (const [i, [ad]] of SORU.entries())
  console.log(ys([ad, ...yanitlar.map((y) => (y[i] ? "evet" : "hayir"))]));
console.log(POLITIKA.map((p, j) => `${p[0]}: ` +
  `${yanitlar[j].filter(Boolean).length}/${SORU.length}`).join("; "));
const tam = gib(FILO * GUNLUK), dar = gib(FILO * GUNLUK * KAYIT.filter(yeniCift).length /
  KAYIT.length);
console.log(`\ntaban disi cifti saklamak hacmi ${Math.round(tam / dar)} kata boluyor ve bes ` +
  `supheli kalemin besini de tutuyor; bedeli dort sorudan ucunun yanitsiz kalmasidir`);
```

```
filo 268 makine x 38000 kayit/gun = 10.184.000 kayit/gun, kayit 480 bayt
politika                   orneklem     oran filo kayit/gun       GiB/gun   90 gun GiB   supheli
hepsini sakla                  5110   %100.0     10.184.000          4.55          410       5/5
yalniz ilgi ceken ad           1702    %33.3      3.392.009          1.52          136       4/5
yalniz taban disi cift           40     %0.8         79.718          0.04            3       5/5

sorusturma sorusu                       hepsini sakla  yalniz ilgi ceken ad  yalniz taban disi cift
belge isleyici baska ne calistirdi               evet                 hayir                   hayir
arsivleyici cifti ilk hangi makinede             evet                 hayir                    evet
olcum istemcisi kac kez calisti                  evet                 hayir                   hayir
kabugu kac ayri ust surec calistirdi             evet                  evet                   hayir
hepsini sakla: 4/4; yalniz ilgi ceken ad: 1/4; yalniz taban disi cift: 1/4

taban disi cifti saklamak hacmi 128 kata boluyor ve bes supheli kalemin besini de tutuyor; bedeli dort sorudan ucunun yanitsiz kalmasidir
```

Hacim satırı bu kaydın neden varsayılan olarak kapalı olduğunu açıklıyor. Filo günde 10,18 milyon
süreç oluşturma kaydı üretiyor; bu, günde 4,55 GiB ve doksan günde 410 GiB eder. Rakam tek başına
karşılanamaz değildir, ama ilk dersteki öteki altı kaynağın toplamının yanında büyüktür ve bu kayıt
her makinede tek tek açılmalıdır.

Orta satır saklamayı ada göre daraltmanın ne verdiğini gösteriyor: hacim üçte bire iniyor ve beş
şüpheli kalemin **dördü** kalıyor. Kaybedilen kalem, adı ilgi listesinde olmayan bir arşivleyicidir
— yani daraltmayı ada göre yapmak, tam olarak listeye yazılmamış aracı silmek demektir. Alt satır
çift ölçütünü kullanıyor: hacim 128'e bölünüyor, beş kalemin beşi de kalıyor.

Alttaki tablo bu ucuzluğun neye mal olduğunu ölçüyor. Dört soruşturma sorusu tam kümede
yanıtlanıyor; taban çizgisi dışı çifti saklayan politika yalnız birini yanıtlıyor. Kalanları
yanıtlayamaz, çünkü sildiği şey **beklenen** kayıtlardır: bir üst sürecin o gün başka ne
çalıştırdığı, bir kalemin kaç kez koştuğu ve bir aracı kaç ayrı üstün başlattığı yalnız beklenen
kayıtların içinde durur.

Bu iki tablo birlikte kaydın gerçek kararını veriyor. Tespit için taban çizgisi dışı çiftler yeter
ve çok ucuzdur; **soruşturma** için tam kayıt gerekir ve doksan günde 410 GiB tutar. İkisi aynı
karar değildir: uyarı üretmek ile bir uyarıdan sonra soru sorabilmek ayrı ayrı fiyatlanır ve ada
göre daraltma ikisinde de en kötü seçenektir — hacmin üçte birini ödeyip dört sorunun birini
yanıtlıyor ve beş kalemin birini kaybediyor.

#### Özet

- Yalnız alt süreç adına bakan kural 5.110 kaydın 1.702'sini işaretliyor; aynı küme üst süreç
  bağlamıyla okunduğunda 40 kayda ve 9 çifte iniyor.
- Dokuz taban çizgisi dışı çiftin dördü meşru yeniliktir, beşi şüphelidir; şüpheli olan komut değil
  **konumdur** — bir kalemin hangi üst sürecin altında çalıştığıdır.
- Yeni ve seyrek olma ölçütü altı çift veriyor: beş şüpheli kalemin beşi de içinde, karşılığında
  bir gereksiz inceleme.
- Beş şüpheli kalemin üçünün başka hiçbir kaynakta izi yok; biri yalnız varsayılan olarak kapalı
  olan zamanlayıcı kaydında görünüyor.
- Filo günde 10,18 milyon kayıt ve 4,55 GiB üretiyor; taban çizgisi dışı çifti saklamak hacmi 128'e
  bölüyor ve beş kalemi de tutuyor, ama dört soruşturma sorusunun üçünü yanıtsız bırakıyor.

#### Sonraki Adım

Bu konunun üç dersi de aynı sessiz varsayımı taşıdı: kayıt orada duruyor ve doğru. Oysa ölçülen
kayıtların tamamı, üzerinde kalem çalıştıran makinenin kendi diskinde üretiliyor. Kod bir kez uçta
çalıştıysa, o kayıtlar da onun erişebildiği yerdedir. Son ders bu varsayımı sınar: kurcalanmış bir
günlük kümesinde kaç kaydın silindiği ve kaçının değiştirildiği bir karma zinciriyle tespit edilir,
zincirin göremediği durum adıyla yazılır ve merkezîleştirmenin kapattığı pencere ölçülür.

### Günlük Bütünlüğü

Source: https://academia.sh/tr/kurslar/uc-nokta-guvenligi/gunluk-butunlugu

1.200 kayıtlık bir günlük zinciri dört kurcalama biçimine karşı sınanır: silme 744. sırada ve 11 sıra boşluğuyla, özeti tazelenmiş değişiklik 839. sırada yakalanıyor, zincir yeniden hesaplandığında yalnız sıra boşluğu kalıyor, sıra da yeniden verildiğinde yerel doğrulama temiz diyor. Merkezdeki kopya 13 kurcalanan kaydın günlük aktarımda 0'ını, saat başı aktarımda 11'ini, beş saniyelik gönderimde 13'ünü gösteriyor; filoda pencere hiçbir aralıkta kapanmıyor, çünkü 130 makine çevrimdışı kalıyor.

Bir önceki ders süreç oluşturma kaydını açtı ve üst süreç bağlamının 1.702 işareti 40'a
indirdiğini gösterdi. Bu konunun üç dersi de aynı sessiz varsayımı taşıdı: kayıt orada duruyor ve
doğru. Oysa sayılan kayıtların tamamı, üzerinde kalem çalıştıran makinenin kendi diskinde
üretiliyor ve bu kursun başlangıç varsayımı koda bir kez uçta çalışma izni veriyordu. Kayıt da o
kodun erişebildiği yerdedir.

Bu ders o varsayımı sınar. Bir **karma zinciri** (hash chain) kaydın kendi içinde tutarlı olduğunu
gösterir: her kaydın özeti sırayı, bir önceki özeti ve gövdeyi kapsar, dolayısıyla ortadan bir
kaydı çıkarmak ya da değiştirmek zinciri kırar. Sorulacak soru bunun **neye karşı** işe
yaradığıdır. Ölçüm bir **modeldir**, bölgesel ölçüm ağı **kurgudur** ve kurcalamanın **yöntemi
yazılmaz**, yalnız sonucu modellenir. **Başkasına ait bir sistemde kayıt üzerinde işlem yapmak —
silmek, değiştirmek, taşımak — yazılı yetki ve tanımlı kapsam olmadan hem yasadışı hem meslek
dışıdır.**

- **SG16.** Bir uçta bir günün günlüğü 1.200 kayıttır. Her kayıt sıra numarası, gövde ve özet
  taşır; özet `node:crypto` ile sıra, bir önceki özet ve gövdeden hesaplanır. Yapı Backend Üretim
  kursundaki zincirleme özetle aynıdır, ölçülen soru farklıdır.
- **SG17.** Kurcalama anı 61.550. saniyedir ve kurcalanan aralık 54.000. saniyeden başlar.
  Aralıktan 11 kayıt siliniyor, 2 kaydın gövdesi değişiyor.
- **SG18.** Dört kurcalama biçimi ayrılır: **A** silme, zincire dokunmadan; **B** değiştirme,
  yalnız o kaydın özetini tazeleyerek; **C** silme, zinciri yeniden hesaplayarak; **D** silme, sıra
  numaralarını da yeniden vererek.
- **SG19.** Merkezî toplayıcı kaydın bir kopyasını tutar ve karşılaştırma kaydın değişmeyen kalem
  kimliği üzerinden yapılır. Merkeze ulaşmamış kayıt karşılaştırılamaz.
- **SG20.** Filo dört gruptur ve saha dizüstüleri günde 23.400 saniye çevrimdışıdır. Gönderim
  başına ek yük 8 KiB'dir; bütün sayılar kurgudur.

#### Zincirin Gördüğü Dört Biçim

```js
// zincir.mjs — uc noktada uretilen gunluk zinciri, dort kurcalama bicimi ve yerel dogrulama.
// MODELDIR; kurcalama YONTEMI yazilmaz, yalnizca sonucu modellenir.
import { createHash } from "node:crypto";

export const TOHUM = 20260515, N = 1200, T = 61550;   // kurcalama ani (saniye)
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r = uretec(TOHUM);
const KAYNAK = ["surec-olusturma", "kimlik-dogrulama", "sistem-olay", "zamanlayici"];

export const ozet = (sira, once, govde) =>
  createHash("sha256").update(`${sira}|${once}|${govde}`).digest("hex").slice(0, 16);

// Zincir: her kaydin ozeti sira, bir onceki ozet ve govdeden hesaplanir.
export function zincirle(kayitlar) {
  let once = "baslangic";
  return kayitlar.map((k) => { once = ozet(k.sira, once, k.govde); return { ...k, ozet: once }; });
}
const zamanlar = Array.from({ length: N }, () => Math.floor(r() * 86400)).sort((a, b) => a - b);
export const GUNLUK = zincirle(zamanlar.map((t, i) => ({
  sira: i + 1, t,
  govde: JSON.stringify({ t, kaynak: KAYNAK[Math.floor(r() * 4)], kalem: 100 + i }),
})));

// Kurcalama araligi: son etkinlik penceresi. Bu araliktan bir bolum kayit siliniyor,
// son iki kayit degisiyor.
const aralik = GUNLUK.filter((k) => k.t >= 54000 && k.t <= T);
export const SILINEN = aralik.filter((_, i) => i % 9 === 0).slice(0, 12).map((k) => k.sira);
export const DEGISEN = aralik.filter((k) => !SILINEN.includes(k.sira)).slice(-2)
  .map((k) => k.sira);
// Degistirme kaydin zamanini kaydiriyor; kalem kimligi degismiyor.
const bozuk = (k) => JSON.stringify({ ...JSON.parse(k.govde), t: JSON.parse(k.govde).t + 900 });

// A: silindi, zincire dokunulmadi. B: degisti, yalniz o kaydin ozeti tazelendi.
// C: silindi, zincir yeniden hesaplandi. D: silindi, sira da yeniden verildi.
export const BICIM = {
  A: () => GUNLUK.filter((k) => !SILINEN.includes(k.sira)),
  B: () => GUNLUK.map((k) => (DEGISEN.includes(k.sira)
    ? { ...k, govde: bozuk(k), ozet: ozet(k.sira, GUNLUK[k.sira - 2].ozet, bozuk(k)) } : k)),
  C: () => zincirle(GUNLUK.filter((k) => !SILINEN.includes(k.sira))
    .map((k) => (DEGISEN.includes(k.sira) ? { ...k, govde: bozuk(k) } : k))),
  D: () => zincirle(GUNLUK.filter((k) => !SILINEN.includes(k.sira))
    .map((k, i) => ({ ...k, sira: i + 1,
      govde: DEGISEN.includes(k.sira) ? bozuk(k) : k.govde }))),
};

// Yerel dogrulama: zincir bastan yurutulur, ilk uyusmazligin sirasi dondurulur (yoksa 0).
export function dogrula(kayitlar) {
  let once = "baslangic";
  for (const k of kayitlar) {
    once = ozet(k.sira, once, k.govde);
    if (once !== k.ozet) return k.sira;
  }
  return 0;
}
// Sira bosluklari: silinen kayitlarin birakabilecegi tek yerel iz.
export const bosluk = (kayitlar) => kayitlar.reduce((a, k, i) =>
  (i && k.sira !== kayitlar[i - 1].sira + 1 ? a + k.sira - kayitlar[i - 1].sira - 1 : a), 0);

if (import.meta.url === `file://${process.argv[1]}`) {
  const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
    : String(v).padEnd(B[0]))).join("");
  const yz = gen([42, 8, 16, 14, 15]);
  console.log(`model (tohum ${TOHUM}): ${N} kayitlik gunluk zinciri, kurcalama ani ${T}. saniye`);
  console.log(`kurcalanan aralik ${SILINEN.length} silinen, ${DEGISEN.length} degisen kayit ` +
    `(sira ${SILINEN[0]}-${SILINEN.at(-1)} arasi ve ${DEGISEN.join(", ")})`);
  console.log("\n" + yz(["kurcalama bicimi", "kayit", "ilk uyusmazlik", "sira bosluk",
    "yerel sonuc"]));
  for (const [ad, aciklama] of [["A", "kayit silindi, zincire dokunulmadi"],
    ["B", "kayit degisti, ozeti tazelendi"],
    ["C", "kayit silindi, zincir yeniden hesaplandi"],
    ["D", "silindi, sira ve zincir yeniden verildi"]]) {
    const l = BICIM[ad]();
    const u = dogrula(l), b = bosluk(l);
    console.log(yz([`${ad}: ${aciklama}`, l.length, u || "-", b || "-",
      u || b ? "kurcalanmis" : "temiz"]));
  }
}
```

```
model (tohum 20260515): 1200 kayitlik gunluk zinciri, kurcalama ani 61550. saniye
kurcalanan aralik 11 silinen, 2 degisen kayit (sira 743-833 arasi ve 838, 839)

kurcalama bicimi                             kayit  ilk uyusmazlik   sira bosluk    yerel sonuc
A: kayit silindi, zincire dokunulmadi         1189             744            11    kurcalanmis
B: kayit degisti, ozeti tazelendi             1200             839             -    kurcalanmis
C: kayit silindi, zincir yeniden hesaplandi    1189               -            11    kurcalanmis
D: silindi, sira ve zincir yeniden verildi    1189               -             -          temiz
```

Dört satır bir merdiven kuruyor. İlk biçimde kayıtlar silinmiş ve zincire dokunulmamıştır; iki
bağımsız işaret birden çıkıyor — doğrulama 744. sırada duruyor ve 11 sıra boşluğu sayılıyor.
İkincisinde iki bitişik kaydın gövdesi değişmiş ve yalnız o iki kaydın özeti yeniden
hesaplanmıştır; uyuşmazlık ilk değişen kayıtta değil, **ondan sonrakinde** — 839. sırada — çıkıyor,
çünkü o kaydın özeti bir öncekinin eski özetine bağlıdır. Zincirin kazandırdığı tam olarak budur:
bir
kaydı tutarlı kılmak, ondan sonraki bütün kayıtları da yeniden yazmayı gerektirir.

Üçüncü biçimde zincirin tamamı yeniden hesaplanmıştır ve doğrulama hiçbir uyuşmazlık bulmuyor.
Geriye tek iz kalıyor: 11 sıra boşluğu. Dördüncü biçimde sıra numaraları da yeniden verilmiştir ve
o iz de kayboluyor — yerel doğrulama **temiz** diyor. On bir kayıt silinmiş, iki kaydın zamanı
kaydırılmıştır ve makinenin üzerinde bunu gösteren hiçbir şey yoktur.

Sonuç bir cümleye iniyor: aynı makinede üretilip aynı makinede doğrulanan bir zincir, o makineyi
elinde tutana karşı bütünlük kanıtı değil, yalnız **tutarlılık** kanıtıdır. Gerçek katkısı kısmi
kurcalamayı olanaksız kılmasıdır: kurcalayan ya hiç dokunmayacak ya da kaydın tamamını yeniden
üretecektir.

#### Merkezdeki Kopya ve Aktarım Penceresi

```js
// merkez.mjs — merkezdeki kopya ile karsilastirma ve aktarim penceresinin filo bedeli.
import { GUNLUK, BICIM, SILINEN, DEGISEN, T } from "./zincir.mjs";

const yerel = BICIM.D();                            // yerel dogrulamanin temiz gordugu kume
const kalem = (k) => JSON.parse(k.govde).kalem;     // kayitin degismeyen kimligi
const ARALIK = [["gunde bir", 86400], ["4 saat", 14400], ["saat basi", 3600],
  ["5 dakika", 300], ["5 saniye", 5]];

const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j])
  : String(v).padEnd(B[0]))).join("");
const y1 = gen([13, 11, 13, 15, 19, 15]);
const y2 = gen([17, 10, 11, 13, 16, 16, 13]);

console.log(`kurcalama ani ${T}. saniye; ${SILINEN.length} silinen ve ${DEGISEN.length} ` +
  `degisen kayit var, yerel zincir bunlarin hicbirini gostermiyor`);
console.log(y1(["aralik", "merkezde", "pencerede", "tespit silme", "tespit degisiklik",
  "gorunmeyen"]));
for (const [ad, w] of ARALIK) {
  const sonAktarim = Math.floor(T / w) * w;
  const merkez = GUNLUK.filter((k) => k.t <= sonAktarim);
  const yerelKalem = new Map(yerel.map((k) => [kalem(k), k.govde]));
  const silme = merkez.filter((k) => !yerelKalem.has(kalem(k))).length;
  const degis = merkez.filter((k) => yerelKalem.has(kalem(k)) &&
    yerelKalem.get(kalem(k)) !== k.govde).length;
  console.log(y1([ad, merkez.length, GUNLUK.length - merkez.length,
    `${silme}/${SILINEN.length}`, `${degis}/${DEGISEN.length}`,
    SILINEN.length + DEGISEN.length - silme - degis]));
}

// Filo: aktarim araligini kisaltmanin bedeli ve kapatilamayan pencere.
const GRUP = [["saha dizustu", 84, 41000, 23400], ["sube ucu", 46, 39000, 3600],
  ["sayac toplayici", 120, 44000, 0], ["merkezi isleme", 18, 52000, 0]];
const EK = 8192;                                    // gonderim basina ek yuk (bayt)
console.log("\n" + y2(["aktarim araligi", "gonderim", "filo/gun", "ek yuk MiB",
  "saha penceresi", "riskteki kayit", "kapanmayan"]));
for (const [ad, w] of ARALIK) {
  const bag = Math.round(86400 / w);
  const filo = GRUP.reduce((a, g) => a + g[1] * bag, 0);
  const risk = GRUP.reduce((a, g) => a + g[1] * g[2] * Math.max(w, g[3]) / 86400, 0);
  const kapanmayan = GRUP.filter((g) => g[3] > w).reduce((a, g) => a + g[1], 0);
  console.log(y2([ad, bag, filo.toLocaleString("tr-TR"), Math.round(filo * EK / 1048576),
    `${Math.max(w, GRUP[0][3])} sn`, Math.round(risk).toLocaleString("tr-TR"), kapanmayan]));
}
console.log(`\naraligi gunde birden 5 dakikaya cekmek gonderim sayisini 288 katina cikariyor; ` +
  `saha dizustulerinde etkin pencere ${GRUP[0][3]} saniyenin altina inmiyor`);
```

```
kurcalama ani 61550. saniye; 11 silinen ve 2 degisen kayit var, yerel zincir bunlarin hicbirini gostermiyor
aralik          merkezde    pencerede   tespit silme  tespit degisiklik     gorunmeyen
gunde bir              0         1200           0/11                0/2             13
4 saat               789          411           6/11                0/2              7
saat basi            834          366          11/11                0/2              2
5 dakika             837          363          11/11                0/2              2
5 saniye             839          361          11/11                2/2              0

aktarim araligi    gonderim   filo/gun   ek yuk MiB  saha penceresi  riskteki kayit   kapanmayan
gunde bir                 1        268            2        86400 sn      11.454.000            0
4 saat                    6      1.608           13        23400 sn       2.267.750           84
saat basi                24      6.432           50        23400 sn       1.266.500           84
5 dakika                288     77.184          603        23400 sn       1.029.083          130
5 saniye              17280  4.631.040        36180        23400 sn       1.007.860          130

araligi gunde birden 5 dakikaya cekmek gonderim sayisini 288 katina cikariyor; saha dizustulerinde etkin pencere 23400 saniyenin altina inmiyor
```

Üstteki tablo merkezdeki kopyanın neyi kapattığını sayıyor ve kapattığı miktar tam olarak
**aktarım penceresinin dışında kalan kayıt sayısıdır**. Günde bir aktarımda merkezde o günden hiç
kayıt yoktur ve 13 kurcalanan kalemin 13'ü görünmez kalır. Dört saatlik aralıkta 11 silmenin altısı
çıkıyor; saat başı aktarımda 11'i de çıkıyor. Değiştirilen iki kayıt yalnız beş saniyelik
gönderimde görünüyor, çünkü ikisi de son gönderimden sonraya düşüyor.

Bu satırların hepsi yerel zincirin **temiz** dediği kümede duruyor. Karşılaştırmayı mümkün kılan
ikinci bir kopyadır, zincir değil.

Alttaki tablo pencereyi kısaltmanın faturasını yazıyor. Günde bir gönderimden beş dakikaya inmek
gönderim sayısını 288 katına çıkarıyor — filoda 268'den 77.184'e — ve gönderim ek yükü günde 603
MiB tutuyor. Beş saniyelik gönderimde aynı ek yük 35 GiB olur.

Son iki sütun asıl sınırı gösteriyor. Riskteki kayıt sayısı 11,45 milyondan 1,03 milyona iniyor ve
orada duruyor: aralığı beş dakikadan beş saniyeye çekmek bu sayıyı yalnız yüzde iki azaltıyor.
Nedeni dördüncü sütundur — saha dizüstülerinin etkin penceresi hiçbir aralıkta 23.400 saniyenin
altına inmiyor, çünkü o makineler günün altı buçuk saatini çevrimdışı geçiriyor. Beş dakikalık
aralıkta 130 makinede pencere hiç kapanmıyor. **Merkezîleştirmenin kapattığı pencere bir
yapılandırma değil, bir bağlanabilirlik sınırıdır.**

Pencerenin içinde kalan kayıt için elde tek bir seçenek kalıyor ve o da bir mimari kalemidir:
kaydı, üreten makinenin değiştiremeyeceği bir yere yazmak — yalnız ekleme yapılabilen bir ortama ya
da anahtarı uçta bulunmayan bir imzayla. Bu, pencereyi kapatmaz; pencere içindeki kaydın
**sessizce** değişmesini engeller.

#### Özet

- Karma zinciri üç kurcalama biçimini yakalıyor: silme 744. sırada ve 11 sıra boşluğuyla,
  özeti tazelenmiş değişiklik 839. sırada, zincir yeniden hesaplandığında yalnız sıra boşluğuyla.
- Sıra numaraları da yeniden verildiğinde yerel doğrulama **temiz** diyor: aynı makinede üretilip
  aynı makinede doğrulanan bir zincir, o makineyi elinde tutana karşı tutarlılık kanıtıdır,
  bütünlük kanıtı değil.
- Merkezdeki kopya 13 kurcalanan kaydın günde bir aktarımda 0'ını, saat başı aktarımda 11'ini,
  beş saniyelik gönderimde 13'ünü gösteriyor; kapattığı miktar aktarım penceresinin dışında kalan
  kayıt sayısıdır.
- Aralığı günde birden beş dakikaya çekmek gönderimi 288 katına ve ek yükü günde 603 MiB'ye
  çıkarıyor; beş saniyede ek yük 35 GiB olur.
- Riskteki kayıt 11,45 milyondan 1,03 milyona iniyor ve orada kalıyor: 130 makinede pencere hiçbir
  aralıkta kapanmıyor, çünkü etkin pencereyi ayar değil çevrimdışı kalma süresi belirliyor.

#### Kurs Kapanışı

| Ders | Tutunma noktası | Kapanan / görünen | Meşru işe bedel |
|---|---|---|---|
| Sertleştirme İlkeleri | 101 kalem, 84 nokta | 40 kapanıyor, 44 görünür | 41 elle adım |
| Yama Yönetimi | 1.038 nokta, 12 duyuru | 0 kapanıyor, pencere 10,8'den 2,3 güne | 939 plan dışı kesinti |
| Yapılandırma Kıyaslamaları | 26 madde, 104 karar | 0 kapanıyor, 588 nokta daralıyor | 48 elle adım, 53 istisna |
| Uygulama İzin Listeleri | 1.038 nokta, 25 kalem | 972 kapanıyor, 66 açık | 7 kalem 208 makinede |
| Sanal Alan Kullanımı | 15 kalem, 4 yapılandırma | 0 kapanıyor, 8 kötüden 4'ü duruyor | 2 yanlış engel, 275 dakika |
| Disk Şifreleme | 1.038 nokta tanımı, 18 kalem | 936 kapanıyor, 102 açık | 204 anahtar kopyası, 14.112 dakika |
| Kötü Amaçlı Yazılım Türleri | 8 nokta türü, 10 tür | 8 tür duruyor, 2'si kalıyor | 130 meşru kalem |
| Kötü Amaçlı Yazılım Karşıtı | 20 kalem, 6 kötü | 7 nokta kapanıyor, uyarı kipinde görünür | 3 meşru iş, 7 uyarı |
| Uç Nokta Tespit ve Yanıt | 8 nokta türü, 7 kaynak | 0 kapanıyor, 6 görünür, 2 kör | 19,5 gün pencere, 2 yeni nokta |
| Konak Tabanlı Güvenlik Duvarı | 729.252 yol, 290.772 bölge içi | 158.100 yol kapanıyor, 60 tür kayıtta | 2 meşru akış kesiliyor |
| Yaşayan Toprakta Saldırı | 14 araç, 7 yetenek | 0 kapanıyor, 6 koşumun 5'i ayrılıyor | 3 yanlış pozitif |
| Kalıcılık Mekanizmaları | 10 tür, 161 meşru kalem | 7,1 kapalı, 1,8 görünür, 1,2 karanlık | 36 kalem, 52 elle onay |
| Olay Günlükleri | 3.078 makine-tür çifti | 0 kapanıyor, 2.356 görünür, 250 kör | günde 10,2 milyon kayıt |
| Kimlik Doğrulama Günlükleri | 916 başarısızlık, 0 nokta | 0 kapanıyor, 216 olayın 10'u görünür | 5 yanlış pozitif, 9 giriş |
| Komut Satırı Denetimi | 8 tür adıyla, 5 şüpheli | 0 kapanıyor, 5'i ayrılıyor, 3'ü tek kaynakta | 90 günde 410 GiB |
| Günlük Bütünlüğü | 13 kurcalanan kayıt | 0 kapanıyor, 13'ü merkezde görünür | 1,03 milyon kayıt pencerede |

Üçüncü sütunu boş kalan tek bir satır yok ve ikinci sütunda "0 kapanıyor" yazan dokuz satır var.
Kursun kuralı bu iki gözlemden çıkıyor: **uç nokta güvenliği bir ürün listesi değil, otomatik
çalıştırılan kalemlerin sayısıdır; kapatılamayan her nokta en azından görünür kılınmalıdır, çünkü
görünmeyen nokta yok sayılmış noktadır.** Kapatma ile görünür kılmayı aynı sütuna yazan her ölçüm,
kendi kapsamını olduğundan geniş gösterir.

On altı ders boyunca ikinci sütun tek yönde ilerledi: sertleştirme kalem sayısını düşürdü, izin
listesi ve disk şifreleme büyük blokları kapattı, koruma katmanları kapatamadıklarını görünür
kılmaya başladı, son dört ders yalnız görünürlüğü ölçtü. Kalan sayı hep aynı biçimdeydi.

Bütün bu ölçüm boyunca sorulmamış bir soru var. Beş kurs boyunca hep savunma tarafından bakıldı ve
her denetimin neyi kaçırdığı tek tek sayıldı — kaçan yol, geçen iddia, açık kalan nokta, kör kalan
kayıt. Ama kaçırılan bu yolları **kimin, hangi sırayla ve neden** kullandığı hiç ele alınmadı.
Bir saldırgan neden bir noktayı seçip ötekini bırakır, hangi adımdan sonra hangisine geçer, ne
zaman durur? **M24/K06 Saldırı Teknikleri ve Tehdit Ortamı** kursu tam olarak bu soruyla başlar.

