Ders 04 / 17
Varlık ve Envanter Yönetimi
Envanter dışı altı varlık listeye eklendiğinde 47 kalemlik liste 69 kaleme, 5.768,61 birimlik toplam 8.045,45 kurgu birime çıkar: envanter dışı kalemler gerçek riskin yüzde 28,3'ünü taşır, 41 kayıtlı kalemin sırası değişir, en büyük kayma 22 basamaktır, ilk yirmiye altı gölge kalem girer, 30 gölge kalemin 8'i değeri yazılmadığı için hiçbir sıralamaya giremez ve en yüksek sıraya çıkan gölge kalem hiçbir keşif kaynağının görmediği varlıktan gelir.
İçindekiler
Üç ders boyunca aynı liste sıralandı, ölçüldü ve bütçelendi: 47 kalem, on varlık, yedi tehdit. Her hesap bu listenin tam olduğunu varsaydı. Oysa liste bir envanterden türedi ve envanter bir kayıt kümesidir — kaydedilmemiş bir varlık listeye giremez.
Kaydedilmeyen bir varlığın riski sıfır değildir; yazılmamıştır. Sıralamada görünmez, bütçede yer tutmaz, kabul edilmiş bile sayılmaz — çünkü kabul en azından bir kaydı gerektirir. Bu ders o boşluğu sayar: envanter dışında kaç varlık var, kaç kalem üretiyorlar, listeye girseydi sıralamanın kaç sırası değişirdi ve onları bulmanın birim bedeli ne.
Envanterin Dışında Kalan
Envanter dışı varlık bir kural ihlali değil, çoğu zaman sıradan işleyişin artığıdır: bir sınama için açılıp kapatılmayan sunucu, bir ekibin kendi bütçesiyle açtığı bulut hesabı, saha ekibinin kendi kurduğu bir aktarım servisi, hizmetten çıkarılmış ama fişi çekilmemiş bir şube ucu, ikinci bir tedarikçi bağlantısı, bir yedek veri kopyası. Hepsi bir işe yaradığı için vardır ve hiçbiri envanteri güncellemek üzere kurulmamıştır.
Bunları bulmanın yolu keşif kaynaklarıdır ve her kaynak farklı bir yerden bakar. Ağ taraması adreslenebilir olanı görür, kimlik kaydı bir hesabı olanı, faturalama kaydı bir bedel üreteni, yapılandırma deposu tanımlanmış olanı, uç ajanı üzerinde yazılım çalışanı. Bir varlık kaç kaynakta görünüyorsa o kadar bulunabilirdir; hiçbirinde görünmüyorsa bulunamaz.
- RY17. Yedi tehdit ve katsayıları önceki derslerle aynıdır; birim kurgu birimdir.
- RY18. Beş keşif kaynağı, bedelleri ve kaynak maskeleri modeldir; gerçek bir tarama yapılmaz.
- RY19. Envanter dışı altı varlık modeldir.
?işareti, varlığın bulunmuş ama değerinin yazılmamış olduğunu gösterir. - RY20. Bir kalemin riski yalnız varlığın değeri yazılıysa hesaplanabilir; değeri yazılmamış varlık keşfedilse bile hiçbir sıralamaya giremez.
- RY21. Keşif tek seferliktir ve bulduğu varlığı envantere sokar; envantere girmek değerin yazılması demek değildir.
- RY22. Envanter dışı varlıkların maruziyet katsayıları kayıtlı varlıklarınkinden yüksek yazılmıştır; modelin gerekçesi, bakım ve sertleştirme çalışmalarının yalnız kayıtlı varlıklara uygulanmasıdır.
// risk/envanter.mjs — envanterdeki varliklar ile envanter disi varliklar. MODELDIR; gercek bir // tarama yapilmaz, gercek bir hesap acilmaz, butun degerler "kurgu birim" cinsindendir. // RY17: tehdit satiri: ad | yillik taban siklik | maruziyet orani export const TEHDIT = ` kimlik-ele-gecirme 0.30 0.35 zararli-kod 0.50 0.25 yanlis-yapilandirma 0.80 0.15 ic-kotuye-kullanim 0.10 0.40 hizmet-kesintisi 0.40 0.20 fiziksel-erisim 0.06 0.50 tedarik-zinciri 0.08 0.45` .trim().split("\n").map((r) => { const [ad, s, m] = r.trim().split(/\s+/); return { ad, s: +s, m: +m }; }); // RY18: kesif kaynagi: ad | yillik bedel. Her varlik bir kaynak maskesi tasir. export const KAYNAK = ` ag-taramasi 35 kimlik-kaydi 15 faturalama-kaydi 10 yapilandirma-deposu 25 uc-ajani 45` .trim().split("\n").map((r) => { const [ad, b] = r.trim().split(/\s+/); return { ad, b: +b }; }); // RY19: varlik satiri: ad | deger ('?' degeri yazilmamis) | maruziyet | tehdit maskesi | // kaynak maskesi | envanterde mi. Envanterdeki on varlik zaten kayitlidir. const SATIR = ` saha-dizustu 900 1.6 1111011 11001 E sube-ucu 600 1.2 1111110 10011 E sayac-toplayici 750 1.4 0111110 10010 E islem-sunucusu 1800 0.6 1111101 11011 E cevre-agi 1200 1.8 0011100 10010 E kimlik-dizini 2400 1.0 1011100 01010 E bulut-hesabi 2000 1.5 1011100 01100 E abone-veri-tabani 3000 0.4 1011100 00011 E saha-uygulamasi 1400 1.1 1111001 00110 E tedarikci-baglantisi 1000 1.3 1001101 01100 E gecici-test-sunucusu 800 1.7 1111101 11010 H ekip-bulut-hesabi ? 1.6 1011100 01100 H saha-aktarim-servisi 700 1.9 1111011 10001 H emekli-sube-ucu 500 1.5 1111110 10010 H ucuncu-tedarikci-ucu ? 1.4 1001101 01100 H yedek-veri-kopyasi 2200 0.8 1011100 00000 H`; export const VARLIK = SATIR.trim().split("\n").map((r) => { const [ad, v, m, maske, km, env] = r.trim().split(/\s+/); return { ad, v: v === "?" ? null : +v, m: +m, maske, km, envanterde: env === "E", gorulur: km.includes("1") }; }); export const KAYITLI = VARLIK.filter((v) => v.envanterde); export const GOLGE = VARLIK.filter((v) => !v.envanterde); // RY20: bir kalemin riski sadece varligin degeri yaziliysa hesaplanabilir; degeri yazilmamis // varlik kesfedilse bile hicbir siralamaya giremez. export const TUM = VARLIK.flatMap((v) => TEHDIT .filter((_, j) => v.maske[j] === "1") .map((t) => ({ v, t, risk: v.v === null ? null : +(t.s * v.m * v.v * t.m).toFixed(2) }))); export const KAY = TUM.filter((k) => k.v.envanterde); export const GOL = TUM.filter((k) => !k.v.envanterde); export const sirala = (L) => L.filter((k) => k.risk !== null) .map((k, i) => ({ k, i })).sort((a, b) => b.k.risk - a.k.risk || a.i - b.i).map((x) => x.k); export const top = (L) => +L.reduce((a, k) => a + (k.risk || 0), 0).toFixed(2);
İki Listenin Sayımı
// risk/eksik.mjs — envanter disi kalemler listeye girseydi siralama nasil degisirdi import { KAYITLI, GOLGE, KAYNAK, TUM, KAY, GOL, sirala, top } from "./envanter.mjs"; const y = (g, ...s) => console.log(s.map((v, i) => (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd()); const S1 = sirala(KAY), S2 = sirala(TUM); const yer = (L, k) => L.indexOf(k) + 1; console.log(`envanterde ${KAYITLI.length} varlik / ${KAY.length} kalem / ${top(KAY)} kurgu birim; ` + `envanter disi ${GOLGE.length} varlik / ${GOL.length} kalem / ${top(GOL)} birim ` + `(gercek toplamin %${((top(GOL) / top(TUM)) * 100).toFixed(1)}'i)`); const A = [-22, 7, 7, 10, 8, 10]; console.log("\n1. envanter disi varliklar"); y(A, "varlik", "deger", "kalem", "risk", "kaynak", "durum"); for (const v of GOLGE) { const ks = GOL.filter((k) => k.v === v); y(A, v.ad, v.v ?? "?", ks.length, v.v === null ? "-" : top(ks).toFixed(2), v.km.split("").filter((c) => c === "1").length, v.v === null ? "degersiz" : v.gorulur ? "gorulur" : "gorulmez"); } const puanlanabilir = GOL.filter((k) => k.risk !== null); console.log(`envanter disi ${GOL.length} kalemin ${puanlanabilir.length} tanesi puanlanabilir ` + `(${top(puanlanabilir).toFixed(2)} birim), ${GOL.length - puanlanabilir.length} tanesi degeri ` + `yazilmadigi icin hicbir siralamaya giremez`); const B = [-38, 9]; console.log("\n2. tam liste siralaninca ne degisiyor"); const kayma = KAY.map((k) => Math.abs(yer(S1, k) - yer(S2, k))); y(B, "envanter listesi / tam liste kalem", `${S1.length} / ${S2.length}`); y(B, "toplam risk", `${top(KAY).toFixed(2)} / ${top(TUM).toFixed(2)}`); y(B, "sirasi degisen kayitli kalem", kayma.filter((x) => x > 0).length); y(B, "en buyuk sira kaymasi", Math.max(...kayma)); y(B, "ilk ona giren envanter disi kalem", S2.slice(0, 10).filter((k) => !k.v.envanterde).length); y(B, "en yuksek envanter disi kalemin sirasi", Math.min(...puanlanabilir.map((k) => yer(S2, k)))); y(B, "ilk yirmide envanter disi kalem", S2.slice(0, 20).filter((k) => !k.v.envanterde).length); const C = [-22, -21, 10, 7, 6]; console.log("\n3. tam listenin ilk onu"); y(C, "varlik", "tehdit", "risk", "kaynak", "sira"); for (const k of S2.slice(0, 10)) y(C, k.v.ad, k.t.ad, k.risk.toFixed(2), k.v.envanterde ? "kayit" : "golge", yer(S1, k) || "-"); const D = [-21, 7, 8, 13, 8, 9]; console.log("\n4. kesif kaynagi basina (yalniz envanter disi varliklar)"); y(D, "kaynak", "bedel", "varlik", "acilan risk", "kalem", "oran"); const acilan = (f) => { const vs = GOLGE.filter(f); const ks = GOL.filter((k) => vs.includes(k.v) && k.risk !== null); return { vs, ks, r: top(ks) }; }; for (const [i, s] of KAYNAK.entries()) { const a = acilan((v) => v.km[i] === "1"); y(D, s.ad, s.b, a.vs.length, a.r.toFixed(2), a.ks.length, (a.r / s.b).toFixed(3)); } const hepsi = acilan((v) => v.gorulur); const bedel = KAYNAK.reduce((a, s) => a + s.b, 0); y(D, "besi birden", bedel, hepsi.vs.length, hepsi.r.toFixed(2), hepsi.ks.length, (hepsi.r / bedel).toFixed(3)); const kor = GOLGE.filter((v) => !v.gorulur); console.log(`hicbir kaynagin gormedigi varlik ${kor.length}, kalem ` + `${GOL.filter((k) => kor.includes(k.v)).length}, risk ` + `${top(GOL.filter((k) => kor.includes(k.v))).toFixed(2)} birim`);
envanterde 10 varlik / 47 kalem / 5768.61 kurgu birim; envanter disi 6 varlik / 30 kalem / 2276.84 birim (gercek toplamin %28.3'i) 1. envanter disi varliklar varlik deger kalem risk kaynak durum gecici-test-sunucusu 800 6 688.16 3 gorulur ekip-bulut-hesabi ? 4 - 2 degersiz saha-aktarim-servisi 700 6 606.48 2 gorulur emekli-sube-ucu 500 6 375.00 2 gorulur ucuncu-tedarikci-ucu ? 4 - 2 degersiz yedek-veri-kopyasi 2200 4 607.20 0 gorulmez envanter disi 30 kalemin 22 tanesi puanlanabilir (2276.84 birim), 8 tanesi degeri yazilmadigi icin hicbir siralamaya giremez 2. tam liste siralaninca ne degisiyor envanter listesi / tam liste kalem 47 / 69 toplam risk 5768.61 / 8045.45 sirasi degisen kayitli kalem 41 en buyuk sira kaymasi 22 ilk ona giren envanter disi kalem 1 en yuksek envanter disi kalemin sirasi 7 ilk yirmide envanter disi kalem 6 3. tam listenin ilk onu varlik tehdit risk kaynak sira bulut-hesabi yanlis-yapilandirma 360.00 kayit 1 bulut-hesabi kimlik-ele-gecirme 315.00 kayit 2 kimlik-dizini yanlis-yapilandirma 288.00 kayit 3 cevre-agi yanlis-yapilandirma 259.20 kayit 4 kimlik-dizini kimlik-ele-gecirme 252.00 kayit 5 bulut-hesabi hizmet-kesintisi 240.00 kayit 6 yedek-veri-kopyasi yanlis-yapilandirma 211.20 golge - saha-uygulamasi zararli-kod 192.50 kayit 7 kimlik-dizini hizmet-kesintisi 192.00 kayit 8 saha-uygulamasi yanlis-yapilandirma 184.80 kayit 9 4. kesif kaynagi basina (yalniz envanter disi varliklar) kaynak bedel varlik acilan risk kalem oran ag-taramasi 35 3 1669.64 18 47.704 kimlik-kaydi 15 3 688.16 6 45.877 faturalama-kaydi 10 2 0.00 0 0.000 yapilandirma-deposu 25 2 1063.16 12 42.526 uc-ajani 45 1 606.48 6 13.477 besi birden 130 5 1669.64 18 12.843 hicbir kaynagin gormedigi varlik 1, kalem 4, risk 607.20 birim
Sayılar ölçüm sınıfındadır; girdileri RY17–RY21’dir.
Eksik Listenin Payı
Altı envanter dışı varlık 30 risk kalemi üretiyor ve bunların taşıdığı risk 2.276,84 kurgu birim. Gerçek toplam 5.768,61 değil 8.045,45 birim; envanter dışı pay yüzde 28,3. Üç ders boyunca yapılan bütün sıralamalar, bütün bütçe hesapları ve bütün kabul kararları bu payın var olmadığı varsayımıyla verildi.
Sayı yalnız büyük olduğu için değil, dağılımı yüzünden önemlidir. Yedek veri kopyası tek başına 607,20 birim taşır ve envanterdeki dokuz varlığın yedisinden fazla risk yazar. Geçici sınama sunucusu 688,16 birimle listedeki her varlıktan fazladır. Bunların ortak yanı düşük değerli olmalarıdır — ama düşük değer, yüksek maruziyetle çarpıldığında küçük bir sayı vermez.
Maruziyet katsayısı sütunu bu yüksekliği açıklıyor ve modelin bir tercihidir (RY22): envanter dışı varlıklar 0,8 ile 1,9 arasında, kayıtlı varlıklar 0,4 ile 1,8 arasında değer alır. Gerekçe basittir ve kendi kendini besler — sertleştirme, yama ve izleme çalışmaları envanterdeki listeye uygulanır, listede olmayan varlık bu çalışmaların hiçbirini almaz. Kayıtsız olmak yalnız görünmezlik değil, aynı zamanda bakımsızlık demektir; iki etki aynı yönde çarpılır.
Sıralamanın Kaydığı Yer
İkinci tablo asıl soruya cevap veriyor. Eksik liste 47 kalemi sıralıyor, tam liste 69 kalemi; 41 kayıtlı kalemin sırası değişiyor ve en büyük kayma 22 basamak. İlk yirmiye altı gölge kalem giriyor ve bunlardan biri yedinci sıraya çıkıyor.
Üçüncü tablo bu kalemi adıyla gösteriyor: yedek veri kopyasındaki yanlış yapılandırma, 211,20 birimle listenin yedincisidir ve envanter listesinde hiç yoktur. Onun girmesiyle saha uygulamasındaki zararlı kod kalemi yedincilikten sekizinciliğe düşer ve altında kalan her kalem bir basamak aşağı iner. Bütçe ilk on kalemi ele alıyorsa, eksik listeyle çalışan bir program bu kalemi hiç açmaz — üstelik bunun bir eksiklik olduğunu da bilmez, çünkü kalem listede olmadığı için “ele alınmadı” sütununda da görünmez.
Kaymanın büyüklüğü listenin düzlüğüyle ilgilidir. Risk dağılımı düz olduğunda 22 yeni kalem araya serpilir ve neredeyse her kalemin sırasını değiştirir. Yoğun bir tepe olsaydı yeni kalemler alta yığılır ve ilk on değişmezdi. Burada ilk on değişiyor, yani eksiklik karar veren bölgeye ulaşıyor.
Bulunmak ile Sayılmak Ayrı Şeydir
Birinci tablonun son sütunu ikinci bir ayrım yazıyor. Altı varlığın ikisi — ekibin açtığı bulut hesabı ve üçüncü tedarikçi ucu — iki ayrı kaynakta görünüyor, ama değerleri yazılmamış. Bu iki varlık 8 risk kalemi üretir ve o kalemlerin hiçbiri puanlanamaz: değer yoksa etki yoktur, etki yoksa risk hesaplanamaz. 30 gölge kalemin 22’si puanlanabilir, 8’i puanlanamaz.
Bu, envanter çalışmasının en sık kaçırılan yarısıdır. Keşif bir varlığın varlığını yazar; envanter onun ne olduğunu yazar — sahibi kim, hangi işi taşıyor, düştüğünde ne olur. Birincisi otomatik yapılabilir, ikincisi bir insanın karar vermesini gerektirir. Bulunmuş ama değeri yazılmamış bir varlık, hiç bulunmamış bir varlıkla aynı sıraya girer: ikisi de hiçbir sıraya girmez. Aradaki tek fark, birincisinin bir listede adının bulunmasıdır.
Keşfin Birim Bedeli
Dördüncü tablo keşfi kursun ölçü birimiyle sınıyor. Ağ taraması 35 birime üç varlık ve 1.669,64 birimlik risk açar; oranı 47,704 ile listenin en yükseğidir. Kimlik kaydı 15 birime 688,16 birim açar (45,877). Faturalama kaydı 10 birime iki varlık bulur ve 0,00 birim açar — bulduğu iki varlığın değeri yazılmamıştır, dolayısıyla açılan puanlanabilir risk sıfırdır.
Son satır toplamayı sınıyor. Beş kaynağın hepsi 130 birime beş varlık bulur, ama açtığı risk yine 1.669,64 birimdir — ağ taramasının tek başına açtığı sayı. Kalan dört kaynak 95 birim daha harcayıp puanlanabilir riske hiçbir şey eklemez; ekledikleri iki varlık değersiz kalır. Birim başına getiri 47,704’ten 12,843’e iner. Keşif kaynağı eklemek her zaman daha çok kalem bulur, ama bulunan kalem puanlanmıyorsa sıralamaya girmez ve bütçede yer tutmaz.
Son satır dersin en sert sayısını yazıyor: hiçbir kaynağın görmediği bir varlık var, 4 kalem ve 607,20 birim taşıyor. Beş kaynağın tamamı satın alınsa bile bulunmaz. Üstelik tam listenin yedinci sırasındaki kalem tam olarak bu varlıktan gelir. Keşif kapsamı bir kapak değil, bir eşiktir: altına düşen her şey ölçülmez ve ölçülmeyen her şey varsayılan olarak kabul edilmiş sayılır.
Özet
- Envanter dışı altı varlık 30 kalem ve 2.276,84 kurgu birim taşır; gerçek toplam 8.045,45 birimdir ve envanter dışı pay yüzde 28,3’tür.
- Tam liste sıralandığında 41 kayıtlı kalemin sırası değişir, en büyük kayma 22 basamaktır; ilk yirmiye altı gölge kalem girer ve biri yedinci sıraya çıkar.
- Eksik listeyle çalışan bir program bu kalemi ele almadığını bile göremez: kalem listede olmadığı için “ele alınmadı” sütununda da yoktur.
- Bulunmak ile sayılmak ayrı şeylerdir. İki gölge varlık iki kaynakta görünür ama değeri yazılmamıştır; 30 gölge kalemin 22’si puanlanabilir, 8’i hiçbir sıralamaya giremez.
- Ağ taraması 35 birime 47,704 oran verir; beş kaynağın tamamı 130 birime aynı riski açar ve oran 12,843’e iner. Kaynak eklemek daha çok varlık bulur, puanlanabilir risk eklemez.
- Hiçbir kaynağın görmediği bir varlık 4 kalem ve 607,20 birim taşır; tam listenin yedinci sırasındaki kalem bu varlıktan gelir.
Sonraki Adım
Keşif kaynaklarının hepsi bir şeyi ortak varsayıyor: aranan varlık kurumun kendi ağında, kendi kimlik düzeninde ya da kendi faturasında bir iz bırakıyor. Tedarikçinin kendi sistemindeki bir sunucu bu izlerin hiçbirini bırakmaz. Ağ taraması oraya ulaşmaz, uç ajanı orada çalışmaz, yapılandırma deposu orayı tanımaz. O varlıkların yerine kurumda duran tek şey bir sözleşme maddesi ve bir değerlendirme anketidir. Sonraki ders üç tedarikçilik bir kümede bunu ölçer: sözleşmede yazan kontrol kaç, anketin gerçekten kanıtladığı kaç, devredilmiş görünüp doğrulanamayan kaç kalem kalıyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.