«

»

Tem 19 2018

Raspberry ve Snort ile IPS

Her yerde bulunan kablosuz ağlara bağlanırken donanım seviyesinde bir güvenlik katmanı oluşturmak için yapılan bir akademik çalışma neticesinde bu yazı ortaya çıktı. Eylül 2018’de Saraybosna’da UBMK’da sunulan çalışmaya şuradan ulaşabilirsiniz: https://ieeexplore.ieee.org/abstract/document/8566439/

Sistemin özeti şöyle:

Bilgisayarın doğrudan kablosuz ağa bağlanması yerine öncelikle Raspberry Pi (RPi) kablosuz ağa bağlanacak ve bilgisayar da RPi üzerinden internet bağlantısı sağlayacak. RPi üzerinde çalışan Snort ve arkadaşları da, ağın güvenli olmasını sağlayacaklar.

Kullanılan Sistem Bileşenleri

  1. Donanım: Raspberry Pi (Model B Rev 2)
  2. İşletim sistemi: Raspbian GNU/Linux 9.4 (stretch), çekirdek: 4.14.42+
  3. IPS: Snort 2.9.11.1 GRE (Build 268). Kütüphane olarak libcap 1.8.1, PCRE 8.39, ZLIB 1.2.8,
    libnetfilter-queue 1.0.2-2
  4. Güvenlik duvarı: Iptables v1.6.0, netfilter
  5. LOG işleme: Barnyard 2.1.14 (Build 337)
  6. WEB arayüzü: Bristle

Aşağıda sistemin genel görüntüsü verilmiştir. Normalde cihaz üzerinde ekrana ihtiyaç bulunmuyor. Sistemi kurarken faydalanmak üzere bir 7 inçlik HDMI ekran kullandım. Bir de fantezi olsun diye RPi uyumlu Nokia ekran kulandım. Nokia ekran, çok ucuz Çin malı bir ekran. Bu ekranda, cihazın IP adresini yazdırdım ki SSH ile bağlanırken IP aramayayım diye.

Kurulum

RPi işletim sisteminin nasıl kurulacağına girmiyorum burada. Standart işlemler zaten her yerde yazıyor. Özellikle kurulum sırasında problem çıkarabilecek olan birkaç kritik noktaya değineceğim.

Temel Raspbian İşlemleri

Raspbian imajı ilk açıldığında raspi-config uygulaması üzerinden bazı işlemleri yaptım, kısaca burada açıklayayım:

  • ssh bağlantısını enable ettim. GUI olmayacağı için, SSH üzerinden bağlanacağız RPi’ye.
  • Timezone ayarlarını düzenledim. Sistem log’larının sağlam olabilmesi için bu kısım elzem.
  • GUI boot olayını devre dışı bıraktım. Boşu boşuna kaynak tüketmesin, zaten kullanmayacağız. Doğrudan konsolda (CLI boot) açılacak RPi.

Sistem güncellemesini yapalım (ve bunu ara sıra mutlaka tekrarlayalım):

Nokia ekran

Adafruit kütüphanesini kullandım. İlgili Python kodunu aşağıda verdim. Ekranda doğrudan IP adreslerini yazıyor. Önemli bir aşama değil ama işe yarıyor. Ancak kaynak kullanımı çok fazla. %30 civarında işlemci tüketiyor kod bellekte çalışırken. Bu nedenle sürekli güncel bilgi yazdırmak için bellekte tutmak tehlikeli. Ben IP adreslerini yazdırınca kendim sonlandırıyorum uygulamayı.

Betikte psutil modülü import edildiğinden önce onu kuralım ki, arıza yapmasın:

Nokia ekrana IP adresini yazan Python betiği:

Konsoldan kablosuz ağa bağlanma

Bununla ilgili birçok araç var. En kolay kullanılanı bana göre wicd-curses . Bir satır ile kurulumu yapılabiliyor:

Ekran görüntüsü şöyle birşey:

İstenirse, nmcli  diye bir araç ta var, onun da ekran görüntüsü şöyle:

Snort Kurulumu

Bu uygulamada önemli bir kısım, belleğin düşük (512MB) olması nedeniyle, Snort’un varsayılan ayarlarda çalışmaması oluyor. Bunun için SWAP bellek alanı (takas bellek) yapılandırmak gerekiyor. Şu şekilde swap ayarı yaptım:

Snort kurulumu:

Kurulum sırasında local_net değerine bir şey girmeye gerek yok. Denemek için 10.0.0.0/24 girdim ama hiçbir alert üretmedi. Bu değer boş kalınca alert üretiyor.

Snort farklı türde log dosyaları kullanabiliyor. Varsayılan olarak /var/log/snort/  klasörüne yazıyor log’ları. Buradaki dosyanın türüne göre farklı şekilde dosya incelemesi yapılabiliyor. Log dosyasının türünü öğrenmek için şu komut verilebilir:

Üstteki komutun çıktısı, “data” veya “tcpdump capture file” olabilir. Data biçimindeki dosyaları  u2spewfoo <dosya>  şeklinde okuyabiliriz. Tcpdump biçiminde ise, tcpdump -r <dosya> şeklinde okunabilir.

Log dosyası okumayı becerdikten sonra, birkaç tane alert etkinleştirilip log düşüp düşmediğine bakılabilir.

ÖNEMLİ: Bu aşamada Snort IDS modunda çalışıyor. Yani sadece log tutuyor. Trafiğe müdahale etmiyor. IPS moduna geçirme konusu aşağıda.

MySQL kurulumu

Kurulum basit, şöyle:

Raspbian’ın güncel kurulumunda MySQL yapılandırması eskisi gibi olmuyor. root kullanıcısını parola yerine plugin ile yetkilendirmeye çalışıyor. Eğer eskisi gibi olsun istenirse, aşağıdaki işlemlerin yapılması gerekiyor. Kaynak: https://stackoverflow.com/questions/30815971/mariadb-installed-without-password-prompt

Barnyard kurulumu

Snort log’Larını bir veritabanına kaydetmek istersek, bu tarz bir araç gerekiyor. Çünkü Snort normalde dosyaya yazıyor. ok yoğun trafik altında Snort’un log işi ile uğraşmaması, en kolay şekilde halletmesi gerekiyor. Ancak bizim de bu log’ları sorgulamamız ve hatta arayüzden incelememiz gerekiyor. İşte bu iki isteğin bir arada olmasını sağlayan araç, Barnyard. Kurulumu şöyle:

ÖNEMLİ: Aşağıdaki kurulum aşamaları kopyala-yapıştır yapılırsa çalışmayabilir. Çünkü yeni sürümlerde ufak tefek farklılıklar olmaktadır. Lütfen adımları inceleyerek kendi sisteminize göre uyarlayınız.

Barnyard’ı başlangıçta otomatik çalışacak hale getirmek için betik oluşturma konusunda şuradaki doküman işe yarayacaktır: http://computer-outlines.over-blog.com/article-nids-8-snort-boot-time-autorun-123375481.html

Eğer buradaki kurulum komutlarında sorun yaşanırsa, şuradaki doküman da işle yarayacaktır: http://sublimerobots.com/2017/01/snort-2-9-9-x-ubuntu-installing-barnyard2/

Barnyard’ı güzel bir şekilde başlatmak için gerekli satır şöyle:

Bristle kurulumu

Bristle, Snort log’larını veritabanından çekerek web üzerinden sunan bir araç. Ekran görüntüsü şöyle birşey:


Bristle, https://github.com/Ejdamm/bristle adresinden indirilip kurulabilir. Barnyard kurulumu sırasında oluşturulan veritabanı yapısı ile tam uyumlu. Çok detaylı web kullanımı yok ama hiç yoktan iyidir.

Snort’u IPS moduna (Inline) getirme

Burada bridge/routing şeklinde farklı seçenekler bulunmaktadır. Detaya giremeyeceğim, çok uzayacak yoksa. Ben NFQ kullanarak routing modda inline yaptım.Şu kaynağı takip ettim: http://sublimerobots.com/2017/06/snort-ips-with-nfq-routing-on-ubuntu/

İşlemleri aşağıda yazdım. Önce hazırlık:

  • /etc/sysctl.conf  dosyasında forwarding enable et.
  • Interface ayarlarını yap.

Depoda gelen Snort içinde NFQ desteği gelmediğinden, kaynaktan derlemek durumundayız (malesef). Snort’u tar.gz biçiminde indirip, açıp ilgili klasöre girdikten sonra:

snort.conf dosyasında bir satır hatalı geldi, onu düzeltmek gerekti.  /usr/lib/snort_dynamicpreprocessor/  kısmını bulup  /usr/local/lib/snort_dynamicpreprocessor/  olacak şekilde değiştirdim.

Test et (-Q parametresi inline mod için kullanılıyor):

Bu kısım için şurası güzel bir kaynak olabilir: http://sublimerobots.com/2017/06/snort-ips-with-nfq-routing-on-ubuntu/

Snort’u gerçekçi olarak (tets için değil) başlatmak için ilgili satır şöyle:

Trafiği iptables ile inline Snort’a gönderme

Snort’u tek başına inline yapmak yetmiyor, iptables üzerinden de trafiğin Snort’a yönlendirilmesi gerekiyor. Aşağıda benim yaptığım ayarlarda iptables-save  komutunun çıktısı görülmektedir. Wifi tarafındaki (wlan0) ip adresi sürekli değişeceği için, MASQUERADE yapmak gerekiyor.

Benim uygulamada eth0 bacağına statik IP verdim 192.168.0.2/24 şeklinde. Bunun üzerinden bağlanacak cihazlara da aynı ağdan bir IP verip, ağ geçidi olarak 192.168.0.2 verince doğrudan çalışıyor. İstenirse eth0 tarafına IP dağıtmak için dhcp server yapılandırılabilir. Ben yapmadım bunu.

Kablosuz ağa bağlanmak

Eğer bir betik içinden veya herhangi bir nedenle bir ağa otomatik bağlanma ihtiyacı olursa, şu şekilde bir komut ile bu sağlanabilir. Tabii wpa_supplicant kullanılıyorsa. Mesela eduroam bağkantısı için ilgili ayarları  wpa_supplicant.conf  içinde yazarak, otomatik olarak bağlantı yapabiliyorum.

Son Söz

Yukarıda da dediğim gibi, kodlarda mutlaka farklılık olacaktır. Bu işlerle az ilgilenenler zaten kopyala-yapıştır ile yapılamayacağını bilir. Yazıyı okuyup mantığı anladıktan sonra, ufak tüyolara da dikkat ederek, verilen kaynakları da mutlaka inceleyerek kendi sisteminize özel kurulum yapabilirsiniz.

Bad Behavior has blocked 19 access attempts in the last 7 days.