Ders 12 / 15
Mavi, Kırmızı ve Mor Takımlar
Üç takımın aynı yol kümesindeki farkı: 30 yollu erişim grafiğinde savunmanın bildiği 11 yol, saldırı tarafının bulduğu 15 yol, ikisinin kesişmediği 8 kalem, hiçbirinin görmediği 13 yol; mor çalışmanın bilgi boşluğunu 6'dan 0'a indirmesi, kapanan yolun 17'den 22'ye çıkarken duran meşru isteğin 2.764'ten 2.037'ye inmesi ve kapsam dışı 8 yolun kalması.
İçindekiler
Önceki konu altı savunma ilkesini aynı yol kümesinde ölçtü ve her birinin kapattığı yol ile durdurduğu meşru işi yan yana yazdı. Bütün o ölçümlerde sessiz bir varsayım vardı: yol kümesinin kendisi biliniyor. Kapatılan yol sayılabildiyse, sayılan yol önceden bir yerde yazılıydı demektir. Bu ders o varsayımı kaldırır ve tek bir soru sorar: bir kurumun bildiği yol kümesi ile gerçekten var olan yol kümesi arasındaki fark kaç kalemdir, o farkı kim bulur.
Üç çalışma biçimi vardır. Mavi takım savunmayı işletir: envanteri tutar, denetimi kurar, kaydı okur. Kırmızı takım aynı varlığa ulaşan yolları yazılı yetki ve tanımlı kapsam içinde arar; bulduğu her yol savunmanın listesinde olmayan bir kalem olabilir. Mor takım ayrı bir kadro değil, iki tarafın aynı yol kümesi üzerinde birlikte çalışma biçimidir. Bu ders üçünü de tek bir sayıda ayırır: aynı yol kümesinde kimin kaç yolu gördüğü.
Üç Takım, Tek Yol Kümesi
Örnek, kursun kurgu bölgesel ölçüm ağıdır. Aşağıdaki graf bir modeldir; gerçek bir ana bilgisayar, gerçek bir adres ya da gerçek bir servis ucu yoktur.
- AR1. Erişim grafiği 12 düğüm ve 20 adımdır; 3 giriş noktası, 2 korunan varlık. Yol, bir giriş düğümünden bir varlığa giden, düğüm tekrarı olmayan yürüyüştür.
- AR2. Savunma bir yolu ancak yolun bütün düğümleri varlık envanterinde yazıyorsa bilir. Envanterde olmayan tek bir düğüm, o düğümden geçen bütün yolları görünmez yapar.
- AR3. Saldırı tarafı bir yolu ancak bütün düğümleri yazılı kapsamın içindeyse ve adım sayısı adım bütçesini aşmıyorsa bulur. Ayrı çalışmada bütçe 4 adımdır.
- AR4. Mor çalışmada envanter paylaşılır: kırmızının dokunduğu her düğüm envantere girer ve keşif için adım harcanmadığından bütçe 6’ya çıkar.
- AR5. Her adım günde belli sayıda meşru istek taşır; sayılar kurgudur.
- AR6. Bir yol, üzerindeki bir adım kesilerek kapanır. Savunma anladığı bir yolda en az meşru istek taşıyan adımı keser.
- AR7. Yalnız rapordan öğrenilen, ara düğümleri envanterde olmayan bir yolda savunma adlandırabildiği tek adımı — giriş adımını — keser.
- AR8. Meşru işe bedel, kesilen ayrık adım kümesinin taşıdığı meşru istek toplamıdır; aynı adım birden çok yolu kapatıyorsa bir kez sayılır.
// takim/ag.mjs — kurgu bolgesel olcum aginin erisim grafi (MODEL). Gercek bir ana bilgisayar, // gercek bir adres ya da gercek bir servis ucu yoktur; butun sayilar kurgudur. // dugum: envanter = savunmanin varlik listesinde yaziyor mu; // kapsam = yazili yetkilendirmenin sinirlari icinde mi (ucuncu taraf ucu disaridadir). export const DUGUM = ` saha-terminali giris evet evet abone-portali giris evet evet tedarikci-ucu giris hayir hayir sube-anahtari ara hayir evet toplayici ara evet evet dogrulayici ara evet evet kimlik-dizini ara evet evet yonetim-agi ara evet evet is-emri ara evet evet yedek-ucu ara hayir evet okuma-deposu varlik evet evet faturalama varlik evet evet` .trim().split("\n").map((r) => { const [ad, tur, env, kap] = r.trim().split(/\s+/); return { ad, tur, envanter: env === "evet", kapsam: kap === "evet" }; }); // kenar: adim ve o adimdan gunde gecen mesru istek sayisi (kurgu). export const KENAR = ` saha-terminali toplayici 420 saha-terminali sube-anahtari 35 abone-portali dogrulayici 900 abone-portali kimlik-dizini 760 tedarikci-ucu yonetim-agi 18 tedarikci-ucu yedek-ucu 6 sube-anahtari yonetim-agi 24 sube-anahtari toplayici 110 toplayici dogrulayici 380 toplayici okuma-deposu 540 dogrulayici okuma-deposu 610 dogrulayici faturalama 290 kimlik-dizini yonetim-agi 44 kimlik-dizini is-emri 150 yonetim-agi toplayici 60 yonetim-agi yedek-ucu 12 yonetim-agi kimlik-dizini 38 yedek-ucu okuma-deposu 9 is-emri dogrulayici 130 is-emri faturalama 95` .trim().split("\n").map((r) => { const [a, b, m] = r.trim().split(/\s+/); return { a, b, mesru: Number(m) }; }); const bul = (ad) => DUGUM.find((d) => d.ad === ad); export const GIRIS = DUGUM.filter((d) => d.tur === "giris").map((d) => d.ad); export const VARLIK = DUGUM.filter((d) => d.tur === "varlik").map((d) => d.ad); // Butun basit yollar: giris dugumunden varliga, dugum tekrari olmadan. 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, adim: iz.length - 1, kenar: iz.slice(0, -1).map((_, i) => `${iz[i]}>${iz[i + 1]}`), })); } export const kenarMesru = (e) => { const [a, b] = e.split(">"); return KENAR.find((k) => k.a === a && k.b === b).mesru; }; // Savunma bir yolu ancak butun dugumleri envanterinde yaziyorsa bilir. export const maviBilir = (y) => y.iz.every((d) => bul(d).envanter); // Saldiri tarafi bir yolu ancak butun dugumleri kapsamdaysa ve adim sayisi butcesini // asmiyorsa bulur; kapsam disi dugume dokunmak yetkilendirmenin disina cikmaktir. export const kirmiziBulur = (y, butce) => y.iz.every((d) => bul(d).kapsam) && y.adim <= butce;
Kim Neyi Biliyor
// takim/olc.mjs — ayni yol kumesinde savunmanin bildigi, saldiri tarafinin buldugu ve // ikisinin de gormedigi yol; sonra kapatmanin mesru ise bedeli. import { yollar, DUGUM, KENAR, kenarMesru, maviBilir, kirmiziBulur } from "./ag.mjs"; const Y = yollar(); 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 ENV0 = new Set(DUGUM.filter((d) => d.envanter).map((d) => d.ad)); const bilir = (y, env) => y.iz.every((d) => env.has(d)); const BUTCE = 4, MOR_BUTCE = 6; // kurgu: mor calismada kesif adimi harcanmaz // Mor calisma: kirmizinin dokundugu her dugum envantere girer, kirmizi envanteri okur. const DOKUNULAN = new Set(); for (const y of Y) if (kirmiziBulur(y, BUTCE)) y.iz.forEach((d) => DOKUNULAN.add(d)); const ENV1 = new Set([...ENV0, ...DOKUNULAN]); const durum = (env, b) => { const m = Y.filter((y) => bilir(y, env)), k = Y.filter((y) => kirmiziBulur(y, b)); const kes = m.filter((y) => k.includes(y)); return { m: m.length, k: k.length, ortak: kes.length, ym: m.length - kes.length, yk: k.length - kes.length, hic: Y.length - (m.length + k.length - kes.length) }; }; const A = durum(ENV0, BUTCE), M = durum(ENV1, MOR_BUTCE); console.log(`erisim grafi MODELI: ${DUGUM.length} dugum, ${KENAR.length} adim, ` + `${Y.length} basit yol; adim butcesi ayri calismada ${BUTCE}, mor calismada ${MOR_BUTCE}.`); const T = [-38, 9, 8]; console.log("\n1. ayni yol kumesinde kim neyi biliyor"); yaz(T, "olcu", "ayri", "mor"); for (const [ad, f] of [["savunmanin bildigi yol", (r) => r.m], ["saldiri tarafinin buldugu yol", (r) => r.k], [" ikisinin de bildigi", (r) => r.ortak], [" yalniz savunmanin bildigi", (r) => r.ym], [" yalniz saldirinin buldugu (bosluk)", (r) => r.yk], ["hicbirinin gormedigi yol", (r) => r.hic]]) yaz(T, ad, f(A), f(M)); // Kapatma: bilinen yolda en az mesru istek tasiyan adim kesilir; yalnizca rapordan // ogrenilen yolda savunma adlandirabildigi tek adimi, giris adimini kapatir. const dar = (y) => y.kenar.reduce((a, e) => (kenarMesru(e) < kenarMesru(a) ? e : a)); const bedel = (kesilen) => ({ adim: kesilen.size, mesru: [...kesilen].reduce((a, e) => a + kenarMesru(e), 0) }); const yol1 = Y.filter((y) => bilir(y, ENV0)); const yol2 = Y.filter((y) => bilir(y, ENV0) || kirmiziBulur(y, BUTCE)); const yol3 = Y.filter((y) => bilir(y, ENV1) || kirmiziBulur(y, MOR_BUTCE)); const K1 = new Set(yol1.map(dar)); const K2 = new Set([...yol1.map(dar), ...yol2.filter((y) => !bilir(y, ENV0)).map((y) => y.kenar[0])]); const K3 = new Set(yol3.map(dar)); const D = [-24, 10, 8, 10, 13]; console.log("\n2. kapatmanin mesru ise bedeli (mesru istek: gun basina, kurgu)"); yaz(D, "calisma bicimi", "kapanan", "kalan", "kesilen", "duran mesru"); for (const [ad, y, k] of [["yalniz savunma", yol1, K1], ["savunma + ayri sinama", yol2, K2], ["mor calisma", yol3, K3]]) { const b = bedel(k); yaz(D, ad, y.length, Y.length - y.length, b.adim, b.mesru); } const pahali = [...K2].filter((e) => !K3.has(e)) .reduce((a, e) => (kenarMesru(e) > kenarMesru(a) ? e : a)); const oYol = yol2.find((y) => y.kenar[0] === pahali && !bilir(y, ENV0)); console.log(`\nayri sinamada en pahali kesme: ${pahali} (${kenarMesru(pahali)} mesru istek),`); console.log(` kapattigi yol: ${oYol.iz.join(" > ")}`); console.log(` mor calismada ayni yol ${dar(oYol)} kesilerek kapaniyor: ` + `${kenarMesru(dar(oYol))} mesru istek.`); const kapsamDisi = Y.filter((y) => !y.iz.every((d) => DUGUM.find((x) => x.ad === d).kapsam)); console.log(`mor calismadan sonra kalan ${M.hic} yolun ${kapsamDisi.length} tanesi ` + `kapsam disi bir dugumden geciyor.`);
erisim grafi MODELI: 12 dugum, 20 adim, 30 basit yol; adim butcesi ayri calismada 4, mor calismada 6. 1. ayni yol kumesinde kim neyi biliyor olcu ayri mor savunmanin bildigi yol 11 22 saldiri tarafinin buldugu yol 15 22 ikisinin de bildigi 9 22 yalniz savunmanin bildigi 2 0 yalniz saldirinin buldugu (bosluk) 6 0 hicbirinin gormedigi yol 13 8 2. kapatmanin mesru ise bedeli (mesru istek: gun basina, kurgu) calisma bicimi kapanan kalan kesilen duran mesru yalniz savunma 11 19 7 1969 savunma + ayri sinama 17 13 9 2764 mor calisma 22 8 10 2037 ayri sinamada en pahali kesme: abone-portali>kimlik-dizini (760 mesru istek), kapattigi yol: abone-portali > kimlik-dizini > yonetim-agi > yedek-ucu > okuma-deposu mor calismada ayni yol yedek-ucu>okuma-deposu kesilerek kapaniyor: 9 mesru istek. mor calismadan sonra kalan 8 yolun 8 tanesi kapsam disi bir dugumden geciyor.
Birinci tablonun ayri sütunu üç takımın ayrı ayrı çalıştığı düzeni okur. Grafta 30 yol vardır.
Savunma bunların 11’ini bilir; saldırı tarafı 15’ini bulur. İki sayı yakın görünse de aynı
yolları göstermezler: kesişim yalnız 9 kalemdir.
Kesişmeyen iki kalem birbirinin aynı değildir. Yalnız savunmanın bildiği 2 yol zararsızdır: bu yollar 5 adım uzunluğundadır ve saldırı tarafının bütçesi 4 adımdır. Savunma onları biliyor ve kapatabiliyor; sınama bulmadı diye ortadan kalkmıyorlar. Yalnız saldırı tarafının bulduğu 6 yol ise bilgi boşluğudur: envanterde yazmayan iki düğümden — şube anahtarı ve yedek ucundan — geçtikleri için savunmanın listesinde hiç yoktular. Bir kurumun kendi ağı hakkında bilmediği şeyin sayısı, ancak dışarıdan bir sınama o sayıyı ölçtüğünde yazılabilir.
Son satır iki takımın da göremediğini verir: 13 yol. Bu sayı toplam yolun neredeyse yarısıdır ve iki ayrı nedenden doğar. Bir bölümü savunmanın envanterinde olmayan düğümlerden geçer ve saldırı tarafının bütçesini aşacak kadar uzundur; kalanı ise kapsamın dışındaki üçüncü taraf ucundan başlar. Yazılı yetki ve tanımlı kapsam olmadan bir sistem üzerinde sınama yapmak hem yasadışı hem meslek dışıdır; kapsam dışı bir düğüme dokunulmamasının nedeni teknik bir engel değil, bu sınırdır.
Mor Çalışma Neyi Kapatıyor
mor sütunu iki değişikliğin sonucudur ve ikisi de bilgi alışverişidir. Savunma, sınamanın
dokunduğu düğümleri envanterine ekler; şube anahtarı ve yedek ucu artık listededir. Sınama tarafı
envanteri okuduğu için keşfe adım harcamaz ve bütçesi 4’ten 6’ya çıkar. Yeni bir denetim
kurulmadı, yeni bir araç alınmadı, grafta tek bir adım değişmedi.
Sonuç dört satırda birden değişir. Savunmanın bildiği yol 11’den 22’ye, saldırı tarafının bulduğu yol 15’ten 22’ye çıkar ve ikisi aynı 22 yoldur: kesişmeyen kalem sıfırlanır. Bilgi boşluğu 6’dan 0’a iner. Görülmeyen yol 13’ten 8’e düşer.
Mor çalışmanın ölçülen katkısı budur: iki tarafın da tek başına ulaşamadığı 11 yol ortak listeye girer. Bu yolların hiçbiri yeni değildir — 30 yol baştan beri graftaydı. Kapanan şey bir açık değil, bir bilgi boşluğudur.
Kapatmanın Bedeli
İkinci tablo aynı üç düzeni savunmanın asıl işi cinsinden okur: kaç yol kapanıyor ve karşılığında kaç meşru istek duruyor.
Yalnız savunma çalıştığında 11 yol kapanır, 19’u açık kalır ve 7 adım kesilerek günde 1.969 meşru istek durur. Sınama eklendiğinde kapanan yol 17’ye çıkar, ama duran meşru istek 2.764’e fırlar: 6 yol daha kapatmanın bedeli 795 istektir, yani yol başına 132. Mor çalışmada kapanan yol 22, duran meşru istek 2.037’dir: sınamalı düzene göre 5 yol fazla kapanıyor ve 727 meşru istek daha az duruyor.
Bu ters yön son üç satırda açıklanıyor. Ayrı çalışan bir düzende savunma, raporda okuduğu bir yolu kapatmak zorundadır ama o yolun ara düğümleri envanterinde yazmaz; adlandırabildiği tek adım giriş adımıdır. Abone portalından kimlik dizinine giden adımı keser ve günde 760 meşru istek durur. Aynı yol mor çalışmada yedek ucundan okuma deposuna giden adım kesilerek kapanır: 9 meşru istek. Kapanan yol aynıdır, bedel 84 kat farklıdır.
Kural buradan çıkar: anlaşılmadan kapatılan yol, kapanır ama pahalıya kapanır. Bir bulgu listesi hangi yolun açık olduğunu söyler; hangi adımın kesilmesi gerektiğini söylemez. O adımı seçmek için yolun her düğümünün ne iş yaptığını bilmek gerekir ve o bilgi savunma tarafındadır. Mor çalışmanın kapattığı boşluk çift yönlüdür: savunma yolun varlığını, sınama tarafı yolun üzerindeki meşru işi öğrenir.
Sınamanın Yetmediği Yer
Mor çalışmadan sonra bile 8 yol kimsenin listesinde değildir ve çıktının son satırı bu 8 yolun tamamının kapsam dışı bir düğümden geçtiğini yazar. Üçüncü taraf ucu ne savunmanın envanterindedir ne de sınamanın yetkilendirildiği alandadır.
Bu kalan, daha iyi bir sınamayla kapanmaz. Bütçeyi 6’dan 10’a çıkarmak yeni yol bulmaz, çünkü engel adım sayısı değildir. Envanteri genişletmek de yetmez, çünkü o uç başka bir kurumun elindedir ve üzerinde sınama yapma yetkisi ayrı bir yazılı anlaşmayla verilir. Yol kümesinin bir bölümü teknik bir eksiklikten değil, yetkilendirmenin sınırından ötürü ölçülmemiş kalır — ve ölçülmemiş bir yol, kapatılmamış bir yoldur.
Özet
- 30 yollu grafta savunma 11, saldırı tarafı 15 yol görür; kesişim 9’dur. Kesişmeyen 8 kalemin 2’si savunmanın bildiği uzun yol, 6’sı bilgi boşluğudur — envanterde olmayan iki düğümden geçtiği için savunmanın hiç bilmediği yollar.
- Ayrı çalışmada 13 yol iki tarafın da görüş alanının dışındadır; mor çalışmadan sonra bu sayı 8’e iner ve bilgi boşluğu 6’dan 0’a düşer. Grafta tek bir adım değişmez, yalnız bilgi paylaşılır.
- Mor çalışma kapanan yolu 17’den 22’ye çıkarırken duran meşru isteği 2.764’ten 2.037’ye indirir: daha çok yol, daha az bedel.
- Anlaşılmayan bir yol pahalıya kapanır. Rapordan öğrenilen bir yolda savunma giriş adımını keser (760 meşru istek); aynı yol mor çalışmada 9 meşru istek taşıyan adımla kapanır.
- Kalan 8 yolun tamamı kapsam dışı bir düğümden geçer. Bu kalan, bütçeyi büyüterek değil ancak yetkilendirmenin sınırını değiştirerek ölçülebilir.
Sonraki Adım
Bu ders üç çalışma biçimini ayırdı ve aralarındaki farkı tek bir sayıya bağladı: aynı yol kümesinde kimin kaç yolu gördüğü. Ölçüm bir şeyi göstermiş oldu — savunma bir kadro değil, birbirini tamamlayan işlerin toplamıdır. Envanteri tutan iş ile yolu arayan iş ayrı ellerdedir ve ikisi konuşmadığında 11 yol ortak listeye hiç girmez.
Yine de “mavi” ve “kırmızı” birer takım adıdır, iş adı değil. Envanteri kim tutuyor, kesilecek adımı kim seçiyor, kesildikten sonra kalan kaydı kim okuyor, mimarideki kararı kim veriyor? Bir sonraki ders aynı yol kümesini bu kez rol cinsinden böler ve iki sayıyı arar: kaç yol hiçbir rolün üzerinde değil, kaç yol iki rolün birden üzerinde.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.