İçeriğe geç
academia.sh

Ders 20 / 21

Yetki Yükseltme

Yatay ve dikey yükselmenin yol sayımı olarak ölçülmesi: 9 düğüm ve 20 kenar üzerinde sınırlı kullanıcıdan alan yöneticisine 37 ayrı yolun bulunması, 32 yolun en az bir yatay kenardan geçmesi, tek bir denetimin en çok 24 yol kapatması, üç denetimin 37'sini birden kapatması ve bir denetimin hiçbir yolu kapatmaması.

İçindekiler

Önceki ders bir ayarın 67 makinede yerel olarak düşürülebildiğini saydı. Düşürebilmek için o makinede yerel yönetici olmak gerekir ve asıl soru, sıradan bir hesabın o yetkiyi nasıl elde ettiğidir. Bu geçişe yetki yükseltme (privilege escalation) denir ve kurumsal bir ağda tek bir olay değil, bir yollar kümesidir.

İki tür ayrılır. Yatay yükselme, aynı düzeydeki başka bir öznenin verisine ya da hesabına geçmektir; dikey yükselme, üst düzeye çıkmaktır. Bu ders ikisini de yol sayımı olarak ele alır: kaç ayrı yol var, hangi denetim kaçını kapatıyor ve hepsini kapatmak için kaç denetim gerekiyor. Bilgi Teknolojileri ve Sistem Temelleri kursunda yükseltme, yapıldığı varsayılınca açılan istek sayısı olarak ölçülmüştü; burada ölçülen, yükseltmenin kaç ayrı yoldan mümkün olduğudur. Adım dizisi, komut ve araç bu derste yazılmaz; böyle bir denemenin yazılı yetki ve tanımlı kapsam olmadan yapılması hem yasadışı hem meslek dışıdır.

Kenar, Yol ve Denetim

KK20: yetki yükseltme tek bir olay değil, bir kenar kümesidir; her kenar bir yapılandırma kaleminden doğar ve o kalem kaldırıldığında kenar da kalkar. KK21: yatay ve dikey yükselme ayrı sayılır, çünkü ayrı denetimlerle kapanır. KK22: bir denetim kenar kapatır, yol kapatmaz; kaç yol kapandığı o kenarın kaç yolda geçtiğine bağlıdır.

KK20 bu dersin ölçme biçimini belirler. Yükseltme bir yetenek değil, envanterin bir özelliğidir: grafikteki her kenarın arkasında yazılmış bir üyelik, verilmiş bir izin ya da unutulmuş bir hesap vardır. Bu yüzden ölçülen şey saldırganın becerisi değil, kurumun kendi yapılandırma kalemleridir. Kenar listesi değişmedikçe sayı değişmez; liste her değiştiğinde sayı yeniden hesaplanır ve bu hesap bir denetim işi değil, bir envanter işidir; envanter tutulmadığında yol sayısı bilinmez ve çoğu kurumda sıfır sanılır.

Dokuz Düğüm, Yirmi Kenar

Aşağıdaki graf bir modeldir: kurgu bölgesel ölçüm ağı kurumunda hesap düzeyleri ve aralarında geçişi mümkün kılan yapılandırma kalemleri. Gerçek bir kurum, gerçek bir hesap ve işleyen hiçbir adım dizisi yoktur.

// yukselme/graf.mjs — yetki yukseltme yollarinin grafi (model): dugumler hesap duzeyleri,
// kenarlar bir duzeyden digerine gecisi mumkun kilan yapilandirma kalemleridir. Gercek bir
// kurum, gercek bir hesap ve isleyen hicbir adim dizisi yok. Rastgelelik yok.

// KK20: yetki yukseltme tek bir olay degil, bir kenar kumesidir; her kenar bir yapilandirma
// kaleminden dogar ve o kalem kaldirildiginda kenar da kalkar. KK21: yatay yukselme ayni
// duzeydeki baska bir ozneye, dikey yukselme ust duzeye gecistir; ikisi ayri sayilir cunku
// ayri denetimlerle kapanir. KK22: bir denetim kenar kapatir, yol kapatmaz; kac yol kapandigi
// o kenarin kac yolda gectigine baglidir.
// Sutunlar: kaynak, hedef, tur, kenari acan kalem, kenari kapatan denetim.
export const KENAR = `
  sinirli-kullanici    baska-kullanici      yatay  paylasilan-yerel-parola  makine-basi-parola
  sinirli-kullanici    baska-kullanici      yatay  ortak-dizin-izni         dosya-izni-daraltma
  sinirli-kullanici    yerel-yonetici       dikey  yerel-yonetici-uyeligi   grup-uyeligi-dayatma
  sinirli-kullanici    yerel-yonetici       dikey  imzasiz-betik            imzasiz-betik-engeli
  sinirli-kullanici    yedekleme-operator   dikey  eski-grup-uyeligi        grup-uyeligi-denetimi
  baska-kullanici      yerel-yonetici       dikey  ikinci-hesap-uyeligi     grup-uyeligi-dayatma
  baska-kullanici      yardim-masasi        yatay  yardim-masasi-uyeligi    grup-uyeligi-denetimi
  yerel-yonetici       hizmet-hesabi        yatay  makinede-calisan-hizmet  hizmet-hesabi-kisiti
  yerel-yonetici       yardim-masasi        yatay  ayricalikli-oturum-izi   oturum-yalitimi
  yerel-yonetici       sunucu-yoneticisi    dikey  ortak-yerel-parola       makine-basi-parola
  yerel-yonetici       yedekleme-operator   yatay  yedek-ajani-hesabi       yedek-erisim-ayrimi
  hizmet-hesabi        sunucu-yoneticisi    dikey  asiri-yetkili-hizmet     en-az-yetki
  hizmet-hesabi        politika-yoneticisi  dikey  hizmet-politika-yetkisi  politika-yazma-ayrimi
  yardim-masasi        baska-kullanici      yatay  parola-sifirlama         sifirlama-onayi
  yardim-masasi        alan-yoneticisi      dikey  devredilebilir-yonetim   devir-kisitlama
  yardim-masasi        yedekleme-operator   yatay  grup-yonetim-yetkisi     devir-kisitlama
  yedekleme-operator   alan-yoneticisi      dikey  yedek-geri-yukleme       yedek-erisim-ayrimi
  sunucu-yoneticisi    politika-yoneticisi  dikey  politika-duzenleme       politika-yazma-ayrimi
  sunucu-yoneticisi    alan-yoneticisi      dikey  sunucuda-yonetici-izi    oturum-yalitimi
  politika-yoneticisi  alan-yoneticisi      dikey  politika-dayatma         politika-imzasi`
  .trim().split("\n").map((r) => {
    const p = r.trim().split(/\s{2,}/);
    return { kaynak: p[0], hedef: p[1], tur: p[2], kalem: p[3], denetim: p[4] };
  });

export const BASLANGIC = "sinirli-kullanici";
export const HEDEF = "alan-yoneticisi";

// Yol sayimi: dongusuz, her dugum bir yolda en fazla bir kez gecilir.
export const yollar = (kapali = []) => {
  const acik = KENAR.filter((k) => !kapali.includes(k.denetim));
  const sonuc = [];
  const gez = (dugum, gecilen, yol) => {
    if (dugum === HEDEF) { sonuc.push(yol); return; }
    for (const k of acik.filter((x) => x.kaynak === dugum && !gecilen.includes(x.hedef)))
      gez(k.hedef, [...gecilen, k.hedef], [...yol, k]);
  };
  gez(BASLANGIC, [BASLANGIC], []);
  return sonuc;
};
// yukselme/sayim.mjs — kac ayri yukselme yolu var, yollarin kaci yatay kenar gecirir, hangi
// denetim kacini kapatiyor ve butun yollari kapatmak icin kac denetim gerekiyor.
import { KENAR, BASLANGIC, HEDEF, yollar } from "./graf.mjs";

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));
const denetimler = [...new Set(KENAR.map((k) => k.denetim))];
const dugum = [...new Set(KENAR.flatMap((k) => [k.kaynak, k.hedef]))];
const hepsi = yollar();

console.log(`${dugum.length} dugum, ${KENAR.length} kenar (` +
  `${KENAR.filter((k) => k.tur === "dikey").length} dikey, ` +
  `${KENAR.filter((k) => k.tur === "yatay").length} yatay), ` +
  `${denetimler.length} denetim`);
console.log(`${BASLANGIC} dugumunden ${HEDEF} dugumune ${hepsi.length} ayri yol var`);

const A = [-10, 8, 12, 12, 11];
console.log("\n1. yol uzunluguna gore dagilim");
yaz(A, "uzunluk", "yol", "yalniz dik", "yatay var", "ort kenar");
for (const u of [2, 3, 4, 5]) {
  const s = hepsi.filter((y) => y.length === u);
  if (s.length === 0) continue;
  yaz(A, u, s.length, s.filter((y) => y.every((k) => k.tur === "dikey")).length,
    s.filter((y) => y.some((k) => k.tur === "yatay")).length, u);
}
const yatayli = hepsi.filter((y) => y.some((k) => k.tur === "yatay")).length;
console.log(`en az bir yatay kenar geciren yol ${yatayli}/${hepsi.length}, ` +
  `yalniz dikey kenarla giden yol ${hepsi.length - yatayli}`);

const B = [-22, 8, 10, 10, 11];
console.log("\n2. denetim basina: kac kenar, kac yol kapaniyor");
yaz(B, "denetim", "kenar", "kapanan", "kalan", "kapanan %");
const sirali = denetimler.map((d) => ({ d, kalan: yollar([d]).length }))
  .sort((a, b) => a.kalan - b.kalan);
for (const { d, kalan } of sirali) {
  yaz(B, d, KENAR.filter((k) => k.denetim === d).length, hepsi.length - kalan, kalan,
    `%${(100 * (hepsi.length - kalan) / hepsi.length).toFixed(0)}`);
}

const C = [-22, 9, 9, 11];
console.log("\n3. denetimler en etkiliden eklenirse (birikimli)");
yaz(C, "eklenen", "denetim", "kalan", "kapanan");
const secili = [];
yaz(C, "hicbiri", 0, hepsi.length, 0);
let kalanY = hepsi.length;
while (kalanY > 0) {
  let enIyi = null, enAz = kalanY;
  for (const d of denetimler.filter((x) => !secili.includes(x))) {
    const k = yollar([...secili, d]).length;
    if (k < enAz) { enAz = k; enIyi = d; }
  }
  if (enIyi === null) break;
  secili.push(enIyi); kalanY = enAz;
  yaz(C, enIyi, secili.length, kalanY, hepsi.length - kalanY);
}

const D = [-22, 8, 10, 12, 12];
console.log("\n4. dugum basina: kac yol o dugumden geciyor");
yaz(D, "dugum", "yolda", "yuzde", "giren kenar", "cikan kenar");
const gecen = (d) => hepsi.filter((y) =>
  y.some((k) => k.kaynak === d || k.hedef === d)).length;
for (const d of dugum.sort((a, b) => gecen(b) - gecen(a))) {
  yaz(D, d, gecen(d), `%${(100 * gecen(d) / hepsi.length).toFixed(0)}`,
    KENAR.filter((k) => k.hedef === d).length,
    KENAR.filter((k) => k.kaynak === d).length);
}
9 dugum, 20 kenar (12 dikey, 8 yatay), 13 denetim
sinirli-kullanici dugumunden alan-yoneticisi dugumune 37 ayri yol var

1. yol uzunluguna gore dagilim
uzunluk        yol  yalniz dik   yatay var  ort kenar
2                1           1           0          2
3                8           2           6          3
4               16           2          14          4
5               10           0          10          5
en az bir yatay kenar geciren yol 32/37, yalniz dikey kenarla giden yol 5

2. denetim basina: kac kenar, kac yol kapaniyor
denetim                  kenar   kapanan     kalan  kapanan %
grup-uyeligi-dayatma         2        24        13        %65
makine-basi-parola           2        16        21        %43
oturum-yalitimi              2        16        21        %43
hizmet-hesabi-kisiti         1        12        25        %32
politika-yazma-ayrimi        2        12        25        %32
devir-kisitlama              2        12        25        %32
politika-imzasi              1        12        25        %32
yedek-erisim-ayrimi          2        11        26        %30
dosya-izni-daraltma          1        10        27        %27
imzasiz-betik-engeli         1         8        29        %22
en-az-yetki                  1         8        29        %22
grup-uyeligi-denetimi        2         5        32        %14
sifirlama-onayi              1         0        37         %0

3. denetimler en etkiliden eklenirse (birikimli)
eklenen                 denetim    kalan    kapanan
hicbiri                       0       37          0
grup-uyeligi-dayatma          1       13         24
imzasiz-betik-engeli          2        5         32
grup-uyeligi-denetimi         3        0         37

4. dugum basina: kac yol o dugumden geciyor
dugum                    yolda     yuzde giren kenar cikan kenar
sinirli-kullanici           37      %100           0           5
alan-yoneticisi             37      %100           4           0
yerel-yonetici              32       %86           3           4
baska-kullanici             20       %54           3           2
sunucu-yoneticisi           16       %43           2           2
yardim-masasi               12       %32           2           3
hizmet-hesabi               12       %32           1           2
politika-yoneticisi         12       %32           2           1
yedekleme-operator          11       %30           3           1

Sayılar ölçüm sınıfındadır; girdileri KK20–KK22 ile kenar listesidir.

Yirmi Kenar, Otuz Yedi Yol

Başlık satırı bu dersin ilk sonucunu verir: yirmi kenarlı bir grafta sınırlı bir kullanıcıdan alan yöneticisine 37 ayrı yol vardır. Yirmi kalem yazılmıştır, otuz yedi sonuç doğmuştur. Yolların kenar sayısına göre değil, kenarların birleşim biçimine göre çoğalması bu ölçümün temel özelliğidir; yeni bir kenar eklemek yol sayısını bir artırmaz, çarpar.

Birinci tablo dağılımı verir. En kısa yol iki kenardır ve tek örneği vardır. Üç kenarlı yol sekiz, dört kenarlı yol on altı, beş kenarlı yol on tanedir. Yolların çoğunluğu ortada toplanır; en kısa ve en uzun uçlar seyrektir. Bu, bir envanterin “kaç adımda ele geçirilir” sorusuna verilebilecek tek anlamlı yanıtın dağılım olduğunu gösterir — tek bir sayı yoktur.

Yatay kenarların payı belirleyicidir. Otuz yedi yolun 32’si en az bir yatay kenardan geçer; yalnız beş yol baştan sona dikey kenarlarla ilerler. Yatay kenarlar sekiz tanedir, yani kenarların %40’ı; ama yolların %86’sında geçerler. Yatay geçişler yükseltmenin kendisi değildir — düzey değiştirmezler — ama dikey kenarlara erişim sağlarlar ve bu yüzden yolların çoğunda bulunurlar. Yalnız dikey yükselmeyi ölçen bir değerlendirme, otuz yedi yolun otuz ikisini görmez.

Bir Denetim Kaç Yol Kapatıyor

İkinci tablo KK22’yi sayar. Grup üyeliği dayatması iki kenarı kapatır ve 24 yol düşürür — toplamın %65’i. Makine başına benzersiz parola ile ayrıcalıklı oturum yalıtımı da ikişer kenar kapatır ama 16’şar yol düşürür. Aynı sayıda kenar, farklı sayıda yol: bir kenarın değeri kendi sayısında değil, kaç yolda geçtiğindedir.

Tablonun son satırı bunun uç örneğidir. Parola sıfırlama onayı bir kenar kapatır ve sıfır yol düşürür. Kapattığı kenar — yardım masasından başka bir kullanıcıya geçiş — hiçbir yolun üzerinde değildir, çünkü o kenardan sonra gidilebilecek her yere zaten daha kısa yollardan gidilmektedir. Denetim gereksiz değildir; başka bir şeye karşı işe yarayabilir. Ama bu grafta yol kapatma ölçüsüne göre değeri sıfırdır ve bir güvenlik bütçesi bu satırı görmeden dağıtılmamalıdır.

Dördüncü tablo aynı bilgiyi düğüm tarafından verir. Yerel yönetici düğümü yolların %86’sında geçer; üç giren, dört çıkan kenarı vardır. Ondan sonraki en yüklü düğüm başka kullanıcıdır ve yolların %54’ünde bulunur. Bir düğümün yük taşıması, giren kenar sayısıyla çıkan kenar sayısının çarpımına yakın davranır: yerel yöneticide üç ile dördün çarpımı, tabloda en yüksek satırı verir.

Grafın Kendisi Nerede Duruyor

Yirmi kenarın hangi kalemden doğduğu listede yazılıdır ve bu kalemlerin çoğu bir yerde tutulur: merkezî dizinde. Grup üyelikleri, devredilmiş yönetim yetkileri ve hizmet hesaplarının kapsamı ilk derste ölçülen deponun kayıtlarıdır. Bu dersin güven kökü, o kayıtların gerçeği yansıtması varsayımıdır; deponun bütünlüğü kırıldığında graf, hiç kimsenin görmediği yeni kenarlar kazanır ve sayım eskimiş olur.

İki kenar bunu doğrudan gösterir. Yerel yönetici üyeliğinden doğan kenar, önceki derste merkezî politikayla dayatılan on iki ayardan birinin karşılığıdır; o ayarın ulaşmadığı 30 makinede kenar açık kalır. Aynı biçimde yerel geçersiz kılmaya açık 67 makinede, imzasız betik engelinin kapattığı kenar makine başına yeniden doğar. Yayılma tablosundaki eksik kapsama, bu grafta doğrudan kenar sayısına yazılır.

Bu, iki dersin sayılarını birbirine bağlar. Üçüncü tablo üç denetimin otuz yedi yolu kapattığını söyler; altıncı ders o denetimlerin makinelerin %90,8’ine ulaştığını ve %9,2’sine hiç ulaşmadığını söyler. Kapatılan yol sayısı ile kapatmanın ulaştığı makine oranı ayrı iki ölçüdür ve gerçek kapsama ikisinin çarpımıdır. Grafta sıfıra inen yol sayısı, envanterin tamamında sıfır değildir; ulaşılamayan her makine, kapatıldığı sanılan kenarları kendi üzerinde açık tutar ve bu kenarlar merkezî raporda kapalı görünür.

Üç Denetim Otuz Yedi Yolu Kapatıyor

Üçüncü tablo en etkili denetimi tekrar tekrar seçerek birikimli sonucu çıkarır. Grup üyeliği dayatması 37 yolu 13’e indirir; imzasız betik engeli 13’ü 5’e; grup üyeliği denetimi 5’i sıfıra. Üç denetim otuz yedi yolun tamamını kapatır.

Sonucun biçimi şaşırtıcıdır ve nedeni grafın yapısındadır. Üç denetimin üçü de sınırlı kullanıcı düğümünden çıkan kenarları kapatır; beş çıkan kenarın hepsi bu üç denetimin kapsamındadır. Başlangıç düğümünden çıkış kesildiğinde grafın geri kalanı ne kadar zengin olursa olsun ulaşılamaz hâle gelir. İkinci tablodaki tek tek sıralama ile üçüncü tablodaki birikimli seçim bu yüzden farklı denetimleri öne çıkarır: politika imzası tek başına 12 yol kapatır ama seçilmez, çünkü kapattığı yollar başkalarınca zaten kapatılmıştır.

Bu, yol sayımının en pratik sonucudur: savunma bütçesi tek tek etkiye göre değil, birikimli etkiye göre dağıtılır. On üç denetimin on üçünü de uygulamak gerekmiyor olabilir; ama hangi üçünün yeteceğini söyleyen şey ne deneyim ne de sezgidir — kenar listesi üzerinde yapılan sayımdır.

Modelin sınırı da burada yazılır. Üç denetim bu kenar listesindeki yolları kapatır; listede olmayan bir kenar — kaydedilmemiş bir grup üyeliği, unutulmuş bir hizmet hesabı — sayıma girmez ve kapanmaz. Yol sayımı envanterin doğruluğu kadar doğrudur ve envanterin eksikliği, sayının küçüklüğü olarak görünür.

Özet

  • Yetki yükseltme bir kenar kümesidir: 9 düğüm ve 20 kenarlı bir grafta sınırlı kullanıcıdan alan yöneticisine 37 ayrı yol vardır.
  • Yolların uzunluğu 2 ile 5 kenar arasında dağılır; çoğunluk 4 kenarlı yollardadır ve tek bir “kaç adım” sayısı yoktur.
  • Yatay kenarlar kenarların %40’ıdır ama yolların 32’sinde geçer; yalnız dikey yükselmeyi ölçen bir değerlendirme 37 yolun 32’sini görmez.
  • Aynı sayıda kenar kapatan iki denetim farklı sayıda yol kapatır; bir denetim 1 kenar kapatıp 0 yol düşürür.
  • Üç denetim 37 yolun tamamını kapatır, çünkü üçü de başlangıç düğümünden çıkan 5 kenarı kapsar; birikimli etki tek tek etkiden farklı bir sıralama üretir.

Sonraki Adım

Bu ders yükselmeyi yapılandırma kalemleri üzerinden saydı: bir üyelik, bir izin, bir hesap. Kenar listesinin arkasında sessiz kalan bir kalem daha vardır. Bir hesaptan diğerine geçmek çoğu zaman o hesabın parolasını bilmeyi değil, o hesabın doğrulanmasında kullanılan değeri ele geçirmeyi gerektirir; makinelerin belleğinde, oturum açmış her kullanıcı için böyle bir değer durur. Sonraki ders bunu savunma ekseninde ölçer: hangi kalem bellekte ne kadar kalıyor, karma aktarmanın neden parola bilmeden çalıştığı ve hangi denetimin kaç yolu kapattığı. O ders aynı zamanda kursu kapatır.

İ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