6 Ocak 2021 Çarşamba

DDOS Atak Mitigation Tekniği - SYN Cookie

 Bugün DDOS Atak Mitigation tekniklerinden birisi olan SYN Cookie den bahsedelim. 

Cookie internet dünyasında bir kullanıcıya atanan ve bir sunucuya istek yapan bu kullanıcı için "Evet seni geçmişten tanıyorum" diyen bir header. Peki SYN Cookie nedir ? 

Syn Cookie de aslında benzer işlemi Layer 7'de değil de Layer 4'de gerçekleştiren bir teknik. Niye ve Nasıl ? 

Layer 4 Transport katmanı temelde 2'ye ayrılır. TCP ve UDP olarak. TCP 3-way handshake ile önce bir connection kurar daha sonra ise paket alışverişi başlayabilir, session kurulabilir. 3-Way handshake görselde de görüleceği üzere bir sunucuyu ziyaret edecek ya da bir hedefe istekte bulunacak istemcinin selam vermesi ve selamına yanıt alması durumudur. (Resim-1)


Resim-1
1.SYN - 2.SYN/ACK - 3.ACK 

TCP çalışan her servis kendisine verilen selamı direk olarak yanıtlamaktadır. Kim sunucuya SYN derse sunucu otomatik olarak SYN/ACK demektedir. 3.adımda istemci de ACK gönderirse 2 taraf arasında bağlantı kurulacaktır. Ancak burada şu soruyu sormakta fayda var, bir sunucu ya da bir sistem kaç tane bu şekilde bağlantıyı destekleyebilir ? Tabiki hiçbir sistem ya da sunucu sınırsız değil. Google bile :)

Ancak sorun burada legal kullanıcılar değil. Sistemler, bankalar, alışveriş siteleri kendi altyapılarını müşterilerinin, yeterli bağlantıyı yapabilecekleri şekilde tasarlıyorlar. Burada illegal kullanıcılar, rakipler ya da fidyeciler asıl sorun. Bir alışveriş sitesine mail atıp "bana 3 bitcoin ver yoksa DDOS yaparım" diyen kötü niyetliler ile her zaman karşı karşıyayız. Bu sebepten herkesin SYN isteğine SYN/ACK yollayan bir sistem günün sonunda yeni bir bağlantıya SYN/ACK yollayamıyacak kadar kapasitesini doldurabilir. Yani SYN Flood DDOS Atağa karşı sistemler koruma sağlamıyorsa finalde 404 hatası bile veremeyecek kadar erişilemez olabilir.

Syn Flood DDOS u mitigate etmenin yollarından birisi olan SYN Cookie nasıl çalışır ? 

Bir sunucuya normalin çok üzerinde SYN isteği gelse bile,SYN/ACK yanıtı veriyor ve bir tabloya yazıyor, ancak sonunda tablo doluyor ya da tablo eşik bir limitin üzerine çıkıyor. Limit aşıldıktan sonra gelen her SYN isteğine yanıt vermeliyim ancak bu isteği tabloya yazmamalıyım şeklinde bir yaklaşım benimsenmeli. Sunucunun tabloya yazmadığı SYN isteği için, 3-WAY handshake in son aşaması olan, istemcinin ACK yollamasından sonra bağlantı kurulmalı, ancak ilk gönderilen SYN'i tabloda tutmadıysam ACK yollayan kişiyi nereden tanıyacağım. 

Layer 4 ve üzerinde, TCP çalışan her sistem Sequnence (Sıra) numarası kullanır. Aşağıdaki şekilde de gördüğünüz gibi istemci(Resim-2), her yolladığı paketi bir sıra numarası ile yollar ve bunu düzenli olarak arttırır. Aynı şekilde sunucu da her yolladığı paketi bir sıra numarası ile gönderir ve sıra numarasını sonraki paket için bir arttırır. Bir de Acknowlodgment Number(AckNumber) var. AckNumber tarafların karşıdan beklediği paket numarasını belirtir. AckNumber için şöyle bir örnek verelim. Sunucuya SYN gönderen istemci, sunucudan hemen bir SYN/ACK yanıtı alıyor. Bu istemciye gönderilen SYN/ACK yanıtının Sequence Number'ını sunucu "100" olarak belirlesin. Daha sonra istemci, ACK paketini yolladığı zaman, aynı paketin içeriğinde AckNumber'ı da gönderir. Göndermiş olduğu bu AckNumber daha önce de söylediğimiz gibi karşıdan isteği paketin numarasıdır. Yani Ey Sunucu bana bir önce göndermiş olduğun paketin Sequence Number'ı 100 idi şimdi senden sıradaki paketi yani "101" Sequence Numberlı paketi bekliyorum der. AckNumber=101. 


   Resim-2


Bir istemci sunucuya SYN isteği yolladığ zaman, sunucu SYN/ACK yanıtı gönderiyor ve bu gönderdiği SYN/ACK yanıtına bir Sequence Number veriyor. Sunucu artık SYN/ACK yanıtını gönderdikten sonra tabloya yazmak yerine sanki kendisine hiç SYN gelmemiş gibi davranacak. Ancak kendisine SYN/ACK'ın karşılığı olan bir ACK, istemci tarafından gönderilirse de hemen onu hatırlayacak evet sen bana geçmişte SYN yollamıştın diyecek. SYN Cookie'nin görevi tam olarak bunu sağlamak. Bir istemci SYN isteği yolladığı zaman sunucu, SYN isteği yollayan istemcinin IP Adresi, SYN İsteği yollayan istemicinin Source Port numarası gibi, istemciyi unique olarak tarif edebilecek değerleri bir algoritmaya sokar. Çıkan değeri ise sequence number olarak kullanır. Yani sunucu kendisine SYN isteği gönderen kullanıcıyı Sequence Numberdan tanıyabilecek durumdadır. Bir istemci sunucuya 3-Way Handshake'in son aşaması olan ACK ve AckNumber değeri gönderince sunucu tabloyu kontrol etmeden istemcinin kim olduğunu anlayacaktır. AckNumber'a baktığı zaman hemen şu hesabı yapacak:"Geçmişte ben bu istemciye 1231231 sequnce numarası ile SYN/ACK yollamışım ki şimdi bana ACK paketini 1231232 AckNumber'ı ile gönderiyor." Daha sonra bu 1231231 sayı değerini reverse bir işleme sokarak IP ve Port numarası çıkarımını yapıp, ACK gönderen kullanıcının IP ve Port numarası ile karşılaştırıyor. Her şey eşleştikten sonra bağlantı kurulabilir. 

Sonuç olarak SYN Flood atak bizim tablomuzu dolduramadı ve online satışlar devam etti. Teşekkürler Arbor, A10 vs. :)


Hiç yorum yok:

Yorum Gönder