Ders 10 / 15
Sızıntı Müdahalesi
Sızıntı müdahalesi iptal akışı olarak koşturulur: kalan altı statik sırda sızıntı anından iptale kadar ortalama 1.386 dakika, en kötü kalemde 4.650 dakika geçiyor ve o sürede sırlardan 224.171 çağrı geçiyor. Sahiplik kaydı 340, önceden üretilmiş yedek 465 dakika kazandırıyor; sürekli depo taraması hiçbir şey kazandırmıyor çünkü altı sızıntının yalnız ikisi depoya düşüyor. Yayılmayı beklemeden iptal 150.934 çağrıyı kurtarıyor ama 68.503 meşru isteği kesiyor — kurtarılan her 2,2 çağrı için bir kesilen istek.
İçindekiler
Konunun ilk dört dersi sırların sayısını, ömrünü ve değişme maliyetini ölçtü ve aynı soruyu yanıtsız bıraktı: bir sır sızdığında ne oluyor. Açık pencere, sırrın kendiliğinden geçersizleşme süresiydi; sızıntı fark edilip iptal edilirse pencere daha erken kapanır. Bu ders o “daha erken”i ölçer.
Ölçülen şey iptal akışıdır ve akış savunma tarafındadır. Sızmış bir sırla ne yapılabileceği ya da o sırrın nasıl bulunacağı yazılmıyor; yazılan tek şey, sızıntının fark edilmesinden eski değerin geçersiz kılınmasına kadar geçen dakikalar ve o dakikalarda sırdan geçen çağrı hacmidir. Ölçüm, önceki dersten kalan altı statik sır üzerinde koşuyor.
- SR23. Önceki dört dersin modeli sürüyor. Ortam kurgudur, ölçülen şey
nodeile yazılmış bir modeldir ve gerçek sır değeri taşımaz; model yalnız sır yollarını ve akış sürelerini tutar. - SR24. Her sırrın sızıntı kanalı modelde seçilmiştir ve tespit yolunu belirler: kod deposuna düşen sızıntı sürekli taramayla, günlük dosyasına düşen kullanım anormalliğiyle, üçüncü taraftaki sağlayıcı bildirimiyle, istemci paketindeki dış ihbarla fark edilir.
- SR25. Akış beş aşamalıdır: fark etme, teyit ve etki değerlendirmesi, sahibini bulma, yeni değeri üretme, yeni değerin yayılması. Yayılma süresi bir önceki dersin asgari örtüşmesidir.
- SR26. “Sırdan geçen çağrı”, o sırrın açık pencere boyunca yetkilendirdiği toplam çağrı hacmidir; pencerenin ölçeğini gösteren üst sınırdır, kötüye kullanılan hacim değildir.
- SR27. Rastgelelik yok; bütün sayılar model tablolarından türetiliyor ve çıktı koşumdan koşuma aynı.
Fark Etmeden İptale Kaç Dakika
// iptal.mjs — sizinti aninda iptale kadar gecen dakika ve o surede sirdan gecen cagri. MODELDIR. // Ortam KURGUDUR; GERCEK SIR DEGERI YOKTUR, yalniz sir yollari ve akis sureleri modellenir. // Sirrin nasil kullanilacagi yazilmaz; olculen sey savunma tarafindaki iptal akisidir. // Onceki dersten kalan alti statik sir. kanal: sizintinin dustugu yer (modelde secilmis). // sahip: sir kaydinda sahibi yazili mi. dis: yeni degeri dis saglayici uretiyor mu. // cagri: sirrin yetkilendirdigi gunluk cagri. yayilma: onceki dersin asgari ortusmesi (dk). export const SIR = { "altyapi/onbellek": { kanal: "depo", sahip: true, dis: false, cagri: 240000, yayilma: 60 }, "imza/oturum-imzalama": { kanal: "gunluk", sahip: true, dis: false, cagri: 180000, yayilma: 960 }, "imza/belge-imzalama": { kanal: "depo", sahip: true, dis: false, cagri: 6200, yayilma: 240 }, "dis/odeme-gecidi": { kanal: "ucuncu-taraf", sahip: true, dis: true, cagri: 3400, yayilma: 240 }, "dis/eposta-gecidi": { kanal: "istemci-paketi", sahip: false, dis: true, cagri: 13400, yayilma: 1440 }, "dis/kisa-mesaj-gecidi": { kanal: "gunluk", sahip: false, dis: true, cagri: 8900, yayilma: 960 }, }; // tespit yolu kanala baglidir: yalniz kod deposuna dusen sizinti surekli taramayla yakalanir. export const TESPIT = { depo: ["surekli tarama", 20], gunluk: ["kullanim anormalligi", 90], "ucuncu-taraf": ["saglayici bildirimi", 240], "istemci-paketi": ["dis ihbar", 2880] }; export const TEYIT = 30; // teyit ve etki degerlendirmesi (dk) export const SAHIPLI = 10, SAHIPSIZ = 180; // sahibini bulma (dk) export const URETIM = 45, DISURETIM = 120; // yeni deger uretme (dk) export const AD = Object.keys(SIR); export const asama = (s, o = {}) => { const k = SIR[s]; return { tespit: o.tarama && k.kanal === "depo" ? 20 : TESPIT[k.kanal][1], teyit: TEYIT, sahip: k.sahip || o.kayit ? SAHIPLI : SAHIPSIZ, uretim: o.yedek ? 5 : k.dis ? DISURETIM : URETIM, yayilma: o.beklemez ? 0 : k.yayilma }; }; export const toplam = (s, o) => Object.values(asama(s, o)).reduce((t, x) => t + x, 0); export const cagri = (s, o) => Math.round(SIR[s].cagri * toplam(s, o) / 1440); 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 yz = gen([18, 22, 8, 7, 8, 9, 9, 8]); console.log(`iptal akisi — ${AD.length} statik sir (kurgu uretim ortami); sureler dakika\n`); console.log(yz(["sir", "tespit yolu", "tespit", "teyit", "sahip", "uretim", "yayilma", "toplam"])); for (const s of AD) { const a = asama(s); console.log(yz([s.split("/")[1], TESPIT[SIR[s].kanal][0], a.tespit, a.teyit, a.sahip, a.uretim, a.yayilma, toplam(s)])); } const T = AD.reduce((t, s) => t + toplam(s), 0), C = AD.reduce((t, s) => t + cagri(s), 0); console.log(yz(["toplam", "", "", "", "", "", "", T])); console.log(`\n${gen([18, 12, 12, 14, 16])(["sir", "toplam dk", "= saat", "gunluk cagri", "iptale kadar"])}`); for (const s of [...AD].sort((x, y) => cagri(y) - cagri(x))) console.log(gen([18, 12, 12, 14, 16])([s.split("/")[1], toplam(s), (toplam(s) / 60).toFixed(1), SIR[s].cagri, cagri(s)])); console.log(gen([18, 12, 12, 14, 16])(["toplam", T, (T / 60).toFixed(1), "", C])); console.log(`\nsir basina ortalama ${Math.round(T / AD.length)} dk ` + `(${(T / AD.length / 60).toFixed(1)} saat); en uzun ${Math.max(...AD.map((s) => toplam(s)))} dk`); console.log(`ayni sizinti kisa omurlu bir kimlik bilgisinde olsaydi iptal akisi hic islemez, ` + `pencere 60 dk kalirdi: ${Math.round(Math.max(...AD.map((s) => toplam(s))) / 60)} kat`); }
iptal akisi — 6 statik sir (kurgu uretim ortami); sureler dakika sir tespit yolu tespit teyit sahip uretim yayilma toplam onbellek surekli tarama 20 30 10 45 60 165 oturum-imzalama kullanim anormalligi 90 30 10 45 960 1135 belge-imzalama surekli tarama 20 30 10 45 240 345 odeme-gecidi saglayici bildirimi 240 30 10 120 240 640 eposta-gecidi dis ihbar 2880 30 180 120 1440 4650 kisa-mesaj-gecidi kullanim anormalligi 90 30 180 120 960 1380 toplam 8315 sir toplam dk = saat gunluk cagri iptale kadar oturum-imzalama 1135 18.9 180000 141875 eposta-gecidi 4650 77.5 13400 43271 onbellek 165 2.8 240000 27500 kisa-mesaj-gecidi 1380 23.0 8900 8529 odeme-gecidi 640 10.7 3400 1511 belge-imzalama 345 5.8 6200 1485 toplam 8315 138.6 224171 sir basina ortalama 1386 dk (23.1 saat); en uzun 4650 dk ayni sizinti kisa omurlu bir kimlik bilgisinde olsaydi iptal akisi hic islemez, pencere 60 dk kalirdi: 78 kat
Üst tablo akışın nerede geçtiğini gösteriyor. Sır başına ortalama bin üç yüz seksen altı dakika, yani yirmi üç saat; ama satırlar arasında yüz altmış beş ile dört bin altı yüz elli dakika arasında yirmi sekiz kat fark var.
Sütunlara bakıldığında farkın tamamı iki aşamadan geliyor. Teyit her satırda otuz dakika, sahibini bulma on ya da yüz seksen, üretme kırk beş ya da yüz yirmi. Tespit sütunu ise yirmiden iki bin sekiz yüz seksene çıkıyor — yüz kırk dört kat — ve yayılma sütunu altmıştan bin dört yüz kırka. Akışın süresini belirleyen şey müdahale ekibinin hızı değil, sızıntının nasıl fark edildiği ve yeni değerin ne kadar yavaş yayıldığıdır. İkisi de sızıntıdan önce belirlenmiştir.
Alt tablo aynı satırları çağrı hacmine çeviriyor ve sıralamayı bozuyor. Süre olarak en kötü kalem e-posta geçidi anahtarıdır, dört bin altı yüz elli dakikayla; ama iptale kadar en çok çağrı oturum imzalama anahtarından geçiyor: yüz kırk bir bin sekiz yüz yetmiş beş. O anahtar günde yüz seksen bin çağrı yetkilendiriyor ve bin yüz otuz beş dakika bu hacimde uzun bir süredir. Ters uçta belge imzalama anahtarı var: üç yüz kırk beş dakikada yalnız bin dört yüz seksen beş çağrı. Aynı akış, aynı yordam — sonuç iki kalemde yüz kat farklı, çünkü arkalarındaki trafik farklı.
Son satır bu konunun ikinci dersine bağlanıyor. Aynı sızıntı kısa ömürlü bir kimlik bilgisinde olsaydı bu akışın hiçbir adımı işlemezdi: fark edilmesi, sahibinin bulunması, yenisinin üretilmesi gerekmezdi; jeton altmış dakikada kendiliğinden geçersiz olurdu. En kötü kalemle arasındaki fark yetmiş sekiz kat. İptal akışı, ömrü kısaltılamayan sırlar için ödenen bedeldir.
Hangi Aşamayı Kısaltmak Ne Kazandırıyor
// hizlandirma.mjs — akisin hangi asamasini kisaltmak ne kazandiriyor, karsiliginda ne kesiyor import { AD, SIR, TESPIT, asama, toplam, cagri, gen } from "./iptal.mjs"; // yeni degere gecmeyi bekleMEden iptal edilirse okuyucular gecis suresi boyunca kesilir. // [uygulama, gecis(dk), gunluk istek] — onceki dersin gecis tablosundan. const OKUR = { "altyapi/onbellek": [["portal-api", 60, 96000]], "imza/oturum-imzalama": [["portal-onyuz", 960, 84000], ["portal-api", 60, 96000]], "imza/belge-imzalama": [["fatura-servisi", 240, 6200]], "dis/odeme-gecidi": [["fatura-servisi", 240, 6200], ["odeme-koprusu", 0, 3400]], "dis/eposta-gecidi": [["abone-kayit", 960, 1400], ["bildirim", 15, 12000], ["rapor-uretici", 1440, 320]], "dis/kisa-mesaj-gecidi": [["abone-kayit", 960, 1400], ["bildirim", 15, 12000]], }; const kesilen = (o) => o.beklemez ? Math.round(AD.reduce((t, s) => t + OKUR[s] .reduce((x, [, g, i]) => x + i * g / 1440, 0), 0)) : 0; const AYAR = [["bugun", {}, "-"], ["+ sahiplik kaydi", { kayit: 1 }, "dagitim"], ["+ onceden uretilmis yedek", { kayit: 1, yedek: 1 }, "dagitim"], ["+ surekli depo taramasi", { kayit: 1, yedek: 1, tarama: 1 }, "yapi"], ["+ yayilmayi beklemeden iptal", { kayit: 1, yedek: 1, tarama: 1, beklemez: 1 }, "calisma zamani"]]; const yz = gen([29, 11, 11, 15, 16]); console.log(yz(["onlem", "toplam dk", "kazanc", "gecen cagri", "kesilen istek"])); const T0 = AD.reduce((t, s) => t + toplam(s), 0); for (const [ad, o] of AYAR) { const T = AD.reduce((t, s) => t + toplam(s, o), 0); console.log(yz([ad, T, T0 - T, AD.reduce((t, s) => t + cagri(s, o), 0), kesilen(o)])); } const son = AYAR[AYAR.length - 1][1], onceki = AYAR[AYAR.length - 2][1]; const dC = AD.reduce((t, s) => t + cagri(s, onceki) - cagri(s, son), 0); console.log(`\nyayilmayi beklemeden iptal: ${dC} cagri kurtariyor, ${kesilen(son)} mesru istegi ` + `kesiyor (kurtarilan ${(dC / kesilen(son)).toFixed(1)} cagri basina 1 kesilen istek)`); console.log(`surekli depo taramasinin kazanci 0: iki sirrin kanali zaten depo ve tespit 20 dk, ` + `diger dortunun sizintisi depoya hic dusmuyor`); const yz2 = gen([18, 16, 9, 11, 27]); console.log(`\n${yz2(["sir", "sizinti kanali", "tespit", "cagri", "daha erken kapatma"])}`); const ERKEN = { depo: ["yapi", "hat sir taramasi"], gunluk: ["kod", "gunlukte maskeleme"], "istemci-paketi": ["yapi", "paket sir taramasi"], "ucuncu-taraf": ["yok", "-"] }; for (const s of AD) console.log(yz2([s.split("/")[1], SIR[s].kanal, asama(s).tespit, cagri(s), `${ERKEN[SIR[s].kanal][0]}: ${ERKEN[SIR[s].kanal][1]}`])); const kapanir = AD.filter((s) => ERKEN[SIR[s].kanal][0] !== "yok"); console.log(`\nsizinti kanali daha erken kapatilabilen sir: ${kapanir.length} / ${AD.length}; ` + `bu kanallarin tespit gecikmesi toplam ` + `${kapanir.reduce((t, s) => t + asama(s).tespit, 0)} dk`); const en = AD.reduce((x, s) => asama(s).tespit > asama(x).tespit ? s : x); console.log(`tek kalemde en buyuk pay: ${en} — ${asama(en).tespit} dk tespit gecikmesi ve ` + `${Math.round(SIR[en].cagri * asama(en).tespit / 1440)} cagri, tamami yapi asamasindan geliyor`);
onlem toplam dk kazanc gecen cagri kesilen istek bugun 8315 0 224171 0 + sahiplik kaydi 7975 340 221538 0 + onceden uretilmis yedek 7510 805 207648 0 + surekli depo taramasi 7510 805 207648 0 + yayilmayi beklemeden iptal 3610 4705 56714 68503 yayilmayi beklemeden iptal: 150934 cagri kurtariyor, 68503 mesru istegi kesiyor (kurtarilan 2.2 cagri basina 1 kesilen istek) surekli depo taramasinin kazanci 0: iki sirrin kanali zaten depo ve tespit 20 dk, diger dortunun sizintisi depoya hic dusmuyor sir sizinti kanali tespit cagri daha erken kapatma onbellek depo 20 27500 yapi: hat sir taramasi oturum-imzalama gunluk 90 141875 kod: gunlukte maskeleme belge-imzalama depo 20 1485 yapi: hat sir taramasi odeme-gecidi ucuncu-taraf 240 1511 yok: - eposta-gecidi istemci-paketi 2880 43271 yapi: paket sir taramasi kisa-mesaj-gecidi gunluk 90 8529 kod: gunlukte maskeleme sizinti kanali daha erken kapatilabilen sir: 5 / 6; bu kanallarin tespit gecikmesi toplam 3100 dk tek kalemde en buyuk pay: dis/eposta-gecidi — 2880 dk tespit gecikmesi ve 26800 cagri, tamami yapi asamasindan geliyor
İlk üç satır müdahale yordamına yazılan iki maddenin karşılığını veriyor. Her sır kaydına sahibini yazmak üç yüz kırk dakika kazandırıyor; her sır için önceden bir yedek değer üretip hazır tutmak dört yüz altmış beş dakika daha. İkisi birlikte sekiz bin üç yüz on beş dakikalık akışı yedi bin beş yüz ona indiriyor — yüzde on. İkisi de ucuzdur ve sızıntı olmadan önce yazılır; ama toplam kazanç akışın onda biridir.
Dördüncü satır bu kursun aradığı türden bir sonuçtur: kazancı sıfır olan önlem. Sürekli depo taraması müdahale süresini bir dakika bile kısaltmıyor. Nedeni alt tabloda yazılı: altı sızıntının yalnız ikisinin kanalı kod deposudur ve o ikisinde tespit zaten yirmi dakikadır. Diğer dördü depoya hiç düşmüyor. Tarama gücünü artırmak, taramanın hiç bakmadığı yerlerdeki sızıntıyı görünür kılmaz; bir savunmanın kapsadığı kalem kümesi sayılmadan yapılan her iyileştirme bu satırı üretir.
Beşinci satır asıl kararı içeriyor. Yeni değerin yayılmasını beklemeden eski değeri iptal etmek akışı yedi bin beş yüz ondan üç bin altı yüz ona indiriyor ve geçen çağrıyı iki yüz yedi binden elli altı bine düşürüyor — yüz elli bin dokuz yüz otuz dört çağrı kurtarılıyor. Karşılığında altmış sekiz bin beş yüz üç meşru istek kesiliyor: kurtarılan her iki virgül iki çağrı için bir meşru istek. Bu, sızıntı müdahalesinin gerçek kararıdır ve bir yordam maddesiyle çözülemez, çünkü doğru cevap sırra göre değişir: ödeme geçidi anahtarında yayılmayı beklememek makul olabilir, oturum imzalama anahtarında altmış bin isteği kesmek anlamına gelir.
Alt tablonun son sütunu kursun ekseni. Altı sızıntı kanalının beşi daha erken bir aşamada kapatılabilir ve o beş kanalın tespit gecikmesi toplam üç bin yüz dakikadır. En büyük tek pay e-posta geçidi anahtarındadır: saha uygulamasının istemci paketine gömülü olduğu için sızıntı ancak dış ihbarla, iki gün sonra fark ediliyor ve o iki günde anahtardan yirmi altı bin sekiz yüz çağrı geçiyor. Bu kalemin müdahale tarafında yapılacak hiçbir şeyi yoktur; anahtar paketin içine yapı aşamasında girdi ve orada bir sır taramasıyla hiç girmemiş olurdu. Günlük dosyasına düşen iki anahtar için de aynısı geçerli, bir aşama daha erken: günlük yazımında maskeleme bir kod kararıdır.
Geriye kalan tek kalem ödeme geçidi anahtarıdır. Sızıntı üçüncü tarafta oldu; ne yapı taraması ne kod maskelemesi görürdü. Bu kalem için iptal akışı gerçekten tek yoldur — altı kalemden biri.
Özet
- İptal akışı beş aşamadır: fark etme, teyit, sahibini bulma, yeni değeri üretme, yayılma. Kalan altı statik sırda toplam 8.315 dakika, sır başına ortalama 1.386 dakika (23,1 saat), en kötü kalemde 4.650 dakika.
- Süreyi belirleyen şey müdahale hızı değil, tespit ve yayılma sütunlarıdır: teyit her satırda 30 dakika iken tespit 20 ile 2.880 arasında, yayılma 60 ile 1.440 arasında değişiyor.
- İptale kadar sırlardan 224.171 çağrı geçiyor ve sıralama süre sıralamasıyla aynı değil: en uzun akış e-posta geçidinde (4.650 dk) ama en çok çağrı oturum imzalamada (141.875).
- Sahiplik kaydı 340, önceden üretilmiş yedek 465 dakika kazandırıyor — toplamın yüzde onu. Sürekli depo taramasının kazancı sıfırdır: altı sızıntının yalnız ikisi depoya düşüyor ve o ikisinde tespit zaten 20 dakika.
- Yayılmayı beklemeden iptal 150.934 çağrıyı kurtarıyor ve 68.503 meşru isteği kesiyor: kurtarılan her 2,2 çağrı için bir kesilen istek. Doğru cevap sırra göre değişir, yordama yazılamaz.
- Altı sızıntı kanalının beşi daha erken bir aşamada kapanabilirdi (toplam 3.100 dakika tespit gecikmesi); en büyük tek pay istemci paketine gömülü anahtardır — 2.880 dakika ve 26.800 çağrı, tamamı yapı aşamasından.
Sonraki Adım
Bu konu sırların ömrünü ölçtü ve kısalttı: erişim matrisi yetmiş dokuz kalemden otuz bire indi, on altı kalemde açık pencere iki bin kat daraldı, yirmi kalem iş yükü kimliğiyle tamamen ortadan kalktı ve kalan altı sır için iptal akışı dakika dakika yazıldı. Sırların artık bir sahibi, bir ömrü, bir döndürme takvimi ve bir sızıntı yordamı var.
Bütün bunların altında bir varsayım duruyor ve o varsayıma hiç dokunulmadı. Bu konuda ölçülen her şey bir servisin kendini kanıtlamasıyla ilgiliydi: doğru kimlik bilgisini taşıyan çağrı geçiyor, taşımayan geçmiyor. Ama bir çağrı kimlik bilgisini taşıyorsa ne oluyor. Saha uygulama arayüzü fatura servisini çağırdığında, fatura servisi o çağrının fatura verisini okumaya yetkili olup olmadığını hiç sormuyor; çağrının bir yerden geldiğini görüyor ve karşılıyor. Sır doğru yönetilse bile bu böyle kalırsa, tek bir servisin ele geçmesi ötekilere açılan bir kapıdır: dokuz servisin arasındaki her güven ilişkisi, bir servisten diğerine geçilebilecek bir yoldur. Sonraki konu o yolları sayar — kimlik doğrulaması olmayan servis çifti kaç, karşılıklı doğrulama bunların kaçını kapatıyor ve kapanmayanlar hangi aşamada kapatılabilirdi.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.