İçeriğe geç
academia.sh

Ders 13 / 14

Sıfır Güven Ağ Modeli

Konum ölçütü kural dizisinden silindiğinde bir kural örtük evete dönüşür, üç kural gölgelenir ve fazla geçen sıfırdan on sekize çıkar; yerine kimlik ölçütü konduğunda kural sayısı yediden ona, belge koşulu eklendiğinde fazla duran birden dörde çıkar.

İçindekiler

Uçtan uca tünelin bütün numarası, dışarıdaki bir ucu kural dizisine içeriden gelmiş gibi göstermekti. O numaranın zorunlu olmasının nedeni tek bir satırdaydı: kural dizisi kaynak ölçütünü okuyor ve okuyacak bir bölge bekliyor. Tünel bir bölge uyduruyor, çünkü dizinin sorduğu soru “nereden geliyorsun” idi.

Sıfır güven (zero trust) bu soruyu bırakmayı önerir. İlkenin kendisi Siber Güvenlik müfredatında kuruldu ve burada tekrarlanmaz. Bu dersin sorusu ilke değil, cerrahidir: kaynak ölçütü kural dizisinden çıkarıldığında dizide ne kalır, kaç kural gölgelenir, iki yönlü hata nasıl değişir ve boşalan yere ne konmak zorundadır.

Konum Ölçütü Neyi Temsil Ediyordu

Kursun dar kural kümesi yedi kuraldan oluşur ve yedisi de kaynak ölçütünü taşır. Ölçüt akışın hangi bölgeden geldiğini söyler ve bölge, kural yazan kişi için bir kısaltmadır: “iç bölütteki bir makine” ile “kurumun çalışanı” aynı şey sayılmıştır.

Bu kısaltmanın bir bedeli yoktur — kısaltma doğru olduğu sürece. Kablonun ucundaki makine gerçekten çalışanın makinesiyse, konum kimliğin yerine geçer ve dizi doğru karar verir. Bir önceki dersin uçtan uca tüneli tam olarak bu kısaltmayı ayakta tutmak için vardı: uzak ucun bir bölgesi yoktu, tünel ona bir bölge atadı ve kısaltma yeniden çalışır oldu.

Sıfır güvenin iddiası kısaltmanın artık taşımadığıdır. Bu dersin ölçtüğü şey iddianın doğru olup olmadığı değil — kısaltmayı kaldırmanın kural dizisine ne yaptığıdır.

Ölçütü Silmek

Silme işlemi mekaniktir: her kuralın ölçüt sözlüğünden kaynak anahtarı çıkarılır. Kural sayısı değişmez, eylemler değişmez, sıra değişmez.

# ogretilen dokum , calistirilmamistir

konum ölçütlü dizi                       konum ölçütü silinmiş dizi
1  izin  kaynak=dis  hedef=dmz  bn=80    1  izin  hedef=dmz  bn=80
2  izin  kaynak=dis  hedef=dmz  bn=443   2  izin  hedef=dmz  bn=443
3  izin  kaynak=dmz  hedef=ic   bn=3306  3  izin  hedef=ic   bn=3306
4  izin  kaynak=yonetim                  4  izin  (ölçüt kalmadı)
5  izin  kaynak=ic    hedef=dmz          5  izin  hedef=dmz
6  izin  kaynak=ic    hedef=dis          6  izin  hedef=dis
7  izin  kaynak=ic    hedef=ic           7  izin  hedef=ic
(sonda örtük ret)                        (sonda örtük ret)

Dördüncü kural sorunun tamamını taşır. Konum ölçütlü hâlinde tek ölçütü vardı ve o ölçüt kaynak idi; silindiğinde geriye hiçbir ölçüt kalmaz. Ölçütsüz bir kural her akışla eşleşir: “ilk eşleşen kazanır” kuralı gereği dördüncü satır artık bir örtük evettir ve kendisinden sonraki üç kuralı gölgeler. Örtük ret ise hiç sıra bulamaz.

Yerine Ne Konur

Konum ölçütü, akışın kim adına açıldığını dolaylı olarak söylüyordu. Kaldırıldığında yerine doğrudan söyleyen bir ölçüt konmalıdır. Bu ölçüt akışın kendisiyle gelir ve kabloya bağlı değildir; dersin kurgusunda adı kimlik, aldığı değerler konuk, calisan, hizmet ve yonetici sınıflarıdır.

İkinci bir alan zorunludur: belge. Kimlik bir bildirimdir ve bildirimi doğrulayan bir şeyin bulunması gerekir. Belgesi bulunmayan bir akışın kimliği bilinmiyor sayılır ve dizi onu örtük rete düşürür. Bu, sıfır güvenin “doğrula, varsayma” cümlesinin kural dizisindeki karşılığıdır — ve bedeli ölçülecektir.

Kimlik ölçütlü dizi, konum ölçütlü diziden daha uzundur. Nedeni dördüncü kuraldır: kaynak=yonetim tek satırda bütün hedefleri açıyordu, çünkü bölge zaten bir güven bildirimiydi. Kimlik tarafında böyle bir bildirim yoktur; yonetici kimliğinin gideceği her hedef ayrı yazılır ve bir kural dörde çıkar.

Ölçümün varsayımları:

  • AG57 — Kırk akış kursun ortak kurgusundan üretilir. Kâhin politika işlevidir ve bu derste değiştirilmez; niyet kursun sabitidir.
  • AG58politika konum diliyle yazılmıştır. Kimlik ölçütlü bir diziyi bu kâhine göre ölçmek, iki dilin ayrıldığı akışları saymaktır; ölçüm kimliğin doğruluğunu değil, değişimin büyüklüğünü verir.
  • AG59 — Her akışa bir kimlik sınıfı eklenir. Akışların çoğunda kimlik bölgeyle eşleşir; kurgu bir azınlığı bilerek ayırır, çünkü kimlik kabloya bağlı değildir.
  • AG60 — Her akışa bir belge durumu eklenir. Kurgu bir azınlığı belgesiz bırakır; belge alanı akışın kimlik bildiriminin doğrulanabildiğini söyler, bildirimin içeriğini değil.
  • AG61 — Dört dizi karşılaştırılır: konum ölçütlü, konum ölçütü silinmiş, kimlik ölçütlü, kimlik ve belge koşullu. Değerlendirme düzeneği dördünde de aynıdır: ilk eşleşen kazanır, sonda örtük ret durur.
  • AG62 — Gölgelenen kural sayısı, kendinden önceki bir kuralın ölçütünü tümüyle kapsadığı kural sayısıdır; ölçüt kümesi boşalan bir kural, sonrasındaki her kuralı gölgeler.
  • AG63 — Küme kırk akıştır; ölçülebilen en küçük fark 1/40 = 0,025.

Ölçüm

"""Konum olcutunu kural dizisinden cikarmanin etkisi.

Bolum 1 - kaynak olcutlu dizi, olcut silinmis dizi, kimlik olcutlu dizi.
Bolum 2 - silinen olcutun kural dizisinde biraktigi bosluk.
"""
TOHUM = 20260811
BOLGELER = ("dis", "dmz", "ic", "yonetim")
KIMLIKLER = ("konuk", "calisan", "hizmet", "yonetici")
ESLEME = {"dis": "konuk", "dmz": "hizmet", "ic": "calisan", "yonetim": "yonetici"}


def uretec(tohum):
    d = tohum % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def akislar(sayi=40, tohum=TOHUM):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        liste.append({"no": i + 1, "kaynak": BOLGELER[r(4)],
                      "hedef": BOLGELER[r(4)],
                      "bnokta": (80, 443, 22, 3306, 8080)[r(5)]})
    return liste


def kimlikle(liste, tohum=TOHUM + 6):
    """Her akisa bir kimlik sinifi ve bir belge durumu ekler."""
    r, cikti = uretec(tohum), []
    for a in liste:
        ayrik, aday = r(9) == 0, KIMLIKLER[r(4)]
        cikti.append({**a, "kimlik": aday if ayrik else ESLEME[a["kaynak"]],
                      "belge": r(8) != 0})
    return cikti


def politika(a):
    """Niyet: disaridan yalniz DMZ web kalemine; yonetime disaridan kimse."""
    if a["kaynak"] == "dis":
        return a["hedef"] == "dmz" and a["bnokta"] in (80, 443)
    if a["kaynak"] == "dmz":
        return a["hedef"] == "ic" and a["bnokta"] == 3306
    if a["kaynak"] == "yonetim":
        return True
    return a["hedef"] != "yonetim"


def fark(olaylar, niyet, duzenek):
    d = {"dogru_gecti": 0, "dogru_durdu": 0, "yanlis_gecti": 0, "yanlis_durdu": 0}
    for o in olaylar:
        n, g = niyet(o), duzenek(o)
        if n and g:
            d["dogru_gecti"] += 1
        elif not n and not g:
            d["dogru_durdu"] += 1
        elif g:
            d["yanlis_gecti"] += 1
        else:
            d["yanlis_durdu"] += 1
    return d


def kural_dizisi(kurallar):
    """Ilk eslesen kazanir; sonda ortuk ret."""
    def calis(a):
        for eylem, olcut in kurallar:
            if all(a[k] == v for k, v in olcut.items()):
                return eylem
        return False
    return calis


def golgelenen(kurallar):
    sayi = 0
    for i, (_, olcut) in enumerate(kurallar):
        for _, onceki in kurallar[:i]:
            if all(olcut.get(k) == v for k, v in onceki.items()):
                sayi += 1
                break
    return sayi


DAR = [(True, {"kaynak": "dis", "hedef": "dmz", "bnokta": 80}),
       (True, {"kaynak": "dis", "hedef": "dmz", "bnokta": 443}),
       (True, {"kaynak": "dmz", "hedef": "ic", "bnokta": 3306}),
       (True, {"kaynak": "yonetim"}),
       (True, {"kaynak": "ic", "hedef": "dmz"}),
       (True, {"kaynak": "ic", "hedef": "dis"}),
       (True, {"kaynak": "ic", "hedef": "ic"})]

SILINMIS = [(e, {k: v for k, v in o.items() if k != "kaynak"}) for e, o in DAR]

KIMLIK = [(True, {"kimlik": "konuk", "hedef": "dmz", "bnokta": 80}),
          (True, {"kimlik": "konuk", "hedef": "dmz", "bnokta": 443}),
          (True, {"kimlik": "hizmet", "hedef": "ic", "bnokta": 3306}),
          (True, {"kimlik": "yonetici", "hedef": "dis"}),
          (True, {"kimlik": "yonetici", "hedef": "dmz"}),
          (True, {"kimlik": "yonetici", "hedef": "ic"}),
          (True, {"kimlik": "yonetici", "hedef": "yonetim"}),
          (True, {"kimlik": "calisan", "hedef": "dmz"}),
          (True, {"kimlik": "calisan", "hedef": "dis"}),
          (True, {"kimlik": "calisan", "hedef": "ic"})]


def belge_kosullu(kurallar):
    """Belgesiz akis ortuk rete duser."""
    ic = kural_dizisi(kurallar)
    return lambda a: a["belge"] and ic(a)


ak = kimlikle(akislar())
print(f"akış {len(ak)} | niyetin geçirdiği {sum(1 for a in ak if politika(a))} "
      f"| kimliği konumdan ayrık "
      f"{sum(1 for a in ak if a['kimlik'] != ESLEME[a['kaynak']])} | belgesiz "
      f"{sum(1 for a in ak if not a['belge'])}")
print()
print(f"{'kural dizisi':<24s} {'kural':>5s} {'gölgelenen':>10s} {'doğru':>6s} "
      f"{'fazla geçen':>12s} {'fazla duran':>12s}")
for ad, kurallar, duzenek in (
        ("konum ölçütlü", DAR, kural_dizisi(DAR)),
        ("konum ölçütü silinmiş", SILINMIS, kural_dizisi(SILINMIS)),
        ("kimlik ölçütlü", KIMLIK, kural_dizisi(KIMLIK)),
        ("kimlik ve belge koşullu", KIMLIK, belge_kosullu(KIMLIK))):
    d = fark(ak, politika, duzenek)
    print(f"{ad:<24s} {len(kurallar):5d} {golgelenen(kurallar):10d} "
          f"{d['dogru_gecti'] + d['dogru_durdu']:6d} {d['yanlis_gecti']:12d} "
          f"{d['yanlis_durdu']:12d}")

print()
print("konum ölçütü silinmiş dizinin ölçütleri:")
for i, (_, o) in enumerate(SILINMIS):
    print(f"  {i + 1}. {o if o else '(ölçüt kalmadı)'}")

print()
print("kimliği konumdan ayrık akışlar (no, konum, kimlik, hedef, niyet, kimlik dizisi):")
for a in ak:
    if a["kimlik"] != ESLEME[a["kaynak"]]:
        print(f"  {a['no']:2d} {a['kaynak']:8s} {a['kimlik']:9s} {a['hedef']:8s} "
              f"{str(politika(a)):5s} {str(kural_dizisi(KIMLIK)(a)):5s}")
print("belgesiz akışlarda niyetin geçirdiği:",
      sum(1 for a in ak if not a["belge"] and politika(a)))
akış 40 | niyetin geçirdiği 22 | kimliği konumdan ayrık 2 | belgesiz 5

kural dizisi             kural gölgelenen  doğru  fazla geçen  fazla duran
konum ölçütlü                7          0     40            0            0
konum ölçütü silinmiş        7          3     22           18            0
kimlik ölçütlü              10          0     38            1            1
kimlik ve belge koşullu     10          0     35            1            4

konum ölçütü silinmiş dizinin ölçütleri:
  1. {'hedef': 'dmz', 'bnokta': 80}
  2. {'hedef': 'dmz', 'bnokta': 443}
  3. {'hedef': 'ic', 'bnokta': 3306}
  4. (ölçüt kalmadı)
  5. {'hedef': 'dmz'}
  6. {'hedef': 'dis'}
  7. {'hedef': 'ic'}

kimliği konumdan ayrık akışlar (no, konum, kimlik, hedef, niyet, kimlik dizisi):
  34 dis      yonetici  dis      False True 
  40 ic       hizmet    dis      True  False
belgesiz akışlarda niyetin geçirdiği: 3

Silmenin Bedeli

İkinci satır dersin en sert sayısını taşıyor. Kural sayısı 7‘de kaldı, tek bir kural eklenmedi, tek bir kural çıkarılmadı — ve dizi **40 doğrudan 22’ye** düştü. Fazla geçen 0’dan 18’e çıktı; kırk akışın on sekizi, niyetin durduracağı hâlde geçti. Bu, kırk akışlık kümede 0,450’lik bir paydır ve ölçüm bandının on sekiz katıdır.

Fazla duran ise 0’da kaldı ve bu bir iyi haber değil, aynı kusurun öbür yüzüdür. Dördüncü kural her akışla eşleştiği için hiçbir akış örtük rete ulaşamıyor; dizi artık “durdur” diyebileceği bir yol taşımıyor. Tek yönü sayan bir denetim bu diziyi kusursuz görürdü — fazla duran sıfır, hiçbir kullanıcı şikâyeti yok.

Gölgelenen kural sayısı 3’tür ve nedenini alt döküm veriyor: dördüncü satırın ölçüt kümesi boştur, boş küme her ölçüt kümesini kapsar, dolayısıyla beşinci, altıncı ve yedinci kurallar hiç değerlendirilmez. Kural gölgelemesi burada bir yazım hatasından değil, bir alanın kaldırılmasından doğuyor.

Örüntü şudur: konum ölçütü tek başına bir kuralın taşıyıcısı olabilir. Öyle bir kuraldan silindiğinde geriye kural kalmaz, evet kalır. Kural sayısı bunu göstermez — dizi hâlâ yedi satırdır. Kural saymanın politikayı ölçmediğini kurs erişim denetim listelerinde söylemişti; burada aynı cümlenin daha keskin bir hâli görünüyor: ölçüt saymak da politikayı ölçmez.

Kimlik Ölçütünün İki Yönü

Üçüncü satır kimlik ölçütlü diziyi veriyor: 10 kural, 0 gölgelenen, 38 doğru, 1 fazla geçen, 1 fazla duran. Kural sayısı yediden ona çıktı ve bu artışın tamamı dördüncü kuraldan geliyor — bölgenin taşıdığı örtük güven bildirimi, kimlik tarafında dört ayrı satır olarak yazılmak zorunda kaldı. Konum ölçütünü kaldırmanın kural maliyeti budur.

İki hata kırk akışın hangilerinde doğduğu bilinerek okunabilir; alt döküm ikisini de gösteriyor. Otuz dördüncü akış dış bölgeden geliyor ama yonetici kimliği taşıyor: niyet onu durduracaktı, kimlik dizisi geçirdi — fazla geçen. Kırkıncı akış iç bölütten geliyor ama hizmet kimliği taşıyor: niyet onu geçirecekti, kimlik dizisi durdurdu — fazla duran.

Bu iki sayı bir kusur değil, iki dilin ayrıldığı yerin ölçüsüdür. Kâhin konum diliyle yazılmıştır; kimlik ölçütlü dizi başka bir dille yazılmıştır ve iki dil kırk akışın otuz sekizinde aynı şeyi söylüyor, ikisinde ayrılıyor. Ayrıldıkları akışlar, konum kısaltmasının zaten yanlış olduğu akışlardır. Ölçüm bu yüzden “kimlik yanlış karar verdi” demez; niyetin kendisinin yeniden yazılması gereken akış sayısını verir ve bu sayı 2/40 = 0,050’dir.

Buradan çıkan kural nettir: ölçütü değiştirmek kuralı değil, politikayı değiştirmektir. Konum diliyle yazılmış bir niyeti kimlik diliyle yazılmış bir diziyle uygulamaya çalışmak, iki dilin ayrıldığı her akışta bir hata üretir. Sıfır güvene geçiş bir kural dizisi düzenlemesi değil, niyetin yeniden yazılmasıdır.

Belge Koşulunun Bedeli

Dördüncü satır tek bir koşul ekliyor: belgesiz akış örtük rete düşer. Fazla geçen 1’de kalıyor — belge koşulu bu yönü hiç değiştirmiyor, çünkü otuz dördüncü akışın belgesi vardır ve kimliği geçerlidir. Fazla duran ise 1’den 4’e çıkıyor.

Üç akışlık artışın kaynağı alt satırda: kırk akışın 5’i belgesizdir ve bunların 3’ünü niyet geçirecekti. Doğru sayısı 38’den 35’e iniyor. Bu, 3/40 = 0,075’lik bir paydır ve bandın üç katıdır; ölçülebilir bir maliyettir.

İki yön burada birbirine karışmıyor ve karışmaması dersin sonucudur. Belge koşulu yalnız fazla duranı büyütür. Doğrulamayı zorunlu kılmak, doğrulanamayanı geçirmemek demektir ve doğrulanamayanların bir bölümü her zaman meşrudur. Belge kapsamasını genişletmek bu üç akışı geri kazandırır; kapsamayı gevşetmek, yani belgesiz akışı konuma bakarak geçirmek ise silinen ölçütü arka kapıdan geri getirir ve ikinci satırın hatasını kısmen geri çağırır.

Özet

  • Konum ölçütü kural dizisinde kimliğin kısaltmasıydı; kısaltma doğru olduğu sürece bedeli yoktur ve dar küme kırk akışta 40 doğru, 0 fazla geçen, 0 fazla duran verir.
  • Ölçüt mekanik olarak silindiğinde kural sayısı 7’de kalır ama tek ölçütü kaynak olan kural bir örtük evete dönüşür: 3 kural gölgelenir, doğru 22’ye iner, fazla geçen 18 olur ve fazla duran 0’da kalır — tek yönü sayan bir denetim bu diziyi kusursuz görürdü.
  • Yerine kimlik ölçütü konduğunda kural sayısı 7’den 10’a çıkar; artışın tamamı, bölgenin taşıdığı örtük güven bildiriminin dört ayrı satır olarak yazılmasından gelir.
  • Kimlik ölçütlü dizi 38 doğru, 1 fazla geçen, 1 fazla duran verir; iki hata kimlikle konumun ayrıldığı iki akıştır ve niyetin yeniden yazılması gereken akış sayısını ölçer, kimliğin yanlışlığını değil.
  • Belge koşulu yalnız bir yönü büyütür: fazla duran 1’den 4’e çıkar, çünkü belgesiz 5 akışın 3’ünü niyet geçirecekti. Doğrulamayı zorunlu kılmanın bedeli budur.

Sonraki Adım

Kurs boyunca altı denetim kuruldu: kablosuz tarafta kuşak ve kapsama, güvenlik tarafında bölütleme, kural dizisi, tespit, tünel ve konumdan kimliğe geçen ölçüt. Her biri kendi sınırını iki yönde birden ölçtü. Geriye tek bir soru kaldı ve kursun son dersi onu sorar: bu altı denetim birlikte açıldığında, ağ saldırılarının hangi sınıfı gerçekten kapanır, kapanmayan kaç sınıf kalır ve kapanmayanlar için elde ne var?

İ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