Ders 03 / 22
Güvenlik Bilgi ve Olay Yönetimi
Üç koşullu bir bağıntı kuralı 3.083 kayıtlık kurgu bir olay akışında koşturulur: kural 10 uyarı üretiyor ve bu uyarılar 161 ham olayı birleştiriyor, uyarı başına 16,1 olay. Beş kurgu kampanyanın üçü yakalanıyor; biri eşiğin altında kaldığı, biri üçüncü adımı yalnız ağ akışında bıraktığı için hiç görünmüyor. Huni 3.083 kayıttan 12 adaya, 12 adaydan 10 uyarıya, 10 uyarıdan 3 karara iniyor ve ilk kaydın düşmesinden 43 dakika sürüyor. Eşik, pencere ve gecikme taramasında hiçbir ayar beş kampanyanın beşini birden getirmiyor; en iyi satır 4/5 ve 1 yanlış pozitif.
İçindekiler
Bir önceki derste kümeleme tek ölçütle yapılmıştı: aynı aktör ve bir zaman penceresi. O ölçüt 184 küme üretti ve bunların yalnız 21’i modelin bildiği bir olaya karşılık geliyordu. Bir güvenlik bilgi ve olay yönetimi sistemi kümelemeyi böyle yapmaz; koşul dizisi yazar — hangi kaynaktan hangi alan, hangi sırayla, hangi sayıdan sonra.
Bu ders normalleştirilmiş bir akışın üzerine böyle bir kural koşturur ve iki sayı çıkarır: kural kaç ham olayı tek uyarıda birleştiriyor ve birleştirdiklerinin dışında neyi hiç görmüyor. Aşağıdaki akış bir modeldir ve olaylar yalnız kayıt olarak girer; hiçbir yerde bir saldırı adımının nasıl yapıldığı yazmaz. Bir hesap kümesine tekrarlı parola denemesi, yazılı yetki ve tanımlı kapsam olmadan hem yasadışı hem meslek dışıdır; burada denemenin bıraktığı kayıt ölçülür.
- TA13. Akış bir günü kapsar: 120 personel hesabı, 6 servis kimliği ve beş olay türü. Servis kimliği yetki değiştiremez, bu yüzden o kayıt onda hiç yoktur.
- TA14. Beş kurgu kampanya kayıt dizisi olarak verilir. Etiket modelin doğrusudur ve akışa yazılmaz; kural onu göremez.
- TA15. Bağıntı kuralı K1 üç koşulludur: aynı aktörde
Pdakika içinde en azEbaşarısız kayıt, ardından bir başarılı, ardındanGdakika içinde bir yetki değişikliği. - TA16. Bir uyarının kanıtı, kuralın onu üretirken tuttuğu ham olay kümesidir. Birleşme ölçüsü bu kümenin büyüklüğüdür.
- TA17. Zincirin sabit gecikmeleri model verisidir: aktarım ve normalleştirme 3 dakika, uyarı kuyruğu 14 dakika, analist incelemesi uyarı başına 9 dakika.
Bir Bağıntı Kuralının Durum Makinesi
// akis.mjs — kurgu olay akisi ve bir baginti kuralinin durum makinesi. MODELDIR. // Olaylar KAYIT olarak girer; saldiri adimi degil, adimin biraktigi kayit modellenir. export const TOHUM = 20260403; const uretec = (t) => { let s = t >>> 0; return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; }; const r = uretec(TOHUM); const tam = (n) => Math.floor(r() * n); const HESAP = Array.from({ length: 120 }, (_, i) => `sh-${301 + i}`); const SERVIS = Array.from({ length: 6 }, (_, i) => `sv-${11 + i}`); const ham = []; // {dakika, aktor, tur, etiket} — etiket modelin dogrusudur const ek = (t, a, tur, e) => ham.push({ t: Math.round(t), aktor: a, tur, etiket: e }); const kez = (n, f) => { for (let k = 0; k < n; k++) f(); }; // Arka plan: gunluk olagan is. Servis kimligi yetki degistiremez, o kayit onda hic yok. for (const h of HESAP) { kez(2 + tam(6), () => ek(tam(1440), h, "kimlik.basarili", "olagan")); kez(tam(9), () => ek(tam(1440), h, "kimlik.basarisiz", "olagan")); kez(tam(4), () => ek(tam(1440), h, "yetki.degistir", "olagan")); kez(4 + tam(14), () => ek(tam(1440), h, "akis.giden", "olagan")); } for (const h of SERVIS) { kez(6 + tam(10), () => ek(tam(1440), h, "kimlik.basarili", "olagan")); kez(tam(20), () => ek(tam(1440), h, "kimlik.basarisiz", "olagan")); kez(20 + tam(40), () => ek(tam(1440), h, "akis.giden", "olagan")); } // Yogun parola sifirlama: esigi asan mesru kume, ardindan giris ve yetki isi. for (const h of HESAP.slice(0, 9)) { let t = 420 + tam(600); kez(6 + tam(5), () => ek(t += 1 + r() * 3, h, "kimlik.basarisiz", "sifirlama")); ek(t += 12, h, "kimlik.basarili", "sifirlama"); if (r() < 0.55) ek(t + 5 + tam(30), h, "yetki.degistir", "sifirlama"); } // Bes kurgu kampanya: [ad, aktor, basarisiz kayit sayisi, ucuncu adimin turu, gecikme dk]. // Yalnizca KAYIT dizisi verilir; yontem anlatilmaz. const KAMPANYA = [["k1", HESAP[8], 40, "yetki.degistir", 25], ["k2", HESAP[21], 22, "yetki.degistir", 48], ["k3", HESAP[55], 61, "yetki.degistir", 9], ["k4", SERVIS[2], 33, "akis.giden", 20], // ucuncu adim yalniz ag akisinda ["k5", HESAP[96], 4, "yetki.degistir", 35]]; // basarisizlik esigin altinda for (const [ad, h, n, ucuncu, gecikme] of KAMPANYA) { let t = 60 + tam(1200); kez(n, () => ek(t += 0.4 + r() * 1.2, h, "kimlik.basarisiz", ad)); ek(t += 3, h, "kimlik.basarili", ad); ek(t + gecikme, h, ucuncu, ad); } ham.sort((a, b) => a.t - b.t); export const OLAY = ham.map(({ t, aktor, tur }) => ({ t, aktor, tur })); export const ETIKET = ham.map((o) => o.etiket); // hat bunu GORMEZ export const AD = KAMPANYA.map(([a]) => a); // Baginti kurali K1 (durum makinesi): ayni aktorde P dakika icinde >=E basarisiz kayit, // ardindan bir basarili, ardindan G dakika icinde bir yetki degisikligi. export function K1({ esik = 5, pencere = 30, gecikme = 60 } = {}) { const durum = new Map(), uyari = [], aday = new Set(), gecen = new Set(); for (const [i, o] of OLAY.entries()) { const d = durum.get(o.aktor) || { bas: [], acik: null, kanit: [] }; durum.set(o.aktor, d); if (o.tur === "kimlik.basarisiz") { d.bas = d.bas.filter((x) => OLAY[x].t > o.t - pencere).concat(i); if (d.bas.length >= esik) aday.add(o.aktor); } else if (o.tur === "kimlik.basarili" && d.bas.length >= esik) { d.acik = o.t; d.kanit = [...d.bas, i]; gecen.add(o.aktor); } else if (o.tur === "yetki.degistir" && d.acik !== null && o.t - d.acik <= gecikme) { uyari.push({ aktor: o.aktor, t: o.t, kanit: [...d.kanit, i] }); d.acik = null; d.bas = []; } } return { uyari, aday: aday.size, gecen: gecen.size }; } export const yakalayan = (u, ad) => u.find((x) => x.kanit.some((i) => ETIKET[i] === ad)); export const yanlisPozitif = (u) => u.filter((x) => !x.kanit.some((i) => AD.includes(ETIKET[i]))); if (import.meta.url === `file://${process.argv[1]}`) { const s = K1(), birlesen = s.uyari.reduce((a, u) => a + u.kanit.length, 0); console.log(`model (tohum ${TOHUM}): ${OLAY.length} olay, ${HESAP.length} personel ve ` + `${SERVIS.length} servis hesabi, ${KAMPANYA.length} kurgu kampanya (kayit olarak)`); console.log(`K1 (esik 5 / pencere 30 dk / gecikme 60 dk): ${s.uyari.length} uyari; ` + `bu uyarilar ${birlesen} ham olayi birlestiriyor, olay basina ` + `${(birlesen / s.uyari.length).toFixed(1)}`); const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join(""); const yz = gen([11, 9, 18, 11, 15, 32]); console.log(); console.log(yz(["kampanya", "kayit", "ucuncu adim", "yakalandi", "birlesen olay", "gorulmeme nedeni"])); for (const [ad, , n, ucuncu] of KAMPANYA) { const u = yakalayan(s.uyari, ad); console.log(yz([ad, n + 2, ucuncu, u ? "evet" : "hayir", u ? u.kanit.length : 0, u ? "-" : ucuncu === "akis.giden" ? "ucuncu adim yalniz ag akisinda" : "basarisizlik esigin altinda"])); } console.log(`\naday aktor ${s.aday}, ikinci kosulu gecen ${s.gecen}, uyari ` + `${s.uyari.length}; bunlarin ${yanlisPozitif(s.uyari).length} tanesi hicbir kampanya ` + `kaydi icermiyor`); }
model (tohum 20260403): 3083 olay, 120 personel ve 6 servis hesabi, 5 kurgu kampanya (kayit olarak) K1 (esik 5 / pencere 30 dk / gecikme 60 dk): 10 uyari; bu uyarilar 161 ham olayi birlestiriyor, olay basina 16.1 kampanya kayit ucuncu adim yakalandi birlesen olay gorulmeme nedeni k1 42 yetki.degistir evet 32 - k2 24 yetki.degistir evet 24 - k3 63 yetki.degistir evet 32 - k4 35 akis.giden hayir 0 ucuncu adim yalniz ag akisinda k5 6 yetki.degistir hayir 0 basarisizlik esigin altinda aday aktor 12, ikinci kosulu gecen 12, uyari 10; bunlarin 7 tanesi hicbir kampanya kaydi icermiyor
Birleşme oranı kuralın en görünür işidir: 10 uyarı 161 ham olayı topluyor, uyarı başına 16,1 kayıt. Analistin önüne 161 satır değil, 10 kalem geliyor ve her kalemin altında kanıt kümesi duruyor. Bu, bir önceki dersteki 184 kümenin yerine geçen sayıdır ve kuralın var olma nedenidir.
Üçüncü sütun bir ayrıntıyı gösteriyor: k3’ün 63 kaydı var ama uyarıda yalnız 32 olay birleşiyor. Otuz dakikalık pencere daha eski başarısızlıkları düşürüyor, çünkü sayaç kayan penceredir. Kanıt kümesi olayın tamamı değil, kuralın gördüğü bölümüdür; inceleme sırasında geri kalanı elle aranır.
Alt iki satır dersin asıl sonucudur. k5 eşiğin altında kalıyor: dört başarısız kayıt beş eşiğini geçmiyor ve kural hiç uyanmıyor. k4 ise farklı bir nedenle görünmüyor — üçüncü adımı bir yetki değişikliği değil, giden bir ağ bağlantısıdır ve kuralın üçüncü koşulu o türü hiç sormaz. Servis kimliğinde yetki değişikliği kaydı hiçbir zaman oluşmaz; kural bu aktörde tanım gereği tetiklenemez.
Bu iki satır bir önceki dersin ölçüsüne doğrudan bağlanır. Kural yalnız şemada bulunan alanları sorabilir; k4’ün üçüncü kaydı ortak şemaya oturuyor ama kuralın koşul dizisinde o türe yer yoktur. Eksiklik kaynağın toplanmamasından değil, kuralın hangi alanı sorduğundan gelir ve bu ayrım tespit kapsamının sayılmasında belirleyicidir.
Son satır bedeli veriyor: 10 uyarının 7’si hiçbir kampanya kaydı içermiyor. Bunların çoğu yoğun parola sıfırlama kümesidir — eşiği aşan meşru başarısızlık, ardından giriş, ardından olağan bir yetki işi. Kuralın koşul dizisi bu diziyi kampanyadan ayırt edemez, çünkü ikisi de aynı üç kaydı aynı sırayla bırakır.
Kayıttan Karara: Huni ve Dakika
// huni.mjs — kayittan karara giden zincir: her adimda kac aday eleniyor, kac dakika ekleniyor. import { OLAY, K1, AD, yakalayan, yanlisPozitif } from "./akis.mjs"; // Zincirin sabit gecikmeleri model VERISIDIR, olcum degil (dakika). const AKTARIM = 3, KUYRUK = 14, INCELEME = 9; const s = K1(), yp = yanlisPozitif(s.uyari); // Kuralin ucuncu adimi beklemek zorunda kaldigi ortalama sure. const bekleme = s.uyari.reduce((a, u) => a + (u.t - OLAY[u.kanit[u.kanit.length - 2]].t), 0) / s.uyari.length; const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join(""); const yh = gen([32, 12, 10, 13]); console.log(`${OLAY.length} ham olay, ${s.uyari.length} uyari, ` + `${s.uyari.length - yp.length} tanesi bir kampanya kaydi iceriyor`); console.log(); console.log(yh(["adim", "kalan aday", "elenen", "eklenen dk"])); const adim = [["ham kayit", OLAY.length, 0], ["aktarim ve normallestirme", OLAY.length, AKTARIM], ["kosul 1: 5 basarisiz / 30 dk", s.aday, 0], ["kosul 2: ardindan basarili", s.gecen, 0], ["kosul 3: 60 dk icinde yetki", s.uyari.length, Math.round(bekleme)], ["uyari kuyrugu", s.uyari.length, KUYRUK], ["analist incelemesi", s.uyari.length - yp.length, INCELEME]]; let onceki = OLAY.length, toplam = 0; for (const [ad, kalan, dk] of adim) { toplam += dk; console.log(yh([ad, kalan, onceki - kalan, dk])); onceki = kalan; } console.log(`toplam: ${OLAY.length} kayittan ${s.uyari.length - yp.length} karara, ` + `ilk kaydin dusmesinden ${toplam} dakika sonra`); const yz = gen([7, 10, 10, 8, 8, 12, 13, 13]); console.log(); console.log(yz(["esik", "pencere", "gecikme", "aday", "uyari", "yakalanan", "yanlis poz.", "inceleme dk"])); for (const [esik, pencere, gecikme] of [[5, 30, 60], [3, 30, 60], [8, 30, 60], [5, 5, 60], [3, 5, 60], [5, 30, 15], [5, 30, 240]]) { const k = K1({ esik, pencere, gecikme }); const y = AD.filter((a) => yakalayan(k.uyari, a)).length; const n = yanlisPozitif(k.uyari).length; console.log(yz([esik, `${pencere} dk`, `${gecikme} dk`, k.aday, k.uyari.length, `${y}/${AD.length}`, n, n * INCELEME])); }
3083 ham olay, 10 uyari, 3 tanesi bir kampanya kaydi iceriyor adim kalan aday elenen eklenen dk ham kayit 3083 0 0 aktarim ve normallestirme 3083 0 3 kosul 1: 5 basarisiz / 30 dk 12 3071 0 kosul 2: ardindan basarili 12 0 0 kosul 3: 60 dk icinde yetki 10 2 17 uyari kuyrugu 10 0 14 analist incelemesi 3 7 9 toplam: 3083 kayittan 3 karara, ilk kaydin dusmesinden 43 dakika sonra esik pencere gecikme aday uyari yakalanan yanlis poz. inceleme dk 5 30 dk 60 dk 12 10 3/5 7 63 3 30 dk 60 dk 18 11 4/5 7 63 8 30 dk 60 dk 10 8 3/5 5 45 5 5 dk 60 dk 4 2 2/5 0 0 3 5 dk 60 dk 12 5 4/5 1 9 5 30 dk 15 dk 12 6 1/5 5 45 5 30 dk 240 dk 12 11 3/5 8 72
Huninin ilk satırı bütün elemeyi tek adımda yapıyor: birinci koşul 3.083 olayı 12 adaya indiriyor. İkinci koşul hiçbir şey elemiyor — eşiği aşan on iki aktörün hepsi eninde sonunda giriyor. Kuralı dar tutan şey, sanıldığı gibi üç koşulun art arda gelmesi değil, birinci koşuldur; ikinci koşul yalnız zincirin başlangıcını işaretler.
Dakika sütunu daha az bilinen bir maliyeti gösteriyor. Üçüncü koşulun eklediği 17 dakika bir işlem gecikmesi değildir — kural beklemek zorundadır, çünkü üçüncü kaydın gelip gelmeyeceği ancak gecikme penceresi dolduğunda bilinir. Toplam 43 dakika bu kuralın fark etme süresidir ve 17’si kuralın kendi tanımından, 14’ü kuyruktan, 9’u incelemeden gelir. Aktarım ve normalleştirmenin payı yalnız 3 dakikadır; hattı hızlandırmaya çalışan bir çalışmanın kazanabileceği en fazla süre budur.
Alt tablo parametrelerin sınırını çiziyor. Eşiği üçe çekmek k5’i getiriyor ve yakalanan 4/5 oluyor, ama aday sayısı 12’den 18’e çıkıyor. Pencereyi beş dakikaya daraltmak yanlış pozitifi sıfırlıyor ve inceleme yükünü 63 dakikadan sıfıra indiriyor — karşılığında k1 kayboluyor, çünkü onun kayıtları otuz dakikalık pencereye yayılmıştır. En iyi satır eşik 3 ile pencere 5’in birleşimidir: 4/5 ve tek yanlış pozitif.
Hiçbir satır 5/5 vermiyor. k4 her ayarda görünmez kalır, çünkü eksik olan eşik ya da pencere değil kaynaktır: üçüncü adımın kaydı yalnız ağ akış verisindedir ve K1 o türü hiç sormaz. Parametre taraması bir kuralın kendi tanımının dışına çıkamaz.
Özet
- Üç koşullu bağıntı kuralı 3.083 ham olayı 10 uyarıya indiriyor ve bu uyarılar 161 olayı birleştiriyor; uyarı başına 16,1 kayıt analistin önüne tek kalem olarak geliyor.
- Kanıt kümesi olayın tamamı değildir: k3’ün 63 kaydından uyarıya yalnız 32’si giriyor, çünkü sayaç kayan penceredir ve daha eskileri düşürür.
- Beş kampanyanın üçü yakalanıyor; k5 eşiğin altında kalıyor, k4 üçüncü adımını yalnız ağ akışında bıraktığı için kuralın tanımı gereği hiç görünmüyor.
- On uyarının 7’si hiçbir kampanya kaydı içermiyor; yoğun parola sıfırlama kümesi kampanyayla aynı üç kaydı aynı sırayla bıraktığı için koşul dizisi ikisini ayıramıyor.
- Kayıttan karara 43 dakika geçiyor ve bunun 17’si kuralın üçüncü adımı beklemesinden, 14’ü kuyruktan, 9’u incelemeden gelir; aktarım ve normalleştirmenin payı 3 dakikadır.
Sonraki Adım
k4’ün üçüncü adımı hiçbir kimlik ya da yönetim kaydında yoktu; yalnız giden bir bağlantı olarak, ağ akış verisinde vardı. O kaynak öteki ikisinden yapı olarak ayrılır: bir akış kaydı bağlantının içeriğini yazmaz, yalnız kimin kiminle, ne kadar süreyle ve kaç bayt konuştuğunu yazar. Sonraki ders bu kısıtı ölçüye çevirir — içerik olmadan hangi soru yanıtlanabiliyor, hangisi yanıtlanamıyor ve şifreli bir bağlantıda meta veriden okunabilen düzen, kaç kalemi öteki kaynakların hiç görmediği bir eksende ayırıyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.