IPFIREWALL ve Snort_Inline ile IPS – Part 2: Snort_Inline Kurulumu
Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYDk7HuD' (Errcode: 28 - No space left on device) in /usr/share/nginx/html/syslogs/wp-includes/class-wpdb.php on line 2349
IPFW ve Snort_Inline ile IPS uygulaması ile ilgili olarak http://www.syslogs.org/2008/07/ipfirewall-kurulumu/ linkinden ulaşabileceğiniz bir önceki yazımda ipfirewall kurulumuna ait notları paylaşmıştım. IPS uygulaması için ikinci bölüm olan bu yazıda ise Snort ve doğal olarak snort_inline'la ilgili kurulum notlarını bulabilirsiniz.
SNORT NEDİR ?
Snort, açık kaynak kodlu olarak geliştirilen, network tabanlı bir saldırı tespit ve önleme (network intrusion prevention and detection system) yazılımıdır. Adından da anlaşılacağı üzere kullanım amacı, herhangi bir networke dışarıdan yapılan sızma girişimlerini testip etmek ve önlemektir. Offical dökümanlarında yaptığı temel işleri şu şekilde sıralamışlar:
- Sniffer Mode
Snortu, sadece geçen paketleri izlemek üzere sniffer modda çalıştırabiliyorsunuz. Bu şekilde network aktivitelerini inceleme şansınız oluyor.
- Packet Logger Mode
Paketleri diske loglamak için kullanılan mod.
- Network Intrusion Detection System (NIDS) Mode
Genel geçer kullanım alanı olan, sızma girişimlerini tespit etme modu. Bu modda, snort -yukarıda da belirttiğim gibi- veri akışını analiz ederek daha önceden tanımlanmış kurallarla eşleştirme işlemi yapıp ilgili kurallarda belirtilmiş aksiyonların uygulanmasını sağlıyor.
- Inline Mode
Bu mod ise -ki asıl ilgilendiğimiz konu bu- paketler iptables ya da IPFW üzerinden yönlendirme yapılarak snort'a iletiliyor ve yönlendirilmiş olan bu paketler, gene daha önceden tanımlanmış kurallar uyarınca geçiriliyor ya da drop ediliyor. Yani kendi başına IDS olarak çalışan Snort, inline modunda çalıştırılarak IPS özelliği kazanmış oluyor. Yani sisteme sızma girişimlerini tespit etmekle kalmıyor aynı zamanda bu girişimlere ait paketlerin drop edilmesine olanak sağlıyor.
Şimdi yavaş yavaş uygulama aşamalarına geçelim.
Bir önceki yazıda IPFW kurmuştuk; snort_inline paketleri divert soketi aracılığı ile alan bir yazılım olduğundan dolayı da IPFW kurulumu sırasında IPDIVERT özelliğini de devreye almıştık. Şimdi, kurulum notlarına geçmeden önce, konuyu daha iyi kavrayabilmek için çalışma prensibine teorik olarak değinmek istiyorum. Bu teorik bilgilerin pratikteki karşılıklarına yazının kurulum ve yapılandırma bölümünde değineceğim.
Diyelim ki, elimizde IPDIVERT özelliği aktif edilmiş bir IPFW server var ve bu serverın üzerinde snort_inline çalışıyor. Bu yapıyı kullanarak networkümüze gelen HTTP isteklerinin tümünü snort_inline ile analiz etmek ve kötü amaçlı/içerikli paketlerin networke girişini engellemek istiyoruz. Bu durumda işlem adımları şu şekilde gelişiyor.
1 – Hedef portu 80 olan bir paket networkün giriş kapısı olan IPFW'ye geldiğinde, divert aracılığı ile snort_inline'ın dinlediği porta yönlendiriliyor.
2 – Ilgili porta atılan paket, snort_inline tarafından alınıyor.
3 – Gelen bu paket, gene snort_inline tarafından daha önceden tanımlanmış olan kural setleri ile karşılaştırıyor.
4 – ve aksiyon alıyor. (drop,reject, accept.)
Aksiyonlar şu şekilde işliyor:
Accept: Snort_Inline paketin temiz olduğuna karar verirse, ilgili paketi IPFW'ye geri gönderiyor. IPFW'de inceleme adımlarına bir sonraki kuraldan devam ediyor.
Reject: Networke girmesine izin verilmeyen paket, snort_inline tarafından reject ediliyor ve göndericiye bir TCP reset paketi gönderiyor.
Drop: Paket siliniyor ve IPFW'ye geri gönderme işlemi yapılmıyor.
Bu çalışma prensibine ait aşağıdaki gibi güzel bir şema var. Durumu gözünüzde canlandırmak için ise yarayabilir.
Mevzunun teorik kısmından sonra, şimdi de işin pratik boyutuna bakalım.
KURULUM
Bu bölümde fazlaca detaya girmeden direk olarak kurulum notlarını paylaşacağım. Paketleri divert ile snort_inline'a yönlendirme vs. gibi işlemlere bu bölümden sonra değineceğim.
Bu dökümanın birinci bölümünde IPFW'nin nasıl kurulduğunu ve configure edildidiğini anlatmıştım. Dolayısı ile elinizde üzerinde IPFW çalışmakta olan bir freebsd server olduğunu varsayıyorum.
Snort_Inline'ı kurmak için izleyebileceğiniz iki yol var. Herzamanki gibi ports collectiondan kurulum yapabilir ya da kaynak kodundan derleyerek kurulum yapabilirsiniz. Ben direk olarak kaynak koddan kurulum yaptım. Zira bu şekilde yapmamın sebebi snort_inline'ın son sürümü olan 2.6.1.5'in port edilmiş olmaması. Halihazırda güncel ports collectionunda versiyon 2.4.5 bulunuyor.
Elbette 2.4.5'i de kullanabilirsiniz ancak bu durumda paket analizi sırasında kullanılan rule dosyaları da bu versiyon ile uyumlu -yani eski- olacak. Ben kurmuşken güncell kuralları kullanmak istedim bu nedenle de kaynak kodundan kurulum yaptım. Ama eğer illa porttan kuracağım derseniz (cd /usr/ports/security/snort_inline/ dizinine girip make install clean diyin.)
Neyse, işte kurulum notları:
Kuruluma başlamadan önce, snort_inline'ın ihtiyaç duyduğu libpcre ve libdnet kütüphanelerini sisteme yüklemeniz gerekiyor.
Her ikisi de ports collection'da var olduğundan dolayı aşağıdaki gibi kurabilirsiniz.
# cd /usr/ports/devel/pcre # make install clean # cd /usr/ports/net/libdnet # make install clean
Dependencies olayını hallettikten sonra snort_inline kurulumuna geçelim.
İşte kurulum adımları şöyle:
# http://mesh.dl.sourceforge.net/sourceforge/snort-inline/snort_inline-son-surum.tar.gz # tar xvfz snort_inline-son-surum.tar.gz # cd snort_inline-son-surum/ # ./configure --enable-inline --enable-ipfw # make # make install
Kurulum aşaması bu kadar. Bundan sonraki kısımlar konfigurasyon ile alakalı. Ben deneme kurulumları yaparken snort_inline'ı ports üzerinden de kurdum. Bu şekilde kurulduğu zaman herşey yerli yerinde oluyor. Ancak demin bahsettiğim versiyon problemi nedeni ile yukarıdaki gibi kaynak koddan kurulum yaptığımda /usr/local/etc/rc.d/ altında olması gereken startup betiği oluşturulmamıştı. Bu yüzden manuel olarak oluşturup gerekli izinleri verdim. Belki size de lazım olur diye, betik dosyasının içeriği ve izlediğim yolu aktarayım.
Ilgili betik dosyasının bir kopyası /usr/ports/security/snort_inline/files/ adresinde snort.sh.in ismi ile bulunuyor. Buradaki dosyayı /usr/local/etc/rc.d/ dizini altına kopyalayıp sistem tarafından çalıştırılabilmesi için izin verdim:
# cp /usr/ports/security/snort_inline/files/snort.sh.in /usr/local/etc/rc.d/snort # chmod 555 /usr/local/etc/rc.d/snort
Bu aşamadan sonra dosyanın içeriğinde kendi sisteminize uygun değişklikleri yapmanız gerekiyor. Benim kullandığım şekli ile içerik şu şekilde:
#!/bin/sh # $freebsd: ports/security/snort_inline/files/snort.sh.in,v 1.4 2007/02/26 23:02:04 dougb Exp $ # PROVIDE: snort # REQUIRE: DAEMON # BEFORE: LOGIN # KEYWORD: shutdown # Add the following lines to /etc/rc.conf to enable snort: # snort_enable (bool): Set to YES to enable snort # Default: NO # snort_flags (str): Extra flags passed to snort # Default: -Dq -J 8000 # snort_interface (str): Network interface to sniff # Default: "" # snort_conf (str): Snort configuration file # Default: ${PREFIX}/etc/snort_inline.conf # . /etc/rc.subr name="snort" rcvar=`set_rcvar` command="/usr/local/bin/snort_inline" load_rc_config $name [ -z "$snort_enable" ] && snort_enable="NO" [ -z "$snort_conf" ] && snort_conf="/usr/local/etc/snort_inline.conf" [ -z "$snort_flags" ] && snort_flags="-Dq -J 8100" [ -n "$snort_interface" ] && snort_flags="$snort_flags -i $snort_interface" [ -n "$snort_conf" ] && snort_flags="$snort_flags -c $snort_conf" run_rc_command "$1"
Betik dosyasındaki iki tane onemli alan var:
[ -z "$snort_conf" ] && snort_conf="/usr/local/etc/snort_inline.conf"
Conf dosyası.
[ -z "$snort_flags" ] && snort_flags="-Dq -J 8099"
Snort_Inline'ı çalıştırırken verilen default argümanlar.
CONF DOSYASI
Eğer snort_inline'ı default değerleri ile kullanmak istiyorsanız conf dosyası içeriğinde çok fazla bir değişiklik yapmanıza gerek ancak önemli bir kaç satır var ve değiştirmeniz icap ediyor:
var RULE_PATH /usr/local/etc/snort_inline/rules
Conf dosyasına göz attığınız zaman düzenleyebileceğiniz bir çok variable bulunduğunu görebilirsiniz. Bunlardan birisi de kural setleridir. Kurallar, kurulum aşamasında otomatik oluşturulan dosyalar olmadığı için, snort_inline'ın kullandığınız versiyonuna ait kural dosyalarını Snort'un web sitesinden indirip ilgili path'e atmanız gerekiyor. Kural dosyalarının Free ve paralı versiyonları mevcut. Tam adres: http://www.snort.org/pub-bin/downloads.cgi
include /usr/local/etc/snort_inline/etc/classification.config include /usr/local/etc/snort_inline/etc/reference.config
Kural setlerini indirdiğiniz zaman içerisinde classification ve reference isimli conf dosyaları da gelecek. Bu dosyaları ilgili path'e kopyalamanız gerekiyor. Ayrıca, snort_inline'ı çalıştırdığınız zaman unicode.map isimli bir dosyanın bulunamadığı ile alakalı hata mesajı alabilirsiniz. Bu dosya da snort_inline'ın kurulumu sırasında download ettiğiniz paketin /etc dizininde mevcut. Ordan alıp /usr/local/etc/snort_inline/etc/ dizini altına kopyalamanız yeterli.
config ipfw_reinject_rule: 00150
Snort_Inline'ın çalışma prensibinden bahsederken, temiz olan paketlerin firewall'a geri gönderildiğinden bahsetmiştim. İşte temiz paketlerin IPFW'ye geri gönderilmesi işini snort_inline.conf dosyasındaki bu satır gerçekleştiriyor.
Benim örnek IPFW rule setimde 149 numaralı kural gelen paketlerin snort_inline'a yönlendirilmesini söylüyor. Snort_Inline conf dosyasının bu satırında da temiz paketlerin IPFW'nin 150. kuralına geri gönderilmesini söylüyorum. Bu durumda bu paketler IPFW'nin 150. kuralından itibaren eşleştirme işlemine tabi tutuluyor.
Bu noktada dikkat edilmesi gereken bir konu var. Diyelim ki 149. kuralınızda paketleri snort_inline'a gönderdiniz ve snort_inline.conf dosyasındaki bu satırda, temiz paketlerin 148. kurala geri gönderilmesini belirttiniz. Hal böyle olursa gelen her paket IPFW ve snort_inline arasında birbirine paslanmış olur. Herhangi bir loop durumu oluşturmamak için bu konuya dikkat etmek gerekiyor.
output alert_full: snort_inline-full output alert_fast: snort_inline-fast
Bu satırlar, snort_inline'ın log dosyalarını belirtir. Log dosyaları defaul olarak /var/log dizini altında snort isimli bir klasörün içerisinde oluşturulur. Eğer snort isimli bir dizininiz yoksa hata alırsınız. Bu nedenle bu aşamada ilgili dizini oluşturun.
# mkdir /var/log/snort
Conf dosyası ile ilgili olarak default yapılması gerekenler bu kadar. Ama ben daha gelişmiş bir şekilde kullanmak istiyorum derseniz, ilgili dosyaları enine boyuna inceleyebilirsiniz.
AGRÜMANLAR
Snort'u çalıştırırken kullanılan ve startup betiği içerisinde geçen argümanlardan bahsetmiştim.
[ -z "$snort_flags" ] && snort_flags="-Dq -J 8099"
İlgili flaglar şöyle:
-D = Snort_Inline'ın Daemon modda çalışması için.
-q = Quiet (Sessiz ve derinden)
-J 8099 = Snort_Inline'ın dinleyeceği port. (Bu örnekte 8099 numaralı port. Kendi betik dosyanızda kendi kullanmak istediğiniz portu verebilirsiniz.)
SNORT_INLINE'IN ÇALIŞTIRILMASI
Komut satırından çalıştırmak için kullanılan komut şu şekilde:
# snort_inline -Dq -J 8099 -c /usr/local/etc/snort_inline.conf
Komutu verdikten sonra, netstat -an |grep 8099 dediğiniz zaman aşağıdaki gibi bir çıktı alırsınız.
div4 0 0 *.8100 *.*
Aynı şekilde /var/log/message log dosyasında da snort'un start loglarını görebilirsiniz.
Ayrıca, Snort_Inline'ın açılışta başlaması için -betik dosyasını kendinize göre düzenledikten- sonra /etc/rc.conf dosyasına
snort_enable="YES"
satırını eklemeniz gerekiyor.
Snort_Inline'ı sorunsuz bir şekilde çalıştırdıktan sonra IPFW'den divert ile paket yönlendirme ile ilgili bilgilere ve örneklere değinmek iyi olur.
Normalde netwörkünüze gelen tüm paketleri snort_inline'a yönlendirip taranmalarını sağlayabileceğiniz gibi sadece belli paketleri yönlendirme imkanınız bulunmakta. Hatta bir kaç tane, farklı conf dosyasına bakan ve farklı port dinleyen snort daemon'u da çalıştırıp ilgili paketleri ayrı ayrı daemonlar üzerinde taratabilirsiniz.
Gelen tüm paketleri taramak için IPFW'ye örnek olarak şöyle bir komut girebilirsiniz. Çıktısı aşağıdaki gibi bir kural setimiz olduğunu düşünelim.
00100 allow ip from any to any via lo0 00200 deny ip from any to 127.0.0.0/8 00300 deny ip from 127.0.0.0/8 to any 65000 allow ip from any to any 65535 deny ip from any to any
Bu örnekte, kısaca localhost hariç geri kalan tüm gelen ve giden paketlerin geçişine izin veriyoruz.
Not: Bu yazıyı okuyor iseniz zaten IPFW kural söz dizimlerini ve mantığını biliyorsunuz demektir. Ancak gene de bu konu ile ilgili bilgilere bu yazının birinci bölümü olan IPFW Kurulumu sayfasından erişebilirsiniz.
Şimdi de gelen/giden tüm paketleri snort_inline'ın dinlemekte olduğu 8099 numaralı porta gönderelim. Komut şu şekilde.
# ipfw add 2000 divert 8099 ip from any to any
Bu komut ile tüm paketler snort_inline'a yönlendirilmiş oldu. Şimdi snort_inline tüm paketleri inceliyor ve temiz bulduklarını IPFW'ye geri yolluyor. Temiz olmayanlar ise (kural diziminde geçen aksiyon bölümünden hareketle) drop ediliyor ya da sadece alert veriyor. (/var/log/snort/snort_inline-fast dosyasından takip edebilirsiniz.)
Not: Bu kural seti baz alındığında, snort_inline.conf dosyası içerisinde ki config ipfw_reinject_rule: 65000 yapılmalı ki temiz paketlerin 65000 kuraldan ötürü geçişine izin verilsin.
Bir başka örnek:
Eğer sadece web trafiğini snort_inline'a göndermek isteseydik kural şu şekilde olacaktı.
# ipfw add 2000 divert 8099 ip from any to any 80
Bu durumda, destination'u 80 olan tüm paketler snort_inline'a yönlendirilecek, geri kalanlar ise yönlendirilmeksizin 65000 numaralı kurala iletilecekti. Sadece belli paket çeşitlerini snort_inline'a göndermek istediğiniz zaman, snort_inline.conf dosyasını örneğin sadece web ataklarına karşılık verecek şekilde düzenleyebilirsiniz. Bu durumda snort_inline'ı çok yormamış olursunuz. (Sadece 80. porta gelen istekleri yönlendiriyorsanız, snort_inline'ın SMTP trafiğini analiz eden kurallarını da devreye almanızın pek bir anlamı olmaz.)
Snort_Inline'ın kurulumu ve yapılandırması bu şekilde. Artık IPS'iniz hazır :)
Detaylı bilgi için aşağıda linklerini verdiğim kaynaklara bakabilirsiniz.
Kaynakça:
http://snort-inline.sourceforge.net/ – Snort_Inline ana sayfası
http://freebsd.rogness.net/snort_inline/ – Güzel bir döküman
Bu yazılar da ilginizi çekebilir:
- IPFIREWALL ve Snort_Inline ile IPS – Part 1: IPFW Kurulumu
- FreeBSD Sistemlerde Kurulu Paketlerin Update Edilmesi
- Php4’ten Php5’e Upgrade
- Bandwidth Monitoring – Bandwidthd
- Squid ve IPFIREWALL ile Transparan Proxy Kurulumu
Yorumlar
Trackbacks
Yorumda bulunun.
Freebsd pf bulunan test makinama dokumandaki adımlardan snort kurmak istediginde aşagıdaki gibi hata alıyorum
#./configure –enable-inline
checking libipq.h usability… no
checking libipq.h presence… no
checking for libipq.h… no
configure: error: libipq.h not found …
[Cevapla]
Merhaba,
Bildiğim kadarı ile snort_inline’ı pf ile calistirmaniz mumkun degil.
Ayrica configure sirasinda sadece “./configure –enable-inline” derseniz snort pakerleri iptables’dan (libipq) almak uzere yapilandirilir. –enable-ipfw derseniz divert socket’inden alır ki sizin de bunu yapmaniz lazim. (Yazida bu konu anlatiliyor.)
Bunun disinda snort_inline artik snort’un kendisi ile geliyor sanirim. Yani ekstradan inline modulu kurmaniza gerek olmamasi lazim.
[Cevapla]