Ders 04 / 09
Zorunlu Erişim Denetimi
Politika tabanlı denetim etiket ekseninin iki olgusundan birini kapatır ve erişim etiketini açık bırakır; 36 erişim çiftinden 8'i gerekliyken kaba politika 10, dar politika 1 fazla izin bırakıyor.
İçindekiler
Önceki ders sürecin çekirdekten hangi ayrıcalıklı işlemi isteyebileceğini daralttı ve dosya tarafında bir şeyin açık kaldığını saydı. Açık kalan şeyin altında daha genel bir kural yatıyor: bir dosyaya kimin erişebileceğine, o dosyanın sahibi karar veriyor. Sahibi bir dizini herkese açık yazılabilir işaretlediyse, yetkisi kırpılmış bir süreç de oraya yazar. Kırpma isteği süzer, iznin kendisini yazmaz.
Bu ders kararı sahibin elinden alıp bir politikaya bağlayan katmanı ele alır ve iki ayrı yüzey ölçer: politikanın kapattığı olgu ile politikanın kendi açık yüzeyi, yani gerekmediği hâlde izin verilmiş erişim sayısı. Ders politika yazmayı öğretir; politikayı devre dışı bırakmak bu kursta bir çözüm olarak sunulmaz ve bunun ölçüsü de sonunda sayılır.
İsteğe Bağlı Denetimden Zorunlu Denetime
Dosya izinleri ve sahiplik isteğe bağlı bir modeldir: nesnenin sahibi erişimi genişletme yetkisine sahiptir ve genişlettiğinde kimseye sormaz. Model basit olduğu için yaygındır ve zayıflığı da buradadır — tek bir yanlış işaretleme bütün bir dizini açar, sistemin genelinde hangi öznenin hangi nesneye erişebildiğini gösteren yazılı bir yer yoktur.
Zorunlu erişim denetimi kararı merkezî bir politikaya taşır. Çekirdekte, erişim denetimlerinin geçtiği noktalara yerleştirilmiş bir kanca katmanı vardır; bir güvenlik modülü bu kancalara bağlanır ve her erişim isteğinde ikinci bir karar verir. Kural şudur: klasik izin denetimi önce çalışır, geçerse politika denetimi çalışır. İkisi seri bağlıdır ve ikisinden de geçmeyen erişim gerçekleşmez. Politika, sahibin verdiği izni genişletemez; yalnız daraltır.
Politikanın nesneleri ikidir. Erişim etiketi özneye ve nesneye takılan bir işarettir; süreç bir etiket taşır, dosya bir etiket taşır. Politika kuralı ise iki etiket ve bir işlem sınıfı arasında bir bağ kurar. Öntanımlı davranış reddetmektir: kuralla açıkça izin verilmemiş her erişim reddedilir. Bu, isteğe bağlı modelin tam tersidir ve politikanın yazılmasını zorunlu kılar — kural yoksa program çalışmaz.
# ornek dokum — calistirilmamistir; etiket alanlari kurgudur $ ls -Z /veri/olcum sistem_u:nesne_r:olcum_veri_t:s0 ham.dat sistem_u:nesne_r:olcum_gunluk_t:s0 gunluk.jsonl $ ps -Z -p 8140 sistem_u:sistem_r:olcum_t:s0 8140 olcum-toplayici
Etiketin alanları vardır ve karar çoğunlukla bunlardan yalnız birine, tür alanına dayanır.
Süreç olcum_t türündedir, ölçüm verisi olcum_veri_t, günlük dosyası olcum_gunluk_t
türündedir. Politika bu türler arasındaki izinli erişimleri sayar.
İki Aile ve Kuralın Yazımı
Güvenlik modülleri iki aileye ayrılır ve ayrım nesnenin nasıl adlandırıldığıyla ilgilidir. Etiket tabanlı aile erişim etiketini nesnenin kendisinde tutar: etiket dosyanın üst verisindedir, dosya taşınsa da adı değişse de etiket onunla gelir. Yol tabanlı aile ise nesneyi dosya yoluyla adlandırır ve kuralları yol örüntüleri üzerine yazar. Birincisi taşımaya dayanıklıdır ve etiketlemeyi ayrı bir iş hâline getirir; ikincisinin yazımı kısadır ve aynı dosyaya başka bir yoldan erişildiğinde kuralın kapsamı değişebilir.
# ornek politika parcasi — calistirilmamistir
allow olcum_t olcum_veri_t : file { read write getattr };
allow olcum_t olcum_gunluk_t : file { append getattr };
allow olcum_t olcum_ayar_t : file { read getattr };
# ornek yol tabanli profil parcasi — calistirilmamistir
/usr/local/bin/olcum-toplayici {
/veri/olcum/** rw,
/veri/olcum/gunluk.jsonl a,
/etc/olcum/ayar.toml r,
deny /veri/faturalama/** rwx,
}
İki yazım da aynı üç şeyi söyler: özne, nesne ve işlem sınıfı. Dökümler çalıştırılmamıştır ve buradan hiçbir sayı iddiası çıkmaz. Kural sözdizimi güvenlik modülüne göre değişir; bu dersin ölçtüğü şey sözdizimi değil, kuralların kaç erişime izin verdiğidir.
Etiket tabanlı ailede kuralların yanında ikinci bir yazılı parça daha vardır ve unutulduğunda politika sessizce boşa çıkar: etiketleme kuralları. Yeni oluşturulan bir dosya öntanımlı olarak bulunduğu dizinin türünü alır; istenen tür başka bir şeyse bu bir tür geçişi kuralıyla yazılır. Yazılmadığında ölçüm sürecinin ürettiği günlük dosyası veri türünde doğar, günlük kuralları ona uygulanmaz ve kimse bir şey fark etmez. Aynı boşluk yedekten geri dönen ya da başka bir makineden kopyalanan dosyalarda da açılır: etiket üst veridedir ve her taşıma biçimi onu taşımaz. Bu yüzden politika yazımının bir parçası da yeniden etiketleme adımıdır — kök ağacı ya da veri dizini, yazılı etiketleme kurallarına göre baştan işaretlenir. Yol tabanlı ailede bu adım yoktur; karşılığında aynı dosyaya ikinci bir yoldan erişildiğinde kuralın kapsamı dışında kalma sorunu vardır.
Etiket Ekseni: İki Olgu, Bir Kapanış
- IZ24 — Etiket ekseninde 2 olgu vardır:
erisim-etiketivepolitika-kurallari. - IZ25 — Zorunlu etiket, etiket eksenini kapatan tek düzenektir; 1 olgu kapatır ve
erisim-etiketiolgusunu açık bırakır. - IZ26 — İki modül ailesi modelde tek bir düzenekle temsil edilir.
- IZ27 — Demet sırası bağlayıcıdır: beş ad alanı, denetim grubu, yetenek kırpma, zorunlu etiket. Sekizinci düzenek eklendiğinde demet sıkı demet adını alır.
"""Ortak tanimin bu derste kullanilan parcasi: 24 olgu , 9 eksen ve etiket eksenini kapatan zorunlu etiket. Olculen sey ACIK KALAN YUZEY.""" OLGULAR = [ ("oteki-sureclerin-listesi", "surec"), ("kendi-surec-numarasi", "surec"), ("ata-surec-zinciri", "surec"), ("kok-dosya-agaci", "takma"), ("oteki-takmalar", "takma"), ("paylasilan-gecici-dizin", "takma"), ("makine-arayuzleri", "ag"), ("makine-yonlendirme-tablosu", "ag"), ("dinleyen-baglanti-noktalari", "ag"), ("kullanici-kimlik-esleme", "kullanici"), ("dosya-sahipligi", "kullanici"), ("makine-adi", "makine"), ("islemci-payi", "kaynak"), ("bellek-siniri", "kaynak"), ("kullanilan-bellek", "kaynak"), ("islemci-sayisi", "kaynak"), ("cekirdek-surumu", "cekirdek"), ("cekirdek-ayarlari", "cekirdek"), ("sistem-yuku", "cekirdek"), ("saat", "cekirdek"), ("yetenek-kumesi", "yetki"), ("dosya-yetkileri", "yetki"), ("erisim-etiketi", "etiket"), ("politika-kurallari", "etiket"), ] DUZENEK = { "surec-ad-alani": {"eksen": "surec", "acik_kalan": ["kendi-surec-numarasi"]}, "takma-ad-alani": {"eksen": "takma", "acik_kalan": ["kok-dosya-agaci"]}, "ag-ad-alani": {"eksen": "ag", "acik_kalan": []}, "kullanici-ad-alani": {"eksen": "kullanici", "acik_kalan": ["dosya-sahipligi"]}, "makine-ad-alani": {"eksen": "makine", "acik_kalan": []}, "denetim-grubu": {"eksen": "kaynak", "acik_kalan": ["islemci-sayisi"]}, "yetenek-kirpma": {"eksen": "yetki", "acik_kalan": ["dosya-yetkileri"]}, "zorunlu-etiket": {"eksen": "etiket", "acik_kalan": ["erisim-etiketi"]}, } YEDI = ["surec-ad-alani", "takma-ad-alani", "ag-ad-alani", "kullanici-ad-alani", "makine-ad-alani", "denetim-grubu", "yetenek-kirpma"] SIKI = YEDI + ["zorunlu-etiket"] def gorunen(duzenekler, olgular=None): olgular = OLGULAR if olgular is None else olgular kapali = set() for d in duzenekler: v = DUZENEK[d] kapali |= {o for o, e in olgular if e == v["eksen"]} kapali -= set(v["acik_kalan"]) return [o for o, _ in olgular if o not in kapali] def acik_eksen(duzenekler, olgular=None): olgular = OLGULAR if olgular is None else olgular g = set(gorunen(duzenekler, olgular)) return sorted({e for o, e in olgular if o in g}) acik = set(gorunen(["zorunlu-etiket"])) print("KAHIN olgu:", len(OLGULAR), "| eksen:", len({e for _, e in OLGULAR})) print("etiket ekseninde", sum(1 for _, e in OLGULAR if e == "etiket"), "olgu") print() for o, e in OLGULAR: if e == "etiket": print(f" {o:20s} {'ACIK BIRAKIR' if o in acik else 'kapatir'}") g = gorunen(["zorunlu-etiket"]) print("zorunlu etiket tek basina: kapatti", len(OLGULAR) - len(g), "| gorunen", len(g), "| acik eksen", len(acik_eksen(["zorunlu-etiket"]))) print() print("asama duzenek gorunen acik eksen") for ad, d in (("yedi duzenek", YEDI), ("+zorunlu etiket (siki)", SIKI)): print(f" {ad:24s} {len(d):7d} {len(gorunen(d)):7d} {len(acik_eksen(d)):10d}") print() EK = OLGULAR + [("politika-surumu", "etiket")] EKSIK = [(o, e) for o, e in OLGULAR if o != "erisim-etiketi"] print("olgu kumesi supurmesi (siki demet uygulanmis halde)") print("kume olgu eksen gorunen acik eksen") for ad, kume in (("temel", OLGULAR), ("+politika-surumu", EK), ("-erisim-etiketi", EKSIK)): print(f" {ad:19s} {len(kume):4d} {len({x for _, x in kume}):5d}" f" {len(gorunen(SIKI, kume)):7d} {len(acik_eksen(SIKI, kume)):10d}")
KAHIN olgu: 24 | eksen: 9 etiket ekseninde 2 olgu erisim-etiketi ACIK BIRAKIR politika-kurallari kapatir zorunlu etiket tek basina: kapatti 1 | gorunen 23 | acik eksen 9 asama duzenek gorunen acik eksen yedi duzenek 7 11 7 +zorunlu etiket (siki) 8 10 7 olgu kumesi supurmesi (siki demet uygulanmis halde) kume olgu eksen gorunen acik eksen temel 24 9 10 7 +politika-surumu 25 9 10 7 -erisim-etiketi 23 9 9 6
Üç sayı yan yana duruyor. Kâhin: 24 olgu, 9 eksen. İzolasyon: zorunlu etiket 1 olgu kapatıyor, sıkı demet toplamda 14 olgu kapatıyor. Açık kalan yüzey: sekizinci düzenekten sonra 10 olgu ve yine 7 eksen. Sekiz düzenek eklendi, açık eksen dördüncüden beri hiç değişmedi.
Açık kalan olgu erisim-etiketidir ve nedeni yapısaldır: politika özneye bir etiket takar,
özne kendi etiketini okuyabilir. Etiketi gizlemek politikayı işlemez kılar, çünkü etiket
kararın girdisidir. Daraltma yolu bu yüzden etiketi saklamak değil, etiketin hiçbir gizli
bilgi taşımamasını sağlamaktır: tür adları rol ve amaç bildirir, kimlik, anahtar, kiracı adı
ya da konum bildirmez. İkinci adım politika kaynağının kendisini sınırlamaktır — kural ağacı
sürecin kök ağacına konmaz; sürecin okuyabildiği tek şey kendi etiketi olur, kuralların tamamı
değil. Süpürme bunu doğruluyor: etiket ekseninden açık kalan tek olgu çıkarıldığında eksen
kapanıyor, yüzey 9’a ve açık eksen 6’ya iniyor.
Politikanın Kendi Açık Yüzeyi
Bir politika yazıldığında ikinci bir ölçü doğar. Kurs boyunca açık yüzeyi çekirdek olguları üzerinden saydık; politika düzeyinde de aynı soru sorulabilir: kaç erişime gerekmediği hâlde izin verildi. Kurgu, ölçüm sunucusundaki üç özne, dört nesne ve üç işlemdir.
- IZ28 — Üç özne, dört nesne ve üç işlem 36 erişim çifti üretir.
- IZ29 — Kâhin, iş yükünün gerçekten ihtiyaç duyduğu erişimlerdir; kurguyu kuran taraf bu kümeyi bilir ve 8 erişimden oluşur.
- IZ30 — Politikanın açık yüzeyi fazla izin sayısıdır: izin verilmiş ama gerekmeyen erişimler. Eksik izin ise kırılan işi gösterir.
"""Politika duzeyinde acik yuzey: izin verilen ama GEREKMEYEN erisim sayisi.""" OZNE = ("olcum", "fatura", "bakim") NESNE = ("olcum-veri", "fatura-veri", "gunluk", "ayar") ISLEM = ("oku", "yaz", "calistir") # Kahin: is yukunun GERCEKTEN ihtiyac duydugu erisimler. GEREKEN = { ("olcum", "olcum-veri", "oku"), ("olcum", "olcum-veri", "yaz"), ("olcum", "gunluk", "yaz"), ("olcum", "ayar", "oku"), ("fatura", "fatura-veri", "oku"), ("fatura", "fatura-veri", "yaz"), ("fatura", "gunluk", "yaz"), ("bakim", "gunluk", "oku"), } def politika_yok(o, n, i): """Zorunlu denetim yok: karar yalniz istege bagli katmandadir.""" return True def kaba(o, n, i): """Tur duzeyinde yazilmis genis kural.""" return n.startswith(o) or n == "gunluk" or (n == "ayar" and i == "oku") def dar(o, n, i): """Gereken erisimler , arti bakim icin ayar okumasi.""" return (o, n, i) in GEREKEN or (o, n, i) == ("bakim", "ayar", "oku") TUM = [(o, n, i) for o in OZNE for n in NESNE for i in ISLEM] print("toplam erisim cifti:", len(TUM), "| kahin (gereken erisim):", len(GEREKEN)) print() print("politika izin karsilanan FAZLA IZIN eksik izin") for ad, f in (("politika yok", politika_yok), ("kaba politika", kaba), ("dar politika", dar)): izin = {t for t in TUM if f(*t)} print(f" {ad:15s} {len(izin):5d} {len(GEREKEN & izin):10d}" f" {len(izin - GEREKEN):10d} {len(GEREKEN - izin):10d}")
toplam erisim cifti: 36 | kahin (gereken erisim): 8 politika izin karsilanan FAZLA IZIN eksik izin politika yok 36 8 28 0 kaba politika 18 8 10 0 dar politika 9 8 1 0
Üç satır politika yazımının bütün gerilimini taşıyor. Politika yokken 36 erişimin tamamı politika katmanından geçer ve 28’i gereksizdir. Tür düzeyinde yazılmış kaba bir politika bunu 10’a indirir; her üç satırda da eksik izin sıfırdır, yani üçünde de iş çalışır. Dar politika fazla izni 1’e indirir ve iş yine çalışır. Aradaki fark yazım emeğidir: kaba politika üç kural satırıyla, dar politika dokuz satırla yazılır.
Ölçü, politikanın kaç kural içerdiği değil, kaç gereksiz erişimi ayakta bıraktığıdır. Bu, kursun kuralının politika düzeyindeki karşılığıdır ve aynı cümleyle söylenir: neyin hâlâ izinli olduğu yazılmayan politika ölçülmemiş sayılır.
Politika Nasıl Yazılır
Gereken erişim listesi tahminle çıkmaz. Yazma düzeni tersine çalışır: sınama ortamında politika denetim kipine alınır — kurallar değerlendirilir, ihlaller kaydedilir ama erişim engellenmez — iş yükü baştan sona koşturulur ve düşen her kayıt için tek bir kural yazılır.
# ornek reddedis kaydi — calistirilmamistir
tur=erisim-reddi islem={ write } surec=8140 nesne="ham.dat" sinif=file
ozne=sistem_u:sistem_r:olcum_t:s0 hedef=sistem_u:nesne_r:fatura_veri_t:s0
Kaydın taşıdığı üç alan kuralın üç alanıdır: özne türü, hedef türü, işlem sınıfı. Kural yazılırken kaydı olduğu gibi kurala çevirmek kolay ama yanlıştır; kayıt tek bir dosyayı gösterir, kural bir türü kapsar. Yazımdan önce sorulacak soru şudur: bu erişim gerçekten gerekli mi, yoksa yanlış etiketlenmiş bir dosya mı. İkinci durumda doğru düzeltme kural eklemek değil, dosyayı doğru türe taşımaktır.
Denetim kipinin bir bedeli vardır ve bu dersin sayılarıyla söylenebilir: o kipte
politika-kurallari olgusu kapanmaz, sıkı demet sekiz düzenek yerine yedi düzenek gibi
davranır ve açık yüzey 10 yerine 11 olgudur. Denetim kipi bir geliştirme adımıdır, bir
işletim düzeni değildir; üretimde kalan denetim kipi ölçüde bir düzeneğin eksilmesine karşılık
gelir. Politikayı tümüyle kapatmak ise bu kursta bir çözüm olarak sunulmaz — üstteki tablonun
ilk satırı, kapatmanın ne anlama geldiğini sayıyla veriyor: 28 fazla izin. Bir kural iş
akışını kırıyorsa doğru tepki politikayı kaldırmak değil, kırılan tek erişim için dar bir kural
yazmak ya da nesnenin türünü düzeltmektir.
Modeldeki bütün sayılar kurgu üzerinden tam sayımdır; gerçek bir makinede yapılmış ölçüm değildir ve gerçek bir politikada erişim çifti sayısı çok daha büyüktür.
Özet
- Zorunlu erişim denetimi kararı nesnenin sahibinden alıp merkezî bir politikaya taşır; klasik izin denetimiyle seri çalışır ve öntanımlı davranışı reddetmektir.
- Politikanın iki nesnesi vardır: özneye ve nesneye takılan erişim etiketi ve iki etiketle bir işlem sınıfını bağlayan politika kuralı. İki modül ailesi nesneyi etiketle ya da yolla adlandırır.
- Etiket ekseninde 2 olgu vardır; zorunlu etiket 1’ini kapatır,
erisim-etiketiolgusunu açık bırakır. Sıkı demet sekiz düzenekle 14 olgu kapatır, 10 olgu ve 7 eksen açık kalır. - Politika düzeyinde de bir açık yüzey vardır: 36 erişim çiftinden 8’i gerekliyken politika yokken 28, kaba politikada 10, dar politikada 1 fazla izin kalır; üçünde de eksik izin sıfırdır.
- Politika denetim kipinde toplanan reddedişlerden yazılır; denetim kipinde
politika-kurallarikapanmaz ve açık yüzey 10 yerine 11 olgudur. Politikayı kapatmanın ölçüdeki karşılığı 28 fazla izindir.
Sonraki Adım
Dört ders dört düzenek ailesini ayrı ayrı ölçtü: ad alanı görünürlüğü, denetim grubu tüketimi, yetenek kırpma ayrıcalığı, zorunlu etiket erişimi daralttı. Gerçek bir sistemde bunlar tek tek açılmaz; bir çalışma zamanı hepsini tek bir tanımdan okuyup aynı anda uygular. Sonraki ders o birleştirmeyi ölçer: yaygın olarak kullanılan altı düzenekli bir demet ile sıkı sekiz düzenekli bir demeti yan yana koyar, iki düzenek eklemenin yüzeyi kaç olgu daralttığını sayar ve açık eksenin neden yedide durduğunu gösterir. Orada görülecek olan sayı beklenenden küçüktür.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.