Snort ile Ağ Saldırı Tespiti ve IDS/IPS Kurulumu

Ağ güvenliğinde saldırıları gerçek zamanlı tespit etmek ve engellemek, her sistem yöneticisinin öncelikli sorumluluklarından biri. Snort, bu iş için onlarca yıldır sektörün vazgeçilmezi olan açık kaynaklı bir IDS/IPS çözümü. Sadece saldırıları tespit etmekle kalmıyor, doğru yapılandırıldığında aktif olarak engelleyebiliyor da. Bu yazıda Snort’u sıfırdan kuracağız, kural yazımını öğreneceğiz ve gerçek dünya senaryolarında nasıl kullanacağımızı göreceğiz.

Snort Nedir ve IDS/IPS Farkı

Snort’u anlamadan önce IDS ve IPS kavramlarını netleştirmek gerekiyor.

IDS (Intrusion Detection System), ağ trafiğini izler ve şüpheli aktiviteleri tespit ettiğinde sadece alarm üretir. Trafiğe müdahale etmez. Bir güvenlik kamerası gibi düşünebilirsiniz.

IPS (Intrusion Prevention System), tespit ettiği saldırıları aktif olarak engeller. Sadece kayıt tutmakla kalmaz, zararlı paketleri düşürür ya da bağlantıyı keser. Güvenlik kamerasına ek olarak kapıyı otomatik kilitleyen bir sistem gibi.

Snort her iki modda da çalışabilir. Pasif modda sadece dinler (IDS), inline modda ise trafiği gerçek zamanlı filtreler (IPS). Hangisini seçeceğiniz ağ topolojinize ve güvenlik gereksinimlerinize bağlı.

Kurulum Öncesi Hazırlık

Ubuntu/Debian tabanlı sistemlerde kuruluma geçmeden önce bazı bağımlılıkları yüklememiz gerekiyor.

sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential libpcap-dev libpcre3-dev 
    libdnet-dev zlib1g-dev liblzma-dev openssl libssl-dev 
    libnghttp2-dev libdumbnet-dev bison flex libluajit-5.1-dev 
    pkg-config libhwloc-dev cmake

Snort 3 (güncel sürüm) için ek olarak DAQ kütüphanesine ihtiyacınız var. DAQ, Snort’un farklı ağ arayüzleriyle konuşmasını sağlayan katman.

# DAQ kurulumu
cd /tmp
wget https://github.com/snort3/libdaq/archive/refs/tags/v3.0.13.tar.gz
tar -xzf v3.0.13.tar.gz
cd libdaq-3.0.13
./bootstrap
./configure
make
sudo make install
sudo ldconfig

Snort 3’ü kaynak koddan derleyeceğiz çünkü paket depolarındaki sürümler genellikle eski kalıyor.

cd /tmp
wget https://github.com/snort3/snort3/archive/refs/tags/3.1.74.0.tar.gz
tar -xzf 3.1.74.0.tar.gz
cd snort3-3.1.74.0
./configure_cmake.sh --prefix=/usr/local --enable-tcmalloc
cd build
make -j$(nproc)
sudo make install
sudo ldconfig

Kurulumun başarılı olduğunu doğrulayalım:

snort --version
# Çıktı: Snort++ 3.1.74.0 gibi bir şey görmeli

Snort Yapılandırması

Snort’un yapılandırma dosyası /usr/local/etc/snort/snort.lua konumunda bulunuyor. Snort 3, eski sürümden farklı olarak Lua tabanlı yapılandırma kullanıyor. Bu hem daha okunabilir hem de çok daha esnek.

Temel yapılandırmayı oluşturalım:

sudo mkdir -p /usr/local/etc/snort/rules
sudo mkdir -p /var/log/snort
sudo mkdir -p /usr/local/lib/snort_dynamicrules

# Örnek yapılandırmayı kopyala
sudo cp /tmp/snort3-3.1.74.0/lua/snort.lua /usr/local/etc/snort/
sudo cp /tmp/snort3-3.1.74.0/lua/snort_defaults.lua /usr/local/etc/snort/

snort.lua dosyasını düzenleyelim. En kritik kısımlar ağ tanımları ve kural dosyaları:

sudo nano /usr/local/etc/snort/snort.lua

Dosya içinde şu bölümleri düzenleyin:

-- Ağ tanımları
HOME_NET = '192.168.1.0/24'
EXTERNAL_NET = '!$HOME_NET'

-- Kural dosyası konumu
ips =
{
    enable_builtin_rules = true,
    include = RULE_PATH .. '/local.rules',
    variables = default_variables
}

-- Log ayarları
alert_fast =
{
    file = true,
    packet = false,
    limit = 10,
}

Kural Yazımı

Snort’un gücü kural motorundan geliyor. Her kural belirli bir ağ trafiği örüntüsünü tanımlar. Kural yazımını öğrenmek, Snort’u gerçekten kendinize göre şekillendirmenizi sağlar.

Temel kural yapısı şöyle:

aksiyon protokol kaynak_ip kaynak_port yön hedef_ip hedef_port (seçenekler)

Birkaç gerçek dünya örneğiyle görelim. Local kurallar dosyamızı oluşturalım:

sudo nano /usr/local/etc/snort/rules/local.rules
# Basit ICMP ping tespiti
alert icmp any any -> $HOME_NET any (msg:"ICMP Ping Tespiti"; itype:8; sid:1000001; rev:1;)

# SSH brute force tespiti - 60 saniyede 5'ten fazla bağlantı
alert tcp any any -> $HOME_NET 22 (msg:"SSH Brute Force Girişimi"; 
    threshold:type both, track by_src, count 5, seconds 60; 
    sid:1000002; rev:1;)

# SQL injection girişimi - basit pattern
alert tcp any any -> $HOME_NET 80 (msg:"SQL Injection Girişimi"; 
    content:"UNION SELECT"; nocase; http_uri; 
    sid:1000003; rev:1;)

# Port tarama tespiti
alert tcp any any -> $HOME_NET any (msg:"Port Tarama Tespit Edildi"; 
    flags:S; threshold:type both, track by_src, count 20, seconds 10; 
    sid:1000004; rev:1;)

# Telnet bağlantısı (güvensiz protokol uyarısı)
alert tcp any any -> $HOME_NET 23 (msg:"Telnet Bağlantısı Tespit Edildi"; 
    sid:1000005; rev:1;)

Kural parametrelerini anlamak önemli:

msg: Alarm mesajı, log’da görünür content: Pakette aranacak içerik deseni nocase: Büyük/küçük harf duyarsız arama sid: Her kuralın benzersiz kimlik numarası (1000000+ yerel kurallar için) rev: Kural revizyonu threshold: Alarm eşiği, kaç istek sonra uyarı üretileceği flags: TCP bayrakları (S=SYN, A=ACK, F=FIN vb.)

Snort’u Test Modunda Çalıştırma

Yapılandırmayı canlıya geçirmeden önce test etmek kritik. Snort bunu doğrudan destekliyor:

# Yapılandırma dosyasını test et
sudo snort -c /usr/local/etc/snort/snort.lua --test

# Belirli bir PCAP dosyasına karşı test
sudo snort -c /usr/local/etc/snort/snort.lua 
    -r /path/to/capture.pcap 
    -l /var/log/snort

Test başarılıysa şöyle bir çıktı görmelisiniz:

Snort successfully validated the configuration (with 0 warnings).

Uyarı veya hata varsa, büyük ihtimalle kural sözdiziminde sorun var demektir. Sid çakışmaları da sık karşılaşılan sorunlardan biri, her kuralın unique sid’e sahip olduğundan emin olun.

IDS Modunda Çalıştırma

IDS modunda Snort trafiği sadece dinler, müdahale etmez. Üretim ortamında başlamak için ideal mod.

# eth0 arayüzünü dinle, IDS modu
sudo snort -c /usr/local/etc/snort/snort.lua 
    -i eth0 
    -l /var/log/snort 
    -D  # Daemon modunda çalıştır

# Log çıktısını canlı izle
sudo tail -f /var/log/snort/alert_fast.txt

Snort’u sistem başlangıcında otomatik başlatmak için systemd servisi oluşturalım:

sudo nano /etc/systemd/system/snort3.service
[Unit]
Description=Snort3 NIDS Daemon
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/snort -c /usr/local/etc/snort/snort.lua 
    -i eth0 
    -l /var/log/snort 
    --daq-dir /usr/local/lib/daq
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable snort3
sudo systemctl start snort3
sudo systemctl status snort3

IPS Modunda Çalıştırma

IPS modu için Snort’un inline modda çalışması gerekiyor. Bu, trafiğin Snort üzerinden geçmesi anlamına geliyor. Bunun için NFQ (Netfilter Queue) kullanacağız.

Önce iptables kurallarını ayarlayalım:

# Gelen ve giden trafiği NFQUEUE'ya yönlendir
sudo iptables -I INPUT -j NFQUEUE --queue-num 0
sudo iptables -I OUTPUT -j NFQUEUE --queue-num 0
sudo iptables -I FORWARD -j NFQUEUE --queue-num 0

# Kuralları kaydet
sudo iptables-save > /etc/iptables/rules.v4

Snort’u NFQ modunda başlatın:

sudo snort -c /usr/local/etc/snort/snort.lua 
    --daq nfq 
    --daq-var queue=0 
    -l /var/log/snort 
    --alert-before-pass

IPS modunda kural aksiyonları önem kazanıyor:

alert: Alarm üret ama paketi geçir drop: Paketi düşür ve alarm üret reject: Paketi düşür, kaynağa TCP RST veya ICMP unreachable gönder pass: Paketi geçir, alarm üretme

Local rules dosyanızdaki alert’leri drop’a çevirerek aktif engelleme yapabilirsiniz:

# SSH brute force'u tamamen engelle
drop tcp any any -> $HOME_NET 22 (msg:"SSH Brute Force Engellendi"; 
    threshold:type both, track by_src, count 5, seconds 60; 
    sid:1000010; rev:1;)

Snort Kurallarını Güncelleme

Kendi kurallarınız yeterli değil, topluluk ve ticari kural setlerinden yararlanmanız şart. Snort için iki ana kural kaynağı var.

Snort.org Community Rules – Ücretsiz, herkese açık Talos Intelligence Rules – Snort.org hesabı gerektiriyor, çok daha kapsamlı

# Community rules indir
cd /tmp
wget https://www.snort.org/downloads/community/snort3-community-rules.tar.gz
tar -xzf snort3-community-rules.tar.gz
sudo cp snort3-community-rules/*.rules /usr/local/etc/snort/rules/

# PulledPork ile otomatik güncelleme (kural yönetim aracı)
sudo apt install -y python3-pip
pip3 install pulledpork3

PulledPork yapılandırması için /etc/pulledpork3/pulledpork.conf dosyasını düzenleyin ve oinkcode’unuzu (Snort.org’dan alınan API anahtarı) ekleyin. Sonra cron job ile günlük otomatik güncelleme yapabilirsiniz:

# Crontab'a ekle - her gün saat 03:00'da güncelle
echo "0 3 * * * root /usr/local/bin/pulledpork3 -c /etc/pulledpork3/pulledpork.conf && systemctl restart snort3" 
    >> /etc/cron.d/snort-update

Gerçek Dünya Senaryosu: E-Ticaret Sunucu Koruması

Bir e-ticaret sitesini yönettiğinizi düşünün. Web sunucunuz, veritabanınız ve ödeme sisteminiz var. Aşağıdaki kural seti bu senaryoya özel:

sudo nano /usr/local/etc/snort/rules/eticaret.rules
# Veritabanı doğrudan erişim girişimi (dışarıdan MySQL portuna erişim)
alert tcp $EXTERNAL_NET any -> $HOME_NET 3306 
    (msg:"Dışarıdan MySQL Erişim Girişimi"; 
    sid:2000001; rev:1;)

# XSS saldırısı tespiti
alert tcp any any -> $HOME_NET 443 
    (msg:"XSS Saldırisi Tespit Edildi"; 
    content:"<script>"; nocase; http_client_body; 
    sid:2000002; rev:1;)

# Directory traversal saldırısı
alert tcp any any -> $HOME_NET [80,443] 
    (msg:"Directory Traversal Girişimi"; 
    content:"../"; http_uri; 
    sid:2000003; rev:1;)

# Şüpheli User-Agent tespiti (botlar ve tarayıcılar)
alert tcp any any -> $HOME_NET [80,443] 
    (msg:"Şüpheli Tarayıcı Tespiti"; 
    content:"sqlmap"; nocase; http_header; 
    sid:2000004; rev:1;)

# Ödeme sayfasına aşırı istek (credential stuffing)
alert tcp any any -> $HOME_NET 443 
    (msg:"Ödeme Sayfası Aşırı İstek"; 
    content:"/checkout/payment"; http_uri; 
    threshold:type both, track by_src, count 10, seconds 30; 
    sid:2000005; rev:1;)

Log Analizi ve Monitoring

Snort’un ürettiği logları analiz etmek, alarm yorgunluğunu önlemek için kritik. Ham loglar yerine bir SIEM entegrasyonu kurmanız önerilir ama başlangıç için basit log analizi yeterli.

# Son alarmları göster
sudo tail -100 /var/log/snort/alert_fast.txt

# Belirli bir saldırı türünü filtrele
grep "SSH Brute Force" /var/log/snort/alert_fast.txt | 
    awk '{print $5}' | sort | uniq -c | sort -rn | head -20

# En çok alarm üreten IP'leri bul
grep -oP 'd+.d+.d+.d+' /var/log/snort/alert_fast.txt | 
    sort | uniq -c | sort -rn | head -10

# Alarmları saatlik gruplayarak görüntüle
grep "SQL Injection" /var/log/snort/alert_fast.txt | 
    awk '{print $1, $2}' | cut -d: -f1 | sort | uniq -c

Snort loglarını JSON formatında almak ve Elasticsearch/Kibana’ya göndermek çok daha iyi bir yaklaşım. Snort 3 bunu doğrudan destekliyor:

-- snort.lua içine ekleyin
alert_json =
{
    file = true,
    limit = 100,
    fields = 'timestamp pkt_num proto pkt_len dir src_addr 
               src_port dst_addr dst_port rule action msg'
}

Performans Optimizasyonu

Yüksek trafikli ortamlarda Snort’un performansını optimize etmek gerekiyor. CPU kullanımını ve paket kaybını minimize etmek için şu ayarları değerlendirin:

# Çok çekirdekli işleme için snort.lua ayarı
-- Paralel işleme
packet_io =
{
    read_timeout = 200
}

-- Affinity ayarı (CPU pinning)
thread_config =
{
    instance_thread_affinity = true,
    packet_threads = 4  -- CPU çekirdek sayısına göre ayarlayın
}

Network kartı ayarları da performansı etkiliyor:

# NIC için receive buffer artır
sudo ethtool -G eth0 rx 4096

# Interrupt coalescing ayarla
sudo ethtool -C eth0 rx-usecs 50

# Promiscuous modu aktifleştir (Snort için gerekli)
sudo ip link set eth0 promisc on

Yaygın Sorunlar ve Çözümleri

Snort kurulumu ve yapılandırmasında sık karşılaşılan sorunları şöyle ele alabilirsiniz:

Kural çakışması: Aynı sid’e sahip iki kural varsa Snort başlamaz. grep -r "sid:1000001" /usr/local/etc/snort/rules/ komutuyla kontrol edin.

Yüksek CPU kullanımı: Çok genel kurallar tüm trafiği tarar. Kurallarınızı spesifik tutun, gereksiz content kontrollerinden kaçının.

Paket kaybı: /var/log/snort/ içindeki istatistik dosyalarını kontrol edin. Drop oranı yüksekse thread sayısını artırın veya donanım yükseltmeyi düşünün.

False positive: Yanlış alarm üretimi çok fazlaysa threshold değerlerini artırın veya pass kuralları ekleyin.

# Belirli bir IP'yi whitelist'e al
pass tcp 10.0.0.50 any -> any any (msg:"Whitelist IP"; sid:9000001; rev:1;)

Sonuç

Snort, doğru kurulduğunda ağ güvenliğinizin en güçlü katmanlarından biri haline geliyor. Başlangıçta IDS modunda çalıştırıp logları analiz edin, false positive’leri temizleyin ve kurallarınızı ortamınıza göre ince ayar yapın. Ancak ondan sonra IPS moduna geçin. Aceleci davranıp direkt IPS moduna geçmek, yanlış konfigüre edilmiş kurallarla meşru trafiği bloklayabilir ve ciddi hizmet kesintilerine yol açabilir.

Snort tek başına yeterli değil. Firewall, WAF, log yönetimi ve güvenlik farkındalığı eğitimiyle birlikte katmanlı bir güvenlik mimarisinin parçası olarak değerlendirin. Topluluk kurallarını düzenli güncelleyin ve kendi ortamınıza özgü kurallar yazmayı ihmal etmeyin. En iyi IDS, sizin ağınızı en iyi bilen kişi tarafından özelleştirilmiş olandır.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir