İçeriğe geç
academia.sh

Ders 11 / 15

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.

İçindekiler

Ö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

// 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

// 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

// 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.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat