---
title: 'Ağ Bölütleme ve Servis Sıfır Güveni'
source: 'https://academia.sh/tr/kurslar/calisma-zamani-guvenligi/ag-bolutleme-ve-servis-sifir-guveni'
course: 'Çalışma Zamanı Güvenliği ve Sır Yönetimi'
language: tr
updated: '2026-08-17T18:06:41+00:00'
license: 'CC BY-SA 4.0'
---

# Ağ Bölütleme ve Servis Sıfır Güveni

Yanal hareket servis çifti cinsinden sayılır: dokuz servisin 72 yönlü çiftinden 52'si ağ politikasından geçiyor, yalnız 17'si bir meşru çağrıya karşılık geliyor. Tek yönlü taşıma doğrulaması ve izin listesiz karşılıklı doğrulama sıfır çift kapatıyor; çağıran başına izin listesi 35 çift kapatıyor ve ortalama erişimi 7,1'den 4,1'e indiriyor, ama kenar servisten dokuzun dokuzu hâlâ erişilebilir ve sır deposu en fazla iki sıçrama uzakta. Bedeli 31 sertifika, kısa ömürde yılda 11.315 yenileme ve servis başına düşen 3,8 meşru çift.

Önceki konu sırların ömrünü kısalttı ve sızıntı sonrası iptal akışını yazdı. Bütün o ölçüm tek bir
varsayıma yaslanıyordu: sırrı okuyan taraf, sırrı okuması gereken taraftır. Üretim ortamında bu
varsayımı sınayan bir şey yok. Servisler birbirine sorgusuz güveniyorsa, tek bir servisin ele
geçmesi ötekilere açılan bir kapıdır ve sırrın ömrünü kısaltmak o kapıyı kapatmaz — yalnızca
kapıdan geçenin elindeki anahtarın ne kadar süre işe yarayacağını sınırlar.

Bu konu uygulamanın altındaki katmanı ölçer ve ilk ders **yanal hareketi** sayar. Ölçü birimi
buradan sonra **servis çiftidir**: kaç yönlü çift var, kaçı bir meşru çağrıya karşılık geliyor,
hangi doğrulama düzeni kaçını kapatıyor. Ağ bölütlemesinin kural sayısı, etiket genişliği ve
matrisin büyüme hızı **Orkestrasyon** ve **Ağ Güvenliği** kurslarında ölçüldü; burada
tekrarlanmıyor, **girdi** olarak alınıyor.

- **AD1.** Ortam kurgusal bölgesel ölçüm ağının üretim ortamıdır: dokuz servis, bir sır deposu, bir
  küme. Gerçek bir küme koşturulmuyor; ölçülen şey `node` ile kurulan bir modeldir.
- **AD2.** Çağrı yönlüdür: `a->b` ile `b->a` ayrı çiftlerdir. Uç, kapı numarası ve protokol
  modellenmiyor; bunlar matrisi büyütür, sonucun yönünü değiştirmez.
- **AD3.** Meşru çağrı kümesi on yedidir ve çağrı sözleşmesinden okundu. Gerçekte bu liste ancak
  uzun bir izleme penceresiyle ya da tasarım belgesinden çıkarılır.
- **AD4.** Ağ politikası etiket düzeyinde yazılmıştır ve **verilmiş kabul edilir**; beş kuralı ve
  dört etiketi vardır.
- **AD5.** Ele geçme modeldir: bir serviste süreç denetimi saldırganın eline geçer ve o servisin
  açık olduğu her çift kullanılabilir hâle gelir. Hiçbir istismar adımı, çağrı dizisi ya da kaçış
  yöntemi yazılmaz.
- **AD6.** Sır deposu çağrı yapmayan bir düğümdür; dört servis onu meşru olarak okur, ağ politikası
  dokuzunun da ulaşmasına izin verir.

## Çift Kümesi ve Dört Düzen

```js
// servis.mjs — dokuz servis, cift kumesi ve dogrulama duzenleri. MODELDIR, gercek ag degil.
const bol = (s) => s.trim().replace(/\s{2,}/g, "\n").split("\n").map((l) => l.trim().split("|"));

// Servis: ad|bolge etiketleri (bolutleme onceki kurslarda olculdu, burada GIRDIDIR).
export const SERVIS = Object.fromEntries(bol(`
  portal-onu|kenar             abone-servisi|uygulama
  faturalama|uygulama          is-emri|uygulama,toplayici-istemcisi
  bildirim|uygulama            rapor|uygulama,toplayici-istemcisi
  sayac-toplama|toplama        dogrulayici|toplama
  saha-senkron|toplama`).map(([a, e]) => [a, e.split(",")]));

// Mesru cagri cifti: cagiran|cagrilan. On yedi cift, cagri sozlesmesinden.
export const MESRU = bol(`
  portal-onu|abone-servisi     portal-onu|faturalama
  portal-onu|is-emri           portal-onu|rapor
  abone-servisi|bildirim       sayac-toplama|dogrulayici
  dogrulayici|faturalama       dogrulayici|sayac-toplama
  faturalama|abone-servisi     faturalama|bildirim
  is-emri|saha-senkron         is-emri|bildirim
  saha-senkron|sayac-toplama   saha-senkron|is-emri
  rapor|faturalama             rapor|sayac-toplama
  bildirim|abone-servisi`).map(([a, b]) => `${a}->${b}`);

// Ag politikasi etiket duzeyinde yazilmis: hedef etiketi <- kaynak etiketi.
export const AG_KURAL = [["uygulama", "kenar"], ["uygulama", "uygulama"],
  ["uygulama", "toplama"], ["toplama", "toplama"], ["toplama", "toplayici-istemcisi"]];

export const ADLAR = Object.keys(SERVIS);
export const tumCift = () => ADLAR.flatMap((a) => ADLAR.filter((b) => b !== a).map((b) => `${a}->${b}`));

export function agAcik(s = SERVIS) {
  const acik = new Set(), ad = Object.keys(s);
  for (const [h, k] of AG_KURAL)
    for (const hedef of ad) if (s[hedef].includes(h))
      for (const kaynak of ad) if (kaynak !== hedef && s[kaynak].includes(k))
        acik.add(`${kaynak}->${hedef}`);
  return acik;
}

// Duzen: cagrilan servis cagiranin kim oldugunu ne kadar dogruluyor.
// yok      : cagiran kimligi hic dogrulanmaz
// tek-yonlu: yalniz cagrilan kendini kanitlar, cagiran kimligi yine dogrulanmaz
// karsilikli: cagiran da kanitlar, ama ic yetkiliden gelen her kimlik kabul edilir
// yetkili  : karsilikli dogrulama + cagiran basina izin listesi
export function cift(duzen, ag = agAcik()) {
  if (duzen === "yetkili") return new Set(MESRU.filter((c) => ag.has(c)));
  return new Set(ag);
}

// Bir servis ele gectiginde ulasilan servis kumesi ve sicrama sayilari (enine arama).
export function yayilim(baslangic, kenar) {
  const uzaklik = { [baslangic]: 0 }, kuyruk = [baslangic];
  while (kuyruk.length) {
    const n = kuyruk.shift();
    for (const c of kenar) {
      const [k, h] = c.split("->");
      if (k === n && !(h in uzaklik)) { uzaklik[h] = uzaklik[n] + 1; kuyruk.push(h); }
    }
  }
  return uzaklik;
}

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

// Sir deposu ayri bir dugumdur ve cagri yapmaz. Dort servis onu mesru olarak okur;
// ag politikasi dokuzunun da ulasmasina izin verir (depo etiketi uygulama ve toplama'ya acik).
export const SIR_OKUR = new Set(["abone-servisi", "faturalama", "sayac-toplama", "saha-senkron"]);

export function sirSicrama(baslangic, kenar, yetkili) {
  const u = yayilim(baslangic, kenar);
  const erisebilen = yetkili ? [...SIR_OKUR] : ADLAR;
  const d = erisebilen.filter((s) => s in u).map((s) => u[s] + 1);
  return d.length ? Math.min(...d) : Infinity;
}
```

`cift` işlevinin gövdesi kısa çünkü ölçülen şey kısa: dört düzenden üçü aynı kümeyi döndürür. Bu bir
eksiklik değil, dersin sonucudur.

## Kapanan Çift

```js
// kosum1.mjs — dort dogrulama duzeni ayni cift kumesinde kosturulur
import { ADLAR, MESRU, tumCift, agAcik, cift, yayilim, sirSicrama, gen } from './servis.mjs';

const ag = agAcik();
console.log(`${ADLAR.length} servis -> ${tumCift().length} yonlu cift; ag politikasi ${ag.size} cifte izin veriyor`);
console.log(`cagri sozlesmesindeki mesru cift ${MESRU.length}, hepsi ag politikasindan geciyor: ` +
  `${MESRU.every((c) => ag.has(c)) ? 'evet' : 'hayir'}`);
console.log(`ag politikasindan gecen ama hicbir mesru cagriya karsilik gelmeyen cift: ${ag.size - MESRU.length}\n`);

const yz = gen([28, 11, 10, 15, 17, 15]);
console.log(yz(['duzen', 'acik cift', 'kapanan', 'ort. erisilen', 'en dusuk erisim', 'sir sicramasi']));
for (const [ad, duzen] of [['dogrulama yok', 'yok'], ['tek yonlu tasima', 'tek-yonlu'],
  ['karsilikli, izin listesiz', 'karsilikli'], ['karsilikli + izin listesi', 'yetkili']]) {
  const k = cift(duzen, ag), yetkili = duzen === 'yetkili';
  const ulasan = ADLAR.map((s) => Object.keys(yayilim(s, k)).length - 1);
  const sic = ADLAR.map((s) => sirSicrama(s, k, yetkili));
  console.log(yz([ad, k.size, ag.size - k.size, (ulasan.reduce((a, b) => a + b, 0) / ADLAR.length).toFixed(1),
    Math.min(...ulasan), `${Math.min(...sic)}-${Math.max(...sic)}`]));
}

const yetkiliKenar = cift('yetkili', ag);
console.log('\nizin listesi acikken servis basina yayilim:');
const ys = gen([16, 11, 9, 16]);
console.log(ys(['ele gecen servis', 'ulasilan', 'once', 'sir sicramasi']));
for (const s of ADLAR) {
  const sonra = Object.keys(yayilim(s, yetkiliKenar)).length - 1;
  const once = Object.keys(yayilim(s, ag)).length - 1;
  console.log(ys([s, sonra, once, `${sirSicrama(s, ag, false)} -> ${sirSicrama(s, yetkiliKenar, true)}`]));
}
```

```
9 servis -> 72 yonlu cift; ag politikasi 52 cifte izin veriyor
cagri sozlesmesindeki mesru cift 17, hepsi ag politikasindan geciyor: evet
ag politikasindan gecen ama hicbir mesru cagriya karsilik gelmeyen cift: 35

duzen                         acik cift   kapanan  ort. erisilen  en dusuk erisim  sir sicramasi
dogrulama yok                        52         0            7.1                7            1-1
tek yonlu tasima                     52         0            7.1                7            1-1
karsilikli, izin listesiz            52         0            7.1                7            1-1
karsilikli + izin listesi            17        35            4.1                1            1-2

izin listesi acikken servis basina yayilim:
ele gecen servis   ulasilan     once   sir sicramasi
portal-onu                8        8          1 -> 2
abone-servisi             1        7          1 -> 1
faturalama                2        7          1 -> 1
is-emri                   6        7          1 -> 2
bildirim                  1        7          1 -> 2
rapor                     5        7          1 -> 2
sayac-toplama             4        7          1 -> 1
dogrulayici               4        7          1 -> 2
saha-senkron              6        7          1 -> 1
```

İlk üç satır aynı sayıları taşıyor ve tablonun okunması gereken yeri burasıdır. **Tek yönlü taşıma
doğrulaması sıfır çift kapatıyor.** Çağrılan taraf kendini kanıtlar, çağıran hiçbir şey kanıtlamaz;
kimin aradığı bilinmediği için hiçbir çift reddedilemez. İkinci satırla üçüncü satır arasındaki fark
daha keskin: **karşılıklı doğrulama tek başına da sıfır çift kapatıyor.** Her servis geçerli bir iş
yükü kimliği taşır, dolayısıyla ele geçmiş bir servis de geçerli bir kimlik sunar. Doğrulama
sorusunu "geçerli bir iç kimlik mi" diye sorarsanız cevap her zaman evettir.

Kapatan tek satır dördüncüsü: çağıran başına izin listesi. Elli iki çiftten otuz beşi kapanıyor ve
ortalama erişilen servis 7,1'den 4,1'e iniyor. Bu, otuz beş çiftin **hiçbir meşru çağrıya karşılık
gelmediği** için ücretsiz sanılan bir kapanma değil; listenin kendisi on yedi satırdır ve o on yedi
satırı birinin yazması gerekir.

## Kapanmayan Yol

Alt tablo kazancın nereye dağıldığını gösteriyor ve dağılım eşit değil. Bildirim servisi ele
geçtiğinde erişilen servis yediden **bire** iniyor; abone servisi de öyle. Bunlar çağrı çizgesinin
yapraklarıdır ve izin listesi onları gerçekten yalıtıyor. Portal önü ele geçtiğinde ise sayı
sekizden **sekize** iniyor: hiç değişmiyor. Kenar servis dört meşru çağrı yapar, o dördü ötekileri
çağırır ve zincir bütün kümeyi kapsar. İzin listesi yalnız çağrı çizgesinin **olmayan** kenarlarını
kapatır; var olan kenarlar üzerinden yürüyen bir yayılımı durdurmaz.

Sır sıçraması sütunu aynı sınırı sayıya bağlıyor. Doğrulama yokken sır deposu her servisten **bir**
sıçrama uzaktadır. İzin listesi açıkken dört servis için hâlâ bir sıçrama — onlar deposu meşru
olarak okuyor — kalan beşi için iki sıçrama. Yani en yüksek değer birden ikiye çıkıyor. Yanal
hareket kapanmıyor, **uzuyor**: saldırganın önce bir ara servisi kullanması gerekiyor ve o ara
servisin kullanımı bir kayıt satırı üretiyor. Kazanç budur ve bunun adını doğru koymak gerekir —
otuz beş çift kapandı, sır deposuna giden yol kapanmadı.

## Doğrulamanın Getirdiği Kalem

```js
// kosum2.mjs — izin listesinin ve sertifika yonetiminin getirdigi kalem
import { ADLAR, MESRU, SERVIS, agAcik, gen } from './servis.mjs';

const KOPYA = { 'portal-onu': 6, 'abone-servisi': 4, 'faturalama': 3, 'is-emri': 3, 'bildirim': 2,
  'rapor': 2, 'sayac-toplama': 6, 'dogrulayici': 3, 'saha-senkron': 2 };
const ornek = Object.values(KOPYA).reduce((a, b) => a + b, 0);
console.log(`${ADLAR.length} servis, ${ornek} kopya; her kopya bir is yuku kimligi tasir`);
const yz = gen([18, 11, 17, 13, 14]);
console.log('\n' + yz(['sertifika omru', 'sertifika', 'yillik yenileme', 'elle kalem', 'acik pencere']));
for (const [ad, gun, elle] of [['90 gun', 90, ornek], ['24 saat', 1, 0], ['1 saat', 1 / 24, 0]])
  console.log(yz([ad, ornek, Math.round((365 / gun) * ornek), elle, `${(gun * 24).toFixed(0)} saat`]));
console.log(`izin listesi ${MESRU.length} satir; ag politikasi 5 kural ve ` +
  `${new Set(Object.values(SERVIS).flat()).size} etiket; kok guven cipasi 1 kalem, yilda 1 elle donduruluyor`);

console.log('\nbir servisin sertifikasi yenilenemezse dusen mesru cift:');
const yd = gen([18, 10, 11, 9]);
console.log(yd(['servis', 'cagiran', 'cagrilan', 'toplam']));
const dusen = ADLAR.map((s) => ({ s, c: MESRU.filter((x) => x.startsWith(`${s}->`)).length,
  h: MESRU.filter((x) => x.endsWith(`->${s}`)).length })).sort((a, b) => b.c + b.h - a.c - a.h);
for (const d of dusen.slice(0, 3)) console.log(yd([d.s, d.c, d.h, d.c + d.h]));
const son = dusen[dusen.length - 1];
console.log(`ortalama ${(dusen.reduce((a, b) => a + b.c + b.h, 0) / ADLAR.length).toFixed(1)} cift, ` +
  `en dusuk ${son.c + son.h} cift (${son.s})`);

const YENI = ['is-emri->arsiv', 'arsiv->faturalama'];
const once = agAcik().size, sonra = agAcik({ ...SERVIS, arsiv: ['uygulama'] }).size;
console.log('\nonuncu servis (arsiv, 2 kopya, uygulama etiketi) eklendiginde:');
console.log(`  ag kurali 5 -> 5, ag politikasinin actigi cift ${once} -> ${sonra}`);
console.log(`  izin listesi ${MESRU.length} -> ${MESRU.length + YENI.length} satir, sertifika ${ornek} -> ${ornek + 2}`);
console.log(`  yeni servisin gereksiz acik cifti: ag duzeninde ${sonra - once - YENI.length}, izin listesinde 0`);
```

```
9 servis, 31 kopya; her kopya bir is yuku kimligi tasir

sertifika omru      sertifika  yillik yenileme   elle kalem  acik pencere
90 gun                     31              126           31     2160 saat
24 saat                    31            11315            0       24 saat
1 saat                     31           271560            0        1 saat
izin listesi 17 satir; ag politikasi 5 kural ve 4 etiket; kok guven cipasi 1 kalem, yilda 1 elle donduruluyor

bir servisin sertifikasi yenilenemezse dusen mesru cift:
servis               cagiran   cagrilan   toplam
faturalama                 2          3        5
portal-onu                 4          0        4
abone-servisi              1          3        4
ortalama 3.8 cift, en dusuk 3 cift (saha-senkron)

onuncu servis (arsiv, 2 kopya, uygulama etiketi) eklendiginde:
  ag kurali 5 -> 5, ag politikasinin actigi cift 52 -> 66
  izin listesi 17 -> 19 satir, sertifika 31 -> 33
  yeni servisin gereksiz acik cifti: ag duzeninde 12, izin listesinde 0
```

Doksan günlük sertifika ömrü yılda yüz yirmi altı yenileme üretir ve bunlar elle yapılırsa otuz bir
kalem takvime girer. Ömrü yirmi dört saate indirmek elle kalemi sıfırlar çünkü bu sayıda yenileme
elle yapılamaz; karşılığında yıllık yenileme on bir bine çıkar ve bir dağıtım düzeneği zorunlu hâle
gelir. Bir saatlik ömür aynı düzenek üzerinde iki yüz yetmiş bin yenileme ister ve açık pencereyi
yirmi dört saatten bir saate indirir. Üç satır aynı ayarın üç değeridir; hangisinin seçileceği
kimliğin ne kadar süre kötüye kullanılabileceğine bakılarak belirlenir.

Orta tablo bu düzeneğin arıza yüzünü sayıyor. Faturalama servisinin sertifikası yenilenemezse beş
meşru çift düşer — iki çağrısı ve üç çağrılışı. Ortalama üç virgül sekiz çifttir ve en düşük değer
bile üçtür. Doğrulama açıkken bir yenileme arızası bir güvenlik olayı gibi görünmez; bir kesinti
gibi görünür ve nedeni ilk bakışta uygulama katmanında aranır. Kapatmanın meşru işe bedeli tam
olarak budur: kapatılan otuz beş çiftin karşılığında, kapatma düzeneğinin kendisi üç ile beş arası
meşru çifti düşürebilen yeni bir arıza kaynağıdır.

Son blok onuncu servisi ekliyor. Ağ politikası hiç değişmiyor — beş kural, beş kural — ama açtığı
çift elli ikiden altmış altıya çıkıyor: yeni servisin ihtiyacı iki çiftken on iki gereksiz çift
kendiliğinden açılıyor. İzin listesi düzeninde iki satır yazılır ve gereksiz açık çift sıfır kalır.
Etiketle yazılan politika büyümeye emek harcamadan uyum sağlar ve açıklığı biriktirir; çağıran
başına liste her serviste iki satır ister ve açıklığı biriktirmez.

## Daha Erken Nerede Kapanırdı

İzin listesindeki on yedi satır bir çalışma zamanı yapılandırması gibi görünüyor ama içeriği
çalışma zamanına ait değil. O liste, hangi servisin hangi servisi çağırdığının listesidir ve bu
bilgi **tasarım aşamasında** doğar. Çağrı sözleşmesi yazıldığı anda on yedi çift bellidir; otuz beş
gereksiz çift, sözleşmenin hiçbir yere yazılmamış olmasından doğar.

Aynı kalemi iki aşamada kapatmanın fiyatı arasındaki fark tabloda okunuyor. Tasarım aşamasında
kapatmak bir belgedir ve bir gözden geçirmedir. Çalışma zamanında kapatmak on yedi politika satırı,
otuz bir sertifika, yılda on bir bin yenileme, bir kök güven çıpası, bir döndürme takvimi ve servis
başına üç ile beş arası meşru çifti düşürebilen bir arıza kaynağıdır. Çalışma zamanı katmanı bunu
yapmalıdır, çünkü sözleşmenin yazılmış olması onun uygulandığı anlamına gelmez — ama katmanın
kurulmasının nedeni sözleşmenin yokluğuysa, sayılan bedelin tamamı daha ucuza kapatılabilirdi.

## Özet

- Dokuz servis 72 yönlü çift üretir; ağ politikası 52'sine izin verir, meşru çağrı çifti 17'dir ve
  35 çift hiçbir çağrıya karşılık gelmeden açık durur.
- Tek yönlü taşıma doğrulaması ve izin listesiz karşılıklı doğrulama **sıfır çift** kapatır; ele
  geçmiş bir servis de geçerli bir iç kimlik sunar.
- Çağıran başına izin listesi 35 çift kapatır ve ortalama erişilen servisi 7,1'den 4,1'e indirir;
  yaprak servislerde erişim yediden bire iner, kenar serviste sekizden sekize — hiç değişmez.
- Sır deposuna sıçrama sayısı 1'den en fazla 2'ye çıkar: yol kapanmaz, uzar ve ara servisin
  kullanımı bir kayıt satırı üretir.
- Bedel 31 sertifika, doksan günlük ömürde yılda 126 yenileme ve 31 elle kalem, yirmi dört saatlik
  ömürde 11.315 yenileme ve bir dağıtım düzeneğidir; bir yenilemenin düşmesi ortalama 3,8 meşru
  çifti keser.
- Onuncu servis eklendiğinde etiket politikası 12 gereksiz çift açar, izin listesi 2 satırla sıfır
  açar; listenin içeriği tasarım aşamasında doğan çağrı sözleşmesidir.

## Sonraki Adım

Bu dersin bütün ölçümü servis sınırında durdu: kim kimi çağırabiliyor, çağrı reddedildiğinde ne
oluyor. Sınırın **içi** hiç açılmadı. İzin listesi eksiksiz yazılmış olsa bile, bir servisin kendi
kapsülünün içinde açılan bir kabuk, beklenmedik bir ikili ya da alışılmadık bir dosya erişimi
hiçbir çifti ihlal etmez — çünkü hiçbir çağrı yapmaz. Sonraki ders bu tarafı ölçer: dokuz servisin
süreç davranışı için bir taban çizgisi çıkarılır, bir haftalık kayıt üzerinde taban çizgisinden
sapan süreç sayılır ve sapmaların kaçının gerçek bir anormallik, kaçının meşru bir değişiklik
olduğu ayrılır. Tespitin kaç saniye gecikmeyle geldiği de aynı tabloda yazılır.
