İçeriğe geç
academia.sh

Ders 08 / 14

Güvenlik Duvarı Türleri

Paket filtreleyen, durum bilgili ve uygulama farkındalıklı düzeneklerin aynı kırk akıştaki semantiği: yansımasız filtre 6 akışı fazladan geçirip 7 akışı fazladan durdurur, durum bilgili düzenek ikisini birden sıfırlar, uygulama farkındalıklı düzenek ise niyetin yazmadığı bir alanı okuduğu için yalnız 8 fazla duran üretir.

İçindekiler

Önceki ders hücresel kapsamayı bitirdi ve şunu bıraktı: buraya kadar sınırı çizen şey ortamdı. İşaret gücü eşiğin altına düştüğü yerde bağ kesiliyordu; hücrenin kenarını kimse yazmamıştı. Yarıçap bir tasarım sözüydü, onu uygulayan taraf fizikti.

Bu ders sınırın yazıldığı yerden başlar. Bir güvenlik duvarı (firewall), geçişin nerede biteceğini ortama bırakmaz: sınırı sıralı bir kural dizisi olarak yazar ve her akışı o diziden geçirir. Yazılmış sınırın ortamınkine göre bir üstünlüğü vardır — okunabilir. Bir de eksikliği vardır: yazan kişi ne yazdıysa o çalışır, ne demek istediği değil. Bu dersin sorusu, aynı dizinin farklı düzeneklerde neden farklı davrandığıdır.

Yazılmış Sınırın İki Kuralı

Kural dizisinin semantiği iki kuralla tanımlanır ve ikisi de kurs boyunca sabittir.

İlk eşleşen kazanır. Akış diziye baştan girer, eşleşen ilk kuralın eylemi uygulanır ve değerlendirme orada biter. Dizinin geri kalanı okunmaz.

Dizi örtük retle biter. Hiçbir kural eşleşmezse akış geçmez. Örtük ret (implicit deny) yazılmaz; dizinin bittiği yerden doğar. Ölçümde fazla duranın sessiz kaynağı budur: örtük retin durdurduğu akışın karşısında bir kural adı yoktur, dolayısıyla kimse onu aramaz.

Bu iki kural birlikte değerlendirme sırasını (evaluation order) anlamın parçası yapar. Sıranın kendisi ayrı bir ölçü nesnesidir ve sonraki dersin konusudur; burada dizi sabit tutulur ve yalnız onu işleten düzenek değişir. Kural dökümü şudur:

# ogretilen kural dokumu , calistirilmamistir
# sozdizimi kurgudur ve hicbir cihazin bicimi degildir

sira  eylem  kaynak    hedef   bnokta
  1   gecir  dis       dmz     80
  2   gecir  dis       dmz     443
  3   gecir  dmz       ic      3306
  4   gecir  yonetim   *       *
  5   gecir  ic        dmz     *
  6   gecir  ic        dis     *
  7   gecir  ic        ic      *
  -   ortuk ret : dizinin bittigi yer

Siber Güvenlik müfredatının Çevre Savunması konusu güvenlik duvarını nesilleriyle ve saldırının karşısındaki duruşuyla ele aldı; o anlatı burada tekrarlanmaz. Bu derste ölçülen şey nesil değil, düzeneğin okuduğu alan kümesinin aynı diziyi nasıl başka bir sınıra çevirdiğidir.

Üç Türün Gördüğü Alanlar

Üç tür arasındaki fark, kuralların yazımında değil, kuralın uygulandığı girdidedir.

Paket filtreleme (packet filtering) her paketi tek başına değerlendirir: kaynağını, hedefini ve bağlantı noktasını okur, kararı verir, unutur. Belleği yoktur.

Durum bilgili (stateful) düzenek bir durum çizelgesi tutar. Bir konuşma açıldığında ve geçirildiğinde çizelgeye yazılır; o konuşmanın sonraki paketleri kural dizisine yeniden sokulmaz, çizelgeden karşılanır. Bu düzeneğin kural dizisine sorduğu soru, paketin kendi yönü değil, konuşmayı açan yöndür.

Uygulama farkındalıklı (application aware) düzenek bunun üstüne akışın gerçekten ne taşıdığını okur: bağlantı noktası bir uygulamayı ima eder, taşınan içerik onu doğrulayabilir ya da doğrulamayabilir.

Paket filtrelemenin belleksizliğinin doğrudan bir sonucu vardır. Geçirilmiş bir konuşmanın dönüş yönü, kural dizisine ters çevrilmiş bir üçlü olarak girer ve genellikle hiçbir kurala uymaz; örtük ret onu keser. Bu eksiğin bilinen durağan çaresi ayna kuralıdır: yönlü her kuralın kaynağı ile hedefi yer değiştirilerek diziye ikinci bir kopya eklenir. Ayna, durum bilgisinin bir taklididir ve iki yerde tökezler. Birincisi, iki ucunu birden yazmayan bir kuralın aynası yoktur. İkincisi, ayna kuralı dönüş paketiyle yeni bir bağlantıyı birbirinden ayırt edemez; ikisine de aynı kapıyı açar.

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

  • AG1 — Kırk akış ortak kurgudan üretilir; kaynağı, hedefi ve bağlantı noktası kurgudandır. Kâhin niyetin kendisidir ve kurguyu biz yazdığımız için bilinir.
  • AG2 — Her akışa iki alan eklenir: evre (yeni bağlantı mı, açılmış bir konuşmanın sürdürülmesi mi) ve taşıdığı (bağlantı noktasının ima ettiği uygulamayı taşıyıp taşımadığı). İkisi de ayrı bir üreteçten gelir; temel kırk akış değişmez.
  • AG3 — Kurulu bir akışın niyeti, konuşmayı açan yönün niyetidir: politika ters çevrilmiş üçlüye uygulanır. Politika işlevinin kendisi değiştirilmez.
  • AG4 — Dört düzenek de aynı yedi kurallık diziyi kullanır. Değişen tek şey düzeneğin okuduğu alan kümesidir; kural kümesinin doğruluğu bu derste ölçülmez.
  • AG5 — Durum bilgili düzenek, kurulu bir akışta diziyi konuşmanın açılış yönüne uygular; durum çizelgesinin kaydettiği bilgi budur.
  • AG6 — Uygulama farkındalıklı düzenek, durum bilgili kararın üstüne taşınan uygulamanın bağlantı noktasına uyup uymadığını arar. Kâhin bu alanı okumaz.
  • AG7 — Kırk olaylık kümede ölçülebilen en küçük fark 1/40 = 0,025’tir; bundan küçük bir fark bu kümeyle savunulmaz.

Ölçüm

"""Guvenlik duvari turleri: ayni kirk akista dort duzenek.

Bolum 1 - kural dizisi sabit; degisen sey duzenegin okudugu alan.
Bolum 2 - her turun niyetten iki yonde birden sapmasi.
"""
TOHUM = 20260811
BOLGELER = ("dis", "dmz", "ic", "yonetim")
NOKTALAR = (80, 443, 22, 3306, 8080)


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": NOKTALAR[r(5)]})
    return liste


def evrele(ak, tohum=TOHUM + 1):
    """Her akisa evre ve tasidigi alanlarini ekler."""
    r = uretec(tohum)
    for a in ak:
        a["evre"] = ("yeni", "kurulu", "kurulu", "yeni")[r(4)]
        a["tasidigi"] = ("uygun", "uygun", "uygun", "baska")[r(4)]
    return ak


def politika(a):
    """Niyet: disaridan yalniz DMZ'nin 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


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"})]
UCLU = ("kaynak", "hedef", "bnokta")


def ters(a):
    return {"kaynak": a["hedef"], "hedef": a["kaynak"], "bnokta": a["bnokta"]}


def yansimalar(kurallar):
    """Iki ucunu da yazan her kuralin ayna esi."""
    y = []
    for eylem, olcut in kurallar:
        if "kaynak" in olcut and "hedef" in olcut:
            t = dict(olcut)
            t["kaynak"], t["hedef"] = olcut["hedef"], olcut["kaynak"]
            y.append((eylem, t))
    return y


def gorunen(a, alanlar):
    return {k: v for k, v in a.items() if k in alanlar}


def niyet(a):
    """Kurulu bir akisin niyeti, konusmayi acan yonun niyetidir."""
    return politika(a if a["evre"] == "yeni" else ters(a))


def paket(kurallar):
    k = kural_dizisi(kurallar)
    return lambda a: k(gorunen(a, UCLU))


def durum_bilgili(kurallar):
    k = kural_dizisi(kurallar)
    return lambda a: k(gorunen(a, UCLU)) if a["evre"] == "yeni" else k(ters(a))


def uygulama_farkindalikli(kurallar):
    d = durum_bilgili(kurallar)
    return lambda a: d(a) and a["tasidigi"] == "uygun"


AK = evrele(akislar())
AYNALI = DAR + yansimalar(DAR)
TURLER = (("paket, yansımasız", DAR, paket(DAR)),
          ("paket, yansımalı", AYNALI, paket(AYNALI)),
          ("durum bilgili", DAR, durum_bilgili(DAR)),
          ("uygulama farkındalıklı", DAR, uygulama_farkindalikli(DAR)))

print(f"akış {len(AK)} | yeni {sum(a['evre'] == 'yeni' for a in AK)} | "
      f"kurulu {sum(a['evre'] == 'kurulu' for a in AK)} | "
      f"niyetin geçirdiği {sum(niyet(a) for a in AK)} | "
      f"kaleme uymayan {sum(a['tasidigi'] == 'baska' for a in AK)}")
print()
print(f"{'düzenek':<22s} {'kural':>5s} {'doğru':>6s} {'fazla geçen':>12s} "
      f"{'fazla duran':>12s}")
for ad, k, d in TURLER:
    s = fark(AK, niyet, d)
    print(f"{ad:<22s} {len(k):5d} {s['dogru_gecti'] + s['dogru_durdu']:6d} "
          f"{s['yanlis_gecti']:12d} {s['yanlis_durdu']:12d}")
print()
print("yansımasızın durdurduğu kurulu akışlar:",
      [a["no"] for a in AK
       if a["evre"] == "kurulu" and niyet(a) and not paket(DAR)(a)])
print("her iki filtrenin fazladan geçirdikleri:",
      [(a["no"], a["kaynak"], a["hedef"], a["bnokta"])
       for a in AK if not niyet(a) and paket(AYNALI)(a)])
print("uygulama farkındalıklının fazladan durdurdukları:",
      [(a["no"], a["kaynak"], a["hedef"], a["bnokta"])
       for a in AK if niyet(a) and durum_bilgili(DAR)(a)
       and not uygulama_farkindalikli(DAR)(a)])
akış 40 | yeni 20 | kurulu 20 | niyetin geçirdiği 23 | kaleme uymayan 12

düzenek                kural  doğru  fazla geçen  fazla duran
paket, yansımasız          7     27            6            7
paket, yansımalı          13     30            6            4
durum bilgili              7     40            0            0
uygulama farkındalıklı     7     32            0            8

yansımasızın durdurduğu kurulu akışlar: [12, 26, 27, 31, 32, 36, 37]
her iki filtrenin fazladan geçirdikleri: [(1, 'yonetim', 'ic', 3306), (6, 'yonetim', 'ic', 3306), (30, 'ic', 'dis', 3306), (35, 'ic', 'dis', 3306), (38, 'yonetim', 'ic', 443), (40, 'ic', 'dis', 443)]
uygulama farkındalıklının fazladan durdurdukları: [(7, 'yonetim', 'yonetim', 443), (8, 'yonetim', 'dmz', 443), (9, 'dis', 'dmz', 443), (15, 'yonetim', 'yonetim', 443), (20, 'ic', 'dmz', 443), (21, 'ic', 'dmz', 22), (32, 'dis', 'ic', 443), (36, 'dis', 'ic', 443)]

Durum Bilgisinin Kurtardığı

Yansımasız filtre kırk akışın 27’sinde niyetle aynı kararı veriyor. Kalan on üç, iki ayrı hata olarak ikiye ayrılıyor ve ikisi de yazılmalıdır.

Fazla geçen 6. Altısı da kurulu akış. Bunların hepsinde filtre paketin kendi yönüne bakıyor ve o yön kurala uyuyor — ama konuşmayı açan yön uymuyordu. yonetimden ice dönen paket dördüncü kurala takılıp geçiyor; oysa konuşmayı ic açmıştı ve icten yonetime gitmek niyetin yasakladığı tek şeydi. Filtre paketi doğru okuyor, konuşmayı yanlış okuyor.

Fazla duran 7. Yedisi de kurulu akış. Geçirilmiş bir konuşmanın dönüş yönü hiçbir kurala uymuyor ve örtük ret onu kesiyor. Bu yedi akışın kesildiğine dair bir kayıt üretilmez; dizide onları durduran bir satır yoktur.

Ayna kuralları eklendiğinde dizi yediden 13’e çıkıyor ve fazla duran 7’den 4’e iniyor. Kurtarılan üç akışın üçü de disten ice dönen paketler; onları kurtaran şey, üçüncü ve altıncı kuralın ayna eşleridir. Kalan dördü kurtarılamıyor, çünkü hepsi yonetim bölgesine dönüyor ve o bölgenin kuralı yalnız kaynağını yazıyor: iki ucunu yazmayan kuralın aynası yoktur.

Aynanın ödemediği şey ise fazla geçen sütunu: 6’dan 6’ya, hiç değişmedi. Ayna, dönüş paketiyle yeni bir bağlantıyı ayırt edemediği için zaten var olan yanlışı düzeltemez. Altı kural eklemek dizinin uzunluğunu %86 artırdı, niyetten sapmayı ise on üçten ona indirdi — ve sapmanın yönlerinden birine hiç dokunmadı.

Durum bilgili düzenek aynı yedi kuralla 40/40 veriyor: fazla geçen 0, fazla duran 0. Kazanç kuralın yazımından değil, sorunun değişmesinden geliyor. Düzenek kurulu bir akış için “bu üçlü kurala uyuyor mu” diye sormuyor; “bu konuşma açılırken geçirilmiş miydi” diye soruyor. İki soru kırk akışın on üçünde ayrı yanıt veriyor.

Uygulama Farkındalığının Ölçülemeyeni

Uygulama farkındalıklı düzenek durum bilgili karara bir koşul ekliyor ve sonuç kötüleşiyor: doğru 40’tan 32’ye iniyor, fazla duran 0’dan 8’e çıkıyor. Fazla geçen yine 0.

Bu bir kusur değil, ölçünün sınırı. Kırk akışın 12’si bağlantı noktasının ima ettiğinden başka bir uygulama taşıyor; düzenek bunları görüyor ve kesiyor. Kâhin ise o alanı hiç okumuyor: niyet “dışarıdan yalnız silahtan arındırılmış bölgenin web kalemine” derken kalemi bağlantı noktasıyla tarif ediyor, taşınan uygulamayla değil. Niyetin ölçüt almadığı bir alanı ölçüte alan düzenek, o alanda ne kadar haklı olursa olsun, bu kâhinde yalnız fazla duran üretir.

Buradan çıkan sonuç düzenek hakkında değil, niyet hakkındadır. Uygulama farkındalığının kazandırdığı şeyi ölçebilmek için politikanın kendisinin uygulama diliyle yeniden yazılması gerekir. Bu bir cihaz özelliği değil, bir politika kararıdır; ve yazılmadığı sürece cihazın fazladan gördüğü alan ölçüye giremez.

Açık Kalan Yüzeyler ve Daraltmalar

Birinci yüzey — ayna kuralının yönü. dis ile ic arasındaki ayna kuralı bağlantı noktası taşımıyor; dönüş paketini geçirirken yeni bir dış bağlantıyı da geçirir. Ölçümde bu yüzeyden sıfır fazla geçen çıktı, çünkü kırk akışın içinde disten ice giden yeni bir akış yok. Sıfır ölçmek yüzeyin kapalı olduğunu göstermez; bu, kümenin çözünürlüğüdür. Daraltma: ayna yerine durum bilgisi. Çizelge kapıyı yalnız açılmış konuşmalara açar ve aynı dizide fazla geçeni 6’dan 0’a indirir.

İkinci yüzey — yönsüz kural. Dördüncü kural yalnız kaynağını yazıyor: yönetim bölgesinden her hedefe, her bağlantı noktasına. Bu genişlik iki yönde de ödüyor — ileri yönde ölçülemeyen bir açıklık, dönüş yönünde aynasızlık yüzünden 4 fazla duran. Daraltma: kuralın hedefini ve bağlantı noktasını da yazmak. Bunun bedeli kural sayısıdır ve o bedelin ölçülmesi sonraki iki dersin işidir.

Üçüncü yüzey — kaleme uymayan taşıma. Kırk akışın 12’si bağlantı noktasının ima ettiğinden başkasını taşıyor. Bağlantı noktasına bakan üç düzenek de bunların hepsini geçiriyor ve ölçüde bu bir hata olarak görünmüyor. Daraltma: niyeti uygulama diliyle yeniden yazmak. Cihazın fazladan okuması tek başına bir daraltma değildir; okunanı ölçüt sayan bir niyet gerekir.

Özet

  • Yazılmış sınırın iki değişmezi vardır: ilk eşleşen kazanır ve dizi örtük retle biter. Örtük ret, karşısında bir kural adı olmadığı için fazla duranı görünmez kılar.
  • Üç türü ayıran şey kuralların yazımı değil, kuralın uygulandığı girdidir: paket filtreleme üçlüyü, durum bilgili düzenek konuşmanın açılış yönünü, uygulama farkındalıklı düzenek taşınan uygulamayı okur.
  • Aynı yedi kuralla yansımasız filtre 6 fazla geçen ve 7 fazla duran, ayna kurallı filtre 13 kuralla 6 ve 4, durum bilgili düzenek 0 ve 0 veriyor.
  • Ayna kuralı fazla duranı üçte bir azaltır ama fazla geçene hiç dokunmaz ve iki ucunu yazmayan kuralı taklit edemez; durum bilgisinin yerini tutmaz.
  • Uygulama farkındalıklı düzenek 8 fazla duran üretir ve fazla geçeni azaltmaz; niyet bağlantı noktasıyla yazıldığı sürece fazladan okunan alan ölçüye giremez.

Sonraki Adım

Bu derste kural dizisi sabit tutuldu ve yalnız onu işleten düzenek değişti. Diziye kendisine bakılmadı: yedi kural doğru sayı mıdır, sıraları doğru sıra mıdır, bir kuralı silmek neyi açar? Sonraki ders düzeneği sabitler ve diziyi değiştirir. Altı kurallık kısa bir küme, sekiz kurallık uzun bir küme ve yedi kurallık dar küme aynı kırk akışta yan yana konur; ölçülen şey kural sayısı ile politikanın karşılanması arasında bir bağ olup olmadığı ve bir kuralın kendinden önceki bir kural yüzünden nasıl hiç okunmadan kalabileceğidir.

İ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