İçeriğe geç
academia.sh

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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat