İçeriğe geç
academia.sh

Ders 06 / 20

Hizmet Engelleme Saldırıları

Hizmet engellemenin kapasite aritmetiğiyle ölçülmesi: aynı 4.000 istek/sn'lik yükün dört farklı kaynak dağılımında aynı sonucu vermesi, 4.096 yuvalık durum tablosunun 1,02 saniyede dolması, kaynak başına hız sınırının tek kaynakta yükü 5'e indirip 4.000 kaynakta hiçbir şey değiştirmemesi, el sıkışma kanıtının yuva tükenmesini bitirip istek hızını hiç düşürmemesi ve yük boşaltmanın meşru trafiği %22'ye indirmesi.

İçindekiler

Şimdiye kadarki dört ders bir iddianın yanlış kabul edilmesini ölçtü: bozulan kayıt, yanlış adres, yanlış kaynak. Bütün bu ölçümlerde hedef servis ayaktaydı ve isteklere yanıt veriyordu. Oysa bir iddianın doğrulanmaması yalnız yanlış yanıt üretmez.

Bir bağlantı açma isteği kaynağını kanıtlamaz. Hedef, isteği tutmak için ayırdığı yeri kime ayırdığını bilmez ve isteğin karşılığı hiç gelmeyebilir. Yer sınırlıdır; bittiğinde meşru istek de dışarıda kalır. Bir hizmetin isteklere yanıt veremez hâle getirilmesine hizmet engelleme (denial of service), aynı yükün çok sayıda kaynağa dağıtılmasına dağıtık hizmet engelleme (distributed denial of service) denir. Birinci derste ağ katmanında sayılan üç doğrulanamayan iddia — kaynak adresi, parçalanmış bir bütünün parçası olma, denetim iletisinin ağdan geldiği — bu dersin girdisidir. Bu ders bunları kapasite aritmetiğine çevirir.

İki Ayrı Kaynak Tükenir

PG16: bir bağlantı açma isteği kaynağını kanıtlamaz; hedef, isteği tutmak için ayırdığı yeri kime ayırdığını bilmez. PG17: hizmet engelleme iki ayrı kaynağı tüketir — saniyedeki istek kapasitesi ve durum tablosundaki yuva — ve ikisi ayrı sayılır. PG18: bir savunma kaynağı değil, yalnız isteğin biçimini ve hızını görür; aynı ölçüt meşru isteğe de uygulanır.

PG17 bu dersin ölçüyü tek bir sayıdan kurtaran maddesidir. “Servis çöktü” bir karar taşımaz; karar taşıyan iki ayrı hesap vardır. Birincisi hız hesabıdır: gelen istek hızı kapasiteyi kaç kat aşıyor. İkincisi yuva hesabıdır: tamamlanmayan her istek bir yuvayı belirli bir süre tuttuğuna göre, tablo kaç saniyede doluyor. İki hesap ayrı savunmalara yanıt verir ve bir savunmanın birini düşürüp ötekini hiç değiştirmemesi olağandır.

Aşağıdaki hesap bir modeldir: kurgu ölçüm ağındaki bir alım ucunun kapasitesi, yuva sayısı ve meşru akışı veri olarak yazılır; gerçek bir hizmet ya da gerçek bir adres yoktur. Kod hiçbir istek üretmez, yalnız savunma tarafının aritmetiğini koşturur. Bir hizmete kendi yönetimin dışında yük bindirmek — ölçüm amaçlı olsa bile — yazılı yetki ve tanımlı kapsam olmadan hem yasadışı hem meslek dışıdır.

// aglar/kapasite.mjs — kurgu bolgesel olcum agindaki bir alim ucunun kapasite modeli:
// gercek bir hizmet, gercek bir adres ya da gercek bir olcum yok. Rastgelelik yok.
// Kod yalnizca savunma tarafinin aritmetigini kosturur; hicbir istek uretilmez.

// PG16: bir baglanti acma istegi kaynagini kanitlamaz; hedef, istegi tutmak icin ayirdigi
// yeri kime ayirdigini bilmez.
// PG17: hizmet engelleme iki ayri kaynagi tuketir: saniyedeki istek kapasitesi ve durum
// tablosundaki yuva. Ikisi ayri sayilir.
export const KAPASITE = 900;   // istek/sn
export const YUVA = 4096;      // durum tablosundaki yuva sayisi
export const TUTMA = 30;       // tamamlanmayan bir istegin yuvayi tuttugu sure (sn)
export const MESRU = { kaynak: 60, hiz: 2 };   // 60 kaynak, kaynak basina 2 istek/sn

// PG18: bir savunma kaynagi degil, yalnizca istegin bicimini ve hizini gorur; ayni olcut
// mesru istege de uygulanir.
export const PROFIL = [
  { ad: "tek kaynak", kaynak: 1, hiz: 4000 },
  { ad: "yirmi kaynak", kaynak: 20, hiz: 200 },
  { ad: "bes yuz kaynak", kaynak: 500, hiz: 8 },
  { ad: "dort bin kaynak", kaynak: 4000, hiz: 1 },
];

export const HIZ_SINIRI = 5;   // kaynak basina izin verilen istek/sn
export const SUZME_YUK = 0.90; // kaba oruntuyle elenen yuk orani
export const SUZME_MESRU = 0.15; // ayni oruntuye takilan mesru istek orani

// Bir profili ve mesru akisi verilen savunmalarla suzer; sonuc istek/sn cinsindendir.
export function olc(p, savunma = []) {
  let yuk = p.kaynak * p.hiz, mesru = MESRU.kaynak * MESRU.hiz;
  if (savunma.includes("hiz")) {
    yuk = p.kaynak * Math.min(p.hiz, HIZ_SINIRI);
    mesru = MESRU.kaynak * Math.min(MESRU.hiz, HIZ_SINIRI);
  }
  if (savunma.includes("suzme")) {
    yuk *= 1 - SUZME_YUK;
    mesru *= 1 - SUZME_MESRU;
  }
  // Tamamlanmayan istek yuva tutar; el sikisma kaniti acikken yuva ayrilmaz.
  const yarimAcik = savunma.includes("kanit") ? 0 : yuk;
  if (savunma.includes("bosaltma") && yuk + mesru > KAPASITE) {
    const oran = KAPASITE / (yuk + mesru);
    yuk *= oran; mesru *= oran;
  }
  const doluluk = Math.min(YUVA, yarimAcik * TUTMA);
  return {
    yuk, mesru, toplam: yuk + mesru,
    kat: (yuk + mesru) / KAPASITE,
    doluluk: (doluluk / YUVA) * 100,
    dolmaSn: yarimAcik * TUTMA > YUVA ? YUVA / yarimAcik : null,
    mesruPay: (mesru / (MESRU.kaynak * MESRU.hiz)) * 100,
  };
}
// aglar/kapasite-denetimi.mjs — kac kaynaktan gelen istek esigi asiyor, durum tablosu kac
// saniyede doluyor, hangi savunma hangi orani dusuruyor ve mesru trafigin kaci dusuyor.
import { KAPASITE, YUVA, TUTMA, MESRU, PROFIL, HIZ_SINIRI, SUZME_YUK, SUZME_MESRU, olc }
  from "./kapasite.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 sn = (x) => (x === null ? "dolmaz" : x.toFixed(2));
const n = (x) => Math.round(x);

console.log(`kapasite ${KAPASITE} istek/sn, yuva ${YUVA}, tutma ${TUTMA} sn, ` +
  `mesru akis ${MESRU.kaynak} kaynak x ${MESRU.hiz} = ${MESRU.kaynak * MESRU.hiz} istek/sn; ` +
  `esik ${n(KAPASITE - MESRU.kaynak * MESRU.hiz)} istek/sn`);
console.log(`yuva esigi ${(YUVA / TUTMA).toFixed(1)} istek/sn: tamamlanmayan istek bu hizi ` +
  `asarsa tablo dolar; kapasiteye orani %${((YUVA / TUTMA / KAPASITE) * 100).toFixed(1)}. ` +
  `Hiz esigini ${HIZ_SINIRI} istek/sn tavani altinda asmak icin ` +
  `${Math.ceil((KAPASITE - MESRU.kaynak * MESRU.hiz) / HIZ_SINIRI)} kaynak yeter.`);

const A = [-18, 9, 8, 9, 9, 9, 10];
console.log("\n1. ayni toplam hiz, dort farkli kaynak dagilimi (savunma yok)");
yaz(A, "profil", "kaynak", "hiz/knk", "toplam", "kapasite", "yuva %", "dolma sn");
for (const p of PROFIL) {
  const r = olc(p);
  yaz(A, p.ad, p.kaynak, p.hiz, n(r.toplam), r.kat.toFixed(2) + "x",
    r.doluluk.toFixed(0), sn(r.dolmaSn));
}

const B = [-18, 10, 10, 10, 14];
console.log(`\n2. kaynak basina hiz siniri ${HIZ_SINIRI} istek/sn`);
yaz(B, "profil", "gecen yuk", "kapasite", "dolma sn", "mesru gecen");
for (const p of PROFIL) {
  const r = olc(p, ["hiz"]);
  yaz(B, p.ad, n(r.yuk), r.kat.toFixed(2) + "x", sn(r.dolmaSn),
    r.mesruPay.toFixed(0) + "%");
}

const C = [-26, 10, 10, 8, 10, 14];
console.log("\n3. en dagitik profilde savunmalar (4000 kaynak x 1 istek/sn)");
yaz(C, "savunma", "gecen yuk", "kapasite", "yuva %", "dolma sn", "mesru gecen");
const zor = PROFIL[3];
for (const s of [[], ["hiz"], ["kanit"], ["suzme"], ["bosaltma"],
  ["kanit", "suzme"], ["kanit", "suzme", "bosaltma"]]) {
  const r = olc(zor, s);
  yaz(C, s.join(" + ") || "hicbiri", n(r.yuk), r.kat.toFixed(2) + "x",
    r.doluluk.toFixed(0), sn(r.dolmaSn), r.mesruPay.toFixed(0) + "%");
}

const D = [-26, -40, 12];
console.log("\n4. savunmalarin mesru trafige bedeli");
yaz(D, "savunma", "bedel", "mesru gecen");
const bedel = [
  [["hiz"], `kaynak basina ${HIZ_SINIRI} istek/sn tavani`],
  [["kanit"], "her baglanti icin 1 ek tur"],
  [["suzme"], `oruntuye takilan mesru istegin %${SUZME_MESRU * 100}'i`],
  [["bosaltma"], "kapasite ustu istek oransal reddedilir"],
];
for (const [s, ad] of bedel)
  yaz(D, s.join(" + "), ad, olc(zor, s).mesruPay.toFixed(0) + "%");
console.log(`suzme oruntusu yukun %${SUZME_YUK * 100}'ini eler; ayni oruntu mesru ` +
  `istegin %${SUZME_MESRU * 100}'ini de eler`);
kapasite 900 istek/sn, yuva 4096, tutma 30 sn, mesru akis 60 kaynak x 2 = 120 istek/sn; esik 780 istek/sn
yuva esigi 136.5 istek/sn: tamamlanmayan istek bu hizi asarsa tablo dolar; kapasiteye orani %15.2. Hiz esigini 5 istek/sn tavani altinda asmak icin 156 kaynak yeter.

1. ayni toplam hiz, dort farkli kaynak dagilimi (savunma yok)
profil               kaynak hiz/knk   toplam kapasite   yuva %  dolma sn
tek kaynak                1    4000     4120    4.58x      100      1.02
yirmi kaynak             20     200     4120    4.58x      100      1.02
bes yuz kaynak          500       8     4120    4.58x      100      1.02
dort bin kaynak        4000       1     4120    4.58x      100      1.02

2. kaynak basina hiz siniri 5 istek/sn
profil             gecen yuk  kapasite  dolma sn   mesru gecen
tek kaynak                 5     0.14x    dolmaz          100%
yirmi kaynak             100     0.24x    dolmaz          100%
bes yuz kaynak          2500     2.91x      1.64          100%
dort bin kaynak         4000     4.58x      1.02          100%

3. en dagitik profilde savunmalar (4000 kaynak x 1 istek/sn)
savunma                    gecen yuk  kapasite  yuva %  dolma sn   mesru gecen
hicbiri                         4000     4.58x     100      1.02          100%
hiz                             4000     4.58x     100      1.02          100%
kanit                           4000     4.58x       0    dolmaz          100%
suzme                            400     0.56x     100     10.24           85%
bosaltma                         874     1.00x     100      1.02           22%
kanit + suzme                    400     0.56x       0    dolmaz           85%
kanit + suzme + bosaltma         400     0.56x       0    dolmaz           85%

4. savunmalarin mesru trafige bedeli
savunma                   bedel                                    mesru gecen
hiz                       kaynak basina 5 istek/sn tavani                 100%
kanit                     her baglanti icin 1 ek tur                      100%
suzme                     oruntuye takilan mesru istegin %15'i             85%
bosaltma                  kapasite ustu istek oransal reddedilir           22%
suzme oruntusu yukun %90'ini eler; ayni oruntu mesru istegin %15'ini de eler

Sayılar ölçüm sınıfındadır; girdileri PG16–PG18’dir.

Dört Dağılım, Aynı Sonuç

Birinci tablo dört profili yan yana koyar ve dördü de aynı toplam hızı üretir: 4.000 istek/sn. Bir kaynaktan 4.000, yirmi kaynaktan 200’er, beş yüz kaynaktan 8’er, dört bin kaynaktan 1’er. Savunma yokken dört satır da aynıdır: 4.120 istek/sn, kapasitenin 4,58 katı, yuvaların %100’ü dolu, dolma süresi 1,02 saniye.

Bu eşitlik dersin çıkış noktasıdır. Hedefin gördüğü şey kaynak sayısı değil, saniyedeki istek sayısıdır; kaynak dağılımı hedefin hesabına hiç girmez. Yuva hesabı da aynı yerden çıkar: 4.000 tamamlanmayan istek saniyede geliyor ve her biri yuvayı otuz saniye tutuyorsa, 4.096 yuvalık tablo 1,02 saniyede dolar. Bir kaynaktan gelen dört bin istek ile dört bin kaynaktan gelen birer istek arasında hedef için hiçbir fark yoktur.

Başlık satırındaki iki eşik, dört profilin neden aynı sonucu verdiğini de açıklar. Hız eşiği 780 istek/sn’dir: kapasiteden meşru akışın payı düşüldüğünde kalan. Yuva eşiği ise yalnız 136,5 istek/sn‘dir — kapasitenin **%15,2’si**. Tamamlanmayan istek hızı bu sayıyı aştığı anda tablo dolar, hız hesabı hâlâ rahatken. İki eşiğin arasındaki altı buçuk kat fark, iki hesabın neden ayrı sayıldığının niceliksel karşılığıdır: bir hizmet, kapasitesinin altıda birinde durum tablosunu kaybedebilir ve yük ölçüsüne bakan bir gözlem bunu göremez.

İkinci eşik hesabı savunma tarafının hazırlığını da doğrudan verir. Kaynak başına 5 istek/sn tavanı konmuş bir hizmette hız eşiğini aşmak için 156 kaynak yeterlidir ve bu kaynakların hiçbiri tavanı aşmaz. Tavanı düşürmek gereken kaynak sayısını artırır, ama aynı hareketle meşru uçların da tavanını düşürür.

Fark savunma açıldığında ortaya çıkar. İkinci tablo kaynak başına 5 istek/sn tavanı koyar ve dört satır birbirinden tümüyle ayrılır. Tek kaynak profilinde geçen yük 4.000’den 5’e iner — %99,9 düşüş. Yirmi kaynakta 100’e iner. Beş yüz kaynakta 2.500’de kalır ve tablo 1,64 saniyede dolar. Dört bin kaynakta hiçbir şey değişmez: her kaynak zaten tavanın altındadır.

Kaynak başına hız sınırının etkisi, kaynak başına düşen hızın tavana oranıdır; kaynak sayısı tavana ulaştığında sınır tümüyle etkisiz hâle gelir. Aynı savunmanın aynı toplam yüke karşı etkisi %99,9 ile %0 arasında değişir ve bunu belirleyen tek şey saldıran tarafın kaynak sayısıdır.

Hızı Düşüren ve Yuvayı Kurtaran

Üçüncü tablo en dağıtık profilde dört savunmayı ayrı ayrı koşturur ve PG17’nin iki hesabını birbirinden ayırır.

El sıkışma kanıtı — yer ayırmadan önce karşı tarafın erişilebilir olduğunu göstermesini istemek — yuva doluluğunu %100’den %0’a indirir ve tablo hiç dolmaz. Geçen yük ise 4.000’de kalır ve kapasitenin 4,58 katı olmayı sürdürür. Bu savunma yuva hesabını tümüyle çözer ve hız hesabına hiç dokunmaz. Meşru trafiğin %100’ü geçer; bedeli her bağlantı için bir ek turdur.

Yukarı akış süzmesi tersini yapar. Kaba bir örüntüyle yükün %90’ını eler: geçen yük 4.000’den 400’e, kapasite oranı 4,58 katından 0,56 katına iner. Yuva hesabı ise çözülmez; tablo yine dolar, yalnız 1,02 saniye yerine 10,24 saniyede. Bedeli aynı örüntüye takılan meşru isteklerdir: meşru trafiğin %15’i de elenir.

İki savunma birlikte açıldığında her iki hesap da çözülür: geçen yük 0,56 kat, yuva doluluğu %0, meşru geçen %85. Bu, tablodaki en iyi satırdır ve iki savunmanın farklı kaynakları koruduğu için toplandığını gösterir. Üçüncü dersteki aynı kaydı koruyan iki savunma toplanmıyordu; burada biri yuvayı, öteki hızı düşürdüğü için toplanır.

Yük Boşaltmanın Oranı

Dördüncü satır yük boşaltmayı ölçer: kapasitenin üstündeki isteği hiç kabul etmemek. Geçen toplam tam olarak kapasiteye oturur — 1,00 kat — ve bu, tablodaki tek “hedef ayakta” satırıdır. Bedeli son sütundadır: meşru trafiğin yalnız %22’si geçer.

Nedeni oranlamadır. Yük boşaltma isteğin kaynağını ayıramaz, yalnız toplamı keser; kapasite 4.120 isteklik bir akışa oranlandığında her kaynağa aynı pay düşer. Meşru akış toplamın %2,9’unu oluşturduğu için kapasitenin de %2,9’unu alır. Ayrım yapmadan kesen bir savunma, meşru trafiği onun toplam içindeki payı oranında korur; payı küçükse koruma da küçüktür.

Son satır bunu tamamlar: el sıkışma kanıtı ve süzme birlikte açıkken yük boşaltma hiçbir şey değiştirmez, çünkü geçen toplam zaten kapasitenin altındadır. Yük boşaltma son çare olarak kalır ve ancak öteki iki savunma yetmediğinde devreye girer. Bu tabloda savunmanın yetmediği yer açıktır: dört savunmanın hiçbiri doğrulanmayan iddiayı doğrulanabilir kılmaz. Kaynak adresinin iddiası hâlâ kanıtsızdır; ölçülen tek şey o kanıtsız iddianın kaç isteği ve kaç yuvayı tüketmeye yettiğidir.

Özet

  • Hizmet engelleme iki ayrı kaynağı tüketir: 900 istek/sn’lik kapasite ve 4.096 yuvalık durum tablosu; 4.000 istek/sn’lik yük kapasiteyi 4,58 kat aşar ve tabloyu 1,02 saniyede doldurur.
  • Aynı toplam hız dört farklı kaynak dağılımında savunmasız hedefe aynı sonucu verir; kaynak sayısı hedefin hesabına girmez.
  • Kaynak başına 5 istek/sn tavanı tek kaynakta yükü 4.000’den 5’e indirir, dört bin kaynakta hiçbir şey değiştirmez; etkisi kaynak başına hızın tavana oranıdır.
  • El sıkışma kanıtı yuva doluluğunu %100’den %0’a indirir ve istek hızını hiç düşürmez; yukarı akış süzmesi hızı 0,56 kata indirir, yuvayı kurtarmaz ve meşru trafiğin %15’ini eler. İkisi birlikte her iki hesabı da çözer ve meşru trafiğin %85’ini geçirir.
  • Yük boşaltma toplamı kapasiteye oturtur ama ayrım yapmadığı için meşru trafiği payı oranında korur: %22. Dört savunmanın hiçbiri kaynak adresi iddiasını doğrulanabilir kılmaz.

Sonraki Adım

Bu ders bir iddianın kanıtsız olmasının niceliğini ölçtü: kaç istek, kaç yuva, kaç saniye. Yük düştüğünde ya da savunma yeterli olduğunda hizmet ayakta kalır ve ölçüm biter. Oysa aynı kanıtsız iddia, hiçbir kapasite tüketmeden ve hiçbir sayacı sapıtmadan da kullanılabilir. Bir bağlantının iki ucu birbirini kanıtla tanımıyorsa, aralarındaki her adım kendini karşı taraf olarak sunabilir ve bağlantı olağan hızında, olağan hacminde sürer. Sonraki ders bunu bir kanıt zinciri eksikliği olarak ölçer: bir yolun kaç adımı var, kaç adımda kanıt zinciri kopuyor, uç doğrulama kaçını bağlıyor ve zinciri kuranın kendisi doğrulanmadığında kaç adım açık kalıyor.

İ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