Suricata IDS/IPS Kurulum ve Yapılandırma Rehberi

Ağ güvenliği söz konusu olduğunda, saldırıları tespit etmek ile engellemek arasındaki fark bazen bir sistemin ayakta kalması ile tamamen çökmesi arasındaki fark anlamına gelir. Suricata, bu iki işlevi tek çatı altında birleştiren, yüksek performanslı ve açık kaynaklı bir IDS/IPS motorudur. Snort’un halefi olarak tasarlanan Suricata, çok iş parçacıklı mimarisi sayesinde modern donanımın tüm çekirdeklerini kullanabilir ve gigabit hızlarında trafik analizi yapabilir. Bu yazıda Suricata’yı sıfırdan kurup, gerçek dünya senaryolarına göre yapılandıracağız.

Suricata Nedir ve IDS/IPS Farkı Nedir?

IDS (Intrusion Detection System), ağ trafiğini izleyip şüpheli aktiviteleri tespit ettiğinde sizi uyaran sistemdir. Trafik aktığı sürece müdahale etmez, sadece raporlar. IPS (Intrusion Prevention System) ise bir adım öteye geçerek şüpheli paketleri aktif olarak engeller, bağlantıyı keser.

Suricata her iki modda da çalışabilir:

  • IDS modu: Ağ arayüzünü dinler, kural eşleşmelerini loglar
  • IPS modu: NFQueue veya AF_PACKET ile inline çalışır, paketleri drop edebilir
  • Hybrid mod: Belirli kurallar için IDS, diğerleri için IPS davranışı

Suricata’nın Snort’a göre öne çıkan avantajları şunlar:

  • Çok iş parçacıklı mimari: Snort tek çekirdek kullanırken Suricata tüm CPU çekirdeklerini kullanır
  • Lua scripting: Karmaşık tespit mantığı için Lua desteği
  • Protocol detection: HTTP, DNS, TLS, SSH gibi protokolleri otomatik tanır
  • File extraction: Ağ üzerinden geçen dosyaları diskte saklayabilir
  • EVE JSON logging: Yapılandırılmış JSON logları, SIEM entegrasyonu için ideal

Kurulum

Ubuntu/Debian Üzerinde Kurulum

Suricata’yı doğrudan Ubuntu repolarından kurabilirsiniz, ancak her zaman güncel sürümü almak için OISF’nin kendi PPA’sını kullanmak daha mantıklı.

sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt update
sudo apt install suricata suricata-update -y

Kurulum sonrası sürümü doğrulayalım:

suricata --build-info | head -20
suricata -V

CentOS/RHEL/Rocky Linux Üzerinde Kurulum

sudo dnf install epel-release -y
sudo dnf install suricata -y

# Servis etkinleştirme
sudo systemctl enable suricata
sudo systemctl start suricata

Kaynak Koddan Derleme (Gelişmiş Özellikler İçin)

Eğer Rust tabanlı JIT desteği veya son geliştirmeler gerekiyorsa kaynak koddan derleme yapabilirsiniz:

# Bağımlılıklar
sudo apt install -y libpcre3 libpcre3-dev libpcre2-dev 
  libnetfilter-queue-dev libpcap-dev libyaml-dev 
  libjansson-dev libmagic-dev rustc cargo 
  python3-pip autoconf automake libtool pkg-config

# Kaynak kod
wget https://www.openinfosecfoundation.org/download/suricata-7.0.3.tar.gz
tar xvf suricata-7.0.3.tar.gz
cd suricata-7.0.3

./configure --prefix=/usr --sysconfdir=/etc 
  --localstatedir=/var 
  --enable-nfqueue 
  --enable-lua 
  --enable-geoip

make -j$(nproc)
sudo make install
sudo make install-conf

Kural Güncellemesi

Suricata tek başına bir kural seti ile gelmez; siz hangi kuralları kullanacağınıza karar verirsiniz. suricata-update aracı bu işi kolaylaştırır.

# Mevcut kural kaynaklarını listele
sudo suricata-update list-sources

# Ücretsiz Emerging Threats kurallarını etkinleştir
sudo suricata-update enable-source et/open

# Snort community kuralları (ücretsiz ama kayıt gerekebilir)
sudo suricata-update enable-source snort/community

# Kuralları indir ve güncelle
sudo suricata-update

# Suricata'yı yeniden başlat
sudo systemctl restart suricata

Otomatik kural güncellemesi için cron job ekleyelim:

# /etc/cron.d/suricata-update dosyası oluştur
echo "0 2 * * * root /usr/bin/suricata-update && /usr/bin/systemctl reload suricata" 
  | sudo tee /etc/cron.d/suricata-update

Ana Yapılandırma Dosyası

Suricata’nın kalbi /etc/suricata/suricata.yaml dosyasıdır. Bu dosya oldukça uzun ve karmaşık olabilir, bu yüzden kritik bölümlere odaklanalım.

Ağ Değişkenlerini Tanımlama

vars:
  address-groups:
    HOME_NET: "[192.168.1.0/24, 10.0.0.0/8, 172.16.0.0/12]"
    EXTERNAL_NET: "!$HOME_NET"
    HTTP_SERVERS: "$HOME_NET"
    SMTP_SERVERS: "$HOME_NET"
    SQL_SERVERS: "$HOME_NET"
    DNS_SERVERS: "[192.168.1.1, 8.8.8.8]"
    TELNET_SERVERS: "$HOME_NET"

  port-groups:
    HTTP_PORTS: "80"
    SHELLCODE_PORTS: "!80"
    ORACLE_PORTS: 1521
    SSH_PORTS: 22
    DNP3_PORTS: 20000
    MODBUS_PORTS: 502

HOME_NET değişkeni çok önemli; yanlış ayarlanırsa hem false positive hem de false negative oranı artar. Kendi ağınıza uygun şekilde düzenleyin.

Capture Ayarları

# IDS modu için AF_PACKET (performans için önerilen)
af-packet:
  - interface: eth0
    threads: auto
    cluster-id: 99
    cluster-type: cluster_flow
    defrag: yes
    use-mmap: yes
    ring-size: 200000
    block-size: 32768
    block-timeout: 10
    use-emergency-flush: yes

# Birden fazla arayüz için
  - interface: eth1
    threads: auto
    cluster-id: 98
    cluster-type: cluster_flow

EVE JSON Logging Yapılandırması

outputs:
  - eve-log:
      enabled: yes
      filetype: regular
      filename: /var/log/suricata/eve.json
      pcap-file: false
      community-id: true
      community-id-seed: 0
      types:
        - alert:
            payload: yes
            payload-buffer-size: 4kb
            payload-printable: yes
            packet: yes
            metadata: yes
            http-body: yes
            http-body-printable: yes
            tagged-packets: yes
        - anomaly:
            enabled: yes
            types:
              decode: no
              stream: no
              applayer: yes
        - http:
            extended: yes
        - dns:
            version: 2
        - tls:
            extended: yes
        - files:
            force-magic: yes
        - ssh
        - smtp
        - dnp3
        - ftp
        - rdp
        - nfs
        - smb
        - tftp
        - ikev2
        - krb5
        - ntp
        - dhcp
            enabled: yes
        - http2

IPS Moduna Geçiş

IDS’den IPS’e geçmek için ağ altyapınıza göre iki yaklaşım var: NFQueue ve AF_PACKET inline mod.

NFQueue ile IPS Modu

NFQueue, Linux kernel ile Suricata arasında bir köprü kurarak paketlerin user space’de incelenmesine izin verir.

# Önce iptables kurallarını ayarla
# Gelen trafik için
sudo iptables -I INPUT -j NFQUEUE --queue-bypass
# Giden trafik için
sudo iptables -I OUTPUT -j NFQUEUE --queue-bypass
# Forward edilen trafik için (router/firewall senaryosu)
sudo iptables -I FORWARD -j NFQUEUE --queue-bypass

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

suricata.yaml dosyasında NFQueue ayarını etkinleştirin:

nfq:
  mode: repeat
  repeat-mark: 1
  repeat-mask: 1
  route-queue: 2
  batchcount: 20
  fail-open: yes

Suricata’yı NFQueue ile başlatın:

sudo suricata -c /etc/suricata/suricata.yaml -q 0 --init-errors-fatal

AF_PACKET Inline Modu

Bu mod özellikle iki ağ kartı arasında köprü kuruyorsanız tercih edilir:

sudo suricata -c /etc/suricata/suricata.yaml 
  --af-packet=eth0 
  --af-packet=eth1 
  -D

suricata.yaml içinde inline modu etkinleştirin:

af-packet:
  - interface: eth0
    threads: auto
    cluster-id: 99
    cluster-type: cluster_flow
    copy-mode: ips
    copy-iface: eth1
  - interface: eth1
    threads: auto
    cluster-id: 98
    cluster-type: cluster_flow
    copy-mode: ips
    copy-iface: eth0

Özel Kural Yazımı

Suricata kural sözdizimi Snort ile uyumludur ve oldukça esnek bir yapıya sahiptir.

Temel Kural Anatomisi

Bir kural şu bileşenlerden oluşur:

  • action: alert, drop, pass, reject
  • protocol: tcp, udp, icmp, http, dns, tls vb.
  • src_ip/dst_ip: Kaynak ve hedef IP adresleri
  • src_port/dst_port: Port numaraları
  • direction: -> veya
  • options: Parantez içinde kural seçenekleri
# /etc/suricata/rules/local.rules dosyasını oluşturun

# SSH brute force tespiti
alert tcp $EXTERNAL_NET any -> $HOME_NET 22 
  (msg:"SSH Brute Force Attempt"; 
  flow:to_server; 
  threshold:type threshold, track by_src, count 5, seconds 60; 
  classtype:attempted-admin; 
  sid:9000001; rev:1;)

# Şüpheli User-Agent tespiti
alert http $HOME_NET any -> $EXTERNAL_NET any 
  (msg:"Suspicious User-Agent - SQLMap"; 
  flow:to_server, established; 
  http.user_agent; content:"sqlmap"; nocase; 
  classtype:web-application-attack; 
  sid:9000002; rev:1;)

# DNS tünelleme tespiti (uzun DNS sorguları)
alert dns any any -> any 53 
  (msg:"Possible DNS Tunneling - Long Query"; 
  dns.query; content:"."; 
  byte_test:1,>,50,0,relative; 
  classtype:policy-violation; 
  sid:9000003; rev:1;)

# Cleartext parola iletimi tespiti
alert tcp $HOME_NET any -> $EXTERNAL_NET 21 
  (msg:"FTP Cleartext Password Transmission"; 
  flow:to_server, established; 
  content:"PASS "; 
  classtype:policy-violation; 
  sid:9000004; rev:1;)

Kuralı suricata.yaml içinde tanımlayın:

rule-files:
  - suricata.rules
  - /etc/suricata/rules/local.rules

Kural Testleri

# Kural sözdizimini test et
sudo suricata -T -c /etc/suricata/suricata.yaml -v

# Belirli bir kural dosyasını test et
sudo suricata -T -c /etc/suricata/suricata.yaml 
  -S /etc/suricata/rules/local.rules -v

# PCAP dosyası üzerinde kuralları test et
sudo suricata -r /tmp/test.pcap 
  -c /etc/suricata/suricata.yaml 
  -l /tmp/suricata-test/

Performans Ayarları

Suricata’yı production ortamında verimli çalıştırmak için bazı kritik ayarlar yapmanız gerekir.

# suricata.yaml içinde performans bölümü
threading:
  set-cpu-affinity: yes
  cpu-affinity:
    - management-cpu-set:
        cpu: [ 0 ]
    - receive-cpu-set:
        cpu: [ 0 ]
    - worker-cpu-set:
        cpu: [ "1-7" ]
        mode: "exclusive"
        prio:
          default: "high"
  detect-thread-ratio: 1.0

# Stream reassembly ayarları
stream:
  memcap: 64mb
  checksum-validation: yes
  inline: auto
  reassembly:
    memcap: 256mb
    depth: 1mb
    toserver-chunk-size: 2560
    toclient-chunk-size: 2560
    randomize-chunk-size: yes

# Defrag (IP fragmentation) ayarları
defrag:
  memcap: 32mb
  hash-size: 65536
  trackers: 65535
  max-frags: 65535
  prealloc: yes
  timeout: 60

Sistem kernel parametrelerini de optimize edelim:

# /etc/sysctl.d/99-suricata.conf
cat << 'EOF' | sudo tee /etc/sysctl.d/99-suricata.conf
net.core.rmem_max = 134217728
net.core.rmem_default = 134217728
net.core.netdev_max_backlog = 100000
net.ipv4.tcp_mem = 30000000 30000000 30000000
EOF

sudo sysctl -p /etc/sysctl.d/99-suricata.conf

Log Analizi ve İzleme

Suricata loglarını analiz etmek için birkaç pratik yaklaşım var.

# Son alert'leri göster
sudo tail -f /var/log/suricata/eve.json | 
  python3 -m json.tool | grep -A 10 '"event_type":"alert"'

# jq ile alert'leri filtrele ve formatla
sudo cat /var/log/suricata/eve.json | 
  jq 'select(.event_type=="alert") | 
  {timestamp, src_ip, dest_ip, dest_port, alert: .alert.signature}' | 
  tail -50

# En çok tetiklenen kurallar
sudo cat /var/log/suricata/eve.json | 
  jq -r 'select(.event_type=="alert") | .alert.signature' | 
  sort | uniq -c | sort -rn | head -20

# Belirli bir kaynak IP'nin alert'leri
sudo cat /var/log/suricata/eve.json | 
  jq 'select(.event_type=="alert" and .src_ip=="192.168.1.100")'

Suricata-SC (Stats) İzleme

# İstatistikleri canlı izle
sudo tail -f /var/log/suricata/stats.log

# Performans metriklerini kontrol et
sudo cat /var/log/suricata/eve.json | 
  jq 'select(.event_type=="stats") | 
  {timestamp, 
   capture_kernel_packets: .stats.capture.kernel_packets,
   capture_kernel_drops: .stats.capture.kernel_drops,
   decoder_packets: .stats.decoder.pkts}' | 
  tail -5

Eğer drop oranı %1’in üzerindeyse ciddi performans sorununuz var demektir; ring buffer boyutunu ve thread sayısını artırmanız gerekir.

Suricata ile Gerçek Dünya Senaryoları

Senaryo 1: Web Sunucusu Koruması

Bir web sunucusunun önüne Suricata yerleştiriyorsunuz. Bu durumda HTTP protokolü için özelleştirilmiş kurallar ve DDoS koruma thresholdları gerekir:

# Threshold konfigürasyonu
cat << 'EOF' | sudo tee /etc/suricata/threshold.conf
# HTTP flood - tek IP'den 100 req/saniye
threshold gen_id 1, sig_id 2210002, type limit, track by_src, count 100, seconds 1

# Global HTTP rate limiting
threshold gen_id 1, sig_id 2210003, type both, track by_src, count 200, seconds 10
EOF

suricata.yaml içinde threshold dosyasını tanımlayın:

threshold-file: /etc/suricata/threshold.conf

Senaryo 2: İç Ağ Güvenliği

Kurumsal ağlarda lateral movement ve data exfiltration tespiti kritik öneme sahiptir:

# /etc/suricata/rules/internal.rules

# SMB üzerinde şüpheli dosya erişimi
alert smb $HOME_NET any -> $HOME_NET any 
  (msg:"Possible Ransomware - Mass SMB Write"; 
  flow:to_server; 
  threshold:type threshold, track by_src, count 50, seconds 10; 
  classtype:trojan-activity; 
  sid:9001001; rev:1;)

# DNS over HTTPS bypass girişimi
alert tls $HOME_NET any -> $EXTERNAL_NET 443 
  (msg:"Possible DoH - DNS over HTTPS"; 
  tls.sni; content:"dns.google"; nocase; 
  classtype:policy-violation; 
  sid:9001002; rev:1;)

Senaryo 3: Servis Yönetimi ve Watchdog

Production ortamında Suricata’nın her zaman ayakta olmasını garantilemek için systemd ile doğru yapılandırma şarttır:

# Systemd unit dosyasını özelleştir
sudo systemctl edit suricata

# Eklenecek içerik:
[Service]
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal

Sonuç

Suricata, doğru yapılandırıldığında kurumsal ağların savunma katmanına ciddi bir derinlik katar. IDS modunda başlamak, logları analiz etmek ve false positive oranını düşürdükten sonra IPS moduna geçmek en sağlıklı yaklaşımdır. Bir gecede IPS moduna geçip meşru trafiği bloklamak, güvenlik açığı kadar büyük bir operasyonel problem yaratabilir.

Kural yönetiminde dikkat edilmesi gereken en önemli nokta, kural setini körü körüne aktif etmemek ve kendi ortamınıza özgü local.rules dosyası tutmaktır. Emerging Threats kuralları harika bir başlangıç noktasıdır, ancak her ortamın kendine özgü ihtiyaçları vardır.

EVE JSON loglarını bir SIEM (Elastic Stack, Graylog veya Splunk) ile entegre ettiğinizde Suricata’nın gerçek potansiyelini görürsünüz. Ham log satırlarından korelasyon motorlarına kadar uzanan bu zincir, modern SOC operasyonlarının temelini oluşturur. Suricata’yı sadece kurup unutmayın; düzenli kural güncellemeleri, performans metrikleri takibi ve periyodik kural gözden geçirmeleri bu sistemin sağlıklı çalışmasının garantisidir.

Bir yanıt yazın

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