Ders 07 / 11
Veri Akış Diyagramları
Konunun temel ölçümü: 17 düğüm, 26 akış ve altı güven bölgesinden oluşan çizgede 23 akışın güven sınırını geçmesi, bu geçişlerin akış başına 2,52 olmak üzere toplam 58 kalem doğurması, kalemlerin %58,6'sının düşükten yükseğe geçen akışlardan gelmesi, kaba bir dış/iç çiziminin 23 geçişin yalnız 7'sini ve 58 kalemin yalnız 15'ini görmesi ve görünmez kalan 16 geçişin 43 kalem taşıması.
İçindekiler
Önceki ders oturumun fiyatını ve kapsama tavanını yazdı, ama oturumun içinde ne yapıldığını bir kutu olarak bıraktı. Tasarım metnini okumak bir yöntem değildir: yüzlerce cümlenin hangisinin güvenlik kalemi doğurduğu belli değildir ve iki kişi aynı metinden iki ayrı liste çıkarır.
Yöntemin ilk adımı tasarımı üzerinde sayım yapılabilir bir yapıya çevirmektir. O yapı veri akış çizgesidir (data flow diagram): hangi bileşen hangi veriyi kimden alıp kime veriyor. Bu ders çizgeyi kurar ve konunun temel ölçümünü yapar — güven sınırını geçen akış sayısı, her geçişin doğurduğu kalem ve sınır çizilmediğinde kaç akışın görünmez kaldığı.
Çizge, Diyagram Değildir
Bir diyagram çizimdir; üzerinde sayım yapılan şey çizim değil, çizimin arkasındaki çizgedir. Mimari Karar ve Dokümantasyon kursundaki ayrımla söylenirse diyagram bir görünümdür, çizge ise görünümün türetildiği yapıdır. Aynı çizge kutu-ok çizimi olarak da, aşağıdaki gibi satır satır da yazılabilir; ölçüm ikisinde de aynı sayıyı verir.
Aşağıdaki çizge bir modeldir: gerçek bir sistem, gerçek bir ana makine adı ya da gerçek bir hizmet ucu yoktur. Kurgu bölgesel ölçüm ağının yazılımı ele alınır.
TD5: her düğüm bir güven bölgesine yerleşir ve bölgenin sayısal bir güven düzeyi vardır. TD6: düğüm üç türden biridir — dış varlık, süreç, veri deposu. TD7: her akış bir veri sınıfı taşır. TD8: iki ucunun bölgesi farklı olan akış güven sınırını (trust boundary) geçer; sınırı geçen her akış aşağıdaki dört kuralla kalem doğurur, sınırı geçmeyen akış hiçbir kalem doğurmaz.
// tehdit/cizge.mjs — kurgu bolgesel olcum agi yaziliminin veri akis cizgesi (model): // gercek bir sistem, gercek bir ana makine adi ya da gercek bir hizmet ucu yoktur. // Cizge yalnizca "kim kimden ne aliyor" der; hicbir saldiri adimi tasimaz. // TD5: her dugum bir guven bolgesine yerlesir ve bolgenin bir guven duzeyi vardir. export const BOLGE = { internet: 0, saha: 1, "dis-uc": 2, ic: 3, yonetim: 4, veri: 5 }; // TD6: dugum "ad tur bolge" biciminde yazilir; tur dis varlik (D), surec (S) ya da depo (P). export const DUGUM = Object.fromEntries(` abone D internet | denetim-kurumu D internet | sayac-cihazi D saha | saha-ekibi D saha abone-portali S dis-uc | toplama-ucu S dis-uc | saha-uygulamasi S saha dogrulayici S ic | faturalama S ic | is-emri S ic | rapor-ureteci S ic | kimlik-servisi S ic yonetim-konsolu S yonetim | olcum-deposu P veri | fatura-deposu P veri kimlik-deposu P veri | denetim-gunlugu P veri` .trim().split(/\s*[|\n]\s*/).map((r) => { const [ad, tur, bolge] = r.trim().split(/\s+/); return [ad, { ad, tur, bolge, duzey: BOLGE[bolge] }]; })); // TD7: akis "kaynak hedef sinif" biciminde yazilir; sinif tasinan veri sinifidir. export const AKIS = ` abone abone-portali kimlik | abone-portali kimlik-servisi kimlik kimlik-servisi kimlik-deposu kimlik | abone-portali faturalama fatura faturalama fatura-deposu fatura | faturalama abone-portali fatura sayac-cihazi toplama-ucu olcum | toplama-ucu dogrulayici olcum dogrulayici olcum-deposu olcum | dogrulayici faturalama olcum saha-ekibi saha-uygulamasi kimlik | saha-uygulamasi is-emri emir is-emri saha-uygulamasi emir | is-emri olcum-deposu olcum saha-uygulamasi toplama-ucu olcum | yonetim-konsolu dogrulayici ayar yonetim-konsolu toplama-ucu ayar | yonetim-konsolu kimlik-servisi ayar rapor-ureteci olcum-deposu olcum | rapor-ureteci fatura-deposu fatura denetim-kurumu rapor-ureteci kimlik | rapor-ureteci denetim-kurumu fatura faturalama denetim-gunlugu kayit | kimlik-servisi denetim-gunlugu kayit is-emri denetim-gunlugu kayit | faturalama is-emri emir` .trim().split(/\s*[|\n]\s*/).map((r) => { const [kaynak, hedef, sinif] = r.trim().split(/\s+/); return { kaynak, hedef, sinif, ad: `${kaynak}->${hedef}` }; }); // TD8: bir akis, iki ucunun bolgesi farkliysa guven sinirini gecer. Sinir gecen her akis // asagidaki dort kuralla kalem dogurur; sinir gecmeyen akis hicbir kalem dogurmaz. export function kalemler(a, bolgeAl = (d) => DUGUM[d].bolge, duzeyAl = (d) => DUGUM[d].duzey) { if (bolgeAl(a.kaynak) === bolgeAl(a.hedef)) return []; const k = []; if (duzeyAl(a.kaynak) < duzeyAl(a.hedef)) k.push("girdi-dogrulama", "kaynak-kimligi"); if (duzeyAl(a.kaynak) > duzeyAl(a.hedef)) k.push("cikti-suzme"); if (a.sinif === "kimlik" || a.sinif === "fatura") k.push("aktarim-korumasi"); if (DUGUM[a.hedef].tur === "P") k.push("yetkilendirme"); return k; }
// tehdit/sinir.mjs — guven sinirini gecen akis sayisi, her gecisin tasidigi kalem ve // sinir cozunurlugu dustugunde kac akisin gorunmez kaldigi. import { BOLGE, DUGUM, AKIS, kalemler } from "./cizge.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 gecen = AKIS.filter((a) => DUGUM[a.kaynak].bolge !== DUGUM[a.hedef].bolge); console.log(`${Object.keys(DUGUM).length} dugum, ${AKIS.length} akis, ` + `${Object.keys(BOLGE).length} guven bolgesi; sinir gecen akis ${gecen.length}, ` + `sinir gecmeyen ${AKIS.length - gecen.length}`); const A = [-12, 8, 12, 8, 7, 12, 13]; console.log("\n1. bolgeler ve icerdikleri"); yaz(A, "bolge", "duzey", "dis varlik", "surec", "depo", "cikan akis", "sinir gecen"); for (const [b, d] of Object.entries(BOLGE)) { const ds = Object.values(DUGUM).filter((x) => x.bolge === b); const cikan = AKIS.filter((a) => DUGUM[a.kaynak].bolge === b); yaz(A, b, d, ds.filter((x) => x.tur === "D").length, ds.filter((x) => x.tur === "S").length, ds.filter((x) => x.tur === "P").length, cikan.length, cikan.filter((a) => DUGUM[a.hedef].bolge !== b).length); } const B = [-33, -9, -9, -50]; console.log("\n2. sinir gecen her akis ve dogurdugu kalem"); yaz(B, "akis", "sinif", "duzey", "dogan kalem"); for (const a of gecen) yaz(B, a.ad, a.sinif, `${DUGUM[a.kaynak].duzey}->${DUGUM[a.hedef].duzey}`, kalemler(a).join(" ")); const TUM = gecen.flatMap((a) => kalemler(a)); console.log(`sinir gecen ${gecen.length} akis toplam ${TUM.length} kalem doguruyor, ` + `akis basina ${(TUM.length / gecen.length).toFixed(2)}`); const C = [-20, 10, 12, 12]; console.log("\n3. kalem turune gore"); yaz(C, "kalem turu", "sayi", "kalem %", "akis %"); for (const t of [...new Set(TUM)].sort()) { const n = TUM.filter((x) => x === t).length; yaz(C, t, n, ((n / TUM.length) * 100).toFixed(1), ((n / AKIS.length) * 100).toFixed(1)); } // Cozunurluk: ayni cizge uc ayri sinir cizimiyle olculur. Kaba cizim yalnizca dis/ic // ayrimini tanir; sinirsiz cizim butun dugumleri tek bolgede sayar. const KABA = { internet: "dis", saha: "dis", "dis-uc": "ic", ic: "ic", yonetim: "ic", veri: "ic" }; const cizim = { "sinir cizilmemis": { b: () => "tek", d: () => 0 }, "kaba: dis/ic": { b: (x) => KABA[DUGUM[x].bolge], d: (x) => (KABA[DUGUM[x].bolge] === "dis" ? 0 : 1) }, "ayrintili: 6 bolge": { b: (x) => DUGUM[x].bolge, d: (x) => DUGUM[x].duzey }, }; const D = [-20, 12, 12, 13, 12]; console.log("\n4. sinir cozunurlugu dustugunde ne gorunmez kaliyor"); yaz(D, "cizim", "gorulen akis", "gorulen %", "dogan kalem", "kalem %"); const tam = { akis: gecen.length, kalem: TUM.length }; for (const [ad, c] of Object.entries(cizim)) { const g = AKIS.filter((a) => c.b(a.kaynak) !== c.b(a.hedef)); const k = g.flatMap((a) => kalemler(a, c.b, c.d)); yaz(D, ad, g.length, ((g.length / tam.akis) * 100).toFixed(1), k.length, ((k.length / tam.kalem) * 100).toFixed(1)); } const kaba = cizim["kaba: dis/ic"]; const kabaG = AKIS.filter((a) => kaba.b(a.kaynak) !== kaba.b(a.hedef)); const kacan = gecen.filter((a) => !kabaG.includes(a)); console.log(`kaba cizimde gorunmeyen ${kacan.length} sinir gecisi ` + `${kacan.flatMap((a) => kalemler(a)).length} kalem tasiyor; bunlarin ` + `${kacan.filter((a) => DUGUM[a.hedef].tur === "P").length} tanesi bir veri deposuna giriyor`);
17 dugum, 26 akis, 6 guven bolgesi; sinir gecen akis 23, sinir gecmeyen 3 1. bolgeler ve icerdikleri bolge duzey dis varlik surec depo cikan akis sinir gecen internet 0 2 0 0 2 2 saha 1 2 1 0 4 3 dis-uc 2 0 2 0 3 3 ic 3 0 5 0 14 12 yonetim 4 0 1 0 3 3 veri 5 0 0 4 0 0 2. sinir gecen her akis ve dogurdugu kalem akis sinif duzey dogan kalem abone->abone-portali kimlik 0->2 girdi-dogrulama kaynak-kimligi aktarim-korumasi abone-portali->kimlik-servisi kimlik 2->3 girdi-dogrulama kaynak-kimligi aktarim-korumasi kimlik-servisi->kimlik-deposu kimlik 3->5 girdi-dogrulama kaynak-kimligi aktarim-korumasi yetkilendirme abone-portali->faturalama fatura 2->3 girdi-dogrulama kaynak-kimligi aktarim-korumasi faturalama->fatura-deposu fatura 3->5 girdi-dogrulama kaynak-kimligi aktarim-korumasi yetkilendirme faturalama->abone-portali fatura 3->2 cikti-suzme aktarim-korumasi sayac-cihazi->toplama-ucu olcum 1->2 girdi-dogrulama kaynak-kimligi toplama-ucu->dogrulayici olcum 2->3 girdi-dogrulama kaynak-kimligi dogrulayici->olcum-deposu olcum 3->5 girdi-dogrulama kaynak-kimligi yetkilendirme saha-uygulamasi->is-emri emir 1->3 girdi-dogrulama kaynak-kimligi is-emri->saha-uygulamasi emir 3->1 cikti-suzme is-emri->olcum-deposu olcum 3->5 girdi-dogrulama kaynak-kimligi yetkilendirme saha-uygulamasi->toplama-ucu olcum 1->2 girdi-dogrulama kaynak-kimligi yonetim-konsolu->dogrulayici ayar 4->3 cikti-suzme yonetim-konsolu->toplama-ucu ayar 4->2 cikti-suzme yonetim-konsolu->kimlik-servisi ayar 4->3 cikti-suzme rapor-ureteci->olcum-deposu olcum 3->5 girdi-dogrulama kaynak-kimligi yetkilendirme rapor-ureteci->fatura-deposu fatura 3->5 girdi-dogrulama kaynak-kimligi aktarim-korumasi yetkilendirme denetim-kurumu->rapor-ureteci kimlik 0->3 girdi-dogrulama kaynak-kimligi aktarim-korumasi rapor-ureteci->denetim-kurumu fatura 3->0 cikti-suzme aktarim-korumasi faturalama->denetim-gunlugu kayit 3->5 girdi-dogrulama kaynak-kimligi yetkilendirme kimlik-servisi->denetim-gunlugu kayit 3->5 girdi-dogrulama kaynak-kimligi yetkilendirme is-emri->denetim-gunlugu kayit 3->5 girdi-dogrulama kaynak-kimligi yetkilendirme sinir gecen 23 akis toplam 58 kalem doguruyor, akis basina 2.52 3. kalem turune gore kalem turu sayi kalem % akis % aktarim-korumasi 9 15.5 34.6 cikti-suzme 6 10.3 23.1 girdi-dogrulama 17 29.3 65.4 kaynak-kimligi 17 29.3 65.4 yetkilendirme 9 15.5 34.6 4. sinir cozunurlugu dustugunde ne gorunmez kaliyor cizim gorulen akis gorulen % dogan kalem kalem % sinir cizilmemis 0 0.0 0 0.0 kaba: dis/ic 7 30.4 15 25.9 ayrintili: 6 bolge 23 100.0 58 100.0 kaba cizimde gorunmeyen 16 sinir gecisi 43 kalem tasiyor; bunlarin 9 tanesi bir veri deposuna giriyor
Sayılar ölçüm sınıfındadır; girdileri TD5–TD8’dir.
Yirmi Üç Geçiş
On yedi düğüm, yirmi altı akış, altı güven bölgesi. Bu üç sayıdan hiçbiri tehdit modellemenin girdisi değildir; girdi olan sayı 23’tür — güven sınırını geçen akış sayısı. Yirmi altı akışın yalnız üçü aynı bölge içinde kalır: saha ekibinin kendi uygulamasıyla konuşması, doğrulayıcının faturalamaya ölçüm vermesi ve faturalamanın iş emri üretmesi.
Bu oran çizgenin biçiminden gelir. Bölgeler yalıtımı artırmak için konur, ama iş akışı bölgeleri
dolaşmak zorundadır: abonenin isteği internet bölgesinden başlar ve veri bölgesinde biter, yani
tek bir işlemde üç ayrı sınır geçilir. Birinci tablonun son sütunu bunu bölge bölge yazar. ic
bölgesinden çıkan on dört akışın on ikisi bölgeyi terk eder; veri bölgesinden hiçbir akış
çıkmaz, çünkü depolar yalnız yazılan ve okunan uçlardır.
Güvenlik açısından tek başına anlamlı olan sayı budur. Saldırı Yüzeyi dersinde yüzey bir yol sayısıyla ölçülmüştü; tasarım aşamasında elde henüz yol yoktur, yalnız akış vardır. Bu aşamada yüzeyin sayılabilir karşılığı güven sınırını geçen akış sayısıdır ve o sayı sınırların nereye çizildiğine bağlıdır.
Geçişin Doğurduğu Kalem
İkinci tablo her sınır geçişini kalem listesine çevirir. Yirmi üç geçiş 58 kalem doğurur; geçiş başına 2,52. Kural kümesi dört maddedir ve hiçbiri sezgiye dayanmaz: güven düzeyi düşükten yükseğe geçen akış girdi doğrulama ve kaynak kimliği ister, tersi yönde giden akış çıktı süzme ister, kimlik ya da fatura sınıfı veri taşıyan akış aktarım koruması ister, bir veri deposuna giren akış yetkilendirme ister.
Üçüncü tablo dağılımı verir. girdi-dogrulama ve kaynak-kimligi on yedişer kalemle ilk
sıradadır; ikisi birlikte 58 kalemin %58,6’sını taşır. İkisinin de tek kaynağı vardır: yirmi
üç geçişin on yedisi düşük güven düzeyinden yükseğe gider. cikti-suzme altı kalemle en küçük
gruptur, aktarim-korumasi ve yetkilendirme dokuzar kalemle ortadadır.
En kalabalık satırlar dört kalem birden doğurur: kimlik-servisi->kimlik-deposu,
faturalama->fatura-deposu ve rapor-ureteci->fatura-deposu. Üçü de düşükten yükseğe gider,
korunması gereken bir veri sınıfı taşır ve bir depoya yazar. En yalın satır ise
is-emri->saha-uygulamasi: tek kalem, cikti-suzme. Kalem sayısı akışın önemiyle değil,
kaç kuralı birden tetiklediğiyle belirlenir; bu ayrım yöntemin sistematik olmasını sağlayan
şeydir.
Aynı sistematiklik kuralın kör noktasını da üretir. Yönetim konsolu beşinci güven düzeyinden
sonraki en yüksek düzeydedir ve çıkan üç akışının üçü de aşağı yönlüdür; bu yüzden üçünde de
yalnız cikti-suzme doğar, hiçbirinde girdi-dogrulama doğmaz. Kural kümesi açısından bu
tutarlıdır — daha güvenilir bir kaynaktan gelen veri doğrulanmaz — ama üç akışın taşıdığı şey
ayar sınıfıdır ve doğrulayıcının ayarını değiştirmek ölçüm zincirinin tamamını etkiler.
Güven düzeyi bir sıralamadır, bir bağışıklık belgesi değildir. Sistematik üretimin ürettiği
kalem kümesi, güven düzeyi atamalarının doğruluğunun ötesine geçemez; atama yanlışsa yöntem sessiz
kalır ve bu sessizlik hiçbir tabloda bir sıfır olarak görünmez.
Sınır Çizilmediğinde
Dördüncü tablo bu dersin en dikkat çekici sonucudur. Aynı yirmi altı akış üç ayrı çizim çözünürlüğüyle ölçülür ve sonuç üç ayrı sayı verir.
Sınır hiç çizilmemişse bütün düğümler tek bölgede sayılır: sıfır geçiş, sıfır kalem. Sistem değişmemiştir, yalnız ölçüsü yok edilmiştir. Bu, tehdit modelleme oturumunun sıfır kalemle bitmesinin en yaygın sebebidir — çizge çizilmiştir ama üzerine sınır konmamıştır.
Kaba çizim — yalnız dış ve iç ayrımı — 7 geçiş görür, yani gerçek geçişlerin %30,4’ünü, ve 15 kalem doğurur, yani %25,9’unu. Ayrıntılı çizim 23 geçiş ve 58 kalem verir. Aradaki fark 16 geçiş ve 43 kalemdir; bu kalemlerin dokuzu bir veri deposuna giren akışlardan gelir.
Kaybın nerede olduğu açıktır. Kaba çizim iç ağı tek bir güvenli kutu sayar, dolayısıyla
dogrulayici->olcum-deposu, faturalama->fatura-deposu ya da yonetim-konsolu->kimlik-servisi
gibi akışlar hiç sınır geçmemiş olur. Bunlar sistemin en yüksek değerli akışlarıdır: kimlik ve
fatura verisinin depolara yazıldığı yerdir. Sınır çözünürlüğü düştükçe kaybolan kalemler
rastgele seçilmez; iç bölgede kalanlar kaybolur ve iç bölgede duran şey deponun kendisidir.
Buradan çıkan kural sadedir: bir tehdit modelleme oturumunun ilk çıktısı tehdit listesi değil, bölge listesidir. Bölge sayısı ile bulunabilecek kalem sayısı aynı yönde hareket eder ve bölgeler yanlış çizildiğinde sonraki bütün adımlar eksik bir küme üzerinde koşar.
Özet
- Tasarım aşamasında yüzeyin sayılabilir karşılığı güven sınırını geçen akış sayısıdır: 17 düğüm ve 26 akışlık çizgede 23 akış sınır geçer, yalnız 3’ü aynı bölge içinde kalır.
- Sınır geçen 23 akış dört kuralla 58 kalem doğurur; geçiş başına 2,52. Kalem sayısı akışın önemine değil, akışın kaç kuralı birden tetiklediğine bağlıdır.
- Kalemlerin %58,6’sı düşük güven düzeyinden yükseğe giden 17 akıştan gelir; çıktı süzme yalnız 6 kalemle en küçük gruptur.
- Sınır hiç çizilmediğinde ölçüm sıfır geçiş, sıfır kalem verir; sistem değişmemiş, yalnız ölçüsü yok edilmiştir.
- Kaba bir dış/iç çizimi 23 geçişin 7’sini ve 58 kalemin 15’ini görür; görünmez kalan 16 geçiş 43 kalem taşır ve bunların 9’u bir veri deposuna giren akıştır.
Sonraki Adım
Bu ders sayılabilir bir yüzey üretti: 23 geçiş ve 58 kalem. Ama 58 kalem bir tehdit listesi değildir — kalemler denetim türleridir, yani “burada bir kimlik doğrulaması gerekir” der, “burada şu şey olabilir” demez. İkisi arasındaki fark yöntemin ikinci adımıdır.
Bir çizge öğesine bakıp “burada ne ters gidebilir” sorusunu sormak kişiye ve o günkü dikkate bağlıdır. Bunu kişiden bağımsız hale getiren şey, öğe türü başına sabit bir kategori listesi uygulamaktır: her akışa, her sürece ve her depoya aynı soruların sorulması. Sonraki ders bu sistematik üretimi koşturur ve iki sayıyı ayırır: yöntem kaç tehdit üretiyor ve bunların kaçı bu sistem için gerçekten geçerli. Üretim ucuzdur; eleme pahalıdır ve dakikası ölçülür.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.