İçeriğe geç
academia.sh

Ders 01 / 09

Ad Alanları

Bir sürecin 24 gözlenebilir olgusu dokuz eksene dağılıyor; beş ad alanı bunların dokuzunu kapatıyor, 15'ini açık bırakıyor ve dokuz eksenden yalnız ikisini tam kapatabiliyor.

İçindekiler

Linux Ağ Yönetimi ve Sorun Giderme kursu son dersinde bir söz bıraktı: orada bir makinenin tek bir ağ yığını vardı, burada aynı makinede birden çok yığın kurulacak ve her arayüz, her yönlendirme tablosu, her kural zinciri çoğalacaktı. Sistem Yönetimi kursu da iki ayrı yerde aynı adrese işaret etmişti. Servis yöneticisi dersinde birim, yöneticinin defterindeki bir kayıttı ve süreçlerin birbirinden yalıtılması açıkça bu kursa bırakılmıştı; kaynak sınırları dersinde ise süreç başına konan kısıt ölçüldü ve bir süreç öbeğinin toplamına konan kısıt yine buraya havale edildi. İki borç da aynı iki adı taşıyor: ad alanı ve denetim grubu. Bu ders birincisini öder, sonraki ders ikincisini.

Ödeme biçimi alışıldık olmayacak. Önceki kurslar bir aracın ne göremediğini ve bir sınamanın kaç adayı elediğini saydı; bu kurs bir izolasyonun ne kadarını kapatamadığını sayar. Kuralı şudur: bir izolasyonun sayısı kapattığı yüzey değil, açık bıraktığı yüzeydir; neyin hâlâ görüldüğü yazılmayan izolasyon ölçülmemiş sayılır.

Kursun Ölçüsü ve Güvenlik Sınırı

Ölçüm üç sayıyı yan yana koyar. Kâhin, bir sürecin bütün gözlenebilir olgularıdır; kurguyu biz yazdığımız için tamamı biliniyor. İzolasyon, düzeneklerin kapattığı olgu sayısıdır. Açık kalan yüzey ise geriye kalan, sürecin hâlâ görebildiği olgulardır. Üçüncü sayı bu kursun asıl konusudur ve hiçbir derste atlanmaz.

Bu bir savunma ölçümüdür ve sınırı baştan yazılır. Kurs boyunca kaçış, yetki yükseltme, atlatma ya da sömürü yordamı yazılmaz; çalışan sömürü kodu, kavram kanıtı ya da hazır komut dizisi verilmez. Ölçülen şey hangi olgunun görünür kaldığıdır, o görünürlüğün nasıl kötüye kullanılacağı değil. Buna karşılık her açık yüzeyin yanına bir daraltma yolu yazılır: bir boşluk sayıldıysa aynı derste onu küçülten düzenek de gösterilir. En az yetki ilkesi, erişim denetimi modelleri ve tehdit modelleme yordamı Siber Güvenliğe Giriş ile Güvenli Geliştirme Yaşam Döngüsü kurslarında kuruldu; burada yalnız çekirdek düzeyindeki karşılığı ölçülür.

Model üzerindeki bütün sayılar kurgu üzerinden tam sayımdır, gerçek bir makinede yapılmış ölçüm değildir. Gerçek komutlar bu derste çalıştırılmaz; örnek dökümler biçimi göstermek içindir ve içlerindeki kimlik numaraları kurgudur. Hiçbir sayı iddiası örnek dökümden gelmez.

Ad Alanı: Çekirdek Tablosunun Üzerine Konan Süzgeç

Bir makinede süreç tablosu tektir, takma noktası listesi tektir, ağ arayüzü listesi tektir. Ad alanı ikinci bir tablo üretmez; var olan tablonun üzerine bir görünürlük süzgeci koyar ve süreç o süzgecin arkasından bakar. Aynı kayıt iki ayrı ad taşıyabilir, bir kayıt bir görünümde bulunup ötekinde bulunmayabilir, ama silinmiş olmaz.

Türler ayrı ayrı açılır ve bağımsızdır. Süreç ad alanı süreç numaralarını yeniden numaralandırır: içerideki ilk süreç 1 numarayı alır ve dışarıdaki numarasından farklıdır. Takma ad alanı takma noktası listesini ayırır. Ağ ad alanı arayüzleri, yönlendirme tablosunu ve dinlenen bağlantı noktalarını ayırır. Kullanıcı ad alanı kimlikleri eşler. Makine ad alanı makine adını ayırır. Bunların yanında süreçler arası iletişim nesnelerini ve denetim grubu ağacının kökünü ayıran türler de vardır; bu ders beş türü ölçer, kalanları adlandırıp geçer.

Bir sürecin hangi ad alanlarında olduğu süreç dosya sisteminde sembolik bağlar olarak durur. Aşağıdaki döküm çalıştırılmamıştır; kimlik numaraları kurgudur ve gerçek bir makinede başka değerler görülür.

# ornek dokum — calistirilmamistir
$ ls -l /proc/self/ns
cgroup -> 'cgroup:[40001]'
ipc    -> 'ipc:[40002]'
mnt    -> 'mnt:[40003]'
net    -> 'net:[40004]'
pid    -> 'pid:[40005]'
user   -> 'user:[40006]'
uts    -> 'uts:[40007]'

İki sürecin aynı ad alanında olup olmadığı bu bağların gösterdiği kimliklerin eşitliğiyle anlaşılır. Ad alanı nesnedir: kendisine bağlı süreç kaldığı ya da bir dosya yoluna sabitlendiği sürece yaşar, ikisi de bitince yok olur.

Ad alanı iki yolla girilir. Yeni bir ad alanı yaratmak için süreç kendini ayırır; var olan bir ad alanına katılmak için hedefin bağı açılır. İkisinin kabuk karşılıkları ayrı araçlardır:

# ornek dokum — calistirilmamistir
$ unshare --user --pid --fork --mount-proc --uts --net ornek-komut
$ nsenter --target 8140 --pid --mount --net -- ornek-komut
$ cat /proc/8140/uid_map
         0       1000          1

Birinci satır yeni ad alanları yaratır. Kullanıcı ad alanının önce gelmesinin bir nedeni vardır: yetkisiz bir kullanıcının öteki türleri açabilmesini sağlayan tek tür odur ve içeride görünen kimlik dışarıda hiçbir yetki taşımaz. Üçüncü satırdaki eşleme tablosu bunu gösterir — içerideki 0, dışarıdaki bir kullanıcıya karşılık gelir ve eşleme bir kez yazılıp kapanır. İkinci satır ise tersini yapar: var olan bir ad alanına dışarıdan girer. Bu araç bir izolasyon düzeneği değil, bir gözlem kanalıdır ve makine üzerinde yetki gerektirir; kursun ikinci konusu bu tür kanalların izolasyonu ne kadar deldiğini sayar.

Yirmi Dört Olgu, Dokuz Eksen

Ölçüm için bir sürecin görebildikleri sayılabilir bir kümeye indirilir. Kurgu, bir ölçüm sunucusunda çalışan olcum-toplayici sürecidir.

  • IZ1 — Sürecin 24 gözlenebilir olgusu vardır ve her olgu bir eksene aittir: süreç, takma, ağ, kullanıcı, makine, kaynak, çekirdek, yetki, etiket. Eksen sayısı 9.
  • IZ2Kâhin sürecin bütün olgularıdır; kurguyu kuran taraf hepsini bilir.
  • IZ3 — Bir izolasyon düzeneği bir süzgeçtir: belirli bir ekseni kapatır ama o eksende bir şey açık bırakabilir.
  • IZ4 — Bir düzenek yalnız tek bir ekseni kapatır; eksenler arası yan etki modellenmez.
  • IZ5 — Bütün sayılar tam sayımdır; rastgelelik yoktur ve ikinci tohum kullanılmaz.
  • IZ6 — Olgular gözlenebilirlik bakımından eşit ağırlıklıdır; bir olgunun ötekinden daha değerli olması modellenmez.
"""M03/K05 ortak tanim , bu dersin kullandigi parcalar.

Kahin = surecin butun olgulari (kurgu , biliniyor).
Izolasyon = olgularin bir altkumesini GORUNMEZ kilar.
Olculen sey: ACIK KALAN YUZEY , yani hala gorulebilen olgu sayisi.
"""

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"),
]

# Her ad alani BIR ekseni kapatir ve o eksende bir sey ACIK BIRAKIR.
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": []},
}
BES = list(DUZENEK)


def gorunen(duzenekler, olgular=None):
    """Duzenekler uygulandiginda hala gorulen olgular."""
    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})


eksen = sorted({e for _, e in OLGULAR})
print("KAHIN  olgu:", len(OLGULAR), "| eksen:", len(eksen), eksen)
print()
print("ad alani             eksende  kapatti  acik kalan  gorunen")
for d in BES:
    g = gorunen([d])
    n = sum(1 for _, e in OLGULAR if e == DUZENEK[d]["eksen"])
    print(f"  {d:20s} {n:7d}  {len(OLGULAR) - len(g):7d}"
          f"  {len(DUZENEK[d]['acik_kalan']):10d}  {len(g):7d}")
print()
g5 = gorunen(BES)
print("bes ad alani birlikte")
print("  gorunen olgu:", len(g5), "| acik eksen:", len(acik_eksen(BES)),
      acik_eksen(BES))
print("  tam kapanan eksen:",
      [DUZENEK[d]["eksen"] for d in BES if not DUZENEK[d]["acik_kalan"]])
KAHIN  olgu: 24 | eksen: 9 ['ag', 'cekirdek', 'etiket', 'kaynak', 'kullanici', 'makine', 'surec', 'takma', 'yetki']

ad alani             eksende  kapatti  acik kalan  gorunen
  surec-ad-alani             3        2           1       22
  takma-ad-alani             3        2           1       22
  ag-ad-alani                3        3           0       21
  kullanici-ad-alani         2        1           1       23
  makine-ad-alani            1        1           0       23

bes ad alani birlikte
  gorunen olgu: 15 | acik eksen: 7 ['cekirdek', 'etiket', 'kaynak', 'kullanici', 'surec', 'takma', 'yetki']
  tam kapanan eksen: ['ag', 'makine']

İzolasyon İkili Değil, Kısmi

Üç sayı yan yana duruyor. Kâhin: 24 olgu, 9 eksen. İzolasyon: beş ad alanı birlikte 9 olgu kapatıyor. Açık kalan yüzey: 15 olgu ve 7 eksen.

Tablonun ilk okuması tek tek düzeneklerle ilgili. Süreç ad alanı üç olgudan ikisini kapatıp birini açık bırakıyor: süreç öteki süreçlerin listesini ve ata zincirini göremiyor ama kendi numarasını görüyor. Takma ad alanı aynı biçimde çalışıyor; öteki takmalar ve paylaşılan geçici dizin kapanıyor, kök dosya ağacının kendisi görünür kalıyor. Kullanıcı ad alanı iki olgudan yalnız birini kapatıyor: kimlik eşlemesi ayrılıyor, dosya sahipliği açık kalıyor.

Dokuz eksenden yalnız ikisi tam kapanıyor ve bu ikisi ağ ile makine ad alanıdır. Ağ ad alanı kendi ekseninin üç olgusunu da kapatır; makine ad alanı tek olgusunu kapatır. Neden bu ikisi olduğu modelin keyfi bir seçimi değil, kapattıkları şeyin yapısıyla ilgilidir: ağ yığını ve makine adı, sürecin kendisine ait olmayan dış niteliklerdir. Süreç numarası, kök dizin ve dosya sahipliği ise sürecin kendisinde durur; süreç kendini görmeden çalışamaz.

Bu, ortak tanımın birinci okumasıdır: izolasyon ikili değil, kısmidir. Bir düzeneği açmak bir ekseni “kapattı” saymaya yetmez; her düzeneğin yanına açık bıraktığı olgu yazılmalıdır.

Olgu Kümesi Süpürmesi

Modelde rastgelelik olmadığı için ikinci bir tohumla ölçüm tekrarlanamaz. Sonucun kurguya ne kadar bağlı olduğu olgu kümesini süpürerek görülür: listeye bir olgu eklenir, bir olgu çıkarılır ve açık yüzeyin nasıl değiştiği okunur.

  • IZ7 — Eklenen olgu oturum-kimligi, süreç eksenine aittir ve süreç ad alanının açık bıraktıklarında değildir.
  • IZ8 — Çıkarılan dosya-sahipligi, kullanıcı ekseninin açık kalan tek olgusudur.
  • IZ9 — İkinci çıkarma makine-adi, makine ekseninin tek olgusudur; çıkarıldığında eksen de listeden düşer.
# --- Bu blok bir onceki blogun uzerine kurulur: OLGULAR, DUZENEK, BES,
# gorunen ve acik_eksen oradan gelir.
EK = OLGULAR + [("oturum-kimligi", "surec")]
EKSIK_SAHIPLIK = [(o, e) for o, e in OLGULAR if o != "dosya-sahipligi"]
EKSIK_MAKINE = [(o, e) for o, e in OLGULAR if o != "makine-adi"]

print("olgu kumesi supurmesi (bes ad alani uygulanmis halde)")
print("kume                       olgu  eksen  gorunen  acik eksen")
for ad, kume in (("temel", OLGULAR),
                 ("+oturum-kimligi/surec", EK),
                 ("-dosya-sahipligi", EKSIK_SAHIPLIK),
                 ("-makine-adi", EKSIK_MAKINE)):
    g = gorunen(BES, kume)
    e = acik_eksen(BES, kume)
    print(f"  {ad:24s} {len(kume):4d}  {len({x for _, x in kume}):5d}"
          f"  {len(g):7d}  {len(e):10d}")
olgu kumesi supurmesi (bes ad alani uygulanmis halde)
kume                       olgu  eksen  gorunen  acik eksen
  temel                      24      9       15           7
  +oturum-kimligi/surec      25      9       15           7
  -dosya-sahipligi           23      9       14           6
  -makine-adi                23      8       15           7

Süpürme iki ayrı şey söylüyor. Birincisi: kapatılan bir eksene olgu eklemek açık yüzeyi büyütmüyor. Süreç ekseni yirmi beşinci olguyla dört olguya çıktı, süreç ad alanı üçünü birden kapattı ve görünen olgu 15’te kaldı. İkincisi ve önemlisi: açık kalan tek olguyu çıkarmak bütün ekseni kapatıyor. Dosya sahipliği listeden düştüğünde kullanıcı ad alanı kendi ekseninin tamamını kapatıyor, açık eksen 7’den 6’ya iniyor ve görünen olgu 14’e düşüyor.

Bu, ölçünün nereye duyarlı olduğunu gösteriyor: açık yüzeyi belirleyen şey olgu sayısı değil, hangi olguların açık kalan olarak işaretlendiğidir. Üçüncü satır bunu tersinden doğruluyor; makine adı çıkarıldığında eksen listeden düşüyor, makine ad alanı hiçbir şey kapatmayan bir düzeneğe dönüşüyor ve görünen olgu yine 15 oluyor. Kapatacak şeyi olmayan bir düzenek yüzeyi daraltmaz, yalnız yapılandırmayı büyütür.

Açık Kalan Üçü ve Daraltma Yolları

Beş ad alanının açık bıraktığı 15 olgunun üçü doğrudan bu derse aittir; kalan on ikisi kaynak, çekirdek, yetki ve etiket eksenlerindedir ve sonraki dört dersin konusudur. Üçünün her birinin yanına bir daraltma yolu yazılır.

Kendi süreç numarası açık kalır ve kapatılamaz; süreç kendi numarasını bilmeden sinyal alamaz, çocuk toplayamaz. Buradaki daraltma sayıyı gizlemek değil, sayının anlamını sızdırmamaktır: süreç dosya sistemi içeride yeniden takılır ve dışarıdaki numaralara açılan bir yol bırakılmaz; günlüklere yazılan numaraların hangi ad alanına ait olduğu ayrıca yazılır. Aynı sürecin içeride 1, dışarıda başka bir numara taşıması bir arıza değil, ölçmenin kuralıdır.

Kök dosya ağacı açık kalır, çünkü sürecin bir kökü olmak zorundadır. Daraltma yolu kökün neyi içerdiğini küçültmektir: kök salt okunur takılır, yazılabilir alan ayrı ve geçici bir takmaya verilir, gereksiz aygıt düğümleri ve yardımcı programlar konmaz. Takma seçeneklerinden nosuid, nodev ve noexec bu daraltmanın en ucuz üç adımıdır ve Sistem Yönetimi kursundaki kalıcı takma girdisiyle aynı yerde yazılır.

Dosya sahipliği açık kalır, çünkü kimlik eşlemesi sürecin gördüğü sayıları değiştirir ama diskteki sahiplik alanlarını değiştirmez. Daraltma yolu eşlemeyi dosya sistemine kadar taşımaktır: kök dosya ağacının sahipliği eşlenen aralığa göre normalleştirilir, paylaşılan dizinler ya salt okunur verilir ya da hiç verilmez. Bu ders bir yüzeyi saymakla kalmaz; her satırında onu küçülten bir yapılandırma kararı da bırakır.

Özet

  • Bu kurs bir izolasyonun açık bıraktığı yüzeyi ölçer; neyin hâlâ görüldüğü yazılmayan izolasyon ölçülmemiş sayılır. Ölçüm bir savunma ölçümüdür ve her açık yüzeyin yanına bir daraltma yolu yazılır.
  • Ad alanı ikinci bir tablo üretmez; var olan çekirdek tablosunun üzerine bir görünürlük süzgeci koyar ve süreç o süzgecin arkasından bakar.
  • Kâhin 24 olgu ve 9 eksendir; beş ad alanı birlikte 9 olgu kapatır, 15 olgu ve 7 eksen açık kalır.
  • Tek başına hiçbir ad alanı kendi eksenini tam kapatmaz; ağ ve makine ad alanı bunu yapabilen tek ikilidir. Süreç ad alanı kendi-surec-numarasi, takma ad alanı kok-dosya-agaci, kullanıcı ad alanı dosya-sahipligi olgusunu açık bırakır.
  • Olgu kümesi süpürmesi ölçünün duyarlı olduğu yeri gösteriyor: kapalı bir eksene olgu eklemek yüzeyi büyütmüyor, açık kalan tek olguyu çıkarmak ekseni kapatıp açık ekseni 7’den 6’ya indiriyor.
  • Sistem Yönetimi ile Linux Ağ Yönetimi ve Sorun Giderme kurslarında bu kursa bırakılan borcun birinci yarısı ödendi; ikinci yarısı denetim grubudur.

Sonraki Adım

Beş ad alanı görünürlüğü daralttı ama tüketimi hiç sınırlamadı: içerideki süreç makinenin işlemcisini, belleğini ve girdi/çıktı bant genişliğini olduğu gibi kullanabilir. Kaynak ekseni bu yüzden dört olgusuyla tümüyle açık duruyor. Sonraki ders bu ekseni kapatan düzeneği, denetim grubunu ele alır: kaynak sınırlandırmayı muhasebeden ayırır, Sistem Yönetimi kursunda ölçülen süreç başına kısıttan farkını yazar ve dört kaynak olgusundan üçünü kapatıp islemci-sayisi olgusunu neden açık bıraktığını sayar. Açık kalan o tek olgu, kendi iş parçacığı havuzunu makinenin işlemci sayısına göre boyutlandıran her programın sessizce yanlış hesap yapmasına yeter.

İ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