İçeriğe geç
academia.sh

Ders 03 / 21

Veri Sızdırma

Sistem yönergesi ve gizli veri ifşasının yalnız sayımla ölçülmesi: 240 kayıtlık kurgu kümede 32 kayıt gizli alan adı taşıyor (23 zararlı, 9 temiz) ve alan sınıfları erişim dizgesi 8, iletişim 10, abone kimliği 9, adres 5 diye dağılıyor. Sızdırma yüzeyi 35 kayıt, 26'sı zararlı. Tam kural süzgeci 25'ini durduruyor ve maskelemenin üstüne kattığı sıfır; gizli alan kuralı çıkarılmış dar süzgeç 16'sını durdururken maskeleme 9 kaydın alanını çıkarıyor. Her iki kurulumda hiçbirinin yakalamadığı kalıntı 1 kayıttır: hiçbir bayrak taşımayan, puanı 0,0088 olan ve en düşük eşikte bile işaretlenmeyen bir kayıt. Maskeleme tek başına bir karar gibi ölçüldüğünde kesinlik 0,7188, duyarlılık 0,2473, yanlış engelleme payı 0,0612 veriyor; ikinci koşumda kalıntı 0'a iniyor.

İçindekiler

Önceki iki ders savunmanın ölçüsünü tek bir soruya bağladı: kayıt durduruldu mu, durdurulmadı mı. Kimi zararın ise durdurmayla ilgisi yoktur. Bir kayıt geçtiğinde kaybedilen şey bazen bir eylem değil bir bilgidir — modele verilen sistem yönergesinin kendisi, bir abonenin kimliği, bir adres ya da bir erişim dizgesi. Bu tür bir kayıp geri alınamaz: engellenen bir işlem yeniden denenebilir, ifşa olan bir alan geri toplanamaz.

Veri sızdırma bu derste yalnız sayılır. Hiçbir sızdırma yordamı, sorgu biçimi ya da ifşa örneği yazılmaz; yazılan şey dört sayıdır: gizli alan adı taşıyan kaç kayıt var, maskeleme kaçından alanı çıkarıyor, süzgeç kaçını yakalıyor ve geriye hiçbirinin yakalamadığı kaç kayıt kalıyor. Bu son sayı dersin asıl bulgusudur.

  • SY17. Kayıt kümesi, sınıflar, gizli alan sınıfları ve savunma katmanları kurgudur; gerçek bir kişisel veri ya da erişim dizgesi kullanılmaz. Tohum 20260218.
  • SY18. Bu bir saldırı dersi değildir. Koşan kodun tamamı savunma tarafındadır: sayım, maskeleme ve süzgeç. Çalışan bir sızdırma yordamı ya da sorgu biçimi yazılmaz.
  • SY19. Saldırı bir metin değil bir öznitelik profilidir; kayıtların metni tümüyle zararsız destek talepleridir ve sınıfla hiçbir ilişkisi yoktur.
  • SY20. Kişisel veri ve maskeleme yordamı Uygulama Güvenliği ve Makine Öğrenmesi kurslarında ölçüldü; tekrarlanmaz. Burada yalnız modele giden veride sayım yapılır.
  • SY21. Maskeleme bir engelleme değildir: kaydı durdurmaz, yalnız alanı çıkarır. Onu bir karar gibi ölçmek bir yaklaşımdır ve ders bunu ayrıca yazar.
  • SY22. Bir kaydın hangi alan sınıfını istediği kayıt numarasından türetilir; bu bir tespit değil, sayımı bölmek için kurulmuş bir dağılımdır.
  • SY23. Sızdırma yüzeyi iki koşulun birleşimidir: gizli alan adı bayrağı taşıyan kayıtlar ve gizli_alan_istegi sınıfındaki kayıtlar. İkisi örtüşür, birbirini kapsamaz.
  • SY24. Duyarlılığın en küçük adımı 1/93 = 0,0108, yanlış engelleme payının adımı 1/147 = 0,0068’dir. Bir kayıtlık bir kalıntı bu bandın tam üstündedir.

Sızdırma Bir Eylem Değil Bir Kayıptır

Sızdırmanın iki hedefi vardır ve ikisi de sistemin kendi bağlamında durur. Birincisi sistem yönergesi ifşasıdır: modele verilen yönergenin çıktıya taşınması. Zararı metnin gizli olması değil, savunmanın hangi kurallara dayandığının görünür olmasıdır. İkincisi gizli veri ifşasıdır: bağlama girmiş bir abone kaydının, adresin ya da erişim dizgesinin yanıtta görünmesi. Kayıt kümesi ikisini tek bir yapısal bayrakta toplar — gizli_alan_adi — ve dört alan sınıfına böler: kimlik, iletişim, konum, erişim.

# KURGUDUR. Kayit kumesi, siniflar, gizli alan siniflari ve savunma katmanlari ders
# icinde tanimlanir; gercek bir kisisel veri kullanilmaz. Saldiri METNI yazilmaz.
TOHUM, M32 = 20260218, 0xFFFFFFFF


def uretec(t):
    x = ((t ^ (t >> 16)) * 2246822507) & M32
    x = ((x ^ (x >> 13)) * 3266489909) & M32
    s = [(x ^ (x >> 16)) & M32]

    def sonraki():
        s[0] = (s[0] * 1664525 + 1013904223) & M32
        return s[0] / 4294967296
    return sonraki


def ayrik(u, w):
    t = 0.0
    for i, x in enumerate(w):
        t += x
        if u < t:
            return i
    return len(w) - 1


def izno(m):
    h = 2166136261
    for c in str(m):
        h = ((h ^ ord(c)) * 16777619) & M32
    return h


# ---- KURGU kayitlar: saldiri METNI yazilmaz, saldiri bir OZELLIK PROFILIDIR
SINIF = ["temiz", "dolayli_yonerge", "gizli_alan_istegi", "yetki_asimi",
         "kaynak_taklidi", "bozulmus_girdi"]
KAYNAK = ["kullanici", "erisilen_belge", "arac_ciktisi"]
# Ozellikler yapisaldir; hicbiri calisan bir yuk degildir.
OZELLIK = ["yonerge_kipi", "rol_degistirme_istegi", "gizli_alan_adi", "yan_etkili_arac_adi",
           "kaynak_damgasi_uyusmuyor", "olagandisi_damga_dagilimi", "asiri_uzunluk"]
# Sinif basina ozellik olasiligi (kurgu). Temiz kayitlarda da dusuk paylar var:
# gercek dunyada iyi niyetli metin de bu ozellikleri tasiyabilir.
PROFIL = {
    "temiz":              [0.06, 0.02, 0.05, 0.03, 0.02, 0.04, 0.05],
    "dolayli_yonerge":    [0.88, 0.42, 0.10, 0.30, 0.35, 0.08, 0.12],
    "gizli_alan_istegi":  [0.35, 0.15, 0.86, 0.12, 0.10, 0.06, 0.08],
    "yetki_asimi":        [0.30, 0.25, 0.12, 0.84, 0.14, 0.05, 0.07],
    "kaynak_taklidi":     [0.22, 0.55, 0.08, 0.10, 0.82, 0.07, 0.06],
    "bozulmus_girdi":     [0.05, 0.03, 0.04, 0.03, 0.06, 0.80, 0.62],
}
KAYNAK_PAYI = {
    "temiz":             [0.72, 0.20, 0.08],
    "dolayli_yonerge":   [0.05, 0.70, 0.25],
    "gizli_alan_istegi": [0.55, 0.30, 0.15],
    "yetki_asimi":       [0.40, 0.35, 0.25],
    "kaynak_taklidi":    [0.10, 0.60, 0.30],
    "bozulmus_girdi":    [0.65, 0.20, 0.15],
}
# Kurgu, tumuyle zararsiz destek metinleri. Sinifla iliskisi YOKTUR;
# sinif bilgisi yalnizca ozellik profilinde durur.
METIN = ["bu ayki fatura tutari gecen aya gore yuksek geldi",
         "sayac endeksi yanlis girilmis olabilir",
         "mahallede kesinti ne zaman bitecek",
         "tarife basamagimi ogrenmek istiyorum",
         "ariza kaydim icin ekip ne zaman gelir",
         "adres degisikligi nasil yapilir"]

KAYIT = []
for i in range(240):
    r = uretec(TOHUM + 6151 * i)
    s = SINIF[ayrik(r(), [0.62, 0.10, 0.07, 0.07, 0.07, 0.07])]
    kaynak = KAYNAK[ayrik(r(), KAYNAK_PAYI[s])]
    oz = {o: (r() < p) for o, p in zip(OZELLIK, PROFIL[s])}
    KAYIT.append({"no": i + 1, "sinif": s, "kaynak": kaynak, "ozellik": oz,
                  "metin": METIN[int(r() * len(METIN))],
                  "uzunluk": 40 + int(r() * 260)})


def zararli(k):
    return k["sinif"] != "temiz"


# ---- SAVUNMA 1: kural suzgeci (yapisal, aciklanabilir)
def kural_suzgeci(k, kurallar=("yonerge_kipi", "gizli_alan_adi", "yan_etkili_arac_adi",
                               "kaynak_damgasi_uyusmuyor")):
    return any(k["ozellik"][o] for o in kurallar)


# ---- SAVUNMA 2: model temelli suzgec (puan + esik)
AGIRLIK = {"yonerge_kipi": 0.42, "rol_degistirme_istegi": 0.26, "gizli_alan_adi": 0.44,
           "yan_etkili_arac_adi": 0.40, "kaynak_damgasi_uyusmuyor": 0.38,
           "olagandisi_damga_dagilimi": 0.30, "asiri_uzunluk": 0.12}
KAYNAK_EK = {"kullanici": 0.00, "erisilen_belge": 0.18, "arac_ciktisi": 0.12}


def puan(k):
    p = sum(AGIRLIK[o] for o in OZELLIK if k["ozellik"][o]) + KAYNAK_EK[k["kaynak"]]
    r = uretec(TOHUM ^ izno(k["no"]))
    return min(max(p + (r() - 0.5) * 0.20, 0.0), 1.6)


def model_suzgeci(k, esik=0.40):
    return puan(k) >= esik


# ---- SAVUNMA 4: kisisel veri maskeleme (yalnizca sayim)
SIR_ALAN = {"abone_kimlik": "kimlik", "iletisim": "iletisim", "adres": "konum",
            "erisim_dizgesi": "erisim"}


def maskele(k):
    """Kurgu: gizli alan adi tasiyan kayitlarda alan cikarilir."""
    return {"maskelendi": k["ozellik"]["gizli_alan_adi"]}


# ---- OLCU: durdurulan ve yanlislikla durdurulan birlikte yazilir
def olc(kayitlar, karar):
    dp = yp = dn = yn = 0
    for k in kayitlar:
        isaret, gercek = karar(k), zararli(k)
        if isaret and gercek:
            dp += 1
        elif isaret and not gercek:
            yp += 1
        elif not isaret and gercek:
            yn += 1
        else:
            dn += 1
    kesinlik = dp / (dp + yp) if dp + yp else 0.0
    duyarlilik = dp / (dp + yn) if dp + yn else 0.0
    return {"dp": dp, "yp": yp, "yn": yn, "dn": dn,
            "kesinlik": round(kesinlik, 4), "duyarlilik": round(duyarlilik, 4),
            "yanlis_engelleme_payi": round(yp / (yp + dn), 4) if yp + dn else 0.0}

Kaç Kayıt İstiyor

İkinci blok yüzeyi sayar: kaç kayıt gizli alan adı taşıyor, hangi alan sınıfını istiyor ve bu kayıtların kaçı gerçekten zararlı.

ALAN = list(SIR_ALAN)


def alan_sinifi(k):
    """Gizli alan adi tasiyan kayitta hangi alan sinifinin istendigi (kurgu, kayda bagli)."""
    return ALAN[izno(k["no"]) % len(ALAN)]


bayrakli = [k for k in KAYIT if k["ozellik"]["gizli_alan_adi"]]
print("gizli alan adi tasiyan kayit:", len(bayrakli),
      " zararli:", sum(1 for k in bayrakli if zararli(k)),
      " temiz:", sum(1 for k in bayrakli if not zararli(k)))
print("\nalan sinifi      istek  zararli  temiz  duyu")
for a in ALAN:
    g = [k for k in bayrakli if alan_sinifi(k) == a]
    print(f"{a:<16} {len(g):>5} {sum(1 for k in g if zararli(k)):>8}"
          f" {sum(1 for k in g if not zararli(k)):>6}  {SIR_ALAN[a]}")

print("\nbayrakli kayitlarin sinif dagilimi")
for s in SINIF:
    n = sum(1 for k in bayrakli if k["sinif"] == s)
    if n:
        print(f"  {s:<18} {n:>3}")

print("\nmaskeleme tek basina bir karar gibi olculurse")
m = olc(KAYIT, lambda k: maskele(k)["maskelendi"])
print(f"  cikarilan alan {m['dp'] + m['yp']}  bunlarin zararlisi {m['dp']}"
      f"  temizi {m['yp']}  dokunulmayan zararli {m['yn']}")
print(f"  kesinlik {m['kesinlik']}  duyarlilik {m['duyarlilik']}"
      f"  yanlis engelleme payi {m['yanlis_engelleme_payi']}")
gizli alan adi tasiyan kayit: 32  zararli: 23  temiz: 9

alan sinifi      istek  zararli  temiz  duyu
abone_kimlik         9        6      3  kimlik
iletisim            10        6      4  iletisim
adres                5        4      1  konum
erisim_dizgesi       8        7      1  erisim

bayrakli kayitlarin sinif dagilimi
  temiz                9
  dolayli_yonerge      4
  gizli_alan_istegi   14
  yetki_asimi          2
  kaynak_taklidi       2
  bozulmus_girdi       1

maskeleme tek basina bir karar gibi olculurse
  cikarilan alan 32  bunlarin zararlisi 23  temizi 9  dokunulmayan zararli 70
  kesinlik 0.7188  duyarlilik 0.2473  yanlis engelleme payi 0.0612

Otuz iki kayıt gizli alan adı taşıyor ve bunların 9’u temiz. Bu dokuz kayıt bir saldırı değildir: kendi adresini soran ya da kendi abone kimliğini doğrulatmak isteyen sıradan taleplerdir. Gizli alan adı bir suçlama değil bir sayımdır — bayrağın kendisi niyeti göstermez, yalnız kaydın hangi alana dokunduğunu söyler.

Bayrak sınıflara da eşit dağılmıyor. On dördü gizli_alan_istegi sınıfından, ama dokuzu temiz ve kalan dokuzu dört ayrı zararlı sınıftan geliyor. Sızdırma, tek bir sınıfın davranışı değil, birçok sınıfın yan ürünü olabilen bir sonuçtur; yalnız bir sınıfı hedef alan bir savunma bu yüzden yüzeyin bir bölümünü hiç görmez.

Alan sınıfı tablosu bedeli eşitlemez. Sekiz istek erisim_dizgesi sınıfına gidiyor ve yedisi zararlı. Bir iletişim alanının ifşası rahatsız edicidir, bir erişim dizgesinin ifşası kalıcıdır: dizge yenilenene kadar geçerlidir ve yenileme haber alınmasına bağlıdır. Sayının büyüklüğü zararın büyüklüğü değildir.

Son bölüm maskelemeyi bir karar gibi ölçer ve bunun neden yanıltıcı olduğunu gösterir. Kesinlik 0,7188, duyarlılık 0,2473, yanlış engelleme payı 0,0612. Duyarlılığın bu kadar düşük olması maskelemenin kötü bir savunma olduğu anlamına gelmez: maskeleme 93 zararlının 70’ini yakalamayı hiç denemez, çünkü işi engellemek değil alanı çıkarmaktır. Bir savunmanın yanlış ölçüye sokulması, onu ölçmemekten daha yanıltıcıdır.

Katmanın Kattığı ve Kalıntı

Üçüncü blok sızdırma yüzeyini kurar ve üç katmanı sırayla uygular: önce süzgeç durdurur, kalanlarda maskeleme alanı çıkarır, geriye kalan kalıntıdır. Kurulum iki kez koşar — biri tam kural süzgeciyle, öbürü gizli alan kuralı listeden çıkarılmış dar süzgeçle.

DAR = ("yonerge_kipi", "yan_etkili_arac_adi", "kaynak_damgasi_uyusmuyor")
YUZEY = [k for k in KAYIT
         if k["ozellik"]["gizli_alan_adi"] or k["sinif"] == "gizli_alan_istegi"]
ZARARLI = [k for k in YUZEY if zararli(k)]
print("sizdirma yuzeyi:", len(YUZEY), " bunlarin zararlisi:", len(ZARARLI))
print(f"\n{'kurulum':<30} {'durduran':>8} {'maskeleyen':>11} {'kalinti':>8}"
      f" {'toplam duyarlilik':>18}")
for ad, kural in (("tam kural suzgeci", None), ("gizli alan kurali cikarilmis", DAR)):
    karar = kural_suzgeci if kural is None else (lambda k, kr=kural: kural_suzgeci(k, kr))
    s = [k for k in ZARARLI if karar(k)]
    ek = [k for k in ZARARLI if not karar(k) and maskele(k)["maskelendi"]]
    print(f"{ad:<30} {len(s):>8} {len(ek):>11}"
          f" {len(ZARARLI) - len(s) - len(ek):>8} {olc(KAYIT, karar)['duyarlilik']:>18.4f}")

kalinti = [k for k in ZARARLI if not kural_suzgeci(k) and not maskele(k)["maskelendi"]]
for k in kalinti:
    print("\nkalinti kaydi  no", k["no"], " sinif", k["sinif"], " kaynak", k["kaynak"])
    print("  isaretli ozellik:", [o for o in OZELLIK if k["ozellik"][o]] or "yok")
    print("  puani", round(puan(k), 4), " en dusuk esikte (0.30) isaretlendi mi:",
          model_suzgeci(k, 0.30))
    print("  metni:", k["metin"])


def kume(tohum):
    """Ayni tanim, baska tohum: kalintinin bandi icin ikinci kosum."""
    ks = []
    for i in range(240):
        r = uretec(tohum + 6151 * i)
        s = SINIF[ayrik(r(), [0.62, 0.10, 0.07, 0.07, 0.07, 0.07])]
        kaynak = KAYNAK[ayrik(r(), KAYNAK_PAYI[s])]
        oz = {o: (r() < p) for o, p in zip(OZELLIK, PROFIL[s])}
        ks.append({"no": i + 1, "sinif": s, "kaynak": kaynak, "ozellik": oz,
                   "metin": METIN[int(r() * len(METIN))], "uzunluk": 40 + int(r() * 260)})
    return ks


print(f"\n{'kosum':<8} {'bayrakli':>8} {'yuzey':>6} {'zararli':>8} {'dar suzgec':>11}"
      f" {'maskeleme':>10} {'kalinti':>8}")
for ad, ks in (("birinci", KAYIT), ("ikinci", kume(20260219))):
    y = [k for k in ks if k["ozellik"]["gizli_alan_adi"] or k["sinif"] == "gizli_alan_istegi"]
    z = [k for k in y if zararli(k)]
    d = [k for k in z if kural_suzgeci(k, DAR)]
    e = [k for k in z if not kural_suzgeci(k, DAR) and maskele(k)["maskelendi"]]
    print(f"{ad:<8} {sum(1 for k in ks if k['ozellik']['gizli_alan_adi']):>8} {len(y):>6}"
          f" {len(z):>8} {len(d):>11} {len(e):>10} {len(z) - len(d) - len(e):>8}")
sizdirma yuzeyi: 35  bunlarin zararlisi: 26

kurulum                        durduran  maskeleyen  kalinti  toplam duyarlilik
tam kural suzgeci                    25           0        1             0.7957
gizli alan kurali cikarilmis         16           9        1             0.6989

kalinti kaydi  no 16  sinif gizli_alan_istegi  kaynak kullanici
  isaretli ozellik: yok
  puani 0.0088  en dusuk esikte (0.30) isaretlendi mi: False
  metni: mahallede kesinti ne zaman bitecek

kosum    bayrakli  yuzey  zararli  dar suzgec  maskeleme  kalinti
birinci        32     35       26          16          9        1
ikinci         25     26       16          10          6        0

İlk satır kursun ikinci iddiasının bir örneğidir ve adıyla yazılır: tam kural süzgecinin üstüne maskeleme eklemek sıfır katıyor. Süzgeç 26 zararlının 25’ini zaten durduruyor, çünkü gizli_alan_adi onun dört kuralından biri. Maskelemenin dokunacağı hiçbir kayıt kalmıyor, ama maskeleme yine de 9 temiz kayıttan alanı çıkarıyor ve o kayıtlarda yanıt eksik dönüyor. Eklenen katman hiçbir yeni zararlı yakalamadan bir bedel yüklüyor; katmanın değeri kendisinden değil, altındaki katmanın ne bıraktığından gelir.

İkinci satır bunu doğrular. Gizli alan kuralı listeden çıkarıldığında süzgeç 26’nın 16’sını durduruyor, toplam duyarlılık 0,7957’den 0,6989’a iniyor ve maskelemenin dokunacağı 9 kayıt doğuyor. Aynı savunma, aynı kümede, altındaki katmana göre 0 ya da 9 kayıt koruyor. Bir katmanın sayısı tek başına anlamsızdır; ancak yığının geri kalanıyla birlikte okunur.

Üçüncü sayı her iki kurulumda da aynıdır: kalıntı 1. Kayıt 16 gizli_alan_istegi sınıfındandır, kullanıcıdan gelir ve hiçbir bayrak taşımaz. Puanı 0,0088, yani en düşük eşikte bile işaretlenmiyor; kural süzgeci bakacağı bayrağı bulamıyor, maskeleme çıkaracağı alanı. Metni de yardımcı olmuyor — sıradan bir kesinti sorusu. Profili temiz kayıtlardan ayırt edilemeyen bir zararlı kayıt, hiçbir katmanın yakalayamayacağı kalıntıdır.

Son tablo kalıntının büyüklüğünün ölçülemediğini yazar. Bir kayıt, duyarlılık ekseninde tam olarak bir adımdır (0,0108) ve kümenin çözünürlüğünün üstünde değil tam üstündedir. İkinci tohumla üretilmiş kümede aynı kurulum kalıntıyı 0 buluyor. İki koşumun söylediği şey şudur: kalıntı sıfır değildir ama kaç olduğu bu kümeyle söylenemez. Sıfır olmadığını bilmek yeterlidir, çünkü bir sistemin güvenli sayılması kalıntının sıfır olmasına değil, ne olduğunun yazılmasına bağlıdır.

Özet

  • Sızdırmanın kaybı geri alınamaz: engellenen bir işlem yeniden denenebilir, ifşa olan bir alan geri toplanamaz; bu yüzden ölçü durdurma değil sayımdır.
  • 32 kayıt gizli alan adı taşıyor ve 9’u temiz; bayrak bir suçlama değil sayımdır ve on dört ayrı kayıtla gizli_alan_istegi sınıfının dışına, dört zararlı sınıfa yayılır.
  • Alan sınıfları arasında sayı ile zarar orantılı değildir: en küçük öbek olan erişim dizgesi (8 istek, 7’si zararlı) en kalıcı sonucu taşır.
  • Maskeleme bir karar gibi ölçüldüğünde duyarlılığı 0,2473’tür, ama bu onun kötülüğü değil yanlış ölçüye sokulmasıdır; işi engellemek değil alanı çıkarmaktır.
  • Tam kural süzgecinin üstünde maskelemenin kattığı 0’dır ve bedeli 9 temiz kayıttan silinen alandır; gizli alan kuralı çıkarıldığında aynı katman 9 kayıt korur.
  • Kalıntı 1 kayıttır: hiçbir bayrak taşımayan, puanı 0,0088 olan ve profili temiz kayıtlardan ayırt edilemeyen bir kayıt; ikinci koşumda 0 çıkar, yani büyüklüğü bu kümeyle ölçülemez.

Sonraki Adım

Üç derste yüzey tek bir yerden okundu: modele giren metin. Enjeksiyonun iki biçimi kaynakla ayrıldı, süzgecin eşiği süpürüldü, gizli alan isteyen kayıtlar sayıldı ve hiçbirinin yakalamadığı kalıntı yazıldı. Bütün bu ölçüler modelin okuduğu şeyle ilgiliydi. Oysa bir sistemin elinde okumaktan fazlası vardır — çağırabildiği araçlar, onların yan etkileri ve arkasındaki yetki — ve modelin eğitildiği veri hiç sorulmadı. Böyle bir kaydın zararı bir bilgiyi taşımasından değil, bir eylemi tetiklemesinden doğar, ve savunma da başkalaşır: süzmek yerine sormak. Sonraki ders yan etkili araç adı taşıyan kayıtları sayar ve insan onayı kapısının kesinliğini ölçer.

İ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