Ders 05 / 15
Saldırı Yüzeyi
Yüzeyin sayılabilir birime çevrilmesi: 13 düğüm ve 21 kenarlık erişim grafında dört giriş ucundan iki hedefe 35 ayrı yol çıkması, toplam meşru işin %1,4'ünü taşıyan giriş ucunun yolların %37,1'ini açması, tek bir kenarın 14 yol kapatabilmesi, bir kenarın 4 meşru işi durdurup hiçbir yol kapatmaması, oran sıralamasına göre açgözlü daraltmanın 31 meşru iş bedeliyle yolu sıfırlaması ve aynı sonucun bütün giriş uçlarını kapatmakla 27 bedele mal olması.
İçindekiler
Önceki dersin bütün ölçümleri tek bir varsayımın üstünde durdu: erisim bir adımdır. On iki
zincirin on ikisi de o adımdan başladı ve o adım hiç açılmadı. Oysa bir varlığa erişmek tek bir
kapıdan geçmek değildir. Bu ders o adımı açar ve müfredatın geri kalanının üzerinde duracağı ölçü
birimini kurar.
Saldırı yüzeyi (attack surface), bir varlığa ulaşmak için kullanılabilecek giriş noktalarının ve aralarındaki geçişlerin bütünüdür. “Yüzey geniştir” bir karar taşımaz. Yüzeyin sayılabilir karşılığı saldırı yolu (attack path) sayısıdır: kaynaktan hedefe giden kaç ayrı dizi var. Bu dersten sonra her savunma aynı soruyla ölçülecektir — kaç yol kapatıyor, kaç yol kalıyor, kaç meşru iş duruyor.
Yüzey Bir Yol Sayısıdır
Aşağıdaki graf bir modeldir: gerçek bir ağ, gerçek bir ana makine adı ya da gerçek bir hizmet ucu yoktur. Böyle bir sayımın gerçek bir ağ üzerinde yapılması yazılı yetki ve tanımlı kapsam olmadan hem yasadışı hem meslek dışıdır.
GK21: her kenar bir erişim geçişidir ve üstünde günde geçen kurgu meşru iş kalemi sayısını taşır. GK22: yol, kaynaktan bir hedefe giden ve hiçbir düğümü iki kez ziyaret etmeyen dizidir; yol sayımı aşağıdaki derine yürüyüşle gerçekten koşturulur. GK23: bir kenar kaldırıldığında o kenardan geçen bütün yollar kapanır ve o kenarın taşıdığı meşru iş durur.
// guvenlik/graf.mjs — kurgu olcum aginin erisim grafi (model): gercek bir ag, gercek bir ana // makine adi ya da gercek bir hizmet ucu yok. Graf yonlu ve cevrimsizdir. Rastgelelik yok. // GK21: kenar "kaynak hedef mesru-is" biciminde yazilir; mesru is, o kenardan gunde gecen // kurgu is kalemi sayisidir. export const KENAR = ` dis-ag sube-ucu 12 dis-ag saha-uygulamasi 9 dis-ag ortak-arayuzu 4 dis-ag yonetim-ucu 2 sube-ucu ag-gecidi 12 saha-uygulamasi ag-gecidi 9 ortak-arayuzu faturalama 4 yonetim-ucu ag-gecidi 2 yonetim-ucu dogrulayici 1 ag-gecidi toplayici 15 ag-gecidi faturalama 6 ag-gecidi is-emri 5 ag-gecidi rapor-ucu 4 toplayici dogrulayici 15 toplayici olcum-deposu 14 dogrulayici olcum-deposu 13 dogrulayici faturalama 7 faturalama olcum-deposu 5 faturalama kimlik-deposu 3 is-emri dogrulayici 2 is-emri kimlik-deposu 4` .trim().split("\n").map((r) => { const [a, b, is] = r.trim().split(/\s+/); return { a, b, is: +is, ad: `${a}->${b}` }; }); export const KAYNAK = "dis-ag"; export const HEDEF = ["olcum-deposu", "kimlik-deposu"]; export const DUGUM = [...new Set(KENAR.flatMap((k) => [k.a, k.b]))]; // GK22: yol, kaynaktan bir hedefe giden ve hicbir dugumu iki kez ziyaret etmeyen dizidir. // Yol sayimi asagidaki derine yuruyusle gercekten kosturulur. export function yollar(kenarlar = KENAR) { const komsu = {}; for (const k of kenarlar) (komsu[k.a] ||= []).push(k.b); const bulunan = [], iz = [KAYNAK], gorulen = new Set([KAYNAK]); (function yuru(d) { if (HEDEF.includes(d)) return bulunan.push([...iz]); for (const s of komsu[d] || []) { if (gorulen.has(s)) continue; gorulen.add(s); iz.push(s); yuru(s); iz.pop(); gorulen.delete(s); } })(KAYNAK); return bulunan; } export const YOL = yollar(); export const kalanYol = (kaldirilan) => yollar(KENAR.filter((k) => !kaldirilan.includes(k.ad))).length; export const duranIs = (kaldirilan) => KENAR.filter((k) => kaldirilan.includes(k.ad)).reduce((s, k) => s + k.is, 0); export const TOPLAM_IS = KENAR.reduce((s, k) => s + k.is, 0);
// guvenlik/yuzey.mjs — yuzey bir yol sayisidir: kac yol var, ne kapatiyor, kac mesru is duruyor. import { KENAR, DUGUM, HEDEF, YOL, KAYNAK, TOPLAM_IS, kalanYol, duranIs } from "./graf.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 uz = YOL.map((y) => y.length - 1); const giris = [...new Set(KENAR.filter((k) => k.a === KAYNAK).map((k) => k.b))]; console.log(`${DUGUM.length} dugum, ${KENAR.length} kenar, ${giris.length} giris ucu, ` + `${HEDEF.length} hedef; yol sayisi ${YOL.length}, yol uzunlugu ` + `${Math.min(...uz)}..${Math.max(...uz)}, toplam mesru is ${TOPLAM_IS}`); const A = [-18, 9, 9, 11]; console.log("\n1. yollar nereden giriyor, nereye cikiyor"); yaz(A, "uc", "yol", "en kisa", "en uzun"); for (const g of giris) { const y = YOL.filter((p) => p[1] === g); yaz(A, g, y.length, Math.min(...y.map((p) => p.length - 1)), Math.max(...y.map((p) => p.length - 1))); } for (const h of HEDEF) { const y = YOL.filter((p) => p.at(-1) === h); yaz(A, h, y.length, Math.min(...y.map((p) => p.length - 1)), Math.max(...y.map((p) => p.length - 1))); } const B = [-32, 8, 9, 8, 9]; console.log("\n2. bir kenar kaldirilirsa (yol/is orani buyukten kucuge)"); yaz(B, "kenar", "mesru is", "kapanan", "kalan", "yol/is"); const olc = KENAR.map((k) => ({ ...k, kap: YOL.length - kalanYol([k.ad]) })); for (const k of [...olc].sort((x, y) => y.kap / y.is - x.kap / x.is)) yaz(B, k.ad, k.is, k.kap, YOL.length - k.kap, (k.kap / k.is).toFixed(2)); const C = [-32, 10, 11, 12, 13]; console.log("\n3. acgozlu daraltma: her turda yol/is orani en yuksek kenar kaldirilir"); yaz(C, "kaldirilan kenar", "mesru is", "kalan yol", "biriken is", "kalan is %"); const kaldir = []; while (kalanYol(kaldir) > 0) { const aday = KENAR.filter((k) => !kaldir.includes(k.ad)) .map((k) => ({ k, kap: kalanYol(kaldir) - kalanYol([...kaldir, k.ad]) })) .sort((x, y) => y.kap / y.k.is - x.kap / x.k.is)[0]; kaldir.push(aday.k.ad); yaz(C, aday.k.ad, aday.k.is, kalanYol(kaldir), duranIs(kaldir), (((TOPLAM_IS - duranIs(kaldir)) / TOPLAM_IS) * 100).toFixed(1)); } const D = [-30, 11, 11, 13]; console.log("\n4. uc yuzey azaltma bicimi"); yaz(D, "bicim", "kalan yol", "duran is", "kalan is %"); const girisKenar = KENAR.filter((k) => k.a === KAYNAK).map((k) => k.ad); const bedava = olc.filter((k) => k.kap === 0).map((k) => k.ad); for (const [ad, kume] of [["hicbir sey", []], ["kapatani sifir olan kenarlar", bedava], ["butun giris uclari", girisKenar], ["acgozlu secim", kaldir]]) yaz(D, ad, kalanYol(kume), duranIs(kume), (((TOPLAM_IS - duranIs(kume)) / TOPLAM_IS) * 100).toFixed(1)); console.log(`kapattigi yol sifir olan kenar: ${bedava.join(", ") || "yok"}`); const E = [-18, 11, 13, 12, 12]; console.log("\n5. yuzey olcusu olarak ne sayilir (giris ucu kaldirilirsa)"); yaz(E, "giris ucu", "uc payi %", "kapanan yol", "yol payi %", "is payi %"); for (const g of giris) { const k = KENAR.find((x) => x.a === KAYNAK && x.b === g); const kap = YOL.length - kalanYol([k.ad]); yaz(E, g, (100 / giris.length).toFixed(1), kap, ((kap / YOL.length) * 100).toFixed(1), ((k.is / TOPLAM_IS) * 100).toFixed(1)); }
13 dugum, 21 kenar, 4 giris ucu, 2 hedef; yol sayisi 35, yol uzunlugu 3..6, toplam mesru is 148 1. yollar nereden giriyor, nereye cikiyor uc yol en kisa en uzun sube-ucu 10 4 6 saha-uygulamasi 10 4 6 ortak-arayuzu 2 3 3 yonetim-ucu 13 3 6 olcum-deposu 21 3 6 kimlik-deposu 14 3 6 2. bir kenar kaldirilirsa (yol/is orani buyukten kucuge) kenar mesru is kapanan kalan yol/is dis-ag->yonetim-ucu 2 13 22 6.50 yonetim-ucu->ag-gecidi 2 10 25 5.00 is-emri->dogrulayici 2 9 26 4.50 faturalama->kimlik-deposu 3 11 24 3.67 yonetim-ucu->dogrulayici 1 3 32 3.00 ag-gecidi->is-emri 5 12 23 2.40 faturalama->olcum-deposu 5 11 24 2.20 dogrulayici->faturalama 7 14 21 2.00 dis-ag->saha-uygulamasi 9 10 25 1.11 saha-uygulamasi->ag-gecidi 9 10 25 1.11 ag-gecidi->faturalama 6 6 29 1.00 dis-ag->sube-ucu 12 10 25 0.83 sube-ucu->ag-gecidi 12 10 25 0.83 ag-gecidi->toplayici 15 12 23 0.80 is-emri->kimlik-deposu 4 3 32 0.75 toplayici->dogrulayici 15 9 26 0.60 dogrulayici->olcum-deposu 13 7 28 0.54 dis-ag->ortak-arayuzu 4 2 33 0.50 ortak-arayuzu->faturalama 4 2 33 0.50 toplayici->olcum-deposu 14 3 32 0.21 ag-gecidi->rapor-ucu 4 0 35 0.00 3. acgozlu daraltma: her turda yol/is orani en yuksek kenar kaldirilir kaldirilan kenar mesru is kalan yol biriken is kalan is % dis-ag->yonetim-ucu 2 22 2 98.6 is-emri->dogrulayici 2 16 4 97.3 faturalama->kimlik-deposu 3 11 7 95.3 faturalama->olcum-deposu 5 6 12 91.9 is-emri->kimlik-deposu 4 4 16 89.2 ag-gecidi->toplayici 15 0 31 79.1 4. uc yuzey azaltma bicimi bicim kalan yol duran is kalan is % hicbir sey 35 0 100.0 kapatani sifir olan kenarlar 35 4 97.3 butun giris uclari 0 27 81.8 acgozlu secim 0 31 79.1 kapattigi yol sifir olan kenar: ag-gecidi->rapor-ucu 5. yuzey olcusu olarak ne sayilir (giris ucu kaldirilirsa) giris ucu uc payi % kapanan yol yol payi % is payi % sube-ucu 25.0 10 28.6 8.1 saha-uygulamasi 25.0 10 28.6 6.1 ortak-arayuzu 25.0 2 5.7 2.7 yonetim-ucu 25.0 13 37.1 1.4
Sayılar ölçüm sınıfındadır; girdileri GK21–GK23’tür.
Otuz Beş Yol
On üç düğüm ve yirmi bir kenar 35 yol üretir. Bu, yüzeyin bu derste ve müfredatın geri kalanında kullanılacak sayısıdır. Ne düğüm sayısı ne kenar sayısı onun yerine geçer: kenarlar %5 artsa yol sayısı iki katına çıkabilir, çünkü yol sayısı kenarların birleşim biçimine bağlıdır.
Birinci tablo yolların nereden girip nereye çıktığını ayırır. Ölçüm deposuna 21, kimlik deposuna 14
yol gider. Giriş uçlarında ise beklenmedik bir dağılım vardır: sube-ucu ve saha-uygulamasi
onar yol taşır, ortak-arayuzu yalnız iki, yonetim-ucu ise on üç — dördünün en yükseği.
Yönetim ucu ağın en küçük kapısıdır ve en çok yolu açar, çünkü grafın ortasındaki iki düğüme
birden bağlanır.
En kısa yol üç adımdır ve ortak-arayuzu üzerinden gider; en uzun yol altı adımdır. Uzunluk
dağılımı savunmanın nereye konacağını değiştirir: üç adımlık bir yolda ara denetim koyacak iki
nokta vardır, altı adımlıkta beş.
Bir Kenarın İki Sayısı
İkinci tablo bu dersin ana ölçümüdür ve her kenarı iki sayıyla anar: kaç yol kapatıyor, kaç meşru iş durduruyor. Sıralama ikisinin oranına göredir.
En üstteki satır dis-ag->yonetim-ucu kenarıdır: 13 yol kapatır ve yalnız 2 meşru iş durdurur
— oran 6,50. En çok yol kapatan kenar bu değildir; o dogrulayici->faturalama kenarıdır ve 14 yol
kapatır, ama 7 meşru iş durdurur (oran 2,00). Tek başına “en çok kapatan” ölçütü seçilirse ikincisi
kazanır; bedel de sayıldığında birincisi üç kat verimlidir.
Tablonun alt ucu ters yönü gösterir. toplayici->olcum-deposu yalnız 3 yol kapatır ve 14 meşru iş
durdurur — oran 0,21. Bu kenar ağın asıl işidir: okumalar oradan deposuna yazılır. Onu kaldırmak
yüzeyi neredeyse hiç daraltmaz ve işin onda birini durdurur.
Son satır her yüzey azaltma listesinde aranması gereken kalemdir. ag-gecidi->rapor-ucu
hiçbir yol kapatmaz — 35 yol 35 kalır — ve 4 meşru iş durdurur. Rapor ucu hiçbir hedefe
bağlanmaz, bu yüzden hiçbir yolun üstünde değildir. Yüzey sayılmadan yapılan bir sadeleştirmede bu
kenar “açık uç” diye kaldırılabilir; ölçüldüğünde görülen şey, bedeli olan ve karşılığı sıfır olan
bir karardır.
Yüzey Ölçüsü Olarak Ne Sayılır
Beşinci tablo, yol sayısının neden başka bir ölçünün yerine geçmediğini gösterir. Dört giriş ucundan her biri uç sayısının %25’idir; kapattıkları yol payı ise sırasıyla %28,6, %28,6, %5,7 ve %37,1’dir. Aynı büyüklükteki dört kapı, yüzeyin altı buçuk kat farklı paylarını taşır.
Uçları sayarak yapılan bir yüzey değerlendirmesi bu dört kalemi eşit yazar ve “dört açık ucumuz
var” cümlesini üretir. Kenarları sayan bir değerlendirme de aynı hataya düşer: ortak-arayuzu
üzerinden gelen yollar iki kenar kullanır, yonetim-ucu üzerinden gelenler de öyle başlar, ama
biri iki yol açar öteki on üç. Sayılabilir tek şey birleşimdir, ve birleşimin sayısı yoldur.
Son sütun aynı tabloyu ters yönden okur. yonetim-ucu toplam meşru işin yalnız %1,4’ünü
taşır ve yolların %37,1’ini açar; sube-ucu işin %8,1’ini taşır ve yolların %28,6’sını. İki
oranın birlikte okunması, yüzey azaltmanın sırasını doğrudan verir: en az iş taşıyıp en çok yol
açan uç ilk sıradadır. Bu ders boyunca elde edilen üç sütun — kapanan yol, kalan yol, meşru işe
bedel — bu tabloda ilk kez bir sıralama kuralına dönüşür.
Sıfıra İndirmenin Bedeli
Üçüncü tablo yolu sıfıra indirmeyi dener: her turda oranı en yüksek kenar kaldırılır ve yol yeniden sayılır. Altı kenar sonunda kalan yol sıfırdır ve duran meşru iş 31’dir; ağın işinin %79,1’i ayakta kalır.
Sıra kendi içinde öğreticidir. İlk kaldırma 35 yolu 22’ye indirir, ikincisi 16’ya, üçüncüsü 11’e.
İlk üç kenar toplam 7 meşru iş bedeliyle yolların %68,6’sını kapatır. Kalan dört yol için
ödenen bedel ise 24 meşru iştir. Yüzey azaltmanın getirisi ilk adımlarda toplanır; son yolları
kapatmak katlanarak pahalılaşır. Son satır bunun en açık biçimidir: ag-gecidi->toplayici tek
başına 15 meşru iş durdurur ve geriye kalan dört yolu kapatır.
Dördüncü tablo açgözlü seçimi iki alternatifle karşılaştırır. Kapattığı yol sıfır olan kenarları kaldırmak 4 meşru iş harcar ve 35 yolun hiçbirini kapatmaz. Bütün giriş uçlarını dış ağdan kesmek yolu sıfırlar ve 27 meşru iş durdurur. Oran sıralamasına göre açgözlü seçim de yolu sıfırlar ama 31 meşru iş durdurur.
Bu son karşılaştırma bu dersin en dikkat çekici sonucudur: her adımda en verimli görünen kenarı seçmek, toplamda daha pahalı bir sonuç verir. Açgözlü seçim ilk turlarda ucuz kenarları harcar, sonunda pahalı bir kenarı kaldırmak zorunda kalır. En ucuz tam kesim bir kenar sıralaması değil, bir kesit seçimidir — hangi kenar kümesinin birlikte kaynağı hedeflerden ayırdığı. Bir savunma listesi kalem kalem verimlilikle sıralandığında, seçilen kalemlerin birlikte ne yaptığı sayılmadıkça toplam bedel dört birim fazla çıkar.
Özet
- Saldırı yüzeyinin sayılabilir karşılığı yol sayısıdır: 13 düğüm ve 21 kenarlık grafta dört giriş ucundan iki hedefe 35 yol gider, uzunlukları 3 ile 6 adım arasındadır.
- Dört giriş ucunun her biri uç sayısının %25’idir ama yolların %28,6, %28,6, %5,7 ve %37,1’ini açar; en az meşru iş taşıyan uç (%1,4) en çok yolu taşır. Uç ya da kenar saymak yüzeyi ölçmez.
- Her kenar iki sayıyla anılır: en çok yol kapatan kenar 14 yol / 7 iş (oran 2,00), en verimli kenar 13 yol / 2 iş (oran 6,50), en verimsizi 3 yol / 14 iş (oran 0,21).
- Bir kenar 4 meşru iş durdurur ve hiçbir yol kapatmaz; hiçbir hedefe bağlanmadığı için hiçbir yolun üstünde değildir.
- İlk üç kaldırma 7 meşru iş bedeliyle yolların %68,6’sını kapatır; kalan dört yol için ödenen bedel 24 meşru iştir.
- Yolu sıfırlamak açgözlü seçimle 31, bütün giriş uçlarını kesmekle 27 meşru işe mal olur; kalem kalem en verimli seçim toplamda en ucuz seçim değildir.
Sonraki Adım
Bu konu güvenliğin ölçü birimlerini kurdu. Üç eksen aynı varlığın üstünde çakıştırıldı, varlık, tehdit ve açık ayrı listelere bölündü, risk olasılık ile etkinin bileşimi olarak sıralandı, açıktan etkiye giden zincir adımlandı ve bu ders yüzeyi tek bir sayıya indirdi: 35 yol. Artık her sorunun bir birimi var.
Yine de bütün bu ölçümlerde bir şey hiç yapılmadı. Yollar sayıldı, kenarların kaldırılması denendi ve bedeli yazıldı — ama kaldırmak bir savunma değildir; işi durdurmaktır. Gerçek bir savunma kenarı yerinde bırakır ve üstüne bir denetim koyar: katman ekler, yetkiyi daraltır, bölmelere ayırır, konum temelli güveni kaldırır, kimlik doğrulamayı yetkilendirmeden ayırır, varsayılanı kapatır. Bu ilkelerin her biri aynı 35 yol üzerinde koşturulabilir ve her biri için aynı üç sayı yazılabilir: kaç yol kapandı, kaç yol kaldı, kaç meşru iş durdu. Sonraki konu — Savunma İlkeleri — altı ilkeyi tek tek bu üç sütunla ölçer.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.