Ders 04 / 20
Ad Çözümleme Saldırıları
Ad çözümleme önbelleğinin doğrulanmayan yanıtla bozulmasının ölçülmesi: 16 adın 7'sinin bozulup 73 bağımlı servisin 38'ini yönlendirmesi, imzalı doğrulamanın 3 kaydı kurtarıp imzasız bölgede 4'ünü bırakması, süresi dolmuş imzanın 2 adı hiç çözümlenemez kılıp 9 servisi durdurması, katı kipin bozuk kaydı sıfırlarken 47 servisi durdurması ve yaşam süresi tavanının bozuk kalma süresini %88,1 düşürüp sorgu sayısını %346,5 artırması.
İçindekiler
Önceki ders bir bölütün içinde kaldı: sorulan soru bir ağ adresinin hangi donanım adresine ait olduğuydu ve yanıt aynı bölütten geldi. Bölütün dışına çıkan her istek ise daha önce bir başka soru sorar — bir adın hangi adrese karşılık geldiği. Bu sorunun yanıtı da bir önbelleğe yazılır.
İki önbellek arasında bir ölçek farkı vardır. Bir adres çözümleme kaydı tek bir bölütte tek bir hedefi yönlendirir; bir ad çözümleme kaydı ise o adı kullanan bütün servisleri birden yönlendirir ve önbellek ağın her katmanında bulunur. Bir ad kaydının doğrulanmayan bir yanıtla değiştirilmesine ad çözümleme zehirlenmesi (DNS poisoning), bölge kayıtlarının imzalanıp alıcı tarafından sınanmasına imzalı ad çözümleme (DNSSEC) denir. Bu ders o farkı sayar: doğrulanmayan bir yanıt kaç kaydı ve kaç bağımlı servisi bozuyor, imzalı doğrulama kaçını kurtarıyor, imzalanmamış bölge kaç kalem bırakıyor.
İmza Neyi Sınayabilir
PG10: ad çözümleme yanıtı bir iddiadır — “şu ad şu adrese karşılık gelir”; imzasız bir bölgede bu iddianın önbellekte sınanabilecek hiçbir kanıtı yoktur. PG11: bir ad kaydının bozulması o ada bağlı bütün servisleri birden yönlendirir; etkinin ölçüsü kayıt sayısı değil, bağımlı servis sayısıdır. PG12: imza yalnız imzalanmış bölgenin yanıtlarını sınayabilir; imzasız bölgenin yanıtı ne doğrulanabilir ne de yanlışlanabilir.
PG12 bu dersin belirleyici maddesidir. İmzalı ad çözümleme bir yanıtı “doğru” ya da “yanlış” diye ikiye ayırmaz; “doğrulandı”, “doğrulanamadı” ve “sınanamadı” diye üçe ayırır. Üçüncü küme, imzasız bölgelerden gelen her yanıttır ve bu yanıtlar için önbellek ilk derste sayılan durumda kalır: kanıt yoktur. Kayıt türleri, çözümleme zincirindeki roller ve yaşam süresine dayalı önbellekleme Bilgisayar Ağları müfredatında ölçüldü; burada tekrarlanmaz.
Aşağıdaki ad kümesi bir modeldir: adlar ve bölgeler kurgudur, adresler özel ve belgeleme için ayrılmış bloklardandır. Kümede hiçbir sahte yanıt üretim adımı yoktur; koşan kod önbelleğin kabul kuralı ile denetimidir. Böyle bir yanıt kümesinin sahibi olmadığın bir çözümleyiciye gönderilmesi yazılı yetki ve tanımlı kapsam olmadan hem yasadışı hem meslek dışıdır.
// aglar/ad-cozumleme.mjs — kurgu bolgesel olcum aginin ad cozumleme onbellegi (model): // adlar ve bolgeler kurgudur, gercek bir alan adi yoktur; adresler ozel ve belgeleme icin // ayrilmis bloklardandir. Rastgelelik yok. // PG10: ad cozumleme yaniti bir iddiadir: "su ad su adrese karsilik gelir". Imzasiz bir // bolgede bu iddianin onbellekte sinanabilecek hicbir kaniti yoktur. // PG11: bir ad kaydinin bozulmasi, o ada bagli butun servisleri birden yonlendirir; // etkinin olcusu kayit sayisi degil, bagimli servis sayisidir. // Sutunlar: ad, bolge, yasam suresi (saniye), o ada bagli servis sayisi. export const AD = ` toplayici.olcum olcum 3600 6 dogrulayici.olcum olcum 3600 5 depo.olcum olcum 1800 4 alim.olcum olcum 300 9 aktarim.olcum olcum 3600 2 faturalama.kurumsal kurumsal 3600 7 isemri.kurumsal kurumsal 3600 3 rapor.kurumsal kurumsal 7200 1 dizin.kurumsal kurumsal 1800 8 kimlik.kurumsal kurumsal 900 11 sube01.saha saha 600 2 sube02.saha saha 600 2 gecit.saha saha 1800 4 arayuz.dis dis 3600 3 durum.dis dis 7200 1 guncelleme.dis dis 1800 5` .trim().split(/\s+/).reduce((l, _, i, a) => (i % 4 ? l : [...l, { ad: a[i], bolge: a[i + 1], ttl: +a[i + 2], bagimli: +a[i + 3] }]), []); // PG12: imza yalnizca imzalanmis bolgenin yanitlarini sinayabilir; imzasiz bolgenin yaniti // ne dogrulanabilir ne de yanlislanabilir. export const IMZALI = ["olcum", "dis"]; // Onbellege ulasan yanitlar. imza: gecerli | gecersiz | dolmus | yok (imzasiz bolge). // dog sutunu yalnizca puanlama icindir; hicbir savunma onu gormez. export const YANIT = ` toplayici.olcum 10.30.0.5 gecerli e alim.olcum 10.30.0.8 gecerli e depo.olcum 10.30.0.10 dolmus e aktarim.olcum 10.30.0.11 gecerli e dogrulayici.olcum 10.30.0.6 dolmus e rapor.kurumsal 10.30.1.9 yok e faturalama.kurumsal 10.30.1.7 yok e dizin.kurumsal 10.30.1.12 yok e isemri.kurumsal 10.30.1.8 yok e kimlik.kurumsal 10.30.1.13 yok e sube01.saha 10.30.2.21 yok e sube02.saha 10.30.2.22 yok e gecit.saha 10.30.2.1 yok e arayuz.dis 198.51.100.4 gecerli e durum.dis 198.51.100.5 gecerli e guncelleme.dis 198.51.100.6 gecerli e toplayici.olcum 10.30.9.90 gecersiz h dogrulayici.olcum 10.30.9.90 gecersiz h arayuz.dis 10.30.9.90 gecersiz h faturalama.kurumsal 10.30.9.90 yok h kimlik.kurumsal 10.30.9.90 yok h sube01.saha 10.30.9.90 yok h gecit.saha 10.30.9.90 yok h` .trim().split(/\s+/).reduce((l, _, i, a) => (i % 4 ? l : [...l, { ad: a[i], adres: a[i + 1], imza: a[i + 2], dog: a[i + 3] === "e" }]), []); // kip: "yok" = imza sinanmaz; "imzali" = gecersiz ve dolmus imza reddedilir; // "kati" = imzasiz bolgenin yaniti da reddedilir. export function cozumle(kip = "yok") { const tablo = new Map(), red = []; for (const y of YANIT) { const bozuk = y.imza === "gecersiz" || y.imza === "dolmus"; if (kip !== "yok" && bozuk) { red.push(y); continue; } if (kip === "kati" && y.imza === "yok") { red.push(y); continue; } tablo.set(y.ad, y.adres); } const kayit = AD.map((a) => ({ ...a, adres: tablo.get(a.ad) })); return { kayit, bozuk: kayit.filter((a) => a.adres && !YANIT.some((y) => y.ad === a.ad && y.adres === a.adres && y.dog)), yok: kayit.filter((a) => !a.adres), redMesru: red.filter((y) => y.dog), }; }
// aglar/ad-denetimi.mjs — dogrulanmayan ad yaniti kac kaydi ve kac bagimli servisi bozuyor, // imzali dogrulama kacini kurtariyor, imzasiz bolge kac kalem birakiyor, bedeli ne. import { AD, YANIT, IMZALI, cozumle } from "./ad-cozumleme.mjs"; const yaz = (g, ...s) => console.log(s.map((v, i) => (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("")); const taban = cozumle(), TAVAN = 300; const bagimli = (l) => l.reduce((s, a) => s + a.bagimli, 0); const sorgu = (t) => AD.reduce((s, a) => s + Math.floor(86400 / Math.min(a.ttl, t)), 0); const ANAHTAR = 3; // bolge basina: bolge anahtari, imzalama anahtari, ust bolgeye verilen ozet console.log(`${AD.length} ad, ${YANIT.length} yanit, ${bagimli(AD)} bagimli servis; ` + `imzali bolge ${IMZALI.length}/${new Set(AD.map((a) => a.bolge)).size}, ` + `bozulan kayit ${taban.bozuk.length}, etkilenen bagimli servis ${bagimli(taban.bozuk)}`); const A = [-10, 6, 9, 10, 13, 11]; console.log("\n1. bolge basina"); yaz(A, "bolge", "imza", "ad", "bagimli", "bozuk kayit", "etkilenen"); for (const b of [...new Set(AD.map((a) => a.bolge))]) { const l = AD.filter((a) => a.bolge === b), z = taban.bozuk.filter((a) => a.bolge === b); yaz(A, b, IMZALI.includes(b) ? "var" : "yok", l.length, bagimli(l), z.length, bagimli(z)); } const B = [-22, -10, 9, 10, 18]; console.log("\n2. taban: bozulan kayitlar ve tasidiklari bagimlilik"); yaz(B, "ad", "bolge", "bagimli", "ttl (sn)", "imzayla kurtulur"); for (const a of taban.bozuk) yaz(B, a.ad, a.bolge, a.bagimli, a.ttl, IMZALI.includes(a.bolge) ? "evet" : "hayir"); const C = [-8, 8, 11, 10, 14, 11, 9, 8]; console.log("\n3. kipler: kurtarilan kayit ve bedeli"); yaz(C, "kip", "bozuk", "etkilenen", "kayitsiz", "duran servis", "red mesru", "anahtar", "ek tur"); for (const [k, imzaliBolge] of [["yok", 0], ["imzali", IMZALI.length], ["kati", 4]]) { const r = cozumle(k); const kapsam = AD.filter((a) => k === "kati" || IMZALI.includes(a.bolge)).length; yaz(C, k, r.bozuk.length, bagimli(r.bozuk), r.yok.length, bagimli(r.yok), r.redMesru.length, imzaliBolge * ANAHTAR, k === "yok" ? 0 : kapsam); } const D = [-16, 10, 12, 13, 12]; console.log(`\n4. yasam suresi tavani ${TAVAN} sn olursa`); yaz(D, "olcu", "tavansiz", "tavanli", "fark", "fark %"); const olcum = [ ["gunluk sorgu", sorgu(1e9), sorgu(TAVAN)], ["bozuk kayit sn", taban.bozuk.reduce((s, a) => s + a.ttl, 0), taban.bozuk.reduce((s, a) => s + Math.min(a.ttl, TAVAN), 0)], ["en uzun bozuk sn", Math.max(...taban.bozuk.map((a) => a.ttl)), Math.max(...taban.bozuk.map((a) => Math.min(a.ttl, TAVAN)))], ]; for (const [ad, x, y] of olcum) yaz(D, ad, x, y, y - x, (((y - x) / x) * 100).toFixed(1));
16 ad, 23 yanit, 73 bagimli servis; imzali bolge 2/4, bozulan kayit 7, etkilenen bagimli servis 38 1. bolge basina bolge imza ad bagimli bozuk kayit etkilenen olcum var 5 26 2 11 kurumsal yok 5 30 2 18 saha yok 3 8 2 6 dis var 3 9 1 3 2. taban: bozulan kayitlar ve tasidiklari bagimlilik ad bolge bagimli ttl (sn) imzayla kurtulur toplayici.olcum olcum 6 3600 evet dogrulayici.olcum olcum 5 3600 evet faturalama.kurumsal kurumsal 7 3600 hayir kimlik.kurumsal kurumsal 11 900 hayir sube01.saha saha 2 600 hayir gecit.saha saha 4 1800 hayir arayuz.dis dis 3 3600 evet 3. kipler: kurtarilan kayit ve bedeli kip bozuk etkilenen kayitsiz duran servis red mesru anahtar ek tur yok 7 38 0 0 0 0 0 imzali 4 24 2 9 2 6 8 kati 0 0 10 47 10 12 16 4. yasam suresi tavani 300 sn olursa olcu tavansiz tavanli fark fark % gunluk sorgu 1032 4608 3576 346.5 bozuk kayit sn 17700 2100 -15600 -88.1 en uzun bozuk sn 3600 300 -3300 -91.7
Sayılar ölçüm sınıfındadır; girdileri PG10–PG12’dir.
Yedi Kayıt, Otuz Sekiz Servis
On altı ad on altı kayıt üretir ve savunma yokken bunların yedisi bozuktur. Kayıt oranı %43,8’dir, ama asıl sayı ikinci sütundadır: yedi bozuk kayıt yetmiş üç bağımlı servisin otuz sekizini yönlendirir. Bir kayıt bir hedefi değil, o adı kullanan her servisi taşır.
İkinci tablo bu orantısızlığı adım adım gösterir. Saha bölgesindeki sube01.saha kaydı yalnız
iki servis taşır; kimlik.kurumsal kaydı on bir servis taşır. İkisi de tek bir kayıttır ve
ikisi de aynı kuralla bozulur. Bir ad kümesinde bozulma sırasını belirleyen şey kayıt sayısı
değil, kayıt başına bağımlılıktır.
Birinci tablo bölge düzeyinde okur. İmzalı iki bölgede beş ve üç ad vardır; imzasız iki bölgede beş ve üç. Bozulan yedi kaydın üçü imzalı bölgelerdedir ve on dört bağımlı servis taşır; dördü imzasız bölgelerdedir ve yirmi dört bağımlı servis taşır. Kurumsal bölge tek başına otuz bağımlı servisle en yüklü bölgedir ve imzasızdır.
Bu son cümle imzalama kapsamının bağımlılık ağırlığını izlemediğini gösterir. İmzalı iki bölge
yetmiş üç bağımlı servisin otuz beşini kapsar; imzasız iki bölge otuz sekizini. Kapsam ad
sayısına göre yarı yarıyadır (sekiz ada karşı sekiz), ama taşınan bağımlılığa göre imzalı taraf
azınlıktadır. En çok servis taşıyan tek ad — on bir servisle kimlik.kurumsal — imzasız
bölgededir. İmzalama kararı bölge bölge verilir, oysa etki ad ad dağılır.
İmzanın Kurtardığı ve Bırakan
Üçüncü tablonun ikinci satırı imzalı doğrulamayı açar. Bozuk kayıt yediden dörde, etkilenen bağımlı servis otuz sekizden yirmi dörde iner. Kurtarılan üç kaydın üçü de imzalı bölgelerdedir; imzasız bölgelerdeki dördü olduğu gibi kalır. İmzalı doğrulamanın kapsamı bölge sınırıdır ve o sınırın dışında hiçbir şey değişmez.
Aynı satırın dördüncü ve beşinci sütunları savunmanın kendi bedelini yazar. İki ad hiç çözümlenemez hâle gelir ve dokuz bağımlı servis durur. Nedeni bir saldırı değildir: bu iki adın meşru yanıtlarının imzası süresi dolmuş olarak gelmiştir ve doğrulama onları da reddeder. İki meşru yanıt kesilir. İmzalı doğrulama açıkken bir imzanın süresinin dolması, o adın hiç yanıtı yokmuş gibi davranmasına yol açar; imzasız bir bölgede aynı durum hiç oluşmaz.
Üçüncü satır katı kipi ölçer: imzasız bölgeden gelen yanıtlar da reddedilir. Bozuk kayıt sıfıra iner ve etkilenen bağımlı servis sıfır olur. Bedeli, on adın çözümlenememesi ve kırk yedi bağımlı servisin durmasıdır — yetmiş üçün üçte ikisinden fazlası. On meşru yanıt reddedilir, anahtar kalemi altıdan on ikiye çıkar ve her ad için bir ek tur gerekir.
Katı kip bu kursta savunmanın yetmediği en açık örneklerden biridir. Doğrulanmayan iddiayı sıfırlar, ama bunu iddiayı doğrulayarak değil, doğrulanamayan her şeyi reddederek yapar. Kalan dört bozuk kaydın gerçek çözümü katı kip değil, imzasız iki bölgenin imzalanmasıdır; o da bu tabloda anahtar kalemini on ikiye ve ek turu on altıya çıkaran satırdır.
İmzalı kipin net kazancı, iki bedeli birlikte yazınca daha da daralır. Tabansız durumda otuz sekiz bağımlı servis yanlış yönlendirilir ve hiçbiri durmaz. İmzalı kipte yirmi dördü yanlış yönlendirilir ve dokuzu durur; doğru çalışan servis sayısı otuz beşten kırka çıkar. Yetmiş üç servislik bir kümede net kazanç beş servistir. Aynı savunma imzalı bölgelerin içinde tam etkilidir; toplamı bu kadar küçük yapan şey, imzasız bölgelerin taşıdığı ağırlık ve imzanın kendi arıza kipidir.
Yaşam Süresi Tavanı
Dördüncü tablo imzadan bağımsız bir savunmayı ölçer: kayıtların yaşam süresine bir tavan koymak. Bu, bozulmayı engellemez; bozuk kaydın ne kadar süre bozuk kaldığını sınırlar.
Tavansız durumda yedi bozuk kaydın toplam yaşam süresi 17.700 saniyedir ve en uzunu 3.600 saniyedir. Tavan 300 saniyeye çekildiğinde toplam 2.100 saniyeye, en uzunu 300 saniyeye iner — sırasıyla %88,1 ve %91,7 düşüş. Karşılığında günlük sorgu sayısı 1.032’den 4.608’e çıkar: %346,5 artış.
İki oran birlikte okunduğunda tavanın niteliği görünür. Yaşam süresi tavanı doğrulanan iddia sayısını hiç değiştirmez; bu dersin ilk sütununda tek bir sayı bile oynamaz. Değiştirdiği şey bozuk bir kaydın etkisinin süresidir. Üç sütunlu ölçümde bu, birinci ve ikinci sütunu boş bırakıp yalnız üçüncüyü dolduran bir savunmadır — ve bedeli sorgu hacminin dört buçuk katına çıkmasıdır. Etkiyi kısaltmak, iddiayı doğrulamanın yerine geçmez.
Özet
- Ad çözümleme yanıtı imzasız bir bölgede sınanamaz; 16 adın 7’si bozulur ve bu 7 kayıt 73 bağımlı servisin 38’ini yönlendirir.
- Etkinin ölçüsü kayıt sayısı değil bağımlılıktır: bir kayıt 2 servis taşırken bir başkası 11 servis taşır ve ikisi de aynı kuralla bozulur.
- İmzalı doğrulama bozuk kaydı 7’den 4’e, etkilenen servisi 38’den 24’e indirir; kurtardığı 3 kaydın üçü de imzalı bölgededir ve imzasız bölgede hiçbir şey değişmez.
- İmzanın kendi bedeli vardır: süresi dolmuş imza 2 adı hiç çözümlenemez kılar ve 9 bağımlı servisi durdurur; katı kip bozuk kaydı sıfırlar ama 10 adı çözümlenemez kılıp 47 servisi durdurur, anahtar kalemini 12’ye ve ek turu 16’ya çıkarır.
- Yaşam süresi tavanı doğrulanan iddia sayısını hiç değiştirmez; bozuk kaydın süresini %88,1 kısaltır ve günlük sorgu sayısını %346,5 artırır.
Sonraki Adım
Bu dersin ve bir öncekinin ortak varsayımı, önbelleğe soru soran ucun kime soracağını zaten bildiğiydi. Ad çözümleyicinin adresi, ağ geçidinin adresi ve ucun kendi adresi verilmiş kabul edildi. Oysa bir uç ağa bağlandığında bunların hiçbirini bilmez; sorar ve gelen ilk yanıtı kabul eder. O tek yanıt üç ayrı iddiayı birden taşır: bu senin adresin, geçidin şu, ad çözümleyicin şu. Sonraki ders adres dağıtımını bir veri yapısı olarak kurar ve sayar: bir dağıtım yanıtı kaç iddia taşıyor, ilk yanıtın kazanması kaç ucu hangi yapılandırmaya bağlıyor, bağlantı noktası güveni ve bağlama tablosu kaçını kurtarıyor ve bunun elle yönetim bedeli ne oluyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.