Ders 03 / 09
Uygulama İhlali Müdahalesi
Bir yetkisiz erişim ihlalinde on iki müdahale adımı dört kayıt şemasıyla koşturuluyor. Taban şemada yedi adım kayıtsız kalıyor, toplam 630 dakika sürüyor ve iki adım hiç tamamlanamıyor; en geniş şemada aynı müdahale 151 dakika, 4,17 kat kısa. Kayıt yokluğu adımları 4 ile 8,3 kat arasında uzatıyor. Kapsama kararı her şemada 10. dakikada veriliyor — fark kapsamada değil kapsam çıkarmada: etkilenen abone kümesi çıkarılamadığında bildirim 380 aboneden 41 200 abonelik üst sınıra genişliyor.
İçindekiler
Önceki dersin sonunda elde doğru bir uyarı var: bir oturum, yetkili olmadığı abone kayıtlarını okumuş. Uyarının doğrulanmasıyla birlikte iş, saymaktan yapmaya döner ve sorular değişir — hangi hesap, nereden, hangi uç noktalardan, kaç abone kaydı, veri değişti mi, aynı desende başka hesap var mı. Olay müdahale yaşam döngüsünün aşamaları ve nöbet düzeni Güvenlik Operasyonları ve Olay Müdahalesi kursunda ölçülmüştü; burada tekrarlanmaz.
Bu ders yalnız bir şeyi ölçer: hangi adım hangi kayda ihtiyaç duyuyor ve o kayıt yoksa adım kaç dakika uzuyor. İhlal senaryosu kayıt olarak girer; hiçbir istismar yöntemi ya da yük anlatılmaz, çünkü ölçülen şey saldırının nasıl yapıldığı değil, yapıldıktan sonra nasıl anlaşıldığıdır.
- UM12. Olay kurgudur: abone portalında bir hesap üzerinden yetkisiz okuma; kiracıda 41 200 abone kaydı var, gerçekte dokunulan küme 380 kayıt.
- UM13. Olay müdahale kılavuzu, adımların veri yapısı olarak modellenmiş hâlidir. Her adımın üç niteliği vardır: gereken kayıt alanları, kayıtla süren dakika, kayıtsız süren dakika.
- UM14. Bir adımın gereken alanları tek bir eşlenebilir kümede bulunmalıdır; önceki dersteki bağ kuralı burada da geçerlidir.
- UM15. Kayıtsız süresi tanımsız olan adım hiç tamamlanamaz: en iyi çabayla dört katı süre harcanır ve kesin sonuç yerine bir üst sınır bildirilir.
- UM16. Süreler veridir, bu sayfada yapılmış bir ölçüm değildir. Dört şema önceki derslerin şemalarıdır: taban, bağ alanı eklenmiş, yetki kararı ile sürüm eklenmiş, oturum ile değişiklik öncesi değer de eklenmiş.
Adım–Kayıt Bağımlılığı
// mudahale.mjs — uygulama ihlali senaryosunda mudahale adimlari kosturulur; her adim // bir kayit kumesine bagimlidir. MODELDIR: olay da sureler de kurgudur. export const KIRACI_ABONE = 41200; // kesin kume cikarilamazsa bildirilecek ust sinir // Sema = onceki dersin kayit tasarimlari. Alanlar eslenebilir kumeler halinde tutulur: // ayni kume icindeki alanlar birlestirilebilir, ayri kumelerdekiler birlestirilemez. export const SEMA = [ { ad: "taban", kume: [["zaman", "iz", "aktor", "eylem", "sonuc", "yol", "yontem", "durum", "istemci_ip"], ["zaman", "tablo", "nesne", "islem"]] }, { ad: "+iz", kume: [["zaman", "iz", "aktor", "eylem", "sonuc", "yol", "yontem", "durum", "istemci_ip", "tablo", "nesne", "islem"]] }, { ad: "+karar+surum", kume: [["zaman", "iz", "aktor", "eylem", "sonuc", "yol", "yontem", "durum", "istemci_ip", "tablo", "nesne", "islem", "yetki_karari", "surum"]] }, { ad: "+oturum+deger", kume: [["zaman", "iz", "aktor", "eylem", "sonuc", "yol", "yontem", "durum", "istemci_ip", "tablo", "nesne", "islem", "yetki_karari", "surum", "oturum", "once_deger"]] }, ]; // Adim = [ad, gereken alanlar, kayitla dakika, kayitsiz dakika]. Kayitsiz dakika null ise // adim hic tamamlanamaz; en iyi cabayla dort kati sure gider, sonuc ust sinir olur. export const ADIM = [ ["uyariyi dogrula", ["aktor", "eylem", "sonuc"], 6, 40], ["hesabi ve oturumu kes", ["aktor"], 4, 25], ["giris yolunu bul", ["istemci_ip", "iz"], 12, 70], ["cagrilan uc noktalari cikar", ["yol", "yontem", "iz"], 10, 60], ["yetki karari neden olumlu", ["aktor", "eylem", "yetki_karari"], 14, 100], ["etkilenen abone kumesi", ["aktor", "eylem", "nesne"], 25, null], ["veri degisti mi", ["iz", "tablo", "islem"], 15, 120], ["degisen degerleri geri al", ["tablo", "once_deger"], 20, null], ["ayni desende baska hesap", ["istemci_ip", "aktor"], 18, 90], ["surum ve yama durumu", ["aktor", "surum"], 8, 45], ["ayni oturumdaki diger isler", ["oturum", "eylem"], 9, 75], ["bildirilecek kapsami yaz", ["aktor", "nesne", "zaman"], 10, 60], ]; export const KAPSAMA_ADIM = 2; // ilk iki adim kapsama kararini besler export const varMi = (sema, alanlar) => sema.kume.some((c) => alanlar.every((a) => c.includes(a))); export function kosuf(sema) { let toplam = 0, kapsama = 0, eksik = 0, tamamlanamayan = 0, kesinKume = true; const satir = ADIM.map(([ad, alanlar, ile, siz], i) => { const var_ = varMi(sema, alanlar); const dk = var_ ? ile : (siz ?? ile * 4); if (!var_) { eksik++; if (siz === null) { tamamlanamayan++; if (ad === "etkilenen abone kumesi") kesinKume = false; } } toplam += dk; if (i < KAPSAMA_ADIM) kapsama += dk; return { ad, dk, durum: var_ ? "kayittan" : (siz === null ? "tamamlanamaz" : "elle") }; }); return { satir, toplam, kapsama, eksik, tamamlanamayan, bildirim: kesinKume ? 380 : KIRACI_ABONE }; } export const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join(""); if (import.meta.url === `file://${process.argv[1]}`) { const s = SEMA[0], o = kosuf(s); console.log(`sema "${s.ad}": ${ADIM.length} mudahale adimi, ` + `${s.kume.length} eslenebilir alan kumesi`); const y = gen([30, 34, 10, 15]); console.log("\n" + y(["adim", "gereken alanlar", "dakika", "kaynak"])); ADIM.forEach(([ad, alanlar], i) => console.log(y([ad, alanlar.join(","), o.satir[i].dk, o.satir[i].durum]))); console.log(`\ntoplam ${o.toplam} dakika, kayitsiz adim ${o.eksik}/${ADIM.length}, ` + `hic tamamlanamayan ${o.tamamlanamayan}, kapsama karari ${o.kapsama}. dakikada`); console.log(`etkilenen abone kumesi cikarilamadi: bildirim kapsami ${o.bildirim} abone`); }
sema "taban": 12 mudahale adimi, 2 eslenebilir alan kumesi adim gereken alanlar dakika kaynak uyariyi dogrula aktor,eylem,sonuc 6 kayittan hesabi ve oturumu kes aktor 4 kayittan giris yolunu bul istemci_ip,iz 12 kayittan cagrilan uc noktalari cikar yol,yontem,iz 10 kayittan yetki karari neden olumlu aktor,eylem,yetki_karari 100 elle etkilenen abone kumesi aktor,eylem,nesne 100 tamamlanamaz veri degisti mi iz,tablo,islem 120 elle degisen degerleri geri al tablo,once_deger 80 tamamlanamaz ayni desende baska hesap istemci_ip,aktor 18 kayittan surum ve yama durumu aktor,surum 45 elle ayni oturumdaki diger isler oturum,eylem 75 elle bildirilecek kapsami yaz aktor,nesne,zaman 60 elle toplam 630 dakika, kayitsiz adim 7/12, hic tamamlanamayan 2, kapsama karari 10. dakikada etkilenen abone kumesi cikarilamadi: bildirim kapsami 41200 abone
Tablonun ilk dört satırı hızlıdır ve hepsi tek bir eşlenebilir kümeden okunur: kim, nereden, hangi uç noktalardan. Bu dört adım 32 dakika sürer ve müdahalenin en görünür kısmıdır. Kalan sekiz satırın yedisi kayıtsızdır ve toplam sürenin 598 dakikasını üretir. Bir müdahalenin süresini belirleyen şey ilk adımların hızı değil, ortadaki adımların hangi kaydı bulamadığıdır.
En pahalı iki satır aynı nedenden pahalıdır. “Veri değişti mi” adımı iz, tablo ve islem
alanlarını birlikte ister; üç alan da yazılıyor, ama veritabanı değişiklik kaydında bağ alanı
olmadığı için hangi isteğin hangi satırı değiştirdiği gösterilemez. Aynı şey “etkilenen abone
kümesi” adımında olur: aktor bir kümede, nesne ötekinde. İkisi de eksik alan değil, kurulmamış
bağ yüzünden uzar. Bağ eksikliğinin bedeli ölçüm defterinde bir satır, müdahale defterinde iki
yüz dakikadır.
Tablonun okunmayan bir satırı da vardır ve o satır bir yanılgıyı önler: “aynı desende başka
hesap” adımı taban şemada bile kayıttan okunur, çünkü istemci_ip ile aktor aynı kümededir. Bu
adım müdahalenin en geniş kapsamlı sorusunu sorar — olay tek hesapla mı sınırlı — ve on sekiz
dakikada cevaplanır. Bir kayıt tasarımının değeri adım sayısına göre değil, hangi adımların
kayıttan okunabildiğine göre dağılır; en ucuz alan en geniş soruyu cevaplayan alan olabilir.
Son iki satır kayıt tasarımının müdahale dışına taşan bedelini yazar. Etkilenen abone kümesi kesin olarak çıkarılamadığında yerine bir üst sınır bildirilir: kiracıdaki 41 200 abonenin tamamı. Gerçekte dokunulan küme 380 kayıttır. Aradaki fark bir raporlama ayrıntısı değildir; bildirim yükümlülüğünü, çağrı merkezi yükünü ve kurumun dışarıya söylediği cümleyi belirler. Benzer biçimde “değişen değerleri geri al” adımı, değişiklik öncesi değer yazılmadığı için hiç tamamlanamaz — veri geri alınamaz, yalnız hangi satırların değiştiği söylenebilir. İki adım da harcanan zamanı geri vermez: model bu adımlara sırasıyla 100 ve 80 dakika yazar ve o sürenin sonunda elde kesin bir küme değil, bir aralık kalır. Tamamlanamayan adım, atlanan adım değildir; bedeli hem dakikada hem cevabın kesinliğinde iki kez ödenir.
Aynı Müdahale, Dört Kayıt Şeması
// karsilastir.mjs — ayni mudahale dort kayit semasiyla kosturulur; kayit tasarimindaki // fark dakikaya ve bildirim kapsamina cevrilir. MODELDIR. import { SEMA, ADIM, kosuf, varMi, gen } from "./mudahale.mjs"; const y = gen([16, 10, 11, 12, 15, 12]); console.log(y(["sema", "toplam dk", "kapsama dk", "kayitsiz", "tamamlanamaz", "bildirim"])); const sonuc = SEMA.map((s) => { const o = kosuf(s); console.log(y([s.ad, o.toplam, o.kapsama, `${o.eksik}/${ADIM.length}`, o.tamamlanamayan, o.bildirim])); return o; }); // Adim basina uzama: ayni adim taban semada ve en genis semada kac dakika suruyor. const taban = SEMA[0]; const uzama = ADIM.map(([ad, alanlar, ile, siz]) => ({ ad, ile, siz: varMi(taban, alanlar) ? ile : (siz ?? ile * 4), kesin: siz !== null || varMi(taban, alanlar) })) .filter((u) => u.siz !== u.ile).sort((a, b) => (b.siz - b.ile) - (a.siz - a.ile)); const z = gen([30, 10, 10, 8, 10]); console.log("\ntaban semada uzayan adimlar (en genis semayla karsilastirma)"); console.log(z(["adim", "kayitla", "kayitsiz", "kat", "sonuc"])); for (const u of uzama) console.log(z([u.ad, u.ile, u.siz, (u.siz / u.ile).toFixed(1), u.kesin ? "kesin" : "ust sinir"])); const t = sonuc[0], g = sonuc.at(-1); console.log(`\ntaban sema ${t.toplam} dakika, en genis sema ${g.toplam} dakika: ` + `${t.toplam - g.toplam} dakika fark, ${(t.toplam / g.toplam).toFixed(2)} kat`); console.log(`kapsama karari her semada ${g.kapsama}. dakikada verilebiliyor; ` + `fark kapsamada degil kapsam cikarmada`); console.log(`bildirim kapsami ${t.bildirim} abonelik ust sinirdan ${g.bildirim} abonelik ` + `kesin kumeye iniyor: ${(t.bildirim / g.bildirim).toFixed(0)} kat dar`); console.log(`ikinci sema (+iz) tek alanla ${t.toplam - sonuc[1].toplam} dakika kazandiriyor ` + `ve tamamlanamayan adimi ${t.tamamlanamayan}'den ${sonuc[1].tamamlanamayan}'e indiriyor`);
sema toplam dk kapsama dk kayitsiz tamamlanamaz bildirim taban 630 10 7/12 2 41200 +iz 400 10 4/12 1 380 +karar+surum 277 10 2/12 1 380 +oturum+deger 151 10 0/12 0 380 taban semada uzayan adimlar (en genis semayla karsilastirma) adim kayitla kayitsiz kat sonuc veri degisti mi 15 120 8.0 kesin yetki karari neden olumlu 14 100 7.1 kesin etkilenen abone kumesi 25 100 4.0 ust sinir ayni oturumdaki diger isler 9 75 8.3 kesin degisen degerleri geri al 20 80 4.0 ust sinir bildirilecek kapsami yaz 10 60 6.0 kesin surum ve yama durumu 8 45 5.6 kesin taban sema 630 dakika, en genis sema 151 dakika: 479 dakika fark, 4.17 kat kapsama karari her semada 10. dakikada verilebiliyor; fark kapsamada degil kapsam cikarmada bildirim kapsami 41200 abonelik ust sinirdan 380 abonelik kesin kumeye iniyor: 108 kat dar ikinci sema (+iz) tek alanla 230 dakika kazandiriyor ve tamamlanamayan adimi 2'den 1'e indiriyor
İlk sütun kayıt tasarımının müdahale süresine çevrilmiş hâlidir: aynı olay, aynı adımlar, aynı
kişiler; 630 dakika ile 151 dakika arasında 4,17 kat fark. İkinci satır bu farkın nereden
geldiğini gösteriyor. Tek bir bağ alanı — veritabanı kaydına eklenen 18 baytlık iz — müdahaleyi
230 dakika kısaltır ve tamamlanamayan adımı ikiden bire indirir. Önceki derste aynı alan cevaplanan
soruyu beşten on bire çıkarmıştı; burada aynı alanın ikinci faturası ödenmiş olur.
İkinci sütun bir yanılgıyı kesiyor. Kapsama kararı — hesabın askıya alınması ve oturumun
kesilmesi — dört şemada da 10. dakikada verilebilir, çünkü o adım yalnız aktor alanını ister ve
o alan her şemada vardır. Kayıt tasarımı saldırıyı durdurma hızını değiştirmez; değiştirdiği
şey ne olduğunu söyleme hızıdır. İhlal müdahalelerinin uzun sürmesinin nedeni çoğu zaman
kapsama değil, kapsam çıkarmadır: kimin verisine dokunulduğu, neyin değiştiği ve aynı desende
başka hesap olup olmadığı.
Şemaların sırası da bir bilgi taşır. Birinci adımdan ikinciye geçiş bir alan karşılığında 230 dakika kazandırır; ikinciden üçüncüye iki alan karşılığında 123 dakika; üçüncüden dördüncüye iki alan karşılığında 126 dakika. Alan başına kazanç 230, 62 ve 63 dakikadır. Bağ alanı diğerlerinden üç kattan fazla kazandırır ve bunu hiçbir yeni olgu kaydetmeden yapar. Aynı sıra hacim tarafında tersine döner: bağ alanı günlük hacmi yüzde iki, son iki alan yüzde otuz dokuz büyütür. Kayıt alanları eşit fiyatlı değildir; hem kazançları hem bedelleri arasında kat farkı vardır ve iki sıralama birbirinin tersidir.
Uzama tablosu bedeli adım adım yazıyor. Kat sütunu 4,0 ile 8,3 arasında değişir ve en yüksek katlar en küçük adımlardadır: dokuz dakikalık “aynı oturumdaki diğer işler” adımı kayıtsız 75 dakika sürer. Sonuç sütunu daha keskin bir ayrım getirir. Beş adım kayıtsız da olsa kesin sonuç verir — yalnız daha uzun sürer. İki adım kayıtsız kaldığında kesin sonuç veremez; harcanan 100 ve 80 dakikanın karşılığı bir üst sınırdır. Bir adımın kayıt bağımlılığı iki türlüdür: biri süreyi, öteki cevabın kesinliğini belirler; ikincisi hiçbir insan saatiyle kapatılamaz.
Modelin sınırı da yazılmalıdır: toplam dakika tek kişilik bir hesaptır. Adımların çoğu birbirini beklemez ve üç kişi çalıştığında geçen süre toplam dakikadan küçük olur. Ama bölünme yalnız süreyi böler, kesinliği bölmez: üç kişi de “etkilenen abone kümesi” adımını kayıtsız koşturduğunda sonuç yine üst sınırdır. Aynı biçimde kayıtsız adımların uzaması insan sayısıyla kapatılabilirken, iki tamamlanamayan adım hiçbir kadroyla kapatılamaz. İnsan ekleyerek kısaltılabilen şey ile kısaltılamayan şey ayrı sütunlardır; müdahale planı ikisini karıştırdığında kadro artırarak çözülemeyecek bir işi kadroya havale eder.
Bedelin öteki yüzü önceki derste sayılmıştı ve burada tekrar okunmalıdır. En geniş şema 151 dakikalık müdahaleyi mümkün kılar, ama günlük hacmi 1,45 kata çıkarır, saklamayı 65 günden 45 güne indirir ve kişisel veri kalemini üçe çıkarır. 45 günlük saklama, 60 günlük denetim döneminin başındaki bir olayda bu 151 dakikayı hiç kullandırmaz — kayıt orada yoktur. Müdahale hızı için alınan alan, olayın penceresi kaçtığında hiçbir şey kazandırmaz.
Özet
- Bir müdahale kılavuzu adım listesi olarak değil, adım–kayıt bağımlılığı olarak ölçülür: her adımın gereken alanları, kayıtla süresi ve kayıtsız süresi ayrı yazılır.
- Taban şemada 12 adımın 7’si kayıtsız kalır, müdahale 630 dakika sürer; en geniş şemada aynı müdahale 151 dakikadır, arada 4,17 kat vardır.
- Uzamanın büyük bölümü eksik alandan değil kurulmamış bağdan gelir; tek bir bağ alanı 230 dakika kazandırır ve tamamlanamayan adımı ikiden bire indirir.
- Kayıt tasarımı kapsama kararının hızını değiştirmez — her şemada 10. dakika — yalnız kapsam çıkarmanın hızını değiştirir.
- Kayıt bağımlılığı iki türlüdür: beş adım kayıtsız da kesin sonuç verir ama 4 ile 8,3 kat uzar; iki adım kesin sonuç veremez ve bildirim 380 aboneden 41 200 abonelik üst sınıra genişler.
- Hızlı müdahalenin bedeli önceki dersin defterinde yazılıdır: 1,45 kat hacim, 65 günden 45 güne inen saklama ve üç kişisel veri kalemi.
Sonraki Adım
Bu dersin bütün hesabı bir varsayıma dayanıyordu: kayıt alanı yazıldıysa müdahale anında elde duruyor. Kalıcı bir hizmette bu doğrudur. Kısa ömürlü iş yüklerinde değildir — bir görev konteyneri kırk saniye yaşayıp sonlandığında, ürettiği kayıt kalemlerinin ancak dışarı yazılabilmiş olanı sorgulanabilir; gerisi süreçle birlikte gider. Sonraki ders bu pencereyi ölçer: iş yükü ölmeden hangi uygulama kalemi dışarı çıkabiliyor, ayrıntı düzeyi arttıkça toplanabilen kalemin oranı ne oluyor ve elde kalan kalemler önceki derslerin sorularından kaçını cevaplıyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.