Bölüm 49: Firewall'lar
Ağlar'a “Sen”i Katmak kitabının bir bölümü: adres çubuğuna yazdığın tek bir isteğin peşinden bakırla fiberin fiziğine inip karşı taraftan geri dönen uzun bir teknik yolculuk.
Kısım 7: Ağlar Arasında (Bölüm 45-51)
Tüm bölümler
- Giriş
- Adres Çubuğundan İsteğe
- Paket Anahtarlamalı Yol
- İsimden Adrese
- DNS Kayıtları
- Önbellek, Tazelik ve Güven
- Port Numarası ve Soket
- Bağlantısız Taşıma: UDP
- Üç Adımlı El Sıkışma
- Simetrik Şifreleme
- Açık Anahtarlı Kriptografi
- TLS El Sıkışması
- Sertifika Zinciri
- HTTP Mesajının Anatomisi
- Durum, Çerez ve Oturum
- HTTP/2'den HTTP/3'e
- İçerik Dağıtım Ağları
- Diğer Uygulama Protokolleri
- Katmanlı Mimari
- Hizmet ve Protokol
- Encapsulation ve Başlıklar
- Paket Yakalama ve Çözümleme
- Ağ Interface Kartı
- Fiziksel Adresleme
- Hata Sezme ve CRC
- Adres Çözümleme: ARP
- Ortam Erişimi: CSMA/CD
- Switch'ler
- Ağ Topolojileri
- Sanal Yerel Ağlar
- Kablosuz Erişim: 802.11
- Radyo Kanalı ve Kapasite
- Kablosuz Ağ Güvenliği
- Hücresel Ağlar
- Spektrum ve Kuşaklar
- Hareketlilik ve Aktarma
- Adres Kiralama: DHCP
- Adresin Anatomisi
- Adres Tükenmesi ve IPv6
- Router Mimarisi
- Kuyruk Yönetimi
- Cihaz Yapılandırma
- Routing Protokolleri
- Kontrol Düzlemi ve SDN
- Ağ İzleme ve Yönetimi
- Alanlar Arası Routing
- Adres Çevirisi
- Ara Kutular
- Tünelleme ve IPsec
- Firewall'lar
- Ağ Saldırıları
- Operatör ve Metro Ağları
- Bitten Sinyale
- Sembol Hızı ve Kanal Kapasitesi
- Multiplexing Teknikleri
- İletim Ortamları
- Bakır Kablo Sonlandırma
- Fiber Sonlandırma
- Fiber Optik İletim
- Bakır Erişim Ağı: DSL
- DSL'de Hız ve Mesafe
- Pasif Optik Ağlar
- Kablo Erişim Ağları
- Kablo Modem ve CMTS
- Denizaltı Kabloları
- Veri Merkezi Ağları
- Encapsulation Çözme
- Güvenilir Aktarım
- Tıkanıklık Denetimi
- Trafik Çözümleme
- Gecikme Bütçesi
- Soket Programlama
- Eşten Eşe ve Protokol Tasarımı
- Uyarlanır Video Akışı
- Gerçek Zamanlı Ses ve Görüntü
- Kablosuz Sensör Ağlarının Mimarisi
- Sensör Ağlarında Ortam Erişimi
- Sensör Ağlarında Yönlendirme ve IP
- Zaman Eşitleme ve Konum Bulma
- Sensör Ağı Uygulamaları
- Mobil Kablosuz Sensör Ağları
- Son Söz
Tünelin ucundan çıktın ve paket hedef ağın sınırında duruyor. Buraya kadar hiçbir kutu onu geri çevirmedi.
Sınırdaki kutu çevirebilir. Orada bir kural kümesi var ve paket geçmeden önce tek tek yargılanıyor. Peki o kural neye bakıyor?
Sınırda duran şey bir politika
Tünelleme paketi bir başkasının gövdesine koyup dış zarfın arkasına alıyordu; buradaki kutu ise tam tersini yapıyor ve zarfı açıp okuyor. Firewall bir cihaz adı değil, bir sınır tarifi. Kurumun iç ağı ile internetin geri kalanı arasına bir hat çekiyor, sonra o hattı kimin geçeceğine karar veriyor. Bu iş ayrı bir kutuda da, bir router’ın içinde de, dizüstü bilgisayarındaki işletim sisteminde de koşabiliyor; üçünde de firewall’ı firewall yapan şey, o sınırda uygulanan politika.
Politikanın varsayılanı kapalı: açık olan ne varsa, biri onu tek tek açmış demektir. Gerekçeyi üç maddede toplayabilirsin: hizmeti kullanılamaz hâle getirmeye çalışan saldırıları (denial of service, DoS) durdurmak, iç verinin izinsiz okunmasını ya da değiştirilmesini engellemek, iç ağa yalnızca yetkilendirilmiş erişime izin vermek. Bu kutuyu savunmanın tamamı sayma; kimlik doğrulama ve şifreleme onun yanında duruyor.
Üç tür var: durumsuz (stateless) paket süzgeçleri, durum takipli (stateful) paket süzgeçleri, uygulama geçitleri (application gateway). Sıralamanın bir mantığı var: her tür, bir öncekinin göremediğini görmek için doğdu. Bugün “yeni nesil firewall” diye satılan kutular üçünü tek kasada birleştiriyor.
Bir kural satırı neye bakıyor?
Durumsuz süzgeç kararını paket paket veriyor ve elinde hiç geçmiş tutmuyor. Baktığı alanları tek tek sayabilirsin: kaynak IP adresi, hedef IP adresi, TCP ya da UDP kaynak ve hedef port numaraları, ICMP mesaj türü, bir de TCP başlığındaki SYN ile ACK bitleri.
Bu kısa listenin ne kadar iş gördüğü şaşırtıcı. IP başlığındaki protokol alanı, yükün hangi protokole ait olduğunu söylüyor: ICMP için 1, IGMP için 2, TCP için 6, EGP için 8, UDP için 17. Protokol alanı 17 olan datagramları düşüren tek bir satır, ağdaki her UDP flow’unu kesiyor; DNS sorguları da QUIC üstünden giden HTTP/3 trafiği de buna dahil. Tek satırla ne kadar şey kapatabileceğini görmek, bu kutuyu neden dikkatle yazman gerektiğini de anlatıyor.
ACK biti segmentin bir onay taşıdığını söylüyor; RST, SYN ve FIN bayrakları da bağlantı yönetimini taşıyor. Dışarıdan gelen ve ACK biti 0 olan TCP segmentlerini düşürürsen dış istemciler içeriye bağlantı açamıyor. İç istemcilerin dışarıya açtığı bağlantılar çalışmayı sürdürür, çünkü onlara dönen paketlerde ACK kuruludur. Tek bit, bağlantıyı hangi tarafın açabileceğini belirler.
Kurallar ICMP tür numaralarına da yazılır. Tür 8 ping isteğini, tür 0 cevabını taşır. Tür 11 kod 0 TTL’in tükendiğini, tür 3 kod 3 hedef portun ulaşılamaz olduğunu bildirir. TTL alanı her router’da bir azalır ve sıfıra düşünce paket silinir; traceroute bu davranışın üstüne kuruludur. Ağının haritalanmasını istemiyorsan dışarı çıkan TTL-aşıldı mesajlarını düşürürsün. Keşif orada körelir. Aynı mantıkla broadcast adresine giden ICMP paketleri de düşürülür, çünkü ağının 37. bölümdeki Smurf türü bir saldırıda araç olmasını istemezsin.
Bunun bedeli de var. Bir ICMP hata mesajı tür ve kodun yanında, hataya yol açan datagramın IP başlığını ve yükünün en az ilk 8 baytını taşır. O 8 bayt kaynak ve hedef portları içerdiği için gönderen, hatanın hangi bağlantıya ait olduğunu bulabiliyor. 48. bölümde yol MTU keşfi, bu mesajlar susturulduğunda kara deliğe dönüyordu; kuralı yazan taraftan bakınca aynı bedel tek satırlık bir ICMP reddinin içinde duruyor.
6. bölümde port numarası, paketin makinedeki hangi programa gideceğini gösteriyordu; kural satırındaki port koşulu o uzayın bir dilimini keser. Port uzayı 0 ile 65.535 arasında uzanır, çünkü alan 16 bittir.
İlk eşleşen satır kazanır
Kural satırları bir tabloda toplanır ve tablonun adı erişim kontrol listesidir (access control list, ACL). Yapısı iki sütundan ibarettir: bir aksiyon, bir koşul. Gelen paket listeye yukarıdan girer ve ilk eşleşen satırın aksiyonu uygulanır. Tarama orada durur. Sıra bu yüzden ayrıntı sayılmaz; politikanın kendisidir.
Peki hiçbir satır eşleşmezse ne olur? Listenin sonunda yazılmamış bir satır durur ve o satır her şeyi reddeder. Adı örtük rettir.
Somut bir kurum ağı kuralım. Kullanıcılar 198.51.100.0/24 bloğunda otursun, dışa açık web sunucusu 198.51.100.20 adresinde dursun.
| aksiyon | kaynak | hedef | koşul |
|---|---|---|---|
| izin | 198.51.100.0/24 | dışarısı | TCP hedef port 443 |
| izin | dışarısı | 198.51.100.0/24 | TCP kaynak port 443, ACK kurulu |
| izin | 198.51.100.0/24 | dışarısı | UDP hedef port 53 |
| izin | dışarısı | 198.51.100.20 | TCP hedef port 443 |
| ret | her şey | her şey | örtük |
Dört izin satırı ve bir örtük ret; her paket en kötü durumda beş karşılaştırma görür. Dönüş satırının koşuluna klasik olarak bir de hedef portun, yani istemcinin geçici portunun 1.023’ten büyük olması yazılır. Kulağa dar geliyor. Oysa o koşul 64.512 portu birden kapsar ve tek başına neredeyse hiçbir şey elemez.
Liste router’da iki ayrı noktaya bağlanabilir: routing kararından önce süzmek için paketin alındığı interface’e, karardan sonra süzmek için çıkış interface’ine. Satırlar dardan genişe doğru dizilir; ters sıra, dar bir kuralı hiç çalışmayan bir satıra çevirir. Kolayca gözden kaçan bir tuzak daha var. Oluşturulan liste bir interface’le ilişkilendirilmezse yazılmamış sayılır.
Listelerin kendisi de ikiye ayrılır. Standart liste yalnızca kaynak adrese bakar; genişletilmiş liste kaynağın yanında hedefe, protokol numarasına ve port numarasına da bakabilir. Klasik komut satırında türü liste numarası belirler: 1-99 arası standart, 100-199 arası genişletilmiş IP listesidir. Eski sürümlerde hatalı bir satır yalnızca isimli listelerde tek başına silinebiliyordu; bugün iki türde de satırlara sıra numarası veriliyor, tek satır silinip araya yeni satır eklenebiliyor. Eski alışkanlığın tuzağı ise hâlâ yerinde: klasik biçimde no access-list 101 diye başlayan bir komut, arkasına hangi satırı yazarsan yaz, listenin tamamını siler. Adres kümesini kısa yazmak içinse joker maske kullanılır; bitleri alt ağ maskesinin tersi anlama gelir: 0 “bu bit tutmalı”, 1 “bu bit önemsiz” demek. 198.51.100.0 0.0.0.255 yazımı, /24’lük bloğun tamamını yakalar.
Tür, listenin nereye konacağını da belirliyor. Standart liste yalnızca kaynağı gördüğü için kaynağa yakın konursa o kaynağın her yere gidişini keser; bu yüzden hedefe yakın konur. Genişletilmiş liste hedefi de gördüğü için kaynağa yakın konur ve istenmeyen trafik ağı hiç dolaşmadan düşer.
Süzgeç neyi hatırlar, neyi hiç göremez?
Durumsuz süzgeç, bütün bu inceliğe rağmen kaba bir alettir. Hiçbir TCP bağlantısı kurulmamışken bile, kaynak portu 443 ve ACK biti kurulu bir paketi içeri alır. İkinci satırın koşuluna uyuyor, o kadar. Tarama araçları bu körlüğü ölçüme çeviriyor: yalnızca ACK biti kurulu paketler gönderip hangilerine RST cevabı geldiğine bakarak (nmap -sA) süzgecin durum tutup tutmadığını ve hangi portları süzdüğünü dışarıdan haritalıyorlar.
Durum takipli süzgeç bağlantının geçmişini tutuyor. Her TCP bağlantısının kurulumunu ve yıkımını izliyor: SYN’i görüyor, FIN’i görüyor, aradaki paketin anlamlı olup olmadığına karar veriyor. Erişim kontrol listesine fazladan bir sütun ekleniyor ve o sütun tek bir şey söylüyor: bu satırdaki paketi içeri almadan önce bağlantı durum tablosuna bak. Fikri ticari ürüne ilk dönüştürenlerden biri, 1994’te FireWall-1 ile Check Point oldu.
Tablonun anahtarı tanıdık bir four-tuple. İki adres ile iki port, yani 32 + 32 + 16 + 16 bit eder. Toplamı 96 bit, bayta çevirince 12 bayt. Üstüne 8 bitlik protokol numarası da binince anahtara five-tuple deniyor; aynı port çifti TCP’de ve UDP’de iki ayrı bağlantıdır. 46. bölümdeki çeviri tablosu da aynı anahtarı tutuyordu ve buradaki tablo yapı olarak onun kardeşidir. Linux’ta ikisi zaten tek yapı: conntrack tablosu hem süzgecin hem çeviricinin hafızası.
Satırların sonsuza kadar durmasını da bekleme. Hareketsiz bağlantılar zaman aşımına uğruyor ve süresi dolan girdinin paketleri artık içeri alınmıyor. UDP’de kurulum ve yıkım olmadığı için süzgeç bir sözde bağlantı uyduruyor: içeriden giden ilk datagram bir satır açıyor, cevaplar o satıra dayanarak içeri alınıyor ve satır bir süre sessiz kalınca siliniyor. Süreler protokolün doğasını yansıtıyor. Linux’ta kurulmuş bir TCP bağlantısı hiç paket geçmese de tabloda beş gün kalıyor. Cevapsız bir UDP flow’u 30 saniyede unutuluyor, iki yönde de süren bir akış ise 2 dakika sessiz kalınca.
Bu belleğin bir bedeli olduğunu da unutma. Tablodaki her satır bir bağlantının kimliğini taşıyor ve bir yerde durmak zorunda; zaman aşımının sebebi de bu, çünkü tablo sonsuz büyüyemiyor. Tersinden okununca aynı cümle bir saldırı yolu veriyor: tabloyu sahte bağlantılarla dolduran biri, gerçek bağlantılara yer bırakmıyor.
Kutunun ilk paketten sonra neyi hatırladığını izleyelim:
- İç makine bağlantıyı açıyor. 198.51.100.41 adresindeki makine dışarıdaki sunucunun 443 portuna bir SYN gönderiyor. Paket sınırdan çıkarken listenin giden satırıyla eşleşiyor.
- Kutu tabloya satır yazıyor. Satırın anahtarı iki adres ile iki port. Durumsuz bir süzgeçte böyle bir kayıt hiç oluşmaz; kural tablosunun yanındaki bellek bu satırdır.
- Paket dış sunucuya çıkıyor. Sınırın dışında olan biten kutuyu ilgilendirmiyor. Elinde tuttuğu tek şey, az önce yazdığı satırın kendisi.
- Dönen yanıt satırla eşleşiyor. Yanıt geldiğinde kutu önce tabloya bakıyor. Four-tuple orada yazılı olduğu için paket anlamlı sayılıyor ve iç makineye veriliyor.
- Karşılıksız paket düşüyor. Aynı anda gelen ikinci paketin başlıkları da kurallara uyuyor: ACK biti kurulu, kaynak portu 443. Tabloda satırı olmadığı için içeri alınmıyor.
Üçüncü tür daha derine iniyor. Uygulama geçidi başlıkla yetinmiyor, uygulama verisinin kendisine bakıyor; 47. bölümdeki reverse proxy de iki ayrı bağlantı kurup aralarında veri taşıyordu. Bu türe buradan eklenecek iki şey daha var. Geçit tek başına çalışmıyor: router’daki süzgeç, geçitten çıkmayan bağlantıları bloklamazsa geçidi atlamak serbest kalıyor. Bedeli de kalıcıdır, çünkü özel muamele isteyen her uygulama kendi geçidini ister ve istemci yazılımı o geçide nasıl ulaşacağını bilmek zorundadır.
Şimdi üç türün de ortak kör noktasına gel. Bütün bu kurallar kaynak adrese güveniyor, oysa kaynak adres güvenebileceğin bir alan değil. IP adres sahteciliği (IP spoofing), sahte kaynak adresli bir paketi ağa enjekte etmektir; alanı dolduran gönderendir ve kimse doğrulamaz. Savunma da sınırdaki kutuyla bitmez: yerel ağda switch üzerinde IP Source Guard gibi bir özellik açılır. Asıl ilaç ise kaynakta. Operatör, kendi müşterilerinden gelen ama kaynak adresi o müşterilere ait olmayan paketleri daha kendi ağından çıkmadan düşürebilir. Kuralın adı BCP 38 ve 2000’den beri öneriliyor. İnternetin hatırı sayılır bir kısmında hâlâ uygulanmadığı için 44. bölümdeki SNMP yükselticileri gibi sahte kaynaklı yansıtma saldırıları çalışmaya devam ediyor.
İkinci kör nokta bundan da derinde duruyor. Paket süzme yalnızca TCP/IP başlıklarına bakıyor ve oturumlar arasında hiç ilişki kurmuyor. Saldırı tespit sistemini (IDS) bu iki eksik için kuruyorlar; saldırıyı görünce trafiği kendisi de kesene saldırı önleme sistemi (IPS) deniyor. İkisi de derin paket incelemesi (DPI) yapıyor: paketin içeriğine bakıp bilinen virüs ve saldırı dizilerinden oluşan bir veritabanıyla karşılaştırıyor. Birden çok paket arasındaki ilişkiyi de inceliyor. Port taraması, ağ haritalama ve DoS saldırısı ancak paketler birlikte bakıldığında görünür.
İmza veritabanı yalnızca bilineni yakalar. Hiç görülmemiş bir saldırıyı sistem ancak trafiğin olağan dışı davranmasından, yani anomali tespitiyle sezebilir; bedeli de meşru ama alışılmadık trafiğe verilen yanlış alarmlar. Açık kaynak dünyasının bilinen örnekleri 1998’de yazılan Snort ile Suricata. Şifreleme bu sistemlerin işini de değiştirdi: TLS’in içini göremeyen bir sensör ya kurumun kök sertifikasıyla trafiği açıyor ya da yalnızca üstveriye, yani adreslere, zamanlamaya ve el sıkışmanın açık alanlarına bakıyor.
Tek bir tespit noktasıyla da yetinemiyorsun. Sensörleri ağın farklı köşelerine dağıtıyorlar ve her biri başka bir denetimi üstleniyor; dışa açık sunucular da iç ağdan ayrılmış bir ara bölgede, DMZ’de (demilitarized zone) duruyor.
Dışarıdan bakınca bütün bu düzeneği tek bir kelimede göreceksin. nmap gibi bir port tarayıcı üç cevap tanır. Açık portta SYN-ACK döner, kapalı portta RST döner; filtreli portta ise ya hiçbir şey dönmez ya da bir ICMP ulaşılamaz mesajı gelir. Kapalı ile filtreli arasındaki fark, reddi kimin verdiği: kapalıda makinenin kendisi, filtrelide aradaki süzgeç. Ping’e cevap gelmemesini de tek bir şeye yorma: ya makine hiç ayakta değildir ya da bir süzgeç ICMP’yi yutuyordur. Susmayı kanıt sayamazsın.
Özet
- Firewall bir sınır politikasıdır: iç ağı internetten ayırır, varsayılanı kapalıdır ve tek tek açılmamış olan her şeyi reddeder.
- Durumsuz süzgeç sayılı alana bakar: iki adres, iki port, ICMP türü ve TCP bayrakları; kararını her pakette baştan verir.
- Örtük ret listenin yazılmayan son satırıdır: ilk eşleşme kazandığı için satır sırası politikanın kendisi olur.
- Durum takibi kural tablosunun yanına bellek ekler: bağlantı durum tablosundaki five-tuple, dönen paketin anlamlı olup olmadığını söyler.
- Süzgecin iki kör noktası vardır: kaynak adres doğrulanamaz ve oturumlar arası ilişki görülemez; saldırı tespit sistemi bu boşluğa girer.
- Dışarıdan bakan üç cevap görür: açık portta SYN-ACK, kapalı portta RST, filtreli portta ise sessizlik ya da ICMP; susmak hiçbir şeyin kanıtı değildir.
Kutu kurallarını yazdı, bağlantıları hatırlıyor, şüpheli trafiği işaretliyor. Ama saldırgan her zaman bir kuralın arkasından dolanmaya uğraşmaz. Bazen kapıyı doldurur, bazen kapıyla hiç uğraşmayıp yolun ortasına oturur. Peki sınıra hangi saldırılar geliyor ve hangisi kutunun hiç göremediği yerden geliyor?
50. bölüme devam et: Ağ Saldırıları