Ders 07 / 15
En Az Yetki
Aynı erişim grafiğinin her adımı bir izin kalemine bağlanır ve her kalemin açtığı yol ile taşıdığı günlük meşru istek yan yana sayılır. Meşru trafik taşımayan kalemlerin bedelsiz kaldırılması ölçülür, ardından yol başına durdurulan istek eşiği taranarak daraltmanın durduğu yer bulunur.
İçindekiler
Önceki ders beş savunma katmanını aynı grafiğe ekledi ve elli beş yolun elli ikisini kapattı. Kapanan yolların hepsi bir adımın geçilememesiyle kapandı: süzgeç geçirmedi, kimlik tanınmadı, girdi kabul edilmedi. Katmanların hiçbiri ikinci bir soruyu sormadı — adımı atan özne hedef kaleme dokunma iznine sahip mi? Bu ders o soruyu sorar ve grafiği izin kümesi olarak yeniden okur.
En az yetki (least privilege), her özneye işini yapmaya yeten en dar izin kümesinin verilmesidir. Bulut Yönetişimi, Güvenlik ve Maliyet kursunda aynı ilke verilen izin ile kullanılan izin oranı üzerinden ölçülmüştü; burada ölçü birimi yol sayısıdır. Bir izin kalemi kaldırıldığında grafikten bir adım düşer ve o adımdan geçen bütün yollar kapanır. Aynı adımdan meşru işler de geçtiği için her kaldırma iki sayı üretir: kapanan yol ve duran günlük istek. İlke ancak ikisi birlikte yazıldığında ölçülmüş sayılır.
- SI7. İzin kalemi
(özne, kalem, eylem)üçlüsüdür ve grafikteki bir adıma birebir karşılık gelir. Yirmi iki kenar, yirmi iki izin kalemi demektir. - SI8. Eylem eşlemesi bir model kararıdır: her adıma
oku,yazya dayonetatandı. Gerçekte bir adım birden çok eylem gerektirebilir; bu kalem sayısını büyütür, ölçünün yönünü değiştirmez. - SI9. Bir izin kalemi ya verilmiştir ya verilmemiştir. Koşul ifadesi, kayıt düzeyinde daraltma ve süreli izin modellenmiyor.
- SI10. Günlük meşru istek sayıları önceki dersteki akış modelinden gelir; ölçülmedi, seçildi.
- SI11. Bir meşru akış, adımlarından biri kapandığında tamamen durur. Yedek yol üzerinden devam etme modellenmiyor; bu, durma sayısını yüksek gösterir.
Adımın İkinci Koşulu
Grafik değişmedi; üzerine ikinci bir okuma bindi. Her kenar artık bir izin kaleminin adıdır ve o kalem kaldırıldığında kenar da düşer.
// ag.mjs — kurgusal bolgesel olcum aginin erisim grafigi ve mesru akislari (model) export const GIRIS = ['saha-uc', 'sube-agi', 'genel-uc', 'bakim-uc']; export const VARLIK = ['olcum-deposu', 'fatura-vt', 'abone-kayit', 'yapilandirma']; export const KENAR = [ ['saha-uc', 'toplayici'], ['saha-uc', 'is-emri'], ['sube-agi', 'toplayici'], ['sube-agi', 'is-emri'], ['sube-agi', 'yonetim'], ['genel-uc', 'toplayici'], ['bakim-uc', 'yonetim'], ['bakim-uc', 'kuyruk'], ['toplayici', 'kuyruk'], ['toplayici', 'olcum-deposu'], ['kuyruk', 'dogrulayici'], ['kuyruk', 'faturalama'], ['dogrulayici', 'olcum-deposu'], ['dogrulayici', 'fatura-vt'], ['faturalama', 'fatura-vt'], ['faturalama', 'abone-kayit'], ['is-emri', 'kuyruk'], ['is-emri', 'abone-kayit'], ['yonetim', 'toplayici'], ['yonetim', 'dogrulayici'], ['yonetim', 'is-emri'], ['yonetim', 'yapilandirma'], ]; // Mesru akis: gunluk kosan is; adim dizisi ayni grafigin kenarlarindan gecer. export const AKIS = [ ['saha-okuma', ['saha-uc', 'toplayici', 'kuyruk'], 1440], ['dogrulama', ['kuyruk', 'dogrulayici', 'olcum-deposu'], 1440], ['genel-okuma', ['genel-uc', 'toplayici', 'olcum-deposu'], 300], ['sube-sorgu', ['sube-agi', 'toplayici', 'olcum-deposu'], 210], ['fatura-yazimi', ['kuyruk', 'faturalama', 'fatura-vt'], 48], ['is-emri-acma', ['sube-agi', 'is-emri', 'abone-kayit'], 32], ['is-emri-kuyruk', ['sube-agi', 'is-emri', 'kuyruk'], 32], ['abone-guncelleme', ['faturalama', 'abone-kayit'], 6], ['yapilandirma-degisikligi', ['sube-agi', 'yonetim', 'yapilandirma'], 2], ['bakim-oturumu', ['bakim-uc', 'yonetim', 'toplayici'], 1], ['kuyruk-bakimi', ['bakim-uc', 'kuyruk'], 1], ['mutabakat', ['yonetim', 'dogrulayici', 'fatura-vt'], 1], ]; export const ad = (a, b) => `${a}>${b}`; export const adimlar = (d) => d.slice(0, -1).map((x, i) => ad(x, d[i + 1])); export function yollar(kapali = new Set()) { const komsu = new Map(); for (const [a, b] of KENAR) if (!kapali.has(ad(a, b))) komsu.set(a, [...(komsu.get(a) || []), b]); const s = []; const yuru = (d, y) => { if (VARLIK.includes(d)) return void s.push(y); for (const k of komsu.get(d) || []) if (!y.includes(k)) yuru(k, [...y, k]); }; for (const g of GIRIS) yuru(g, [g]); return s; } export const kesilen = (kapali) => AKIS.filter(([, d]) => adimlar(d).some((k) => kapali.has(k)));
// yetki.mjs — her adimin gerektirdigi izin kalemi: (ozne, kalem, eylem) export const EYLEM = { 'saha-uc>toplayici': 'yaz', 'saha-uc>is-emri': 'yaz', 'sube-agi>toplayici': 'oku', 'sube-agi>is-emri': 'yaz', 'sube-agi>yonetim': 'yonet', 'genel-uc>toplayici': 'oku', 'bakim-uc>yonetim': 'yonet', 'bakim-uc>kuyruk': 'yonet', 'toplayici>kuyruk': 'yaz', 'toplayici>olcum-deposu': 'yaz', 'kuyruk>dogrulayici': 'oku', 'kuyruk>faturalama': 'oku', 'dogrulayici>olcum-deposu': 'yaz', 'dogrulayici>fatura-vt': 'yaz', 'faturalama>fatura-vt': 'yaz', 'faturalama>abone-kayit': 'yaz', 'is-emri>kuyruk': 'yaz', 'is-emri>abone-kayit': 'yaz', 'yonetim>toplayici': 'yonet', 'yonetim>dogrulayici': 'yonet', 'yonetim>is-emri': 'yonet', 'yonetim>yapilandirma': 'yaz', }; export const kalemAdi = (k) => `${k.split('>')[0]}.${k.split('>')[1]}.${EYLEM[k]}`;
// kosum1.mjs — izin matrisi: her kalem kac yol aciyor, kac gunluk mesru istek tasiyor import { AKIS, KENAR, ad, adimlar, yollar } from './ag.mjs'; import { kalemAdi } from './yetki.mjs'; const y = yollar(), kalem = KENAR.map(([a, b]) => ad(a, b)); const yolu = (k) => y.filter((p) => adimlar(p).includes(k)).length; const istek = (k) => AKIS.filter(([, d]) => adimlar(d).includes(k)).reduce((s, [, , n]) => s + n, 0); console.log(`izin kalemi ${kalem.length}, yol ${y.length}, gunluk mesru istek ${AKIS.reduce((s, [, , n]) => s + n, 0)}`); console.log('\nizin kalemi actigi yol gunluk mesru istek'); for (const [k, a, i] of kalem.map((k) => [k, yolu(k), istek(k)]).sort((p, q) => q[1] - p[1])) console.log(`${kalemAdi(k).padEnd(30)}${String(a).padEnd(12)}${i}`); const bos = kalem.filter((k) => istek(k) === 0); console.log(`\nmesru trafik tasimayan kalem ${bos.length}: ${bos.map(kalemAdi).join(', ')}`);
izin kalemi 22, yol 55, gunluk mesru istek 3513 izin kalemi actigi yol gunluk mesru istek toplayici.kuyruk.yaz 20 1440 kuyruk.dogrulayici.oku 20 1440 kuyruk.faturalama.oku 20 48 is-emri.kuyruk.yaz 16 32 sube-agi.yonetim.yonet 13 2 bakim-uc.yonetim.yonet 13 1 dogrulayici.olcum-deposu.yaz 12 1440 dogrulayici.fatura-vt.yaz 12 1 faturalama.fatura-vt.yaz 10 48 faturalama.abone-kayit.yaz 10 6 yonetim.toplayici.yonet 10 1 yonetim.is-emri.yonet 10 0 saha-uc.toplayici.yaz 5 1440 saha-uc.is-emri.yaz 5 0 sube-agi.toplayici.oku 5 210 sube-agi.is-emri.yaz 5 64 genel-uc.toplayici.oku 5 300 toplayici.olcum-deposu.yaz 5 510 bakim-uc.kuyruk.yonet 4 1 is-emri.abone-kayit.yaz 4 32 yonetim.dogrulayici.yonet 4 1 yonetim.yapilandirma.yaz 2 2 mesru trafik tasimayan kalem 2: saha-uc.is-emri.yaz, yonetim.is-emri.yonet
Tablo iki sütunu yan yana koyduğu için okunması gerekenden farklı okunur. Sol sütun yüksek olan kalem tehlikeli, sağ sütun yüksek olan kalem vazgeçilmez değildir; karar iki sütunun oranına bağlıdır. Kuyruğa yazma izni yirmi yol açıyor ama günde bin dört yüz kırk meşru isteği de taşıyor. Doğrulayıcının fatura veritabanına yazma izni de on iki yol açıyor ve günde yalnız bir meşru istek taşıyor. İki kalem yakın sayıda yol açar, ama biri kaldırıldığında ağ durur, diğeri kaldırıldığında günde bir mutabakat işi durur.
Aynı satır çiftini karşılaştırmak ilkeyi somutlaştırıyor. Şube ağının yönetim istasyonuna yönetme izni on üç yol açıyor ve günde iki istek taşıyor; bakım ucununki de on üç yol açıyor, bir istek taşıyor. Yirmi iki kalemin sekizi günde beşten az istek taşıyor ve bunlar toplamda yolların çoğunu açan kalemlerdir. En az yetki ilkesinin işe yaradığı yer tam olarak burasıdır: seyrek kullanılan ama geniş açan kalemler.
Eylem sütunu okunmadığı hâlde tabloyu açıklıyor. Altı kalem yonet eylemi taşıyor ve bu altısının
taşıdığı günlük meşru istek toplamı yedidir; buna karşılık dördü onun üzerinde yol açıyor. Yönetme
izni doğası gereği geniştir: bir düğümü yönetebilen özne o düğümün bütün çıkış adımlarını da
kullanabilir. Tabloda yönetim istasyonunun üç ayrı yönetme izni ayrı satırlar hâlinde duruyor ama
üçü de aynı öznenin elinde toplanıyor. İzin kalemlerini tek tek saymak bu yığılmayı gizler; yol
sayımı ise gizlemez, çünkü aynı öznenin izinleri aynı yollarda birleşir.
Son satır ise ilkenin en ucuz kısmını veriyor. İki kalem hiçbir meşru istek taşımıyor: saha ucunun iş emri servisine yazma izni ve yönetim istasyonunun iş emri servisini yönetme izni. İkisi de verildi, ikisi de kullanılmıyor.
Daraltma Sınırı
Kaldırma sırası önemlidir. Önce bedelsiz kalemler, sonra yol başına durdurduğu istek oranına göre
sıralanmış kalemler kaldırılıyor. Eşik, bir kalemin kaldırılmasının kabul edildiği en düşük
açtığı yol / taşıdığı istek değeridir.
// kosum2.mjs — daraltma: once bedelsiz kalemler, sonra yol/istek esigi taranir import { AKIS, KENAR, ad, adimlar, yollar } from './ag.mjs'; const y = yollar(), tum = y.length, kalem = KENAR.map(([a, b]) => ad(a, b)); const yolu = (k) => y.filter((p) => adimlar(p).includes(k)).length; const istek = (k) => AKIS.filter(([, d]) => adimlar(d).includes(k)).reduce((s, [, , n]) => s + n, 0); const bos = kalem.filter((k) => istek(k) === 0); console.log(`bedelsiz daraltma: ${bos.length} kalem kaldirildi, kalan yol ${yollar(new Set(bos)).length}, duran mesru istek 0`); console.log('\nesik kaldirilan kalan duran duran kapanan yol basina'); console.log(' kalem yol akis gunluk duran istek'); for (const t of [Infinity, 10, 4, 1, 0.4, 0.1, 0]) { const kap = new Set([...bos, ...kalem.filter((k) => istek(k) > 0 && yolu(k) / istek(k) >= t)]); const kalan = yollar(kap).length; const kes = AKIS.filter(([, d]) => adimlar(d).some((k) => kap.has(k))); const dur = kes.reduce((s, [, , n]) => s + n, 0); console.log(`${(t === Infinity ? '-' : String(t)).padEnd(6)}${String(kap.size).padEnd(12)}${String(kalan).padEnd(7)}` + `${String(kes.length).padEnd(7)}${String(dur).padEnd(8)}${(dur / (tum - kalan)).toFixed(1)}`); }
bedelsiz daraltma: 2 kalem kaldirildi, kalan yol 40, duran mesru istek 0
esik kaldirilan kalan duran duran kapanan yol basina
kalem yol akis gunluk duran istek
- 2 40 0 0 0.0
10 5 21 2 2 0.1
4 8 16 4 5 0.1
1 10 12 5 11 0.3
0.4 12 7 7 91 1.9
0.1 14 6 8 123 2.5
0 22 0 12 3513 63.9
İlk satır ilkenin bedava kısmıdır. İki kullanılmayan kalem kaldırıldığında elli beş yolun on beşi kapanıyor ve hiçbir meşru iş durmuyor. Yolların yüzde yirmi yedisi sıfır bedelle gitti; bu iki kalem, kimsenin fark etmediği ve hiç kullanılmadığı için de fark edilemeyecek olan kalemlerdi.
İkinci ve üçüncü satırlar ilkenin ucuz kısmıdır. Eşik on olduğunda beş kalem kaldırılıyor, kalan yol kırktan yirmi bire iniyor ve karşılığında günde iki istek duruyor. Eşik dörde indiğinde kalan yol on altı, duran istek beş. Otuz dokuz yol, günde beş isteğin bedeliyle kapandı — kapanan yol başına onda bir istek.
Duran akış sütunu hangi işlerin sırayla düştüğünü söylüyor ve sıra rastgele değil. Eşik on iken duran iki akış, günde bir ve iki istek taşıyan bakım oturumu ve mutabakattır; eşik dörde inince kuyruk bakımı ve yapılandırma değişikliği eklenir. Yüksek eşikte kaldırılan kalemler seyrek kullanılanlar olduğu için, ilk duran işler de seyrek koşan işlerdir: bakım, mutabakat, elle yapılan yapılandırma. Bunlar günlük hacimde görünmez ama gerekli oldukları anda gereklidir ve o an genellikle bir arıza anıdır. Kalan sekiz akış — okuma yükleme, doğrulama, sorgu, faturalama — ancak eşik sıfır virgül dördün altına inince düşmeye başlar.
Dördüncü satırdan sonra eğri kırılıyor. Eşik birden sıfır virgül dörde inerken kalan yol on ikiden yediye düşüyor, ama duran günlük istek on birden doksan bire çıkıyor. Beş yol daha kapatmanın bedeli seksen istek, yani yol başına on altı istek — bir önceki adımın kırk katı. Eşik sıfıra indirildiğinde bütün yollar kapanıyor ve on iki meşru akışın tamamı, günde üç bin beş yüz on üç istek duruyor. Ağ artık güvenlidir ve artık ağ değildir.
Kırk Üç Yolun Fiyatı
Tablo bir eğri çiziyor ve eğrinin adı en az yetkinin gerçek şeklidir. Elli beş yolun kırk üçü günde on bir isteğin bedeliyle kapatılabiliyor; geri kalan on iki yol için ödenmesi gereken üç bin beş yüz iki istektir. Yolların yüzde yetmiş sekizi bedelin yüzde sıfır virgül üçüyle kapanıyor.
Aynı eğri, en az yetkinin neden yarım bırakıldığını da açıklıyor. Kolay kısmı bittiğinde geriye kalan iş, her adımda bir meşru akışı durdurmayı göze almayı gerektirir; bu da bir güvenlik kararı değil, işletme kararıdır ve güvenlik ekibinin tek başına veremeyeceği bir karardır. Eşiğin nerede durduğu bu yüzden ölçümden değil, durdurulmasına razı olunan işten çıkar.
Bu oran ilkenin nasıl uygulanacağını da söylüyor. Daraltmayı “hangi izin fazla” sorusuyla başlatmak yanlış sıralamadır; doğru sıralama “hangi izin çok yol açıp az iş taşıyor” sorusudur. İki soru aynı cevabı vermez: kuyruğa yazma izni yirmi yolla listenin en tepesindedir ama günde bin dört yüz kırk istek taşıdığı için son kaldırılacak kalemler arasındadır. Yönetim istasyonunun iş emri servisini yönetme izni ise on yolla listenin ortasındadır ve ilk kaldırılacak kalemdir, çünkü hiçbir iş taşımaz.
Kalan on iki yolun neden pahalı olduğu da tablodan okunuyor. O yollar meşru akışların üzerinden geçtiği kenarlardan oluşuyor: saha ucundan toplayıcıya, toplayıcıdan kuyruğa, kuyruktan doğrulayıcıya. Bir saldırı yolu ile bir iş akışı burada aynı kenarı paylaşıyor ve izin kalemi ikisini ayırt edemiyor, çünkü izin kalemi yalnız “kim, neye, ne yapabilir” sorusunu yanıtlar. En az yetkinin sınırı bu ayırt edememedir. Daraltma yolları meşru kanalın genişliğine indirir ve orada durur — önceki derste beş katmanın durduğu yerin aynısı, farklı bir yoldan.
Tablonun göstermediği iki şey de kararın parçasıdır. Birincisi, daraltma bir kez yapılıp bitmez: ağa bir servis eklendiğinde kenar sayısı büyür, yeni kenarların açtığı yollar ilk gün geniş verilir ve eşik yeniden taranana kadar açık kalır. Ölçüm bir andaki fotoğraftır, sürekli bir durum değil. İkincisi, kaldırılan her kalem bir yapılandırma değişikliğidir ve o değişikliğin kendisi yanlış yazılabilir. Bedelsiz görünen ilk iki kalem gerçekte de bedelsizdir, ancak eşik birin altına indiğinde kaldırılan kalemlerin çoğu seyrek koşan işlere aittir — bir kalem yanlış kaldırıldığında bunun anlaşılması, o işin bir sonraki koşma zamanını bekler. Yol sayısı anında düşer, durma haftalar sonra görünür.
Özet
- Grafiğin yirmi iki kenarı yirmi iki izin kalemine karşılık geliyor. Her kalem iki sayı taşır: açtığı yol ve taşıdığı günlük meşru istek; karar bu ikisinin oranıyla verilir.
- Yakın sayıda yol açan iki kalem çok farklı olabilir: kuyruğa yazma izni 20 yol açıyor ve günde 1.440 istek taşıyor, doğrulayıcının fatura yazma izni 12 yol açıyor ve günde 1 istek taşıyor.
- İki izin kalemi hiçbir meşru istek taşımıyor. Kaldırıldıklarında 55 yolun 15’i sıfır bedelle kapanıyor — yolların %27’si, kimsenin fark etmediği iki kalemden geliyordu.
- Eşik taraması eğrinin kırıldığı yeri veriyor: 43 yol günde 11 isteğin bedeliyle kapanıyor, kalan 12 yol için 3.502 istek gerekiyor. Yolların %78’i bedelin %0,3’üyle kapanıyor.
- Bütün izinler kaldırıldığında kalan yol 0, duran günlük istek 3.513: on iki meşru akışın tamamı. Tam daraltma, ağın işlevini kaldırmakla aynı şeydir.
- Daraltma sıralaması “hangi izin fazla” ile değil “hangi izin çok yol açıp az iş taşıyor” ile yapılır; iki soru farklı sıralama üretir.
Sonraki Adım
Bu ders izin kalemlerini tek tek kaldırdı ve her kaldırmanın bedelini saydı. Ama bütün ölçüm bir varsayım üzerinde durdu: bir adım kapandığında yalnız o adım kapanıyor, düğümlerin kendisi yerinde kalıyor. Gerçek bir olayda kapanan şey bir adım değil, bir düğümdür — bir servis ele geçirilir ve o servisin sahip olduğu bütün izinler saldırganın eline geçer. Kırk üç yolu kapatan daraltma, ele geçirilen düğümün kendi izinleriyle açtığı yolları kapatmaz. Sonraki dersin sorusu bu yüzden düğümlerin nasıl gruplandığıdır: ağ bölmelere ayrıldığında bir bölme düştüğünde kaç kaleme erişiliyor, bölme sayısı arttıkça bu sayı nasıl azalıyor ve bölmeler arasında koşan meşru trafiğin bedeli kaç geçit ediyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.