Ana içeriğe geç

Bölüm 49: Firewall'lar

10 dakikalık okumaGüncelleme:

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
  1. Giriş
  2. Adres Çubuğundan İsteğe
  3. Paket Anahtarlamalı Yol
  4. İsimden Adrese
  5. DNS Kayıtları
  6. Önbellek, Tazelik ve Güven
  7. Port Numarası ve Soket
  8. Bağlantısız Taşıma: UDP
  9. Üç Adımlı El Sıkışma
  10. Simetrik Şifreleme
  11. Açık Anahtarlı Kriptografi
  12. TLS El Sıkışması
  13. Sertifika Zinciri
  14. HTTP Mesajının Anatomisi
  15. Durum, Çerez ve Oturum
  16. HTTP/2'den HTTP/3'e
  17. İçerik Dağıtım Ağları
  18. Diğer Uygulama Protokolleri
  19. Katmanlı Mimari
  20. Hizmet ve Protokol
  21. Encapsulation ve Başlıklar
  22. Paket Yakalama ve Çözümleme
  23. Ağ Interface Kartı
  24. Fiziksel Adresleme
  25. Hata Sezme ve CRC
  26. Adres Çözümleme: ARP
  27. Ortam Erişimi: CSMA/CD
  28. Switch'ler
  29. Ağ Topolojileri
  30. Sanal Yerel Ağlar
  31. Kablosuz Erişim: 802.11
  32. Radyo Kanalı ve Kapasite
  33. Kablosuz Ağ Güvenliği
  34. Hücresel Ağlar
  35. Spektrum ve Kuşaklar
  36. Hareketlilik ve Aktarma
  37. Adres Kiralama: DHCP
  38. Adresin Anatomisi
  39. Adres Tükenmesi ve IPv6
  40. Router Mimarisi
  41. Kuyruk Yönetimi
  42. Cihaz Yapılandırma
  43. Routing Protokolleri
  44. Kontrol Düzlemi ve SDN
  45. Ağ İzleme ve Yönetimi
  46. Alanlar Arası Routing
  47. Adres Çevirisi
  48. Ara Kutular
  49. Tünelleme ve IPsec
  50. Firewall'lar
  51. Ağ Saldırıları
  52. Operatör ve Metro Ağları
  53. Bitten Sinyale
  54. Sembol Hızı ve Kanal Kapasitesi
  55. Multiplexing Teknikleri
  56. İletim Ortamları
  57. Bakır Kablo Sonlandırma
  58. Fiber Sonlandırma
  59. Fiber Optik İletim
  60. Bakır Erişim Ağı: DSL
  61. DSL'de Hız ve Mesafe
  62. Pasif Optik Ağlar
  63. Kablo Erişim Ağları
  64. Kablo Modem ve CMTS
  65. Denizaltı Kabloları
  66. Veri Merkezi Ağları
  67. Encapsulation Çözme
  68. Güvenilir Aktarım
  69. Tıkanıklık Denetimi
  70. Trafik Çözümleme
  71. Gecikme Bütçesi
  72. Soket Programlama
  73. Eşten Eşe ve Protokol Tasarımı
  74. Uyarlanır Video Akışı
  75. Gerçek Zamanlı Ses ve Görüntü
  76. Kablosuz Sensör Ağlarının Mimarisi
  77. Sensör Ağlarında Ortam Erişimi
  78. Sensör Ağlarında Yönlendirme ve IP
  79. Zaman Eşitleme ve Konum Bulma
  80. Sensör Ağı Uygulamaları
  81. Mobil Kablosuz Sensör Ağları
  82. 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.

aksiyonkaynakhedefkoşul
izin198.51.100.0/24dışarısıTCP hedef port 443
izindışarısı198.51.100.0/24TCP kaynak port 443, ACK kurulu
izin198.51.100.0/24dışarısıUDP hedef port 53
izindışarısı198.51.100.20TCP hedef port 443
rether şeyher ş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:

Aynı görünen iki paketi ayıran tek satır
kurum ağı 198.51.100.0/24internetiç makine198.51.100.41firewalldurum takiplidış sunucu203.0.113.7giden akışaynı four-tuplekarşılıksız paketbağlantı durum tablosuiç uç 198.51.100.41:51500dış uç 203.0.113.7:443tabloda satırı yok
İç 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.
  1. İç 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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ı