SURICATA Saldırı Tespit Sistemi ve Konfigürasyonları

kadergultekin
6 min readJan 24, 2021

--

Bugün sizlere Suricata kurulu sanal makinemin konfigürasyonlarını nasıl yaptığımı anlatacağım.

Öncelikle ağ üzerinde Suricata çalıştırmak amacıyla yeni bir makine kurduktan sonra makineye biri iç ağ ile iletişim kurması için (enp0s8) diğeri ise Suricata makinemizin ağ üzerindeki trafiği dinleyebilmesi için promiscuous modda (enp0s3) olacak şekilde iki ağ ara yüzü ekledim. Promiscuous mode, bir paketin hedefi neresi olursa olsun aynı subnetteki tüm paketlerin bir kopyasını çalıştığı makinenin üzerine alır.

Şekil 1, Suricata
Şekil 2, Suricata

Suricata kurulumuyla birlikte gelen /etc/suricata/ içindeki suricata.yaml dosyasını kendi ağımıza göre konfigüre etmeye geldi sıra. Konfigürasyon dosyasındaki HOME_NET iç ağı, EXT_NET ise dış ağı ifade eder. Burada iç ağ ve dış ağ için belirleyeceğimiz değerler Suricata kurallarında kullanılacak olan değişkenlerdir. Bu bağlamda yaptığım düzenleme şu şekildedir:

Şekil 3, suricata.yaml

HOME_NET için iç ağlarla iletişim kuran arayüzüm olan enp0s8 arayüzünde kullandığım ip aralığını, EXTERNAL_NET içinse HOME_NET dışındaki tüm ip aralıklarını kullandım.

Daha sonra yine suricata.yaml dosyamızın içindeki çeşitli paket yakalama opsiyonlarını promisc moda aldığım enp0s3 arayüzüne uyumlu olacak şekilde konfigüre ettim:

  • --af-packet[=<device>]: Af-packet, Linux çekirdeğinde yerleşiktir ve akış tabanlı (flow-based) bir yük dengeleyici (load balancer) olarak çalışır. Bu, Suricata'yı 4 AF-PACKET iş parçacığı (thread) için yapılandırırsanız, her iş parçacığının AF-PACKET'in gördüğü toplam trafiğin yaklaşık % 25'ini alacağı anlamına gelir. Suricata, daha önce bahsettiğimiz multi-thread çalışma özelliğini buradan alır.
Şekil 4, suricata.yaml
  • --pcap[=<device>]: Pcap yapılandırması çapraz platformlarda libpcap desteğini kullanabilmemizi sağlar. Libpcap kütüphanesi ise; bazı filtreler kullanarak yakaladığımız paketleri istediğimiz katmandan alabilmemizi sağlar. Suricata, çapraz platformlarda çalışma özelliğini buradan alır.
Şekil 5, suricata.yaml
  • --netmap[=<device>]: Netmap, paket yakalamayı hızlandırmak amacıyla bir çekirdek modülü ve değiştirilmiş NIC (Network Interface Card- Ağ Arayüz Kartı) sürücüleri kullanır. Çekirdek modülü; ring buffer kullanır. Netmap ağ uygulamalarının ring buffer’dan veri çekmesi için kendi API’sine sahiptir. Ücretsiz ve açık kaynaklıdır, Linux ve Free-BSD ile uyumludur. Intel kartlarla 10 Gbit/sn trafiğe kadar paket yakalamayı destekler. Suricata 10 Gbit/sn trafikte dahi verimli çalışabilme yetisini buradan alır.
Şekil 6, suricata.yaml
  • --pfring[=<device>]: Netmap gibi, pfring de bir çekirdek modülü ve değiştirilmiş NIC kullanarak Intel kartlarla 10 Gbit/sn trafiğe kadar paket yakalamayı destekler. pfring yalnızca Intel NIC'lere sahip Linux makinelerde desteklenir. Vanilla adında ücretsiz bir sürümü ve ZC adında ücretli bir sürümü vardır. Suricata 10 Gbit/sn trafikte dahi verimli çalışabilme yetisini buradan alır.
Şekil 7, suricata.yaml

Suricata, ağ üzerindeki trafiğin bir kopyasını üzerinden geçirmekte ve kendi kural listelerine uygun olarak incelemektedir. Suricata kurulumu tamamlandıktan hemen sonra /var/log/suricata/eve.json adresinde bulunan “eve.json” adlı dosyada etkinlikler oluşturmaya başlamaktadır. İster kural tabanlı uyarılar olsun, ister DNS veya HTTP günlükleri olsun, Suricata tarafından oluşturulan tüm veriler eve.json dosyasına gönderilecektir. Suricata yapılandırma dosyasında (/etc/suricata/suricata.yaml) bu dosyaya hangi verilerin gönderileceğini yapılandırılabilip, her veri türü için farklı günlük çıktıları tanımlanabilmektedir.

Suricata loglarını okumak için sık kullandığımız log dosyaları /var/log/suricata/eve.json ve /var/log/suricata/fast.log şeklindeki log dosyalarıdır.

Suricata halihazırda kurulu kural dosyalarıyla birlikte gelir. Kurulu olarak gelen kural dosyaları /etc/suricata/rules klasöründe bulunur. Bu kural dosyalarından bazıları Şekil 8’de görülmektedir.

Şekil 8, Suricata

Suricata’daki bir kural/ imza aşağıdakilerden oluşur:

  • İmza eşleştiğinde ne olacağını belirleyen eylem (action)
  • Kuralın protokolü, IP adreslerini, bağlantı noktalarını ve yönünü tanımlayan başlık (header).
  • Kuralın özelliklerini tanımlayan kural seçenekleri (rule options).

Suricata’da hazır olarak gelen bir kural örneği Şekil 9’daki gibidir.

Şekil 9, /etc/suricata/rules/http-event.rules

Şekil 9’daki örnekte “alert” eylem (action), “http any any -> any any” başlık (header), “msg: …..” şeklindeki kısım ise kural seçeneklerini belirtir (rule options).

Eylem (Action) dört şekilde belirtilebilir: Pass, Drop, Reject, Alert.

  • Pass; gelen paket girilen kural ile eşleşiyorsa paketi kabul eder ve geçirir.
  • Drop; gelen paket girilen kural ile eşleşiyorsa paketi reddeder ve direkt düşürür.
  • Reject; gelen paket girilen kural ile eşleşiyorsa paketi reddeder ve karşı tarafı bilgilendirerek paketi düşürür.
  • Alert; gelen paket girilen kural ile eşleşiyorsa paketi düşürür ve alarm üretir.

Başlık (Header) bilgisi protokolün belirtilmesiyle başlar. Protokolün belirtilmesi gelen paketin hangi kural ile eşleştirileceğini gösterir. Şekil 9’daki örnekteki imza yalnızca paket http protokolüne sahipse eşleşir. Temelde dört çeşit protokol bilgisi kullanılabilir: tcp, udp, icmp ve ip. Bu protokollerin dışında http, ftp, tls, smb, dns, dcerpc, ssh, smtp, imap, msn, modbus, dnp3, enip, nfs, ikev2, krb5, ntp, dhcp protokollerini de kullanmak mümkündür ancak bunların suricata.yaml dosyasında konfigüre edilmiş olmaları gerekmektedir.

Başlık (Header) bilgisi kaynak (source) ve hedef (destination) adreslerin belirtilmesiyle devam eder. “alert http $HOME_NET any -> $EXTERNAL_NET any” örneğini inceleyecek olursak, okun yönüne bağlı olarak; sol taraf kaynak adresi, sağ taraf ise hedef adresi belirtmektedir. Bu örnekte “$HOME_NET” kaynak adresi, “$EXTERNAL_NET” ise hedef adresi ifade etmektedir. Şekil 9’daki örnekte kaynak ve hedef adres olarak “any” ifadesi kullanılmıştır. Bu ifade herhangi bir kaynak ve herhangi bir hedeften gelen paketler ile ilgili işlem yapılabileceği anlamına gelir. Bunun yerine direkt bir IP adresi veya bir IP adres aralığı tanımlanması da mümkündür. Suricata IPV4 ve IPV6 adreslerinin ikisini de desteklemektedir.

Başlık (Header) bilgisi aynı zamanda kaynak (source) ve hedef (destination) port bilgilerini de içermektedir. “alert http $HOME_NET any -> $EXTERNAL_NET any” ifadesini inceleyecek olursak buradaki “any” ifadeleri herhangi bir porttan gelen ve herhangi bir porta yönlendirilebilecek paketleri ifade etmektedir. Benzer şekilde “alert http $HOME_NET any -> $EXTERNAL_NET 80” şeklinde, herhangi bir porttan gelen ve 80 portuna giden paketler ifade edilebilirdi.

Yine başlık (header) bilgisinde gördüğümüz bir diğer ifade yön okudur. Yön oku iki şekilde kullanılabilir: “->” veya “< >”.

Kuralın geri kalanı ise kural seçeneklerinden (rule options) oluşur. Bunlar parantez içine alınır ve noktalı virgülle ayrılırlar. Şekil 9'daki örnekte görüldüğü üzere , (msg: “SURICATA HTTP unknown error”;) şeklinde başlayan ifade kural seçeneklerini belirtmektedir.

Suricata kuralları genel olarak bu şekilde belirlenir. Anlatılanlardan yola çıkarak Suricata’nın çalışma yapısını test etmek üzere /etc/suricata/ altındaki suricata.yaml dosyasındaki tüm hazır kural dosyalarını yorum satırı haline getirerek ve /etc/suricata/rules klasörüne “test.rules” kural dosyasını ekleyerek basit bir test yapabiliriz.

Şekil 10, suricata.yaml

Yeni kural dosyasını oluşturduktan sonra test.rules dosyasına örnek bir Suricata kuralını aşağıdaki gibi ekledim.

Şekil 11, test.rules

Bu aşamadan sonra kuralın doğru yazıldığından emin olmak ve yüklenmesini sağlamak için “suricata -c /etc/suricata/suricata.yaml -i enp0s3” komutunu çalıştırdım.

Şekil 12, Suricata

Yazdığım kural ağda ping sezdiğinde bunun loglanmasını sağlayacak. Denemek için başka bir makineden ping attım.

Yazılan Suricata kuralına bağlı olarak /var/log/suricata/fast.log üzerinden alınan log aşağıdaki gibidir.

Şekil 13, Suricata

Kural çalıştı ve icmp akışı loglandı.

Suricata çok daha gelişmiş konfigürasyonlarla çok daha faydalı kullanılabilir. Ben sadece basit bir örnek verdim. Umarım faydalı ve keyifli olmuştur.

--

--

kadergultekin

Karadeniz Teknik Üniversitesi Bilgisayar Mühendisliği mezunuyum. Beraber eğlenip beraber gelişmeyi hedefliyorum.