İçeriğe atla
0 XP 0
16 dkderinleşmeyle 18 dk50 XP8 etkinlik

Durum bilgili güvenlik duvarı ve kural sırası

Bu derste
  • Güvenlik duvarı türlerini, durum tablosunu, kural sırasını, varsayılan reddet ilkesini ve kural değişikliklerini izlemeyi adım adım öğren.
  • Durum bilgili güvenlik duvarı bağlantının önceki paketini hatırlar; conntrack çıktısıyla bu hafızayı satır satır okursun.
  • nftables ile varsayılan reddet kurar, sayaçlarla gölgelenen kuralı bulur ve Windows'ta kural değişikliğini izlersin.

Puan bütün etkinlikleri cevaplayınca hesaba yazılır. Bu dersi tamamlayınca +50 XP alacaksın. Giriş yapmadan ilerlersen puan yalnız bu tarayıcıda durur.

Güvenlik duvarı, iki ağ arasına konan bir kapı bekçisidir. Her paket geldiğinde bekçi kural listesine bakar ve kararını verir: geçir ya da at. Gerçek ağlarda sorunların çoğu bekçiden değil, ona verilen listeden çıkar. Yıllar içinde eklenen kurallar birbirini örter.

Geçici açılan bir port kapanmaz. Kimse bir kuralın neden orada durduğunu hatırlamaz. Bu derste önce güvenlik duvarı türlerini ayıracaksın.

Sonra durum bilgili bir duvarın bağlantıları nasıl hatırladığını Linux'un conntrack tablosunda okuyacaksın. Ardından kural sırasını, varsayılan reddet ilkesini ve nftables ile yazılmış bir kural setini göreceksin. Son bölümde kural listesini sayaçlarla denetleyecek, çıkış trafiğini süzecek ve kural değişikliklerini izleyeceksin.

Paket süzmeden yeni nesle: güvenlik duvarı türleri

En eski tür paket süzen (packet filtering) güvenlik duvarıdır. Paketi tek başına değerlendirir; kaynak IP, hedef IP, port ve protokol dışında bir şey bilmez. Bu türe durumsuz (stateless) güvenlik duvarı da denir, her paketi ilk kez görüyormuş gibi karşılar. Yönlendiricilerdeki erişim listeleri (ACL) bugün de böyle çalışır.

Durumsuz duvarın zayıf yanı cevap trafiğidir. İçeriden bir web sitesine bağlanan istemcinin cevabı yüksek numaralı bir porta döner. Bu cevabı geçirmek için geniş bir kural yazman gerekir, örneğin kaynak portu 443 olan her paketi içeri alırsın. Saldırgan da kaynak portunu 443 ya da 53 yaparak aynı kapıdan geçer.

Durum bilgili (stateful) güvenlik duvarı bu sorunu çözer. Bağlantının hangi aşamada olduğunu bir tabloda tutar. Sunucudan gelen cevap tablodaki satırla eşleşir ve ayrı bir kural gerekmeden geçer.

Daha üst katmana bakan türler de vardır. Uygulama katmanı vekili (application-proxy gateway) bağlantıyı ikiye böler. İstemci vekile bağlanır, vekil de sunucuya ayrı bir bağlantı açar.

Arada protokolün içeriğini okur ve kurala uymayan isteği keser. Yeni nesil güvenlik duvarı (NGFW) durum takibine uygulama tanıma, kullanıcı kimliği ve saldırı önleme ekler. Port numarası yerine trafiğin hangi uygulamaya ait olduğuna bakar.

Web uygulama güvenlik duvarı (WAF) ise yalnız HTTP trafiğine odaklanır ve SQL enjeksiyonu gibi uygulama saldırılarını arar. WAF ağ güvenlik duvarının yerini tutmaz, onun arkasında ek bir katman olarak çalışır. Tür ne olursa olsun temel yapı aynıdır: bir kural listesi ve hiçbir kural eşleşmediğinde uygulanan varsayılan karar.

Etkinlik 1 / 8

Her güvenlik duvarı türünü, karar verirken baktığı şeyle eşleştir.

Soldan bir tane seç, sağdan eşini seç. Kullanılmış bir seçeneği yeniden seçersen yeni öğeye taşınır.

Durum tablosu nasıl çalışır

Durum tablosu kaynak adresi, hedef adresi, port çiftini ve bağlantının aşamasını saklar. TCP'de aşama SYN, SYN-ACK ve ACK adımlarından geçer. Durum bilgili duvar bu adımları izler, beklenmedik bir paket geldiğinde reddeder.

Örneğin hiç SYN gönderilmemişken gelen bir ACK paketi şüphelidir, çünkü tabloda karşılığı yoktur. Linux'ta bu işi çekirdekteki conntrack (bağlantı izleme) modülü yapar ve her pakete bir durum etiketi verir. new, yeni bağlantının ilk paketidir.

established, iki yönde trafik görülmüş bağlantıdır. related, var olan bir bağlantının doğurduğu yan trafiktir; o bağlantıya ait bir ICMP hata mesajı buna örnektir. invalid ise hiçbir bağlantıya oturmayan pakettir.

SYNistemci → sunucuSYN-ACKsunucu → istemciACKistemci → sunucuVeribağlantı açık
TCP üçlü el sıkışma. Durum bilgili duvar her adımı tabloya yazar ve sırayı bozan paketi tanır.

Şemadaki üç adım durum tablosunun temelidir. SYN geldiğinde duvar yeni satır açar ve bağlantıyı new sayar. SYN-ACK dönünce satır güncellenir, çünkü artık iki yönde trafik görülmüştür. ACK ile bağlantı kurulmuş sayılır ve veri akışı başlar.

Her aşamanın bir zaman aşımı da vardır. Linux'un varsayılan ayarlarında cevapsız bir SYN iki dakika, kurulmuş bir TCP bağlantısı beş gün tabloda kalır. Bağlantı bu süre boyunca sessiz kalırsa satır silinir. Aşağıdaki çıktı, bir Linux güvenlik duvarında 443 numaralı porta giden bağlantıları listeler.

$ sudo conntrack -L -p tcp --dport 443
tcp      6 431999 ESTABLISHED src=192.168.1.20 dst=203.0.113.10 sport=51514 dport=443 src=203.0.113.10 dst=192.168.1.20 sport=443 dport=51514 [ASSURED] mark=0 use=1
tcp      6 118 SYN_SENT src=192.168.1.20 dst=203.0.113.25 sport=51530 dport=443 [UNREPLIED] src=203.0.113.25 dst=192.168.1.20 sport=443 dport=51530 mark=0 use=1
conntrack -L çıktısı. Her satır bir bağlantıdır: önce başlatan yön, sonra beklenen cevap yazılır.

İlk satırı soldan sağa oku. tcp ve 6, protokolün adı ve IP başlığındaki numarasıdır. 431999 satırın kalan ömrüdür, saniye cinsinden.

Beş günlük sayaç neredeyse başındadır, bağlantıdan az önce paket geçmiştir. ESTABLISHED TCP aşamasıdır. İlk src, dst, sport ve dport dörtlüsü bağlantıyı başlatan yönü anlatır.

İkinci dörtlü beklenen cevaptır; duvar sunucudan gelen paketi bu dörtlüyle karşılaştırır ve eşleşirse geçirir. [ASSURED] işareti bağlantının kesinleştiğini söyler; TCP'de el sıkışma tamamlanınca konur. Tablo dolduğunda çekirdek önce bu işareti taşımayan satırları siler, kurulmuş bağlantıyı korur.

İkinci satırda durum SYN_SENT, işaret [UNREPLIED] olarak görünür. İstemci SYN göndermiş ama cevap gelmemiştir, satırın ömrü de 118 saniyeye inmiştir. Böyle satırlar birden çoğalıyorsa ya karşı taraf cevap vermiyordur ya da biri tabloyu yarım bağlantılarla dolduruyordur.

Derinleş:Asimetrik yönlendirme ve durum tablosu

Durum bilgili duvar bir bağlantının iki yönünü de görmek zorundadır. Büyük ağlarda gidiş ve dönüş trafiği bazen farklı yollardan akar. Buna asimetrik yönlendirme denir.

İstemcinin SYN paketi A duvarından geçer, sunucunun SYN-ACK cevabı ise B duvarına varır. B duvarının tablosunda bu bağlantıya ait satır yoktur, bu yüzden cevabı invalid sayıp atar. Kullanıcı bağlantının rastgele koptuğunu söyler, kurallar ise kusursuz görünür.

Çözüm ya trafiği simetrik hale getirmektir ya da duvar çiftinin durum tablosunu birbirine eşitlemesidir. Linux dünyasında conntrackd aracı bu eşitlemeyi yapar. Ticari cihazlar aynı işi küme içinde oturum eşitleme adıyla sunar. Sorun giderirken invalid sayacı birden artıyorsa, kurallara bakmadan önce yönlendirme tablosuna bakmak zaman kazandırır.

Bir ayrıntı daha var: Linux'un varsayılan nf_conntrack_tcp_loose ayarı, ortasından yakalanan bir bağlantıyı da tabloya alır. Bu yüzden SYN görülmeden gelen tek bir ACK her zaman invalid sayılmaz, new olarak da işlenebilir. Katı davranış istersen bu ayarı 0 yaparsın ya da yeni TCP bağlantısının SYN ile başlamasını ayrı bir kuralla şart koşarsın.

Etkinlik 2 / 8

İstemci sunucuya SYN paketi gönderdi. Durum bilgili güvenlik duvarı bu bağlantı için tabloya yeni bir satırı hangi aşamada açar?

Diyagramda doğru kutuyu tıkla.

SYNistemci → sunucuSYN-ACKsunucu → istemciACKistemci → sunucuVeribağlantı açık

Kural sırası ve varsayılan reddet

Durum tablosu cevap trafiğini halleder. Yeni bağlantılar için ise kural listesi devreye girer. Çoğu güvenlik duvarı listeyi yukarıdan aşağıya tarar ve ilk eşleşen kuralda durur.

Altındaki daha özel bir kural olsa bile artık okunmaz. Geniş bir izin kuralını listenin başına koymak, altındaki tüm kısıtlamaları etkisiz bırakır. Doğru sıralama tam tersidir: önce dar ve özel kurallar, sonra geniş kurallar gelir.

Tek bir IP'den gelen yönetim trafiğini önce kabul edersin, aynı porta gelen geri kalan her şeyi sonra reddedersin. Sıra tersine çevrilirse yönetim kuralına hiç sıra gelmez. Bir kuralın, üstündeki daha geniş bir kural yüzünden hiç eşleşmemesine gölgelenme (shadowing) denir. Gölgelenen kural listede durur ama hiçbir pakete dokunmaz.

Listenin sonunda bir soru kalır: hiçbir kural eşleşmezse ne olur. Cevap varsayılan davranışa bağlıdır. Varsayılan reddet ilkesinde eşleşmeyen her paket atılır.

Varsayılan izin ilkesinde eşleşmeyen paket geçer. NIST SP 800-41 Rev. 1 varsayılan reddeti önerir. Bunu, açıkça izin verilmemiş gelen ve giden trafiğin engellenmesi diye tanımlar.

Gerekçe basittir: unutulan kural boşluk değil açık kapı yaratır. Yeni bir servis eklerken kural yazmayı unutursan varsayılan reddet seni korur, servis dışarıya kapalı kalır. Varsayılan izinde aynı unutma servisi sessizce açık bırakır. Aşağıdaki nftables kural seti bu ilkeyi bir Linux sunucusunda uygular.

table inet filtre {
  chain giris {
    type filter hook input priority 0; policy drop;
    ct state established,related accept
    ct state invalid drop
    iif "lo" accept
    ip saddr 192.0.2.10 tcp dport 22 counter accept
    tcp dport 22 counter drop
    tcp dport { 80, 443 } counter accept
    counter log prefix "DUSEN: "
  }
}
nftables ile varsayılan reddet ve durum takibi. Kurallar yukarıdan aşağı okunur, hiçbir kurala uymayan paketi policy drop atar.

Satırları sırayla oku. policy drop zincirin varsayılan kararıdır. İlk kural durum tablosunu kullanır: kurulmuş ya da ilişkili bir bağlantının paketi hemen kabul edilir ve listede aşağı inmez. En sık görülen cevap trafiği en üstte durduğu için duvar hızlı çalışır.

İkinci kural invalid paketi atar; hiçbir bağlantıya oturmayan ya da TCP penceresinin dışında kalan paketler buraya düşer. lo arayüzü makinenin kendi iç trafiğidir, kesilirse yerel servisler bozulur. Sonra dar kural gelir: 22 numaralı porta yalnız 192.0.2.10 adresi erişir. Hemen altındaki kural 22'ye gelen geri kalan her şeyi reddeder.

Web portları herkese açıktır. Son satırda karar yoktur. log ve counter karar vermeyen ifadelerdir: paketi kaydeder, sayar ve zincirin sonuna bırakır. Orada policy drop paketi atar.

Derinleş:iptables'tan nftables'a

Linux'ta paket süzmenin çatısı Netfilter'dır. Yıllarca bu çatının en bilinen arayüzü iptables oldu. iptables IPv4, IPv6, ARP ve köprü trafiği için ayrı araçlar ve ayrı tablolar kullanıyordu, bu da aynı kuralı birkaç kez yazmak demekti.

nftables bu dağınıklığı toplamak için geliştirildi. Proje ilk kez 2008'deki Netfilter Workshop'ta tanıtıldı ve Ocak 2014'te Linux 3.13 çekirdeğiyle ana dala girdi. Çekirdekte küçük bir sanal makine çalışır, kurallar bu makinenin anlayacağı bayt koduna çevrilir.

Dersteki örnekte kullanılan inet ailesi, IPv4 ve IPv6 kurallarını tek tabloda toplar. Debian 10 ile birlikte birçok dağıtım nftables'ı varsayılan arka uç yaptı. Bugün iptables komutunu yazan birçok sistem, arka planda iptables-nft katmanıyla aslında nftables kuralı üretir. Eski kuralları taşımak için iptables-translate aracı vardır.

Etkinlik 3 / 8

Bir güvenlik duvarında yönetim IP'sine özel izin kuralı listenin en altında duruyor. Üstünde ise aynı portu herkese kapatan geniş bir reddet kuralı var. Sonuç ne olur?

Etkinlik 4 / 8

Doğru mu, yanlış mı?

Varsayılan izin ilkesinde, unutulan bir kural sistemi dışarıya kapalı bırakır.

Durum tablosunun sınırı

Durum tablosunun bir sınırı da vardır. Her satır bellek kaplar, tablo sonsuz büyümez. Saldırgan çok sayıda yarım bağlantı açarsa tablo dolar ve yeni meşru bağlantılar reddedilir. Buna durum tablosu tükenmesi denir, bir hizmet reddi biçimidir.

SYN seli (SYN flood) en bilinen örnektir: sahte kaynaklardan gelen SYN paketleri cevapsız kalır ve her biri tabloda bir satır tutar. Linux'ta tablonun üst sınırı nf_conntrack_max ayarıdır. Anlık satır sayısı nf_conntrack_count değerinde görünür, conntrack -C komutu da aynı sayıyı tek satırda verir. Sınıra ulaşıldığında çekirdek günlüğüne aşağıdaki satır düşer ve yeni paketler atılır.

$ sudo dmesg | grep conntrack
[482113.905512] nf_conntrack: nf_conntrack: table full, dropping packet
[482114.012877] nf_conntrack: nf_conntrack: table full, dropping packet
$ sudo sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max
net.netfilter.nf_conntrack_count = 262144
net.netfilter.nf_conntrack_max = 262144
Tablo dolduğunda çekirdek günlüğü ve sayaçlar. Anlık sayı üst sınıra dayanmıştır.

Çıktıda iki kanıt birlikte okunur. Çekirdek mesajı tablonun dolduğunu ve paketlerin atıldığını söyler. sysctl çıktısı da sayacın tam sınıra dayandığını gösterir.

Savunma birkaç katmandan oluşur. Yarım bağlantıların zaman aşımını kısaltırsın, cevapsız satırlar daha çabuk silinir. Tek kaynaktan gelen yeni bağlantı hızına sınır koyarsın.

Korunan sunucularda SYN çerezlerini (SYN cookies) açık tutarsın; sunucu yarım bağlantı kuyruğu dolsa da cevap vermeyi sürdürür. Doluluk oranını, yani count değerinin max değerine oranını izleme sistemine bağlarsın. Oran belirli bir eşiği geçince alarm üretirsin ve sorunu kullanıcılardan önce görürsün.

Etkinlik 5 / 8

Saldırgan çok sayıda yarım TCP bağlantısı açarak durum tablosunu doldurmaya çalışıyor. Bu saldırı hangi sonucu hedefler?

Etkinlik 6 / 8

Durum tablosundaki anlık satır sayısını conntrack aracıyla tek satırda görmek istiyorsun. Komutu yaz.

ogrenci@lab

Kural denetimi, çıkış süzme ve değişiklik izleme

Kural listesi yaşayan bir belgedir, bakımsız kalınca çürür. NIST SP 800-41 Rev. 1 politikanın düzenli aralıklarla gözden geçirilmesini ister; böyle bir inceleme artık gerekmeyen kuralları ortaya çıkarır. Denetimde üç tür sorunlu kural ararsın.

Gölgelenen kural, üstteki geniş bir kural yüzünden hiç çalışmaz. Gereksiz kural, başka bir kuralın zaten yaptığı işi tekrarlar. Ölü kural ise artık var olmayan bir sunucuya ya da kapanmış bir projeye aittir. Üçünü de sayaçlar ele verir.

Aşağıdaki çıktı, önceki kural setinin birkaç ay sonraki halidir. Arada biri 8080 portu için bir kural eklemiştir.

$ sudo nft list ruleset
table inet filtre {
  chain giris {
    type filter hook input priority filter; policy drop;
    ct state established,related accept
    ct state invalid drop
    iif "lo" accept
    ip saddr 192.0.2.10 tcp dport 22 counter packets 412 bytes 24720 accept
    tcp dport 22 counter packets 18344 bytes 1100640 drop
    tcp dport { 80, 443 } counter packets 902113 bytes 54126780 accept
    tcp dport 8080 counter packets 0 bytes 0 accept
    counter packets 5120 bytes 307200 log prefix "DUSEN: "
  }
}
nft list ruleset çıktısı. counter taşıyan her kural kaç paket ve bayt gördüğünü yazar.

Sayaçlar hemen bir hikâye anlatır. Yönetim kuralı 412 paket görmüştür, beklenen düzeydedir. Altındaki reddet kuralı 18.344 paket saymıştır; biri SSH portunu sürekli yokluyor ve kural işini yapıyor.

8080 kuralı sıfırda durur. Bu portu dinleyen servis kaldırılmış, kural unutulmuştur. Bugün zararsızdır, ama yarın aynı porta başka bir servis kurulursa kimse fark etmeden dışarıya açılır.

Denetim yalnız gelen trafiğe bakmaz. Çıkış (egress) süzme, iç ağdan dışarı giden trafiği gereken hedeflerle sınırlar. Kullanıcı bilgisayarlarının dışarıya doğrudan 25 numaralı SMTP ya da 53 numaralı DNS portuna çıkması gerekmez.

E-postayı posta sunucusu, ad çözmeyi iç DNS sunucusu yapar. Bu iki portu yalnız o sunuculara açarsan, bulaşmış bir makinenin istenmeyen e-posta göndermesi ya da DNS üzerinden veri sızdırması zorlaşır. MITRE ATT&CK bu önlemi M1037 (Filter Network Traffic) olarak listeler. Windows sunucuda aynı denetime profilleri ve etkin izin kurallarını okuyarak başlarsın.

PS C:\> netsh advfirewall show publicprofile

Public Profile Settings:
----------------------------------------------------------------------
State                                 ON
Firewall Policy                       BlockInbound,AllowOutbound

PS C:\> Get-NetFirewallRule -Direction Inbound -Enabled True -Action Allow | Select-Object DisplayName, Profile

DisplayName                      Profile
-----------                      -------
Web Sunucusu HTTPS                Domain
Uzak Masaüstü Geçici Erişim          Any
Windows'ta profil durumu ve etkin gelen izin kuralları. Çıktı kısaltıldı.

Çıktıyı yukarıdan oku. Windows Defender Firewall üç profil tutar: etki alanı (Domain), özel (Private) ve genel (Public). BlockInbound,AllowOutbound, gelen trafikte varsayılan engelleme, giden trafikte varsayılan izin demektir.

Get-NetFirewallRule gelen yöndeki etkin izin kurallarını listeler. Adı geçici erişim diyen ve bütün profillere açık kural, sahibine sorulacak ilk satırdır. Listeyi değiştiren her zaman yönetici olmaz.

Saldırgan içeri girince yeni bir izin kuralı ekler, bir profili kapatır ya da engelleyen kuralı siler. MITRE ATT&CK bu davranışı T1686 (Disable or Modify System Firewall) olarak izler; Windows alt tekniği T1686.003'tür, eski sürümlerde T1562.004 numarasıyla geçer. Audit MPSSVC Rule-Level Policy Change alt kategorisi açıksa yerel kural eklemesi 4946, değiştirme 4947, silme 4948 olayı üretir. Duvar ayarı değişince 4950 oluşur.

Grup İlkesi ile gelen kural 4946 üretmez, bu yüzden beklenmedik bir 4946 makineye yerel bir el değdiğini gösterir. Saldırgan kurala çoğu zaman sıradan bir sistem bileşeninin adını verir. Mesai dışında ve değişiklik kaydı olmadan gelen olaylara önce bakarsın.

Etkinlik 7 / 8

Onaylı değişiklik kaydı yalnız 23 Eylül sabahındaki HTTPS kuralı düzenlemesini kapsıyor. web01 günlüğünde şüpheli güvenlik duvarı değişikliklerini işaretle.

Şüpheli satırlara tıkla. Birden fazla olabilir.

Etkinlik 8 / 8

Bir web sunucusu için güvenlik duvarı kurallarını doğru sıraya diz: özelden genele, sonra varsayılan reddet.

Sürükleyip doğru sıraya koy.

Bir öğeye odaklan, yukarı ve aşağı ok tuşlarıyla taşı. Home tuşu en üste, End tuşu en alta alır.

  • 1Herkesten 443/tcp portuna izin ver
  • 2Eşleşmeyen her paketi reddet (varsayılan)
  • 3Herkesten 22/tcp portunu reddet
  • 4Yönetim IP'sinden 22/tcp portuna izin ver

Bu derste bir hata mı gördün? Bildir