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.