---
title: 'Bulut ve Sanallaştırma Güvenliği'
source: 'https://academia.sh/tr/kurslar/bulut-guvenligi'
language: tr
updated: '2026-08-17T04:39:49+00:00'
license: 'CC BY-SA 4.0'
lessons: 12
outcomes:
    - 'Paylaşılan sorumluluk sınırını denetim listesine çevirir ve boşlukta kalan kalemi sayar'
    - 'Tek bir yanlış kalemden başlayan yayılma yarıçapını erişim grafiğinde hesaplar'
    - 'Bulut telemetrisiyle tespit kurar ve kanıt toplamanın konaktan farkını ölçer'
---

# Bulut ve Sanallaştırma Güvenliği

Kiralanmış altyapıda tek bir yanlış kalemden kaç kaleme ulaşıldığı: hizmet modellerine göre paylaşılan sorumluluğun denetim listesine çevrilmesi, sızan bir kimliğin doğrudan ve rol zinciriyle eriştiği kalem, ağ yalıtımı ile özel uç noktaların kapattığı yol, genel erişime açık depolama kalemlerinin maruz bıraktığı veri türü, şifreleme anahtarının sahipliğinin yayılma yarıçapına etkisi, şablon düzeyinde yakalanan ile ancak koşarken görülebilen hata, yönetim düzlemi denetim günlüklerinin gördüğü ve göremediği adım, sürekli yapılandırma duruş yönetimi, çok kiracılı ortamda konteyner ve hipervizör kaçışının yarıçapı, kısa ömürlü iş yüklerinde kaydın toplanabildiği pencere, kimlik bilgisi sızıntısı ve meta veri servisi kalıpları, bulutta kanıt toplamanın konaktan farkı.

## Bulut Güvenlik Modeli

Kiralanmış altyapıda tek bir yanlış kalemden kaç kaleme ulaşıldığının ölçülmesi: hizmet modeline göre denetim listesine yazılabilen ve boşlukta kalan kalem, sızan bir kimlikten doğrudan ve rol zinciriyle erişilen kalem, ağ yolunun kapattığı yürüyüş, genel erişime açık depolama kalemlerinin maruz bıraktığı veri türü, anahtar sahipliğinin yarıçapa etkisi ve şablon düzeyinde yakalanan ile ancak koşarken görülebilen kalem.

### Bulut Hizmet Modelleri ve Sorumluluk

Source: https://academia.sh/tr/kurslar/bulut-guvenligi/bulut-hizmet-modelleri-ve-sorumluluk

Paylaşılan sorumluluk sınırının denetim listesine çevrilmesi: 21 yanlış olabilir kalem üç hizmet modelinde sınıflandırılır, otomatik denetlenebilen kalem 15'ten 12 ve 7'ye inerken denetim listesi dışında kalan kalem 6'dan 9 ve 14'e çıkar, tohum ağırlığının %35'i %51 ve %66 olur, sahipsiz kalem 0'dan 2 ve 4'e yükselir ve hiçbir listenin okuyamadığı 28 birimlik kör nokta üç modelde de sabit kalır.

Bir önceki kurs kanıt hattını sonuna kadar kurdu ve her adımında aynı sessiz varsayımı taşıdı:
incelenecek makineye erişilebiliyor. Kiralanmış altyapıda o varsayım düşer. Donanım başkasınındır,
konak işletim sistemi görünmez, örneğin durduğu fiziksel makine adlandırılamaz. Bu, kanıt sorusunu
sonraya bırakır ve daha önce gelen bir soruyu öne çeker: **yanlış nerede olabilir ve o yanlış
kimin listesinde**.

Bu kurs tek bir ölçü kullanır: **yayılma yarıçapı** (blast radius) — tek bir kalem yanlışsa oradan
kaç kaleme ulaşıldığı. Yarıçabı ölçebilmek için önce yanlışın yerleşebileceği kalemlerin listesi
gerekir. **Paylaşılan sorumluluk** o listeyi ikiye böler; bu ders bölünmeyi bir denetim listesine
çevirir ve listenin dışında kalanı sayar. Sorumluluk matrisinin kendisi Bulut Bilişim müfredatının
Bulut Temelleri kursunda ölçüldü ve burada yeniden türetilmez — girdi olarak alınır.

- **BG1.** Aşağıdaki her şey kurgu bir bölgesel ölçüm ağına aittir: sayaç toplama, doğrulama,
  fatura üretimi ve abone portalı kiralanmış altyapıda koşar. Gerçek bir sağlayıcı, hizmet, bölge
  ya da kurum adı geçmez; ölçülen şey `node` ile yazılan bir **modeldir**.
- **BG2.** **Yanlış olabilir kalem**, değeri yanlış ayarlandığında erişim açan bir yapılandırma
  kalemidir. Yirmi bir kalem sayılır; liste kapsayıcı değil, örnektir.
- **BG3.** Her kalem üç hizmet modelinde ayrı ayrı ya müşteri ayarlar, ya sağlayıcı ayarlar, ya da
  hiç kimse ayarlamaz. Üçüncü durum sözleşmeden değil, iki tarafın da ötekinin yaptığını
  varsaymasından doğar.
- **BG4.** **Okunabilirlik** ayrı bir özelliktir: kalemin yürürlükteki değeri ya yönetim
  düzleminden okunur ya da hiç okunmaz. Sağlayıcının ayarladığı kalem müşteri tarafından yalnız
  **beyanla** bilinir.
- **BG5.** **Tohum ağırlığı**, kalem yanlışsa doğrudan açılan kalem sayısıdır. Kurgu bir sayıdır ve
  bu derste yalnız kalemleri ağırlıklandırmak için kullanılır; yürüyüşün kendisi sonraki derste
  koşturulur.
- **BG6.** Denetim listesinin bir satırı ancak kalem hem sahipliyse hem okunabiliyorsa otomatik
  koşabilir. Diğer durumlarda satırın bedeli değişir.

#### Yanlış Olabilecek Kalemler

Model kalemleri üç sütunla yazıyor — hizmet modeli başına kimin ayarladığı — ve iki özellik daha
taşıyor: okunabilirlik ve tohum ağırlığı. Bu üçünden dört sınıf türetiliyor.

```js
// bulut/kalem.mjs — kiralanmis altyapida yanlis olabilecek kalemlerin MODELIDIR.
// Kurgu bolgesel olcum agi; gercek saglayici, hizmet, bolge ya da sozlesme adi yoktur.

export const MODEL = ['altyapi', 'platform', 'islev'];
// Sutunlar: kalemi kim ayarliyor (M musteri, S saglayici, B kimse) x uc hizmet modeli.
// oku: kalemin yururlukteki degeri musteri tarafindan nasil okunur.
//   arayuz = yonetim duzleminden okunur, hicbiri = ne arayuzden ne belgeden okunur.
// dokunma: kalem yanlissa dogrudan acilan kalem sayisi (tohum agirligi, kurgu).
export const KALEM = `
  fiziksel-erisim          S S S  arayuz    6
  hipervizor-yamasi        S S S  arayuz   14
  kiracilik-komsulugu      S S S  arayuz   11
  konak-cekirdek-yamasi    M S S  arayuz    9
  calisma-zamani-surumu    M M S  arayuz    5
  imaj-kaynagi             M M S  arayuz    7
  ornek-meta-veri-surumu   M B S  arayuz    8
  yonetim-ucu-acikligi     M B B  arayuz   10
  ag-erisim-kurali         M M B  arayuz    6
  ozel-uc-nokta-eslemesi   M M B  arayuz    4
  gunluk-akisi-hedefi      M M B  arayuz    3
  rol-guven-listesi        M M M  arayuz   12
  kimlik-rol-tanimi        M M M  arayuz    9
  depolama-izin-kumesi     M M M  arayuz    7
  depolama-genel-bayragi   M M M  arayuz    5
  anahtar-sahipligi        M M M  arayuz    8
  sir-deposu-erisimi       M M M  arayuz   13
  denetim-gunlugu-acik     M M M  arayuz    2
  sablon-varsayilani       M M M  hicbiri   9
  bagimlilik-surumu        M M M  hicbiri   4
  is-yuku-ici-sir          M M M  hicbiri  15`
  .trim().split('\n').map((s) => {
    const [ad, ...k] = s.trim().split(/\s+/);
    return { ad, oku: k[3], dokunma: Number(k[4]),
      taraf: Object.fromEntries(MODEL.map((m, i) => [m, k[i]])) };
  });

// Denetim listesi sinifi: kalem yanlis olursa bunu kim, neyle gorur.
export const sinif = (k, m) => k.taraf[m] === 'B' ? 'sahipsiz'
  : k.taraf[m] === 'S' ? 'beyan'
    : k.oku === 'arayuz' ? 'denetlenir' : 'kor';
export const SINIF = ['denetlenir', 'beyan', 'kor', 'sahipsiz'];
// Denetim satirinin bedeli: otomatik kosan kural, donemsel soru turu, ek duzenek, sahip atama.
export const BEDEL = { denetlenir: 'kural', beyan: 'soru turu', kor: 'ek duzenek',
  sahipsiz: 'once sahip' };
export const kume = (m, c) => KALEM.filter((k) => sinif(k, m) === c);
export const agirlik = (l) => l.reduce((a, k) => a + k.dokunma, 0);
export const TOPLAM = agirlik(KALEM);
```

```js
// bulut/kosum1.mjs — kac kalem musteride, kaci beyanda, kaci sahipsiz; kaci denetim listesi disi
import { KALEM, MODEL, SINIF, TOPLAM, kume, agirlik, sinif } from './kalem.mjs';

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i])).join(''));
const A = [-27, 12, 12, 12];
const degisen = KALEM.filter((k) => new Set(MODEL.map((m) => sinif(k, m))).size > 1);
console.log(`${KALEM.length} yanlis olabilir kalem, tohum agirligi toplam ${TOPLAM}; ` +
  `sinifi uc modelde degisen ${degisen.length} kalem:\n`);
yaz(A, 'kalem', ...MODEL);
for (const k of degisen) yaz(A, k.ad, ...MODEL.map((m) => sinif(k, m)));

console.log('');
yaz(A, 'sinif (21 kalemin dagilimi)', ...MODEL);
for (const c of SINIF) yaz(A, c, ...MODEL.map((m) => kume(m, c).length));
yaz(A, 'denetim listesi disi kalem', ...MODEL.map((m) =>
  SINIF.slice(1).reduce((a, c) => a + kume(m, c).length, 0)));
yaz(A, '  tohum agirligi', ...MODEL.map((m) =>
  SINIF.slice(1).reduce((a, c) => a + agirlik(kume(m, c)), 0)));
yaz(A, '  agirligin yuzdesi', ...MODEL.map((m) =>
  Math.round(SINIF.slice(1).reduce((a, c) => a + agirlik(kume(m, c)), 0) / TOPLAM * 100)));
```

```
21 yanlis olabilir kalem, tohum agirligi toplam 167; sinifi uc modelde degisen 8 kalem:

kalem                           altyapi    platform       islev
konak-cekirdek-yamasi        denetlenir       beyan       beyan
calisma-zamani-surumu        denetlenir  denetlenir       beyan
imaj-kaynagi                 denetlenir  denetlenir       beyan
ornek-meta-veri-surumu       denetlenir    sahipsiz       beyan
yonetim-ucu-acikligi         denetlenir    sahipsiz    sahipsiz
ag-erisim-kurali             denetlenir  denetlenir    sahipsiz
ozel-uc-nokta-eslemesi       denetlenir  denetlenir    sahipsiz
gunluk-akisi-hedefi          denetlenir  denetlenir    sahipsiz

sinif (21 kalemin dagilimi)     altyapi    platform       islev
denetlenir                           15          12           7
beyan                                 3           4           7
kor                                   3           3           3
sahipsiz                              0           2           4
denetim listesi disi kalem            6           9          14
  tohum agirligi                     59          86         111
  agirligin yuzdesi                  35          51          66
```

Üst tablo yalnız sınıfı değişen sekiz kalemi gösteriyor; kalan on üç kalem üç modelde de aynı
sınıfta duruyor. Alt tablo asıl sayıyı veriyor: müşterinin yönetim düzleminden okuyup otomatik
denetleyebildiği kalem on beşten on ikiye, oradan yediye iniyor. Aynı yönde denetim listesinin
dışında kalan kalem altıdan dokuza, oradan on dörde çıkıyor.

Tohum ağırlığı satırı bu değişimin neden düz bir devir olmadığını gösteriyor. Yüz altmış yedi
birimlik toplam ağırlığın **denetim listesinin göremediği payı** yüzde otuz beşten yüzde elli bire,
oradan yüzde altmış altıya çıkıyor. Kalem sayısı iki katından biraz fazla artarken ağırlık payı
neredeyse iki katına çıkıyor — çünkü listeden düşen kalemler ağır olanlardır. `hipervizor-yamasi`
on dört, `is-yuku-ici-sir` on beş, `sir-deposu-erisimi` on üç birim taşıyor.

#### Sınır Kaydıkça Liste Daralıyor

Üst tablo dört kalem grubunu birbirinden ayırıyor. `konak-cekirdek-yamasi`, `calisma-zamani-surumu`
ve `imaj-kaynagi` sağlayıcıya **açıkça** geçiyor: müşteri ayarlamıyor, sağlayıcı üstleniyor, denetim
beyana dönüşüyor. Bu bir kayıp değil, bir takas — kalem yanlış olabilir ama yanlışı yapan taraf onu
düzeltebilen taraftır.

`ag-erisim-kurali`, `ozel-uc-nokta-eslemesi` ve `gunluk-akisi-hedefi` başka bir yola giriyor.
Altyapı ve platform modelinde müşteri ayarlıyor; işlev modelinde çalışma ortamı bu kalemleri
soyutluyor ve sağlayıcı da onları sözleşmede üstlenmiyor. Sonuç sahipsizliktir: kalem hâlâ yanlış
olabilir, ama kimse ayarlamadığı için kimse denetlemez.

`yonetim-ucu-acikligi` iki modelde birden sahipsiz kalıyor ve on birimlik ağırlığıyla listedeki en
ağır sahipsiz kalem. `ornek-meta-veri-surumu` ise ilginç bir yol izliyor: altyapıda müşteri
ayarlıyor, platformda kimse ayarlamıyor, işlevde sağlayıcı üstleniyor. Devir derinleştikçe bir
kalem her zaman düz bir çizgide karşıya geçmiyor; **arada bir modelde boşluğa düşebiliyor**.

#### Denetim Listesinin Bedeli

Dört sınıfın her biri denetim listesine ayrı bir bedelle giriyor. Sahipli ve okunabilir kalem için
bir kural yazılır ve sürekli koşar. Beyanla bilinen kalem için sağlayıcıya dönemsel bir soru
sorulur; yanıtın doğruluğu sınanamaz, yalnız kaydedilir. Kör nokta için değeri çalışan sistemden
çıkaracak ek bir düzenek gerekir. Sahipsiz kalem hiçbirine uymaz: satır yazılmadan önce kalemin
sahibi atanmalıdır.

```js
// bulut/kosum2.mjs — denetim listesi: kac satir otomatik kosuyor, kaci soru turu istiyor
import { MODEL, SINIF, BEDEL, TOPLAM, kume, agirlik } from './kalem.mjs';

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i])).join(''));
const B = [-13, -14, 11, 11, 10];
yaz(B, 'sinif', 'satirin bedeli', ...MODEL);
for (const c of SINIF)
  yaz(B, c, BEDEL[c], ...MODEL.map((m) => `${kume(m, c).length} / ${agirlik(kume(m, c))}`));
console.log('  (hucre: kalem sayisi / tohum agirligi)\n');

const C = [-11, 9, 10, 7, 14, 12];
yaz(C, 'model', 'denetim', 'kapsanan', 'soru', 'sahibi yok', 'hic okunan');
yaz(C, '', 'satiri', 'agirlik', 'turu', 'kalem/agirlik', 'agirlik');
for (const m of MODEL)
  yaz(C, m, kume(m, 'denetlenir').length,
    `%${Math.round(agirlik(kume(m, 'denetlenir')) / TOPLAM * 100)}`,
    kume(m, 'beyan').length,
    `${kume(m, 'sahipsiz').length} / ${agirlik(kume(m, 'sahipsiz'))}`,
    agirlik(kume(m, 'kor')));
```

```
sinif        satirin bedeli    altyapi   platform     islev
denetlenir   kural            15 / 108    12 / 81    7 / 56
beyan        soru turu          3 / 31     4 / 40    7 / 60
kor          ek duzenek         3 / 28     3 / 28    3 / 28
sahipsiz     once sahip          0 / 0     2 / 18    4 / 23
  (hucre: kalem sayisi / tohum agirligi)

model        denetim  kapsanan   soru    sahibi yok  hic okunan
              satiri   agirlik   turu kalem/agirlik     agirlik
altyapi           15       %65      3         0 / 0          28
platform          12       %49      4        2 / 18          28
islev              7       %34      7        4 / 23          28
```

İlk tablo bedeli sınıf sınıf ayırıyor. Altyapı modelinde on beş satır otomatik koşuyor ve yüz sekiz
birimlik ağırlığı kapsıyor; işlev modelinde yedi satır kalıyor ve kapsanan ağırlık elli altıya
iniyor. Soru turu üçten yediye çıkıyor: her tur sağlayıcıya sorulan, yanıtı bekleyen ve
sınanamayan bir kalemdir.

İkinci tablo aynı üç modeli tek satırda okutuyor. Otomatik kapsanan ağırlık yüzde altmış beşten
yüzde otuz dörde iniyor. Sahibi olmayan kalem sıfırdan iki ve dörde, ağırlığı sıfırdan on sekiz ve
yirmi üçe çıkıyor. Bu kalemler için müşterinin bir seçeneği vardır — sahipliği üstlenmek — ve
üstlenildiğinde on sekiz ile yirmi üç birim listeye geri döner. Bedeli sözleşmede olmayan bir işin
kendi ekibine yazılmasıdır.

#### Yanlış Kaç Gün Sonra Görülüyor

Satır sayısı listenin genişliğini verir, gecikmesini vermez. Otomatik koşan bir kural yanlışı
konduğu gün görür; dönemsel bir soru turu ancak turun geldiği gün görür; ek düzenek haftalık
toplarsa hafta içinde görür. Sahipsiz kalem hiç sorulmaz.

```js
// bulut/kosum3.mjs — yanlis kalem kac gun sonra fark ediliyor; hangi agirlik hic fark edilmiyor
import { MODEL, SINIF, TOPLAM, kume, agirlik } from './kalem.mjs';

// Fark edilme gecikmesi (gun): kural surekli kosar, soru turu donemseldir,
// ek duzenek kurulmussa haftalik toplar, sahipsiz kalem hic sorulmaz.
const GECIKME = { denetlenir: 0, beyan: 90, kor: 7, sahipsiz: null };
const yaz = (g, ...s) => console.log(s.map((v, i) =>
  g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i])).join(''));
const D = [-11, 9, 15, 16, 13];
yaz(D, 'model', 'gorulen', 'agirlikli', 'hic gorulmeyen', 'kor duzenek');
yaz(D, '', 'agirlik', 'gecikme (gun)', 'agirlik', 'kurulmazsa');
for (const m of MODEL) {
  const g = SINIF.filter((c) => GECIKME[c] !== null);
  const gor = g.reduce((a, c) => a + agirlik(kume(m, c)), 0);
  const top = g.reduce((a, c) => a + agirlik(kume(m, c)) * GECIKME[c], 0);
  yaz(D, m, gor, (top / gor).toFixed(1), TOPLAM - gor,
    TOPLAM - gor + agirlik(kume(m, 'kor')));
}
console.log('\nkural yerine soru turuna dusen agirligin gecikmeye katkisi:');
for (const m of MODEL)
  console.log(`  ${m.padEnd(10)}beyan agirligi ${String(agirlik(kume(m, 'beyan'))).padStart(3)}` +
    `, gecikmenin ${Math.round(agirlik(kume(m, 'beyan')) * 90 /
      (agirlik(kume(m, 'beyan')) * 90 + agirlik(kume(m, 'kor')) * 7) * 100)}%'i buradan`);
```

```
model        gorulen      agirlikli  hic gorulmeyen  kor duzenek
             agirlik  gecikme (gun)         agirlik   kurulmazsa
altyapi          167           17.9               0           28
platform         149           25.5              18           46
islev            144           38.9              23           51

kural yerine soru turuna dusen agirligin gecikmeye katkisi:
  altyapi   beyan agirligi  31, gecikmenin 93%'i buradan
  platform  beyan agirligi  40, gecikmenin 95%'i buradan
  islev     beyan agirligi  60, gecikmenin 96%'i buradan
```

Ağırlıklı gecikme on yedi virgül dokuz günden yirmi beş virgül beşe, oradan otuz sekiz virgül dokuz
güne çıkıyor. Yani aynı yanlış kalem işlev modelinde ortalama iki katından fazla süre yerinde
duruyor. Alt blok gecikmenin nereden geldiğini söylüyor: üç modelde de yüzde doksan üçten yüzde
doksan altıya kadar olan pay **beyan sınıfından** gelir. Kör noktanın haftalık düzeneği gecikmeye
neredeyse hiç katkı yapmıyor, çünkü yedi gün doksanın yanında küçüktür.

Son sütun bir uyarı taşıyor. Hiç görülmeyen ağırlık sıfır, on sekiz ve yirmi üçtür — ama bu sayı
kör nokta için bir ek düzenek kurulduğunu varsayar. Düzenek kurulmazsa hiç görülmeyen ağırlık
yirmi sekiz, kırk altı ve elli bire çıkar; işlev modelinde toplam ağırlığın yaklaşık üçte biri
hiçbir listeye düşmez. Bu, denetim listesinin genişliğiyle ilgili bir eksiklik değildir: liste
yirmi bir satırlık yazılabilir ve yine de o satırların bir bölümü hiçbir zaman değer okumaz.

#### Kör Nokta Devirle Değişmiyor

Son sütun bu dersin karar taşıyan sayısını veriyor: hiçbir listenin okuyamadığı ağırlık üç modelde
de **yirmi sekiz** birimdir. Üç kalem — şablon varsayılanı, bağımlılık sürümü ve iş yükü içindeki
sır — üç modelde de müşterinindir, üçünde de yanlış olabilir ve üçünde de yönetim düzleminden
okunamaz.

Bunun anlamı şudur: hizmet modelini derinleştirmek kör noktayı küçültmez. Devir, kalemleri müşteri
ile sağlayıcı arasında taşır; okunabilirliği taşımaz. Sahipsiz kalemi üstlenmek de kör noktayı
kapatmaz — platformda iki sahipsiz kalem alındığında bile yirmi sekiz birim yerinde durur, çünkü
sahiplik zaten müşterideydi, eksik olan görünürlüktü.

Denetim listesi bu yüzden üç ayrı işi birden yapmalıdır: sahipli ve görünür kalemi kuralla
sürekli sınamak, sağlayıcının kalemini soru turuyla kaydetmek ve görünmeyen kalemi çalışan
sistemden çıkarmak. Bu dersin sonundaki liste yirmi bir satırlıktır ve işlev modelinde satırların
yalnız yedisi kendi başına koşar.

#### Özet

- 21 yanlış olabilir kalem dört sınıfa ayrılıyor: denetlenen, beyanla bilinen, kör nokta, sahipsiz.
  Toplam tohum ağırlığı 167 birimdir.
- Otomatik denetlenebilen kalem 15 → 12 → 7; denetim listesinin dışında kalan kalem 6 → 9 → 14.
  Kapsanan ağırlık %65 → %49 → %34.
- Ağırlık payı kalem sayısından hızlı düşüyor, çünkü listeden düşen kalemler ağır olanlardır:
  `hipervizor-yamasi` 14, `is-yuku-ici-sir` 15, `sir-deposu-erisimi` 13 birim taşır.
- Sahipsiz kalem 0 → 2 → 4 ve ağırlığı 0 → 18 → 23. Bir kalem devir sırasında karşıya geçmek
  yerine arada bir modelde boşluğa düşebiliyor; `ornek-meta-veri-surumu` bunun örneğidir.
- Ağırlıklı fark edilme gecikmesi 17,9 → 25,5 → 38,9 gün. Gecikmenin %93 ile %96'sı beyan
  sınıfından gelir; kör noktanın haftalık düzeneği gecikmeye neredeyse hiç katkı yapmaz.
- Hiçbir listenin okuyamadığı ağırlık üç modelde de 28 birimdir. Devir kalemleri taşır,
  okunabilirliği taşımaz; sahipsiz kalemi üstlenmek de bu 28 birimi düşürmez.

#### Sonraki Adım

Liste artık yazılı: yirmi bir kalem, dört sınıf ve her kalemin bir tohum ağırlığı. Ama tohum
ağırlığı bu derste bir sayı olarak verildi, hesaplanmadı. `sir-deposu-erisimi` kaleminin on üç
taşıdığı söylendi; on üçün nereden geldiği, o on üç kalemin kaçına doğrudan, kaçına başka bir
kimliğin üzerinden ulaşıldığı sorulmadı. Sonraki ders bu kursun ölçü birimini kuruyor: kimlikler ve
kalemler bir erişim grafiği olarak yazılıyor, sızan tek bir kimlikten yürüyüş gerçekten koşturuluyor
ve **yarıçap bir sayıya** dönüşüyor.

### Kimlik ve Erişim Yönetimi

Source: https://academia.sh/tr/kurslar/bulut-guvenligi/kimlik-ve-erisim-yonetimi

Yayılma yarıçapının bir sayıya çevrilmesi: 10 kimlik ve 18 kalemlik erişim grafiğinde sızan tek bir hizmet hesabından yürüyüş koşturulur, doğrudan 2 kaleme karşı zincirle 7 kalem daha eklenerek toplam 9 kaleme ulaşılır, çarpan 4,5 kat ve derinlik 3'tür. Üstlenme kenarı hiç olmasa en geniş yarıçap 9 yerine 4 olurdu. Dört denetim aynı grafikte koşturulur: bir güven kenarını kaldırmak yarıçapı 4'e indirip günde 4 meşru işi durdurur, çok adımlı doğrulama yarıçabı hiç düşürmez.

Önceki ders yanlış olabilecek yirmi bir kalemi sınıflandırdı ve her birine bir tohum ağırlığı
verdi. O ağırlık orada bir sayı olarak duruyordu; hesaplanmadı. Bu ders onu hesaplıyor ve kursun
ölçü birimini kuruyor: erişim grafiği yazılıyor, sızan tek bir kimlikten yürüyüş koşturuluyor,
**yarıçap bir sayıya** dönüşüyor.

Bulut Yönetişimi, Güvenlik ve Maliyet kursu aynı yüzeyi yönetişim gözüyle ölçtü — kim ne
yapabiliyor, hangi politika neyi kapsıyor, hangi izin kullanılmıyor. Burada politika metni hiç
yazılmaz; ölçülen şey erişimin kendisidir ve tek soru sorulur: bir kimlik sızarsa oradan kaç
kaleme ulaşılır. Yürüyüşün kendisi
bir grafik gezinmesidir; **hiçbir sızma adımı, çağrı dizisi ya da kimlik bilgisi toplama yöntemi
yazılmaz**. Bir kurumun gerçek erişim grafiğinde böyle bir yürüyüş, yazılı yetki ve tanımlı kapsam
olmadan yapılamaz; yetkisiz yapılırsa hem yasadışı hem de meslek dışıdır.

- **BG7.** Grafiğin düğümleri iki türdür: **kimlik** (hizmet hesabı ya da rol) ve **kalem**
  (erişilen kaynak). Kimlikten kaleme kenar doğrudan erişimi, kimlikten kimliğe kenar **rol
  zincirini** gösterir.
- **BG8.** Sızan kimlik grafiğin bir düğümüdür ve yürüyüş oradan başlar. Kimliğin nasıl sızdığı bu
  derste modellenmez; ölçülen şey sızdıktan sonraki erişimdir.
- **BG9.** **Yayılma yarıçapı**, yürüyüşün ulaştığı **kalem** sayısıdır. Kimlik sayısı değil kalem
  sayısı sayılır, çünkü zarar kalemde oluşur.
- **BG10.** **Doğrudan yarıçap** sızan kimliğin kendi kalemleridir; **zincirle erişilen kalem**
  ancak bir ya da daha çok üstlenme adımından sonra görülür.
- **BG11.** Üstlenme kenarları geçişlidir ve grafik döngüsüzdür. Her kenar üzerinde günde kaç meşru
  işin geçtiği kurgu bir sayıdır.
- **BG12.** Grafik on kimlik ve on sekiz kalemdir; kurgu bölgesel ölçüm ağının kiralanmış
  altyapıdaki karşılığıdır.

#### Grafik ve Yürüyüş

```js
// bulut/graf.mjs — kiralanmis altyapida erisim grafigi MODELIDIR. Kurgu bolgesel olcum agi;
// gercek saglayici, hizmet ve kimlik adi yoktur. Sizma adimi ya da cagri dizisi icermez.

// Kimlik -> dogrudan eristigi kalemler.
export const ERISIM = {
  'hesap-toplayici': ['olcum-deposu', 'olcum-kuyrugu'],
  'hesap-dogrulayici': ['olcum-deposu', 'olcum-kuyrugu', 'ham-arsiv'],
  'hesap-portal': ['abone-veritabani', 'portal-varlik-deposu', 'is-emri-kuyrugu'],
  'hesap-rapor': ['rapor-deposu', 'fatura-cikti-deposu', 'gunluk-deposu'],
  'rol-fatura': ['fatura-veritabani', 'fatura-cikti-deposu', 'posta-cikisi', 'abone-veritabani'],
  'rol-arsiv': ['ham-arsiv', 'yedek-deposu'],
  'rol-yedek': ['yedek-deposu', 'fatura-veritabani', 'abone-veritabani', 'olcum-deposu'],
  'rol-dagitim': ['dagitim-yapilandirmasi', 'sablon-deposu', 'ornek-yonetimi'],
  'rol-gunluk': ['gunluk-deposu', 'denetim-gunlugu'],
  'rol-yonetim': ['ornek-yonetimi', 'anahtar-yonetimi', 'sir-deposu'],
};
// Ustlenme kenari: [kaynak kimlik, hedef kimlik, gunde kac mesru is bu kenardan geciyor]
export const USTLENME = [
  ['hesap-toplayici', 'rol-arsiv', 96],
  ['hesap-dogrulayici', 'rol-arsiv', 24],
  ['rol-arsiv', 'rol-yedek', 4],
  ['rol-yedek', 'rol-yonetim', 1],
  ['hesap-portal', 'rol-fatura', 310],
  ['rol-fatura', 'rol-gunluk', 12],
  ['hesap-rapor', 'rol-gunluk', 8],
  ['rol-dagitim', 'rol-yonetim', 6],
];
export const KIMLIK = Object.keys(ERISIM);
export const KALEM = [...new Set(Object.values(ERISIM).flat())].sort();

// Yaricap yuruyusu: baslangic kimliginden genisleyerek ulasilan kalem kumesi.
// Adim 0 = sizan kimligin kendi kalemleri (dogrudan yaricap).
export function yuru(baslangic, kenar = USTLENME) {
  const gorulen = new Set([baslangic]);
  const adim = new Map([[baslangic, 0]]);
  const kalem = new Map();                       // kalem -> ilk goruldugu adim
  let sira = [baslangic];
  while (sira.length) {
    const sonraki = [];
    for (const k of sira) {
      for (const r of ERISIM[k]) if (!kalem.has(r)) kalem.set(r, adim.get(k));
      for (const [a, b] of kenar)
        if (a === k && !gorulen.has(b)) { gorulen.add(b); adim.set(b, adim.get(k) + 1); sonraki.push(b); }
    }
    sira = sonraki;
  }
  const dogrudan = [...kalem.values()].filter((d) => d === 0).length;
  return { kimlik: gorulen, kalem, yaricap: kalem.size, dogrudan,
    zincirle: kalem.size - dogrudan, derinlik: Math.max(...adim.values()) };
}
```

Sızan kimlik sayaç toplama iş yükünün hizmet hesabıdır. Bu hesap grafiğin en dışında durur: iki
kaleme yazar ve tek bir rolü üstlenir.

```js
// bulut/kosum1.mjs — sizan tek kimlikten yuruyus: dogrudan, zincirle, hic erisilemeyen kalem
import { KALEM, KIMLIK, yuru } from './graf.mjs';

const r = yuru('hesap-toplayici');
console.log(`grafik: ${KIMLIK.length} kimlik, ${KALEM.length} kalem`);
console.log('sizan kimlik: hesap-toplayici');
console.log(`  ulasilan kimlik ${r.kimlik.size}: ${[...r.kimlik].join(' -> ')}`);
console.log(`  yaricap ${r.yaricap}/${KALEM.length}  dogrudan ${r.dogrudan}  ` +
  `zincirle ${r.zincirle}  derinlik ${r.derinlik}`);
console.log(`  zincir carpani ${(r.yaricap / r.dogrudan).toFixed(1)}x` +
  `, hic erisilemeyen ${KALEM.length - r.yaricap}\n`);
console.log('adim  ulasilan kalem');
for (let d = 0; d <= r.derinlik; d++)
  console.log(`${String(d).padStart(4)}  ` +
    KALEM.filter((k) => r.kalem.get(k) === d).join(', '));
const disi = KALEM.filter((k) => !r.kalem.has(k));
console.log('   -  ' + disi.slice(0, 5).join(', '));
console.log('      ' + disi.slice(5).join(', '));
```

```
grafik: 10 kimlik, 18 kalem
sizan kimlik: hesap-toplayici
  ulasilan kimlik 4: hesap-toplayici -> rol-arsiv -> rol-yedek -> rol-yonetim
  yaricap 9/18  dogrudan 2  zincirle 7  derinlik 3
  zincir carpani 4.5x, hic erisilemeyen 9

adim  ulasilan kalem
   0  olcum-deposu, olcum-kuyrugu
   1  ham-arsiv, yedek-deposu
   2  abone-veritabani, fatura-veritabani
   3  anahtar-yonetimi, ornek-yonetimi, sir-deposu
   -  dagitim-yapilandirmasi, denetim-gunlugu, fatura-cikti-deposu, gunluk-deposu, is-emri-kuyrugu
      portal-varlik-deposu, posta-cikisi, rapor-deposu, sablon-deposu
```

Yarıçap dokuzdur. Sızan hesabın kendi yetkisi iki kalemdir; kalan yedi kalem üç üstlenme adımının
ardından gelir. Çarpan dört buçuk kattır ve on sekiz kalemin yarısı yürüyüşün dışında kalır.

Adım dağılımı asıl bilgiyi taşır. Sıfırıncı adımda ölçüm kalemleri vardır — sayaç toplama iş
yükünün gerçekten ihtiyaç duyduğu iki kalem. Birinci adımda arşiv, ikinci adımda **abone ve fatura
verisi**, üçüncü adımda anahtar yönetimi ile sır deposu görünür. Sızan hesabın işiyle bu son iki
adımın kalemleri arasında hiçbir ilişki yoktur: sayaç okuma toplayan bir iş yükü ne fatura
veritabanına ne anahtar yönetimine dokunur. Yine de birkaç adım sonra ikisi de yürüyüşün
içindedir.

Bu, yarıçabın **kalem başına verilen izinden** değil, **kimlikler arası güvenden** doğduğunu
gösterir. Dokuz kalemin hiçbiri sızan hesaba açıkça verilmiş değildir.

#### Yarıçap Kimlikten Kimliğe Değişiyor

Tek bir kimliği ölçmek yeterli değildir; sızan kimliğin hangisi olacağı bilinmez.

```js
// bulut/kosum2.mjs — her kimlik icin yaricap: zincir yaricabi kac kat buyutuyor
import { KALEM, KIMLIK, yuru } from './graf.mjs';

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i])).join(''));
const A = [-19, 10, 10, 10, 9, 9];
yaz(A, 'sizan kimlik', 'dogrudan', 'zincirle', 'yaricap', 'carpan', 'derinlik');
const R = KIMLIK.map((k) => [k, yuru(k)]);
for (const [k, r] of R)
  yaz(A, k, r.dogrudan, r.zincirle, `${r.yaricap}/${KALEM.length}`,
    `${(r.yaricap / r.dogrudan).toFixed(1)}x`, r.derinlik);
const y = R.map(([, r]) => r.yaricap);
console.log(`\nen genis yaricap ${Math.max(...y)}, ortalama ` +
  `${(y.reduce((a, x) => a + x, 0) / y.length).toFixed(1)}, ` +
  `yaricabi 8'i asan kimlik ${y.filter((x) => x > 8).length}/${KIMLIK.length}`);
const zincirsiz = KIMLIK.map((k) => yuru(k, []).yaricap);
console.log(`ustlenme kenari hic olmasaydi: en genis ${Math.max(...zincirsiz)}, ortalama ` +
  `${(zincirsiz.reduce((a, x) => a + x, 0) / zincirsiz.length).toFixed(1)}`);
```

```
sizan kimlik         dogrudan  zincirle   yaricap   carpan derinlik
hesap-toplayici             2         7      9/18     4.5x        3
hesap-dogrulayici           3         6      9/18     3.0x        3
hesap-portal                3         5      8/18     2.7x        2
hesap-rapor                 3         1      4/18     1.3x        1
rol-fatura                  4         2      6/18     1.5x        1
rol-arsiv                   2         6      8/18     4.0x        2
rol-yedek                   4         3      7/18     1.8x        1
rol-dagitim                 3         2      5/18     1.7x        1
rol-gunluk                  2         0      2/18     1.0x        0
rol-yonetim                 3         0      3/18     1.0x        0

en genis yaricap 9, ortalama 6.1, yaricabi 8'i asan kimlik 2/10
ustlenme kenari hic olmasaydi: en genis 4, ortalama 2.9
```

Tablo sezginin tersini söylüyor. En geniş yarıçap yönetim rolünde değil, grafiğin en dışındaki iki
hizmet hesabındadır: toplayıcı ve doğrulayıcı dokuzar kaleme ulaşır. `rol-yonetim` üç kalemde
kalır, çünkü hiçbir rolü üstlenemez — yürüyüş orada biter. Bir kimliğin **kendi yetkisi**, sızdığında
açtığı kalem sayısını belirlemiyor.

Son iki satır zincirin payını veriyor. Üstlenme kenarı hiç olmasaydı en geniş yarıçap dört,
ortalama iki virgül dokuz olurdu. Kenarlar eklendiğinde bunlar dokuz ve altı virgül bire çıkıyor —
en geniş yarıçap iki virgül yirmi beş, ortalama iki virgül bir kat büyüyor. Sekiz üstlenme kenarı,
on sekiz kalemlik bir grafikte ortalama yarıçabı iki katına çıkarıyor.

#### Ters Yön: Kalem Kaç Yürüyüşte Görünüyor

Aynı grafik ters yönden de okunabilir. Bir kalemin maruziyeti, kaç ayrı kimliğin sızmasının o
kaleme ulaştığıdır.

```js
// bulut/kosum4.mjs — ters yon: her kalem kac kimligin yuruyusunde goruluyor
import { KALEM, KIMLIK, yuru } from './graf.mjs';

const R = KIMLIK.map((k) => yuru(k));
const say = (k, f) => R.filter((r) => r.kalem.has(k) && f(r.kalem.get(k))).length;
const yaz = (g, ...s) => console.log(s.map((v, i) =>
  g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i])).join(''));
const A = [-24, 10, 10, 10];
yaz(A, 'kalem', 'ulasan', 'yalniz', 'yalniz');
yaz(A, '', 'kimlik', 'dogrudan', 'zincirle');
const sirali = [...KALEM].sort((a, b) => say(b, () => true) - say(a, () => true));
for (const k of sirali.slice(0, 6))
  yaz(A, k, say(k, () => true), say(k, (d) => d === 0), say(k, (d) => d > 0));
console.log('  ...');
for (const k of sirali.slice(-3))
  yaz(A, k, say(k, () => true), say(k, (d) => d === 0), say(k, (d) => d > 0));
const cift = (f) => KALEM.reduce((a, k) => a + say(k, f), 0);
console.log(`\ntoplam (kimlik, kalem) erisim cifti ${cift(() => true)}: ` +
  `dogrudan ${cift((d) => d === 0)}, zincirle ${cift((d) => d > 0)}`);
console.log(`ortalama bir kalem ${(cift(() => true) / KALEM.length).toFixed(1)} ` +
  `kimligin yuruyusunde goruluyor`);
```

```
kalem                       ulasan    yalniz    yalniz
                            kimlik  dogrudan  zincirle
abone-veritabani                 6         3         3
anahtar-yonetimi                 6         1         5
fatura-veritabani                6         2         4
ornek-yonetimi                   6         2         4
sir-deposu                       6         1         5
denetim-gunlugu                  4         1         3
  ...
portal-varlik-deposu             1         1         0
rapor-deposu                     1         1         0
sablon-deposu                    1         1         0

toplam (kimlik, kalem) erisim cifti 61: dogrudan 29, zincirle 32
ortalama bir kalem 3.4 kimligin yuruyusunde goruluyor
```

Beş kalem on kimliğin altısının yürüyüşünde görünüyor. `sir-deposu` ve `anahtar-yonetimi` bu
listenin en tepesindedir ve ikisi de yalnız **tek** kimliğe doğrudan verilmiştir; kalan beş yol
zincirden gelir. Aynı satır `abone-veritabani` için üçe üç dağılır — o kalem gerçekten üç ayrı iş
yükünün işidir.

Son satır grafiğin bütününü bir sayıya indiriyor: altmış bir erişim çiftinin yirmi dokuzu
doğrudan, otuz ikisi zincirlidir. Yani bu grafikte bir kalemin bir kimlik tarafından görülme
yollarının **yarısından çoğu hiçbir yerde açıkça verilmemiştir**. Bir izin listesine bakarak
sayılabilecek olan yirmi dokuzdur; kalan otuz iki ancak yürüyüş koşturularak görülür.

#### Denetimler Aynı Grafikte

Dört denetim aynı yürüyüşün üzerinde koşturuluyor. Her birinin bedeli kenardan geçen meşru iştir.

```js
// bulut/kosum3.mjs — dort denetim ayni grafikte: yaricap kaca iniyor, bedeli gunde kac mesru is
import { KALEM, KIMLIK, USTLENME, yuru } from './graf.mjs';

const hedef = new Set(USTLENME.map(([, b]) => b));
const DENETIM = [                                  // [ad, kalan kenarlari secen suzgec]
  ['denetim yok', () => true],
  ['arsiv-yedek guveni kalkar', ([a, b]) => !(a === 'rol-arsiv' && b === 'rol-yedek')],
  ['yedek-yonetim guveni kalkar', ([a, b]) => !(a === 'rol-yedek' && b === 'rol-yonetim')],
  ['ustlenme tek adima iner', ([a]) => !hedef.has(a)],
  ['insan kullanicida cok adimli dogrulama', () => true],
];
const TOPLAM_IS = USTLENME.reduce((a, [, , m]) => a + m, 0);
const yaz = (g, ...s) => console.log(s.map((v, i) =>
  g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i])).join(''));
const A = [-40, 9, 10, 10, 10];
yaz(A, 'denetim', 'yaricap', 'en genis', 'ortalama', 'duran is');
for (const [ad, suz] of DENETIM) {
  const kenar = USTLENME.filter(suz);
  const y = KIMLIK.map((k) => yuru(k, kenar).yaricap);
  yaz(A, ad, yuru('hesap-toplayici', kenar).yaricap, Math.max(...y),
    (y.reduce((a, x) => a + x, 0) / y.length).toFixed(1),
    TOPLAM_IS - kenar.reduce((a, [, , m]) => a + m, 0));
}
console.log(`\n(gunde toplam ${TOPLAM_IS} mesru is ustlenme kenarlarindan geciyor)\n`);
console.log('tek ustlenme kenari kaldirilirsa (sizan kimlik hesap-toplayici):');
const B = [-19, -14, 9, 11];
yaz(B, 'kenar', '', 'yaricap', 'duran is');
yaz(B, '', '', 'dususu', 'gunde');
for (const [a, b, m] of USTLENME)
  yaz(B, a, `-> ${b}`,
    9 - yuru('hesap-toplayici', USTLENME.filter((e) => e[0] !== a || e[1] !== b)).yaricap, m);
```

```
denetim                                   yaricap  en genis  ortalama  duran is
denetim yok                                     9         9       6.1         0
arsiv-yedek guveni kalkar                       4         8       4.5         4
yedek-yonetim guveni kalkar                     6         8       4.9         1
ustlenme tek adima iner                         4         6       3.8        17
insan kullanicida cok adimli dogrulama          9         9       6.1         0

(gunde toplam 461 mesru is ustlenme kenarlarindan geciyor)

tek ustlenme kenari kaldirilirsa (sizan kimlik hesap-toplayici):
kenar                              yaricap   duran is
                                    dususu      gunde
hesap-toplayici    -> rol-arsiv          7         96
hesap-dogrulayici  -> rol-arsiv          0         24
rol-arsiv          -> rol-yedek          5          4
rol-yedek          -> rol-yonetim        3          1
hesap-portal       -> rol-fatura         0        310
rol-fatura         -> rol-gunluk         0         12
hesap-rapor        -> rol-gunluk         0          8
rol-dagitim        -> rol-yonetim        0          6
```

Üst tablo dört denetimi yan yana koyuyor. Arşiv rolünün yedek rolünü üstlenmesini kaldırmak
yarıçabı dokuzdan dörde indiriyor ve günde dört meşru işi durduruyor. Yedek rolünün yönetim rolünü
üstlenmesini kaldırmak dokuzdan altıya indiriyor ve günde tek bir işi durduruyor. Üstlenmeyi tek
adıma indirmek — üstlenilmiş bir rolün başka rol üstlenememesi — yarıçabı dörde, en geniş yarıçabı
altıya, ortalamayı üç virgül sekize çekiyor; bedeli günde on yedi iştir.

Son satır bu dersin ikinci bulgusunu taşıyor. İnsan kullanıcılarda çok adımlı doğrulama zorunlu
kılındığında yarıçap dokuzda kalıyor, ortalama altı virgül birde kalıyor, durdurulan meşru iş
sıfırdır. Denetim yanlış değildir ve kendi yolunu kapatır — ama sızan kimlik bir hizmet hesabıdır
ve o hesap hiçbir doğrulama adımından geçmez. **Yarıçabı düşürmeyen bir denetim, koşturulana kadar
etkili görünür.**

Alt tablo denetimi kenar kenar sıralıyor ve seçimin nasıl yapılacağını gösteriyor. Sekiz kenarın
beşi bu sızan kimlik için yarıçabı hiç düşürmüyor; aralarında günde üç yüz on işle en yoğun kenar
da var. En büyük düşüşü sızan hesabın kendi üstlenme kenarını kaldırmak veriyor — yedi kalem — ama
bedeli günde doksan altı iştir. `rol-arsiv -> rol-yedek` beş kalem düşürüyor ve günde dört iş
durduruyor. Kalem başına bedel birincide on yedi kat yüksektir.

#### Özet

- Yayılma yarıçapı, sızan bir kimlikten başlayan yürüyüşün ulaştığı kalem sayısıdır. Sayaç toplama
  hesabından yarıçap 9/18; doğrudan 2, zincirle 7, derinlik 3, çarpan 4,5 kat.
- Yarıçap kalem başına verilen izinden değil, kimlikler arası güvenden doğuyor: toplam 61
  `(kimlik, kalem)` erişim çiftinin 29'u doğrudan, 32'si zincirlidir. `sir-deposu` ve
  `anahtar-yonetimi`ne 6 kimlik ulaşır, ikisi de yalnız tek kimliğe doğrudan verilmiştir.
- En geniş yarıçap yönetim rolünde değil, grafiğin en dışındaki iki hizmet hesabındadır (9/18);
  `rol-yonetim` 3/18'de kalır, çünkü hiçbir rolü üstlenemez.
- Sekiz üstlenme kenarı en geniş yarıçabı 4'ten 9'a, ortalamayı 2,9'dan 6,1'e çıkarıyor: zincir
  ortalama yarıçabı iki katına yakın büyütüyor.
- Bir güven kenarını kaldırmak yarıçabı 9'dan 4'e indirip günde 4 meşru işi durdurur; üstlenmeyi
  tek adıma indirmek 4'e indirip günde 17 işi durdurur.
- Çok adımlı doğrulama yarıçabı 9'da bırakır ve hiçbir meşru işi durdurmaz; sekiz kenarın beşini
  kaldırmak da yarıçabı hiç düşürmez — bunların biri günde 310 iş taşıyan en yoğun kenardır.

#### Sonraki Adım

Yürüyüş boyunca bir şey sorulmadan geçildi: bir kimliğin bir kaleme erişim yetkisi olması, o kaleme
**ulaşabildiği** anlamına mı gelir. Grafikte kenar vardı ve yürüyüş kenardan geçti; kalemin
oturduğu ağın o kimliğin bulunduğu yerden erişilebilir olup olmadığı hiç bakılmadı. Sonraki ders
aynı grafiğe ikinci bir katman ekliyor: her kalemin ağ yolu. Sızan kimlik dışarıdan kullanıldığında
ve ağın içinden kullanıldığında yarıçap aynı çıkmıyor.

### Ağ Yalıtımı

Source: https://academia.sh/tr/kurslar/bulut-guvenligi/ag-yalitimi

İzin yarıçapının ağ yoluyla kesişmesi: aynı 9 kalemlik yürüyüş dışarıdan 6, iş yükü ağından 8, yönetim ağından 2 kaleme iniyor. Meşru dış erişimi olmayan 10 kalemi özel uca almak dış yarıçabı 6'dan 4'e indiriyor ve hiçbir meşru işi durdurmuyor; eşiği günde 50'ye çekmek dış yarıçabı sıfırlıyor ve günde 101 dış erişimi durduruyor. İş yükü ağı sütunu dört denetimde de 8'de kalıyor.

Önceki ders yarıçabı bir sayıya çevirdi: sızan hizmet hesabından dokuz kalem. O yürüyüş boyunca tek
bir şey sorulmadı — bir kimliğin bir kaleme yetkisi olması, o kaleme **ulaşabildiği** anlamına gelir
mi. Kenar vardı ve yürüyüş kenardan geçti; kalemin oturduğu ağın, kimlik bilgisinin kullanıldığı
yerden erişilebilir olup olmadığına bakılmadı.

Bu ders aynı grafiğe ikinci bir katman ekliyor. Her kalemin bir **ağ yolu** vardır: hangi konumdan
ağ düzeyinde erişilebildiği. Gerçek yarıçap iki kümenin kesişimidir — izin yürüyüşünün ulaştığı
kalemler ile o konumdan ağ düzeyinde erişilebilen kalemler. Bulut Yönetişimi, Güvenlik ve Maliyet
kursu aynı yüzeyi erişim çizelgesi ve ad çözümlemesi üzerinden ölçtü; burada adres planı, alt ağ
aritmetiği ve filtre kuralı yazımı hiç geçmez, yalnız **kapanan yol** sayılır.

- **BG13.** Üç **konum** vardır: `dis` (kiralanan ağın dışı), `is-yuku` (ele geçmiş bir iş yükü
  örneğinin bulunduğu ağ) ve `yonetim` (dağıtım işlerinin koştuğu ağ). Sızan kimlik bilgisi bu
  konumlardan birinde kullanılır.
- **BG14.** Bir kalemin **yolu**, hangi konumlardan ağ düzeyinde erişilebildiğidir. Yol izinden
  bağımsızdır; izni olmayan bir kimlik için yol açık olabilir, izni olan bir kimlik için kapalı.
- **BG15.** Rol üstlenme kimlik ve erişim yönetimi üzerinden yapılır ve üç konumdan da
  yapılabilir. Bu bir model kararıdır: üstlenme kısıtlanırsa yürüyüş kısalır ve ağ katmanının
  etkisi ölçülemez.
- **BG16.** **Özel uç noktaya geçirmek**, kalemin genel ucunun kapanması ve yalnız ağ içinden
  erişilebilir olması demektir; modelde bu, `dis` konumunun kalemin yolundan çıkmasıdır.
- **BG17.** Her kalemin günde kaç meşru dış erişim aldığı kurgu bir sayıdır ve genel uç
  kapatıldığında bu erişimlerin durduğu varsayılır.

#### İzin Yarıçapı Bir Üst Sınırdır

```js
// bulut/ag.mjs — onceki dersin erisim grafigi + her kalemin AG YOLU. MODELDIR; kurgu bolgesel
// olcum agi. Adres plani, alt ag aritmetigi ve filtre kurali yazimi bu derste yoktur.

export const ERISIM = {
  'hesap-toplayici': 'olcum-deposu olcum-kuyrugu',
  'hesap-dogrulayici': 'olcum-deposu olcum-kuyrugu ham-arsiv',
  'hesap-portal': 'abone-veritabani portal-varlik-deposu is-emri-kuyrugu',
  'hesap-rapor': 'rapor-deposu fatura-cikti-deposu gunluk-deposu',
  'rol-fatura': 'fatura-veritabani fatura-cikti-deposu posta-cikisi abone-veritabani',
  'rol-arsiv': 'ham-arsiv yedek-deposu',
  'rol-yedek': 'yedek-deposu fatura-veritabani abone-veritabani olcum-deposu',
  'rol-dagitim': 'dagitim-yapilandirmasi sablon-deposu ornek-yonetimi',
  'rol-gunluk': 'gunluk-deposu denetim-gunlugu',
  'rol-yonetim': 'ornek-yonetimi anahtar-yonetimi sir-deposu',
};
export const USTLENME = [['hesap-toplayici', 'rol-arsiv'], ['hesap-dogrulayici', 'rol-arsiv'],
  ['rol-arsiv', 'rol-yedek'], ['rol-yedek', 'rol-yonetim'], ['hesap-portal', 'rol-fatura'],
  ['rol-fatura', 'rol-gunluk'], ['hesap-rapor', 'rol-gunluk'], ['rol-dagitim', 'rol-yonetim']];

// Konum: sizan kimlik bilgisinin kullanildigi yer. Kalemin yolu, hangi konumdan ag duzeyinde
// erisilebildigini soyler. disIs = gunde kac mesru dis erisim o kalemin genel ucundan geciyor.
export const KONUM = ['dis', 'is-yuku', 'yonetim'];
export const KALEM = `
  olcum-deposu            dis is-yuku            40
  olcum-kuyrugu           is-yuku                 0
  ham-arsiv               dis is-yuku             6
  yedek-deposu            dis is-yuku yonetim     2
  abone-veritabani        is-yuku                 0
  fatura-veritabani       is-yuku                 0
  fatura-cikti-deposu     dis is-yuku           120
  portal-varlik-deposu    dis is-yuku          8600
  is-emri-kuyrugu         is-yuku                 0
  gunluk-deposu           is-yuku yonetim         0
  denetim-gunlugu         yonetim                 0
  rapor-deposu            dis yonetim            30
  posta-cikisi            dis is-yuku             0
  sir-deposu              dis is-yuku             0
  anahtar-yonetimi        dis is-yuku             0
  ornek-yonetimi          dis yonetim            14
  dagitim-yapilandirmasi  yonetim                 0
  sablon-deposu           dis yonetim             9`
  .trim().split('\n').map((s) => {
    const p = s.trim().split(/\s+/);
    return { ad: p[0], yol: p.slice(1, -1), disIs: Number(p.at(-1)) };
  });
export const bul = (ad) => KALEM.find((k) => k.ad === ad);

// Izin yuruyusu: kimlik grafiginde ulasilan kalem kumesi (onceki dersle ayni).
export function izin(baslangic) {
  const g = new Set([baslangic]), kalem = new Set();
  let sira = [baslangic];
  while (sira.length) {
    const s = [];
    for (const k of sira) {
      for (const r of ERISIM[k].split(' ')) kalem.add(r);
      for (const [a, b] of USTLENME) if (a === k && !g.has(b)) { g.add(b); s.push(b); }
    }
    sira = s;
  }
  return [...kalem];
}
// Gercek yaricap = izin VE ag yolu. kapali = genel ucu kapatilan kalem adlari.
export const yaricap = (baslangic, konum, kapali = new Set()) =>
  izin(baslangic).filter((r) => bul(r).yol.includes(konum) &&
    !(konum === 'dis' && kapali.has(r))).length;
```

```js
// bulut/kosum1.mjs — izin yaricabi ile ag yolundan gecen yaricap: konuma gore kac kalem
import { KALEM, KONUM, bul, izin, yaricap } from './ag.mjs';

const u = izin('hesap-toplayici');
console.log(`sizan kimlik hesap-toplayici; izin yuruyusu ${u.length}/${KALEM.length} kalem\n`);
const yaz = (g, ...s) => console.log(s.map((v, i) =>
  g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i])).join(''));
const A = [-24, 7, 9, 10, 11];
yaz(A, 'yuruyuse giren kalem', ...KONUM, 'mesru dis');
for (const r of u.sort())
  yaz(A, r, ...KONUM.map((k) => bul(r).yol.includes(k) ? 'var' : '-'), bul(r).disIs);
yaz(A, 'yaricap', ...KONUM.map((k) => yaricap('hesap-toplayici', k)), '');
console.log('\nag duzeyinde erisilebilir kalem (izinden bagimsiz), izin yaricabi 9:');
for (const k of KONUM)
  console.log(`  ${k.padEnd(9)}ag yuzeyi ${String(KALEM.filter((r) => r.yol.includes(k)).length)
    .padStart(2)}/${KALEM.length}, izinle kesisim ${yaricap('hesap-toplayici', k)}`);
```

```
sizan kimlik hesap-toplayici; izin yuruyusu 9/18 kalem

yuruyuse giren kalem        dis  is-yuku   yonetim  mesru dis
abone-veritabani              -      var         -          0
anahtar-yonetimi            var      var         -          0
fatura-veritabani             -      var         -          0
ham-arsiv                   var      var         -          6
olcum-deposu                var      var         -         40
olcum-kuyrugu                 -      var         -          0
ornek-yonetimi              var        -       var         14
sir-deposu                  var      var         -          0
yedek-deposu                var      var       var          2
yaricap                       6        8         2

ag duzeyinde erisilebilir kalem (izinden bagimsiz), izin yaricabi 9:
  dis      ag yuzeyi 11/18, izinle kesisim 6
  is-yuku  ag yuzeyi 13/18, izinle kesisim 8
  yonetim  ag yuzeyi  7/18, izinle kesisim 2
```

Dokuz kalemlik izin yarıçabı üç ayrı sayıya bölünüyor: dışarıdan altı, iş yükü ağından sekiz,
yönetim ağından iki. Aynı sızan kimlik, aynı yetkiler, üç farklı yarıçap. **Yarıçap bir kimliğin
özelliği değil, bir kimlik ile bir konumun çiftidir.**

Alt blok iki katmanın birbirinden ne kadar bağımsız olduğunu gösteriyor. Dış konumdan ağ düzeyinde
on bir kaleme erişilebilir, ama sızan kimliğin izni bunların yalnız altısını kapsar. İş yükü ağında
ağ yüzeyi on üç, kesişim sekizdir. Ağ katmanı tek başına bir sınır değildir; izin katmanı tek başına
da değildir. Ölçülen şey ikisinin kesişimidir.

Tablonun en keskin satırı `ornek-yonetimi`dir. O kalem iş yükü ağından erişilemez ama dışarıdan
erişilebilir — yani sızan kimlik ağın **içinden** kullanıldığında ona ulaşılamaz, dışından
kullanıldığında ulaşılır. `abone-veritabani` ve `fatura-veritabani` bunun tersidir. İki konumun
yarıçapları alt küme ilişkisinde değildir; biri ötekinden yalnız daha büyük ya da küçük olmaz.

#### Özel Uç Noktanın Kapattığı Yol

Üç denetim aynı grafikte koşturuluyor. Her biri bir kalem kümesinin genel ucunu kapatır ve bedeli
o kalemlerden geçen meşru dış erişimdir.

```js
// bulut/kosum2.mjs — uc denetim: hangi kalemin genel ucu kapaniyor, yaricap konuma gore ne oluyor
import { ERISIM, KALEM, KONUM, yaricap } from './ag.mjs';

const kume = (f) => new Set(KALEM.filter(f).map((k) => k.ad));
const DENETIM = [
  ['denetim yok', new Set()],
  ['mesru dis erisimi olmayan kalem ozel uca', kume((k) => k.disIs === 0)],
  ['gunde 50 altinda dis erisimli kalem de', kume((k) => k.disIs < 50)],
  ['yalniz yonetim ucu kapanir', kume((k) => k.ad === 'ornek-yonetimi')],
];
const yaz = (g, ...s) => console.log(s.map((v, i) =>
  g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i])).join(''));
const A = [-42, 8, 7, 9, 10, 14];
yaz(A, 'denetim', 'kapali', ...KONUM, 'duran dis is');
for (const [ad, kapali] of DENETIM)
  yaz(A, ad, kapali.size, ...KONUM.map((k) => yaricap('hesap-toplayici', k, kapali)),
    KALEM.filter((k) => kapali.has(k.ad)).reduce((a, k) => a + k.disIs, 0));

console.log('\nen genis yaricap (10 kimligin hepsi taranir):');
const B = [-42, 8, 9, 10];
yaz(B, 'denetim', ...KONUM);
for (const [ad, kapali] of DENETIM)
  yaz(B, ad, ...KONUM.map((k) =>
    Math.max(...Object.keys(ERISIM).map((s) => yaricap(s, k, kapali)))));
```

```
denetim                                     kapali    dis  is-yuku   yonetim  duran dis is
denetim yok                                      0      6        8         2             0
mesru dis erisimi olmayan kalem ozel uca        10      4        8         2             0
gunde 50 altinda dis erisimli kalem de          16      0        8         2           101
yalniz yonetim ucu kapanir                       1      5        8         2            14

en genis yaricap (10 kimligin hepsi taranir):
denetim                                        dis  is-yuku   yonetim
denetim yok                                      6        8         3
mesru dis erisimi olmayan kalem ozel uca         4        8         3
gunde 50 altinda dis erisimli kalem de           2        8         3
yalniz yonetim ucu kapanir                       5        8         3
```

İlk denetim bedelsizdir. On sekiz kalemin onu hiç meşru dış erişim almıyor; genel uçları kapatmak
dış yarıçabı altıdan dörde indiriyor ve günde sıfır meşru işi durduruyor. Düşen iki kalem
`sir-deposu` ile `anahtar-yonetimi`dir — önceki dersin yürüyüşünde **üçüncü adımda** görünen iki
kalem. Yürüyüşün en derin noktası, ağ katmanında en ucuz kapatılan noktadır.

İkinci denetim eşiği günde elli dış erişime çekiyor. Kapanan kalem sayısı on altıya, dış yarıçap
sıfıra iniyor; bedeli günde yüz bir dış erişimdir. Bunların çoğu `olcum-deposu`na saha ekiplerinin
doğrudan yüklemesidir (kırk) ve rapor deposundan çekilen otuz erişimdir. Dış yarıçabı dörtten
sıfıra indirmenin bedeli günde yüz bir erişimdir; ilk denetim aynı yönde iki kalem kazandırırken
hiçbir meşru erişimi durdurmamıştı.

Üçüncü denetim tek bir kalemi hedefliyor. Yönetim ucunu kapatmak dış yarıçabı altıdan beşe indirir
ve günde on dört dış erişimi durdurur. Kalem başına on dört erişim ödüyor; eşik denetiminin kalem
başına on yedisinden sonra en pahalı ikinci denetim budur.

#### Otuz Çiftin Tamamı

Tek bir sızan kimlik bir örnektir. Grafiğin bütünü on kimlik ile üç konumun otuz çiftidir.

```js
// bulut/kosum3.mjs — (kimlik, konum) cifti basina yaricap: bedelsiz denetim once ve sonra
import { ERISIM, KALEM, KONUM, yaricap } from './ag.mjs';

const bedelsiz = new Set(KALEM.filter((k) => k.disIs === 0).map((k) => k.ad));
const yaz = (g, ...s) => console.log(s.map((v, i) =>
  g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i])).join(''));
const A = [-19, 6, 9, 9, 3, 6, 9, 9];
console.log(''.padEnd(19) + 'denetim yok'.padStart(24) +
  'bedelsiz denetimden sonra'.padStart(27));
yaz(A, 'kimlik', ...KONUM, '', ...KONUM);
for (const s of Object.keys(ERISIM))
  yaz(A, s, ...KONUM.map((k) => yaricap(s, k)), '',
    ...KONUM.map((k) => yaricap(s, k, bedelsiz)));
const cift = (kapali) => Object.keys(ERISIM).flatMap((s) => KONUM.map((k) => yaricap(s, k, kapali)));
const on = cift(new Set()), son = cift(bedelsiz);
console.log(`\n30 (kimlik, konum) cifti; toplam yaricap ${on.reduce((a, x) => a + x, 0)} -> ` +
  `${son.reduce((a, x) => a + x, 0)}, yaricabi 5'i asan cift ` +
  `${on.filter((x) => x > 5).length} -> ${son.filter((x) => x > 5).length}`);
console.log(`en genis yaricap ${Math.max(...on)} -> ${Math.max(...son)}; ` +
  `bedeli gunde 0 mesru dis erisim`);
```

```
                                denetim yok  bedelsiz denetimden sonra
kimlik                dis  is-yuku  yonetim      dis  is-yuku  yonetim
hesap-toplayici         6        8        2        4        8        2
hesap-dogrulayici       6        8        2        4        8        2
hesap-portal            3        7        2        2        7        2
hesap-rapor             2        2        3        2        2        3
rol-fatura              2        5        2        1        5        2
rol-arsiv               6        7        2        4        7        2
rol-yedek               5        6        2        3        6        2
rol-dagitim             4        2        3        2        2        3
rol-gunluk              0        1        2        0        1        2
rol-yonetim             3        2        1        1        2        1

30 (kimlik, konum) cifti; toplam yaricap 106 -> 92, yaricabi 5'i asan cift 8 -> 5
en genis yaricap 8 -> 8; bedeli gunde 0 mesru dis erisim
```

Otuz çiftin toplam yarıçabı yüz altıdan doksan ikiye iniyor — yaklaşık yüzde on üç. Yarıçabı beşi
aşan çift sekizden beşe düşüyor. Bunların hepsi bedelsiz denetimin sonucudur; günde tek bir meşru
dış erişim durmuyor.

Tablo bir yandan da bir kimliğin nerede tehlikeli olduğunu okutuyor. `rol-dagitim` dışarıdan dört,
iş yükü ağından iki, yönetim ağından üç kaleme ulaşır — en geniş yarıçabı **dış** konumdadır ve
bedelsiz denetim onu dörtten ikiye indirir. `hesap-portal` bunun tersidir: dışarıdan üç, iş yükü
ağından yedi. Aynı denetim bir kimliğin en tehlikeli konumunu kapatabilir, bir başkasınınkine hiç
dokunmayabilir.

Son satır bunun sınırını veriyor: en geniş yarıçap sekizden sekize, yani hiç değişmiyor.

#### Yalıtımın Düşürmediği Yarıçap

İş yükü ağı sütunu dört satırda da **sekiz**tir. Bu, bu dersin karar taşıyan sayısıdır: özel uç
noktalar dış konumu kapatır, ağın içindeki konumu kapatmaz. Bir kalemin genel ucunu kaldırmak, o
kaleme ağ içinden erişimi tanım gereği açık bırakır — özel uç noktanın yaptığı şey tam olarak
budur.

Bunun sonucu şudur: sızan kimlik bilgisi bir iş yükü örneğinde kullanılıyorsa, bütün özel uç nokta
çalışması yarıçabı sıfır kalem düşürür. Alt tablo aynı sonucu on kimliğin hepsi için doğruluyor —
iş yükü ağında en geniş yarıçap dört denetimde de sekizdir, yönetim ağında üçtür. Yalnız dış sütun
altıdan dörde, ikiye ve beşe iner.

Ağ yalıtımı bu yüzden bir kimlik denetimini değiştirmez, onu **tamamlar**. Dış konumdaki yarıçabı
sıfırlamak, ağ içindeki yarıçabı sekizde bırakır; önceki dersin güven kenarını kaldırması ise her
konumda birden etkiliydi. İki denetim aynı sayıyı düşürmez ve birinin ölçümü ötekinin yerine
geçmez.

Ölçümün pratik karşılığı bir sıralamadır. Bedelsiz on kalem önce kapatılır: dış yarıçabı iki kalem
düşürür, hiçbir meşru işi durdurmaz ve tartışma gerektirmez. Eşiği elliye çekmek dış yarıçabı
sıfırlar ama günde yüz bir erişimi durdurur; bu artık bir ağ kararı değil, saha ekiplerinin ve
rapor tüketicilerinin çalışma biçimine ilişkin bir karardır ve o ekiplerle konuşulmadan verilemez.
İş yükü ağındaki sekiz kalem ise hiçbir ağ kararıyla düşmez — o sayıyı düşürmek için önceki dersin
güven kenarlarına dönmek gerekir.

Bir yanlış sonuç bu tablodan özellikle çıkarılmamalıdır: dış yarıçabın sıfırlanması sızmanın
imkânsızlaştığı anlamına gelmez. Sıfır olan şey, kimlik bilgisinin **dışarıdan kullanılması
durumundaki** yarıçaptır. Aynı kimlik bilgisi ağ içindeki bir iş yüküne ulaşan bir yolla
kullanılırsa yarıçap yeniden sekizdir ve bu geçiş modelde bir konum değişiminden ibarettir.

#### Özet

- Gerçek yarıçap izin yürüyüşü ile ağ yolunun kesişimidir. Aynı 9 kalemlik yürüyüş dışarıdan 6,
  iş yükü ağından 8, yönetim ağından 2 kaleme iner; yarıçap kimliğin değil, kimlik ile konumun
  çiftinin özelliğidir.
- İki konumun yarıçapları alt küme ilişkisinde değildir: `ornek-yonetimi` yalnız dışarıdan,
  `abone-veritabani` yalnız iş yükü ağından erişilebilir.
- Meşru dış erişimi olmayan 10 kalemi özel uca almak dış yarıçabı 6'dan 4'e indirir ve günde 0
  meşru işi durdurur. Düşen iki kalem yürüyüşün en derin adımındaki `sir-deposu` ve
  `anahtar-yonetimi`dir.
- Eşiği günde 50 dış erişime çekmek dış yarıçabı sıfırlar; bedeli günde 101 meşru dış erişimdir.
  Yönetim ucunu tek başına kapatmak yarıçabı 1 kalem düşürür ve günde 14 erişimi durdurur.
- 30 `(kimlik, konum)` çiftinin toplam yarıçabı bedelsiz denetimle 106'dan 92'ye, yarıçabı 5'i aşan
  çift 8'den 5'e iner; en geniş yarıçap 8'de kalır.
- İş yükü ağı sütunu dört denetimde de 8'dir. Özel uç nokta dış konumu kapatır, ağ içindeki konumu
  kapatmaz; sızan kimlik bir iş yükü örneğinde kullanılıyorsa bu çalışmanın yarıçapa etkisi sıfırdır.

#### Sonraki Adım

Bu derste ağ yolu, bir kaleme ulaşmanın önkoşulu olarak ele alındı: yol kapalıysa izin işe
yaramıyordu. Ama listedeki bazı kalemlerin dış yolu bilerek açıktır — `portal-varlik-deposu` günde
sekiz bin altı yüz meşru dış erişim alır ve kapatılamaz. O kalem için soru yol değil, **izin
kümesidir**: dışarıdan gelen istek hangi kimlikle karşılanıyor ve hiçbir kimlik sunmayan bir istek
ne okuyabiliyor. Sonraki ders depolama kalemlerinin izin kümesini tarıyor, genel erişime açık
kalemi sayıyor ve o kalemden okunabilen veri türünü ölçüyor.

### Depolama Maruziyeti

Source: https://academia.sh/tr/kurslar/bulut-guvenligi/depolama-maruziyeti

Genel erişime açık depolama kaleminin iki ayrı ölçüsü: 13 nesne grubunun 7'si açık, 61.697 kayıt ve 7 veri türünden 6'sı okunabilir durumda. Kova düzeyinde genel erişimi kapatmak 9.260 kişisel kaydı kapatır ama yayılma yarıçabını 10'da bırakır; 47 kayıtlık yapılandırma kalemini kapatmak yarıçabı 10'dan 5'e indirir ve günde 9 meşru erişimi durdurur. Tüm genel erişimi kapatmanın bedeli günde 8.655 erişimdir.

Önceki ders ağ yolunu bir önkoşul olarak ele aldı: yol kapalıysa izin işe yaramıyordu. Ama bazı
kalemlerin dış yolu bilerek açıktır — abone portalının varlık deposu günde sekiz bin altı yüz meşru
dış erişim alır ve kapatılamaz. O kalem için soru yol değil, **izin kümesidir**: dışarıdan gelen bir
istek hangi kimlikle karşılanıyor ve hiçbir kimlik sunmayan bir istek ne okuyabiliyor.

Bu ders depolama kalemlerinin izin kümesini tarıyor. Bulutta Depolama ve Veri kursu kova erişimini
ve imzalı bağlantıyı ölçtü; burada mekanik tekrarlanmaz, yalnız **maruziyet** sayılır. İki ayrı
sayı çıkar ve dersin bulgusu ikisinin ayrılmasıdır: açık kalemden okunabilen **kayıt** ile o
kalemden başlayan **yayılma yarıçapı** aynı düzeltmeyle düşmüyor.

- **BG18.** İzin iki düzeyde yazılır: **kova düzeyi** ve **nesne grubu düzeyi**. Nesne düzeyinde bir
  değer yazılıysa etkin izin odur; yazılı değilse kova düzeyi devralınır.
- **BG19.** **Genel erişime açık** kalem, hiçbir kimlik sunmayan bir isteğin okuyabildiği ya da
  listeleyebildiği kalemdir. İmzalı erişim bu derste açık sayılmaz.
- **BG20.** Her nesne grubunun bir **veri türü**, bir kayıt sayısı ve günde kaç meşru genel erişim
  aldığı yazılır. Sayılar kurgudur.
- **BG21.** Bir nesne grubu bir **kimlik referansı** taşıyabilir: içindeki dosya, bir rolün adını ve
  onu kullanan yapılandırmayı içerir. Kimlik bilgisinin kendisi modellenmez, yalnız referansın
  varlığı ve sonucu sayılır.
- **BG22.** **Maruziyet yarıçapı** iki bileşenin birleşimidir: kimliksiz okunan kovalar ve açık bir
  dosyadaki kimlik referansından başlayan yürüyüşün ulaştığı kalemler.

#### İzin Kümesi ve Açık Kalem

```js
// bulut/depo.mjs — nesne deposu izin kumesi ve erisim grafigi MODELIDIR. Kurgu bolgesel olcum
// agi; depolama sinifi, imzali baglanti mekanigi ve saglayici adi bu derste yoktur.

// Sutunlar: kova, nesne grubu, kova duzeyi izin, nesne duzeyi izin ('-' = kovadan devralir),
// veri turu, kayit sayisi, gunde mesru genel erisim, gruptaki dosyanin tasidigi kimlik referansi.
export const GRUP = `
  portal-varlik-deposu site-varliklari  genel-oku genel-oku   varlik          1400 8600 -
  portal-varlik-deposu yukleme-onizleme genel-oku -           abone-kisisel   9260    0 -
  olcum-deposu         gunluk-yukleme   ozel      genel-oku   olcum          41800   40 -
  olcum-deposu         ham-okuma        ozel      -           olcum         512000    0 -
  fatura-cikti-deposu  abone-faturasi   ozel      imzali      fatura         24500  120 -
  fatura-cikti-deposu  toplu-cikti      ozel      genel-liste fatura           310    0 -
  ham-arsiv            gecmis-okuma     ozel      -           olcum        1240000    0 -
  ham-arsiv            ortak-cekme      ozel      genel-oku   olcum           8700    6 -
  yedek-deposu         gecelik-yedek    ozel      -           yedek            620    0 -
  yedek-deposu         eski-yedek       ozel      genel-oku   yedek            180    0 -
  sablon-deposu        dagitim-sablonu  ozel      genel-oku   yapilandirma      47    9 rol-dagitim
  rapor-deposu         aylik-rapor      ozel      imzali      fatura            36   30 -
  gunluk-deposu        uygulama-gunlugu ozel      -           gunluk         88000    0 -`
  .trim().split('\n').map((s) => {
    const p = s.trim().split(/\s+/);
    return { kova: p[0], grup: p[1], kovaIzin: p[2], nesneIzin: p[3], tur: p[4],
      kayit: Number(p[5]), mesru: Number(p[6]), kimlik: p[7] === '-' ? null : p[7] };
  });
export const GENEL = ['genel-oku', 'genel-liste'];
// Etkin izin: nesne duzeyi bir deger yaziyorsa o gecerlidir, yoksa kova duzeyi devralinir.
export const etkin = (g, d = {}) => {
  const kova = d.kovaKapali ? 'ozel' : g.kovaIzin;
  const nesne = d.kapali && d.kapali(g) ? 'ozel' : g.nesneIzin;
  return nesne === '-' ? kova : nesne;
};
export const acik = (g, d) => GENEL.includes(etkin(g, d));

// Erisim grafigi (onceki derslerle ayni): acik bir dosyada bulunan kimlik referansindan yuruyus.
const ERISIM = {
  'hesap-toplayici': 'olcum-deposu olcum-kuyrugu',
  'hesap-dogrulayici': 'olcum-deposu olcum-kuyrugu ham-arsiv',
  'hesap-portal': 'abone-veritabani portal-varlik-deposu is-emri-kuyrugu',
  'hesap-rapor': 'rapor-deposu fatura-cikti-deposu gunluk-deposu',
  'rol-fatura': 'fatura-veritabani fatura-cikti-deposu posta-cikisi abone-veritabani',
  'rol-arsiv': 'ham-arsiv yedek-deposu',
  'rol-yedek': 'yedek-deposu fatura-veritabani abone-veritabani olcum-deposu',
  'rol-dagitim': 'dagitim-yapilandirmasi sablon-deposu ornek-yonetimi',
  'rol-gunluk': 'gunluk-deposu denetim-gunlugu',
  'rol-yonetim': 'ornek-yonetimi anahtar-yonetimi sir-deposu',
};
const USTLENME = [['hesap-toplayici', 'rol-arsiv'], ['hesap-dogrulayici', 'rol-arsiv'],
  ['rol-arsiv', 'rol-yedek'], ['rol-yedek', 'rol-yonetim'], ['hesap-portal', 'rol-fatura'],
  ['rol-fatura', 'rol-gunluk'], ['hesap-rapor', 'rol-gunluk'], ['rol-dagitim', 'rol-yonetim']];
export function yuru(baslangic) {
  const g = new Set([baslangic]), kalem = new Set();
  let sira = [baslangic];
  while (sira.length) {
    const s = [];
    for (const k of sira) {
      for (const r of ERISIM[k].split(' ')) kalem.add(r);
      for (const [a, b] of USTLENME) if (a === k && !g.has(b)) { g.add(b); s.push(b); }
    }
    sira = s;
  }
  return kalem;
}
// Maruziyet yaricabi: kimliksiz okunan kovalar + acik dosyadaki kimlik referansinin yuruyusu.
export function yaricap(d) {
  const y = new Set(GRUP.filter((g) => acik(g, d)).map((g) => g.kova));
  for (const g of GRUP.filter((x) => acik(x, d) && x.kimlik))
    for (const r of yuru(g.kimlik)) y.add(r);
  return y;
}
```

```js
// bulut/kosum1.mjs — kac kalem genel erisime acik, hangi veri turu, kac kayit
import { GRUP, acik, etkin, yaricap } from './depo.mjs';

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i])).join(''));
const A = [-21, -18, -13, -15, 9, 7];
yaz(A, 'kova', 'nesne grubu', 'etkin izin', 'veri turu', 'kayit', 'mesru');
for (const g of GRUP.filter((x) => acik(x)))
  yaz(A, g.kova, g.grup, etkin(g), g.tur, g.kayit, g.mesru);
const kayit = (f) => GRUP.filter(f).reduce((a, g) => a + g.kayit, 0);
console.log(`\nacik kalem ${GRUP.filter((g) => acik(g)).length}/${GRUP.length}, ` +
  `acik kayit ${kayit((g) => acik(g))} / toplam ${kayit(() => true)} ` +
  `(%${(kayit((g) => acik(g)) / kayit(() => true) * 100).toFixed(1)})`);
const tur = [...new Set(GRUP.map((g) => g.tur))];
console.log(`veri turu ${tur.filter((t) => GRUP.some((g) => g.tur === t && acik(g))).length}/` +
  `${tur.length} acik; kapali kalan tur: ` +
  tur.filter((t) => GRUP.every((g) => g.tur !== t || !acik(g))).join(', '));
const y = yaricap({});
console.log(`\nkimliksiz okunan kova ${new Set(GRUP.filter((g) => acik(g)).map((g) => g.kova)).size}` +
  `; acik dosyadaki kimlik referansi ile yaricap ${y.size}`);
```

```
kova                 nesne grubu       etkin izin   veri turu          kayit  mesru
portal-varlik-deposu site-varliklari   genel-oku    varlik              1400   8600
portal-varlik-deposu yukleme-onizleme  genel-oku    abone-kisisel       9260      0
olcum-deposu         gunluk-yukleme    genel-oku    olcum              41800     40
fatura-cikti-deposu  toplu-cikti       genel-liste  fatura               310      0
ham-arsiv            ortak-cekme       genel-oku    olcum               8700      6
yedek-deposu         eski-yedek        genel-oku    yedek                180      0
sablon-deposu        dagitim-sablonu   genel-oku    yapilandirma          47      9

acik kalem 7/13, acik kayit 61697 / toplam 1926853 (%3.2)
veri turu 6/7 acik; kapali kalan tur: gunluk

kimliksiz okunan kova 6; acik dosyadaki kimlik referansi ile yaricap 10
```

On üç nesne grubunun yedisi genel erişime açık. Açık kayıt altmış bir bin altı yüz doksan yedidir
ve toplamın yalnız yüzde üç virgül ikisidir — hacim ölçüsü küçük görünüyor. Veri türü ölçüsü aynı
şeyi söylemiyor: yedi türden altısı açıktır, kapalı kalan tek tür uygulama günlüğüdür.

Dört satır ayrı ayrı okunmalıdır. `site-varliklari` bilerek açıktır ve günde sekiz bin altı yüz
meşru erişim alır. `yukleme-onizleme` aynı kovada durur, kova düzeyi iznini devralır ve dokuz bin
iki yüz altmış **abone kişisel kaydı** taşır; günde sıfır meşru genel erişim alır. İki grup arasında
tek fark, ikincisinin kendi iznini yazmamış olmasıdır.

`gunluk-yukleme` ile `ortak-cekme` ise ters durumdadır: kovaları özeldir, açıklık nesne düzeyinde
tek tek yazılmıştır ve ikisinin de meşru bir gerekçesi vardır. `eski-yedek` ve `toplu-cikti` de
nesne düzeyinde açıktır ama hiçbir meşru erişim almaz — yani bir zamanlar bir gerekçesi vardı ve
gerekçe düştüğünde izin düşmedi.

Son satır dersin ikinci ölçüsünü veriyor. Kimliksiz bir istek altı kovaya ulaşıyor. `sablon-deposu`
içindeki dağıtım şablonu bir kimlik referansı taşıyor ve o referanstan başlayan yürüyüş yarıçabı
ona çıkarıyor. Dört kalem — dağıtım yapılandırması, örnek yönetimi, anahtar yönetimi ve sır deposu
— hiçbir depolama izniyle açılmamıştır; kırk yedi kayıtlık bir yapılandırma dosyasından gelirler.

#### Beş Düzeltme

```js
// bulut/kosum2.mjs — bes duzeltme: acik kalem, acik kayit, yaricap ve durdurulan mesru erisim
import { GRUP, acik, yaricap } from './depo.mjs';

const DUZELTME = [
  ['denetim yok', {}],
  ['kova duzeyinde genel erisim kapanir', { kovaKapali: true }],
  ['mesru genel erisimi 0 olan kalem kapanir', { kapali: (g) => g.mesru === 0 }],
  ['yapilandirma turundeki acik kalem kapanir', { kapali: (g) => g.tur === 'yapilandirma' }],
  ['tum genel erisim kapanir', { kovaKapali: true, kapali: () => true }],
];
const yaz = (g, ...s) => console.log(s.map((v, i) =>
  g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i])).join(''));
const A = [-43, 7, 9, 9, 11];
yaz(A, 'duzeltme', 'acik', 'acik', 'yaricap', 'duran is');
yaz(A, '', 'kalem', 'kayit', '', 'gunde');
for (const [ad, d] of DUZELTME) {
  const a = GRUP.filter((g) => acik(g, d));
  yaz(A, ad, a.length, a.reduce((x, g) => x + g.kayit, 0), yaricap(d).size,
    GRUP.filter((g) => acik(g) && !acik(g, d)).reduce((x, g) => x + g.mesru, 0));
}
console.log('\nyaricabin iki bileseni (kimliksiz okunan kova / referanstan eklenen kalem):');
for (const [ad, d] of DUZELTME) {
  const kova = new Set(GRUP.filter((g) => acik(g, d)).map((g) => g.kova)).size;
  console.log(`  ${ad.padEnd(43)}${String(kova).padStart(2)} / ${yaricap(d).size - kova}`);
}
const cikan = [...yaricap({})].filter((r) => !yaricap(DUZELTME[3][1]).has(r)).sort();
console.log(`\nyapilandirma turu kapatilinca yaricaptan cikan ${cikan.length} kalem:`);
console.log('  ' + cikan.join(', '));
```

```
duzeltme                                      acik     acik  yaricap   duran is
                                             kalem    kayit               gunde
denetim yok                                      7    61697       10          0
kova duzeyinde genel erisim kapanir              6    52437       10          0
mesru genel erisimi 0 olan kalem kapanir         4    51947        8          0
yapilandirma turundeki acik kalem kapanir        6    61650        5          9
tum genel erisim kapanir                         0        0        0       8655

yaricabin iki bileseni (kimliksiz okunan kova / referanstan eklenen kalem):
  denetim yok                                 6 / 4
  kova duzeyinde genel erisim kapanir         6 / 4
  mesru genel erisimi 0 olan kalem kapanir    4 / 4
  yapilandirma turundeki acik kalem kapanir   5 / 0
  tum genel erisim kapanir                    0 / 0

yapilandirma turu kapatilinca yaricaptan cikan 5 kalem:
  anahtar-yonetimi, dagitim-yapilandirmasi, ornek-yonetimi, sablon-deposu, sir-deposu
```

İkinci satır bu dersin karar taşıyan bulgusudur. Kova düzeyinde genel erişimi kapatmak dokuz bin
iki yüz altmış kişisel kaydı kapatır — açık kaydın yüzde on beşi — ve günde tek bir meşru işi
durdurmaz. Buna karşılık **yayılma yarıçabı onda kalır**. Kapatılan tek kalem, kova düzeyi iznini
devralan gruptur; nesne düzeyinde açıkça yazılmış altı izin yerinde durur ve kimlik referansını
taşıyan grup onlardan biridir.

Dördüncü satır tersini gösteriyor. Yapılandırma türündeki tek açık kalemi kapatmak kırk yedi kayıt
kapatır — açık kaydın binde birinden azı — ve yarıçabı ondan beşe indirir. Bedeli günde dokuz meşru
erişimdir. Kova düzeyi düzeltmesi bu düzeltmenin yüz doksan yedi katı kayıt kapatır ve yarıçabı
sıfır kalem düşürür.

Alt blok nedenini ayırıyor. Yarıçap iki bileşenden oluşur: kimliksiz okunan kova sayısı ve kimlik
referansından eklenen kalem sayısı. İlk üç düzeltme ikinci bileşene hiç dokunmaz — dört kalem her
üçünde de yerinde durur. Dördüncü düzeltme ikinci bileşeni sıfırlar ve birinci bileşeni yalnız bir
azaltır. **Kayıt hacmini düşüren düzeltme ile yarıçabı düşüren düzeltme aynı düzeltme değildir.**

#### Açık Grupların Tek Tek Payı

Yedi açık grup toplu bir sayı verir; hangisinin ne taşıdığı ayrı ölçülür.

```js
// bulut/kosum3.mjs — acik gruplar tek tek: her biri tek basina kac kalemlik yaricap tasiyor
import { GRUP, acik, yaricap, yuru } from './depo.mjs';

const tek = (g) => {                               // yalniz bu grup acik olsaydi yaricap
  const y = new Set([g.kova]);
  if (g.kimlik) for (const r of yuru(g.kimlik)) y.add(r);
  return y.size;
};
const yaz = (g, ...s) => console.log(s.map((v, i) =>
  g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i])).join(''));
const A = [-21, -15, 9, 10, 8, 15];
yaz(A, 'tek basina acik grup', 'veri turu', 'kayit', 'yaricap', 'mesru', 'kayit / kalem');
const acikGrup = GRUP.filter((g) => acik(g));
for (const g of acikGrup) yaz(A, g.grup, g.tur, g.kayit, tek(g), g.mesru, Math.round(g.kayit / tek(g)));
const toplam = acikGrup.reduce((a, g) => a + tek(g), 0);
console.log(`\ntek tek yaricaplarin toplami ${toplam}, birlikte olculen yaricap ` +
  `${yaricap({}).size}: ${toplam - yaricap({}).size} kalem iki gruptan birden geliyor`);
```

```
tek basina acik grup veri turu          kayit   yaricap   mesru  kayit / kalem
site-varliklari      varlik              1400         1    8600           1400
yukleme-onizleme     abone-kisisel       9260         1       0           9260
gunluk-yukleme       olcum              41800         1      40          41800
toplu-cikti          fatura               310         1       0            310
ortak-cekme          olcum               8700         1       6           8700
eski-yedek           yedek                180         1       0            180
dagitim-sablonu      yapilandirma          47         5       9              9

tek tek yaricaplarin toplami 11, birlikte olculen yaricap 10: 1 kalem iki gruptan birden geliyor
```

Altı grubun yarıçabı birdir: açık olan kova okunur ve orada biter. Yedincisi beştir. Son sütun bunu
tek bir orana çeviriyor — kalem başına düşen kayıt sayısı. `gunluk-yukleme` kalem başına kırk bir
bin sekiz yüz kayıt taşır; `dagitim-sablonu` dokuz. Dört bin altı yüz kat fark, iki grubun aynı
listede
neden farklı işlem gördüğünü açıklıyor: biri okunacak veri, öteki açılacak kapıdır.

Son satır ölçünün toplanabilirliğini sınıyor. Tek tek yarıçapların toplamı on birdir, birlikte
ölçülen yarıçap ondur. Fark bir kalemdir: iki açık grup aynı kovada durduğu için kova iki kez
sayılmıştır. Yayılma yarıçapı bir küme büyüklüğüdür ve grup grup toplanamaz.

#### İki Ölçünün Ayrılması

Maruziyeti tek bir sayıyla vermek mümkün değildir, çünkü iki ayrı zarar biçimi vardır. Kişisel
kayıtların okunması doğrudan bir zarardır ve büyüklüğü kayıt sayısıyla ölçülür: dokuz bin iki yüz
altmış abone kaydı, hiçbir yürüyüş gerektirmeden okunur. Yapılandırma dosyasının okunması ise
kendi başına küçüktür — kırk yedi kayıt — ama başka dört kaleme açılan bir kapıdır.

İki ölçü farklı önceliklendirme üretir. Kayıt hacmine göre sıralandığında ilk düzeltme
`yukleme-onizleme`dir; yarıçapa göre sıralandığında ilk düzeltme `dagitim-sablonu`dur. Doğru sıra
ikisinin de bedelsize yakın olmasıdır: birincisi günde sıfır, ikincisi günde dokuz meşru erişim
durdurur. Üçüncü satırdaki düzeltme — meşru erişimi hiç olmayan kalemleri kapatmak — dört açık
kaleme iner ve bedeli sıfırdır, ama yapılandırma kalemini kapsamaz çünkü o kalemin günde dokuz
meşru erişimi vardır.

Son satır sınırı çiziyor. Tüm genel erişimi kapatmak yarıçabı sıfırlar; bedeli günde sekiz bin
altı yüz elli beş erişimdir ve bunun sekiz bin altı yüzü abone portalının varlıklarıdır. Bu, bir
depolama kararı değil, portalın çalışma biçimine ilişkin bir karardır — ve o kalemin açık olması
yarıçapa hiçbir katkı yapmaz, çünkü içinde kimlik referansı yoktur.

#### Özet

- 13 nesne grubunun 7'si genel erişime açıktır; açık kayıt 61.697, toplamın %3,2'sidir. Veri
  türünde ölçü başkadır: 7 türden 6'sı açıktır, kapalı kalan tek tür uygulama günlüğüdür.
- Etkin izin nesne düzeyinden gelir: aynı kovada duran iki gruptan biri kendi iznini yazmadığı için
  9.260 abone kişisel kaydı, günde 0 meşru erişim alarak açık durur.
- Maruziyet yarıçapı iki bileşenlidir: kimliksiz okunan 6 kova ve açık bir yapılandırma dosyasındaki
  kimlik referansından eklenen 4 kalem — toplam 10.
- Kova düzeyinde genel erişimi kapatmak 9.260 kaydı kapatır, günde 0 iş durdurur ve yarıçabı 10'da
  bırakır. Kayıt hacmini düşüren düzeltme yarıçabı düşürmeyebilir.
- 47 kayıtlık yapılandırma kalemini kapatmak yarıçabı 10'dan 5'e indirir ve günde 9 meşru erişimi
  durdurur; kova düzeyi düzeltmesinin 197 katı az kayıt kapatır, yarıçabı 5 kalem düşürür.
- Tüm genel erişimi kapatmak yarıçabı sıfırlar; bedeli günde 8.655 erişimdir ve 8.600'ü yarıçapa
  hiç katkı yapmayan tek bir kalemden gelir.

#### Sonraki Adım

Bu derste açık bir dosyanın içeriği okunabilir kabul edildi. Kayıtlar diskte şifreliydi, ama
okuyabilen özne için bu bir engel olmadı — çünkü çözme, okuma isteğinin bir parçası olarak
sağlayıcı tarafında yapıldı. Sorulmayan soru şudur: çözme anahtarı kimde duruyorsa yarıçap değişir
mi? Sonraki ders anahtar sahipliğini üç kipte koşturuyor ve tek bir şeyi ölçüyor: sızan kimliğin
**okuyabildiği** kalem sayısı, anahtar sağlayıcıda iken ve müşteride iken kaç.

### Anahtar ve Sır Yönetimi

Source: https://academia.sh/tr/kurslar/bulut-guvenligi/anahtar-ve-sir-yonetimi

Anahtar sahipliğinin yayılma yarıçapına etkisi üç kipte koşturulur: sağlayıcı anahtarında sızan kimlik 16 kalem okur, müşteri yönetilen anahtarda yine 16, müşteri tutulan anahtarda 11. Tek bir anahtar iznini zincirin dışına almak yönetilen kipte 16'yı 6'ya, tutulan kipte 11'i 3'e indirir ve günde 1 meşru işlemi durdurur. Sır deposu okunduğunda yürüyüşe 4 kimlik ekleniyor.

Önceki derste açık bir dosyanın içeriği okunabilir sayıldı. Kayıtlar diskte şifreliydi, ama okuma
izni olan özne için bu bir engel olmadı — çözme, okuma isteğinin bir parçası olarak sağlayıcı
tarafında yapıldı. Sorulmayan soru şudur: çözme anahtarı kimde duruyorsa yarıçap değişir mi.

Bu ders yalnız onu ölçer. Bulut Yönetişimi, Güvenlik ve Maliyet kursu beklemede ve aktarımda
şifrelemeyi, zarf şifrelemesini ve döndürme penceresini ölçtü; burada şifreleme mekaniğinin
hiçbiri tekrarlanmaz. Ölçülen tek şey **anahtar sahipliğinin okunabilen kalem sayısına
etkisidir**. İkinci yarıda sır deposu ele alınıyor ve bu dersin ikinci bulgusu çıkıyor: sır
deposu yürüyüşte bir kalem değil, bir
**kenar kaynağıdır**.

- **BG23.** Üç **sahiplik kipi** vardır. `saglayici`: anahtar sağlayıcının elindedir ve çözme, okuma
  isteğinin parçası olarak yapılır. `yonetilen`: anahtar müşterinindir ve anahtar yönetimi
  servisinde durur; çözme için ayrı bir **anahtar kullanma izni** gerekir. `tutulan`: anahtar
  kiralanan altyapının dışındadır ve sızan bir bulut kimliği ona ulaşamaz.
- **BG24.** Anahtar kullanma izni erişim izninden **ayrı** bir kümedir. Bir kimlik bir kaleme
  erişebilirken onun anahtarını kullanamayabilir.
- **BG25.** Her kalem en güçlü hangi kipi desteklediğini yazar. Sunucu tarafında çözen bir yönetilen
  hizmet `tutulan` kipini destekleyemez; bu bir model kararıdır ve hizmet türünden gelir.
- **BG26.** Sır deposu okunabildiğinde içindeki her sır bir **kimlik** olur ve yürüyüş oradan devam
  eder. Sırların içeriği modellenmez, yalnız hangi kimliğe karşılık geldikleri sayılır.
- **BG27.** Yürüyüş bir sabit noktaya kadar koşar: kimlik kümesi büyüdükçe anahtar izni ve okunan
  kalem büyür, okunan kalem büyüdükçe kimlik kümesi büyür.

#### Üç Kip, Üç Sayı

```js
// bulut/anahtar.mjs — anahtar sahipliginin yaricapa etkisi MODELIDIR. Sifreleme mekanigi, zarf
// sifrelemesi ve donderme penceresi bu derste yoktur; yalniz okunabilen kalem sayilir.

const ERISIM = {
  'hesap-toplayici': 'olcum-deposu olcum-kuyrugu',
  'hesap-dogrulayici': 'olcum-deposu olcum-kuyrugu ham-arsiv',
  'hesap-portal': 'abone-veritabani portal-varlik-deposu is-emri-kuyrugu',
  'hesap-rapor': 'rapor-deposu fatura-cikti-deposu gunluk-deposu',
  'rol-fatura': 'fatura-veritabani fatura-cikti-deposu posta-cikisi abone-veritabani',
  'rol-arsiv': 'ham-arsiv yedek-deposu',
  'rol-yedek': 'yedek-deposu fatura-veritabani abone-veritabani olcum-deposu',
  'rol-dagitim': 'dagitim-yapilandirmasi sablon-deposu ornek-yonetimi',
  'rol-gunluk': 'gunluk-deposu denetim-gunlugu',
  'rol-yonetim': 'ornek-yonetimi anahtar-yonetimi sir-deposu',
};
const USTLENME = [['hesap-toplayici', 'rol-arsiv'], ['hesap-dogrulayici', 'rol-arsiv'],
  ['rol-arsiv', 'rol-yedek'], ['rol-yedek', 'rol-yonetim'], ['hesap-portal', 'rol-fatura'],
  ['rol-fatura', 'rol-gunluk'], ['hesap-rapor', 'rol-gunluk'], ['rol-dagitim', 'rol-yonetim']];
// Kimligin anahtar kullanma izni: erisim izninden ayri bir kumedir.
export const ANAHTAR_IZNI = {
  'hesap-toplayici': 'k-olcum', 'hesap-dogrulayici': 'k-olcum', 'hesap-portal': 'k-abone',
  'hesap-rapor': 'k-fatura k-gunluk', 'rol-fatura': 'k-fatura k-abone', 'rol-arsiv': 'k-olcum',
  'rol-yedek': 'k-yedek', 'rol-dagitim': 'k-sir', 'rol-gunluk': 'k-gunluk',
  'rol-yonetim': 'k-sir',
};
// Kalem: sifreli mi, hangi anahtarla, en guclu destekledigi sahiplik kipi.
// Kipler: saglayici < yonetilen < tutulan. Yonetilen anahtar anahtar yonetimi servisinde durur,
// tutulan anahtar kiralanan altyapinin disindadir ve sizan kimlik ona ulasamaz.
export const KIP = ['saglayici', 'yonetilen', 'tutulan'];
export const KALEM = `
  olcum-deposu           k-olcum   tutulan
  ham-arsiv              k-olcum   tutulan
  yedek-deposu           k-yedek   tutulan
  fatura-cikti-deposu    k-fatura  tutulan
  rapor-deposu           k-fatura  tutulan
  dagitim-yapilandirmasi k-sir     tutulan
  abone-veritabani       k-abone   yonetilen
  fatura-veritabani      k-fatura  yonetilen
  gunluk-deposu          k-gunluk  yonetilen
  sir-deposu             k-sir     yonetilen
  denetim-gunlugu        k-gunluk  saglayici
  olcum-kuyrugu          -         -
  portal-varlik-deposu   -         -
  is-emri-kuyrugu        -         -
  posta-cikisi           -         -
  anahtar-yonetimi       -         -
  ornek-yonetimi         -         -
  sablon-deposu          -         -`
  .trim().split('\n').map((s) => {
    const [ad, anahtar, destek] = s.trim().split(/\s+/);
    return { ad, anahtar: anahtar === '-' ? null : anahtar, destek };
  });
export const bul = (ad) => KALEM.find((k) => k.ad === ad);
// Sir deposu okunursa icindeki sirlar birer kimliktir; yuruyus oradan devam eder.
export const SIRLAR = ['hesap-portal', 'rol-fatura', 'hesap-rapor'];

// Gunde kac mesru islem hangi anahtari kullaniyor: [kimlik, anahtar, gunde kullanim]
export const MESRU_ANAHTAR = [['hesap-toplayici', 'k-olcum', 1440],
  ['hesap-dogrulayici', 'k-olcum', 720], ['hesap-portal', 'k-abone', 3100],
  ['hesap-rapor', 'k-fatura', 40], ['hesap-rapor', 'k-gunluk', 12],
  ['rol-fatura', 'k-fatura', 260], ['rol-fatura', 'k-abone', 260],
  ['rol-arsiv', 'k-olcum', 96], ['rol-yedek', 'k-yedek', 4],
  ['rol-dagitim', 'k-sir', 6], ['rol-gunluk', 'k-gunluk', 88], ['rol-yonetim', 'k-sir', 1]];

// Sizan kimlikten okunabilen kalem: sabit nokta. Sir deposu okunursa kimlik kumesi buyur.
export function okunan(hedef, cikarilan = new Set()) {
  const kimlik = new Set(['hesap-toplayici']);
  const kapat = () => {                            // ustlenme kapanisi
    let n = -1;
    while (kimlik.size !== n) {
      n = kimlik.size;
      for (const k of [...kimlik]) for (const [a, b] of USTLENME) if (a === k) kimlik.add(b);
    }
  };
  let onceki = -1, kalem = new Set(), izin = new Set();
  while (kimlik.size !== onceki) {
    onceki = kimlik.size;
    kapat();
    izin = new Set([...kimlik].flatMap((k) => ANAHTAR_IZNI[k].split(' '))
      .filter((a) => !cikarilan.has(a)));
    kalem = new Set([...kimlik].flatMap((k) => ERISIM[k].split(' ')).filter((r) => {
      const x = bul(r);
      if (x.anahtar === null) return true;                       // sifresiz kalem
      const kip = KIP.indexOf(hedef) < KIP.indexOf(x.destek) ? hedef : x.destek;
      return kip === 'saglayici' || (kip === 'yonetilen' && izin.has(x.anahtar));
    }));
    if (kalem.has('sir-deposu')) for (const s of SIRLAR) kimlik.add(s);
  }
  return { kimlik, kalem, izin };
}
```

```js
// bulut/kosum1.mjs — uc sahiplik kipinde sizan kimligin okuyabildigi kalem
import { KALEM, KIP, bul, okunan } from './anahtar.mjs';

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i])).join(''));
const A = [-23, -10, -11, 12, 12, 10];
yaz(A, 'kalem', 'anahtar', 'destek', ...KIP);
const R = Object.fromEntries(KIP.map((k) => [k, okunan(k)]));
const gorulen = [...new Set(KIP.flatMap((k) => [...R[k].kalem]))].sort();
for (const r of gorulen.filter((x) => bul(x).anahtar))
  yaz(A, r, bul(r).anahtar, bul(r).destek, ...KIP.map((k) => R[k].kalem.has(r) ? 'okunur' : '-'));
yaz(A, `+ ${gorulen.filter((x) => !bul(x).anahtar).length} sifresiz kalem`, '', '',
  ...KIP.map(() => 'okunur'));
yaz(A, 'okunan kalem', '', '', ...KIP.map((k) => R[k].kalem.size));
console.log(`\nyuruyuse giren kimlik: ` + KIP.map((k) => `${k} ${R[k].kimlik.size}`).join(', '));
console.log('sizan kimligin zincirinden gelen anahtar izni: ' +
  [...R.tutulan.izin].sort().join(', '));
console.log(`sifresiz kalem ${KALEM.filter((k) => k.anahtar === null).length}/${KALEM.length}`);
```

```
kalem                  anahtar   destek        saglayici   yonetilen   tutulan
abone-veritabani       k-abone   yonetilen        okunur      okunur    okunur
denetim-gunlugu        k-gunluk  saglayici        okunur      okunur    okunur
fatura-cikti-deposu    k-fatura  tutulan          okunur      okunur         -
fatura-veritabani      k-fatura  yonetilen        okunur      okunur    okunur
gunluk-deposu          k-gunluk  yonetilen        okunur      okunur    okunur
ham-arsiv              k-olcum   tutulan          okunur      okunur         -
olcum-deposu           k-olcum   tutulan          okunur      okunur         -
rapor-deposu           k-fatura  tutulan          okunur      okunur         -
sir-deposu             k-sir     yonetilen        okunur      okunur    okunur
yedek-deposu           k-yedek   tutulan          okunur      okunur         -
+ 6 sifresiz kalem                                okunur      okunur    okunur
okunan kalem                                          16          16        11

yuruyuse giren kimlik: saglayici 8, yonetilen 8, tutulan 8
sizan kimligin zincirinden gelen anahtar izni: k-abone, k-fatura, k-gunluk, k-olcum, k-sir, k-yedek
sifresiz kalem 7/18
```

İlk iki sütun aynıdır: on altı. Anahtar müşteriye geçtiğinde okunabilen kalem sayısı hiç değişmiyor.
Nedeni son satırdan bir öncekidir — sızan kimliğin zinciri altı anahtar izninin **hepsini** taşıyor.
Sahiplik kipi çözmeyi bir izne bağlar; o izin de aynı zincirin üzerindeyse bağlama işe yaramaz.

Üçüncü sütun on bir veriyor. Düşen beş kalem `tutulan` kipini destekleyen kalemlerdir: ölçüm
deposu, ham arşiv, yedek deposu, fatura çıktı deposu ve rapor deposu. Kalan beşi destekleyemez,
çünkü çözme sunucu tarafında yapılan yönetilen hizmetlerdir.

İkinci satırdan bir öncesi de dikkat çeker. Yürüyüşe giren kimlik sayısı üç kipte de sekizdir —
oysa erişim grafiğinin kendisi dört kimlikle biterdi. Aradaki dört kimlik sır deposundan gelir ve
sır deposu üç kipte de okunabilir.

#### Sahiplik Tek Başına Yetmiyor

Sahiplik kipi ile anahtar kullanma izni iki ayrı kaldıraçtır. İkisi ayrı ayrı ve birlikte
koşturuluyor.

```js
// bulut/kosum2.mjs — sahiplik kipi ile anahtar izninin birlikte etkisi; her ikisinin bedeli
import { KALEM, KIP, MESRU_ANAHTAR, SIRLAR, okunan } from './anahtar.mjs';

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i])).join(''));
const A = [-12, 16, 15, 13, 12];
yaz(A, 'sahiplik', 'k-sir zincirde', 'k-sir disinda', 'yuruyen', 'yuruyen');
yaz(A, 'kipi', 'okunan kalem', 'okunan kalem', 'kimlik', 'kimlik');
for (const k of KIP) {
  const a = okunan(k), b = okunan(k, new Set(['k-sir']));
  yaz(A, k, a.kalem.size, b.kalem.size, a.kimlik.size, b.kimlik.size);
}
const sirIs = MESRU_ANAHTAR.filter(([k, a]) => a === 'k-sir' && k === 'rol-yonetim')
  .reduce((x, [, , n]) => x + n, 0);
console.log(`\nk-sir iznini zincirdeki rolden almanin bedeli: gunde ${sirIs} mesru islem`);
console.log(`sir deposundaki sir sayisi ${SIRLAR.length}; okunursa yuruyuse giren ek kimlik ` +
  `${okunan('saglayici').kimlik.size - 4}`);
const sifreli = KALEM.filter((k) => k.anahtar);
const desteksiz = sifreli.filter((k) => k.destek !== 'tutulan');
console.log(`\ntutulan kipini ${sifreli.length} sifreli kalemin ${desteksiz.length}'i ` +
  'desteklemiyor:');
console.log('  ' + desteksiz.map((k) => k.ad).join(', '));
const dis = MESRU_ANAHTAR.filter(([, a]) =>
  sifreli.some((k) => k.anahtar === a && k.destek === 'tutulan'));
console.log(`disaridan anahtar teslimi gereken (is yuku, anahtar) cifti ${dis.length}; ` +
  `gunde ${dis.reduce((x, [, , n]) => x + n, 0)} islem bu yoldan geciyor`);
```

```
sahiplik      k-sir zincirde  k-sir disinda      yuruyen     yuruyen
kipi            okunan kalem   okunan kalem       kimlik      kimlik
saglayici                 16             16            8           8
yonetilen                 16              6            8           4
tutulan                   11              3            8           4

k-sir iznini zincirdeki rolden almanin bedeli: gunde 1 mesru islem
sir deposundaki sir sayisi 3; okunursa yuruyuse giren ek kimlik 4

tutulan kipini 11 sifreli kalemin 5'i desteklemiyor:
  abone-veritabani, fatura-veritabani, gunluk-deposu, sir-deposu, denetim-gunlugu
disaridan anahtar teslimi gereken (is yuku, anahtar) cifti 8; gunde 2567 islem bu yoldan geciyor
```

Tablo altı hücrelidir ve üçü karar taşır. Sağlayıcı satırında iki sütun aynıdır: on altı ve on
altı. Anahtar izniyle oynamak sağlayıcı anahtarında hiçbir şey değiştirmez, çünkü çözme için izin
sorulmaz — okuma izni düz metin demektir.

Yönetilen satırı bu dersin en keskin karşılaştırmasını verir. Anahtar müşteriye geçirildiğinde tek
başına yarıçap on altıda kalır. Aynı kipte tek bir anahtar izni — sır deposunun anahtarı — sızan
kimliğin zincirinden çıkarıldığında yarıçap **altıya** iner. Aynı sahiplik kipi, aynı grafik, iki
buçuk kattan fazla fark. Sahiplik yarıçabı düşürmez; sahibin izni kime verdiği düşürür.

Tutulan satırı da aynı yönde okunur: on birden üçe. Ama on bir ile on altı arasındaki fark beş
kalemdir ve bedeli ağırdır — beş şifreli kalem bu kipi hiç desteklemez ve sekiz `(iş yükü, anahtar)`
çifti dışarıdan anahtar teslimi gerektirir; günde iki bin beş yüz altmış yedi işlem o yoldan geçer.
Tek bir izni kaldırmanın bedeli ise günde bir meşru işlemdir.

#### Altı Anahtar Tek Tek

Sır deposunun anahtarı örnek olarak seçildi. Altı anahtarın hepsi aynı ölçüden geçirilirse seçimin
neden bu olduğu görülür.

```js
// bulut/kosum3.mjs — tek tek anahtar izinleri: hangisini zincirden almak yaricabi ne kadar dusurur
import { ANAHTAR_IZNI, MESRU_ANAHTAR, okunan } from './anahtar.mjs';

const ANAHTAR = [...new Set(Object.values(ANAHTAR_IZNI).flatMap((s) => s.split(' ')))].sort();
const yaz = (g, ...s) => console.log(s.map((v, i) =>
  g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i])).join(''));
const A = [-10, 11, 11, 12, 13];
const taban = okunan('yonetilen').kalem.size;
yaz(A, 'anahtar', 'yonetilen', 'tutulan', 'yaricap', 'duran islem');
yaz(A, 'zincirden', 'kipinde', 'kipinde', 'dususu', 'gunde');
for (const a of ANAHTAR) {
  const c = new Set([a]);
  yaz(A, a, okunan('yonetilen', c).kalem.size, okunan('tutulan', c).kalem.size,
    taban - okunan('yonetilen', c).kalem.size,
    MESRU_ANAHTAR.filter(([, x]) => x === a).reduce((s, [, , n]) => s + n, 0));
}
const hepsi = new Set(ANAHTAR);
console.log(`\nhepsi cikarilirsa: yonetilen ${okunan('yonetilen', hepsi).kalem.size}, ` +
  `tutulan ${okunan('tutulan', hepsi).kalem.size}; ` +
  `gunde ${MESRU_ANAHTAR.reduce((s, [, , n]) => s + n, 0)} islem durur`);
```

```
anahtar     yonetilen    tutulan     yaricap  duran islem
zincirden     kipinde    kipinde      dususu        gunde
k-abone            15         10           1         3360
k-fatura           13         10           3          300
k-gunluk           15         10           1          100
k-olcum            14         11           2         2256
k-sir               6          3          10            7
k-yedek            15         11           1            4

hepsi cikarilirsa: yonetilen 3, tutulan 3; gunde 6027 islem durur
```

Beş anahtarın yarıçap düşüşü bir ile üç arasındadır; altıncısı ondur. `k-abone` günde üç bin üç yüz
altmış işlem taşır ve kaldırılırsa yarıçabı tek bir kalem düşürür. `k-sir` günde yedi işlem taşır
ve yarıçabı on kalem düşürür. Kalem başına bedel oranı arasında üç bin katın üzerinde fark vardır.

Bu tablodaki yedi rakamı bir önceki bölümün bir rakamıyla karıştırmamak gerekir: burada izin
**bütün kimliklerden** çıkarılıyor ve dağıtım rolünün günde altı işlemi de duruyor. Sızan kimliğin
zincirinde olan tek rolden almak yeterlidir ve bedeli günde bir işlemdir.

Son satır sınırı çiziyor: bütün anahtar izinleri çıkarılırsa yarıçap üçe iner ve günde altı bin
yirmi yedi işlem durur. Yani yarıçabı ondan üçe indirmenin yolu bütün izinleri kaldırmak değildir;
altıdan birini kaldırmak farkın büyük bölümünü verir.

#### Sır Deposu Bir Kalem Değil

Sağdaki iki sütun neden bu kadar büyük bir fark çıktığını söylüyor. `k-sir` zincirdeyken yürüyüşe
sekiz kimlik giriyor; çıkarıldığında dört. Sır deposu okunduğunda içindeki üç sır üç kimliğe
karşılık geliyor ve üstlenme kapanışıyla birlikte dört yeni kimlik yürüyüşe katılıyor.

Bu, sır deposunun grafikteki yerini değiştirir. Öteki kalemler yürüyüşün **sonu**dur: okunur ve
orada biter. Sır deposu okunduğunda yürüyüşün yeni **kenarları** doğar — yani sır deposu bir kalem
değil, bir kenar kaynağıdır. Yarıçap ölçümünde ona bir kalem olarak bakmak sayıyı on altı yerine
dokuz gösterir.

Aynı nedenle ölçüm bir sabit nokta hesabıdır. Kimlik kümesi büyüdükçe anahtar izni büyür, anahtar
izni büyüdükçe okunan kalem büyür, okunan kalemde sır deposu varsa kimlik kümesi yeniden büyür.
Döngü ancak yeni kimlik gelmediğinde durur. Tek bir geçişte hesaplanan yarıçap bu modelde eksik
çıkar.

Önceki dersin bulgusuyla birleştirildiğinde sıra netleşir: bir yapılandırma dosyasında duran kimlik
referansı yarıçabı beş kalem büyütüyordu, sır deposunun okunabilmesi yedi kalem büyütüyor. İkisi de
küçük kalemlerdir ve ikisinin de zararı kendi içeriğinde değil, açtıkları kenarlardadır.

#### Özet

- Anahtar sahipliği tek başına yarıçabı düşürmüyor: sağlayıcı anahtarında 16, müşteri yönetilen
  anahtarda yine 16 kalem okunuyor. Sızan kimliğin zinciri altı anahtar izninin hepsini taşıyor.
- Müşteri tutulan anahtar 16'yı 11'e indirir; düşen beş kalem bu kipi destekleyen kalemlerdir.
  Yürüyüşün ulaştığı 10 şifreli kalemin 5'i sunucu tarafında çözdüğü için bu kipi hiç
  desteklemez.
- Tek bir anahtar iznini zincirin dışına almak yönetilen kipte 16'yı 6'ya, tutulan kipte 11'i 3'e
  indirir. Aynı sahiplik kipinde iki buçuk kattan fazla fark; bedeli günde 1 meşru işlemdir.
- Tutulan kipin bedeli ağırdır: 8 `(iş yükü, anahtar)` çifti dışarıdan anahtar teslimi ister ve
  günde 2.567 işlem o yoldan geçer.
- Sır deposu yürüyüşte bir kalem değil bir kenar kaynağıdır: okunduğunda 3 sır 3 kimliğe karşılık
  gelir ve kapanışla birlikte yürüyüşe 4 kimlik girer, kimlik sayısı 4'ten 8'e çıkar.
- Ölçüm bir sabit nokta hesabıdır; tek geçişte hesaplanan yarıçap bu modelde 9 çıkar, sabit
  noktada 16.

#### Sonraki Adım

Beş ders boyunca yanlış kalemler tek tek bulundu: aşırı geniş bir güven listesi, kapatılmamış bir
genel uç, nesne düzeyinde unutulmuş bir izin, zincirin üzerinde duran bir anahtar izni. Hepsi
**çalışan sistemde** bulundu ve her biri bulunduğunda çoktan yerindeydi. Sorulmayan soru şudur:
bunların kaçı sisteme konmadan önce, şablonda görülebilirdi. Sonraki ders şablon kümesini bir kural
setinden geçiriyor ve dağıtımdan önce yakalanan kalemi ancak koşarken görülebilen kalemden ayırıyor.

### Kod Olarak Altyapı Güvenliği

Source: https://academia.sh/tr/kurslar/bulut-guvenligi/kod-olarak-altyapi-guvenligi

Önceki beş dersin bulduğu yanlış kalemler şablon kümesine geri konur ve kural setinden geçirilir: 11 yanlış kalemin 4'ü dağıtımdan önce yakalanır ve toplam 34 birimlik yarıçap payının 23'ünü (%68) kapatır, 5 kalem ancak koşarken çözülür, 2 kalemin şablonda okunacak bir değeri yoktur. Kural seti 3 meşru kalemi yanlış işaretler; kuralı kapatmak yanlış işareti de gerçek bulguyu da siler.

Beş ders boyunca yanlış kalemler tek tek bulundu: aşırı geniş bir güven listesi, kapatılmamış bir
genel uç, nesne düzeyinde unutulmuş bir izin, zincirin üzerinde duran bir anahtar izni. Hepsi
çalışan sistemde bulundu ve her biri bulunduğunda çoktan yerindeydi. Bu ders son bir soru soruyor:
bunların kaçı sisteme konmadan önce, **şablonda** görülebilirdi.

Altyapının şablonla kurulması DevOps ve Platform Mühendisliği müfredatının Kod Olarak Altyapı
kursunda ölçüldü; sağlama modelleri ve sapma taraması burada tekrarlanmaz. Ölçülen tek ayrım şudur:
**dağıtımdan önce bilinen değer** ile **ancak koşarken bilinen değer**. Bir kural yalnız birinciye
karar verebilir.

- **BG28.** Şablon bir kaynağın alanlarını yazar. Bir alanın değeri ya **çözünürdür** (şablon
  okunarak bilinir) ya da değildir: dağıtım parametresi, başka bir şablonun çıktısı, sağlayıcının
  belirlediği varsayılan, şablon dışında elle yapılan bir değişiklik ya da bir dosyanın içeriği.
- **BG29.** **Kural seti** belirli alanlara bakar. Bir kuralın sonucu üç sınıftan biridir:
  **yakalandı** (çözünür değer, kural ateşledi), **bilinmiyor** (kural alana bakıyor ama değeri
  çözemiyor), **görülmüyor** (hiçbir kural o alana bakmıyor).
- **BG30.** Her alanın **yarıçap payı**, önceki beş derste o kalem için ölçülen yarıçap düşüşüdür.
  Sayılar oradan okunur, burada yeniden türetilmez.
- **BG31.** Bir alan meşru da olabilir. Kural ateşlediği hâlde kalem doğruysa bu bir **yanlış
  işaretlemedir** ve bir dağıtımı durdurur.
- **BG32.** Koşarken tarama, `bilinmiyor` sınıfındaki alanların değerini çalışan sistemden okur;
  `görülmüyor` sınıfına dokunamaz. Tarama günlüktür ve ortalama gecikme yarım gün alınır.

#### Şablon Kümesi Kural Setinden Geçiyor

```js
// bulut/sablon.mjs — sablon kumesi ve kural seti MODELIDIR. Saglama modelleri ve sapma taramasi
// bu derste yoktur; olculen sey dagitimdan once bilinen ile ancak kosarken bilinen kalemdir.

// Bir alanin degeri '<' ile basliyorsa sablon okunarak COZULEMEZ: degeri dagitim aninda ya da
// kosarken belli olur. yaricap = onceki bes derste olculen yaricap payi. mesru = kalem dogru mu.
export const ALAN = `
  kimlik.tpl  rol-arsiv            guven-listesi  rol-yedek      hayir   5
  kimlik.tpl  rol-yedek            guven-listesi  rol-yonetim    hayir   3
  kimlik.tpl  hesap-toplayici      guven-listesi  rol-arsiv      evet    0
  kimlik.tpl  rol-yonetim          anahtar-izni   k-sir          hayir  10
  kimlik.tpl  rol-dagitim          anahtar-izni   k-sir          evet    0
  depo.tpl    sablon-deposu        genel-erisim   acik           hayir   5
  depo.tpl    portal-varlik-deposu genel-erisim   acik           evet    0
  depo.tpl    yukleme-onizleme     genel-erisim   <devralinan>   hayir   1
  depo.tpl    olcum-deposu         genel-erisim   <parametre>    hayir   1
  anahtar.tpl sir-deposu           genel-uc       <varsayilan>   hayir   1
  anahtar.tpl anahtar-yonetimi     genel-uc       <varsayilan>   hayir   1
  ag.tpl      ozel-uc-eslemesi     hedef          <cikti>        hayir   2
  islem.tpl   ornek-yonetimi       yonetim-ucu    <sablon-disi>  hayir   1
  kod.tpl     dagitim-sablonu      dosya-icerigi  <dosya>        hayir   4`
  .trim().split('\n').map((s) => {
    const [sablon, kaynak, alan, deger, mesru, yaricap] = s.trim().split(/\s+/);
    return { sablon, kaynak, alan, deger, mesru: mesru === 'evet', yaricap: Number(yaricap) };
  });
export const cozunur = (a) => !a.deger.startsWith('<');
// Kural seti: hangi alana bakiyor ve cozunur bir degerde ne zaman atesliyor.
export const KURAL = [
  ['guven-listesi', (d) => d.startsWith('rol-')],
  ['anahtar-izni', (d) => d === 'k-sir'],
  ['genel-erisim', (d) => d === 'acik'],
  ['genel-uc', (d) => d === 'acik'],
  ['hedef', () => false],
];
// Sinif: yakalandi (cozunur deger, kural atesledi), bilinmiyor (kural alana bakiyor ama deger
// cozulemiyor), gormuyor (hicbir kural o alana bakmiyor).
export const sinif = (a, istisna = () => false) => {
  const k = KURAL.find(([ad]) => ad === a.alan);
  if (istisna(a)) return 'gormuyor';
  if (k === undefined) return 'gormuyor';
  if (cozunur(a)) return k[1](a.deger) ? 'yakalandi' : 'temiz';
  return 'bilinmiyor';
};
export const SINIF = ['yakalandi', 'bilinmiyor', 'gormuyor'];
export const say = (c, istisna, f = () => true) =>
  ALAN.filter((a) => f(a) && sinif(a, istisna) === c);
export const pay = (l) => l.reduce((x, a) => x + a.yaricap, 0);
export const YANLIS = ALAN.filter((a) => !a.mesru);
```

```js
// bulut/kosum1.mjs — sablon kumesi kural setinden gecirilir: hangi kalem dagitimdan once biliniyor
import { ALAN, SINIF, YANLIS, pay, say, sinif } from './sablon.mjs';

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i])).join(''));
const A = [-21, -14, -15, 8, 9, 12];
yaz(A, 'kaynak', 'alan', 'deger', 'mesru', 'yaricap', 'sinif');
for (const a of ALAN)
  yaz(A, a.kaynak, a.alan, a.deger, a.mesru ? 'evet' : 'hayir', a.yaricap, sinif(a));
console.log(`\n${ALAN.length} alanin ${YANLIS.length}'i yanlis; toplam yaricap payi ${pay(YANLIS)}`);
const B = [-13, 9, 11, 10];
yaz(B, 'sinif', 'yanlis', 'yaricap', 'payin');
yaz(B, '', 'kalem', 'payi', 'yuzdesi');
for (const c of SINIF) {
  const l = say(c, undefined, (a) => !a.mesru);
  yaz(B, c, l.length, pay(l), `%${Math.round(pay(l) / pay(YANLIS) * 100)}`);
}
const yanlisIsaret = say('yakalandi', undefined, (a) => a.mesru);
console.log(`\nyanlis isaretlenen mesru kalem ${yanlisIsaret.length}: ` +
  yanlisIsaret.map((a) => a.kaynak).join(', '));
```

```
kaynak               alan          deger             mesru  yaricap       sinif
rol-arsiv            guven-listesi rol-yedek         hayir        5   yakalandi
rol-yedek            guven-listesi rol-yonetim       hayir        3   yakalandi
hesap-toplayici      guven-listesi rol-arsiv          evet        0   yakalandi
rol-yonetim          anahtar-izni  k-sir             hayir       10   yakalandi
rol-dagitim          anahtar-izni  k-sir              evet        0   yakalandi
sablon-deposu        genel-erisim  acik              hayir        5   yakalandi
portal-varlik-deposu genel-erisim  acik               evet        0   yakalandi
yukleme-onizleme     genel-erisim  <devralinan>      hayir        1  bilinmiyor
olcum-deposu         genel-erisim  <parametre>       hayir        1  bilinmiyor
sir-deposu           genel-uc      <varsayilan>      hayir        1  bilinmiyor
anahtar-yonetimi     genel-uc      <varsayilan>      hayir        1  bilinmiyor
ozel-uc-eslemesi     hedef         <cikti>           hayir        2  bilinmiyor
ornek-yonetimi       yonetim-ucu   <sablon-disi>     hayir        1    gormuyor
dagitim-sablonu      dosya-icerigi <dosya>           hayir        4    gormuyor

14 alanin 11'i yanlis; toplam yaricap payi 34
sinif           yanlis    yaricap     payin
                 kalem       payi   yuzdesi
yakalandi            4         23       %68
bilinmiyor           5          6       %18
gormuyor             2          5       %15

yanlis isaretlenen mesru kalem 3: hesap-toplayici, rol-dagitim, portal-varlik-deposu
```

Kalem sayısıyla yarıçap payı bu tabloda ters yönde okunuyor. On bir yanlış kalemin yalnız dördü
dağıtımdan önce yakalanıyor — yüzde otuz altısı. Ama o dört kalem otuz dört birimlik yarıçap payının
yirmi üçünü, yani yüzde altmış sekizini taşıyor. Nedeni tek bir satırdadır: `rol-yonetim`
rolüne yazılan `k-sir` izni on birim taşır ve şablonda düz bir değer olarak durur.

Ters yönde de bir sonuç var. `bilinmiyor` sınıfındaki beş kalem toplam altı birim taşır — kalem
başına bir virgül iki. Bunlar sayıca çoktur ve yarıçapa az katkı yapar. Bir kural seti "kaç bulgu
kapattı" diye ölçülürse bu beş kalemin ağırlığı abartılır; "kaç birim yarıçap kapattı" diye
ölçülürse yerine oturur.

Alt satır kural setinin karşı yüzünü veriyor. Aynı kurallar üç meşru kalemi de işaretliyor:
toplayıcının arşiv rolünü üstlenmesi, dağıtım rolünün sır anahtarını kullanması ve portal varlık
deposunun genel açık olması. Üçü de doğru yapılandırmadır ve üçü de bir dağıtımı durdurur. Kural
metni bu üçünü ötekilerden ayıramaz, çünkü değerler birbirinin aynısıdır.

#### İstisnanın İki Yazımı

```js
// bulut/kosum2.mjs — dort kural seti varyanti ve kosarken taramanin kapattigi pay
import { YANLIS, pay, say } from './sablon.mjs';

const ISTISNA_KAYNAK = ['hesap-toplayici', 'rol-dagitim', 'portal-varlik-deposu'];
const VARYANT = [
  ['istisna yok', () => false],
  ['kaynak duzeyinde istisna (3 satir)', (a) => ISTISNA_KAYNAK.includes(a.kaynak)],
  ['anahtar-izni kurali kapatilir', (a) => a.alan === 'anahtar-izni'],
  ['uc kural da kapatilir', (a) =>
    ['guven-listesi', 'anahtar-izni', 'genel-erisim'].includes(a.alan)],
];
const yaz = (g, ...s) => console.log(s.map((v, i) =>
  g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i])).join(''));
const A = [-36, 9, 9, 10, 13, 13];
yaz(A, 'kural seti', 'once', 'once', 'yanlis', 'tarama ile', 'hic gorulen');
yaz(A, '', 'kalem', 'pay', 'isaret', 'kapanan pay', 'olmayan pay');
for (const [ad, ist] of VARYANT) {
  const y = say('yakalandi', ist, (a) => !a.mesru);
  const b = say('bilinmiyor', ist, (a) => !a.mesru);
  yaz(A, ad, y.length, pay(y), say('yakalandi', ist, (a) => a.mesru).length,
    pay(y) + pay(b), pay(YANLIS) - pay(y) - pay(b));
}
console.log(`\ntoplam yanlis kalem ${YANLIS.length}, toplam yaricap payi ${pay(YANLIS)}`);
const gor = say('gormuyor', undefined, (a) => !a.mesru);
console.log(`hicbir kuralin bakmadigi alan: ` +
  gor.map((a) => `${a.alan} (${a.deger.slice(1, -1)})`).join(', '));
console.log(`bu ${gor.length} kalemin yaricap payi ${pay(gor)}/${pay(YANLIS)} ` +
  `(%${Math.round(pay(gor) / pay(YANLIS) * 100)}); sablonda okunacak bir deger yok`);
// Gecikme: dagitimdan once yakalanan 0 gun, gunluk taramada ortalama 0.5 gun, gormeyen hic.
const y0 = pay(say('yakalandi', undefined, (a) => !a.mesru));
const b0 = pay(say('bilinmiyor', undefined, (a) => !a.mesru));
console.log(`agirlikli gecikme: ${y0} pay 0 gun, ${b0} pay 0.5 gun -> ` +
  `${(b0 * 0.5 / (y0 + b0)).toFixed(2)} gun; kalan ${pay(YANLIS) - y0 - b0} pay hic gorulmuyor`);
```

```
kural seti                               once     once    yanlis   tarama ile  hic gorulen
                                        kalem      pay    isaret  kapanan pay  olmayan pay
istisna yok                                 4       23         3           29            5
kaynak duzeyinde istisna (3 satir)          4       23         0           29            5
anahtar-izni kurali kapatilir               3       13         2           19           15
uc kural da kapatilir                       0        0         0            4           30

toplam yanlis kalem 11, toplam yaricap payi 34
hicbir kuralin bakmadigi alan: yonetim-ucu (sablon-disi), dosya-icerigi (dosya)
bu 2 kalemin yaricap payi 5/34 (%15); sablonda okunacak bir deger yok
agirlikli gecikme: 23 pay 0 gun, 6 pay 0.5 gun -> 0.10 gun; kalan 5 pay hic gorulmuyor
```

İkinci satır aranan yanıttır. İstisna kaynak düzeyinde yazıldığında — üç ad, üç satır — yanlış
işaretleme üçten sıfıra iner ve yakalanan pay yirmi üçte kalır. Bedeli üç satırlık bir listenin
bakımıdır: her yeni meşru kalem bir satır daha ister ve listeden düşmeyen bir ad, artık meşru
olmasa bile işaretlenmez.

Üçüncü ve dördüncü satır ucuz yolun ne kadara mal olduğunu gösteriyor. Yanlış işaretlemeyi kuralı
kapatarak gidermek, o kuralın yakaladığı gerçek bulguyu da siler: `anahtar-izni` kuralı
kapatıldığında yakalanan pay yirmi üçten on üçe iner ve hiç görülmeyen pay beşten on beşe çıkar.
Üç kural birden kapatıldığında dağıtımdan önce hiçbir şey yakalanmaz. **Kuralı kapatmak yanlış
işareti de gerçek bulguyu da siler; istisna yazmak yalnız yanlış işareti siler ve bir bakım yükü
bırakır.**

Son üç satır dersin kalıcı sınırını çiziyor. İki kalem hiçbir kural setiyle görülemez: bir kaynağın
yönetim ucu şablon dışında elle açılmıştır ve bir kimlik referansı bir dosyanın içeriğindedir. Kural
seti genişletilebilir ama şablonda okunacak bir değer yoktur. Bu iki kalem toplam yarıçap payının
yüzde on beşini taşır.

#### Çözünürlük Şablona Göre Değişiyor

Toplam sayı altı şablona dağılmıştır ve dağılım düzgün değildir.

```js
// bulut/kosum3.mjs — sablon basina yaricap payi ve cozunurluk: tarama nerede ise yariyor
import { ALAN, cozunur, pay, sinif } from './sablon.mjs';

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i])).join(''));
const A = [-14, 7, 11, 10, 11, 10];
yaz(A, 'sablon', 'alan', 'cozunur', 'yaricap', 'yakalanan', 'yakalanan');
yaz(A, '', 'sayisi', 'alan', 'payi', 'pay', 'oran');
for (const s of [...new Set(ALAN.map((a) => a.sablon))]) {
  const l = ALAN.filter((a) => a.sablon === s), y = l.filter((a) => !a.mesru);
  const yak = l.filter((a) => !a.mesru && sinif(a) === 'yakalandi');
  yaz(A, s, l.length, `${l.filter(cozunur).length}/${l.length}`, pay(y), pay(yak),
    pay(y) === 0 ? '-' : `%${Math.round(pay(yak) / pay(y) * 100)}`);
}
const c = ALAN.filter((a) => !a.mesru && cozunur(a));
console.log(`\ncozunur yanlis alan ${c.length}/${ALAN.filter((a) => !a.mesru).length}, ` +
  `payi ${pay(c)}/${pay(ALAN.filter((a) => !a.mesru))}; ` +
  `cozunurluk sablon basina %0 ile %100 arasinda degisiyor`);
```

```
sablon           alan    cozunur   yaricap  yakalanan yakalanan
               sayisi       alan      payi        pay      oran
kimlik.tpl          5        5/5        18         18      %100
depo.tpl            4        2/4         7          5       %71
anahtar.tpl         2        0/2         2          0        %0
ag.tpl              1        0/1         2          0        %0
islem.tpl           1        0/1         1          0        %0
kod.tpl             1        0/1         4          0        %0

cozunur yanlis alan 4/11, payi 23/34; cozunurluk sablon basina %0 ile %100 arasinda degisiyor
```

Kimlik şablonu iki bakımdan uçtadır: en büyük yarıçap payını taşır — otuz dördün on sekizi — ve
bütün alanları çözünürdür. Tarama orada yüzde yüz oranında iş görüyor. Depo şablonunda dört alanın
ikisi çözünür ve yakalanan oran yüzde yetmiş bire iniyor.

Alt dört satırda oran sıfırdır ve nedeni aynı değildir. Anahtar şablonunda alanlar hiç yazılmamıştır
ve varsayılan sağlayıcıda belirlenir; ağ şablonunda değer başka bir şablonun çıktısından gelir;
işlem şablonunun kaynağı sonradan elle değiştirilmiştir; kod şablonu bir dosyaya işaret eder ve
dosyanın içeriği alan değildir. Dördü de "şablonda yazmıyor" durumudur ama üçü tarama ile
çözülebilir, biri çözülemez.

Bu dağılımın pratik sonucu, tarama yatırımının nereye yapılacağıdır. Yarıçap payının yarısından
çoğu tek bir şablonda ve tamamen çözünür alanlarda durur; o şablona bakan kural seti en yüksek
getiriyi verir. Alt dört satır için kural yazmak hiçbir şey kazandırmaz — kazanç ancak koşan
sistemden okuyan bir düzenekle gelir.

#### Yakalanan, Geciken ve Hiç Görülmeyen

Sonuç üç bölüme ayrılır. Yirmi üç birim yarıçap payı dağıtımdan önce kapanır: dağıtım engellenir,
gecikme sıfır gündür ve yanlış hiç sisteme girmez. Altı birim ancak koşarken çözülür; günlük bir
tarama bunları ortalama yarım gün sonra görür. Beş birim hiç görülmez.

Ağırlıklı gecikme sıfır virgül on gündür ve bu sayı yanıltıcı görünebilir — ortalama küçüktür,
çünkü ağırlığın çoğu sıfır gecikmeli sınıftadır. Ama ortalama, hiç görülmeyen beş birimi hesaba
katmaz; o pay bir gecikme değil, bir yokluktur.

Bu ayrımın pratik sonucu şudur: şablon taraması yarıçap payının üçte ikisini kapatabilir ve bunu
sıfır gecikmeyle yapar, ama üçte biri için başka bir düzenek gerekir. O düzeneğin bir bölümü
koşarken tarama, bir bölümü ise şablonun hiç bilmediği bir kaynaktır. Kural setinin genişliği
birinci payı büyütür; ikinci payı hiç değiştirmez.

#### Özet

- Şablondaki 14 alanın 11'i yanlıştır ve toplam yarıçap payı 34 birimdir. Dağıtımdan önce yakalanan
  4 kalem bu payın 23'ünü (%68) taşır; kalem sayısıyla yarıçap payı ters yönde okunur.
- `bilinmiyor` sınıfındaki 5 kalem toplam 6 birim taşır — kalem başına 1,2. Kural setini "kaç bulgu"
  ile ölçmek bu kalemlerin ağırlığını abartır.
- Kural seti 3 meşru kalemi de işaretler ve 3 dağıtımı durdurur; değerler birbirinin aynısı olduğu
  için kural metni ayıramaz.
- Kaynak düzeyinde istisna yanlış işaretlemeyi 3'ten 0'a indirir ve yakalanan payı 23'te bırakır;
  bedeli 3 satırlık bir listenin bakımıdır. Kuralı kapatmak yakalanan payı 23'ten 13'e düşürür.
- 2 kalem hiçbir kural setiyle görülemez — biri şablon dışında elle açılmış bir yönetim ucu, öteki
  bir dosyanın içeriğindeki kimlik referansı. Toplam payın %15'i buradadır.
- Ağırlıklı gecikme 0,10 gündür; ortalama küçüktür çünkü ağırlığın çoğu sıfır gecikmeli sınıftadır.
  Hiç görülmeyen 5 birim bu ortalamaya hiç girmez.

#### Sonraki Adım

Bu konu bir soruyu sonuna kadar götürdü: bir kalem yanlışsa oradan kaç kaleme ulaşılır. Sorumluluk
sınırı bir denetim listesine çevrildi, sızan tek bir kimlikten yürüyüş koşturuldu, ağ yolu izinle
kesiştirildi, genel erişime açık kalem sayıldı, anahtar sahipliği üç kipte ölçüldü ve son olarak
yanlış kalemlerin kaçının dağıtımdan önce görülebileceği hesaplandı. Her adımda bir sayı çıktı ve
her denetimin bedeli yazıldı.

Bütün bu ölçümlerin ortak bir yanı var: hepsi **yapılandırmaya bakarak** yapıldı. Bir güven listesi
okundu, bir izin kümesi tarandı, bir şablon alanı çözüldü. Yapılandırmanın kendisi doğruyken de
yarıçap ölçülebilir — ama o zaman ölçülecek bir şey yoktur, çünkü yanlış kalem yoktur. Sorulmayan
soru şudur: yapılandırma doğruyken bir kimlik bilgisi sızarsa bu nereden anlaşılır. O anda hiçbir
alan yanlış değildir, hiçbir kural ateşlemez, hiçbir tarama bir şey bulmaz; yürüyüşün gerçekten
koşup koşmadığını gösterebilecek tek şey bir **kayıttır**. Sonraki konu, `Bulutta Tespit ve
Sertleştirme`, o kayıtla başlıyor: yönetim düzlemi denetim günlüğü yarıçap yürüyüşünün kaç adımını
görüyor, kaçını hiç görmüyor.

## Bulutta Tespit ve Sertleştirme

Yayılma yürüyüşünün ne kadarının görüldüğü ve hangi denetimin yarıçapı gerçekten indirdiği: yönetim düzlemi kayıtlarında görünen ve hiç görünmeyen adım, sürekli yapılandırma duruş yönetiminin dağıtımdan önce kapattığı adım ile düzeltme gecikmesinin açık bıraktığı pencere, çok kiracılı ortamda konteyner ve hipervizör kaçışının yarıçapı, kısa ömürlü iş yüklerinde kaydın toplanabildiği saniye penceresi, bulut saldırı kalıplarının kalem-yol-kayıt-denetim dörtlüsü ve bulutta kanıt toplamanın konak imajından farkı.

### Denetim Günlükleri

Source: https://academia.sh/tr/kurslar/bulut-guvenligi/denetim-gunlukleri

Yayılma yürüyüşünün kayıtta görünen kısmının sayılması: 28 kalemlik grafikte sızan tek kimlikten 23 kaleme ulaşan 22 adımın 11'i kiracının eline geçiyor, ilk kayıt 9. dakikada düşüyor ve o ana kadar 8 kaleme ulaşılmış oluyor. Veri okuma kaydı görünen adımı 19'a çıkarıyor ama yarıçap 23'te kalıyor; aynı üç meşru iş bedeliyle otomatik oturum iptali yarıçapı 22'ye, rol zincirini kapatmak 18'e indiriyor.

Önceki konu altı ders boyunca yanlış kalemleri saydı ve her birinin yarıçapını ölçtü. Hepsinin
ortak bir yanı vardı: yanlış kalem **yapılandırmaya bakarak** bulundu — bir izin fazla yazılmıştı,
bir uç genel erişime açıktı, bir şablon yanlış varsayılanı taşıyordu. Yapılandırma doğruyken sızan
bir kimlik bilgisi bu yolla görünmez, çünkü o kimliğin kendi yetkisiyle yaptığı her çağrı
yapılandırmaya uygundur. Onu ancak bir kayıt gösterebilir.

Bu dersin sorusu, kaydın yürüyüşün ne kadarını gösterdiğidir. Ölçü yine yayılma yarıçapıdır;
üzerine ikinci bir sayı konur: yürüyüşün kaç adımı kiracının okuyabildiği bir kayda düşüyor, kaçı
hiçbir yerde görünmüyor. Yönetim düzlemi ile veri düzlemi çağrılarının ayrı kaydedildiği, kaydın
kendisinin de bir yüzey olduğu ve saklama süresinin bir bedel taşıdığı **Bulut Yönetişimi, Güvenlik
ve Maliyet** kursunda ölçüldü; burada tekrarlanmaz, girdi olarak alınır. Burada sayılan tek şey
yürüyüşün görünen kısmıdır.

Ölçüm **bölgesel ölçüm ağı** üzerindedir ve **kurgudur**: kiralanmış altyapıda koşan abone portalı,
sayaç toplama ve fatura işleri. Grafik `node` ile yazılmış bir **modeldir**; gerçek
sağlayıcı, hizmet, bölge ya da hesap yoktur.

**BT1.** Grafikte 28 kalem ve 23 kenar vardır; sızan tek kalem portalın hizmet hesabıdır.
**BT2.** Her kenar bir adım türü ve o adımın sürdüğü dakikayı taşır; yürüyüş en erken varış
sırasına göre koşar.
**BT3.** Adımın kaydı dört sınıftan birine düşer: kiracının okuyabildiği yönetim düzlemi denetim
günlüğü, iş yükünün kendi kaydı, yalnız sağlayıcıda duran kayıt, hiçbir yerde olmayan kayıt.
**BT4.** İş yükünün kendi kaydı ancak o kalemde bir kayıt ajanı kuruluysa kiracıya ulaşır; 28
kalemin beşinde ajan vardır.
**BT5.** Kaydın kiracıya teslim gecikmesi yönetim düzleminde 5, iş yükü kaydında 20 dakikadır
(kurgu).
**BT6.** Sekiz meşru iş modelde adıyla yazılıdır; üçü zincirli rol üstlenmeye bağlıdır.

#### Yürüyüşün Adımları ve Kaydın Sahibi

```js
// yuruyus.mjs — sizan tek kimlikten yayilma yuruyusu ve her adimin kayit sinifi. MODELDIR.
// Bolgesel olcum agi KURGUDUR; gercek saglayici, hizmet, hesap ya da uc nokta yoktur.

// Adim turu -> [kaydin dustugu yer, teslim gecikmesi (dk)]. "kiraci-uygulama" sinifi
// yalnizca hedef kalemde kayit ajani varsa gercekten kiracinin eline gecer.
export const ADIM = {
  "rol-ustlenme": ["kiraci-yonetim", 5],
  "kaynak-listeleme": ["kiraci-yonetim", 5],
  "sir-okuma": ["kiraci-yonetim", 5],
  "anahtar-cozme": ["kiraci-yonetim", 5],
  "veritabani-sorgusu": ["kiraci-uygulama", 20],
  "ornek-ici-calisma": ["kiraci-uygulama", 20],
  "nesne-okuma": ["saglayici-ici", 0],
  "kuyruk-tuketimi": ["saglayici-ici", 0],
  "ornek-kimligi-alma": ["kayitsiz", 0],
  "ag-baglantisi": ["kayitsiz", 0],
};

const bol = (s) => s.trim().split("\n").map((l) => l.trim().split("|"));

// Kalem: ad|kayit ajani var mi. 28 kalem; bes kalemde kayit ajani kuruludur.
export const KALEM = Object.fromEntries(bol(`
  portal-hizmet-hesabi|0   portal-ornegi|1        portal-ornek-kimligi|0
  abone-veritabani|1       sir-deposu|0           toplama-is-yuku-kimligi|0
  sayac-ham-kova|0         olcum-kuyrugu|0        fatura-toplu-is-rolu|0
  fatura-arsiv-kovasi|0    anahtar-yonetimi|0     musteri-anahtari|0
  yedekleme-rolu|0         yedek-kovasi|0         dagitim-rolu|0
  sablon-deposu|0          yapilandirma-kovasi|0  is-yuku-ornegi|0
  okuma-rolu|0             rapor-kovasi|0         gunluk-kovasi|0
  izleme-rolu|0            olcum-panosu|1         yonetim-rolu|1
  denetim-kovasi|0         odeme-ag-gecidi|1      saha-cihaz-kaydi|0
  sertifika-deposu|0`.replace(/\s+/g, "\n")).map(([a, j]) => [a, +j]));

// Kenar: kaynak|hedef|adim turu|adimin surdugu dakika. MODEL girdisi.
export const KENAR = bol(`
  portal-hizmet-hesabi|portal-ornegi|ag-baglantisi|3
  portal-hizmet-hesabi|okuma-rolu|rol-ustlenme|4
  portal-ornegi|portal-ornek-kimligi|ornek-kimligi-alma|2
  portal-ornek-kimligi|abone-veritabani|veritabani-sorgusu|6
  portal-ornek-kimligi|sir-deposu|sir-okuma|4
  sir-deposu|toplama-is-yuku-kimligi|sir-okuma|3
  toplama-is-yuku-kimligi|sayac-ham-kova|nesne-okuma|5
  toplama-is-yuku-kimligi|olcum-kuyrugu|kuyruk-tuketimi|4
  toplama-is-yuku-kimligi|izleme-rolu|rol-ustlenme|4
  izleme-rolu|olcum-panosu|kaynak-listeleme|3
  portal-ornek-kimligi|fatura-toplu-is-rolu|rol-ustlenme|3
  fatura-toplu-is-rolu|fatura-arsiv-kovasi|nesne-okuma|6
  fatura-toplu-is-rolu|anahtar-yonetimi|anahtar-cozme|4
  anahtar-yonetimi|musteri-anahtari|anahtar-cozme|2
  fatura-toplu-is-rolu|yedekleme-rolu|rol-ustlenme|3
  yedekleme-rolu|yedek-kovasi|nesne-okuma|7
  yedekleme-rolu|dagitim-rolu|rol-ustlenme|4
  dagitim-rolu|sablon-deposu|nesne-okuma|5
  dagitim-rolu|yapilandirma-kovasi|nesne-okuma|4
  dagitim-rolu|is-yuku-ornegi|ornek-ici-calisma|9
  okuma-rolu|rapor-kovasi|nesne-okuma|4
  okuma-rolu|gunluk-kovasi|nesne-okuma|5
  okuma-rolu|yapilandirma-kovasi|nesne-okuma|6`)
  .map(([k, h, t, d]) => ({ k, h, t, d: +d }));

export const BASLANGIC = "portal-hizmet-hesabi";

// En erken varis yuruyusu: her adim, kaynagina ulasildiktan sonra kendi suresince surer.
export function yuru(engel = () => false) {
  const varis = { [BASLANGIC]: 0 }, gelis = {}, adimlar = [];
  for (;;) {
    let en = null;
    for (const e of KENAR) {
      if (!(e.k in varis) || e.h in varis || engel(e, gelis)) continue;
      const t = varis[e.k] + e.d;
      if (en === null || t < en.t) en = { e, t };
    }
    if (en === null) return { varis, adimlar };
    varis[en.e.h] = en.t; gelis[en.e.h] = en.e.t;
    adimlar.push({ ...en.e, bitis: en.t });
  }
}

// Bir adimin kaydi kiracinin eline geciyor mu, geciyorsa ne zaman.
export function gorunur(a) {
  const [sinif, gecikme] = ADIM[a.t];
  if (sinif === "kiraci-yonetim") return { sinif, an: a.bitis + gecikme };
  if (sinif === "kiraci-uygulama")
    return KALEM[a.h] ? { sinif, an: a.bitis + gecikme } : { sinif: "ajansiz", an: null };
  return { sinif, an: null };
}

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

if (import.meta.url === `file://${process.argv[1]}`) {
  const { varis, adimlar } = yuru();
  const toplam = Object.keys(KALEM).length;
  console.log(`model: ${toplam} kalem, ${KENAR.length} kenar; sizan kalem ${BASLANGIC}`);
  console.log(`yuruyus ${adimlar.length} adim, ulasilan ${Object.keys(varis).length}/${toplam} ` +
    `kalem, ulasilamayan ${toplam - Object.keys(varis).length}; son adim ${adimlar.at(-1).bitis}. dk`);

  const say = {};
  for (const a of adimlar) { const s = gorunur(a).sinif; say[s] = (say[s] || 0) + 1; }
  const yz = gen([18, 8, 12, 24]);
  console.log("\n" + yz(["kayit sinifi", "adim", "gecikme", "kayit nerede duruyor"]));
  for (const [s, ad, g] of [["kiraci-yonetim", "yonetim duzlemi kaydi", "5 dk"],
    ["kiraci-uygulama", "is yukunun kendi kaydi", "20 dk"], ["ajansiz", "ajan kurulu degil", "-"],
    ["saglayici-ici", "yalniz saglayicida", "-"], ["kayitsiz", "hicbir yerde yok", "-"]])
    console.log(yz([s, say[s] || 0, g, ad]));

  const gor = adimlar.filter((a) => gorunur(a).an !== null);
  const ilk = gor.reduce((m, a) => Math.min(m, gorunur(a).an), Infinity);
  const ilkAdim = adimlar.findIndex((a) => gorunur(a).an === ilk) + 1;
  const oncekiKalem = adimlar.filter((a) => a.bitis <= ilk).length + 1;
  console.log(`\ngorunen adim ${gor.length}/${adimlar.length}, hic gorunmeyen ` +
    `${adimlar.length - gor.length}`);
  console.log(`ilk gorunur kayit ${ilk}. dakikada dusuyor (yuruyusun ${ilkAdim}. adimi); ` +
    `o ana kadar ${oncekiKalem} kaleme ulasilmis`);

  // Kayittan yeniden kurulan yaricap: yalniz gorunen adimlarin dokundugu kalemler.
  const kurulan = new Set([BASLANGIC]);
  for (const a of gor) { kurulan.add(a.k); kurulan.add(a.h); }
  console.log(`kayda bakan cozumleyicinin cikarsadigi kalem ${kurulan.size}, ` +
    `gercek yaricap ${Object.keys(varis).length}; gorulmeyen kalem ` +
    `${Object.keys(varis).length - kurulan.size}`);
  const zincir = adimlar.filter((a) => a.t === "rol-ustlenme").length;
  console.log(`rol zinciri adimi ${zincir} (hepsi kayitli); veri okuyan adim ` +
    `${adimlar.filter((a) => ADIM[a.t][0] === "saglayici-ici").length} (hicbiri kayitli degil)`);
}
```

```
model: 28 kalem, 23 kenar; sizan kalem portal-hizmet-hesabi
yuruyus 22 adim, ulasilan 23/28 kalem, ulasilamayan 5; son adim 24. dk

kayit sinifi          adim     gecikme    kayit nerede duruyor
kiraci-yonetim          10        5 dk   yonetim duzlemi kaydi
kiraci-uygulama          1       20 dk  is yukunun kendi kaydi
ajansiz                  1           -       ajan kurulu degil
saglayici-ici            8           -      yalniz saglayicida
kayitsiz                 2           -        hicbir yerde yok

gorunen adim 11/22, hic gorunmeyen 11
ilk gorunur kayit 9. dakikada dusuyor (yuruyusun 2. adimi); o ana kadar 8 kaleme ulasilmis
kayda bakan cozumleyicinin cikarsadigi kalem 13, gercek yaricap 23; gorulmeyen kalem 10
rol zinciri adimi 5 (hepsi kayitli); veri okuyan adim 8 (hicbiri kayitli degil)
```

Yürüyüş 22 adımda 23 kaleme ulaşıyor ve 24 dakika sürüyor. Adımların yarısı kiracının eline geçen
bir kayda düşüyor, yarısı hiç düşmüyor. Bölünme rastgele değildir: **kaydı düşen adımlar kimlik
hareketleridir**, düşmeyenler veri hareketleridir. Beş rol üstlenme adımının beşi de kayıtlıdır. Sekiz veri okuma adımının hiçbiri
değildir; onlar yalnız sağlayıcının kendi kaydında durur ve kiracıya verilmez. İki adım hiçbir
yerde yoktur — örneğe bağlı kimliğin alınması ve ağ bağlantısı.

Bir adım ara sınıftadır: dağıtım rolüyle başlatılan iş yükü örneğinde kayıt ajanı kurulu değildir,
çünkü ajan görüntüye sonradan eklenmektedir. Kaydın kapsamı bir yapılandırma değil, bir kurulum
sırasıdır.

#### Kör Önek

Sayıların en keskini son iki satırdadır. İlk kayıt 9. dakikada kiracının eline geçiyor; o ana kadar
yürüyüş 8 kaleme ulaşmış oluyor. Yürüyüşün ilk adımı kayıtsız sınıftadır — ağ bağlantısı hiçbir yere
yazılmaz — ve kayıt ancak ikinci adımda, sızan kimliğin okuma rolünü üstlenmesiyle başlar. O adım 4.
dakikada biter, kaydı 5 dakikalık teslim gecikmesiyle gelir. Yayılmanın **kör öneki** budur: kaydın
hiçbir şey söylemediği dokuz dakikada yarıçapın üçte biri kurulmuş olur. Kör önek yalnızca baştaki
bir aralık da değildir: kayıtlı her adım kendi gecikmesiyle geldiği için, o gecikme boyunca adım
yokmuş gibi görünür.

İkincisi kaydın sonradan ne kadarını anlattığıdır. Yalnız görünen 11 adıma bakan bir çözümleyici
13 kalem çıkarsıyor; gerçek yarıçap 23'tür. On kalem, kayıtta hiçbir izi olmadığı için soruşturmanın
dışında kalır: okunan altı kova ile bir şablon deposu, tüketilen kuyruk, sızan portalın kendi
örneği ve dağıtılan iş yükü örneği. Kayıt yalnızca eksik değildir; **yanlış bir yarıçap
raporlar** ve o rapor gerçek sayının yarısından biraz fazlasıdır.

#### Görünürlük mü, Daraltma mı

```js
// kesme.mjs — kaydin gorunurlugu ile yaricapin dusmesi ayri ayri olculur. MODELDIR.
import { ADIM, KALEM, KENAR, BASLANGIC, gorunur } from "./yuruyus.mjs";

const VERI_GECIKME = 10;   // veri okuma kaydi acilirsa kiraciya bu gecikmeyle gelir (kurgu)

// Mesru is: ad|kullandigi kimlikler|zincirli rol ustlenme gerektiriyor mu (gunluk kosum, kurgu)
const MESRU = `
  gecelik-fatura-uretimi|portal-ornek-kimligi fatura-toplu-is-rolu yedekleme-rolu|1
  arsiv-yedegi|yedekleme-rolu|1
  sablon-dagitimi|dagitim-rolu|1
  sayac-toplama|toplama-is-yuku-kimligi|0
  abone-portali-oturumu|portal-hizmet-hesabi portal-ornek-kimligi|0
  aylik-rapor|okuma-rolu|0
  pano-yenileme|izleme-rolu|0
  anahtar-dondurme|anahtar-yonetimi|0`.trim().split("\n")
  .map((l) => l.trim().split("|")).map(([ad, k, z]) => ({ ad, kimlik: k.split(" "), zincir: +z }));

// Bir adimin kaydi kiracinin eline kacinci dakikada geciyor (veri kaydi acikken de bakilir).
const an = (a, veriKaydi) => gorunur(a).an ??
  (veriKaydi && ADIM[a.t][0] === "saglayici-ici" ? a.bitis + VERI_GECIKME : null);

// Yuruyus: zincir kapaliysa zincirli rol ustlenme engellenir; kesme aninda iptal edilen
// kimliklerden sonraki adimlar durur.
function yuru({ zincir = false, kesme = Infinity, iptalli = new Set() } = {}) {
  const varis = { [BASLANGIC]: 0 }, gelis = {}, adimlar = [];
  for (;;) {
    let en = null;
    for (const e of KENAR) {
      if (!(e.k in varis) || e.h in varis) continue;
      if (zincir && e.t === "rol-ustlenme" && gelis[e.k] === "rol-ustlenme") continue;
      const t = varis[e.k] + e.d;
      if (t > kesme && iptalli.has(e.k)) continue;
      if (en === null || t < en.t) en = { e, t };
    }
    if (en === null) return { varis, adimlar };
    varis[en.e.h] = en.t; gelis[en.e.h] = en.e.t;
    adimlar.push({ ...en.e, bitis: en.t });
  }
}

function senaryo({ veriKaydi = false, iptal = null, zincir = false, kayit = true }) {
  const serbest = yuru({ zincir });
  const gor = serbest.adimlar.filter((a) => an(a, veriKaydi) !== null);
  const ilk = kayit && gor.length ? Math.min(...gor.map((a) => an(a, veriKaydi))) : null;
  if (iptal === null || ilk === null)
    return { ilk, kesme: null, gorunen: kayit ? gor.length : 0, adim: serbest.adimlar.length,
      yaricap: Object.keys(serbest.varis).length, durdurulan: zincirBedeli(zincir) };
  // Iptal ancak kayitta gorulmus kimlikleri kapsar: cozumleyici gormedigini iptal edemez.
  const kesme = ilk + iptal, iptalli = new Set();
  for (const a of gor) if (an(a, veriKaydi) <= kesme) { iptalli.add(a.k); iptalli.add(a.h); }
  const k = yuru({ zincir, kesme, iptalli });
  const duran = MESRU.filter((m) => (zincir && m.zincir) || m.kimlik.some((x) => iptalli.has(x)));
  return { ilk, kesme, gorunen: gor.length, adim: k.adimlar.length,
    yaricap: Object.keys(k.varis).length, durdurulan: duran.length, iptalli: iptalli.size };
}
const zincirBedeli = (z) => z ? MESRU.filter((m) => m.zincir).length : 0;

const SENARYO = [
  ["kayit yok", { kayit: false }],
  ["yonetim duzlemi kaydi", {}],
  ["+ veri okuma kaydi", { veriKaydi: true }],
  ["+ otomatik oturum iptali", { iptal: 4 }],
  ["rol zinciri kapali", { zincir: true }],
  ["zincir kapali + iptal", { zincir: true, iptal: 4 }],
];

const gen = (B) => (h) => h.map((v, j) => j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))
  .join("");
const yz = gen([26, 9, 11, 11, 10, 16]);
const toplam = Object.keys(KALEM).length;

console.log(yz(["denetim", "gorunen", "ilk kayit", "kesme ani", "yaricap", "duran mesru is"]));
for (const [ad, s] of SENARYO) {
  const r = senaryo(s);
  console.log(yz([ad, `${r.gorunen}/${r.adim}`, r.ilk === null ? "-" : `${r.ilk}. dk`,
    r.kesme === null ? "-" : `${r.kesme}. dk`, `${r.yaricap}/${toplam}`, r.durdurulan]));
}

const taban = senaryo({ kayit: false }), veri = senaryo({ veriKaydi: true });
const ipt = senaryo({ iptal: 4 }), z = senaryo({ zincir: true });
const ikisi = senaryo({ zincir: true, iptal: 4 });
console.log(`\nkayit acmak gorunen adimi ${senaryo({}).gorunen}, veri kaydi da acmak ` +
  `${veri.gorunen} yapiyor; yaricap her ucunde de ${taban.yaricap}`);
console.log(`otomatik iptal ${ipt.iptalli} kalemi kapsiyor (yalniz kayitta gorulenler) ve ` +
  `yaricapi ${taban.yaricap} -> ${ipt.yaricap} indiriyor; bedeli ${ipt.durdurulan}/${MESRU.length} ` +
  `mesru is`);
console.log(`rol zincirini kapatmak kaydi hic beklemeden yaricapi ${z.yaricap} yapiyor; ` +
  `bedeli ${z.durdurulan}/${MESRU.length} mesru is`);
console.log(`ikisi birden ${ikisi.yaricap}/${toplam}; kalan ${ikisi.yaricap - 1} kaleme ` +
  `${ikisi.kesme}. dakikadan once ulasilmis`);
```

```
denetim                     gorunen  ilk kayit  kesme ani   yaricap  duran mesru is
kayit yok                      0/22          -          -     23/28               0
yonetim duzlemi kaydi         11/22      9. dk          -     23/28               0
+ veri okuma kaydi            19/22      9. dk          -     23/28               0
+ otomatik oturum iptali      11/21      9. dk     13. dk     22/28               3
rol zinciri kapali             9/17      9. dk          -     18/28               3
zincir kapali + iptal          9/16      9. dk     13. dk     17/28               5

kayit acmak gorunen adimi 11, veri kaydi da acmak 19 yapiyor; yaricap her ucunde de 23
otomatik iptal 4 kalemi kapsiyor (yalniz kayitta gorulenler) ve yaricapi 23 -> 22 indiriyor; bedeli 3/8 mesru is
rol zincirini kapatmak kaydi hic beklemeden yaricapi 18 yapiyor; bedeli 3/8 mesru is
ikisi birden 17/28; kalan 16 kaleme 13. dakikadan once ulasilmis
```

İlk üç satır aynı yarıçapı veriyor: 23. Yönetim düzlemi kaydını açmak görünen adımı sıfırdan
11'e, veri okuma kaydını da açmak 19'a çıkarıyor; ulaşılan kalem sayısı hiç değişmiyor. Bu, kursun
kuralının en yalın biçimidir — kayıt bir kapı değildir, bir penceredir. Görünürlük sıfır adımdan
on dokuz adıma çıkarken yarıçap sabit kalır, çünkü kayıt hiçbir adımı reddetmez.

Dördüncü satır kaydı bir karara bağlıyor: ilk kayıt düştükten 4 dakika sonra, kayıtta görülmüş
kimliklerin oturumları otomatik iptal ediliyor. Yarıçap 23'ten 22'ye iniyor. Tek kalem. Nedeni iki
sınırın üst üste binmesidir. Kesme 13. dakikada gerçekleşiyor ve yürüyüşün 24 dakikasının 13'ü o ana
kadar geçmiş oluyor; üstelik iptal yalnız **kayıtta görülmüş** dört kalemi kapsıyor, çünkü
çözümleyici görmediği bir kimliği iptal edemez. Kaydın kör noktaları burada ikinci kez ödenir:
görülmeyen kimlik iptal edilmez, iptal edilmeyen kimlik yürümeye devam eder. Bedel yine de sıfır
değildir — sekiz meşru işin üçü duruyor.

Beşinci satır kaydı hiç kullanmıyor. Zincirli rol üstlenme kapatıldığında — yani bir rol
üstlenilerek gelinmişse oradan ikinci bir rol üstlenilemiyorsa — yarıçap 23'ten 18'e iniyor ve bunun
için hiçbir uyarı beklenmiyor. Bedeli yine üç meşru iştir: gecelik fatura üretimi, arşiv yedeği ve
şablon dağıtımı zinciri kullanır ve yeniden yazılmaları gerekir. İki satırın karşılaştırması dersin
sonucudur: **aynı bedelle** — üç meşru iş — kayda bağlı iptal bir kalem, yapıya bağlı daraltma beş
kalem indiriyor. Son satır ikisini birleştiriyor ve 17'ye iniyor: iptalin zincir kapalıyken
kazandırdığı tek kalem, duran işi üçten beşe çıkarmakla ödeniyor.

#### Özet

- 28 kalemlik grafikte sızan tek kimlikten 22 adımda 23 kaleme ulaşılıyor; adımların 11'i kiracının
  okuyabildiği bir kayda düşüyor, 11'i hiç düşmüyor.
- Bölünme kimlik ile veri arasındadır: beş rol üstlenme adımının beşi kayıtlı, sekiz veri okuma
  adımının hiçbiri değil; iki adım hiçbir yerde yok ve bir adım ajan kurulu olmayan bir örnekte geçiyor.
- İlk kayıt 9. dakikada düşüyor ve o ana kadar 8 kaleme ulaşılmış oluyor; kaydın hiçbir şey
  söylemediği bu kör önek yarıçapın üçte birini kapsıyor.
- Yalnız kayda bakan bir çözümleyici 13 kalem çıkarsıyor, gerçek yarıçap 23'tür; on kalem hiçbir izi
  olmadığı için soruşturmanın dışında kalır.
- Kayıt açmak görünen adımı 11'e, veri okuma kaydı 19'a çıkarıyor; yarıçap üç durumda da 23'te
  kalıyor — kayıt hiçbir adımı reddetmez.
- Aynı bedelle, üç meşru işle, otomatik oturum iptali yarıçapı 22'ye, rol zincirini kapatmak 18'e
  indiriyor; iptal yalnız kayıtta görülmüş dört kalemi kapsadığı için geride kalanı durduramıyor.

#### Sonraki Adım

Rol zincirini kapatmanın kayıttan bağımsız çalışması bir yön gösteriyor: yarıçapı düşüren şey,
yürüyüş başladıktan sonra bakan bir düzenek değil, yürüyüş başlamadan önce kapatılmış bir
kalemdir. Sonraki ders bu yönü ölçer — sürekli çalışan bir yapılandırma duruş yönetimi düzeneği,
yürüyüşün kaç adımını dağıtımdan önce kapatıyor, kaçını ancak koştuktan sonra buluyor ve tespit ile
düzeltme arasındaki gecikme yarıçapı kaç dakika açık bırakıyor.

### Yapılandırma Duruş Yönetimi

Source: https://academia.sh/tr/kurslar/bulut-guvenligi/yapilandirma-durus-yonetimi

Yanlış kalemin dağıtımdan önce mi sonra mı kapandığının ölçülmesi: 23 kenarın 13'ü bir yanlış kaleme bağlı, bunların 7'si şablonda, 2'si kabulde, 4'ü ancak koşarken görülüyor. Şablon kapısı yarıçapı 23'ten 8'e indiriyor, kabul kapısı iki kalem daha kapatıp yarıçapı hiç indirmiyor, koşan tarama tek başına 4'e indiriyor. Bir haftalık pencerede günlük tarama ile onaylı düzeltme yarıçapı 39 saat, saatlik tarama 25 saat, otomatik düzeltme 2 saat açık bırakıyor; sürekli taramaya geçmek 12 kat değerlendirme karşılığında 1 saat kazandırıyor.

Önceki ders bir yön bıraktı: yarıçapı düşüren şey yürüyüş başladıktan sonra bakan bir düzenek değil,
yürüyüş başlamadan önce kapatılmış bir kalemdi. Rol zincirini kapatmak kaydı hiç beklemeden
yarıçapı 23'ten 18'e indirdi. Bu ders o yönü sonuna kadar ölçer ve tek soruya bağlar: **yanlış
kalem, kullanılmadan önce mi kapanıyor, kullanıldıktan sonra mı.**

**Yapılandırma duruş yönetimi** (posture management), kaynak kümesini sürekli okuyup istenen
durumdan sapan kalemi işaretleyen düzenektir. Uyum kurallarının nasıl yazıldığı, kural başına kaç
gerçek uyumsuzluğun yakalandığı ve kaçının yanlış işaret olduğu **Bulut Yönetişimi, Güvenlik ve
Maliyet** kursunda ölçüldü; burada tekrarlanmaz. Burada ölçülen tek şey **zamandır**: kalemin
görülebildiği evre, tespit ile düzeltme arasındaki gecikme ve bu gecikmenin yarıçapı kaç saat açık
bıraktığı.

Grafik önceki dersle aynıdır: **bölgesel ölçüm ağı**, **kurgudur**, `node` ile yazılmış bir
**modeldir**.

**BT7.** Grafiğin 23 kenarından 13'ü bir yanlış yapılandırma kalemine bağlıdır; kalem kapalıysa o
kenar yürünemez. Kalan 10 kenar meşrudur ve kapatılamaz.
**BT8.** Yanlış kalem üç evreden birinde görülür: **şablon** (dağıtımdan önce, kod olarak altyapı
metninde), **kabul** (dağıtım anında, istenen durum değerlendirilirken), **koşan** (ancak koşan
kaynağa bakan bir taramayla).
**BT9.** Dört koşan kalem bir hafta içinde doğar; doğuş dakikaları modelde yazılıdır (kurgu).
**BT10.** Tarama aralığı $S$ ve düzeltme gecikmesi $R$ verildiğinde kalem
$\lceil d/S \rceil \cdot S + R$ dakikasında kapanır; $d$ doğuş anıdır.
**BT11.** Ölçüm penceresi bir haftadır (10.080 dakika) ve yarıçap her dakika ayrı hesaplanır.
**BT12.** Her tarama 13 kalemi değerlendirir; haftalık değerlendirme sayısı kurgu bir kaynak
bedelidir.

#### Yanlış Kalemin Görülebildiği Evre

```js
// durus.mjs — yanlis kalemlerin gorulebilecegi evre ve her evrenin kapattigi adim. MODELDIR.
// Grafik onceki dersinkiyle aynidir; burada her kenar bir yanlis yapilandirma kalemine baglidir.
const bol = (s) => s.trim().split("\n").map((l) => l.trim().split("|"));

// Kenar: kaynak|hedef|sure(dk)|kenari mumkun kilan yanlis kalem ("-" ise mesru kenar)
export const KENAR = bol(`
  portal-hizmet-hesabi|portal-ornegi|3|-
  portal-hizmet-hesabi|okuma-rolu|4|-
  portal-ornegi|portal-ornek-kimligi|2|ornek-kimligi-oturumsuz
  portal-ornek-kimligi|abone-veritabani|6|-
  portal-ornek-kimligi|sir-deposu|4|portal-kimligine-sir-okuma
  sir-deposu|toplama-is-yuku-kimligi|3|sirda-uzun-omurlu-kimlik
  toplama-is-yuku-kimligi|sayac-ham-kova|5|-
  toplama-is-yuku-kimligi|olcum-kuyrugu|4|-
  toplama-is-yuku-kimligi|izleme-rolu|4|is-yukune-rol-ustlenme
  izleme-rolu|olcum-panosu|3|-
  portal-ornek-kimligi|fatura-toplu-is-rolu|3|portal-kimligine-toplu-is-rolu
  fatura-toplu-is-rolu|fatura-arsiv-kovasi|6|-
  fatura-toplu-is-rolu|anahtar-yonetimi|4|anahtar-kullanimi-kosulsuz
  anahtar-yonetimi|musteri-anahtari|2|anahtar-politikasinda-kosul-yok
  fatura-toplu-is-rolu|yedekleme-rolu|3|zincirli-rol-ustlenme
  yedekleme-rolu|yedek-kovasi|7|-
  yedekleme-rolu|dagitim-rolu|4|yedekleme-rolune-dagitim
  dagitim-rolu|sablon-deposu|5|sablon-deposu-yazmaya-acik
  dagitim-rolu|yapilandirma-kovasi|4|-
  dagitim-rolu|is-yuku-ornegi|9|dagitim-rolu-ornek-baslatabiliyor
  okuma-rolu|rapor-kovasi|4|-
  okuma-rolu|gunluk-kovasi|5|gunluk-kovasi-okumaya-acik
  okuma-rolu|yapilandirma-kovasi|6|yapilandirma-kovasi-genis-okuma`)
  .map(([k, h, d, y]) => ({ k, h, d: +d, y }));

// Yanlis kalemin hangi evrede gorulebildigi. MODEL girdisi.
// sablon: dagitimdan once, kod olarak altyapi metninde okunur
// kabul:  dagitim aninda, istenen durum degerlendirilirken okunur
// kosan:  ancak kosan kaynaga bakilarak, tarama ile bulunur
export const EVRE = Object.fromEntries(bol(`
  portal-kimligine-sir-okuma|sablon          is-yukune-rol-ustlenme|sablon
  portal-kimligine-toplu-is-rolu|sablon      anahtar-politikasinda-kosul-yok|sablon
  zincirli-rol-ustlenme|sablon               yedekleme-rolune-dagitim|sablon
  dagitim-rolu-ornek-baslatabiliyor|sablon   anahtar-kullanimi-kosulsuz|kabul
  sablon-deposu-yazmaya-acik|kabul           ornek-kimligi-oturumsuz|kosan
  sirda-uzun-omurlu-kimlik|kosan             yapilandirma-kovasi-genis-okuma|kosan
  gunluk-kovasi-okumaya-acik|kosan`
  .replace(/\s{2,}/g, "\n")));

export const BASLANGIC = "portal-hizmet-hesabi";
export const TOPLAM = 28;   // grafikte toplam kalem; besi hicbir yuruyusle ulasilamaz

// Acik yanlis kalem kumesi verildiginde yaricap: yalnizca mesru ya da acik kenarlar yurunur.
export function yaricap(acik) {
  const varis = { [BASLANGIC]: 0 };
  for (;;) {
    let en = null;
    for (const e of KENAR) {
      if (!(e.k in varis) || e.h in varis) continue;
      if (e.y !== "-" && !acik.has(e.y)) continue;
      const t = varis[e.k] + e.d;
      if (en === null || t < en.t) en = { e, t };
    }
    if (en === null) return { kalem: Object.keys(varis).length, varis };
    varis[en.e.h] = en.t;
  }
}

const KALEMLER = [...new Set(KENAR.map((e) => e.y).filter((y) => y !== "-"))];
const evreli = (...e) => new Set(KALEMLER.filter((y) => e.includes(EVRE[y])));

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

if (import.meta.url === `file://${process.argv[1]}`) {
  const say = (e) => KALEMLER.filter((y) => EVRE[y] === e).length;
  console.log(`${KENAR.length} kenarin ${KALEMLER.length} tanesi bir yanlis kaleme bagli, ` +
    `${KENAR.length - KALEMLER.length} tanesi mesru`);
  console.log(`evre dagilimi: sablon ${say("sablon")}, kabul ${say("kabul")}, ` +
    `kosan ${say("kosan")}`);

  const yz = gen([34, 14, 12, 10, 20]);
  console.log("\n" + yz(["kapi", "kapanan kalem", "acik kalem", "yaricap", "kapanma ani"]));
  const asama = [
    ["kapi yok (hepsi acik)", evreli("sablon", "kabul", "kosan"), "-"],
    ["yalniz kosan taramasi", evreli("sablon", "kabul"), "dagitimdan sonra"],
    ["sablon kapisi", evreli("kabul", "kosan"), "dagitimdan once"],
    ["sablon + kabul kapisi", evreli("kosan"), "dagitimdan once"],
    ["ucu birden", new Set(), "once ve sonra"],
  ];
  for (const [ad, acik, an] of asama) {
    const r = yaricap(acik);
    console.log(yz([ad, KALEMLER.length - acik.size, acik.size, `${r.kalem}/${TOPLAM}`, an]));
  }

  // Her yanlis kalem tek basina kapatilsaydi yaricap kaca inerdi.
  const tam = yaricap(new Set(KALEMLER)).kalem;
  const tekil = KALEMLER.map((y) => {
    const a = new Set(KALEMLER); a.delete(y);
    return { y, dus: tam - yaricap(a).kalem, evre: EVRE[y] };
  }).sort((a, b) => b.dus - a.dus);
  const yt = gen([36, 10, 10]);
  console.log("\n" + yt(["tek basina kapatilan kalem", "evre", "yaricap"]));
  for (const t of tekil.slice(0, 5)) console.log(yt([t.y, t.evre, `${tam} -> ${tam - t.dus}`]));
  console.log(`kalan ${tekil.length - 5} kalemin her biri yaricapi bir kalem indiriyor ` +
    `ya da hic indirmiyor`);
}
```

```
23 kenarin 13 tanesi bir yanlis kaleme bagli, 10 tanesi mesru
evre dagilimi: sablon 7, kabul 2, kosan 4

kapi                               kapanan kalem  acik kalem   yaricap         kapanma ani
kapi yok (hepsi acik)                          0          13     23/28                   -
yalniz kosan taramasi                          4           9      4/28    dagitimdan sonra
sablon kapisi                                  7           6      8/28     dagitimdan once
sablon + kabul kapisi                          9           4      8/28     dagitimdan once
ucu birden                                    13           0      4/28       once ve sonra

tek basina kapatilan kalem                evre   yaricap
ornek-kimligi-oturumsuz                  kosan   23 -> 6
portal-kimligine-toplu-is-rolu          sablon  23 -> 14
portal-kimligine-sir-okuma              sablon  23 -> 17
sirda-uzun-omurlu-kimlik                 kosan  23 -> 18
zincirli-rol-ustlenme                   sablon  23 -> 18
kalan 8 kalemin her biri yaricapi bir kalem indiriyor ya da hic indirmiyor
```

Üst tablo iki sütunu ayrı okumayı zorunlu kılar: **kapanan kalem** ile **yarıçap** aynı yönde
hareket etmiyor. Şablon kapısı on üç kalemin yedisini, yani yarısından fazlasını, dağıtımdan önce
kapatıyor ve yarıçap 23'ten 8'e iniyor. Kabul kapısı iki kalem daha kapatıyor — dokuza çıkıyor — ve
yarıçap **8'de kalıyor.** Kapatılan iki kalem, kapalıyken de başka bir kenardan ulaşılan kalemleri
koruyordu; anahtar yönetimine giden yol zaten fatura rolü kapandığında kesilmişti. Bu, önceki
dersteki kayıt satırının yapılandırma tarafındaki karşılığıdır: **kalem saymak yarıçap saymak
değildir.**

Ters yönde daha keskin bir sayı var. Yalnız koşan taraması dört kalem kapatıyor ve yarıçap 4'e
iniyor — üç kapının hepsini birden açmakla aynı sonuç. Nedeni alt tablodadır: örneğe bağlı kimliğin
oturum başına doğrulama istemeden verilmesi tek başına yarıçapı 23'ten 6'ya indiren kalemdir ve o
kalem **koşan** sınıftadır. Şablon metni doğru yazılmıştır; eski bir görüntüden başlatılmış örnek
eski davranışı taşır ve bunu ancak koşan örneğe bakan bir tarama görebilir.

#### Kapının Kapattığı ve Kapatamadığı

Alt tablo sıralamayı da veriyor. On üç kalemin dördü yarıçapı gerçekten hareket ettiriyor; kalan
sekizi bir kalem indiriyor ya da hiç indirmiyor. Sıralamanın başındaki kalem koşan sınıfta, sonraki
üçü şablon sınıfında. Dağıtımdan önce kapatmanın değeri buradadır ve zamanla ölçülür: şablonda
kapatılan bir kalem **hiç var olmaz**, dolayısıyla açık kaldığı süre sıfırdır. Koşan sınıftaki
kalem ise doğar, bir süre yaşar ve ancak sonra kapanır. Bir sonraki bölüm o süreyi sayar.

#### Düzeltme Gecikmesinin Açtığı Pencere

```js
// pencere.mjs — tespit ve duzeltme gecikmesinin yaricapi kac saat acik biraktigi. MODELDIR.
import { EVRE, TOPLAM, yaricap } from "./durus.mjs";

const HAFTA = 7 * 24 * 60;                       // 10080 dakikalik pencere
const KOSAN = Object.keys(EVRE).filter((y) => EVRE[y] === "kosan");
// Yanlis kalemin dogdugu dakika (kurgu): sapmanin ortaya ciktigi an.
const DOGUS = { "yapilandirma-kovasi-genis-okuma": 900, "ornek-kimligi-oturumsuz": 2600,
  "sirda-uzun-omurlu-kimlik": 4300, "gunluk-kovasi-okumaya-acik": 7100 };
const SABIT = Object.keys(EVRE).filter((y) => EVRE[y] !== "kosan");

// Tarama araligi S ve duzeltme gecikmesi R ile bir kalem ne zaman kapanir.
const kapanis = (dogus, S, R) => S === Infinity ? Infinity : Math.ceil(dogus / S) * S + R;

function kos({ S, R, kapi }) {
  const kapanma = Object.fromEntries(KOSAN.map((y) => [y, kapanis(DOGUS[y], S, R)]));
  const bellek = new Map();
  let toplam = 0, ust = 0, acikDk = 0, agirDk = 0;
  const taban = yaricap(kapi ? new Set() : new Set(SABIT)).kalem;
  for (let t = 0; t < HAFTA; t++) {
    const acik = new Set(kapi ? [] : SABIT);
    for (const y of KOSAN) if (t >= DOGUS[y] && t < kapanma[y]) acik.add(y);
    const anahtar = [...acik].sort().join(",");
    if (!bellek.has(anahtar)) bellek.set(anahtar, yaricap(acik).kalem);
    const r = bellek.get(anahtar);
    toplam += r; ust = Math.max(ust, r);
    if (r > taban) acikDk++;
    if (r >= 10) agirDk++;
  }
  return { ort: (toplam / HAFTA).toFixed(1), ust, taban,
    acik: (acikDk / 60).toFixed(0), agir: (agirDk / 60).toFixed(0),
    degerlendirme: S === Infinity ? 0 : Math.round((HAFTA / S) * Object.keys(EVRE).length) };
}

const AYAR = [
  ["tarama yok, kapi yok", { S: Infinity, R: 0, kapi: false }],
  ["gunluk tarama + onayli duzeltme", { S: 1440, R: 480, kapi: false }],
  ["saatlik tarama + onayli duzeltme", { S: 60, R: 480, kapi: false }],
  ["saatlik tarama + otomatik duzeltme", { S: 60, R: 10, kapi: false }],
  ["+ sablon ve kabul kapisi", { S: 60, R: 10, kapi: true }],
  ["surekli tarama + otomatik duzeltme", { S: 5, R: 10, kapi: true }],
];

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

console.log(yz(["ayar", "taban", "ortalama", "en ust", "acik saat", "yaricap>=10", "degerlendirme"]));
for (const [ad, a] of AYAR) {
  const r = kos(a);
  console.log(yz([ad, `${r.taban}/${TOPLAM}`, r.ort, `${r.ust}/${TOPLAM}`, `${r.acik} sa`,
    `${r.agir} sa`, r.degerlendirme]));
}

const onayli = kos({ S: 60, R: 480, kapi: false }), oto = kos({ S: 60, R: 10, kapi: false });
const gunluk = kos({ S: 1440, R: 480, kapi: false });
console.log(`\ntarama araligini 1440 -> 60 dk yapmak acik sureyi ${gunluk.acik} -> ` +
  `${onayli.acik} saate indiriyor; duzeltme gecikmesini 480 -> 10 dk yapmak ` +
  `${onayli.acik} -> ${oto.acik} saate indiriyor`);
const kapili = kos({ S: 60, R: 10, kapi: true });
console.log(`kapi eklendiginde taban ${oto.taban} -> ${kapili.taban} ve en ust ` +
  `${oto.ust} -> ${kapili.ust} oluyor; acik saat ${oto.acik} -> ${kapili.acik}`);
const surekli = kos({ S: 5, R: 10, kapi: true });
console.log(`tarama araligini 60 -> 5 dk yapmak acik saati ${kapili.acik} -> ${surekli.acik} ` +
  `indiriyor ve haftalik degerlendirmeyi ${kapili.degerlendirme} -> ` +
  `${surekli.degerlendirme} yapiyor: ${(surekli.degerlendirme / kapili.degerlendirme).toFixed(0)} ` +
  `kat is, ${kapili.acik - surekli.acik} saat kazanc`);
console.log(`dort kosan kalemin dogus dakikalari ${Object.values(DOGUS).join(", ")}; ` +
  `ornek kimligi kalemi 2600. dakikada dogar ve acikken yaricap kapili duzende ${kapili.ust}, ` +
  `kapisiz duzende ${oto.ust} olur`);
```

```
ayar                                    taban ortalama   en ust   acik saat  yaricap>=10  degerlendirme
tarama yok, kapi yok                     4/28     17.0    23/28      153 sa       125 sa              0
gunluk tarama + onayli duzeltme          4/28      5.1    17/28       39 sa        13 sa             91
saatlik tarama + onayli duzeltme         4/28      4.8    17/28       25 sa         9 sa           2184
saatlik tarama + otomatik duzeltme       4/28      4.1    17/28        2 sa         1 sa           2184
+ sablon ve kabul kapisi                 4/28      4.0     6/28        2 sa         0 sa           2184
surekli tarama + otomatik duzeltme       4/28      4.0     6/28        1 sa         0 sa          26208

tarama araligini 1440 -> 60 dk yapmak acik sureyi 39 -> 25 saate indiriyor; duzeltme gecikmesini 480 -> 10 dk yapmak 25 -> 2 saate indiriyor
kapi eklendiginde taban 4 -> 4 ve en ust 17 -> 6 oluyor; acik saat 2 -> 2
tarama araligini 60 -> 5 dk yapmak acik saati 2 -> 1 indiriyor ve haftalik degerlendirmeyi 2184 -> 26208 yapiyor: 12 kat is, 1 saat kazanc
dort kosan kalemin dogus dakikalari 900, 2600, 4300, 7100; ornek kimligi kalemi 2600. dakikada dogar ve acikken yaricap kapili duzende 6, kapisiz duzende 17 olur
```

Hiçbir düzenek yokken yarıçap haftanın 153 saatinde tabanın üstünde duruyor ve ortalaması 17'dir.
Sapma doğduğu anda açılıyor ve kapanmıyor; ölçüm penceresinin tamamı bir açık penceredir.

#### Sıklık mı, Gecikme mi

İki sayı sıralamayı belirliyor ve ikisi aynı düğmeye bağlı değil. Tarama aralığını günden saate
indirmek açık süreyi 39 saatten 25 saate çekiyor: on dört saatlik kazanç, yirmi dört kat tarama.
Düzeltme gecikmesini sekiz saatten on dakikaya indirmek ise 25 saati **2 saate** çekiyor: yirmi üç
saatlik kazanç, hiç ek tarama yok. Açık pencereyi belirleyen şey taramanın sıklığı değil,
**işaretlenen kalemin ne zaman kapandığıdır.** Sekiz saatlik onay penceresi, saatlik taramanın
kazandırdığının çoğunu geri veriyor.

Bu, otomatik düzeltmeyi bedava yapmaz. Otomatik düzeltmenin kiralanan katmanda geniş bir yazma
yetkisi istediği ve meşru yapılandırmaları bozabildiği daha önceki kursta sayıldı; buradaki katkı,
o bedelin karşılığının **yirmi üç saatlik bir pencere** olduğunu yazmaktır. Onay penceresini kısa
tutmak ile düzeltmeyi otomatikleştirmek aynı sütuna yazılır.

Son iki satır kapıyı ekliyor. Şablon ve kabul kapısı açık süreyi hiç değiştirmiyor — 2 saat, aynı —
çünkü açık süreyi koşan kalemler belirliyor. Değiştirdiği şey **en üst yarıçaptır**: 17'den 6'ya
iniyor. Kapı, pencerenin uzunluğunu değil derinliğini kısar. İki denetim aynı tabloda iki ayrı işi
yapıyor ve biri diğerinin yerine geçmiyor. En alttaki satır sınırı gösteriyor: tarama aralığını
saatten beş dakikaya indirmek haftalık değerlendirmeyi 2.184'ten 26.208'e, on iki katına çıkarıyor
ve karşılığında bir saat kazandırıyor.

#### Özet

- 23 kenarın 13'ü bir yanlış yapılandırma kalemine bağlıdır; kalemlerin 7'si şablonda, 2'si kabulde,
  4'ü ancak koşan kaynağa bakılarak görülür.
- Şablon kapısı yedi kalemi dağıtımdan önce kapatıp yarıçapı 23'ten 8'e indiriyor; kabul kapısı iki
  kalem daha kapatıyor ve yarıçapı hiç indirmiyor — kalem saymak yarıçap saymak değildir.
- Yarıçapı en çok indiren tek kalem, örneğe bağlı kimliğin oturum başına doğrulama istemeden
  verilmesidir (23'ten 6'ya) ve bu kalem şablonda değil, ancak koşarken görülür.
- Hiçbir düzenek yokken yarıçap haftanın 153 saatinde tabanın üstündedir; günlük tarama ile onaylı
  düzeltme bunu 39 saate, saatlik tarama 25 saate indirir.
- Açık pencereyi belirleyen tarama sıklığı değil düzeltme gecikmesidir: sekiz saatlik onay
  penceresini on dakikaya indirmek 25 saati 2 saate çekiyor, hiç ek tarama istemeden.
- Şablon ve kabul kapısı açık süreyi değiştirmez ama en üst yarıçapı 17'den 6'ya indirir; tarama
  aralığını saatten beş dakikaya çekmek on iki kat değerlendirme karşılığında bir saat kazandırır.

#### Sonraki Adım

Buraya kadar her yanlış kalem kiracının kendi hesabının içindeydi ve kapatılabilir bir
yapılandırmaydı. Bir kalem bu tanıma uymuyor: iş yükünün üzerinde koştuğu bölme ya da konuk
sistemin sınırı. O sınır kiracının yazdığı bir yapılandırma değildir ve düştüğünde ulaşılan kalem
kümesi kiracının hesabıyla da sınırlı kalmaz. Sonraki ders bu sınırı çok kiracılı ortamda ölçer:
bölme kaçışının yarıçapı tek kiracıda kaç, aynı donanımı paylaşan kiracılar hesaba katıldığında
kaç.

### Konteyner ve Hipervizör Güvenliği

Source: https://academia.sh/tr/kurslar/bulut-guvenligi/konteyner-ve-hipervizor-guvenligi

Kaçış yarıçapının çok kiracılı ortamda ölçülmesi: 18 iş yükü, üç kiracı ve altı konak üzerinde paylaşık yerleşimde bir konteyner kaçışı en kötü durumda 18 kaleme ulaşıyor ve sekiz iş yükünün yedisinde başka bir kiracıya taşıyor. Kiracıya göre ayırma çapraz kaçışı sıfırlarken kendi en kötü yarıçapını 21'e çıkarıyor, kimliğe göre ayırma en kötüyü 18'de bırakıp ortalamayı 12,5'ten 8,5'e indiriyor ve konak sayısını 6'dan 13'e çıkarıyor. Yalıtımı güçlendirmek geçmek için gereken kalemi 1'den 3'e çıkarıyor ama yarıçapı hiç indirmiyor.

Buraya kadar her yanlış kalem kiracının kendi hesabının içindeydi. Bir kalem bu tanıma uymuyor: iş
yükünün üzerinde koştuğu bölmenin ya da konuk sistemin sınırı. O sınırı kiracı yazmaz, sağlayıcı
kurar; ve düştüğünde ulaşılan kalem kümesi kiracının hesabıyla sınırlı kalmaz, çünkü aynı fiziksel
konakta başka kiracıların iş yükleri de koşuyor olabilir.

Konuk ile konak arasındaki paylaşılan kalemler, sınırı geçmek için aynı anda yanlış olması gereken
kalem sayısı ve konteyner ile konuk sistemin bu ölçüde ayrışması **Bilgi Teknolojileri ve Sistem
Temelleri** kursunda ölçüldü. Burada tekrarlanmaz; **girdi olarak alınır**. Bu dersin sorusu tektir:
sınır düştüğünde **kaç kaleme** ulaşılıyor ve bu sayı tek kiracılı bir konakta ile paylaşılan bir
konakta nasıl değişiyor. Kaçış bir **modeldir**: hiçbir istismar adımı, çağrı dizisi ya da kod
yazılmaz, yalnızca sınırın düştüğü varsayılır ve sonrası sayılır. Bir bölme ya da konuk sınırını
gerçek bir sistemde sınamak, yazılı yetki ve tanımlı kapsam olmadan yapıldığında hem yasadışı hem
de meslek dışıdır.

**BT13.** Model üç kiracı, 18 iş yükü ve sekiz çekirdeklik konaklardan oluşur; her iş yükü bir
kiracıya, bir kimliğe ve bir çekirdek talebine bağlıdır (kurgu).
**BT14.** Yerleştirme ilk uygun konaktır; ayırma ölçütü yok, kiracıya göre ya da kimliğe göre olur.
**BT15.** Kaçış modeli şudur: bir iş yükünde sınır düşer ve **aynı konaktaki tüm iş yüklerine**
ulaşılır. Konaklar arası yayılma modele dahil değildir.
**BT16.** Ulaşılan kendi iş yüklerinin kimlikleri erişim grafiğine girdi olur; yarıçap o
kimliklerden erişilen kalem sayısıdır.
**BT17.** Başka kiracıların grafiği kiracıya kapalıdır; o taraf yalnız **ulaşılan iş yükü ve kiracı
sayısı** olarak sayılır.
**BT18.** Yalıtım türünün paylaşılan kalem ve gereken kalem sayıları önceki kurstan alınmıştır;
konuk sistemin iş yükü başına bir çekirdeklik ek yükü modelde yazılıdır.

#### Kaçışın Ulaştığı Komşu

```js
// yerlesim.mjs — konteyner kacisinin yaricapi: ayni konaktaki is yukleri ve onlarin kimlikleri.
// MODELDIR. Kacis bir MODEL adimidir; hicbir istismar adimi, cagri dizisi ya da kod yazilmaz.
const bol = (s) => s.trim().split("\n").map((l) => l.trim().split("|"));

// Is yuku: ad|kiraci|kimlik|cekirdek talebi. Uc kiraci, 18 is yuku (kurgu).
export const IS = bol(`
  portal-1|olcum|portal-ornek-kimligi|2      b-portal|kiraci-b|b-kimlik-1|3
  c-kapi|kiraci-c|c-kimlik-1|3               toplama-1|olcum|toplama-is-yuku-kimligi|3
  b-akis|kiraci-b|b-kimlik-2|3               c-hesap|kiraci-c|c-kimlik-2|3
  portal-2|olcum|portal-ornek-kimligi|2      b-toplu|kiraci-b|b-kimlik-3|4
  toplama-2|olcum|toplama-is-yuku-kimligi|3  c-rapor|kiraci-c|c-kimlik-3|2
  fatura-toplu|olcum|fatura-toplu-is-rolu|4  b-arsiv|kiraci-b|b-kimlik-3|2
  yedekleme|olcum|yedekleme-rolu|2           b-pano|kiraci-b|b-kimlik-4|1
  c-yedek|kiraci-c|c-kimlik-3|1              rapor|olcum|okuma-rolu|1
  b-sinama|kiraci-b|b-kimlik-4|1             pano|olcum|izleme-rolu|1`
  .replace(/\s{2,}/g, "\n")).map(([ad, kiraci, kimlik, c]) => ({ ad, kiraci, kimlik, c: +c }));

// Erisim grafigi (onceki derslerdeki grafik, sure sutunu olmadan): kaynak|hedef
const KENAR = bol(`
  portal-hizmet-hesabi|portal-ornegi        portal-hizmet-hesabi|okuma-rolu
  portal-ornegi|portal-ornek-kimligi        portal-ornek-kimligi|abone-veritabani
  portal-ornek-kimligi|sir-deposu           sir-deposu|toplama-is-yuku-kimligi
  toplama-is-yuku-kimligi|sayac-ham-kova    toplama-is-yuku-kimligi|olcum-kuyrugu
  toplama-is-yuku-kimligi|izleme-rolu       izleme-rolu|olcum-panosu
  portal-ornek-kimligi|fatura-toplu-is-rolu  fatura-toplu-is-rolu|fatura-arsiv-kovasi
  fatura-toplu-is-rolu|anahtar-yonetimi     anahtar-yonetimi|musteri-anahtari
  fatura-toplu-is-rolu|yedekleme-rolu       yedekleme-rolu|yedek-kovasi
  yedekleme-rolu|dagitim-rolu               dagitim-rolu|sablon-deposu
  dagitim-rolu|yapilandirma-kovasi          dagitim-rolu|is-yuku-ornegi
  okuma-rolu|rapor-kovasi                   okuma-rolu|gunluk-kovasi
  okuma-rolu|yapilandirma-kovasi`.replace(/\s{2,}/g, "\n"));

// Bir kimlikten erisilen kalem kumesi (enine arama).
export function erisim(baslangic) {
  const g = new Set(baslangic), kuyruk = [...baslangic];
  while (kuyruk.length) {
    const n = kuyruk.shift();
    for (const [k, h] of KENAR) if (k === n && !g.has(h)) { g.add(h); kuyruk.push(h); }
  }
  return g;
}

// Yerlestirme: ilk uygun konak. Ayirma olcutu "yok", "kiraci" ya da "kimlik" olabilir.
export function yerlestir(ayirma, ek = 0, KAP = 8) {
  const konak = [];
  for (const is of IS.map((i) => ({ ...i, c: i.c + ek }))) {
    const etiket = ayirma === "yok" ? null : ayirma === "kiraci" ? is.kiraci : is.kimlik;
    let k = konak.find((x) => x.kalan >= is.c && (etiket === null || x.etiket === etiket));
    if (!k) { k = { ad: `konak-${konak.length + 1}`, etiket, kalan: KAP, is: [] }; konak.push(k); }
    k.kalan -= is.c; k.is.push(is);
  }
  return konak;
}

// Kacis modeli: bir is yukunde sinir dusuyor, ayni konaktaki tum is yuklerine ulasiliyor.
export function kacis(konak, baslangicIs) {
  const k = konak.find((x) => x.is.some((i) => i.ad === baslangicIs));
  const ulasilan = k.is;
  const kendi = ulasilan.filter((i) => i.kiraci === "olcum");
  const baska = ulasilan.filter((i) => i.kiraci !== "olcum");
  const kalem = erisim(kendi.map((i) => i.kimlik));
  return { konak: k.ad, is: ulasilan.length, kendiIs: kendi.length, baskaIs: baska.length,
    baskaKiraci: new Set(baska.map((i) => i.kiraci)).size,
    kimlik: new Set(ulasilan.map((i) => i.kimlik)).size, kalem: kalem.size };
}

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

if (import.meta.url === `file://${process.argv[1]}`) {
  const yz = gen([22, 8, 10, 14, 16, 14, 10]);
  console.log(`${IS.length} is yuku, ${new Set(IS.map((i) => i.kiraci)).size} kiraci, ` +
    `konak kapasitesi 8 cekirdek; toplam talep ${IS.reduce((t, i) => t + i.c, 0)} cekirdek`);
  console.log("\n" + yz(["ayirma olcutu", "konak", "doluluk", "kacis konagi", "ulasilan is",
    "baska kiraci", "yaricap"]));
  for (const [ad, ayirma] of [["yok (paylasik)", "yok"], ["kiraciya gore", "kiraci"],
    ["kimlige gore", "kimlik"]]) {
    const k = yerlestir(ayirma);
    const r = kacis(k, "portal-1");
    const doluluk = Math.round(100 * IS.reduce((t, i) => t + i.c, 0) / (k.length * 8));
    console.log(yz([ad, k.length, `%${doluluk}`, r.konak, `${r.is} (${r.kendiIs} kendi)`,
      r.baskaKiraci, `${r.kalem}/28`]));
  }

  // Her is yukunden kacis: en kotu ve ortalama yaricap, paylasik ve kiraciya gore ayrilmis duzende.
  console.log();
  const yo = gen([22, 12, 12, 16, 18]);
  console.log(yo(["ayirma olcutu", "en kotu", "ortalama", "baska kiraciya", "kendi kalemine"]));
  for (const [ad, ayirma] of [["yok (paylasik)", "yok"], ["kiraciya gore", "kiraci"],
    ["kimlige gore", "kimlik"]]) {
    const k = yerlestir(ayirma);
    const r = IS.filter((i) => i.kiraci === "olcum").map((i) => kacis(k, i.ad));
    const ort = (r.reduce((t, x) => t + x.kalem, 0) / r.length).toFixed(1);
    console.log(yo([ad, `${Math.max(...r.map((x) => x.kalem))}/28`, ort,
      `${r.filter((x) => x.baskaIs > 0).length}/${r.length} kacis`,
      `${(r.reduce((t, x) => t + x.baskaIs, 0) / r.length).toFixed(1)} is yuku`]));
  }
}
```
```
18 is yuku, 3 kiraci, konak kapasitesi 8 cekirdek; toplam talep 41 cekirdek

ayirma olcutu            konak   doluluk  kacis konagi     ulasilan is  baska kiraci   yaricap
yok (paylasik)               6       %85       konak-1     3 (1 kendi)             2     18/28
kiraciya gore                7       %73       konak-1     4 (4 kendi)             0     21/28
kimlige gore                13       %39       konak-1     2 (2 kendi)             0     18/28

ayirma olcutu              en kotu    ortalama  baska kiraciya    kendi kalemine
yok (paylasik)               18/28        12.5       7/8 kacis       1.3 is yuku
kiraciya gore                21/28        16.9       0/8 kacis       0.0 is yuku
kimlige gore                 18/28         8.5       0/8 kacis       0.0 is yuku
```

Üst tablo tek bir kaçışa bakıyor. Paylaşık yerleşimde portal iş yükünün konağında üç iş yükü var
ve bunların yalnız biri kendi kiracımızın; kaçış iki başka kiracıya taşıyor. Kendi kalemlerimizden
18'ine ulaşılıyor. Kiracıya göre ayrılmış yerleşimde aynı konakta dört iş yükünün dördü de bizim ve
yarıçap 21'e çıkıyor. Çapraz kaçış sıfır, kendi yarıçapımız daha büyük.

#### Kendi Kalemi ve Başka Kiracı

Alt tablo sekiz iş yükünün her birinden kaçışı ayrı ayrı koşturuyor ve iki sütunun **ters yönde**
hareket ettiğini gösteriyor. Paylaşık yerleşimde kendi en kötü yarıçapımız 18, ortalama 12,5; ama
sekiz kaçışın yedisi başka bir kiracıya taşıyor ve kaçış başına ortalama 1,3 yabancı iş yüküne
ulaşılıyor. Kiracıya göre ayırma o yedi kaçışı sıfıra indiriyor — hiçbir kaçış kiracı sınırını
geçmiyor — ama kendi en kötü yarıçapımızı 18'den 21'e, ortalamayı 12,5'ten 16,9'a çıkarıyor.

Neden yükseldiği açıktır ve söylenmelidir: kiracıya göre ayırma, kendi iş yüklerimizi aynı
konaklarda **yoğunlaştırır**. Yabancı komşu kaldırıldığında yerine kendi komşumuz gelir ve kendi
komşumuzun kimliği erişim grafiğinde bir düğümdür. Kiracı ayrımı, ölçüyü düşürdüğü için değil,
**başka birinin ölçüsünü** düşürdüğü için yapılır.

Kimliğe göre ayırma da en kötü durumu kurtarmıyor: orada da 18 yazıyor. Nedeni tek bir kimliğin
grafikte bir kavşak olmasıdır — portalın örneğe bağlı kimliği tek başına 18 kaleme ulaşır, yanında
komşu olsun ya da olmasın. Kimliğe göre ayırmanın indirdiği sayı **ortalamadır**: 12,5'ten 8,5'e.
Yerleşimle oynamak, kavşak kimliğin kendi yarıçapını hiçbir zaman kısaltmaz.

#### Komşunun Görünmezliği

Tablodaki üç sütunun hepsi ölçülebilir görünüyor, ama kiracı tarafından ölçülebilen yalnız biri
var. Kiracı hangi konakta durduğunu ve o konakta başka kimin bulunduğunu **sayamaz**: yerleşim
ölçütü sağlayıcıya verilen bir istektir, karşılığı ise ne bir kayıtta ne bir envanterde görünür.
"Başka kiracıya" sütunu bu modelde hesaplanabiliyor çünkü yerleşimi biz kurduk; gerçek bir kiracı
o sayıyı hiçbir zaman doğrudan göremez.

Bunun tespit tarafındaki karşılığı birinci dersin kayıtsız adım sınıfının bir başka biçimidir.
Kaçış gerçekleştiğinde kiracının kaydında görünebilecek tek şey **kendi kimliklerinin
kullanımıdır**: komşu iş yüküne geçiş, konak üzerindeki hareket ve yabancı kiracıya taşma kiracının
hiçbir kaydına düşmez. Bu yüzden çapraz kaçışın ölçüsü kiracı için bir tespit sayısı değil, bir
**sözleşme sorusudur**: hangi ayırma ölçütünün uygulandığı, bunun nasıl doğrulandığı ve komşu
kümesinde bir olay olduğunda kiracının bilgilendirilip bilgilendirilmeyeceği önceden yazılmalıdır.
Yazılmamışsa tablodaki son sütun kiracı için boştur.

#### Yalıtım Gücü mü, Yerleşim mi

```js
// yalitim.mjs — yalitim gucu ile yerlesim ayrimi ayri ayri olculur. MODELDIR.
import { IS, yerlestir, kacis } from "./yerlesim.mjs";

// Yalitim turu: paylasilan kalem sayisi ve siniri gecmek icin AYNI ANDA yanlis olmasi gereken
// kalem sayisi, Bilgi Teknolojileri ve Sistem Temelleri kursunda olculmustur; burada GIRDIDIR.
// ek: is yuku basina ek cekirdek talebi (konuk sistemin kendi yuku).
const YALITIM = {
  "konteyner (ayni cekirdek)": { paylasilan: 12, gereken: 1, ek: 0 },
  "konuk (hipervizor)": { paylasilan: 5, gereken: 3, ek: 1 },
};
const AYIRMA = [["yok", "yok"], ["kiraci", "kiraci"], ["kimlik", "kimlik"]];
const KENDI = IS.filter((i) => i.kiraci === "olcum");

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, 10, 8, 10, 12, 16]);

console.log(yz(["yalitim", "ayirma", "gereken", "konak", "doluluk", "en kotu", "baska kiraciya"]));
const sonuc = {};
for (const [ad, y] of Object.entries(YALITIM)) for (const [etiket, ayirma] of AYIRMA) {
  const konak = yerlestir(ayirma, y.ek);
  const talep = IS.reduce((t, i) => t + i.c + y.ek, 0);
  const r = KENDI.map((i) => kacis(konak, i.ad));
  const capraz = r.filter((x) => x.baskaIs > 0).length;
  sonuc[`${ad}|${ayirma}`] = { ust: Math.max(...r.map((x) => x.kalem)), capraz, konak: konak.length,
    ort: (r.reduce((s, x) => s + x.kalem, 0) / r.length).toFixed(1) };
  console.log(yz([ad, etiket, y.gereken, konak.length,
    `%${Math.round(100 * talep / (konak.length * 8))}`,
    `${Math.max(...r.map((x) => x.kalem))}/28`, `${capraz}/${KENDI.length} kacis`]));
}

const b = sonuc["konteyner (ayni cekirdek)|yok"], k = sonuc["konuk (hipervizor)|yok"];
const ba = sonuc["konteyner (ayni cekirdek)|kiraci"], ka = sonuc["konuk (hipervizor)|kimlik"];
console.log(`\nyalitimi guclendirmek gereken kalemi 1 -> 3 yapiyor; ayni yerlesim uzerinde iki ` +
  `yalitim turu ayni yaricapi verir (${b.ust}/28). Yalitim turu gecilme kosulunu degistirir, ` +
  `gecildiginde ulasilan kalemi degil`);
console.log(`konuk sisteminin is yuku basina 1 cekirdeklik ek yuku konak sayisini ` +
  `${b.konak} -> ${k.konak} cikariyor; en kotu yaricap ${k.ust}/28 ile ayni kaliyor`);
console.log(`ayirmayi kiraciya gore yapmak capraz kacisi ${b.capraz}/${KENDI.length} -> ` +
  `${ba.capraz}/${KENDI.length} indiriyor ama kendi yaricapini buyutuyor: en kotu ` +
  `${b.ust} -> ${ba.ust}, ortalama ${b.ort} -> ${ba.ort}`);
console.log(`kimlige gore ayirma en kotu yaricapi indirmiyor (${ka.ust}/28) cunku en genis ` +
  `kimlik tek basina o kadar kaleme ulasiyor; indirdigi sey ortalamadir: ${b.ort} -> ${ka.ort}. ` +
  `Bedeli ${b.konak} -> ${ka.konak} konaktir`);
```
```
yalitim                      ayirma   gereken   konak   doluluk     en kotu  baska kiraciya
konteyner (ayni cekirdek)       yok         1       6       %85       18/28       7/8 kacis
konteyner (ayni cekirdek)    kiraci         1       7       %73       21/28       0/8 kacis
konteyner (ayni cekirdek)    kimlik         1      13       %39       18/28       0/8 kacis
konuk (hipervizor)              yok         3       8       %92       18/28       8/8 kacis
konuk (hipervizor)           kiraci         3       9       %82       18/28       0/8 kacis
konuk (hipervizor)           kimlik         3      13       %57       18/28       0/8 kacis

yalitimi guclendirmek gereken kalemi 1 -> 3 yapiyor; ayni yerlesim uzerinde iki yalitim turu ayni yaricapi verir (18/28). Yalitim turu gecilme kosulunu degistirir, gecildiginde ulasilan kalemi degil
konuk sisteminin is yuku basina 1 cekirdeklik ek yuku konak sayisini 6 -> 8 cikariyor; en kotu yaricap 18/28 ile ayni kaliyor
ayirmayi kiraciya gore yapmak capraz kacisi 7/8 -> 0/8 indiriyor ama kendi yaricapini buyutuyor: en kotu 18 -> 21, ortalama 12.5 -> 16.9
kimlige gore ayirma en kotu yaricapi indirmiyor (18/28) cunku en genis kimlik tek basina o kadar kaleme ulasiyor; indirdigi sey ortalamadir: 12.5 -> 8.5. Bedeli 6 -> 13 konaktir
```

#### İki Kaldıraç

Tablo iki kaldıracı yan yana koyuyor ve bunların aynı sütuna yazılmadığını gösteriyor. **Yalıtım
gücü** "gereken" sütununu değiştirir: aynı çekirdeği paylaşan bir bölmede sınırı geçmek için tek
bir kalemin yanlış olması yetiyor, konuk sistem sınırında üç kalemin aynı anda yanlış olması
gerekiyor. Bu, sınırın geçilme koşuludur. **Yerleşim ayrımı** ise "en kötü" ve "başka kiracıya"
sütunlarını değiştirir; sınır geçildikten sonra ne bulunacağını belirler.

İkisinin karıştırılmaması gerektiği tablonun iki ayırma satırında görülüyor: yerleşim ayrımı
yokken de kimliğe göre yapılırken de "en kötü" sütununda konteyner ve konuk yalıtımı **aynı
sayıyı** veriyor. Konuk sistemine geçmek konak sayısını 6'dan 8'e çıkarıyor,
doluluğu %85'ten %92'ye taşıyor ve yarıçapı 18'de bırakıyor. Bu, kursun ikinci "yarıçapı
düşürmeyen denetim" örneğidir; ilkinden — kayıttan — farkı, bu kez denetimin gerçekten bir şey
yapmasıdır: sınırın geçilme koşulunu bir kalemden üç kaleme çıkarır, ama geçildiğinde ulaşılan
kalem sayısına dokunmaz.

Bedel sütunu da okunmalıdır. Kimliğe göre ayırma çapraz kaçışı sıfırlar ve ortalamayı 12,5'ten
8,5'e indirir, ama en kötü durumu 18'de bırakır; karşılığında konak sayısı 6'dan 13'e çıkar ve
doluluk %85'ten %39'a düşer. Ortadaki seçenek — kiracıya göre ayırma — çapraz kaçışı yedi kaçıştan
sıfıra indirir, bir konak ekler ve kendi en kötü yarıçapımızı üç kalem büyütür. Üç satırın hiçbiri
en kötü durumu 18'in altına indirmiyor; onu indirmenin tek yolu bu dersin dışındadır ve kavşak
kimliğin kendi yetkisini daraltmaktan geçer.

#### Özet

- Paylaşık yerleşimde bir konteyner kaçışı kendi kalemlerimizden en kötü durumda 18'ine ulaşıyor;
  sekiz kaçışın yedisi başka bir kiracıya taşıyor ve kaçış başına ortalama 1,3 yabancı iş yükü
  ulaşılabilir oluyor.
- Kiracıya göre ayırma çapraz kaçışı yediden sıfıra indirir ama kendi en kötü yarıçapını 18'den
  21'e, ortalamayı 12,5'ten 16,9'a çıkarır: yabancı komşu kaldırıldığında yerine kendi komşumuz gelir.
- Kimliğe göre ayırma en kötü durumu 18'de bırakır ve yalnız ortalamayı 12,5'ten 8,5'e indirir;
  bedeli konak sayısının 6'dan 13'e çıkması ve dolulukta %85'ten %39'a düşüştür.
- Yalıtım gücü sınırın **geçilme koşulunu** değiştirir: aynı çekirdeği paylaşan bölmede bir kalem
  yeterken konuk sistem sınırında üç kalemin aynı anda yanlış olması gerekir.
- Yarıçap altı satırın hepsinde 18 ya da 21'dir; ne yalıtım türü ne de konuk sisteminin ek çekirdek
  yükü onu indirir, çünkü kavşak kimlik tek başına o kadar kaleme ulaşır.
- Kiracı komşu kümesini sayamaz: yerleşim ölçütü sağlayıcıya verilen bir istektir ve kaçışın
  komşuya taşan kısmı kiracının hiçbir kaydına düşmez, bu yüzden sözleşmede yazılmalıdır.

#### Sonraki Adım

Bu dersin bütün ölçümü, iş yükünün kaçış anında **ayakta** olduğunu varsaydı: konakta duruyor,
kimliği kullanılabiliyor, komşusu görülebiliyor. Bazı iş yükleri bu varsayımı sağlamaz. Bir işlev
çalıştırma ortamında iş yükü saniyeler sürer, işi biter ve ortadan kalkar; geride ne bir konak
kaydı ne de incelenecek bir süreç bırakır. Sonraki ders bu iş yüklerinde kaydın toplanabildiği
pencereyi ölçer: iş yükü kaç saniye yaşıyor, kaç kalem yaşarken toplanmazsa kayboluyor.

### Sunucusuz Güvenlik

Source: https://academia.sh/tr/kurslar/bulut-guvenligi/sunucusuz-guvenlik

Kısa ömürlü iş yüklerinde kanıtın toplanabildiği pencerenin ölçülmesi: 400 çağrının ortanca ömrü 447 ms, uyarıya bağlı elle toplama 400 çağrının hiçbirine, otomatik toplama 15'ine yetişiyor. Ortam içinden sürekli akıtma 3.600 kanıt kaleminin 3.541'ini alıyor; 60 saniyelik tutma aynı sonucu çalışma süresinin 34 katı ortam-saniyeyle veriyor. Kimliğin geçerlilik süresi ise ömrün 8.054 katıdır ve açık kalem-saniyenin yüzde yüzü iş yükü sonlandıktan sonra geçiyor.

Önceki dersin bütün ölçümü iş yükünün **ayakta** olduğunu varsaydı: konakta duruyordu, kimliği
kullanılabiliyordu, komşusu sayılabiliyordu. Bir iş yükü sınıfı bu varsayımı sağlamaz. Bir işlev
çalıştırma ortamında iş yükü yüz milisaniye ile birkaç saniye arasında yaşar, işi biter ve ortam
geri alınır. Uyarı geldiğinde bakılacak bir süreç, açılacak bir kabuk ve imajı alınacak bir disk
yoktur.

Bu dersin ölçtüğü şey o yüzden **penceredir**: iş yükü kaç saniye yaşıyor ve kanıt kalemlerinin
kaçı, o pencere kapanmadan toplanmazsa geri gelmiyor. Kısa ömürlü iş yüklerinin çalışma zamanı
kısıtları, soğuk başlangıç ve ölçekleme davranışı **Sunucusuz ve Kenar Bilişim** kursunda ölçüldü;
burada tekrarlanmaz. Ölçüm **bölgesel ölçüm ağı** üzerindedir, **kurgudur** ve `node` ile yazılmış bir
**modeldir**; üreteç kendi yazılmıştır, tohum çıktıda görünür.

**BT19.** Model 400 çağrıdan oluşur; ömürler üç banttan üretilir ve milisaniye cinsindendir (kurgu).
**BT20.** Dokuz kanıt kalemi üç sınıfa ayrılır: beşi yalnız iş yükü **yaşarken** alınabilir, üçü
**sonradan** da alınabilir, biri iş yükünün kendi kaydıdır ve ancak sonlanmadan önce
**boşaltılmışsa** teslim edilir.
**BT21.** Toplama gecikmesi $T$, uyarıdan toplamanın başlamasına kadar geçen süredir; tutma $H$,
çağrı bittikten sonra ortamın canlı bırakıldığı süredir.
**BT22.** Yaşarken alınabilen kalemler ancak $T < \text{ömür} + H$ ise toplanır.
**BT23.** Her çağrı kendi kısa ömürlü kimliğini alır; belirtecin geçerlilik süresi $V$ saniyedir
(kurgu).
**BT24.** Açık kalem-saniye, kimliğin eriştiği kalem sayısı ile belirtecin geçerli kaldığı sürenin
çarpımıdır. Erişilen kalem sayısı birinci dersteki yürüyüşten alınmıştır.

#### Kanıtın Toplanabildiği Pencere

```js
// omur.mjs — kisa omurlu is yuklerinde kanitin toplanabildigi pencere. MODELDIR.
// Bolgesel olcum agi KURGUDUR. Uretec kendi yazilmistir; tohum asagida gorunur.
export const TOHUM = 20260805;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };

// Kanit kalemi: ad|sinif. yasarken: is yuku ayaktayken alinabilir; sonradan: sonra da alinabilir;
// bosaltma: is yukunun kendi kaydi, ancak sonlanmadan once bosaltilmissa teslim edilir.
export const KANIT = `
  bellek-icerigi|yasarken          surec-listesi|yasarken
  acik-baglanti|yasarken           ortam-degiskeni-degeri|yasarken
  gecici-dosya|yasarken            cagri-ust-verisi|sonradan
  yonetim-duzlemi-kaydi|sonradan   islev-surumu|sonradan
  islev-kendi-kaydi|bosaltma`.trim().split(/\s{2,}|\n/).map((x) => x.trim().split("|"))
  .map(([ad, sinif]) => ({ ad, sinif }));

const r = uretec(TOHUM);
// 400 cagri: omur milisaniye cinsinden, uc bant. Bosaltma bayragi kaydin teslim edilip
// edilmedigini soyler (kurgu oran).
export const CAGRI = Array.from({ length: 400 }, () => {
  const u = r();
  const omur = u < 0.72 ? 80 + Math.floor(r() * 520)
    : u < 0.94 ? 600 + Math.floor(r() * 3400)
    : 4000 + Math.floor(r() * 41000);
  return { omur, bosaltildi: r() > 0.14 };
});

export const YASARKEN = KANIT.filter((k) => k.sinif === "yasarken").length;
export const SONRADAN = KANIT.filter((k) => k.sinif === "sonradan").length;

// Bir ayarda kac kanit kalemi toplaniyor. T: toplama gecikmesi (ms), H: cagri sonrasi tutma (ms).
export function topla(T, H) {
  let canli = 0, kalem = 0;
  for (const c of CAGRI) {
    const pencere = c.omur + H;
    if (T < pencere) { canli++; kalem += YASARKEN; }
    kalem += SONRADAN + (c.bosaltildi ? 1 : 0);
  }
  return { canli, kalem, tam: CAGRI.length * KANIT.length,
    ortamSaniye: Math.round((CAGRI.length * H) / 1000) };
}

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

if (import.meta.url === `file://${process.argv[1]}`) {
  const sirali = [...CAGRI].map((c) => c.omur).sort((a, b) => a - b);
  const yuzde = (p) => sirali[Math.floor(p * sirali.length)];
  console.log(`model (tohum ${TOHUM}): ${CAGRI.length} cagri, ${KANIT.length} kanit kalemi ` +
    `(${YASARKEN} yasarken, ${SONRADAN} sonradan, 1 bosaltmaya bagli)`);
  console.log(`omur (ms): ortanca ${yuzde(0.5)}, %90 ${yuzde(0.9)}, %99 ${yuzde(0.99)}, ` +
    `en uzun ${sirali.at(-1)}; toplam yasam ${Math.round(sirali.reduce((a, b) => a + b) / 1000)} sn`);

  const yz = gen([30, 10, 10, 18, 16, 18]);
  console.log("\n" + yz(["ayar", "gecikme", "tutma", "kanit alinabilen", "toplanan kalem",
    "bedel"]));
  const AYAR = [
    ["uyari + elle toplama", 300000, 0, "-"],
    ["otomatik toplama", 10000, 0, "-"],
    ["otomatik toplama + tutma", 10000, 60000, "ortam-saniye"],
    ["otomatik toplama + uzun tutma", 2000, 300000, "ortam-saniye"],
    ["ortam icinden surekli akitma", 0, 0, "cagri basina 8 ms"],
  ];
  for (const [ad, T, H, bedel] of AYAR) {
    const s = topla(T, H);
    console.log(yz([ad, `${T / 1000} sn`, `${H / 1000} sn`,
      `${s.canli}/${CAGRI.length} cagri`, `${s.kalem}/${s.tam}`,
      H ? `${s.ortamSaniye} ortam-sn` : bedel]));
  }

  const elle = topla(300000, 0), oto = topla(10000, 0), akit = topla(0, 0);
  console.log(`\nelle toplama ${elle.canli}/${CAGRI.length} cagride yetisiyor, otomatik toplama ` +
    `${oto.canli}/${CAGRI.length}; ikisi arasindaki fark ${oto.kalem - elle.kalem} kalem`);
  console.log(`ortam icinden akitma ${akit.canli}/${CAGRI.length} cagriya yetisir ve ` +
    `${akit.kalem}/${akit.tam} kalem toplar: eksik kalan ${akit.tam - akit.kalem} kalem, ` +
    `sonlanmadan once bosaltilmamis kendi kaydidir`);
  const tut = topla(10000, 60000);
  console.log(`60 sn tutma kanit alinabilen cagriyi ${oto.canli} -> ${tut.canli} cikariyor; ` +
    `bedeli ${tut.ortamSaniye} ortam-saniyedir, yani calisma suresinin ` +
    `${Math.round(tut.ortamSaniye / (sirali.reduce((a, b) => a + b) / 1000))} kati`);
}
```

```
model (tohum 20260805): 400 cagri, 9 kanit kalemi (5 yasarken, 3 sonradan, 1 bosaltmaya bagli)
omur (ms): ortanca 447, %90 3249, %99 29130, en uzun 40604; toplam yasam 703 sn

ayar                             gecikme     tutma  kanit alinabilen  toplanan kalem             bedel
uyari + elle toplama              300 sn      0 sn       0/400 cagri       1541/3600                 -
otomatik toplama                   10 sn      0 sn      15/400 cagri       1616/3600                 -
otomatik toplama + tutma           10 sn     60 sn     400/400 cagri       3541/3600    24000 ortam-sn
otomatik toplama + uzun tutma       2 sn    300 sn     400/400 cagri       3541/3600   120000 ortam-sn
ortam icinden surekli akitma        0 sn      0 sn     400/400 cagri       3541/3600 cagri basina 8 ms

elle toplama 0/400 cagride yetisiyor, otomatik toplama 15/400; ikisi arasindaki fark 75 kalem
ortam icinden akitma 400/400 cagriya yetisir ve 3541/3600 kalem toplar: eksik kalan 59 kalem, sonlanmadan once bosaltilmamis kendi kaydidir
60 sn tutma kanit alinabilen cagriyi 15 -> 400 cikariyor; bedeli 24000 ortam-saniyedir, yani calisma suresinin 34 kati
```

Ortanca çağrı 447 milisaniye yaşıyor; çağrıların onda dokuzu 3,2 saniyenin altında bitiyor. Bu
dağılımda uyarıya bağlı elle toplama — beş dakikalık bir gecikmeyle — 400 çağrının **hiçbirine**
yetişmiyor. Sıfır. Otomatik toplama gecikmeyi on saniyeye indirdiğinde 15 çağrıya yetişiyor, yani
%3,75'ine; kazandırdığı 75 kanıt kalemi, toplam 3.600 kalemin %2,1'idir.

#### Yetişilemeyen Kalem

Sayının bu kadar sert olması, gecikmenin kısaltılmasıyla düzelen bir sorun olmadığını gösteriyor.
On saniyelik gecikme zaten hızlı bir tepkidir ve yine de çağrıların %96'sını kaçırıyor; iki
saniyeye inmek de yetmez, çünkü ortanca ömür yarım saniyedir. **Toplama gecikmesini kısaltmak bu
iş yükü sınıfında çalışmayan bir kaldıraçtır.**

Birinci dersteki kör önek burada başka bir biçime giriyor. Orada kaydın gecikmesi yürüyüşün ilk
adımlarını görünmez kılıyordu ama adımlar sonradan kayıtta duruyordu; burada gecikme, kanıtın
**hiç var olmamasına** yol açıyor. Uyarının 5 dakika sonra gelmesi kaydı geciktirmiyor, toplanacak
şeyi ortadan kaldırıyor. Toplanan 1.541 kalem yalnızca sonradan da alınabilen üç sınıftan ve
boşaltılmış kendi kayıtlarından geliyor; yaşarken alınabilen 2.000 kalemin tamamı kayıp.

Çalışan iki kaldıraç var ve ikisi de pencereyi uzatmıyor, pencereyi **kaldırıyor.** Birincisi
tutmadır: çağrı bittikten sonra ortam altmış saniye canlı bırakılırsa kanıt alınabilen çağrı
15'ten 400'e çıkıyor ve toplanan kalem 1.616'dan 3.541'e. Bedeli 24.000 ortam-saniyedir — 400
çağrının toplam çalışma süresi 703 saniyeyken, tutma **34 katı** kadar ortam-saniye tüketiyor.
Üstelik tutmayı 300 saniyeye çıkarmak hiçbir ek kalem getirmiyor ve bedeli 120.000 ortam-saniyeye
çıkarıyor: aynı sonucun beş katı fiyatı.

İkincisi ortam içinden sürekli akıtmadır: yaşarken alınabilen kalemler, iş yükü koşarken dışarı
yazılır. Aynı 3.541 kalemi çağrı başına 8 milisaniyelik ek gecikmeyle veriyor. Eksik kalan 59
kalem her üç ayarda da aynıdır ve tek bir sınıftan gelir — sonlanmadan önce boşaltılmamış kendi
kaydı. Onu ne tutma ne akıtma kurtarır; kaydın sonlanmadan önce boşaltılmasını **iş yükünün kendisi**
yapmak zorundadır.

#### Yarıçap Penceresi Kanıt Penceresinden Uzun

```js
// belirtec.mjs — is yukunun omru ile aldigi kimligin gecerlilik suresi karsilastirilir. MODELDIR.
import { CAGRI } from "./omur.mjs";

// Kimligin eristigi kalem sayisi, birinci derste kosturulan yuruyusten alinmistir: MODEL girdisi.
const ERISIM = { toplama: 5, daraltilmis: 2 };
const TOPLAM_OMUR = CAGRI.reduce((t, c) => t + c.omur, 0) / 1000;   // saniye

// Bir ayarda acik kalem-saniye: her cagri icin kalem sayisi x belirtecin gecerli kaldigi sure.
// Iptal secenegi belirteci is yuku sonlanir sonlanmaz gecersiz kilar.
function olc({ V, iptal = false, dar = false }) {
  const kalem = ERISIM[dar ? "daraltilmis" : "toplama"];
  let acik = 0, oluAcik = 0;
  for (const c of CAGRI) {
    const sure = iptal ? c.omur / 1000 : V;
    acik += kalem * sure;
    oluAcik += kalem * Math.max(0, sure - c.omur / 1000);
  }
  return { acik: Math.round(acik), oluAcik: Math.round(oluAcik), kalem,
    pay: `%${Math.round(100 * oluAcik / acik)}` };
}

const gen = (B) => (h) => h.map((v, j) => j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))
  .join("");
const yz = gen([32, 12, 8, 18, 10, 28]);

console.log(`${CAGRI.length} cagri, toplam calisma ${TOPLAM_OMUR.toFixed(0)} sn; her cagri ` +
  `kendi kisa omurlu kimligini aliyor`);
console.log("\n" + yz(["ayar", "gecerlilik", "kalem", "acik kalem-saniye", "olu pay", "bedel"]));
const AYAR = [
  ["varsayilan belirtec", { V: 3600 }, "yok"],
  ["gecerlilik 900 sn", { V: 900 }, "yenileme 4 kat"],
  ["gecerlilik 300 sn", { V: 300 }, "yenileme 12 kat"],
  ["is yuku bitince iptal", { V: 3600, iptal: true }, `${CAGRI.length} iptal cagrisi`],
  ["iptal + daraltilmis kimlik", { V: 3600, iptal: true, dar: true }, "1 mesru is yeniden yazilir"],
];
for (const [ad, a, bedel] of AYAR) {
  const s = olc(a);
  console.log(yz([ad, a.iptal ? "omur kadar" : `${a.V} sn`, s.kalem, s.acik, s.pay, bedel]));
}

const varsayilan = olc({ V: 3600 }), iptalli = olc({ V: 3600, iptal: true });
const dar = olc({ V: 3600, iptal: true, dar: true });
const ortanca = [...CAGRI].map((c) => c.omur).sort((a, b) => a - b)[CAGRI.length >> 1];
console.log(`\nkanit penceresi ile yaricap penceresi ayni olcekte degil: ortanca cagri ` +
  `${ortanca} ms yasiyor, aldigi belirtec 3600 sn gecerli — ` +
  `${Math.round(3600000 / ortanca)} kat`);
console.log(`varsayilan ayarda acik kalem-saniyenin ${varsayilan.pay}'i is yuku sonlandiktan ` +
  `SONRA gecen suredir; gecerliligi 300 sn yapmak bu payi ${olc({ V: 300 }).pay} yapiyor`);
console.log(`is yuku bitince iptal acik kalem-saniyeyi ${varsayilan.acik} -> ${iptalli.acik} ` +
  `indiriyor, yani ${Math.round(varsayilan.acik / iptalli.acik)} kat; bedeli cagri basina bir ` +
  `iptal cagrisidir`);
console.log(`kimligi daraltmak (5 -> 2 kalem) ayni pencereyi ${iptalli.acik} -> ${dar.acik} ` +
  `indiriyor; iki denetim carpim halinde calisir, toplam ` +
  `${Math.round(varsayilan.acik / dar.acik)} kat`);
```

```
400 cagri, toplam calisma 703 sn; her cagri kendi kisa omurlu kimligini aliyor

ayar                              gecerlilik   kalem acik kalem-saniye   olu pay                       bedel
varsayilan belirtec                  3600 sn       5           7200000      %100                         yok
gecerlilik 900 sn                     900 sn       5           1800000      %100              yenileme 4 kat
gecerlilik 300 sn                     300 sn       5            600000       %99             yenileme 12 kat
is yuku bitince iptal             omur kadar       5              3514        %0           400 iptal cagrisi
iptal + daraltilmis kimlik        omur kadar       2              1405        %0  1 mesru is yeniden yazilir

kanit penceresi ile yaricap penceresi ayni olcekte degil: ortanca cagri 447 ms yasiyor, aldigi belirtec 3600 sn gecerli — 8054 kat
varsayilan ayarda acik kalem-saniyenin %100'i is yuku sonlandiktan SONRA gecen suredir; gecerliligi 300 sn yapmak bu payi %99 yapiyor
is yuku bitince iptal acik kalem-saniyeyi 7200000 -> 3514 indiriyor, yani 2049 kat; bedeli cagri basina bir iptal cagrisidir
kimligi daraltmak (5 -> 2 kalem) ayni pencereyi 3514 -> 1405 indiriyor; iki denetim carpim halinde calisir, toplam 5125 kat
```

Tablo dersin asıl sayısını veriyor. İş yükü 447 milisaniye yaşıyor, aldığı belirteç 3.600 saniye
geçerli: **8.054 kat**. Kanıt penceresi milisaniyeyle ölçülürken yarıçap penceresi saatle ölçülüyor
ve ikisi aynı olayın iki yüzü. Varsayılan ayarda açık kalem-saniyenin tamamına yakını — yuvarlanmış
haliyle yüzde yüzü — iş yükü **sonlandıktan sonra** geçen süredir. Ortada koşan bir şey yokken
geçerli bir kimlik bilgisi duruyor.

#### İki Pencerenin Ayrılması

Geçerlilik süresini kısaltmak doğru yönde ama yavaş bir kaldıraçtır: 3.600 saniyeden 300 saniyeye
inmek açık kalem-saniyeyi on iki kat düşürüyor, ölü payı ise %100'den ancak %99'a iniyor ve
karşılığında belirteç yenileme sayısı on iki katına çıkıyor. Oran değişmiyor çünkü sorun sürenin
uzunluğu değil, sürenin iş yükünün ömrüne bağlı olmamasıdır.

Bağlamak işe yarıyor. İş yükü sonlanır sonlanmaz belirtecin iptal edilmesi açık kalem-saniyeyi
7.200.000'den 3.514'e indiriyor — **2.049 kat** — ve ölü payı sıfırlıyor. Bedeli çağrı başına bir
iptal çağrısıdır, yani 400 çağrı için 400 ek yönetim düzlemi çağrısı. Son satır ikinci kaldıracı
ekliyor: kimliğin eriştiği kalem sayısını 5'ten 2'ye indirmek pencereyi 1.405'e çekiyor. İki denetim
**çarpım halinde** çalışıyor; birlikte 5.125 kat. Bedeli bir meşru işin yeniden yazılmasıdır.

Dersin iki tablosu böylece aynı cümleye çıkıyor: kısa ömürlü iş yükünde kanıt penceresi kendiliğinden
kapanır, yarıçap penceresi kendiliğinden kapanmaz. Birincisini açık tutmak için ödeme yapılır,
ikincisini kapatmak için karar verilir.

#### Özet

- 400 çağrının ortanca ömrü 447 ms, %90'ı 3,2 saniyenin altında; dokuz kanıt kaleminin beşi yalnız
  iş yükü yaşarken alınabiliyor.
- Beş dakikalık gecikmeyle elle toplama 400 çağrının hiçbirine yetişmiyor; on saniyelik otomatik
  toplama 15'ine yetişiyor ve toplam 3.600 kalemin yalnız %2,1'ini kazandırıyor.
- Ortamı 60 saniye tutmak kanıt alınabilen çağrıyı 400'e çıkarır ve 3.541 kalem toplar; bedeli
  24.000 ortam-saniye, yani toplam çalışma süresinin 34 katıdır ve 300 saniyeye çıkarmak hiçbir ek
  kalem getirmez.
- Ortam içinden sürekli akıtma aynı 3.541 kalemi çağrı başına 8 ms ek gecikmeyle verir; her üç
  ayarda da eksik kalan 59 kalem, sonlanmadan önce boşaltılmamış kendi kaydıdır.
- Belirtecin geçerlilik süresi ortanca ömrün 8.054 katıdır ve varsayılan ayarda açık kalem-saniyenin
  tamamına yakını iş yükü sonlandıktan sonra geçer.
- Süreyi kısaltmak oranı değiştirmez (300 saniyede ölü pay hâlâ %99); iş yükü bitince iptal
  pencereyi 2.049 kat, kimliği daraltmak birlikte 5.125 kat indirir.

#### Sonraki Adım

Buraya kadar her ders tek bir yanlış kalemi seçip yarıçapını ölçtü: aşırı yetkili bir rol, açık bir
kova, tutulmayan bir ortam, uzun ömürlü bir belirteç. Bunlar tek tek ölçüldü ama birbirine nasıl
bağlandıkları yazılmadı. Sonraki ders bu bağları kalıp düzeyinde toplar: hangi kalem yanlışsa hangi
yol açılıyor, o yol boyunca hangi kayıt düşüyor ve hangi denetim yolu kapatıyor.

### Bulut Saldırı Kalıpları

Source: https://academia.sh/tr/kurslar/bulut-guvenligi/bulut-saldiri-kaliplari

On üç kalıbın aynı grafik üzerinde kalem-yol-kayıt-denetim dörtlüsüyle sayılması: kalıpların sekizi yönetim düzlemi kaydına düşen bir adımla açılıyor, üçü yalnız sağlayıcıda duran bir adımla, biri hiçbir kayda düşmeyen bir adımla. En büyük katkıyı veren kalıp — örneğe bağlı kimliğin oturum doğrulaması olmadan verilmesi — tek başına yarıçapı 6'dan 23'e çıkarıyor ve kayıtsız sınıftadır. Denetim sırası bedeli belirliyor: birim faydaya göre bir denetim ve iki bedel, en ucuzdan başlayarak sekiz denetim ve sekiz bedel aynı yarıçapı veriyor.

Buraya kadarki dört ders tek tek kalemleri ölçtü: bir kaydın görmediği adım, dağıtımdan sonra
doğan bir sapma, bir konağı paylaşan komşu, ömrünü aşan bir belirteç. Her biri kendi bağlamında
sayıldı ama aralarındaki bağ yazılmadı. Bu ders o bağı **kalıp düzeyinde** toplar ve her kalıbı
dört alanla yazar: hangi kalem yanlış, hangi adım açılıyor, o adım hangi kayda düşüyor, hangi
denetim kapatıyor.

Kalıplar **model** olarak anlatılır. Hiçbir sızma adımı, çağrı dizisi, uç nokta yolu, istek biçimi
ya da kimlik bilgisi toplama yöntemi yazılmaz; koşan kod yalnızca grafik yürüyüşü ve denetim
değerlendirmesidir. Bir bulut ortamında bu kalıplardan herhangi birini sınamak, yazılı yetki ve
tanımlı kapsam olmadan yapıldığında hem yasadışı hem de meslek dışıdır. Ölçüm **bölgesel ölçüm
ağı** üzerindedir ve **kurgudur**.

**BT25.** Her kalıp bir yanlış kaleme, o kalem bir kenara karşılık gelir; kalem kapalıysa kenar
yürünemez.
**BT26.** Kalıbın "açtığı adım", kenarın adım türüdür; kayıt sınıfı birinci dersin sınıflamasından
gelir.
**BT27.** Kalıbın katkısı, o kalem tek başına kapatıldığında yarıçapın düştüğü kalem sayısıdır.
**BT28.** Her kalıbın bir kapatan denetimi vardır; denetim, kalıbın işleyebilmesi için sağlanması
gereken ön koşul sayısını değiştirir (model girdisi).
**BT29.** Denetimin bedeli, durdurduğu meşru iş sayısıdır (kurgu birim).
**BT30.** Sıralama iki ölçütle yapılır: birim bedel başına en çok kalem indiren denetim, ya da
yalnızca en ucuz denetim.

#### Kalıp Düzeyinde Katalog

```js
// kalip.mjs — bulut saldiri kaliplari KALIP DUZEYINDE: hangi kalem yanlissa hangi kenar aciliyor,
// o kenar hangi kayit sinifina dusuyor, kapatildiginda yaricap kaca iniyor. MODELDIR.
// Hicbir sizma adimi, cagri dizisi, uc nokta yolu ya da istek bicimi yazilmaz.
const bol = (s) => s.trim().split("\n").map((l) => l.trim().split("|"));

// Kenar: kaynak|hedef|adim turu|sure(dk)|kenari mumkun kilan yanlis kalem ("-" ise mesru)
export const KENAR = bol(`
  portal-hizmet-hesabi|portal-ornegi|ag-baglantisi|3|-
  portal-hizmet-hesabi|okuma-rolu|rol-ustlenme|4|-
  portal-ornegi|portal-ornek-kimligi|ornek-kimligi-alma|2|ornek-kimligi-oturumsuz
  portal-ornek-kimligi|abone-veritabani|veritabani-sorgusu|6|-
  portal-ornek-kimligi|sir-deposu|sir-okuma|4|portal-kimligine-sir-okuma
  sir-deposu|toplama-is-yuku-kimligi|sir-okuma|3|sirda-uzun-omurlu-kimlik
  toplama-is-yuku-kimligi|sayac-ham-kova|nesne-okuma|5|-
  toplama-is-yuku-kimligi|olcum-kuyrugu|kuyruk-tuketimi|4|-
  toplama-is-yuku-kimligi|izleme-rolu|rol-ustlenme|4|is-yukune-rol-ustlenme
  izleme-rolu|olcum-panosu|kaynak-listeleme|3|-
  portal-ornek-kimligi|fatura-toplu-is-rolu|rol-ustlenme|3|portal-kimligine-toplu-is-rolu
  fatura-toplu-is-rolu|fatura-arsiv-kovasi|nesne-okuma|6|-
  fatura-toplu-is-rolu|anahtar-yonetimi|anahtar-cozme|4|anahtar-kullanimi-kosulsuz
  anahtar-yonetimi|musteri-anahtari|anahtar-cozme|2|anahtar-politikasinda-kosul-yok
  fatura-toplu-is-rolu|yedekleme-rolu|rol-ustlenme|3|zincirli-rol-ustlenme
  yedekleme-rolu|yedek-kovasi|nesne-okuma|7|-
  yedekleme-rolu|dagitim-rolu|rol-ustlenme|4|yedekleme-rolune-dagitim
  dagitim-rolu|sablon-deposu|nesne-okuma|5|sablon-deposu-yazmaya-acik
  dagitim-rolu|yapilandirma-kovasi|nesne-okuma|4|-
  dagitim-rolu|is-yuku-ornegi|ornek-ici-calisma|9|dagitim-rolu-ornek-baslatabiliyor
  okuma-rolu|rapor-kovasi|nesne-okuma|4|-
  okuma-rolu|gunluk-kovasi|nesne-okuma|5|gunluk-kovasi-okumaya-acik
  okuma-rolu|yapilandirma-kovasi|nesne-okuma|6|yapilandirma-kovasi-genis-okuma`)
  .map(([k, h, t, d, y]) => ({ k, h, t, d: +d, y }));

// Adim turunun kaydi kiracinin eline geciyor mu (birinci dersin siniflamasi).
const KAYIT = { "rol-ustlenme": "yonetim", "kaynak-listeleme": "yonetim", "sir-okuma": "yonetim",
  "anahtar-cozme": "yonetim", "veritabani-sorgusu": "uygulama", "ornek-ici-calisma": "ajansiz",
  "nesne-okuma": "saglayicida", "kuyruk-tuketimi": "saglayicida",
  "ornek-kimligi-alma": "kayitsiz", "ag-baglantisi": "kayitsiz" };

// Kalip: ad|tetikleyen yanlis kalem|kapatan denetim|denetim oncesi adim|denetim sonrasi adim
// Adim sayilari, kalibin isleyebilmesi icin saglanmasi gereken on kosul sayisidir. MODEL girdisi.
export const KALIP = bol(`
  meta-veri-servisinden-kimlik|ornek-kimligi-oturumsuz|oturum-basina-dogrulama|1|3
  sir-deposuna-genis-erisim|portal-kimligine-sir-okuma|sir-erisimini-kapsamla-sinirla|1|2
  sirdan-uzun-omurlu-kimlik|sirda-uzun-omurlu-kimlik|sirda-yalniz-kisa-omurlu-kimlik|1|3
  is-yukunden-rol-ustlenme|is-yukune-rol-ustlenme|is-yuku-kimligini-roldan-ayir|1|2
  yatay-rol-gecisi|portal-kimligine-toplu-is-rolu|kimlige-gore-rol-daraltma|1|2
  kosulsuz-anahtar-kullanimi|anahtar-kullanimi-kosulsuz|anahtar-kullanimina-kosul|1|2
  kosulsuz-anahtar-cozme|anahtar-politikasinda-kosul-yok|anahtar-politikasina-kosul|1|2
  rol-zinciri|zincirli-rol-ustlenme|zincir-derinligi-siniri|1|3
  yedeklemeden-dagitima|yedekleme-rolune-dagitim|yedekleme-rolunden-dagitimi-al|1|2
  sablon-deposuna-yazma|sablon-deposu-yazmaya-acik|sablon-deposunu-salt-okur-yap|1|2
  dagitimdan-yeni-ornek|dagitim-rolu-ornek-baslatabiliyor|dagitim-rolunden-ornek-yetkisi|1|2
  yapilandirma-okuma|yapilandirma-kovasi-genis-okuma|kova-politikasini-daraltma|1|2
  gunluk-okuma|gunluk-kovasi-okumaya-acik|gunluk-kovasini-kapatma|1|2`)
  .map(([ad, kalem, denetim, once, sonra]) => ({ ad, kalem, denetim, once: +once, sonra: +sonra }));

export const KALEMLER = KALIP.map((k) => k.kalem);
export const BASLANGIC = "portal-hizmet-hesabi";

// Acik kalem kumesiyle yuruyus: ulasilan kalem ve yurunen kenarlar.
export function yuru(acik) {
  const varis = { [BASLANGIC]: 0 }, adim = [];
  for (;;) {
    let en = null;
    for (const e of KENAR) {
      if (!(e.k in varis) || e.h in varis) continue;
      if (e.y !== "-" && !acik.has(e.y)) continue;
      const t = varis[e.k] + e.d;
      if (en === null || t < en.t) en = { e, t };
    }
    if (en === null) return { kalem: Object.keys(varis).length, adim };
    varis[en.e.h] = en.t; adim.push(en.e);
  }
}

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

if (import.meta.url === `file://${process.argv[1]}`) {
  const tum = new Set(KALEMLER), tam = yuru(tum);
  console.log(`${KALIP.length} kalip, ${KENAR.length} kenar; hepsi acikken yaricap ` +
    `${tam.kalem}/28, yurunen adim ${tam.adim.length}`);
  const yz = gen([30, 21, 14, 12, 8]);
  console.log("\n" + yz(["kalip", "acilan adim", "kayit", "yaricap", "katki"]));
  const sirali = KALIP.map((p) => {
    const a = new Set(KALEMLER); a.delete(p.kalem);
    const kenar = KENAR.find((e) => e.y === p.kalem);
    return { ...p, tur: kenar.t, kayit: KAYIT[kenar.t], yaricap: yuru(a).kalem };
  }).sort((a, b) => a.yaricap - b.yaricap);
  for (const p of sirali)
    console.log(yz([p.ad, p.tur, p.kayit, `${tam.kalem} -> ${p.yaricap}`, tam.kalem - p.yaricap]));

  const gorunen = sirali.filter((p) => p.kayit === "yonetim").length;
  console.log(`\n${KALIP.length} kalibin ${gorunen} tanesi yonetim duzlemi kaydina dusen bir ` +
    `adimla acilir, ${sirali.filter((p) => p.kayit === "saglayicida").length} tanesi yalniz ` +
    `saglayicida duran bir adimla, ${sirali.filter((p) => p.kayit === "kayitsiz").length} tanesi ` +
    `hicbir kayda dusmeyen bir adimla`);
  const en = sirali[0];
  console.log(`en buyuk katkiyi ${en.ad} kalibi veriyor: tek basina ${en.yaricap} -> ` +
    `${tam.kalem}, yani ${tam.kalem - en.yaricap} kalem, ve acilan adim ${en.kayit} sinifinda`);
  console.log(`o kalibi kapatan denetim (${en.denetim}) gereken on kosulu ${en.once} -> ` +
    `${en.sonra} yapiyor: kimligi isteyen yazilimin ayrica oturum duzeyinde dogrulanmis olmasi ` +
    `gerekir`);
}
```

```
13 kalip, 23 kenar; hepsi acikken yaricap 23/28, yurunen adim 22

kalip                                   acilan adim         kayit     yaricap   katki
meta-veri-servisinden-kimlik     ornek-kimligi-alma      kayitsiz     23 -> 6      17
yatay-rol-gecisi                       rol-ustlenme       yonetim    23 -> 14       9
sir-deposuna-genis-erisim                 sir-okuma       yonetim    23 -> 17       6
sirdan-uzun-omurlu-kimlik                 sir-okuma       yonetim    23 -> 18       5
rol-zinciri                            rol-ustlenme       yonetim    23 -> 18       5
yedeklemeden-dagitima                  rol-ustlenme       yonetim    23 -> 20       3
is-yukunden-rol-ustlenme               rol-ustlenme       yonetim    23 -> 21       2
kosulsuz-anahtar-kullanimi            anahtar-cozme       yonetim    23 -> 21       2
kosulsuz-anahtar-cozme                anahtar-cozme       yonetim    23 -> 22       1
sablon-deposuna-yazma                   nesne-okuma   saglayicida    23 -> 22       1
dagitimdan-yeni-ornek             ornek-ici-calisma       ajansiz    23 -> 22       1
gunluk-okuma                            nesne-okuma   saglayicida    23 -> 22       1
yapilandirma-okuma                      nesne-okuma   saglayicida    23 -> 23       0

13 kalibin 8 tanesi yonetim duzlemi kaydina dusen bir adimla acilir, 3 tanesi yalniz saglayicida duran bir adimla, 1 tanesi hicbir kayda dusmeyen bir adimla
en buyuk katkiyi meta-veri-servisinden-kimlik kalibi veriyor: tek basina 6 -> 23, yani 17 kalem, ve acilan adim kayitsiz sinifinda
o kalibi kapatan denetim (oturum-basina-dogrulama) gereken on kosulu 1 -> 3 yapiyor: kimligi isteyen yazilimin ayrica oturum duzeyinde dogrulanmis olmasi gerekir
```

Tablo tek bir sıralamayla okunmalı: **katkı sütunu**. On üç kalıbın biri yarıçapı on yedi kalem
büyütüyor, biri dokuz, biri altı; kalan onunun toplamı bunların hiçbirine yaklaşmıyor. En alttaki
kalıp — yapılandırma kovasının geniş okumaya açık olması — yarıçapı hiç değiştirmiyor, çünkü o
kova zaten dağıtım rolünden meşru bir kenarla ulaşılabilir durumda. Kalıbın var olması onu bir risk
kalemi yapmıyor; onu ölçen şey, **kapatıldığında kaç kalem eksiliyor** sorusudur. Aynı ölçüt
listenin ortasını da ayırıyor: iki kalıp beşer kalem getiriyor ama farklı adım türlerinden
açıldıkları için tek bir denetimle birlikte kapanmıyorlar.

Kayıt sütunu ikinci bir sıralama veriyor ve birinciyle ters düşüyor. On üç kalıbın sekizi yönetim
düzlemi kaydına düşen bir adımla açılıyor: rol üstlenme, sır okuma, anahtar çözme. Üçü yalnız
sağlayıcıda duran bir adımla, biri hiç kayıt bırakmayan bir adımla, biri de kayıt ajanı bulunmayan
bir örnekte. Kayda düşen sekiz kalıbın toplam katkısı otuz üç kalemdir; kayda düşmeyen tek
kalıbın katkısı on yedidir.

#### Kaydın Görmediği Kalıp

O tek kalıp adıyla anlatılmalıdır, çünkü hem en büyük katkıyı veriyor hem de hiçbir kayda
düşmüyor: **örneğe bağlı kimliğin örnek meta veri servisinden alınması.**

Kalıbın açtığı yol tek bir tasarım kararından doğar. Bir örneğe kimlik verildiğinde, o kimliği
isteyen yazılımın **kim olduğu** değil, **nerede koştuğu** sorulur. Kimlik, örnek üzerinde
çalışıyor olmanın karşılığıdır. Bunun sonucu şudur: örneğin üzerine ilgisiz bir kusurla ulaşmış
herhangi bir yazılım da, o örnekte meşru olarak koşan uygulama kadar kimlik sahibidir. Bir web
katmanındaki hata, bir bağımlılıktan gelen kod ya da bir hata ayıklama aracı — hepsi aynı kimliği
ister ve alır. Grafikte bu, yürüyüşün üçüncü adımıdır ve tek başına on yedi kalem kazandırır.

İkinci sonuç tespit tarafındadır. Kimliğin verilmesi kiracının hesabında bir yönetim düzlemi
çağrısı değildir; örneğin kendi içinde geçer. Kiracının okuyabildiği hiçbir kayda düşmez. Yarıçabı
en çok büyüten adım, aynı zamanda kayıtta hiç görünmeyen adımdır — birinci dersteki kör önek tam
olarak bu adımdan doğuyordu.

Kapatan denetim, kimliği veren tarafın soruyu değiştirmesidir: kimlik, oturum düzeyinde
doğrulanmış bir isteyene verilir. Modelde bu, kalıbın ön koşulunu birden üçe çıkarır — örnek
üzerinde kod çalıştırmak artık yetmez, isteyen yazılımın başlatılırken kendisine verilmiş bir
oturum kanıtını da taşıması gerekir. Sonradan örneğe ulaşan yazılımda bu kanıt yoktur.

#### Denetim Sırası

Katkı sütunu tek başına bir sıra vermez, çünkü denetimlerin bedeli eşit değildir. Aşağıdaki dosya
aynı on üç denetimi iki ayrı ölçütle sıraya koyar ve her adımda yarıçapı yeniden koşturur:
birincisi her adımda birim bedel başına en çok kalem indireni seçer, ikincisi yalnızca en ucuz
olanı. İkinci ölçüt uydurma bir karşılaştırma değildir; kısıtlı bir bütçeyle çalışan bir ekibin
doğal sırasıdır — önce kimseyi durdurmayan kalemler kapatılır.

```js
// oncelik.mjs — denetimlerin hangi sirayla kapatildigi yaricapin ne kadar hizli dustugunu
// belirler. MODELDIR.
import { KALIP, KALEMLER, yuru } from "./kalip.mjs";

// Denetimin durdurdugu mesru is sayisi (kurgu birim, MODEL girdisi).
const BEDEL = Object.fromEntries(`
  oturum-basina-dogrulama|2          sir-erisimini-kapsamla-sinirla|1
  sirda-yalniz-kisa-omurlu-kimlik|2  is-yuku-kimligini-roldan-ayir|1
  kimlige-gore-rol-daraltma|2        anahtar-kullanimina-kosul|1
  anahtar-politikasina-kosul|1       zincir-derinligi-siniri|3
  yedekleme-rolunden-dagitimi-al|1   sablon-deposunu-salt-okur-yap|2
  dagitim-rolunden-ornek-yetkisi|1   kova-politikasini-daraltma|1
  gunluk-kovasini-kapatma|1`.trim().replace(/\s{2,}/g, "\n").split("\n")
  .map((l) => { const [a, b] = l.trim().split("|"); return [a, +b]; }));

const yaricap = (kapali) => yuru(new Set(KALEMLER.filter((y) =>
  !KALIP.some((p) => p.kalem === y && kapali.has(p.denetim))))).kalem;

// Iki siralama: "birim" her adimda bedel basina en cok kalem indireni secer,
// "ucuz" ise yalnizca en ucuz denetimi secer.
function sirala(olcut) {
  const kapali = new Set(), sira = [];
  let simdi = yaricap(kapali), bedel = 0;
  while (kapali.size < KALIP.length) {
    let en = null;
    for (const p of KALIP) {
      if (kapali.has(p.denetim)) continue;
      const dus = simdi - yaricap(new Set([...kapali, p.denetim]));
      const puan = olcut === "birim" ? dus / BEDEL[p.denetim] : -BEDEL[p.denetim];
      if (en === null || puan > en.puan) en = { p, dus, puan };
    }
    kapali.add(en.p.denetim); bedel += BEDEL[en.p.denetim]; simdi -= en.dus;
    sira.push({ denetim: en.p.denetim, dus: en.dus, bedel, yaricap: simdi });
  }
  return sira;
}

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

const A = sirala("birim"), B = sirala("ucuz");
console.log(yz(["adim", "birim faydaya gore", "yaricap", "bedel", "en ucuzdan baslayarak",
  "yaricap", "bedel"]));
for (const i of [0, 1, 2, 3, 6, 9, 12])
  console.log(yz([i + 1, A[i].denetim, `${A[i].yaricap}/28`, A[i].bedel,
    B[i].denetim, `${B[i].yaricap}/28`, B[i].bedel]));

const ilk = (s, y) => s.findIndex((x) => x.yaricap <= y);
console.log(`\nyaricapi 10'un altina indirmek: birim faydaya gore ${ilk(A, 10) + 1} denetim ve ` +
  `${A[ilk(A, 10)].bedel} bedel; en ucuzdan baslayarak ${ilk(B, 10) + 1} denetim ve ` +
  `${B[ilk(B, 10)].bedel} bedel`);
console.log(`ilk denetim tek basina yaricapi 23 -> ${A[0].yaricap} indiriyor ve ` +
  `${A[0].bedel} bedel istiyor; kalan ${KALIP.length - 1} denetim ` +
  `${A.at(-1).bedel - A[0].bedel} bedelle ${A[0].yaricap - A.at(-1).yaricap} kalem indiriyor`);
const sifir = A.filter((s) => s.dus === 0);
console.log(`${sifir.length} denetim hicbir kalem indirmiyor ve toplam ` +
  `${sifir.reduce((t, s) => t + BEDEL[s.denetim], 0)} bedel istiyor; on ucunun tamami ` +
  `kapatildiginda yaricap ${A.at(-1).yaricap}/28 ve toplam bedel ${A.at(-1).bedel}`);
```

```
adim                birim faydaya gore  yaricap   bedel           en ucuzdan baslayarak  yaricap   bedel
1              oturum-basina-dogrulama     6/28       2  sir-erisimini-kapsamla-sinirla    17/28       1
2           kova-politikasini-daraltma     5/28       3   is-yuku-kimligini-roldan-ayir    17/28       2
3              gunluk-kovasini-kapatma     4/28       4       anahtar-kullanimina-kosul    15/28       3
4       sir-erisimini-kapsamla-sinirla     4/28       5      anahtar-politikasina-kosul    15/28       4
7            kimlige-gore-rol-daraltma     4/28      10      kova-politikasini-daraltma    11/28       7
10             zincir-derinligi-siniri     4/28      15 sirda-yalniz-kisa-omurlu-kimlik     4/28      12
13      dagitim-rolunden-ornek-yetkisi     4/28      19         zincir-derinligi-siniri     4/28      19

yaricapi 10'un altina indirmek: birim faydaya gore 1 denetim ve 2 bedel; en ucuzdan baslayarak 8 denetim ve 8 bedel
ilk denetim tek basina yaricapi 23 -> 6 indiriyor ve 2 bedel istiyor; kalan 12 denetim 17 bedelle 2 kalem indiriyor
10 denetim hicbir kalem indirmiyor ve toplam 15 bedel istiyor; on ucunun tamami kapatildiginda yaricap 4/28 ve toplam bedel 19
```

#### Sıralamanın Bedeli

İki sütun aynı on üç denetimi aynı grafiğe uyguluyor ve aynı yere varıyor: on üçünün tamamı
kapatıldığında yarıçap 4, toplam bedel 19. Fark yolda. Birim faydaya göre sıralamada **ilk
denetim** yarıçapı 23'ten 6'ya indiriyor ve iki bedel istiyor; kalan on iki denetim on yedi bedel
harcayıp yalnızca iki kalem daha indiriyor. En ucuzdan başlayan sıralamada aynı yarıçap sekiz
denetim ve sekiz bedel sonra geliyor.

Buradan iki cümle çıkıyor. Birincisi: **denetim sayısı bir ölçü değildir.** İkinci sütunun dördüncü
adımında dört denetim kapatılmış ve yarıçap hâlâ 15'tir; birinci sütunun birinci adımında bir
denetim kapatılmış ve yarıçap 6'dır. "Kaç denetim uygulandı" sorusu, "yarıçap kaça indi" sorusunun
yerine geçemez. İkincisi: on üç denetimin onu bu grafikte hiçbir kalem indirmiyor ve toplam on beş
bedel istiyor. Bunların hepsi tek tek savunulabilir kalemlerdir — anahtar politikasına koşul
eklemek, şablon deposunu salt okunur yapmak, zincir derinliğini sınırlamak — ama **bu grafikte**
katkıları sıfırdır, çünkü kapattıkları kenarların hedefine başka bir kenardan da ulaşılıyor.

Bu, o denetimlerin gereksiz olduğu anlamına gelmez; ölçünün grafiğe bağlı olduğu anlamına gelir.
Grafik değiştiğinde — bir kenar meşrulaştığında, bir kalem eklendiğinde — sıfır katkılı denetim
birdenbire en yüksek katkılı olabilir. Bu yüzden sıralama bir kez yapılıp bırakılmaz; her
yapılandırma değişikliğinde yeniden koşturulur.

#### Özet

- On üç kalıp aynı grafikte kalem, açılan adım, kayıt sınıfı ve kapatan denetim dörtlüsüyle
  yazıldı; katkılar 17, 9, 6, 5, 5 ile başlayıp sıfıra iniyor.
- Kalıpların sekizi yönetim düzlemi kaydına düşen bir adımla açılıyor, üçü yalnız sağlayıcıda duran
  bir adımla, biri hiçbir kayda düşmeyen bir adımla, biri ajansız bir örnekte.
- En büyük katkıyı veren kalıp — örneğe bağlı kimliğin nerede koşulduğuna bakılarak verilmesi — tek
  başına on yedi kalem getiriyor ve kayıtsız sınıfta; kayıtta hiç görünmüyor.
- O kalıbı kapatan denetim soruyu değiştirir: kimlik, oturum düzeyinde doğrulanmış bir isteyene
  verilir ve kalıbın ön koşulu birden üçe çıkar.
- Bir kalıp yarıçapı hiç değiştirmiyor, çünkü hedefine meşru bir kenardan da ulaşılıyor; on üç
  denetimin onu bu grafikte sıfır kalem indiriyor ve on beş bedel istiyor.
- Sıralama bedeli belirliyor: birim faydaya göre bir denetim ve iki bedel, en ucuzdan başlayarak
  sekiz denetim ve sekiz bedel aynı yarıçapı veriyor.

#### Sonraki Adım

Kalıplar sayıldı, kayıtları sınıflandı ve kapatan denetimler sıraya kondu. Geriye bir soru
kalıyor: bu kalıplardan biri **gerçekten işlediğinde** ne toplanabiliyor. Önceki derslerde kanıtın
bir bölümünün toplanamadığı görüldü; sonraki ders bunu konak imajıyla karşılaştırarak sayar —
konakta toplanabilen kaç kalem bulutta toplanamıyor, yalıtım hangi düzlemden yapılıyor ve anlık
görüntünün kanıt değeri nedir.

### Olay Müdahalesinde Bulut Farkları

Source: https://academia.sh/tr/kurslar/bulut-guvenligi/olay-mudahalesinde-bulut-farklari

Bulutta kanıt toplamanın konak imajından farkının sayılması: 20 kanıt kaleminin 16'sı kendi yönettiğin konakta toplanabiliyor, bunların 4'ü yönetilen örnekte, 11'i konteyner servisinde, 14'ü işlev ortamında toplanamıyor. Yalıtım dört düzlemden yapılabiliyor: kimlik düzlemi 11. dakikada kesip yarıçapı 13'te durduruyor ve uçucu kanıtın beşini de koruyor, örneği sonlandırmak aynı yarıçapı beş uçucu kalemin tamamını silerek veriyor. Anlık görüntü 16 kalemin 10'unu taşıyor ve hepsinin doğrulaması sağlayıcı beyanına dayanıyor.

Önceki ders kalıpları sayıp kapatan denetimleri sıraya koydu. Geriye tek soru kaldı: bu
kalıplardan biri gerçekten işlediğinde ne toplanabiliyor. Olay müdahalesinin yaşam döngüsü,
delil bütünlüğü, gözetim zinciri ve yazma korumalı kopyalama **Güvenlik Operasyonları ve Olay
Müdahalesi** kursunda ölçüldü; müdahale adımları burada tekrarlanmaz. Bu dersin ölçtüğü tek şey
**farktır**: kendi yönettiğin bir konakta toplanabilen kaç kalem kiralanmış altyapıda
toplanamıyor, yalıtım hangi düzlemden yapılıyor ve anlık görüntünün kanıt değeri nedir.

Ölçüm **bölgesel ölçüm ağı** üzerindedir, **kurgudur** ve `node` ile yazılmış bir **modeldir**.

**BT31.** Yirmi kanıt kalemi dört sütunda işaretlenir: kendi yönettiğin konak, yönetilen örnek,
yönetilen konteyner servisi, işlev çalıştırma ortamı.
**BT32.** İşaret üç değerlidir: kiracı doğrudan toplar, ancak sağlayıcı isteğiyle gelir,
toplanamaz.
**BT33.** Her kalem için doğrulamayı kimin yapabildiği yazılıdır: kiracı, sağlayıcı beyanı ya da
hiçbiri.
**BT34.** Beş kalem **uçucudur**: iş yükü sonlandığında kaybolur. Anlık görüntü uçucu sınıfı ve
silinmiş dosya artıklarını taşımaz.
**BT35.** Yalıtım dört düzlemden yapılabilir; her düzlemin uygulama süresi, kestiği kenar sınıfı ve
durdurduğu meşru iş sayısı modelde yazılıdır (kurgu). Uyarının düştüğü an birinci dersten alınan
9. dakikadır.

#### Konakta Toplanan, Bulutta Toplanamayan

```js
// kanit.mjs — konakta toplanabilen kanit kalemlerinin bulutta toplanabilirligi. MODELDIR.
// Kanit kalemlerinin kendisi ve gozetim zinciri Guvenlik Operasyonlari ve Olay Mudahalesi
// kursunda olculdu; burada yalnizca KONAK ile BULUT arasindaki fark sayilir.
const bol = (s) => s.trim().split("\n").map((l) => l.trim().split("|"));

// Kalem: ad|konak|yonetilen ornek|konteyner servisi|islev ortami|dogrulamayi kim yapabilir
// 1 = kiraci dogrudan toplar, 2 = ancak saglayici istegiyle gelir, 0 = toplanamaz
export const KALEM = bol(`
  tam-disk-imaji|1|2|0|0|saglayici
  bellek-dokumu|1|0|0|0|-
  silinmis-dosya-artiklari|1|0|0|0|-
  donanim-katmani-kaydi|1|0|0|0|-
  hipervizor-kaydi|1|0|0|0|-
  dosya-sistemi-zaman-damgalari|1|2|0|0|saglayici
  surec-listesi|1|1|1|0|kiraci
  acik-ag-baglantilari|1|1|1|0|kiraci
  yuklu-cekirdek-modulleri|1|1|0|0|kiraci
  kabuk-gecmisi|1|1|0|0|kiraci
  zamanlanmis-gorevler|1|1|0|0|kiraci
  yerel-kullanici-hesaplari|1|1|0|0|kiraci
  onbellek-ve-gecici-dosyalar|1|1|0|0|kiraci
  sistem-gunlukleri|1|1|1|0|kiraci
  uygulama-gunlukleri|1|1|1|1|kiraci
  ag-akis-kaydi|1|1|1|1|saglayici
  yonetim-duzlemi-kaydi|0|1|1|1|saglayici
  cagri-ust-verisi|0|1|1|1|saglayici
  anlik-goruntu-ust-verisi|0|1|1|0|saglayici
  goruntu-kimlik-dogrulamasi|0|1|1|1|saglayici`)
  .map(([ad, k, o, c, i, d]) => ({ ad, konak: +k, ornek: +o, kap: +c, islev: +i, dogrulama: d }));

const BICIM = [["yonetilen ornek", "ornek"], ["konteyner servisi", "kap"],
  ["islev ortami", "islev"]];

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

// Ucucu kalemler: is yuku sonlandiginda kaybolur. Anlik goruntu disk sinifini tasir.
export const UCUCU = ["bellek-dokumu", "surec-listesi", "acik-ag-baglantilari",
  "yuklu-cekirdek-modulleri", "onbellek-ve-gecici-dosyalar"];
export const ANLIK_DISI = [...UCUCU, "silinmis-dosya-artiklari"];

const konakta = KALEM.filter((k) => k.konak === 1);

if (import.meta.url === `file://${process.argv[1]}`) {
  const yz = gen([24, 11, 14, 15, 17, 16]);
  console.log(`${KALEM.length} kanit kalemi; kendi yonettigin konakta toplanabilen ` +
    `${konakta.length}, konakta hic olmayan ${KALEM.length - konakta.length}`);
  console.log("\n" + yz(["dagitim bicimi", "dogrudan", "saglayicidan", "toplanamayan",
    "konaktan eksik", "buluttan gelen"]));
  for (const [ad, alan] of BICIM) {
    const dogrudan = KALEM.filter((k) => k[alan] === 1).length;
    const saglayici = KALEM.filter((k) => k[alan] === 2).length;
    const eksik = konakta.filter((k) => k[alan] === 0).length;
    const yeni = KALEM.filter((k) => k.konak === 0 && k[alan] >= 1).length;
    console.log(yz([ad, dogrudan, saglayici, KALEM.length - dogrudan - saglayici, eksik, yeni]));
  }

  const D = ["kiraci", "saglayici", "-"];
  console.log("\n" + yz(["dogrulamayi yapan", "kalem", "konakta", "ornekte", "kapta", "islevde"]));
  for (const d of D) {
    const g = KALEM.filter((k) => k.dogrulama === d);
    console.log(yz([d === "-" ? "hicbiri" : d, g.length, g.filter((k) => k.konak === 1).length,
      g.filter((k) => k.ornek >= 1).length, g.filter((k) => k.kap >= 1).length,
      g.filter((k) => k.islev >= 1).length]));
  }

  const kiraciDog = KALEM.filter((k) => k.dogrulama === "kiraci");
  console.log(`\nkonakta toplanabilen ${konakta.length} kalemin ` +
    `${konakta.filter((k) => k.ornek === 0).length} tanesi yonetilen ornekte, ` +
    `${konakta.filter((k) => k.kap === 0).length} tanesi konteyner servisinde, ` +
    `${konakta.filter((k) => k.islev === 0).length} tanesi islev ortaminda toplanamiyor`);
  console.log(`bulut karsiliginda ${KALEM.filter((k) => k.konak === 0).length} kalem veriyor: ` +
    `bunlarin hepsinin dogrulamasi saglayici beyanina dayaniyor`);
  console.log(`kiracinin kendi dogrulayabildigi ${kiraciDog.length} kalemin ` +
    `${kiraciDog.filter((k) => k.islev >= 1).length} tanesi islev ortaminda kaliyor; ` +
    `geri kalan her sey icin dogrulama saglayici beyanidir`);
}
```

```
20 kanit kalemi; kendi yonettigin konakta toplanabilen 16, konakta hic olmayan 4

dagitim bicimi             dogrudan  saglayicidan   toplanamayan   konaktan eksik  buluttan gelen
yonetilen ornek                  14             2              4                4               4
konteyner servisi                 9             0             11               11               4
islev ortami                      5             0             15               14               3

dogrulamayi yapan             kalem       konakta        ornekte            kapta         islevde
kiraci                            9             9              9                4               1
saglayici                         7             3              7                5               4
hicbiri                           4             4              0                0               0

konakta toplanabilen 16 kalemin 4 tanesi yonetilen ornekte, 11 tanesi konteyner servisinde, 14 tanesi islev ortaminda toplanamiyor
bulut karsiliginda 4 kalem veriyor: bunlarin hepsinin dogrulamasi saglayici beyanina dayaniyor
kiracinin kendi dogrulayabildigi 9 kalemin 1 tanesi islev ortaminda kaliyor; geri kalan her sey icin dogrulama saglayici beyanidir
```

Yirmi kalemin on altısı kendi yönettiğin bir konakta toplanabiliyor. Yönetilen bir örnekte bu
sayının dördü düşüyor ve düşenler rastgele değil: bellek dökümü, silinmiş dosya artıkları, donanım
katmanı kaydı, hipervizör kaydı. Dördü de **konağın altındaki katmandan** gelir ve o katman
kiracıya ait değildir. Konteyner servisinde on bir kalem, işlev çalıştırma ortamında on dört kalem
toplanamaz hale gelir; işlev ortamında geriye kalan beş kalemin dördü sağlayıcının kendi
kayıtlarıdır.

Fatura tek yönlü değil. Bulut, konakta hiç bulunmayan dört kalem veriyor: yönetim düzlemi kaydı,
çağrı üst verisi, anlık görüntü üst verisi ve görüntünün kimlik doğrulaması. Bunlar gerçek kanıt
kalemleridir ve kendi yönettiğin bir konakta karşılıkları yoktur. Ama dördünün de doğrulaması
**sağlayıcı beyanına** dayanır: kiracı bu kayıtların üretildiği düzleme erişemez, dolayısıyla
içeriklerini bağımsız olarak yeniden hesaplayamaz.

Alt tablo bu ayrımı sayıya çeviriyor. Kiracının kendi doğrulayabildiği dokuz kalem vardır ve
dokuzu da konakta bulunur; yönetilen örnekte dokuzu da kalır, konteyner servisinde dörde, işlev
ortamında **bire** iner. Kanıtın azalması ile doğrulanabilirliğin azalması aynı yönde ilerliyor ve
işlev ortamında ikisi birden dibe vuruyor.

#### Yalıtım Hangi Düzlemden

```js
// mudahale.mjs — yalitim hangi duzlemden yapilirsa yaricap nerede duruyor ve kac ucucu kanit
// kalemi kayboluyor. MODELDIR. Mudahale yasam dongusu onceki kursta olculdu; burada yalnizca
// duzlem secimi sayilir.
import { KALEM, UCUCU, ANLIK_DISI } from "./kanit.mjs";

const bol = (s) => s.trim().split("\n").map((l) => l.trim().split("|"));
const KENAR = bol(`
  portal-hizmet-hesabi|portal-ornegi|ag|3
  portal-hizmet-hesabi|okuma-rolu|yonetim|4
  portal-ornegi|portal-ornek-kimligi|ornek-ici|2
  portal-ornek-kimligi|abone-veritabani|ag|6
  portal-ornek-kimligi|sir-deposu|yonetim|4
  sir-deposu|toplama-is-yuku-kimligi|yonetim|3
  toplama-is-yuku-kimligi|sayac-ham-kova|ag|5
  toplama-is-yuku-kimligi|olcum-kuyrugu|ag|4
  toplama-is-yuku-kimligi|izleme-rolu|yonetim|4
  izleme-rolu|olcum-panosu|yonetim|3
  portal-ornek-kimligi|fatura-toplu-is-rolu|yonetim|3
  fatura-toplu-is-rolu|fatura-arsiv-kovasi|ag|6
  fatura-toplu-is-rolu|anahtar-yonetimi|yonetim|4
  anahtar-yonetimi|musteri-anahtari|yonetim|2
  fatura-toplu-is-rolu|yedekleme-rolu|yonetim|3
  yedekleme-rolu|yedek-kovasi|ag|7
  yedekleme-rolu|dagitim-rolu|yonetim|4
  dagitim-rolu|sablon-deposu|ag|5
  dagitim-rolu|yapilandirma-kovasi|ag|4
  dagitim-rolu|is-yuku-ornegi|ornek-ici|9
  okuma-rolu|rapor-kovasi|ag|4
  okuma-rolu|gunluk-kovasi|ag|5
  okuma-rolu|yapilandirma-kovasi|ag|6`).map(([k, h, d, s]) => ({ k, h, d, s: +s }));

const UYARI = 9;   // birinci derste olculen ilk gorunur kayit ani (dk)

// Yalitim duzlemi: ad|uygulama suresi (dk)|kestigi kenar duzlemleri|ucucu kanit korunuyor mu|
// durdurulan mesru is (kurgu birim)
const DUZLEM = bol(`
  yalitim yok|0|-|1|0
  ag duzlemi|6|ag|1|4
  kimlik duzlemi|2|yonetim ornek-ici|1|3
  ornek duzlemi|3|ag yonetim ornek-ici|0|2
  hesap duzlemi|45|ag yonetim ornek-ici|1|8`)
  .map(([ad, u, kes, ucucu, is]) => ({ ad, u: +u, kes: kes.split(" "), ucucu: +ucucu, is: +is }));

// Kesme aninda, kesilen duzlemlerdeki kenarlar artik yurunemez.
function yuru(d) {
  const kesme = d.u === 0 ? Infinity : UYARI + d.u;
  const varis = { "portal-hizmet-hesabi": 0 };
  for (;;) {
    let en = null;
    for (const e of KENAR) {
      if (!(e.k in varis) || e.h in varis) continue;
      const t = varis[e.k] + e.s;
      if (t > kesme && d.kes.includes(e.d)) continue;
      if (en === null || t < en.t) en = { e, t };
    }
    if (en === null) return { kalem: Object.keys(varis).length, kesme };
    varis[en.e.h] = en.t;
  }
}

const gen = (B) => (h) => h.map((v, j) => j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))
  .join("");
const yz = gen([18, 12, 12, 10, 17, 16]);

console.log(yz(["duzlem", "uygulama", "kesme ani", "yaricap", "kaybolan ucucu", "duran mesru is"]));
for (const d of DUZLEM) {
  const r = yuru(d);
  console.log(yz([d.ad, d.u ? `${d.u} dk` : "-", r.kesme === Infinity ? "-" : `${r.kesme}. dk`,
    `${r.kalem}/28`, d.ucucu ? `0/${UCUCU.length}` : `${UCUCU.length}/${UCUCU.length}`, d.is]));
}

const kimlik = yuru(DUZLEM[2]), ornek = yuru(DUZLEM[3]), hesap = yuru(DUZLEM[4]);
console.log(`\nen hizli duzlem kimliktir: ${kimlik.kesme}. dakikada kesiyor ve yaricapi ` +
  `${kimlik.kalem}/28 ile durduruyor; ucucu kanitin ${UCUCU.length}'i de yerinde kalir`);
console.log(`ornegi sonlandirmak yaricapi ${ornek.kalem}/28 yapiyor ama ${UCUCU.length} ucucu ` +
  `kalemin hepsini siliyor; hesap dondurma ${hesap.kesme}. dakikada geliyor ve yaricap ` +
  `${hesap.kalem}/28 oluyor`);

// Anlik goruntunun kanit degeri: hangi kalemleri tasiyor, kacini kiraci dogrulayabiliyor.
const tasinan = KALEM.filter((k) => k.konak === 1 && !ANLIK_DISI.includes(k.ad));
console.log(`anlik goruntu konakta toplanabilen ${KALEM.filter((k) => k.konak === 1).length} ` +
  `kalemin ${tasinan.length} tanesini tasiyor, ${ANLIK_DISI.length} tanesini tasimiyor; ` +
  `tasidiklarinin ${tasinan.filter((k) => k.dogrulama === "kiraci").length} tanesinin icerigi ` +
  `kiraci tarafindan okunur`);
console.log(`kaynagin karmasi yeniden hesaplanamaz: ham cihaza cevrimdisi erisim yoktur, bu ` +
  `yuzden goruntunun kaynakla ayni oldugu ${tasinan.length} kalemin hepsinde saglayici beyanina ` +
  `dayanir`);
```

```
duzlem                uygulama   kesme ani   yaricap   kaybolan ucucu  duran mesru is
yalitim yok                  -           -     23/28              0/5               0
ag duzlemi                6 dk      15. dk     19/28              0/5               4
kimlik duzlemi            2 dk      11. dk     13/28              0/5               3
ornek duzlemi             3 dk      12. dk     13/28              5/5               2
hesap duzlemi            45 dk      54. dk     23/28              0/5               8

en hizli duzlem kimliktir: 11. dakikada kesiyor ve yaricapi 13/28 ile durduruyor; ucucu kanitin 5'i de yerinde kalir
ornegi sonlandirmak yaricapi 13/28 yapiyor ama 5 ucucu kalemin hepsini siliyor; hesap dondurma 54. dakikada geliyor ve yaricap 23/28 oluyor
anlik goruntu konakta toplanabilen 16 kalemin 10 tanesini tasiyor, 6 tanesini tasimiyor; tasidiklarinin 5 tanesinin icerigi kiraci tarafindan okunur
kaynagin karmasi yeniden hesaplanamaz: ham cihaza cevrimdisi erisim yoktur, bu yuzden goruntunun kaynakla ayni oldugu 10 kalemin hepsinde saglayici beyanina dayanir
```

Tablo dört düzlemi aynı zaman çizelgesinde koşturuyor. Uyarı 9. dakikada düşüyor ve yürüyüş 24.
dakikada bitiyor; aradaki on beş dakika kararın verilebileceği tüm süredir. Ağ düzlemi altı
dakikada uygulanıyor, 15. dakikada kesiyor ve yarıçapı 19'da durduruyor — çünkü yönetim düzlemi
çağrıları ağdan geçmez, kimlik hâlâ geçerlidir. Kimlik düzlemi iki dakikada uygulanıyor, 11.
dakikada kesiyor ve yarıçapı **13**'te durduruyor: en iyi sonuç, en düşük ikinci bedel.

Örnek düzlemi de aynı yarıçapı veriyor, 13. Aradaki fark kanıt sütunundadır: örneği sonlandırmak
beş uçucu kalemin **beşini birden** siler. Aynı yarıçap, beş kalem daha az kanıt. Bu, dersin
merkezindeki değiş tokuştur ve kararı basitleştiren şeydir — iki seçenek aynı şeyi durduruyorsa
kanıtı koruyan seçilir.

Hesap düzlemi son satırdadır ve kırk beş dakikalık onay süresi yüzünden 54. dakikada geliyor.
Yürüyüş 24. dakikada bittiği için hiçbir şeyi kesmiyor: yarıçap 23'te kalıyor ve sekiz meşru işin
tamamı duruyor. En geniş yetki, en yüksek bedel, sıfır etki.

#### Anlık Görüntünün Kanıt Değeri

Anlık görüntü, konakta toplanabilen on altı kalemin onunu taşıyor ve altısını taşımıyor: beş uçucu
kalem ile silinmiş dosya artıkları. Taşıdığı onun beşinin içeriği kiracı tarafından okunabilir.

Asıl sınır doğrulama tarafındadır. Bir kopyanın kanıt değeri, kaynağın karmasının yeniden
hesaplanabilmesine dayanır. Kiralanan altyapıda kiracı ham cihaza çevrimdışı erişemez;
dolayısıyla görüntünün kaynakla aynı olduğu, on kalemin hepsinde **sağlayıcı beyanıdır.** Anlık
görüntü kanıt üretmez, kanıt taşır; ürettiği güven sağlayıcının imzasından gelir. Bu, görüntüyü
değersiz yapmaz — konakta toplanabilen kalemlerin çoğunu koruyan tek düzenektir ve örnek
sonlandırılmadan alınırsa uçucu sınıfı da yerinde bırakır. Yapması gereken tek şey sınırını
söylemektir: kaydın hangi düzlemde tutulduğu ve doğrulamanın kime dayandığı soruşturma raporunda
yazılır, çünkü karşı taraf bunu soracaktır.

#### Özet

- Yirmi kanıt kaleminin on altısı kendi yönettiğin konakta toplanabiliyor; yönetilen örnekte
  dördü, konteyner servisinde on biri, işlev ortamında on dördü toplanamıyor.
- Yönetilen örnekte düşen dört kalem konağın altındaki katmandandır: bellek dökümü, silinmiş dosya
  artıkları, donanım katmanı kaydı, hipervizör kaydı.
- Bulut konakta bulunmayan dört kalem verir, ama dördünün de doğrulaması sağlayıcı beyanına
  dayanır; kiracının kendi doğrulayabildiği dokuz kalem işlev ortamında bire iner.
- Kimlik düzleminden yalıtım 11. dakikada kesip yarıçapı 13'te durdurur ve beş uçucu kalemin
  beşini de korur; örneği sonlandırmak aynı yarıçapı verir ve beşini birden siler.
- Hesap düzlemi kırk beş dakikalık onayla 54. dakikada gelir; yürüyüş 24. dakikada bittiği için
  yarıçap 23'te kalır ve sekiz meşru işin tamamı durur.
- Anlık görüntü on altı kalemin onunu taşır, altısını taşımaz; kaynağın karması yeniden
  hesaplanamadığı için taşıdıklarının hepsinde doğrulama sağlayıcı beyanıdır.

#### Kurs Kapanışı

| Ders | Tek yanlış kalem | Yayılma yarıçapı | Denetimin indirdiği |
|---|---|---|---|
| Hizmet modelleri | sahipsiz kalem | 14 kalem liste dışı | 0 kalem, 28 birim kör |
| Kimlik ve erişim | sızan hizmet hesabı | 9/18 kalem | 4'e, günde 4 iş |
| Ağ yalıtımı | dış erişime açık uç | dışarıdan 6/9 | 4'e, günde 0 iş |
| Depolama maruziyeti | açık yapılandırma kalemi | 10 kalem | 5'e, günde 9 erişim |
| Anahtar ve sır yönetimi | zincirdeki anahtar izni | 16 kalem | 6'ya, günde 1 işlem |
| Kod olarak altyapı | şablondaki yanlış alan | 34 birim yarıçap payı | 11 birime, 3 dağıtım durur |
| Denetim günlükleri | sızan hizmet hesabı | 23/28 kalem | 18'e, 3 meşru iş |
| Duruş yönetimi | koşarken doğan sapma | 23/28, 153 saat açık | 6'ya, 2 saate |
| Konteyner ve hipervizör | bölme sınırının düşmesi | en kötü 18/28 | 0 çapraz, ortalama 8,5 |
| Sunucusuz güvenlik | uzun ömürlü belirteç | 7.200.000 kalem-saniye | 3.514'e, 2.049 kat |
| Bulut saldırı kalıpları | oturumsuz örnek kimliği | 23/28 kalem | 6'ya, 2 bedel |
| Bulutta müdahale | yalıtım düzlemi seçilmemiş | 23/28 kalem | 13'e, 3 meşru iş |

Tablo kursun kuralını tek satırda okunur kılıyor: **bulutta güvenliğin ölçüsü kaç denetim açık
olduğu değil, tek bir yanlış kalemden kaç kaleme ulaşıldığıdır.** O sayı düşmüyorsa eklenen denetim
yalnızca görünürlük sağlamıştır. Kurs boyunca bunun üç örneği çıktı: kayıt açmak görünen adımı on
birden on dokuza çıkardı ve yarıçapı 23'te bıraktı; kabul kapısı iki kalem daha kapattı ve yarıçapı
sekizde bıraktı; konuk sistem yalıtımı sınırı geçmek için gereken kalemi birden üçe çıkardı ve
yarıçapı on sekizde bıraktı. Üçü de yararlıdır, üçü de bedellidir, üçü de bu ölçüde sıfırdır.

Dokuz kurs boyunca her savunmanın kapattığı yol ve o kapatmanın meşru işe bedeli sayıldı. Bir soru
hiç sorulmadı: bunların hangisi **önce** yapılacak. Bu kursun son iki dersi soruya ilk kez dokundu —
on üç denetimden biri iki bedelle on yedi kalem indiriyor, on tanesi on beş bedelle sıfır — ama
sıralamayı yapan ölçüt tek bir grafikten geliyordu. Gerçek bir kurumda kıt olan yalnız bütçe
değildir: dikkat, onay penceresi ve değişiklik kapasitesi de kıttır. **M24/K10 Yönetişim, Risk ve
Uyumluluk** bu üç soruyu ele alır: hangi savunma önce yapılacak, kıt bütçe nasıl dağıtılacak ve
yapıldığı kime nasıl kanıtlanacak.

