Snort IDS Kurulum Rehberi ve Özel Kural Yazma

Ağ güvenliğinde saldırı tespit sistemleri (IDS), bir güvenlik mimarisinin olmazsa geçemeyeceği parçalardan biri. Snort, bu alanda yıllardır açık kaynak dünyasının referans noktası olmaya devam ediyor. Cisco tarafından desteklenen bu araç, hem hafif kurulumu hem de esnek kural yapısıyla küçük home lab’lerden kurumsal ağlara kadar geniş bir yelpazede kullanılıyor. Bu yazıda Snort’u sıfırdan kuracağız, temel yapılandırmayı yapacağız ve gerçek dünya senaryolarına uygun özel kurallar yazacağız.

Snort Nedir ve Nasıl Çalışır

Snort, ağ trafiğini gerçek zamanlı olarak analiz eden, paket koklama (packet sniffing), protokol analizi ve içerik eşleştirme yeteneklerine sahip bir IDS/IPS çözümüdür. Üç temel modda çalışabilir:

  • Sniffer Modu: Sadece paketleri okuyup ekrana yazdırır, herhangi bir analiz yapmaz
  • Packet Logger Modu: Paketleri diske kaydeder, sonradan inceleme için kullanılır
  • Network Intrusion Detection Modu: Asıl güç burada, tanımlı kurallara göre trafiği analiz eder ve uyarı üretir

Snort mimarisi üç ana bileşenden oluşur. Önce paket yakalama katmanı (libpcap) trafiği alır, ardından preprocessor’lar bu trafiği normalize eder ve son olarak detection engine kurallarla eşleştirme yapar.

Kurulum Öncesi Hazırlık

Ubuntu 22.04 LTS üzerinde anlatacağım, ancak adımların büyük çoğunluğu Debian tabanlı sistemlerde aynı şekilde çalışır. Önce sistemi güncelleyelim ve gerekli bağımlılıkları yükleyelim.

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

Snort 3 (Snort++) modern mimarisiyle birlikte bazı ek bağımlılıklar gerektiriyor. Önce DAQ (Data Acquisition) kütüphanesini kuralım:

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 Kurulumu

DAQ kurulumu tamamlandıktan sonra Snort’un kendisini derliyoruz. Kaynak koddan derleme biraz zaman alıyor ama paket yöneticisinden gelen eski sürümler yerine güncel sürümü kullanmak her zaman tercih edilmeli:

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

Kurulum başarılı mı kontrol edelim:

snort --version

Çıktıda Snort++ 3.1.74.0 gibi bir şey görmeniz gerekiyor. Görmediyseniz büyük ihtimalle ldconfig çalışmamış ya da PATH ayarlarında sorun var demektir.

Temel Yapılandırma

Snort 3 ile birlikte yapılandırma dosya formatı da değişti. Lua tabanlı yeni config sistemi çok daha okunabilir. Ana yapılandırma dosyamızı oluşturalım:

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

sudo cp /tmp/snort3-3.1.74.0/etc/snort/snort.lua /etc/snort/
sudo cp /tmp/snort3-3.1.74.0/etc/snort/snort_defaults.lua /etc/snort/

Şimdi snort.lua dosyasını düzenleyelim. En kritik kısım HOME_NET ve EXTERNAL_NET tanımlamaları:

sudo nano /etc/snort/snort.lua

Dosya içinde şu satırları bulup düzenliyoruz:

-- Network değişkenlerini kendi ortamınıza göre ayarlayın
HOME_NET = '192.168.1.0/24'
EXTERNAL_NET = '!$HOME_NET'

-- Kural dosyalarının yolu
RULE_PATH = '/etc/snort/rules'
BUILTIN_RULE_PATH = '/etc/snort/builtin_rules'

Snort Topluluk Kurallarını İndirmek

Kendi kurallarımızı yazmadan önce topluluk kurallarını indirelim. Bu kurallar binlerce bilinen saldırı imzası içeriyor:

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/snort3-community.rules /etc/snort/rules/

Snort’un bu kuralları okuduğunu doğrulayalım:

sudo snort -c /etc/snort/snort.lua --plugin-path /usr/local/lib 
    -R /etc/snort/rules/snort3-community.rules 
    --daq-dir /usr/local/lib/daq 
    -T

-T parametresi test modunda çalıştırır, herhangi bir ağ arayüzüne dokunmaz. Sonunda Snort successfully validated the configuration mesajını görürsünüz.

Ağ Arayüzünü Yapılandırma

IDS olarak çalışacak arayüzü promiscuous mode’a almamız gerekiyor. Bu sayede Snort sadece kendi MAC adresine gelen değil, o segmentteki tüm trafiği okuyabilir:

# Arayüzünüzü öğrenin
ip link show

# eth0 için promiscuous mode
sudo ip link set eth0 promisc on

# Kalıcı hale getirmek için systemd-networkd veya rc.local kullanın
echo 'ip link set eth0 promisc on' | sudo tee -a /etc/rc.local
sudo chmod +x /etc/rc.local

Kural Yazma: Temelden İleriye

Snort kural sözdizimi oldukça mantıklı bir yapıya sahip. Genel format şu şekilde:

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

İlk basit kuralımızı yazalım. ICMP ping saldırılarını tespit eden bir kural:

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

# Harici ağdan SSH bağlantı denemesi
alert tcp $EXTERNAL_NET any -> $HOME_NET 22 
    (msg:"SSH Baglanti Denemesi Tespit Edildi"; 
    flags:S; sid:1000002; rev:1;)

Kural parametrelerini açıklayalım:

  • msg: Uyarı mesajı, log’da görünecek olan açıklama
  • sid: Snort ID, her kural için benzersiz olmalı, 1000000 altı numaralar Snort’a ayrılmış
  • rev: Kural revizyonu, kural güncellendiğinde artırılır
  • flags: TCP flag’leri, S = SYN paketi
  • itype: ICMP paket tipi, 8 = Echo Request (ping)

Gerçek Dünya Senaryosu 1: Port Tarama Tespiti

Nmap ve benzeri araçlarla yapılan port taramalarını tespit etmek, ağ güvenliğinin temel konularından biri. Snort’ta bunu birkaç farklı yöntemle yakalayabiliriz:

# SYN tarama tespiti - kısa sürede çok fazla SYN paketi
alert tcp $EXTERNAL_NET any -> $HOME_NET any 
    (msg:"Potansiyel Port Tarama - SYN Flood"; 
    flags:S,!APSRFU; 
    threshold:type threshold, track by_src, count 20, seconds 5; 
    sid:1000010; rev:2;)

# NULL tarama - hiçbir flag yok
alert tcp $EXTERNAL_NET any -> $HOME_NET any 
    (msg:"TCP NULL Tarama Tespit Edildi"; 
    flags:0; 
    sid:1000011; rev:1;)

# XMAS tarama - FIN+PSH+URG flag'leri aynı anda
alert tcp $EXTERNAL_NET any -> $HOME_NET any 
    (msg:"TCP XMAS Tarama Tespit Edildi"; 
    flags:FPU; 
    sid:1000012; rev:1;)

threshold direktifi özellikle önemli. Tek bir SYN paketi alarm verirse çok fazla false positive alırsınız. 5 saniye içinde aynı kaynaktan 20 SYN paketi geldiğinde alarm vermek çok daha anlamlı.

Gerçek Dünya Senaryosu 2: Web Uygulama Saldırıları

SQL injection ve XSS gibi web uygulama saldırılarını Snort ile tespit etmek mümkün. HTTP trafiği içinde zararlı içerik arayacağız:

# SQL Injection tespiti - temel imzalar
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS 
    (msg:"SQL Injection Denemesi Tespit Edildi"; 
    flow:to_server,established; 
    http_uri; 
    content:"UNION SELECT"; nocase; 
    sid:1000020; rev:3;)

# XSS denemesi
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS 
    (msg:"XSS Saldiri Denemesi"; 
    flow:to_server,established; 
    http_uri; 
    content:"<script>"; nocase; 
    sid:1000021; rev:2;)

# Directory Traversal
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS 
    (msg:"Directory Traversal Denemesi"; 
    flow:to_server,established; 
    http_uri; 
    content:"../"; 
    content:"etc/passwd"; 
    sid:1000022; rev:1;)

flow:to_server,established direktifi çok kritik. Bu, sadece kurulu bağlantılarda sunucuya giden paketleri analiz eder. Hem performansı artırır hem de false positive oranını düşürür.

Gerçek Dünya Senaryosu 3: Brute Force Saldırısı Tespiti

SSH ve FTP brute force saldırıları en yaygın karşılaşılan saldırı vektörlerinden biri. Threshold kullanarak bu saldırıları tespit edebiliriz:

# SSH Brute Force - 60 saniyede 5'ten fazla başarısız deneme
alert tcp $EXTERNAL_NET any -> $HOME_NET 22 
    (msg:"SSH Brute Force Saldirisi"; 
    flow:to_server,established; 
    content:"SSH"; 
    threshold:type both, track by_src, count 5, seconds 60; 
    sid:1000030; rev:2;)

# FTP login denemesi
alert tcp $EXTERNAL_NET any -> $HOME_NET 21 
    (msg:"FTP Brute Force Denemesi"; 
    flow:to_server,established; 
    content:"USER"; 
    threshold:type both, track by_src, count 10, seconds 30; 
    sid:1000031; rev:1;)

Snort’u Test Etme

Kurallarınızı yazdıktan sonra mutlaka test edin. Önce syntax doğrulaması:

sudo snort -c /etc/snort/snort.lua 
    -R /etc/snort/rules/local.rules 
    -T -q

Gerçek trafik üzerinde test için tcpreplay ile kayıtlı pcap dosyaları kullanabilirsiniz:

# Canlı arayüzde çalıştır
sudo snort -c /etc/snort/snort.lua 
    -R /etc/snort/rules/local.rules 
    -i eth0 
    -l /var/log/snort 
    -A alert_fast 
    --daq-dir /usr/local/lib/daq

# Pcap dosyası üzerinde test
sudo snort -c /etc/snort/snort.lua 
    -R /etc/snort/rules/local.rules 
    -r /tmp/test_traffic.pcap 
    -l /var/log/snort 
    -A alert_fast

Çalıştırma parametreleri:

  • -c: Yapılandırma dosyası yolu
  • -R: Kural dosyası yolu
  • -i: Dinlenecek ağ arayüzü
  • -l: Log dizini
  • -A alert_fast: Hızlı alert formatı, her uyarı tek satır
  • -r: Pcap dosyasından okuma modu
  • -q: Sessiz mod, gereksiz çıktıları bastırır

Systemd Servis Olarak Çalıştırma

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

sudo nano /etc/systemd/system/snort3.service
[Unit]
Description=Snort3 IDS Servisi
After=network.target
Wants=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/snort 
    -c /etc/snort/snort.lua 
    -R /etc/snort/rules/local.rules 
    -R /etc/snort/rules/snort3-community.rules 
    -i eth0 
    -l /var/log/snort 
    -A alert_fast 
    --daq-dir /usr/local/lib/daq 
    -D
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5
User=root

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

Log Analizi ve Uyarıları İzleme

Snort loglarını düzgün okumayı öğrenmek, IDS’in gerçekten işe yaraması için şart. Alert fast formatındaki log çıktısı şöyle görünür:

# Canlı log takibi
sudo tail -f /var/log/snort/alert_fast.txt

# Belirli bir kurala ait uyarıları filtrele
grep "SSH Brute Force" /var/log/snort/alert_fast.txt | wc -l

# Kaynak IP'ye göre sırala
grep "Port Tarama" /var/log/snort/alert_fast.txt | 
    awk '{print $3}' | sort | uniq -c | sort -rn | head 20

Daha gelişmiş log analizi için Barnyard2 veya doğrudan Elasticsearch entegrasyonu kullanabilirsiniz. Ancak başlangıç için grep ve awk gayet yeterli.

False Positive Yönetimi

Her IDS’in en büyük sorunu false positive’ler. Bir kural gereğinden fazla alarm üretiyorsa iki seçeneğiniz var: kuralı daha spesifik hale getirmek ya da güvenilen kaynakları beyaz listeye almak.

# Threshold ile false positive azaltma - 10 saniyede 1 uyarı üret
alert tcp $EXTERNAL_NET any -> $HOME_NET 22 
    (msg:"SSH Baglanti"; 
    flags:S; 
    threshold:type limit, track by_src, count 1, seconds 10; 
    sid:1000040; rev:1;)

Belirli IP adreslerini suppress listesiyle susturmak için threshold.conf dosyası oluşturabilirsiniz:

sudo nano /etc/snort/threshold.conf
# 192.168.1.100 IP'sinden gelen SSH alarmlarını sustur
suppress gen_id 1, sig_id 1000002, track by_src, ip 192.168.1.100

# Monitoring sunucusundan gelen tüm ICMP alarmlarını sustur
suppress gen_id 1, sig_id 1000001, track by_src, ip 10.0.0.5

Performans İpuçları

Snort yüksek trafik ortamlarında kaynak tüketimi konusunda dikkatli davranılması gereken bir araç. Birkaç pratik önerim:

  • CPU Pinning: Snort’u belirli CPU core’larına bağlamak için taskset kullanın, özellikle çok çekirdekli sistemlerde büyük fark yaratır
  • Ring Buffer: Libpcap yerine AF_PACKET socket kullanmak paket kaybını önemli ölçüde azaltır
  • Kural Optimizasyonu: Kullanmadığınız kural kategorilerini devre dışı bırakın, topluluk kurallarının hepsini aktif tutmak gereksiz yük oluşturur
  • Preprocessor Seçimi: Sadece ortamınızda bulunan protokoller için preprocessor aktif edin, gereksiz HTTP analizi sunucuyu yorar
# AF_PACKET ile çalıştırma - daha düşük gecikme
sudo snort -c /etc/snort/snort.lua 
    -R /etc/snort/rules/local.rules 
    -i eth0 
    --daq afpacket 
    --daq-var buffer_size_mb=128 
    -l /var/log/snort 
    -A alert_fast

Sonuç

Snort, doğru yapılandırıldığında ve iyi yazılmış kurallarla desteklendiğinde ağınızdaki anormal aktiviteleri tespit etmekte gerçekten güçlü bir araç. Ancak IDS’i kurup bırakmak değil, sürekli geliştirmek gerekiyor. Kurallarınızı düzenli güncelleyin, false positive oranını takip edin ve logları aktif olarak izleyin.

Snort’u tek başına bir güvenlik çözümü olarak görmemek lazım. Firewall, SIEM ve diğer güvenlik katmanlarıyla birlikte çalıştığında gerçek değerini ortaya koyuyor. Bir sonraki adım olarak Barnyard2 ile Snort loglarını MySQL’e aktarıp Snorby gibi bir dashboard üzerinden görselleştirmeyi ya da Elasticsearch-Logstash-Kibana stack’iyle entegrasyonu deneyebilirsiniz. Ağ güvenliği katan katan inşa edilen bir disiplin, sabırlı olmak şart.

Bir yanıt yazın

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