İçeriğe geç
academia.sh

Ders 06 / 11

Tehdit Modellemenin Amacı

Tehdit modelleme oturumunun kendi ölçüsü: 18 kalemlik envanterde oturumun 40 geliştirici saati sürüp 10 kalem bulması, kalem başına 4,0 saate karşılık 866 saat kurtarması, aynı kalemin geç yakalandığında 4 ile 30 kat arasında değişen bir maliyet farkı üretmesi, toplam düzeltme saatinin 1.872'den 1.006'ya inmesi ve oturumun hiç dokunmadığı sekiz kalemin toplam saatin %48,4'ünü taşıması.

İçindekiler

Önceki konu güvenlik işini aşamalara dağıttı, gereksinimi sınanabilir biçimde yazdı ve sınırlı geliştirme kapasitesinin nasıl bölüneceğini sordu. Bütün o hesapların ortak girdisi hazır bir kalem listesiydi: hangi açığın var olduğu biliniyordu, tartışılan yalnız sırasıydı. Oysa tasarım aşamasında böyle bir liste kendiliğinden ortaya çıkmaz.

Tehdit modelleme, o listeyi tasarım aşamasında üretmenin yöntemidir. Bu ders yöntemin adımlarını değil, amacını ve fiyatını ölçer: oturum kaç saat sürer, kaç kalem bulur, kalem başına kaç saat harcar ve bulduğu kalem geç yakalansaydı kaç kat pahalıya gelirdi. Konu boyunca aynı kurgu bölgesel ölçüm ağının yazılımı üzerinde çalışılır.

Oturum Nerede Durur

Aşağıdaki envanter bir modeldir: gerçek bir ürün, gerçek bir ekip ölçümü ya da gerçek bir kayıt yoktur. Kalemler yalnız üç sütunla anılır — nerede doğdukları, nerede görülebildikleri ve düzeltmelerinin kaç geliştirici saati tuttuğu. Hiçbir istismar adımı yazılmaz.

TD1: düzeltme işi geliştirici saati olarak ölçülür; taban saat kalemin tasarım aşamasındaki karşılığıdır ve sonraki aşamalarda bir çarpanla büyür. TD2: her kalemin doğduğu aşama ile görülebildiği aşama ayrı şeylerdir; kodda doğan bir kalem yalnız çalışma zamanında görülebilir olabilir. TD3: oturum tasarım aşamasında koşar ve yalnız görülür aşaması tasarımdan geç olmayan kalemleri bulur. TD4: oturumun bedeli katılımcı sayısı ile süresinin çarpımıdır.

// tehdit/kalem.mjs — asama kumesi ve kalem envanteri (model): kurgu bolgesel olcum agi
// yaziliminin gelistirme kayitlarindan turetilmistir, gercek bir olcum degildir. Hicbir
// istismar adimi yoktur; kalem yalnizca nerede dogdugu, nerede gorulebildigi ve
// duzeltmesinin kac gelistirici saati oldugu ile yazilir.

export const ASAMA = ["gereksinim", "tasarim", "kod", "yapi", "dagitim", "calisma-zamani"];

// TD1: duzeltme isi gelistirici saati olarak olculur. `taban`, kalemin tasarim asamasinda
// duzeltilmesinin saatidir; sonraki asamalarda asagidaki carpanla buyur.
export const CARPAN = { gereksinim: 1, tasarim: 1, kod: 4, yapi: 6, dagitim: 12,
  "calisma-zamani": 30 };

// TD2: satirlar "ad dogus gorulur varsayilan taban" biciminde yazilir. `dogus` kalemin
// uretildigi, `gorulur` en erken gorulebildigi, `varsayilan` tehdit modelleme oturumu
// olmadiginda fiilen yakalandigi asamadir.
export const KALEM = `
  guven-siniri-cizilmemis          tasarim     tasarim         dagitim          6
  sayac-kimligi-dogrulanmiyor      tasarim     tasarim         calisma-zamani   8
  fatura-kaydi-degistirilebilir    tasarim     tasarim         dagitim         10
  abone-verisi-korumasiz-akiyor    tasarim     tasarim         dagitim          4
  yetki-karari-istemcide           tasarim     tasarim         kod              7
  denetim-gunlugu-eksik            gereksinim  tasarim         calisma-zamani   5
  saha-cihazi-sir-tasiyor          tasarim     tasarim         dagitim          9
  rapor-ucu-kimliksiz              tasarim     tasarim         kod              3
  olcum-yedegi-korumasiz           tasarim     tasarim         calisma-zamani   6
  oturum-suresi-tanimsiz           gereksinim  tasarim         kod              2
  girdi-uzunlugu-sinirsiz          kod         kod             yapi             2
  sorgu-birlestirmesi-elle         kod         kod             yapi             4
  zamanlama-farki-sizdiriyor       kod         kod             calisma-zamani   5
  eszamanli-istek-yaris-kosulu     kod         calisma-zamani  calisma-zamani  12
  bagimlilik-surumu-sabitlenmemis  yapi        yapi            dagitim          3
  imaj-icinde-artik-arac           yapi        yapi            dagitim          2
  varsayilan-kimlik-bilgisi-acik   dagitim     dagitim         calisma-zamani   4
  gunluk-kaydinda-kimlik-bilgisi   kod         calisma-zamani  calisma-zamani   6`
  .trim().split("\n").map((r) => {
    const [ad, dogus, gorulur, varsayilan, taban] = r.trim().split(/\s+/);
    return { ad, dogus, gorulur, varsayilan, taban: +taban };
  });

export const sira = (a) => ASAMA.indexOf(a);
export const maliyet = (k, asama) => k.taban * CARPAN[asama];

// TD3: tehdit modelleme oturumu tasarim asamasinda kosar ve yalnizca `gorulur` asamasi
// tasarimdan gec olmayan kalemleri bulur; kalanlarina hic dokunmaz.
export const bulunur = (k) => sira(k.gorulur) <= sira("tasarim");

// TD4: oturumun bedeli katilimci sayisi x oturum sayisi x oturum suresidir.
export const OTURUM = { katilimci: 5, sayi: 4, saat: 2 };
export const OTURUM_SAAT = OTURUM.katilimci * OTURUM.sayi * OTURUM.saat;
// tehdit/oturum.mjs — oturum kac saat suruyor, kac kalem buluyor, kalem basina kac saat
// ve ayni kalem gec yakalandiginda maliyeti kac kat.
import { ASAMA, CARPAN, KALEM, OTURUM, OTURUM_SAAT, sira, maliyet, bulunur } from "./kalem.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 topla = (ks, f) => ks.reduce((s, k) => s + f(k), 0);
const bulunan = KALEM.filter(bulunur), kacan = KALEM.filter((k) => !bulunur(k));

console.log(`${KALEM.length} kalem, ${ASAMA.length} asama; carpanlar ` +
  `${ASAMA.map((a) => `${a} x${CARPAN[a]}`).join(", ")}`);

const A = [-33, -12, -16, -16, 9, 11, 14, 6];
console.log("\n1. kalem nerede doguyor, nerede gorulebiliyor, nerede yakalaniyor");
yaz(A, "kalem", "dogus", "gorulur", "varsayilan", "gecikme", "tasarimda", "varsayilanda", "kat");
for (const k of KALEM) {
  const t = maliyet(k, "tasarim"), v = maliyet(k, k.varsayilan);
  yaz(A, k.ad, k.dogus, k.gorulur, k.varsayilan,
    sira(k.varsayilan) - sira(k.dogus), t, v, (v / t).toFixed(1));
}

const B = [-16, 8, 10, 17, 9, 9];
console.log("\n2. gorulur asamasina gore kalem sinifi");
yaz(B, "gorulur asama", "kalem", "kalem %", "varsayilan saat", "saat %", "oturum");
for (const a of ASAMA) {
  const g = KALEM.filter((k) => k.gorulur === a);
  if (!g.length) continue;
  const s = topla(g, (k) => maliyet(k, k.varsayilan));
  yaz(B, a, g.length, ((g.length / KALEM.length) * 100).toFixed(1), s,
    ((s / topla(KALEM, (k) => maliyet(k, k.varsayilan))) * 100).toFixed(1),
    sira(a) <= sira("tasarim") ? "bulur" : "bulmaz");
}

const OTURUMSUZ = topla(KALEM, (k) => maliyet(k, k.varsayilan));
const OTURUMLU = topla(bulunan, (k) => maliyet(k, "tasarim")) +
  topla(kacan, (k) => maliyet(k, k.varsayilan)) + OTURUM_SAAT;
const C = [-34, 14, 22];
console.log("\n3. oturumun kendi olcusu");
for (const [ad, x, y] of [
  ["oturum sayisi x katilimci x saat", `${OTURUM.sayi}x${OTURUM.katilimci}x${OTURUM.saat}`,
    OTURUM_SAAT + " saat"],
  ["bulunan kalem", bulunan.length, (OTURUM_SAAT / bulunan.length).toFixed(1) + " saat/kalem"],
  ["dokunulmayan kalem", kacan.length, ((kacan.length / KALEM.length) * 100).toFixed(1) + " %"],
  ["oturumsuz toplam duzeltme", OTURUMSUZ + " saat", "-"],
  ["oturumlu toplam duzeltme", OTURUMLU + " saat", (OTURUMSUZ / OTURUMLU).toFixed(2) + " kat"],
  ["oturumun kurtardigi saat", OTURUMSUZ - OTURUMLU + " saat",
    ((OTURUMSUZ - OTURUMLU) / OTURUM_SAAT).toFixed(1) + " x oturum saati"],
]) yaz(C, ad, x, y);

const D = [-22, 8, 16, 15, 8];
console.log("\n4. oturumun degdigi ve degmedigi kalemler ayri ayri");
yaz(D, "kume", "kalem", "oturumsuz saat", "oturumlu saat", "kat");
for (const [ad, ks, saat] of [
  ["oturumun buldugu", bulunan, topla(bulunan, (k) => maliyet(k, "tasarim"))],
  ["oturumun bulmadigi", kacan, topla(kacan, (k) => maliyet(k, k.varsayilan))],
]) {
  const o = topla(ks, (k) => maliyet(k, k.varsayilan));
  yaz(D, ad, ks.length, o, saat, (o / saat).toFixed(1));
}
const enGec = [...KALEM].sort((x, y) =>
  maliyet(y, y.varsayilan) - maliyet(x, x.varsayilan))[0];
console.log(`en pahali tek kalem ${enGec.ad}: ${maliyet(enGec, enGec.varsayilan)} saat, ` +
  `oturum bunu ${bulunur(enGec) ? "bulur" : "bulmaz"}; oturumun bulmadigi ` +
  `${kacan.length} kalem toplam duzeltme saatinin ` +
  `%${((topla(kacan, (k) => maliyet(k, k.varsayilan)) / OTURUMSUZ) * 100).toFixed(1)}'ini tasiyor`);
18 kalem, 6 asama; carpanlar gereksinim x1, tasarim x1, kod x4, yapi x6, dagitim x12, calisma-zamani x30

1. kalem nerede doguyor, nerede gorulebiliyor, nerede yakalaniyor
kalem                            dogus       gorulur         varsayilan        gecikme  tasarimda  varsayilanda   kat
guven-siniri-cizilmemis          tasarim     tasarim         dagitim                 3          6            72  12.0
sayac-kimligi-dogrulanmiyor      tasarim     tasarim         calisma-zamani          4          8           240  30.0
fatura-kaydi-degistirilebilir    tasarim     tasarim         dagitim                 3         10           120  12.0
abone-verisi-korumasiz-akiyor    tasarim     tasarim         dagitim                 3          4            48  12.0
yetki-karari-istemcide           tasarim     tasarim         kod                     1          7            28   4.0
denetim-gunlugu-eksik            gereksinim  tasarim         calisma-zamani          5          5           150  30.0
saha-cihazi-sir-tasiyor          tasarim     tasarim         dagitim                 3          9           108  12.0
rapor-ucu-kimliksiz              tasarim     tasarim         kod                     1          3            12   4.0
olcum-yedegi-korumasiz           tasarim     tasarim         calisma-zamani          4          6           180  30.0
oturum-suresi-tanimsiz           gereksinim  tasarim         kod                     2          2             8   4.0
girdi-uzunlugu-sinirsiz          kod         kod             yapi                    1          2            12   6.0
sorgu-birlestirmesi-elle         kod         kod             yapi                    1          4            24   6.0
zamanlama-farki-sizdiriyor       kod         kod             calisma-zamani          3          5           150  30.0
eszamanli-istek-yaris-kosulu     kod         calisma-zamani  calisma-zamani          3         12           360  30.0
bagimlilik-surumu-sabitlenmemis  yapi        yapi            dagitim                 1          3            36  12.0
imaj-icinde-artik-arac           yapi        yapi            dagitim                 1          2            24  12.0
varsayilan-kimlik-bilgisi-acik   dagitim     dagitim         calisma-zamani          1          4           120  30.0
gunluk-kaydinda-kimlik-bilgisi   kod         calisma-zamani  calisma-zamani          3          6           180  30.0

2. gorulur asamasina gore kalem sinifi
gorulur asama      kalem   kalem %  varsayilan saat   saat %   oturum
tasarim               10      55.6              966     51.6    bulur
kod                    3      16.7              186      9.9   bulmaz
yapi                   2      11.1               60      3.2   bulmaz
dagitim                1       5.6              120      6.4   bulmaz
calisma-zamani         2      11.1              540     28.8   bulmaz

3. oturumun kendi olcusu
oturum sayisi x katilimci x saat           4x5x2               40 saat
bulunan kalem                                 10        4.0 saat/kalem
dokunulmayan kalem                             8                44.4 %
oturumsuz toplam duzeltme              1872 saat                     -
oturumlu toplam duzeltme               1006 saat              1.86 kat
oturumun kurtardigi saat                866 saat   21.6 x oturum saati

4. oturumun degdigi ve degmedigi kalemler ayri ayri
kume                     kalem  oturumsuz saat  oturumlu saat     kat
oturumun buldugu            10             966             60    16.1
oturumun bulmadigi           8             906            906     1.0
en pahali tek kalem eszamanli-istek-yaris-kosulu: 360 saat, oturum bunu bulmaz; oturumun bulmadigi 8 kalem toplam duzeltme saatinin %48.4'ini tasiyor

Sayılar ölçüm sınıfındadır; girdileri TD1–TD4’tür.

Kırk Saatlik Oturum

Üçüncü tablo bu dersin ana sorusunu yanıtlar. Dört oturum, beş katılımcı, oturum başına iki saat: toplam 40 geliştirici saati. Oturum on kalem bulur, yani kalem başına 4,0 saat. Bu sayı tehdit modellemeyi bir yöntem olarak değil, bir iş kalemi olarak yazar; onay isteyen bir ekip için tartışılabilir olan tek biçim budur.

Karşılığı aynı satırda durur. Oturum olmasaydı on sekiz kalemin toplam düzeltme işi 1.872 saat olurdu; oturumla birlikte 1.006 saate iner. Fark 866 saattir ve harcanan 40 saatin 21,6 katıdır. Bu oranın büyüklüğü tek bir şeyden gelir: oturumun bulduğu kalemler zaten geç aşamada yakalanacak kalemlerdi ve geç aşamanın çarpanı yüksekti.

Toplam üzerinden bakıldığında ise kazanç çok daha ölçülüdür: 1.872 saat 1.006 saate iner, yani 1,86 kat. Aynı ölçüm iki farklı büyüklük verir ve ikisi de doğrudur. Oturumun değdiği kalemler için oran 16,1’dir; bütün envanter için 1,86. Hangi sayının yazıldığı, oturumun neyi kapsadığının açıkça söylenip söylenmediğine bağlıdır.

Aynı Kalem, Üç Aşama Sonra

Birinci tablonun son sütunu her kalem için tek soruyu yanıtlar: aynı kalem varsayılan aşamasında yakalandığında tasarımdakinin kaç katına mal olur. Değerler 4,0 ile 30,0 arasında dağılır ve bu aralık dersin en önemli bulgusudur — “geç yakalamak pahalıdır” cümlesi tek bir kat sayısı taşımaz, kalemin nereye kadar gidebildiğine bağlı bir dağılım taşır.

Uçları karşılaştırmak yeterlidir. yetki-karari-istemcide kodda yakalanır: 7 saat yerine 28 saat, kat 4,0. sayac-kimligi-dogrulanmiyor çalışma zamanına kadar gider: 8 saat yerine 240 saat, kat 30,0. İki kalemin taban saati birbirine yakındır; aradaki otuz katlık farkı üreten şey kalemin kendi büyüklüğü değil, kaç aşama boyunca görülmeden ilerlediğidir.

gecikme sütunu bunu doğrudan sayar. denetim-gunlugu-eksik gereksinim aşamasında doğar ve çalışma zamanında yakalanır: beş aşama geç. Aynı kalemin taban saati yalnız 5’tir; beş aşama gecikme onu 150 saate çıkarır. Buna karşılık imaj-icinde-artik-arac yapı aşamasında doğar ve dağıtımda yakalanır — bir aşama geç, 2 saat yerine 24. Envanterin en pahalı kalemi olan eszamanli-istek-yaris-kosulu ise üç aşama gecikmeyle 360 saate ulaşır ve tek başına oturumsuz toplamın yaklaşık beşte birini taşır.

Kapsama Tavanı

Birinci tablonun dogus sütunu tek başına okunduğunda oturumun üst sınırını verir. Envanterin 2 kalemi gereksinim, 8 kalemi tasarım, 5 kalemi kod, 2 kalemi yapı, 1 kalemi dağıtım aşamasında doğar. Tasarım aşaması bittiğinde henüz doğmamış olan kalem sayısı sekizdir.

Bir kalem doğmadan görülemez; gorulur sütunu hiçbir satırda dogus sütunundan erken olamaz. Bu, oturumun kapsamına yapısal bir tavan koyar: tasarımdan sonra doğan hiçbir kalem tasarım oturumunda bulunamaz — o kalem oturum yürütülürken henüz yoktur. Sekiz kalemin dışarıda kalması oturumun kalitesizliğinden değil, sırasından gelir.

Tavanın altında ise oturumun kendi başarısı ölçülür. Gereksinim ve tasarım aşamasında doğan on kalemin onunda da gorulur sütunu tasarımı gösterir; bu envanterde oturum tavanın tamamına ulaşır. Gerçek bir oturumda bu oran daha düşüktür ve iki sayı ayrı yazılmalıdır: kaç kalem yapısal olarak bulunabilirdi, bunların kaçı fiilen bulundu. İkisi karıştırıldığında %100 kapsama bildiren bir ekip, envanterin %44,4’ünü hiç ölçmemiş olur.

İki kalem bu ayrımı doğrudan gösterir. eszamanli-istek-yaris-kosulu ve gunluk-kaydinda-kimlik-bilgisi kod aşamasında doğar ama ancak çalışma zamanında görülür; ikisinin de gecikmesi üç aşamadır. Bunlar ne tasarım oturumunun ne de kodu okuyan bir denetimin kapsamındadır — doğdukları aşamada bile görünmezler.

Tasarımda Görülemeyen Sekiz Kalem

Dördüncü tablo bu dersin sınırını yazar. Oturumun değdiği on kalem 966 saatten 60 saate iner — 16,1 kat. Oturumun bulmadığı sekiz kalem ise 906 saatten 906 saate iner; kat 1,0. Oturum ne kadar iyi yürütülürse yürütülsün bu sekiz kaleme hiçbir şey yapmaz.

İkinci tablo o sekizin nerede durduğunu ayırır. Üç kalem ancak kodda görülebilir, iki kalem yapıda, bir kalem dağıtımda, iki kalem yalnız çalışma zamanında. Kalem sayısı olarak envanterin %44,4’ü, düzeltme saati olarak %48,4’üdür. Yani tasarım aşamasında yürütülen en eksiksiz oturum bile toplam işin yarısına yaklaşan bir bölümünü olduğu yerde bırakır.

Bu sınıf rastgele değildir. Yarış koşulu, zamanlama farkı ve günlük kaydına düşen kimlik bilgisi, tasarımda bir kutu ya da bir ok olarak görünmez; ancak yazılmış kodun ya da koşan sistemin davranışında ortaya çıkar. Tasarım belgesi bu kalemleri taşımaz, dolayısıyla tasarımı okuyan hiçbir oturum onları bulamaz. Çalışma zamanında görülebilen iki kalem tek başına 540 saat taşır — oturumun kurtardığı 866 saatin yaklaşık üçte ikisi kadar.

Buradan çıkan karar sadedir: tehdit modelleme oturumu, kendisinden sonra gelen denetimlerin yerine geçmez. Oturumun kapsama sınırı yazılmadan verilen “tasarımda hepsini yakalarız” cümlesi, ölçüldüğünde envanterin yarısını dışarıda bırakan bir iddiadır.

Özet

  • Tehdit modelleme oturumu ölçülebilir bir iş kalemidir: dört oturum, beş katılımcı, iki saat — 40 geliştirici saati, 10 kalem, kalem başına 4,0 saat.
  • Oturum 866 saat kurtarır; bu, harcanan 40 saatin 21,6 katıdır. Aynı ölçüm bütün envanter üzerinden 1,86 kat, yalnız değdiği kalemler üzerinden 16,1 kat verir.
  • Aynı kalemin geç yakalanma katı 4,0 ile 30,0 arasında dağılır; katı belirleyen şey kalemin büyüklüğü değil, kaç aşama boyunca görülmeden ilerlediğidir.
  • Beş aşama geciken 5 saatlik bir kalem 150 saate, bir aşama geciken 2 saatlik bir kalem 24 saate çıkar; gecikme sayısı taban saatten daha belirleyicidir.
  • Envanterin 8 kalemi tasarımda görülemez ve oturum onlara hiç dokunmaz — kalem sayısının %44,4’ü, düzeltme saatinin %48,4’ü. Bu kalemler için oturumun katı 1,0’dır.

Sonraki Adım

Bu ders oturumun fiyatını ve kapsama sınırını yazdı, ama oturumun içinde ne yapıldığını hiç açmadı. On kalemin nasıl bulunduğu bir kutu olarak kaldı: “tasarım okundu ve kalemler çıktı.”

Tasarımı okumak bir yöntem değildir; bir tasarım metni yüzlerce cümle içerir ve hangi cümlenin güvenlik kalemi doğurduğu belli değildir. Yöntemin ilk adımı, tasarımı üzerinde sayım yapılabilir bir yapıya çevirmektir: hangi bileşen hangi veriyi kimden alıp kime veriyor ve bu alışverişlerin hangileri bir güven düzeyinden başka bir güven düzeyine geçiyor. Sonraki ders bu yapıyı kurar ve konunun temel ölçümünü yapar: veri akış çizgesinde güven sınırını geçen akış sayısı, sınırı geçen her akışın taşıdığı kalem ve sınır çizilmediğinde kaç akışın görünmez kaldığı.

İ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