İçeriğe geç
academia.sh

Ders 09 / 15

Sıfır Güven

Konum temelli güven kaldırılırken doğrulama kapsamı beş adımda genişletilir ve her adımda yol sayısı, günlük doğrulama işlemi ve istek başına ek adım birlikte sayılır. Sıfır güvende açık kalan yolların nedeni bulunur ve kimliğin uçtan uca taşınmasının kaç iç akışı değiştirdiği ölçülür.

İçindekiler

Önceki ders ağı bölmelere ayırdı ve bir düğüm düştüğünde erişilen kalemi saydı. Bütün şemalar aynı sessiz kuralla çalıştı: bir bölmenin içinde serbest dolaşılır. Erişilen kalem sayısının on üçten başlamasının nedeni buydu; bölme eklemek kuralı kaldırmadı, yalnız geçerli olduğu alanı küçülttü. Bu ders kuralın kendisini kaldırır.

Sıfır güven (zero trust), bir isteğin nereden geldiğine bakarak verilen güveni tamamen bırakmak ve her adımı ayrı ayrı doğrulamaktır. İlkeyi ölçmek için “içeride olmak” yerine geçen bir şey gerekir: her adımın kime ait olduğu. Bir adım, ona sahip olan kimlik tarafından atılıyorsa geçer; başka bir kimlik aynı adımı atmaya çalıştığında, adım ağın neresinde olursa olsun durur. Ölçülen üç şey yol sayısı, günlük doğrulama işlemi ve istek başına ek adımdır.

  • SI17. Adım sahipliği meşru akış listesinden türetilir: bir akış bir giriş noktasından başlıyorsa o akışın adımları o kimliğe aittir.
  • SI18. Dört meşru akış bir giriş noktasından başlamaz; kuyruktan ya da yönetim istasyonundan tetiklenir. Bu akışların adımları ortak kabul edilir, yani hangi kimliğin tetiklediği bilinmez. Modelin en belirleyici kararı budur.
  • SI19. Doğrulama kapsamı, kimlik denetimi yapılan adımların kümesidir. Kapsam dışındaki adım konuma güvenip geçirir; kapsam içindeki adım sahiplik kümesine bakar.
  • SI20. Bir doğrulama işlemi bir ek adımdır. Doğrulamanın kendi gecikmesi, süresi ve başarısızlık oranı modellenmiyor; sayılan yalnız kaç kez yapıldığıdır.
  • SI21. Doğrulama her zaman doğru sonuç verir. Sahte kimlik, çalınmış belirteç ve yeniden oynatma modellenmiyor; bunlar kapanan yol sayısını düşürür, ölçünün yönünü değiştirmez.

Konumun Yerine Kimlik

Grafik aynı kalıyor; değişen tek şey bir adımın hangi koşulla geçildiğidir.

// ag.mjs — kurgusal bolgesel olcum aginin erisim grafigi ve mesru akislari (model)
export const GIRIS = ['saha-uc', 'sube-agi', 'genel-uc', 'bakim-uc'];
export const VARLIK = ['olcum-deposu', 'fatura-vt', 'abone-kayit', 'yapilandirma'];
export const KENAR = [
  ['saha-uc', 'toplayici'], ['saha-uc', 'is-emri'], ['sube-agi', 'toplayici'],
  ['sube-agi', 'is-emri'], ['sube-agi', 'yonetim'], ['genel-uc', 'toplayici'],
  ['bakim-uc', 'yonetim'], ['bakim-uc', 'kuyruk'], ['toplayici', 'kuyruk'],
  ['toplayici', 'olcum-deposu'], ['kuyruk', 'dogrulayici'], ['kuyruk', 'faturalama'],
  ['dogrulayici', 'olcum-deposu'], ['dogrulayici', 'fatura-vt'], ['faturalama', 'fatura-vt'],
  ['faturalama', 'abone-kayit'], ['is-emri', 'kuyruk'], ['is-emri', 'abone-kayit'],
  ['yonetim', 'toplayici'], ['yonetim', 'dogrulayici'], ['yonetim', 'is-emri'],
  ['yonetim', 'yapilandirma'],
];
// Mesru akis: gunluk kosan is; adim dizisi ayni grafigin kenarlarindan gecer.
export const AKIS = [
  ['saha-okuma', ['saha-uc', 'toplayici', 'kuyruk'], 1440],
  ['dogrulama', ['kuyruk', 'dogrulayici', 'olcum-deposu'], 1440],
  ['genel-okuma', ['genel-uc', 'toplayici', 'olcum-deposu'], 300],
  ['sube-sorgu', ['sube-agi', 'toplayici', 'olcum-deposu'], 210],
  ['fatura-yazimi', ['kuyruk', 'faturalama', 'fatura-vt'], 48],
  ['is-emri-acma', ['sube-agi', 'is-emri', 'abone-kayit'], 32],
  ['is-emri-kuyruk', ['sube-agi', 'is-emri', 'kuyruk'], 32],
  ['abone-guncelleme', ['faturalama', 'abone-kayit'], 6],
  ['yapilandirma-degisikligi', ['sube-agi', 'yonetim', 'yapilandirma'], 2],
  ['bakim-oturumu', ['bakim-uc', 'yonetim', 'toplayici'], 1],
  ['kuyruk-bakimi', ['bakim-uc', 'kuyruk'], 1],
  ['mutabakat', ['yonetim', 'dogrulayici', 'fatura-vt'], 1],
];
export const ad = (a, b) => `${a}>${b}`;
export const adimlar = (d) => d.slice(0, -1).map((x, i) => ad(x, d[i + 1]));
export function yollar(kapali = new Set()) {
  const komsu = new Map();
  for (const [a, b] of KENAR) if (!kapali.has(ad(a, b))) komsu.set(a, [...(komsu.get(a) || []), b]);
  const s = [];
  const yuru = (d, y) => {
    if (VARLIK.includes(d)) return void s.push(y);
    for (const k of komsu.get(d) || []) if (!y.includes(k)) yuru(k, [...y, k]);
  };
  for (const g of GIRIS) yuru(g, [g]);
  return s;
}
export const kesilen = (kapali) => AKIS.filter(([, d]) => adimlar(d).some((k) => kapali.has(k)));
// kimlik.mjs — adim sahipligi ve dogrulama kapsamlari (model)
import { KENAR, AKIS, GIRIS, VARLIK, ad, adimlar } from './ag.mjs';
export const KENAR_AD = KENAR.map(([a, b]) => ad(a, b));
// Ic akislar bir giris noktasindan baslamaz; adimlari butun kimliklerce ortak kullanilir.
const ORTAK = new Set(AKIS.filter(([, d]) => !GIRIS.includes(d[0])).flatMap(([, d]) => adimlar(d)));
const kendi = (g) => AKIS.filter(([, d]) => d[0] === g).flatMap(([, d]) => adimlar(d));
export const SAHIP = Object.fromEntries(GIRIS.map((g) => [g, new Set([...ORTAK, ...kendi(g)])]));
export const UCTAN_UCA = Object.fromEntries(GIRIS.map((g) => [g, new Set(kendi(g))]));
const SERVIS = ['toplayici', 'kuyruk', 'dogrulayici', 'faturalama', 'is-emri'];
const bolme = (d) => (GIRIS.includes(d) ? 'dis'
  : SERVIS.includes(d) ? 'servis' : d === 'yonetim' ? 'yonetim' : 'veri');
export const CEVRE = KENAR_AD.filter((k) => GIRIS.includes(k.split('>')[0]));
export const VARLIGA = KENAR_AD.filter((k) => VARLIK.includes(k.split('>')[1]));
export const GECIT = KENAR_AD.filter((k) => bolme(k.split('>')[0]) !== bolme(k.split('>')[1]));
const komsu = new Map();
for (const [a, b] of KENAR) komsu.set(a, [...(komsu.get(a) || []), b]);
// Kapsamdaki adim kimligi denetler; kapsam disindaki adim konuma guvenip gecirir.
export function yol(g, kapsam, sahip = SAHIP) {
  const s = new Set(kapsam), out = [];
  const yuru = (d, y) => {
    if (VARLIK.includes(d)) return void out.push(y);
    for (const k of komsu.get(d) || []) {
      const e = ad(d, k);
      if (s.has(e) && !sahip[g].has(e)) continue;
      if (!y.includes(k)) yuru(k, [...y, k]);
    }
  };
  yuru(g, [g]);
  return out;
}
// kosum1.mjs — dogrulama kapsami genisledikce yol sayisi ve istek basina ek adim
import { AKIS, GIRIS, adimlar } from './ag.mjs';
import { KENAR_AD, CEVRE, VARLIGA, GECIT, yol } from './kimlik.mjs';

const tek = (a) => [...new Set(a)];
const KAPSAM = [['hicbiri', []], ['cevre', CEVRE], ['cevre+varlik', tek([...CEVRE, ...VARLIGA])],
  ['cevre+gecit', tek([...CEVRE, ...GECIT])], ['her-adim', KENAR_AD]];
const gunluk = AKIS.reduce((s, [, , n]) => s + n, 0);
console.log('kapsam        denetlenen  yol  kapanan  gunluk dogrulama  istek basina ek adim');
for (const [nm, kapsam] of KAPSAM) {
  const y = GIRIS.reduce((s, g) => s + yol(g, kapsam).length, 0), s = new Set(kapsam);
  const dog = AKIS.reduce((t, [, d, c]) => t + c * adimlar(d).filter((k) => s.has(k)).length, 0);
  console.log(`${nm.padEnd(14)}${String(kapsam.length).padEnd(12)}${String(y).padEnd(5)}` +
    `${String(55 - y).padEnd(9)}${String(dog).padEnd(18)}${(dog / gunluk).toFixed(2)}`);
}
kapsam        denetlenen  yol  kapanan  gunluk dogrulama  istek basina ek adim
hicbiri       0           55   0        0                 0.00
cevre         8           50   5        2018              0.57
cevre+varlik  15          46   9        4057              1.15
cevre+gecit   18          32   23       4059              1.16
her-adim      22          20   35       7019              2.00

İkinci satır konum temelli güvenin ölçüsüdür. Sekiz giriş adımında kimlik denetleniyor, içeride hiçbir yerde denetlenmiyor. Elli beş yolun yalnız beşi kapanıyor. Bedeli düşük — günde iki bin on sekiz doğrulama, istek başına sıfır virgül elli yedi ek adım — ama karşılığında alınan da düşük: yolların yüzde doksanı açık kalıyor. Çevrede duran bir denetim, çevreyi geçmiş bir isteği bir daha hiç görmüyor. Bu, çevre denetiminin değersiz olduğu anlamına gelmez; ilk beş yolu en ucuz biçimde kapatan denetim odur. Anlamı, ölçümün orada bitirilemeyeceğidir — çevrede duran bir denetimin kapattığı yol sayısı, arkasındaki ağın şeklinden bağımsız olarak küçüktür.

Üçüncü ve dördüncü satırlar birlikte okunmalıdır, çünkü ikisinin maliyeti neredeyse aynı: günde dört bin elli yedi ve dört bin elli dokuz doğrulama, istek başına bir virgül on beş ve bir virgül on altı ek adım. Kapattıkları yol sayısı ise dokuz ve yirmi üç. Aynı bedelle iki buçuk kat fark. Doğrulamayı varlığın önüne koymak, yolun son adımını denetlemektir ve o adıma gelen istek zaten bütün ara düğümlerden geçmiştir; bölme geçitlerine koymak ise yolu ortasından keser. Doğrulamanın maliyeti kaç kez yapıldığıyla, değeri nerede yapıldığıyla belirlenir.

Son satır sıfır güvenin tam hâlidir. Yirmi iki adımın hepsinde kimlik denetleniyor, elli beş yolun otuz beşi kapanıyor ve yirmisi açık kalıyor. Bedel günde yedi bin on dokuz doğrulama, yani istek başına tam iki ek adım: her meşru istek ortalama iki kez kimliğini gösteriyor. Konum temelli güvene göre otuz yol daha kapandı ve doğrulama sayısı üç buçuk katına çıktı.

İki sütunu birbirine bölmek beklenmedik bir sonuç veriyor. Çevre denetiminde kapanan yol başına dört yüz dört doğrulama düşüyor; her adımda doğrulamada iki yüz bir. Sıfır güven, kapattığı yol başına konum temelli güvenden daha ucuzdur. En verimli satır çevre ile bölme geçitlerinin birleşimi: kapanan yol başına yüz yetmiş altı doğrulama. En verimsizi ise çevre ile varlık girişi birleşimi: dört yüz elli bir. Toplam maliyete bakarak “sıfır güven pahalıdır” demek, tablonun yalnız bir sütununu okumaktır; iki sütun birlikte okunduğunda pahalı olan şey doğrulamanın sayısı değil, yanlış yere konmasıdır.

Son sütundaki iki sayısı da açıklanmalıdır. Yirmi iki adımın hepsinde doğrulama yapılıyor ama istek başına ek adım iki çıkıyor, çünkü meşru akışların çoğu iki adımlıdır. Doğrulama kapsamının genişlemesi denetlenen adım sayısını artırır; bir isteğin ödediği bedeli ise o isteğin kaç adımdan geçtiği belirler. Uzun akışlar sıfır güvenin bedelini doğrusal olarak büyütür.

Giriş Noktası Başına

Toplam sayı hangi kimliğin daraldığını göstermez. Aynı ölçüm giriş noktası başına yapıldığında sahiplik kümesinin genişliği belirleyici oluyor.

// kosum2.mjs — giris noktasi basina yol; kimlik uctan uca tasinirsa ne kaliyor
import { AKIS, GIRIS, VARLIK } from './ag.mjs';
import { KENAR_AD, CEVRE, SAHIP, UCTAN_UCA, yol } from './kimlik.mjs';

console.log('giris      sahip adim  konum temelli  sifir guven  uctan uca kimlik');
for (const g of GIRIS)
  console.log(`${g.padEnd(11)}${String(SAHIP[g].size).padEnd(12)}${String(yol(g, CEVRE).length).padEnd(15)}` +
    `${String(yol(g, KENAR_AD).length).padEnd(13)}${yol(g, KENAR_AD, UCTAN_UCA).length}`);
const acik = GIRIS.flatMap((g) => yol(g, KENAR_AD));
const say = acik.reduce((m, p) => m.set(p.at(-1), (m.get(p.at(-1)) || 0) + 1), new Map());
console.log(`\nsifir guvende acik kalan ${acik.length} yolun ulastigi varlik:`);
for (const v of VARLIK) console.log(`  ${v.padEnd(16)}${say.get(v) || 0}`);
const ic = AKIS.filter(([, d]) => !GIRIS.includes(d[0]));
console.log(`\nkimligi uctan uca tasimak icin degismesi gereken ic akis ${ic.length}, ` +
  `gunluk istek ${ic.reduce((s, [, , n]) => s + n, 0)}`);
giris      sahip adim  konum temelli  sifir guven  uctan uca kimlik
saha-uc    9           5              4            0
sube-agi   14          23             9            3
genel-uc   9           5              1            1
bakim-uc   10          17             6            0

sifir guvende acik kalan 20 yolun ulastigi varlik:
  olcum-deposu    7
  fatura-vt       8
  abone-kayit     4
  yapilandirma    1

kimligi uctan uca tasimak icin degismesi gereken ic akis 4, gunluk istek 1495

En büyük daralma bakım ucunda: on yedi yoldan altıya. Şube ağı yirmi üçten dokuza iniyor ama oransal olarak en az daralan giriş noktası odur, çünkü sahiplik kümesi en geniş olan odur — on dört adım. Meşru işi geniş olan kimlik sıfır güvenden en az yararlanan kimliktir; önceki derste aynı şeyi yönetim düğümü için görmüştük, ölçü farklı, sonuç aynı.

Genel uç en sert daralmayı yaşıyor: beş yoldan bire. Sahiplik kümesi dokuz adım olmasına rağmen kendi akışı yalnız iki adımdan ibaret; geri kalan yedi adım ortak kümeden geliyor. Bu satır bir sonraki bulgunun ipucudur.

Alt tablo daralmanın varlıklara nasıl dağıldığını veriyor ve dağılım eşit değil. İlk derste fatura veritabanına yirmi iki, ölçüm deposuna on yedi, abone kayıtlarına on dört ve yapılandırma deposuna iki yol gidiyordu. Sıfır güvenden sonra bu sayılar sekiz, yedi, dört ve bir. En çok yol taşıyan varlık en çok daralan varlık oldu — yirmi ikiden sekize, yüzde altmış dört. Yapılandırma deposu ise ikiden bire indi, yüzde elli. Oransal daralmanın büyük olması yüksek sayıdan başlamanın sonucudur; kalan mutlak sayı hâlâ fatura veritabanında en yüksektir. Bir savunma raporu yüzdeyle yazıldığında en çok korunan varlık gibi görünen kalem, mutlak sayıyla yazıldığında hâlâ en açık kalemdir. Hangi sütunun okunacağı, kararın ne olduğuna göre değişir: yatırım önceliği mutlak sayıdan, ilerleme ölçüsü orandan okunur.

Kimliğin Kaybolduğu Yer

Sıfır güvende yirmi yol neden hâlâ açık? Cevap ortak adımlardadır. Dört meşru akış bir giriş noktasından başlamıyor: doğrulama, fatura yazımı, abone güncelleme ve mutabakat. Bunlar kuyruktan ya da yönetim istasyonundan tetikleniyor ve tetikleyenin kim olduğu adımın kendisinde yazmıyor. Modelde bu yedi adım bütün kimliklere ortak açık kaldı; gerçekte de bir kuyruktan alınan iş, işi kuyruğa koyanın kimliğini taşımaz.

Son sütun bunun ölçüsüdür. Kimlik uçtan uca taşınsaydı, yani her iç akış kendisini tetikleyen isteğin kimliğini de taşısaydı, kalan yol yirmiden dörde inecekti. Saha ucundan ve bakım ucundan hiçbir yol kalmıyor; şube ağından üç, genel uçtan bir yol kalıyor. On altı yolun tamamı, kimliğin kuyrukta düşmesinden geliyor.

Bu on altı yolun fiyatı da yazılabilir: dört iç akışın yeniden kurulması ve günde bin dört yüz doksan beş isteğin kimlik taşıyacak biçimde değiştirilmesi. Bu bir denetim eklemek değil, bir tasarım değişikliğidir; kuyruğun ilettiği her işin çağıranın kimliğini de iletmesi gerekir. Sıfır güvenin uygulamada yarım kalmasının başlıca nedeni budur: kapatılabilir elli bir yolun otuz beşi denetim ekleyerek kapanır, on altısı ancak akışlar yeniden yazılarak kapanır. Birincisi bir yapılandırma işi, ikincisi bir yazılım işidir ve ikisi aynı bütçeden çıkmaz.

Ölçümün tamamının bir sınırı da vardır. Model doğrulamanın her zaman doğru sonuç verdiğini kabul etti; çalınmış bir kimlik, sahibi olduğu bütün adımlarda geçerlidir. Sıfır güven bir kimliğin çalınmasını engellemez, çalınan kimliğin kaç adımda geçerli olduğunu küçültür. Sahiplik sütunundaki dokuz ile on dört arasındaki fark, bir kimliğin çalınması hâlinde açılan alanın farkıdır. Aynı nedenle sıfır güven bir bitiş durumu değil, bir ölçü ekseni sayılmalıdır: sahiplik kümeleri daraldıkça çalınan kimliğin değeri düşer, genişledikçe yükselir. Ölçülecek şey “sıfır güvene geçildi mi” değil, kimlik başına kaç adımın açık olduğudur.

Özet

  • Konum temelli güven, sekiz giriş adımında kimlik denetleyip içeride hiç denetlemiyor: 55 yolun yalnız 5’i kapanıyor, istek başına 0,57 ek adım ödeniyor.
  • Doğrulamayı varlığın önüne koymakla bölme geçitlerine koymak neredeyse aynı maliyeti taşıyor (günde 4.057 ve 4.059 doğrulama) ama 9 ve 23 yol kapatıyor. Maliyet kaç kez yapıldığıyla, değer nerede yapıldığıyla belirlenir.
  • Her adımda doğrulama 35 yol kapatıyor ve 20 yol bırakıyor; bedeli günde 7.019 doğrulama, istek başına tam 2 ek adım.
  • Sahiplik kümesi geniş olan kimlik en az daralıyor: şube ağı 14 adımla 23 yoldan 9’a inerken bakım ucu 10 adımla 17 yoldan 6’ya iniyor.
  • Açık kalan 20 yolun kaynağı, bir giriş noktasından başlamayan 4 iç akışın ortak adımlarıdır. Kimlik uçtan uca taşınsaydı kalan yol 4 olurdu.
  • Son 16 yolun fiyatı denetim değil tasarımdır: 4 iç akışın yeniden kurulması ve günde 1.495 isteğin kimlik taşıyacak biçimde değiştirilmesi.

Sonraki Adım

Bu ders her adımda kimliği denetledi ve kimliğin kaybolduğu yeri buldu. Sorulan soru hep aynıydı: bu isteği kim gönderdi? Ama bir adımın geçilmesi için iki ayrı sorunun yanıtlanması gerekir ve bu ders yalnız birincisini sordu. Kimliği doğrulanmış bir istek, doğrulandığı için yetkili değildir; yetki ayrı bir sorudur ve ayrı bir yerde sorulur. İki soru aynı katmanda birleştirildiğinde ya da biri diğerinin yerine geçtiğinde ne olur? Sonraki dersin ölçtüğü şey budur: doğrulanmış ama yetkisiz bir istek kaç kalemde geçiyor, denetim yanlış katmana konduğunda kaç yol açılıyor ve iki soruyu ayrı ayrı sormanın kaç kaleme ek denetim eklemek demek olduğu.

İ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