İçeriğe geç
academia.sh

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, yaz ya da yonet atandı. 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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat