Ders 13 / 15
Güvenlik Rolleri
Rollerin sorumluluk kalemi cinsinden ayrılması: 9 kalem türü ve 3 görevden oluşan 27 hücrede tek sahipli 15, sahipsiz 7, iki sahipli 3 ve sınırın öte yanında 2 hücre; sahipsiz kalemin 12 yolu daha pahalı bir adımdan kapattırması, 2 yolun hiç kapanmaması, 15 kapatmanın iki onay istemesi ve sınırın yazılmasıyla duran meşru isteğin 2.321'den 2.135'e inmesi.
İçindekiler
Önceki ders üç çalışma biçimini aynı yol kümesinde ayırdı ve mor çalışmanın kapattığı bilgi boşluğunu saydı. O ölçüm bir soruyu açıkta bıraktı: yollar bilindikten sonra kim hangi adımı kesecek. “Mavi” ve “kırmızı” birer çalışma biçiminin adıdır; bir kurumda işi yapan şey biçim değil, adı yazılı bir sorumluluk kalemidir.
Bu ders yolları bilindiği varsayımıyla ele alır ve sahipliği ölçer. Güvenlik işi beş rolde toplanır: güvenlik operasyonu kaydı okur ve olayı yürütür; güvenlik sınaması yolu arar ve kapalı olduğunu doğrular; güvenlik mimarisi tasarım kararını ve varsayılanı belirler; yönetişim politikayı, riski ve üçüncü taraf sözleşmesini taşır; sistem ve ağ işletimi değişikliği gerçekten uygular. Sorulan iki sayı şudur: aynı yol kümesinde kaç kalem hiçbir rolün üzerinde değil, kaç kalem iki rolün birden üzerinde.
Kalem, Görev ve Sahip
Rolleri isim isim saymak bir sorumluluk ölçüsü vermez; aynı isim iki kurumda başka işi kapsar. Ölçülebilir birim sorumluluk kalemidir: bir adımı kesmek için değiştirilmesi gereken şey.
- AR9. Yol kümesi önceki dersin grafından gelir: 20 adım, 30 yol. Her adım bir kalem türüne bağlıdır; 9 kalem türü vardır.
- AR10. Her kalem türünün üç görevi vardır: bul (kalemin var olduğunu bilmek ve listede tutmak), kapat (değişikliği uygulamak), sürdür (kapalı kaldığını doğrulamak). Matris 9 × 3 = 27 hücredir.
- AR11. Bir hücrenin sahibi 0, 1 ya da 2 rol olabilir.
- AR12.
disişaretli hücre paylaşılan sorumluluk sınırının öte yanındadır. O sınırın nerede geçtiği bu dersin sorusu değildir; girdisidir ve kurum içi bir boşluk sayılmaz. - AR13. Bir yol, üzerindeki bir adım kesilerek kapanır. Bir adım ancak kaleminin bul ve kapat hücrelerinde kurum içi bir sahip varsa kesilebilir: kimsenin listesinde olmayan bir kalem gündeme gelmez, gündeme gelse de uygulayanı yoktur.
- AR14. Savunma kesilebilir adımlar arasından en az meşru istek taşıyanı seçer. Hiçbir adımı kesilebilir olmayan yol açık kalır.
- AR15.
kapathücresinde iki sahip varsa o kapatma iki ayrı onay adımı kazanır. - AR16. Rol sınırını yazmak, her sahipsiz hücreye bir sahip atamak ve her iki sahipli hücrede
tek sahip bırakmaktır;
dishücreler değişmez.
// rol/kalem.mjs — ayni erisim grafi, bu kez SORUMLULUK KALEMI ile etiketli (MODEL). // Her adim bir kalem turune baglidir; her kalem turunun uc gorevi vardir. Sayilar kurgudur. export const KENAR = ` saha-terminali toplayici 420 saha-donanimi saha-terminali sube-anahtari 35 envanter-kaydi abone-portali dogrulayici 900 uygulama-denetimi abone-portali kimlik-dizini 760 kimlik-yetkisi tedarikci-ucu yonetim-agi 18 ucuncu-taraf-maddesi tedarikci-ucu yedek-ucu 6 ucuncu-taraf-maddesi sube-anahtari yonetim-agi 24 ag-kurali sube-anahtari toplayici 110 ag-kurali toplayici dogrulayici 380 uygulama-denetimi toplayici okuma-deposu 540 veri-siniflandirmasi dogrulayici okuma-deposu 610 veri-siniflandirmasi dogrulayici faturalama 290 uygulama-denetimi kimlik-dizini yonetim-agi 44 kimlik-yetkisi kimlik-dizini is-emri 150 kimlik-yetkisi yonetim-agi toplayici 60 ag-kurali yonetim-agi yedek-ucu 12 yedek-yolu yonetim-agi kimlik-dizini 38 kimlik-yetkisi yedek-ucu okuma-deposu 9 yedek-yolu is-emri dogrulayici 130 uygulama-denetimi is-emri faturalama 95 yama-dizeyi` .trim().split("\n").map((r) => { const [a, b, m, k] = r.trim().split(/\s+/); return { a, b, mesru: Number(m), kalem: k }; }); export const GIRIS = ["saha-terminali", "abone-portali", "tedarikci-ucu"]; export const VARLIK = ["okuma-deposu", "faturalama"]; export const GOREV = ["bul", "kapat", "surdur"]; export const ROL = ["operasyon", "sinama", "mimari", "yonetisim", "isletim"]; // Sorumluluk hucresi: kalem turu x gorev -> sahip rol listesi. "dis" = paylasilan sorumluluk // sinirinin ote yani; onceki kursta olculmus bir girdidir, kurum ici bir bosluk degildir. export const SAHIP = { "ag-kurali": { bul: ["isletim"], kapat: ["isletim", "mimari"], surdur: ["operasyon"] }, "kimlik-yetkisi": { bul: ["operasyon"], kapat: ["isletim"], surdur: ["operasyon", "yonetisim"] }, "uygulama-denetimi": { bul: ["sinama"], kapat: ["mimari"], surdur: [] }, "envanter-kaydi": { bul: [], kapat: ["isletim"], surdur: [] }, "veri-siniflandirmasi": { bul: ["yonetisim"], kapat: ["mimari", "yonetisim"], surdur: ["operasyon"] }, "yedek-yolu": { bul: [], kapat: ["isletim"], surdur: [] }, "yama-dizeyi": { bul: ["operasyon"], kapat: ["isletim"], surdur: ["operasyon"] }, "saha-donanimi": { bul: [], kapat: ["isletim"], surdur: [] }, "ucuncu-taraf-maddesi": { bul: ["yonetisim"], kapat: ["dis"], surdur: ["dis"] }, }; export function yollar() { const cikis = {}; for (const k of KENAR) (cikis[k.a] ??= []).push(k.b); const hepsi = []; const yuru = (d, iz) => { if (VARLIK.includes(d)) { hepsi.push([...iz]); return; } for (const s of cikis[d] ?? []) if (!iz.includes(s)) yuru(s, [...iz, s]); }; for (const g of GIRIS) yuru(g, [g]); return hepsi.map((iz) => ({ iz, kenar: iz.slice(0, -1).map((_, i) => KENAR.find((k) => k.a === iz[i] && k.b === iz[i + 1])) })); }
Sahipsiz Hücre ve Çakışan Hücre
// rol/olc.mjs — sorumluluk hucresi sayimi, rol basina yuk ve yol duzeyinde sonuc. import { KENAR, SAHIP, GOREV, ROL, yollar } from "./kalem.mjs"; const Y = yollar(), KALEM = Object.keys(SAHIP); 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 ic = (s) => s.filter((r) => r !== "dis"); const sinif = (s) => (s[0] === "dis" ? "dis" : s.length === 0 ? "BOS" : s.length > 1 ? "CAK" : "tek"); console.log(`sorumluluk matrisi MODELI: ${KALEM.length} kalem turu x ${GOREV.length} gorev ` + `= ${KALEM.length * GOREV.length} hucre; ${ROL.length} rol, ${KENAR.length} adim, ` + `${Y.length} yol.`); const T = [-22, 11, 18, 21]; console.log("\n1. hangi hucrenin sahibi var (dis = paylasilan sorumluluk sinirinin otesi)"); yaz(T, "kalem turu", ...GOREV); for (const k of KALEM) yaz(T, k, ...GOREV.map((g) => SAHIP[k][g].join("+") || "-")); const say = (c) => KALEM.reduce((a, k) => a + GOREV.filter((g) => sinif(SAHIP[k][g]) === c).length, 0); console.log(`hucre dagilimi: tek sahip ${say("tek")}, sahipsiz ${say("BOS")}, ` + `iki sahip ${say("CAK")}, dis ${say("dis")}.`); // Bir adim ancak kaleminin bul ve kapat hucrelerinde kurum ici sahip varsa kesilebilir. const kesilir = (e) => ic(SAHIP[e.kalem].bul).length > 0 && ic(SAHIP[e.kalem].kapat).length > 0; const R = [-20, 10, 10]; console.log("\n2. rol basina yuk"); yaz(R, "rol", "hucre", "yol"); for (const r of ROL) { const h = KALEM.reduce((a, k) => a + GOREV.filter((g) => SAHIP[k][g].includes(r)).length, 0); const y = Y.filter((p) => p.kenar.some((e) => kesilir(e) && GOREV.some((g) => SAHIP[e.kalem][g].includes(r)))).length; yaz(R, r, h, y); } // Rol sinirini yazmak: her sahipsiz hucreye bir sahip, her cakisan hucrede tek sahip. const YAZILI = Object.fromEntries(KALEM.map((k) => [k, Object.fromEntries(GOREV.map((g) => { const s = SAHIP[k][g]; return [g, s[0] === "dis" ? s : s.length === 0 ? ["isletim"] : [s[0]]]; }))])); const karar = KALEM.reduce((a, k) => a + GOREV.filter((g) => ["BOS", "CAK"].includes(sinif(SAHIP[k][g]))).length, 0); function kos(M) { const uygun = (e) => ic(M[e.kalem].bul).length > 0 && ic(M[e.kalem].kapat).length > 0; const kes = new Set(); let kapanan = 0, onay = 0, dogrulanmaz = 0; for (const y of Y) { const u = y.kenar.filter(uygun).sort((a, b) => a.mesru - b.mesru); if (u.length === 0) continue; kapanan++; kes.add(u[0]); if (ic(M[u[0].kalem].kapat).length > 1) onay++; if (ic(M[u[0].kalem].surdur).length === 0) dogrulanmaz++; } return { kapanan, kalan: Y.length - kapanan, adim: kes.size, dogrulanmaz, onay, mesru: [...kes].reduce((a, e) => a + e.mesru, 0) }; } const A = kos(SAHIP), B = kos(YAZILI); const D = [-30, 12, 12]; console.log(`\n3. yol duzeyinde sonuc (rol sinirini yazmak ${karar} hucre karari ister)`); yaz(D, "olcu", "mevcut", "yazili"); for (const [ad, f] of [["kapanan yol", (r) => r.kapanan], ["kalan yol", (r) => r.kalan], ["kesilen adim", (r) => r.adim], ["duran mesru istek (gun)", (r) => r.mesru], ["iki onay isteyen kapatma", (r) => r.onay], ["kapali kaldigi dogrulanmayan", (r) => r.dogrulanmaz]]) yaz(D, ad, f(A), f(B)); const kayan = Y.filter((y) => { const u = y.kenar.filter(kesilir).sort((a, b) => a.mesru - b.mesru); return u.length > 0 && u[0] !== [...y.kenar].sort((a, b) => a.mesru - b.mesru)[0]; }).length; const sahipsizKalem = KALEM.filter((k) => !ic(SAHIP[k].bul).length || !ic(SAHIP[k].kapat).length); console.log(`\nen ucuz adimi kesilemedigi icin daha pahali adimdan kapanan yol: ${kayan};`); console.log(`kesilemeyen kalem turleri: ${sahipsizKalem.join(", ")}.`); const acik = Y.filter((y) => y.kenar.every((e) => !kesilir(e))); for (const y of acik) console.log(`acik kalan yol: ${y.iz.join(" > ")}`);
sorumluluk matrisi MODELI: 9 kalem turu x 3 gorev = 27 hucre; 5 rol, 20 adim, 30 yol. 1. hangi hucrenin sahibi var (dis = paylasilan sorumluluk sinirinin otesi) kalem turu bul kapat surdur ag-kurali isletim isletim+mimari operasyon kimlik-yetkisi operasyon isletim operasyon+yonetisim uygulama-denetimi sinama mimari - envanter-kaydi - isletim - veri-siniflandirmasi yonetisim mimari+yonetisim operasyon yedek-yolu - isletim - yama-dizeyi operasyon isletim operasyon saha-donanimi - isletim - ucuncu-taraf-maddesi yonetisim dis dis hucre dagilimi: tek sahip 15, sahipsiz 7, iki sahip 3, dis 2. 2. rol basina yuk rol hucre yol operasyon 6 26 sinama 1 18 mimari 3 25 yonetisim 4 22 isletim 7 23 3. yol duzeyinde sonuc (rol sinirini yazmak 10 hucre karari ister) olcu mevcut yazili kapanan yol 28 30 kalan yol 2 0 kesilen adim 11 12 duran mesru istek (gun) 2321 2135 iki onay isteyen kapatma 15 0 kapali kaldigi dogrulanmayan 5 0 en ucuz adimi kesilemedigi icin daha pahali adimdan kapanan yol: 12; kesilemeyen kalem turleri: envanter-kaydi, yedek-yolu, saha-donanimi, ucuncu-taraf-maddesi. acik kalan yol: tedarikci-ucu > yonetim-agi > yedek-ucu > okuma-deposu acik kalan yol: tedarikci-ucu > yedek-ucu > okuma-deposu
Birinci tablo 27 hücreyi dört sınıfa ayırır: 15 tek sahipli, 7 sahipsiz, 3 iki sahipli, 2 dış. Kurum içi 25 hücrenin yalnız 15’inin tek bir sahibi vardır; onda birinden fazlası değil, tam %40’ı tanımsız ya da çift tanımlıdır.
Sahipsiz yedi hücre üç kalem türünde toplanır ve hepsi aynı yönde eksiktir: envanter-kaydi,
yedek-yolu ve saha-donanimi kalemlerinin bul ve sürdür hücreleri boştur, kapat
hücreleri doludur. Bu, kurumun bu üç kalemi değiştirmeyi bildiği ama izlemeyi kimseye vermediği
anlamına gelir: envanter kaydını kim tutar, yedek yolunun var olduğunu kim bilir, saha donanımını
kim listeler sorularının yazılı yanıtı yoktur. Bir kalemi değiştirebilmek onu yönetmek değildir;
değişecek kalemin listede olması gerekir. uygulama-denetimi kaleminde de sürdür hücresi boştur:
denetim kurulur ama kaldırıldığında bunu fark edecek bir rol yazılı değildir.
Üç iki sahipli hücre başka bir eksikliktir. ag-kurali kapatma hücresi işletim ile mimaride,
veri-siniflandirmasi kapatma hücresi mimari ile yönetişimde, kimlik-yetkisi sürdürme hücresi
operasyon ile yönetişimdedir. Bu hücreler boş değildir, fakat her değişiklik iki ayrı onaydan
geçer.
İkinci tablo rol başına yükü verir ve iki sütunu birbirini tutmaz. isletim 7 hücreyle en yüklü
roldür ama güvenlik ekibinin parçası değildir: adımı gerçekten kesen eldir. sinama yalnız 1
hücrenin sahibidir; buna karşılık 18 yolun kapanması onun bulduğu kaleme bağlıdır. Hücre sayısı
bir rolün ne kadar iş yaptığını ölçmez, kaç yolun ondan geçtiğini ölçmez de: iki sütun ayrı
sorulara yanıt verir. Aynı yolun birden çok rolde sayılması da bundandır — bir yolun kapanması
genellikle üç görevin üçünde de bir sahip ister.
Sahipsizliğin Yol Düzeyindeki Bedeli
Üçüncü tablo hücre sayımını yol kümesine indirir. Mevcut dağılımda 28 yol kapanır, 2 yol açık kalır. Açık kalan iki yol çıktının son satırlarındadır ve ikisi de üçüncü taraf ucundan yedek ucu üzerinden okuma deposuna gider. Üzerlerindeki her adım ya sınırın öte yanındadır ya da hiçbir rolün listesindedir — bir yolun açık kalması için üzerindeki adımların hepsinin sahipsiz olması gerekir ve burada tam olarak bu olmuştur.
Asıl bedel açık kalan yollarda değil, kapanan yolların nasıl kapandığındadır. Çıktının sondan üçüncü satırı bunu yazar: 12 yol en ucuz adımından kapatılamaz, çünkü o adımın kalemi hiçbir rolün listesinde değildir. Savunma bir sonraki kesilebilir adıma kayar ve o adım daha çok meşru iş taşır. Duran meşru istek mevcut dağılımda günde 2.321, rol sınırı yazıldığında 2.135’tir. Aradaki 186 istek hiçbir güvenlik kazancı karşılığı değildir; yalnız kesilecek adımın seçilememesinin bedelidir.
iki onay isteyen kapatma satırı çakışmanın bedelini verir: 15 kapatma iki ayrı onay adımı
kazanır. Otuz yolun yarısı, iki rolün de sahiplendiği bir kalem üzerinden kapandığı için iki kez
karar gerektirir. Çakışma bir yolu açık bırakmaz; kapanmayı yavaşlatır ve her değişikliği iki
kata çıkarır.
kapali kaldigi dogrulanmayan satırı üçüncü kalemi verir: 5 yol kapanır ama kapalı kaldığını
doğrulayan bir rol yoktur. Bu yollar tabloda kapalı sayılır. Bir sonraki yapılandırma
değişikliğinde yeniden açılırlarsa bunu fark edecek yazılı bir sahip yoktur — sürdürme hücresinin
boş olması, kapatmanın ölçüsüz olması demektir.
Sınırı Yazmanın Bedeli
yazili sütunu on hücre kararının sonucudur: yedi sahipsiz hücreye birer sahip atanır, üç çakışan
hücrede tek sahip bırakılır. Kapanan yol 28’den 30’a çıkar, açık kalan yol sıfırlanır, duran
meşru istek 2.321’den 2.135’e iner, iki onay isteyen kapatma 15’ten 0’a, doğrulanmayan yol
5’ten 0’a düşer.
Bu on karar teknik bir çalışma değildir. Yeni bir denetim kurulmaz, yeni bir adım kesilmez, grafta hiçbir şey değişmez; yalnız on hücreye birer ad yazılır. Karşılığında iki yol daha kapanır ve günde 186 meşru istek daha az durur.
Ölçüm bir uyarı da taşır. Sahipsiz hücrelerin tamamı bul ve sürdür sütunlarındadır, hiçbiri kapat sütununda değildir. Kurumlar yapacak eli tanımlamayı kolay bulur; listeyi tutan ve sonucun kalıcı olduğunu doğrulayan eli tanımlamayı atlar. Bir sorumluluk matrisinin en çok atlanan hücresi işin yapıldığı hücre değil, işin gerekliliğini fark eden ve sonucunu sınayan hücredir.
Özet
- 27 hücrelik sorumluluk matrisinde 15 hücrenin tek sahibi vardır; 7 hücre sahipsiz, 3 hücre iki sahipli, 2 hücre paylaşılan sorumluluk sınırının öte yanındadır. Kurum içi 25 hücrenin %40’ı tanımsız ya da çift tanımlıdır.
- Sahipsiz yedi hücrenin tamamı bul ve sürdür sütunlarındadır. Kalemi değiştirecek el yazılıdır; kalemi listede tutacak ve kapalı kaldığını sınayacak el yazılı değildir.
- Rol başına hücre sayısı ile yol sayısı birbirini tutmaz: sınama tek hücrenin sahibidir ama 18 yolun kapanması onun bulduğu kaleme bağlıdır.
- Mevcut dağılımda 28 yol kapanır, 2 yol açık kalır; kapanan yolların 12’si en ucuz adımından kapatılamadığı için daha pahalı bir adımdan kapanır ve günde 186 fazla meşru istek durur.
- 15 kapatma iki onay adımı kazanır, 5 yol kapalı kaldığı doğrulanmadan kapalı sayılır. Sınırı yazmak on hücre kararıdır ve bu üç sayıyı sırasıyla 30, 0 ve 0 yapar.
Sonraki Adım
Rol sınırını yazmak on hücreyi kapattı ve iki yolu daha kapanır hâle getirdi. Yine de matrisin iki
hücresi baştan sona dis kaldı ve bu ders onlara hiç dokunmadı: üçüncü taraf maddesinin kapatma
ve sürdürme hücreleri kurum içinde bir sahip almaz.
O iki hücrenin nedeni teknik değildir. Bir adımı kesmek, bir yolu sınamak, bir kalemi listeye almak — hepsi birinin o sistem üzerinde işlem yapma yetkisine bağlıdır ve o yetki bir tabloyla değil bir yazıyla verilir. Bir sonraki ders bu yetkiyi sayılabilir kalem olarak kurar: yazılı kapsamda kaç varlık var, kapsamın dışında kaç varlık aynı ağda duruyor ve kapsam belirsizliği kaç kalemi tartışmaya açık bırakıyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.