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.
