Ders 04 / 15
Güvenlik Başlıkları Kapsamı
Güvenlik başlıklarını uygulama içinden çıkarıp kenardan yönetmenin kapsadığı uç, uygulama ve istek sayısının dört ayrı sayımla ölçülmesi: kenardan geçmeyen tarayıcı yüzeyinin taşıdığı günlük istek, tarayıcı yüzeyi olmayan uçlarda yapılandırılmış ama etkisiz kalan hücre, sıkı bir kaynak kısıtlama politikasının kırdığı meşru sayfa sayısı ve politikanın sıkılaştırılabilmesi için kod aşamasında yapılması gereken iş.
İçindekiler
Önceki üç ders isteğe bakan savunmaları ölçtü: kural kümesi isteğin biçimine, hız sayacı istek sayısına, eşikler hesaba ve adrese baktı. Üçü de bir isteği durdurmaya ya da geçirmeye karar veriyordu. Çalışma zamanında verilen bir karar daha vardır ve hiçbir isteği durdurmaz: yanıtla birlikte gönderilen güvenlik başlıkları tarayıcının ne yapmasına izin verildiğini belirler.
Başlıkların ne yaptığı daha önceki bir kursta uygulama içinde ölçüldü ve burada tekrarlanmıyor. Bu dersin ölçüsü başkadır: başlık yapılandırması uygulamadan çıkarılıp önlerindeki kenar katmanına taşındığında kaç uygulama ve kaç uç aynı anda kapsanıyor, kapsamın dışında ne kalıyor. Bu, “yakalanan istek” sayısı üretmeyen bir savunmadır; ölçüsü kapsamdır ve kapsam sayılmadığında bir yapılandırma dosyası gerçek bir korumayla karıştırılır.
Başlık Nerede Yazılıyor
Bölgesel ölçüm ağının üretim ortamı node ile modelleniyor; gerçek bir sunucu ayağa
kaldırılmıyor ve hiçbir gerçek yanıt üretilmiyor.
- US16. On dört uç, dokuz uygulama, altı başlık ve günlük istek sayıları kurgusal ölçüm ağına aittir. Uçların bir bölümü ortak kenar katmanından geçiyor, bir bölümü doğrudan çağrılıyor.
- US17. “Tarayıcı yüzeyi” alanı, ucun bir tarayıcıya belge ya da tarayıcının yüklediği bir kaynak döndürüp döndürmediğini söyler. Güvenlik başlıkları yalnız tarayıcı yüzeyinde bir şey yapar; program arayüzünde yazılı olurlar ve hiçbir davranış değiştirmezler.
- US18. Kenardan yönetim, kenardan geçen her uca altı başlığın tamamını yazar. Kenardan geçmeyen uçta yalnız uygulamanın kendi yazdığı başlık kalır.
- US19. Kaynak kısıtlama politikası rapor kipinde koşturuluyor: engellenecek kaynak sayılıyor, gerçekten engellenmiyor. Kaynakların meşru olup olmadığı modelde biliniyor.
- US20. “Daha erken kapatma aşaması” sütunu her başlık için elle işaretlendi.
// uc.mjs — uretim ortamindaki uc noktalari, alti guvenlik basligi ve sayfa kaynaklari; model // [uc, uygulama, yol, tarayici yuzeyi mi, gunluk istek, uygulamanin kendi yazdigi baslik] export const UC = [ ['abone portali, sayfa', 'abone portali', 'kenar', true, 84000, 2], ['abone portali, program arayuzu', 'abone portali', 'kenar', false, 41000, 1], ['abone portali, kimlik dogrulama', 'abone portali', 'kenar', true, 6800, 2], ['saha uygulamasi, sayfa', 'saha uygulamasi', 'kenar', true, 12000, 0], ['saha uygulamasi, dosya yukleme', 'saha uygulamasi', 'kenar', false, 5400, 0], ['saha uygulamasi, mobil arka uc', 'saha uygulamasi', 'kenar', false, 22000, 0], ['fatura sayfasi', 'faturalama arayuzu', 'kenar', true, 9000, 3], ['rapor sayfasi', 'raporlama', 'kenar', true, 2600, 1], ['saglik yoklamasi', 'abone portali', 'kenar', false, 1440, 0], ['yonetim arayuzu', 'yonetim arayuzu', 'dogrudan', true, 900, 0], ['eski abone portali', 'eski portal', 'dogrudan', true, 3100, 1], ['duragan varlik konagi', 'varlik konagi', 'dogrudan', true, 62000, 0], ['sayac toplama arayuzu', 'sayac toplama', 'dogrudan', false, 150000, 0], ['faturalama servis arayuzu', 'faturalama servisi', 'dogrudan', false, 38000, 0], ]; // [baslik, durdurdugu kalem sinifi, daha erken kapatma asamasi] export const BASLIK = [ ['kaynak kisitlama politikasi', 'izinsiz betik yurutmesi', 'kod'], ['cerceveleme korumasi', 'sayfanin gomulmesi', 'yok'], ['tasima katmani zorlamasi', 'duz metin baglanti', 'yok'], ['icerik turu sabitlemesi', 'tur sezme', 'kod'], ['yonlendirici bilgisi politikasi', 'yolda sizan tanimlayici', 'kod'], ['tarayici yetenegi kisitlamasi', 'istenmeyen aygit erisimi', 'yok'], ]; // kenar yonetiminden sonra bir ucta yazili baslik sayisi export const yazili = (u) => (u[2] === 'kenar' ? BASLIK.length : u[5]); // bir baslik ancak tarayici yuzeyinde bir sey yapar export const etkili = (u) => (u[3] ? yazili(u) : 0); // [sayfa, kaynak, konum, mesru mu, gunluk yukleme] export const KAYNAK = [ ['abone portali, sayfa', 'uygulama betigi', 'ayni-koken', true, 84000], ['abone portali, sayfa', 'stil dosyasi', 'varlik-konagi', true, 84000], ['abone portali, sayfa', 'satir ici olcum betigi', 'satir-ici', true, 84000], ['abone portali, sayfa', 'bagimliliktan gelen ek betik', 'ucuncu-taraf', false, 84000], ['abone portali, kimlik dogrulama', 'form betigi', 'ayni-koken', true, 6800], ['abone portali, kimlik dogrulama', 'satir ici alan dogrulamasi', 'satir-ici', true, 6800], ['saha uygulamasi, sayfa', 'harita bileseni', 'varlik-konagi', true, 12000], ['saha uygulamasi, sayfa', 'satir ici durum betigi', 'satir-ici', true, 12000], ['fatura sayfasi', 'tablo betigi', 'ayni-koken', true, 9000], ['fatura sayfasi', 'yazi tipi', 'varlik-konagi', true, 9000], ['rapor sayfasi', 'cizim kitapligi', 'varlik-konagi', true, 2600], ['rapor sayfasi', 'enjekte satir ici betik', 'satir-ici', false, 2600], ]; export const POLITIKA = [ ['yalniz ayni koken', (k) => k[2] === 'ayni-koken'], ['arti varlik konagi', (k) => ['ayni-koken', 'varlik-konagi'].includes(k[2])], ['arti satir ici toptan', (k) => ['ayni-koken', 'varlik-konagi', 'satir-ici'].includes(k[2])], ['arti satir ici karma', (k) => ['ayni-koken', 'varlik-konagi'].includes(k[2]) || (k[2] === 'satir-ici' && k[3])], ];
Kapsama Nasıl Sayılırsa
// kapsama.mjs — basligi kenardan yonetmenin kapsadigi uc, istek ve hucre import { UC, BASLIK, yazili, etkili } from './uc.mjs'; const s = (x, n) => String(x).padStart(n); const T = (f) => UC.filter(f).reduce((t, u) => t + u[4], 0); const N = (f) => UC.filter(f).length; console.log(`${UC.length} uc, ${new Set(UC.map((u) => u[1])).size} uygulama, ${BASLIK.length} baslik` + ` = ${UC.length * BASLIK.length} hucre; gunde ${T(() => true)} istek\n`); console.log(`${'uc'.padEnd(33)}${s('yol', 10)}${s('tarayici', 10)}${s('gunluk', 8)}` + `${s('kendi yazdigi', 15)}${s('kenardan sonra', 16)}${s('etkili', 8)}`); for (const u of UC) console.log(`${u[0].padEnd(33)}${s(u[2], 10)}${s(u[3] ? 'evet' : 'hayir', 10)}${s(u[4], 8)}` + `${s(u[5], 15)}${s(yazili(u), 16)}${s(etkili(u), 8)}`); const sonra = UC.reduce((t, u) => t + yazili(u), 0), etk = UC.reduce((t, u) => t + etkili(u), 0); console.log(`\n${'olcu'.padEnd(38)}${s('once', 8)}${s('kenardan sonra', 16)}`); for (const [a, b, c] of [ ['yazili baslik hucresi', UC.reduce((t, u) => t + u[5], 0), sonra], ['tarayici yuzeyinde etkili hucre', UC.reduce((t, u) => t + (u[3] ? u[5] : 0), 0), etk], ['baslik yazan uc sayisi', N((u) => u[5] > 0), N((u) => yazili(u) > 0)], ]) console.log(`${a.padEnd(38)}${s(b, 8)}${s(c, 16)}`); console.log(`\n${'kapsama nasil sayilirsa'.padEnd(38)}${s('kapsanan', 10)}${s('toplam', 8)}${s('%', 8)}`); for (const [a, b, c] of [ ['uc sayisiyla', N((u) => u[2] === 'kenar'), UC.length], ['istek hacmiyle', T((u) => u[2] === 'kenar'), T(() => true)], ['tarayici yuzeyindeki istek hacmiyle', T((u) => u[2] === 'kenar' && u[3]), T((u) => u[3])], ['tarayici hucresiyle', etk, N((u) => u[3]) * BASLIK.length], ]) console.log(`${a.padEnd(38)}${s(b, 10)}${s(c, 8)}${s((100 * b / c).toFixed(1), 8)}`); console.log(`\nkapsam disinda kalan tarayici yuzeyi (kenara alinsa kazanilan):`); for (const u of UC.filter((x) => x[3] && x[2] !== 'kenar')) console.log(` ${u[0].padEnd(24)}${s(u[4], 8)} istek/gun, ${s(BASLIK.length - u[5], 2)} hucre kazanilir`); console.log(`\nyapilandirilmis ama etkisiz hucre (tarayici yuzeyi olmayan uclarda): ${sonra - etk}`);
14 uc, 9 uygulama, 6 baslik = 84 hucre; gunde 438240 istek uc yol tarayici gunluk kendi yazdigi kenardan sonra etkili abone portali, sayfa kenar evet 84000 2 6 6 abone portali, program arayuzu kenar hayir 41000 1 6 0 abone portali, kimlik dogrulama kenar evet 6800 2 6 6 saha uygulamasi, sayfa kenar evet 12000 0 6 6 saha uygulamasi, dosya yukleme kenar hayir 5400 0 6 0 saha uygulamasi, mobil arka uc kenar hayir 22000 0 6 0 fatura sayfasi kenar evet 9000 3 6 6 rapor sayfasi kenar evet 2600 1 6 6 saglik yoklamasi kenar hayir 1440 0 6 0 yonetim arayuzu dogrudan evet 900 0 0 0 eski abone portali dogrudan evet 3100 1 1 1 duragan varlik konagi dogrudan evet 62000 0 0 0 sayac toplama arayuzu dogrudan hayir 150000 0 0 0 faturalama servis arayuzu dogrudan hayir 38000 0 0 0 olcu once kenardan sonra yazili baslik hucresi 10 55 tarayici yuzeyinde etkili hucre 9 31 baslik yazan uc sayisi 6 10 kapsama nasil sayilirsa kapsanan toplam % uc sayisiyla 9 14 64.3 istek hacmiyle 184240 438240 42.0 tarayici yuzeyindeki istek hacmiyle 114400 180400 63.4 tarayici hucresiyle 31 48 64.6 kapsam disinda kalan tarayici yuzeyi (kenara alinsa kazanilan): yonetim arayuzu 900 istek/gun, 6 hucre kazanilir eski abone portali 3100 istek/gun, 5 hucre kazanilir duragan varlik konagi 62000 istek/gun, 6 hucre kazanilir yapilandirilmis ama etkisiz hucre (tarayici yuzeyi olmayan uclarda): 24
Kenardan yönetimin kazancı ilk özet tablosunda yazılı ve küçük değildir: yazılı başlık hücresi ondan elli beşe çıkıyor, yani tek bir yapılandırma değişikliği kırk beş hücreyi aynı anda dolduruyor. Uygulama içinde bu iş dokuz ayrı kod tabanında dokuz kez yapılırdı ve dört uygulama hiç yapmamıştı. Kenar katmanının gerçek üstünlüğü budur: kapsam, uygulama ekiplerinin ayrı ayrı vereceği kararlardan çıkarılmıştır.
İkinci tablo aynı kapsamı dört ayrı sayımla veriyor ve dördü farklı sayı üretiyor: uç sayısıyla yüzde 64,3, istek hacmiyle yüzde 42,0, tarayıcı yüzeyindeki istek hacmiyle yüzde 63,4, tarayıcı hücresiyle yüzde 64,6. Aynı katman için dört farklı kapsama oranı yazılabiliyor ve hangisinin raporlandığı bir tercihtir. İstek hacmi sayımının düşük çıkmasının nedeni sayaç toplama arayüzünün günde yüz elli bin istek taşıması, ancak o ucun bir tarayıcıdan çağrılmamasıdır; o uçta başlık olsa da olmasa da hiçbir şey değişmez. Bu yüzden anlamlı sayım üçüncüsüdür: tarayıcı yüzeyindeki isteğin ne kadarı kapsanıyor.
Alt liste asıl bulguyu veriyor. Kapsam dışında kalan üç uç var ve bunlardan biri günde altmış iki bin istek taşıyan durağan varlık konağıdır. Uygulama envanterinde bir “uygulama” olarak görünmediği için kapsama tablolarında hiç sayılmaz; oysa tarayıcı ondan gelen kaynakları yüklüyor ve o kaynaklar hiçbir başlık taşımıyor. Yönetim arayüzü ile eski abone portalı toplam dört bin istek eder, yani kapsam dışı hacmin yüzde altısı. Kapsamı genişletme işinin sırasını bu liste belirler ve envantere hiç girmemiş uç, sıradaki en büyük kalemdir.
Son satır ters yöndeki kusuru sayıyor: yirmi dört hücre yapılandırılmış ama etkisizdir. Program arayüzü uçlarında altı başlık da yazılıdır, denetim listesinde yeşil görünürler ve hiçbir davranış değiştirmezler. Yapılandırma sayısı bir koruma ölçüsü değildir.
Sıkı Politikanın Kırdığı Sayfa
Kapsam bir yanlış pozitif üretmez; başlığın içeriği üretir. Kaynak kısıtlama politikası sıkılaştırıldığında engellenen şey yalnız izinsiz betik değil, sayfanın kendi kaynaklarıdır.
// politika.mjs — kaynak kisitlama politikasini rapor kipinde kosturup kirilan mesru kaynagi saymak import { UC, BASLIK, KAYNAK, POLITIKA, yazili } from './uc.mjs'; const s = (x, n) => String(x).padStart(n); const kapsanan = new Set(UC.filter((u) => u[3] && yazili(u) === BASLIK.length).map((u) => u[0])); const K = KAYNAK.filter((k) => kapsanan.has(k[0])); console.log(`politika yalniz kenardan yonetilen ${kapsanan.size} tarayici ucunda gecerli;` + ` bu uclarda ${K.length} kaynak var\n`); console.log(`${'politika'.padEnd(24)}${s('engellenen mesru', 18)}${s('kirilan sayfa', 15)}` + `${s('engellenen kotu', 17)}${s('gecen kotu', 12)}`); for (const [ad, izin] of POLITIKA) { const eng = K.filter((k) => !izin(k)), m = eng.filter((k) => k[3]); console.log(`${ad.padEnd(24)}${s(m.length, 18)}${s(new Set(m.map((k) => k[0])).size, 15)}` + `${s(eng.filter((k) => !k[3]).length, 17)}${s(K.filter((k) => izin(k) && !k[3]).length, 12)}`); } const satirIci = K.filter((k) => k[2] === 'satir-ici' && k[3]); const izin2 = POLITIKA[1][1], kodSonrasi = K.filter((k) => k[2] !== 'satir-ici' || !k[3]); console.log(`\nkarma listesine yazilmasi gereken satir ici betik: ${satirIci.length}`); console.log(`satir ici betikler kod asamasinda kaldirilirsa "arti varlik konagi" politikasi:` + ` engellenen mesru ${kodSonrasi.filter((k) => k[3] && !izin2(k)).length},` + ` gecen kotu ${kodSonrasi.filter((k) => !k[3] && izin2(k)).length}`); console.log(`\n${'baslik'.padEnd(33)}${'durdurdugu kalem'.padEnd(26)}${s('erken asama', 13)}`); for (const [ad, kalem, asama] of BASLIK) console.log(`${ad.padEnd(33)}${kalem.padEnd(26)}${s(asama, 13)}`); const yok = BASLIK.filter((b) => b[2] === 'yok'); console.log(`\nyalniz bu katmanda kapatilabilen baslik ${yok.length}/${BASLIK.length};` + ` bunlarin etkili oldugu uc ${UC.filter((u) => u[3] && yazili(u) === BASLIK.length).length},` + ` gunde ${UC.filter((u) => u[3] && yazili(u) === BASLIK.length).reduce((t, u) => t + u[4], 0)} istek`);
politika yalniz kenardan yonetilen 5 tarayici ucunda gecerli; bu uclarda 12 kaynak var politika engellenen mesru kirilan sayfa engellenen kotu gecen kotu yalniz ayni koken 7 5 2 0 arti varlik konagi 3 3 2 0 arti satir ici toptan 0 0 1 1 arti satir ici karma 0 0 2 0 karma listesine yazilmasi gereken satir ici betik: 3 satir ici betikler kod asamasinda kaldirilirsa "arti varlik konagi" politikasi: engellenen mesru 0, gecen kotu 0 baslik durdurdugu kalem erken asama kaynak kisitlama politikasi izinsiz betik yurutmesi kod cerceveleme korumasi sayfanin gomulmesi yok tasima katmani zorlamasi duz metin baglanti yok icerik turu sabitlemesi tur sezme kod yonlendirici bilgisi politikasi yolda sizan tanimlayici kod tarayici yetenegi kisitlamasi istenmeyen aygit erisimi yok yalniz bu katmanda kapatilabilen baslik 3/6; bunlarin etkili oldugu uc 5, gunde 114400 istek
Dört satır bir sıkılık eğrisidir. En sıkı politika iki kötü kaynağı engelliyor ve yanında yedi meşru kaynağı da engelleyerek beş sayfanın tamamını kırıyor; kapsanan her tarayıcı ucu bozulmuş demektir. Varlık konağına izin verilince kırılan sayfa üçe iner, kötü kaynak yine ikidir. Üçüncü satır üretimde en sık görülen kaçış yoludur: satır içi betiklere toptan izin verilir, kırılan sayfa sıfıra iner — ve rapor sayfasındaki enjekte satır içi betik de aynı izinle geçer. Kırılan sayfa sayısını sıfırlayan bu ayar, politikanın engellediği kötü kaynağı ikiden bire düşürür.
Dördüncü satır ikisini birden veriyor: satır içi betiklere karma listesiyle izin verildiğinde kırılan sayfa sıfır, engellenen kötü kaynak ikidir. Bedeli listenin kendisidir. Üç satır içi betik karma listesine yazılmalıdır ve bu betiklerden biri değiştiğinde liste güncellenmezse sayfa kırılır. Politika artık bir başlık değeri değil, kodun her sürümünde bakılacak bir envanterdir — birinci dersteki muafiyet listesiyle aynı türden bir yük.
Bir alt satır kursun sorusunu yanıtlıyor. Satır içi betikler kod aşamasında kaldırılırsa “artı varlık konağı” politikası hem sıfır meşru kaynak engelliyor hem de sıfır kötü kaynak geçiriyor: karma listesine gerek kalmıyor. Başlık aynı sonucu ancak sürekli bakım karşılığında veriyor. Alt tablo bu ayrımı altı başlığa yayıyor: üçünün durdurduğu kalem kod aşamasında kapatılabilir, üçünün aşaması yoktur. Bu üçü tarayıcının davranışını belirler ve uygulama kodundan söylenemez; katmanın karşılıksız payı budur ve beş uçta, günde yüz on dört bin dört yüz istekte geçerlidir.
Özet
- Başlığı kenardan yönetmek yazılı hücreyi 10’dan 55’e çıkardı ve dört uygulamayı ilk kez kapsama aldı; kapsam artık uygulama ekiplerinin ayrı kararlarına bağlı değildir.
- Aynı kapsam dört ayrı sayımla dört ayrı oran veriyor: uç sayısıyla yüzde 64,3, istek hacmiyle yüzde 42,0, tarayıcı yüzeyindeki istek hacmiyle yüzde 63,4, tarayıcı hücresiyle yüzde 64,6. Anlamlı olan üçüncüsüdür; ötekiler tarayıcının hiç görmediği uçları da sayar.
- Kapsam dışında üç tarayıcı ucu kaldı ve bunların 66.000 isteğinin 62.000’i envanterde “uygulama” olarak görünmeyen durağan varlık konağına aittir. Buna karşılık 24 hücre yapılandırılmış ama etkisizdir: program arayüzü uçlarında başlık yazılıdır, bir şey yapmaz.
- Kaynak kısıtlama politikası en sıkı ayarda 2 kötü kaynağı engellerken 7 meşru kaynağı da engelledi ve 5 sayfanın hepsini kırdı. Satır içi betiğe toptan izin kırılmayı sıfırladı ama engellenen kötü kaynağı 2’den 1’e düşürdü; karma listesi ikisini birden verdi (0 kırılan, 2 engellenen) ve karşılığında 3 satırlık bir bakım envanteri getirdi.
- Satır içi betikler kod aşamasında kaldırılırsa politika karma listesi olmadan 0 kırılan ve 0 geçen kötü kaynak veriyor. Altı başlığın üçünün durdurduğu kalem kod aşamasında kapanır; yalnız bu katmanda kapatılabilen üç başlık 5 uçta, günde 114.400 istekte geçerlidir.
Sonraki Adım
Bu dersin ölçüsü kapsamdı ve kapsam bir yanıtla birlikte gönderilen değerlerle sağlandı. Önceki üç ders ise isteğin biçimine, sayısına ve kimliğine baktı. Dördünün de ortak sınırı aynıdır: karar tek bir istek ya da tek bir yanıt üzerinde veriliyor. Oysa birinci dersten beri hiçbir ayarda durdurulamayan kalem — iş akışı dışı toplu indirme — tek tek isteklerde kusursuz görünüyordu; yanlış olan tek şey aynı oturumun isteklerinin birlikte çizdiği şekildi. Sonraki ders savunmayı isteğin dışına çıkarıp oturumun davranışına bakıyor, taban çizgisinden sapan oturumu anormallik puanıyla işaretliyor ve asıl soruyu oraya soruyor: sapma başladıktan kaç dakika sonra.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.