İçeriğe geç
academia.sh

Ders 03 / 09

Yetenekler

Süper kullanıcı ayrıcalığı ayrı ayrı verilebilen parçalara bölünür; yetenek kırpma iki olgudan yalnız birini kapatır ve dosya yetkileri açık kalır, yedi düzenekli demette görünen olgu 11'e iner.

İçindekiler

Önceki iki ders sürecin ne gördüğünü ve ne kadar tükettiğini daralttı. Üçüncü soru başka bir eksene aittir: süreç çekirdekten hangi ayrıcalıklı işlemi isteyebilir. Kendi süreç tablosunu gören, kotası kırpılmış bir süreç yine de bir takma noktası açmaya, ağ yapılandırmasını değiştirmeye ya da başka bir kullanıcının dosyasına dokunmaya kalkışabilir. Bu istekleri kabul edip etmemek görünürlükle de tüketimle de ilgili değildir.

Bu ders o kararı veren düzeneği ölçer. Katalogdaki başlık “Yetenekler” idi; bu müfredatta capability karşılığı yetki olarak kapatıldığı için ders adı Yetkilerdir ve kurs boyunca tek biçim kullanılır.

Süper Kullanıcı Ayrıcalığının Parçalanması

Klasik model ikilidir: bir süreç ya sıfır numaralı kullanıcıya aittir ve çekirdeğin bütün denetimlerinden muaftır, ya da değildir ve hiçbirinden muaf değildir. Bin ayrıcalıklı işlemin tamamı tek bir bayrağa bağlıdır. Ağın bir bağlantı noktasını dinlemek isteyen bir program, bu model altında aynı zamanda çekirdek modülü yükleme ve herhangi bir dosyanın sahipliğini değiştirme hakkını da alır.

Yetki, bu tek bayrağın ayrı ayrı verilebilen parçalara bölünmesidir. Her ayrıcalıklı işlem sınıfı bir yetkiye bağlanır: düşük numaralı bağlantı noktasına bağlanma, ham yuva açma, ağ yapılandırmasını değiştirme, dosya sahipliğini değiştirme, dosya izin denetimini atlama, süreç önceliğini yükseltme, sistem saatini değiştirme, çekirdek modülü yükleme ve takma yapma ayrı yetkilerdir. Bir süreç yalnız kendisine verilen yetkilerin kapsadığı işlemleri isteyebilir; kalanları için sıfır numaralı kullanıcıya ait olması bile yetmez.

Parçalanma eşit değildir ve bu kursun ilgilendiği bir ayrıntı taşır. Yetkilerin bir bölümü dar kapsamlıdır ve tek bir işlem sınıfını açar; bir bölümü ise geniştir ve kendi başına başka yetkilerin kapısını aralayacak kadar çok işlem sınıfını kapsar. Takma yapmayı, ad alanı yönetimini ve pek çok yönetim işlemini tek başına toplayan yetki bunların en bilinenidir. Uygulamadaki kural bu yüzden kısadır: geniş yetki verilmez. Bir programın gerçekten ihtiyacı varsa, ihtiyaç duyulan işlemi ayrı bir yardımcıya taşımak, o yetkiyi bütün sürece vermekten daha dar bir çözümdür.

Beş Küme ve Geçiş Kuralı

Bir sürecin yetkileri tek bir liste değil, beş kümedir ve her kümenin ayrı bir işi vardır. Etkin küme o an denetimde kullanılan yetkileri taşır. İzinli küme sürecin etkin kümeye alabileceklerinin havuzudur. Devralınabilir küme program değiştirmede taşınabilecekleri gösterir. Sınırlayıcı küme bir tavandır: içinde olmayan bir yetki hiçbir yolla geri kazanılamaz. Ortam kümesi ise devralınabilir yetkilerin yeni programa taşınmasını sağlayan köprüdür.

Ayrı bir bayrak bu kümelerin üzerinde durur: yeni ayrıcalık yok bayrağı açıldığında süreç ve bütün çocukları, program değiştirmeyle yeni yetki kazanamaz. Bayrak bir kez açılır ve kapatılamaz. Yetenek kırpmanın kalıcı olması bu bayrağa bağlıdır; bayrak açılmadan yapılan kırpma, dosya üzerinde yazılı yetkilerle geri alınabilir.

# ornek dokum — calistirilmamistir; maske degerleri kurgudur
$ grep -E '^(Cap|NoNewPrivs)' /proc/self/status
CapInh: 0000000000000000
CapPrm: 000000000000cc00
CapEff: 000000000000cc00
CapBnd: 000000000000cc00
CapAmb: 0000000000000000
NoNewPrivs: 1

Dökümdeki maskeler bit kümeleridir; her bit bir yetkiye karşılık gelir. Okunması gereken şey tek tek bitler değil, kümeler arasındaki ilişkidir: sınırlayıcı küme izinli kümeye eşitse kırpma yapılmamış demektir, ortam kümesi boşsa program değiştirmede yetki taşınmıyor demektir.

Yetkiler süreçlerin yanında dosyaların üzerinde de durur. Bir çalıştırılabilir dosyaya yetki işaretlenebilir ve o dosya çalıştırıldığında süreç, çağıranın sahip olmadığı bir yetkiyle başlar. Bu, eski sahiplik bayrağının dar bir alternatifidir: dosya bütün ayrıcalığı değil, yalnız işaretlenmiş yetkiyi verir.

# ornek dokum — calistirilmamistir
$ getcap /usr/local/bin/olcum-toplayici
/usr/local/bin/olcum-toplayici cap_net_bind_service=ep
$ setcap -r /usr/local/bin/olcum-toplayici
$ find /kok-agaci -perm /6000 -type f
/kok-agaci/usr/bin/eski-yardimci

Son satır bir denetim adımıdır: kök ağacında sahiplik bayrağı taşıyan dosyaları listeler. Bu liste boş değilse, süreçten kırpılan yetenek dosya üzerinden geri gelebilir. Dökümler çalıştırılmamıştır ve buradan hiçbir sayı iddiası çıkmaz.

Yetkinin Kapsamı ve Yazıldığı Yer

Bir yetkinin nerede geçerli olduğu, ad alanları hesaba katılmadan söylenemez. Kullanıcı ad alanı açan bir süreç, o ad alanının içinde geniş bir yetenek kümesiyle başlar; ama bu kümenin kapsamı yalnız o ad alanı ve altındaki nesnelerdir. Aynı yetki, ad alanının dışındaki bir nesne üzerinde hiçbir şey yapmaz. Birinci dersteki eşleme tablosunun anlamı burada tamamlanır: içeride görünen sıfır numaralı kullanıcı, dışarıda eşlenmiş sıradan bir kimliktir ve yetkilerinin sınırı eşlemenin sınırıdır.

Bunun iki pratik sonucu vardır. Birincisi, “içeride yetkili görünmek” ile “makinede yetkili olmak” ayrı iki durumdur ve tanıda karıştırılırsa yanlış sonuç verir. İkincisi, ad alanı dışındaki bir kaynağa erişim gerektiğinde — bir aygıt düğümü, bir takma noktası, bir çekirdek ayarı — yetki tek başına yetmez; o kaynağın ad alanının içine açıkça getirilmesi gerekir. Getirilmediği sürece açık yüzey büyümez.

Yetkiler süreci başlatan tarafça yazılır ve kalıcı yeri bir yapılandırma dosyasıdır.

# ornek birim dosyasi parcasi — calistirilmamistir
[Service]
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=yes
ProtectSystem=strict
ReadWritePaths=/veri/olcum

Parçadaki ilk satır sınırlayıcı kümeyi tek bir yetkiye indirir: listede olmayan hiçbir yetki bu birim altında geri kazanılamaz. İkinci satır o yetkinin program değiştirmede taşınmasını sağlar. Üçüncü satır bayrağı açar. Son iki satır ise bu dersin açık bıraktığı olguya dokunur — dosya sistemini salt okunur yapıp yalnız gereken dizini yazılabilir bırakır. Ayarların adları servis yöneticisine göre değişir; değişmeyen şey sıradır: önce tavan indirilir, sonra gereken tek yetki geri verilir.

Bir programın hangi yetkiye gerçekten ihtiyacı olduğu tahminle bulunmaz. Sertleştirme alışkanlığı tersinden çalışır: sınırlayıcı küme boşaltılarak başlanır, program bir sınama ortamında çalıştırılır, reddedilen işlemler kaydedilir ve kayda düşen her işlem için tek bir yetki geri verilir. Bu yol iki şey kazandırır. Verilen yetkiler gerçekten kullanılanlardır ve liste, programın ne yaptığının yazılı bir belgesine dönüşür; sürüm değiştiğinde listenin büyümesi de görünür bir olay olur. En az yetki ilkesi Siber Güvenliğe Giriş kursunda kurulmuştu; buradaki karşılığı bu listedir.

Yetki Ekseni: İki Olgu, Bir Kapanış

  • IZ17 — Yetki ekseninde 2 olgu vardır: yetenek-kumesi ve dosya-yetkileri.
  • IZ18 — Yetenek kırpma yetenek eksenini kapatan tek düzenektir; 1 olgu kapatır ve dosya-yetkileri olgusunu açık bırakır.
  • IZ19 — Beş kümenin ayrımı modelde tek bir olguya indirilmiştir; bu, modelin bilinçli bir sınırıdır ve süpürmede tam bu sınır zorlanır.
  • IZ20 — Dosya üzerindeki yetkiler ile dosya izin bitleri modelde aynı olguda toplanır.
"""Ortak tanimin bu derste kullanilan parcasi: 24 olgu , 9 eksen ve
yetenek eksenini kapatan yetenek kirpma. 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"]},
}
ALTI = ["surec-ad-alani", "takma-ad-alani", "ag-ad-alani", "kullanici-ad-alani",
        "makine-ad-alani", "denetim-grubu"]


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(["yetenek-kirpma"]))
print("KAHIN  olgu:", len(OLGULAR), "| eksen:", len({e for _, e in OLGULAR}))
print("yetenek ekseninde", sum(1 for _, e in OLGULAR if e == "yetki"), "olgu")
print()
print("olgu                 yetenek kirpma")
for o, e in OLGULAR:
    if e == "yetki":
        print(f"  {o:20s} {'ACIK BIRAKIR' if o in acik else 'kapatir'}")
print()
g = gorunen(["yetenek-kirpma"])
print("yetenek kirpma tek basina: kapatti", len(OLGULAR) - len(g),
      "| acik kalan 1 | gorunen", len(g),
      "| acik eksen", len(acik_eksen(["yetenek-kirpma"])))
KAHIN  olgu: 24 | eksen: 9
yetenek ekseninde 2 olgu

olgu                 yetenek kirpma
  yetenek-kumesi       kapatir
  dosya-yetkileri      ACIK BIRAKIR

yetenek kirpma tek basina: kapatti 1 | acik kalan 1 | gorunen 23 | acik eksen 9

Üç sayı yan yana duruyor. Kâhin: 24 olgu, 9 eksen; yetenek ekseninde 2 olgu. İzolasyon: yetenek kırpma 1 olgu kapatıyor. Açık kalan yüzey: 23 olgu ve 9 eksen. Bu, tek başına ölçülen düzenekler arasında en az kapatanlardan biridir ve sayı yanıltıcı değildir: yetenek kırpma sürecin isteyebileceklerini daraltır, gördüklerini daraltmaz.

Bu, ölçünün bir sınırıdır ve açıkça yazılmalıdır. Kurs görünürlüğü sayar; bir düzeneğin işletmedeki değeri yalnız kapattığı olgu sayısıyla ölçülmez. Yetenek kırpma, tablodaki tek olgusuna karşılık, sürecin çekirdekten isteyebileceği ayrıcalıklı işlem sınıflarının büyük bölümünü kapatır. İki ölçü ayrı sorulara yanıt verir ve biri ötekinin yerine geçmez.

Açık Kalan Olgu: Dosya Yetkileri

Kapanmayan olgu beklenmedik bir yerdedir. Süreçten kırpılan yetenek, dosyanın üzerinde yazılı olanı değiştirmez. Kök ağacındaki bir dosyada sahiplik bayrağı ya da işaretlenmiş bir yetki varsa, o dosya çalıştırıldığında yeni sürecin başlangıç kümesi dosyadan hesaplanır. Kırpma süreçte yapılmıştır, dosya sisteminde yapılmamıştır ve iki taraf birbirini bilmez.

Aynı ayrım dosya izin bitleri için de geçerlidir. İzin denetimini atlayan yetki kırpıldığında süreç artık her dosyaya erişemez; ama dosyaların üzerinde yazılı olan izinler yerinde durur ve herkese açık yazılabilir bir dizin, yetkisi kırpılmış bir süreç için de yazılabilir kalır. Yetenek kırpma bir istek süzgecidir, bir dosya sistemi işlemi değil.

Daraltma yolu bu yüzden dosya sisteminden geçer ve dört adımdır. Birincisi, kök ağacı salt okunur takılır; yazılabilir alan ayrı ve dar bir takmaya verilir. İkincisi, yazılabilir takmalara nosuid, nodev ve noexec seçenekleri konur — birincisi dosya üzerinden yetki kazanmayı, ikincisi aygıt düğümü üretmeyi, üçüncüsü o alandan program çalıştırmayı keser. Üçüncüsü, kök ağacı hazırlanırken sahiplik bayrağı taşıyan dosyalar aranır ve gerekmeyenlerin bayrağı temizlenir; bu, dersin örnek dökümündeki son satırın işidir. Dördüncüsü, yeni ayrıcalık yok bayrağı açılır ve sınırlayıcı küme kırpılır; ikisi birlikte yapıldığında kırpılan yetenek hiçbir program değiştirmeyle geri gelmez.

Dördünün ortak yanı şudur: hiçbiri süreçte değil, sürecin dünyasında yapılır. Model bu ayrımı tek bir açık olguyla temsil ediyor ve o olgunun kapanması için gereken şey ikinci bir yetki ayarı değil, kök ağacının kendisinin daraltılmasıdır.

Büyüyen Demet ve Olgu Kümesi Süpürmesi

  • IZ21 — Demet sırası bağlayıcıdır: beş ad alanı, denetim grubu, sonra yetenek kırpma.
  • IZ22 — Eklenen olgu ortam-yetenekleri, yetenek eksenine aittir ve yetenek kırpmanın açık bıraktıklarında değildir.
  • IZ23 — Çıkarılan dosya-yetkileri, yetenek ekseninin açık kalan tek olgusudur.
# --- Onceki blogun uzerine kurulur: OLGULAR, DUZENEK, ALTI, gorunen, acik_eksen.
YEDI = ALTI + ["yetenek-kirpma"]
print("kurs boyunca buyuyen demet")
print("asama                      duzenek  gorunen  acik eksen")
for ad, d in (("alti duzenek", ALTI), ("+yetenek kirpma", YEDI)):
    print(f"  {ad:24s} {len(d):7d}  {len(gorunen(d)):7d}  {len(acik_eksen(d)):10d}")
print()
EK = OLGULAR + [("ortam-yetenekleri", "yetki")]
EKSIK = [(o, e) for o, e in OLGULAR if o != "dosya-yetkileri"]
print("olgu kumesi supurmesi (yedi duzenek uygulanmis halde)")
print("kume                       olgu  eksen  gorunen  acik eksen  yetki acik")
for ad, kume in (("temel", OLGULAR), ("+ortam-yetenekleri", EK),
                 ("-dosya-yetkileri", EKSIK)):
    g = set(gorunen(YEDI, kume))
    e = acik_eksen(YEDI, kume)
    ya = sum(1 for o, ek in kume if ek == "yetki" and o in g)
    print(f"  {ad:24s} {len(kume):4d}  {len({x for _, x in kume}):5d}"
          f"  {len(g):7d}  {len(e):10d}  {ya:10d}")
kurs boyunca buyuyen demet
asama                      duzenek  gorunen  acik eksen
  alti duzenek                   6       12           7
  +yetenek kirpma                7       11           7

olgu kumesi supurmesi (yedi duzenek uygulanmis halde)
kume                       olgu  eksen  gorunen  acik eksen  yetki acik
  temel                      24      9       11           7           1
  +ortam-yetenekleri         25      9       11           7           1
  -dosya-yetkileri           23      9       10           6           0

Yedinci düzenek görünen olguyu 12’den 11’e indiriyor: bir olgu. Açık eksen yine 7’de duruyor ve bu, üçüncü kez aynı sonucu veriyor. Düzenek eklemek yüzeyi daraltıyor, ekseni daraltmıyor; her eksende bir şey açık kalıyor.

Süpürme modelin sınırını da gösteriyor. Yetki eksenine sekizinci düzenekten bağımsız bir olgu eklendiğinde yetenek kırpma onu da kapatıyor ve yüzey 11’de kalıyor: beş kümeyi ayrı ayrı modellemek sonucu değiştirmezdi. Buna karşılık açık kalan tek olgu çıkarıldığında eksen kapanıyor, yüzey 10’a ve açık eksen 6’ya iniyor. Sonuç önceki iki dersle aynı yöne bakıyor: yüzeyi belirleyen şey eksendeki olgu sayısı değil, açık kalan olgunun varlığıdır. Modeldeki bütün sayılar kurgu üzerinden tam sayımdır, bir makinede yapılmış ölçüm değildir.

Özet

  • Yetki, süper kullanıcı ayrıcalığının ayrı ayrı verilebilen parçalara bölünmesidir; yetkiler eşit kapsamda değildir ve geniş yetki verilmez.
  • Bir sürecin beş yetenek kümesi vardır — etkin, izinli, devralınabilir, sınırlayıcı ve ortam — ve üzerlerinde bir kez açılıp kapatılamayan yeni ayrıcalık yok bayrağı durur.
  • Yetki ekseninde 2 olgu vardır; yetenek kırpma 1’ini kapatır, dosya-yetkileri olgusunu açık bırakır ve tek başına 24 olgunun 23’ünü görünür bırakır.
  • Açık kalan olgunun nedeni yapısaldır: kırpma süreçte yapılır, dosyaların üzerinde yazılı olan değişmez. Daraltma yolu dosya sistemindedir — salt okunur kök, nosuid, nodev ve noexec seçenekleri, sahiplik bayraklarının temizlenmesi ve sınırlayıcı kümenin kırpılması.
  • Yedi düzenekli demette görünen olgu 12’den 11’e iner, açık eksen 7’de durur; süpürmede açık kalan tek olgu çıkarıldığında yüzey 10’a, eksen 6’ya düşer.

Sonraki Adım

Yetenek kırpma sürecin çekirdekten ne isteyebileceğini daralttı, ama isteğin kime yöneldiğini hiç sormadı. İzin denetimi hâlâ dosyanın sahibinin verdiği kararlara dayanıyor: bir dizin herkese açık yazılabilir işaretlenmişse, kırpılmış bir süreç de oraya yazar. Sonraki ders bu kararı sahibin elinden alıp bir politikaya bağlayan katmanı ele alır. Özneye ve nesneye erişim etiketi verilir, aralarındaki her erişim bir politika kuralıyla açıkça izinli hâle getirilir ve kural yoksa erişim reddedilir. Ölçülecek şey iki yönlüdür: politikanın kapattığı olgu ile politikanın kendi açık yüzeyi, yani gerekmediği hâlde izin verilen erişim sayısı.

İ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