bogofilter İle Olasılıksal SPAM Filtreleme

0
FZ
Paul Graham 2002 yılı Ağustos'unda yazdığı makalede spam filtrelemede Bayes Teoremi'nin (Öznel Olasılık Teorisi) kullanılabilirliğine değinerek SPAM e-posta (email) ile savaş konusunda yeni bir akımı başlatmış oldu.

Graham'a göre aldığımız her email'e içerdiği kelimeler - mesaj başlığındakiler (header) de dahil olmak üzere- incelenerek 0 ile 1 arasında bir spam skoru atamak mümkün. Bu sayının hesaplanabilmesi için öncelikle size gelen çok sayıda spam ve spam olmayan emailin ayrı ayrı incelenmesi gerekiyor. Bu inceleme sonucunda eğer belli bir kelimeye sadece spam olan emaillerde rastlanıyorsa o kelimeyi göreceğiniz bir sonraki emailin de spam olma olasılığı çok yüksek olacaktır. Aynı mantıktan yola çıkarak, büyük bir çoğunlukla gerçekten okumak istediğiniz emaillerde rastlanan kelimelerin gelecekte de spam içermeyen emaillerde görülmesi beklenir. Bu anlattıklarımızın iyice yerleşmesi için birkaç örnek verelim:
Aynı iş yerinde çalıstığınız bir arkadaşınızın size gönderdiği emaillerde header (başlık) içinde arkadaşınızın email adresi bulunacaktır. Her ne kadar yüzde yüz garanti olmasa da (spamciler her gün yeni yöntemler geliştiriyorlar) büyük ihtimalle bu adresten gelen emaillerin hepsi normal emailler olacaktır. Aynı şekilde başlığı veya içinde bize "bedava mp3ler" veya "nijerya'dan 10 milyon dolar" sözü veren bir emailin spam olmayabileceğini düşünmek için hayatında ilk defa iki gün önce Internet'e girmiş olmak gerekir.

Bu sistemin düzgün çalışabilmesi için daha önce belirttiğim gibi çok sayıda emailin incelenip bu emaillerde geçen her kelimeye ortalama olarak bir skor verilmesi gerekmektedir. Bu şekilde tek bir kelimenin bir emailin spam olup olmadığını belirlemede tek başına aşırı bir etkisi olması da engellenmiş olur. Bunu da bir örnekle açıklayalım. Diyelim ki her gün bir yerden "Bedava DVD" diye bas bas bağıran emailler alıyorsunuz. Eğer günün birinde daha önce bahsettiğimiz iş arkadaşınız size bir email gönderip size gerçekten "Bedava DVD" haberi veriyorsa normalde spam skoru yüksek olan bu ifade, normalde spam olmama skoru yüksek olan arkadaşınızın email adresi ile birbirini dengeleyecektir. Aynı şekilde sadece size adınızla hitap edildi diye açık açık spam olan emailleri de sorgusuz sualsiz kabul etmeniz engellenecektir.

Bayes yöntemiyle filtrelemenin en büyük avantajlarından biri yanlış alarm (spam olmayan emaillerin spam olarak algılanması) ihtimalini ortadan kaldırmasidır. Graham'ın da işaret ettiği gibi spam göndermeyi meslek edinmiş kimseler bizim kullanacağımız her türlü spam karşıtı sistemin bir zayıf noktasını er geç bulacaklardır. Fakat onlar da her ne olursa olsun emaillerinde satmak istedikleri içeriği bize ulaştırmak zorundadırlar. İşte bu içerik Bayes teoremini sayesinde spamcilerin kendilerini ele vermelerine sebep olmaktadır. Siz de kabul edersiniz ki email programınızı açıp şöyle bir baktığınız anda hangi mesajların spam hangilerinin düzgün email olduğunu anlamak çocuk oyuncağıdır. Eğer para verip bu işi yapacak birini tutsak hiç bir problemimiz kalmayacak. Birçok kişi için bu çok pratik bir çözüm olmayacağı için onun yerine tam da bu işi yapacak bir program kullanacağız. Bu program bizim adımıza spam emailleri ayırt etmeyi öğrenecek ve özel sekterimiz gibi emaillerimizi tarayıp spam olanları bir kenara ayıracak. Yine bu zaten uzattığım örneğe ilave olarak eğer bizim adımıza emaillerimizi kontrol eden program bir hata yaparsa, tekrar aynı hatayı yapmamasını öğreteceğiz. Bu şekilde ögrenerek ilerleyen spam tarayıcımız kısa bir süre sonra spame geçit vermeyen bir duvara dönüşecek.

Geçtiğimiz aylarda Graham'in makalesinden ilham alan birçok programcı Bayes Olasılık Teorisini esas alan spam tarayıcı programlar yazıp yayınladılar. Biz bu makalemiz çerçevesinde Açık Kaynak Kodu (Open Source - ki bu Serbest Yazılım ile benzer ve fakat farklı bir akımdır) akımının öncülerinden Eric Raymond'un yazdığı 'bogofilter' adlı programı inceleyeceğiz. Diğer bütün programlar arasından bogofilter'i seçmemizdeki en büyük etken, bu programın hızlı çalışmaya yönelik dizayn edilmiş olmasıdır. Bu hızı sağlamak için Raymond programi C programlama dilinde yazmış ve diğer programların aksine basit bir metin dosyasını veritabanı olarak kullanmak yerine BerkeleyDB adlı veritabanı sistemini kullanmış. Madem ki hızlı diye bogofilter'i seçtik, email programı olarak da hızlı bir ürün seçmek lazım. Bu yüzden bu makalede bogofilter'ın benim şahsi favorim olan Sylpheed (teknik olarak Sylpheed-Claws) email programı ile entegre edilmesini ele alacağiz. Tabi ki siz makaleyi kendi tercih ettiğiniz programa uyarlayarak benzer sonuçları kolayca elde edebilirsiniz.

bogofilter Kurulumu

Dilerseniz artık kolları sıvayıp bogofilter'i bir kuralım. Kurulumu gayet kolay bir paket olan bogofilter'i kaynak kodundan kendiniz derleyebileceğiniz gibi muhtelif Linux sürümleri ve FreeBSD için olan hazır paketleri de kullanabilirsiniz. En son sürüm'ün RedHat tabanlı Linux sürümleri için RPM paketi, Debian için .deb ve Gentoo için .ebuild 'i mevcut.

Eğer kaynak kodundan derlemeyi tercih ederseniz tek yapmanız gereken kaynak paketini geçici bir dizin'e indirip arşivi açmak. Daha sonra da bu arşivi açtığınız dizin içinde "root" kullanıcı olarak ./configure && make && make install yapmanız yeterli. Eğer daha önce Unix/Linux uzerinde kaynak kodundan bir program derlediyseniz bogofilter'i derlerken hiç zorluk çekmeyeceğinizden eminim. Eğer bu konuda acemiyseniz ya yukarıda bahsettiğim hazır paketlerden birini indirin ya da sizden daha tecrübeli bir arkadaşınızdan yardım isteyin.

Eğer kurulum aşamasında herşey yolunda gittiyse programın çalıştırılabilir dosyaları /usr/bin dizinine kopyalanmış olacak. Buna ilaveten bir de /etc dizini altında bir konfigürasyon dosyası oluşturulacak ama bu dosyaya dokunmanıza gerek yok.

bogofilter'ın Eğitilmesi

bogofilter da diğer Bayes tabanlı spam tarayıcılar gibi geçmişte gözlenmiş olasılık değerlerini esas alarak çalışır. Bu yüzden daha yeni kurulmuş haliyle bogofilter'ın çok faydalı olamayacağı açıktır. bogofilter'ı kullanabilecek hale gelmemiz için geçmişte bize ulaşmış bir spam email arşivine ihtiyacımız var. Aynı şekilde bir de spam olmayan emailler kümesi lazım ki bogofilter'a geçmişte bize gelmiş emaillerden hangileri spam hangileri ise düzgün bir ıçeriğe sahip ögretebilelim. Eğer bogofilter kurmadan önce emaillerinizi (spam veya bütün emailları) siliyordu iseniz, bogofilter'dan ilk birkaç gün tad alamayabilirsiniz. Her halükârda yapılması gereken spam olan ve olmayan emailler olarak iki grup oluşturmak ve bunları ayrı birer dizinde biriktirmek. Ben şahsen Sylpheed içinde iki tane ilave dizin oluşturdum ve bunlara SPAM ve NONSPAM isimlerini verdim. Burada asıl olan spam dediğimiz dizinde her zaman sadece spam içerikli emailler, ve spam değil dediğimiz dizinde de her zaman sadece spam olMAyan emaillerin bulunması. Yani eğer normal email dizinize gelen spamleri her seferinde siliyorsanız o zaman bir NONSPAM dizini oluşturmadan bu temiz dizini kullanabilirsiniz. (Fakat artık spamleri de silmeyip SPAM dizinine taşıyın ki bogofilter'a çalışma malzemesi olsun :P ).

İdeal olarak başlangıçta her iki dizinimizde de en az 100 email bulunmalı. Ben şahsen 100 tane spam email bulmakta hiç zorlanmadım, kimsenin de bu konuda bir sorunla karşılaşacağını sanmiyorum. Bu gibi durumlar için Internette binlerce spam içeren text dosyaları bulmak mümkün. Fakat ben şahsen bunların kullanılmasına karşıyım. Çünkü bogofilter'ın güzelliklerinden biri programın size gelen spamleri inceleyerek spam taramayı öğrenmesi. Başkasının spam dediği bir emaili belki siz okumak isteyebilirsiniz. Mesela haftalık haber sitelerine kendi istekleriyle abone olan birçok kişi bir süre sonra sıkılıp bu emailleri bir daha almak istemediğinde gidip üyeliğini iptal etmek yerine bu emailleri spam olarak şikayet etme yoluna gidebiliyor. Bu yüzden sadece size gelen emailleri içeren bir veritabanını oluşturmanızda fayda var.

Normal bir kurulumda bogofilter goodlist.db (iyi kelimeler listesi) ve spamlist.db (spam kelimeler listesi) adlı iki tane veritabanı dosyasına ihtiyaç duyuyor. Bu dosyaların kullanıcının kendi ev (home) dizini altında oluşturulacak '.bogofilter' adlı bir dizin altına koyulması gerekiyor ama bu dosyaları ayrı olarak oluşturmanıza gerek yok. bogofilter'i eğitirken bu dosyalar da zaten kendiliklerinden oluşacaklar. Şimdi ilk olarak bogofilter'a spam olasılığı yüksek olan kelimeleri öğretelim. Bunu yapabilmemiz için komut satırına geçip az önce Sylpheed içinde oluşturup spam mesajlarla doldurduğumuz SPAM dizinine gitmemiz gerekiyor. Sylpheed'in normal kurulumu emailleri kullanıcınin ev dizini içinde "Mail" adli bir dizinde tutuyor. Bu dizin içinde bütün emailleriniz her biri ayrı bir dosya olacak şekilde saklanıyor. Bu dosyalara Sylpheed'in onlara ulaşabileceği şekilde birer numara veriliyor. Oluşturduğumuz SPAM dizini aşağıdaki şekilde görünmeli:

grog oktay # cd ~/Mail/SPAM grog SPAM # ls 1 108 117 126 135 144 153 162 171 180 19 199 26


Bu spam mesajlarin her birini bogofilter komutunu kullanarak spam olarak işaretleyip spamlist.db veritabanına ekleyeceğiz. Daha öncede belirttiğim gibi emaili email yapan bütün kelimelerin işaretlenmesi gerekiyor. Buna mesajın başlık kısmı (header), bütün email adresleri ve mesajın kendisi de dahil. Spam olarak işaretlemede '-s' seçeneği kullanılıyor. Uygulanan Bayes yönteminde mesaj sayısının bir etkisi olmadığından bu işlemi iki farklı şekilde yerine getirmek mümkün.

Aşağıdaki komut dizindeki bütün mesajları bogofilter'a bir anda yüklemeye yarıyor. Kullanılan '-v' seçeneği sadece komutun biraz daha fazla detay göstererek çalışması için eklenmiştir.

grog SPAM # cat * | bogofilter -s -v # 93861 words, 3 messages
İkinci yol olarak da her mesajı tek tek yüklemeyi görelim.

grog SPAM # for i in *; do echo \#$i No'lu Email Ekleniyor ; bogofilter -s -v < $i ; done; 
Processing Mail ID #1 
# 279 words, 1 message 
Processing Mail ID #10 # 113 words, 1 message 
Processing Mail ID #100 # 498 words, 1 message 
Processing Mail ID #101 # 685 words, 1 message 
Processing Mail ID #102


Hangi yöntemi seçerseniz seçin sonuç aynı olacak ve .bogofilter dizini ve onun içinde spamlist.db dosyası oluşacaktır. Bu bir veritabanı dosyası olduğundan basit bir metin dosyası gibi erişmeye çalışmayınız. Aynı adımları NON-SPAM dizininde tekrarlayarak spam olmayan emailleri de veritabanına ekleyin. Yalnız spam emaillerden farkli olarak "-s" (spam) yerine "-n" (nonspam) seçeneğinin kullanılması gerekiyor. Değiştirilmiş haliyle bu komut bogofilter -n -b şeklini alacaktır. Bu aşamadan sonra herşey yolunda gittiyse 'spamlist.db' ve 'goodlist.db' veritabanlarının hazır olması gerekiyor. Artık spam filterelemeye hazırız :)

bogofilter'ı Sylpheed'e entegre etme

bogofilter komutunu bir email mesajı üzerinde çalıştırdığınızda program mesajın içerigini inceleyip daha önceki tecrübelerine göre bu mesajın içeriğinin spam olup olmadığını tespit edecektir. Bu tespit sonucunda spam olduğu düşünülen mesajlar için "0", normal mesajlar için de "1" sonucu alınacaktır. Fakat bize gelen her email mesajını okumadan önce komut satırına gidip bu komutu çalıştırıp onun sonucuna göre okuyup okumamaya karar vermek kullanışsız olacaktır. Bu yüzden bogofilter'la email programımızı entegre edip bu işlemin otomatikman yapılmasını sağlamak gerekmektedir. Yapmamız gereken Sylpheed'de her email mesajı geldiğinde bizim mail dizinimize gönderilmeden önce bu emailleri bogofilter ile tarama işleminden geçirmektir. Bu aşamada spam olduğu saptanan emaillere ne yapılacağı konusunda da birkaç seçeneğimiz var. Sylpheed-Claws kullanıcıları bu işlemi "Configuration" menüsünden "Filtering" seçeneğini seçmek suretiyle halledebilirler. Bu seçenekte doldurmamız gereken 3 tane alan var. "Condition" adlı ilk alanı aşağıdaki şekilde doldurun:

execute "/usr/bin/bogofilter < %F"


İkinci alan (Action) ilk alanda alınan sonuca göre email mesajına ne yapılması gerektiğini belirliyor. Bu alanda "Silme", "Sunucudan Silme" seçeneklerinin yanısıra bir de başka bir dizine taşımaya yarayan "Move" seçeneği mevcut. Ben şahsen "Move" seçeneği ile spam emailleri daha önce oluşturduğumuz SPAM dizinine kopayalamayı tercih ediyorum. Bu sayede hem spam olduğu belirlenen emailleri şöyle bir gözden geçirip bir hata olup olmadığını görme fırsatım oluyor, hem de daha sonra bogofilter'ı eğitmekte kullanacak daha fazla örnek spam mesajı biriktirmiş oluyorum. "Move" seçeneğini kullanabilmek için bir de mesajların taşınacağı dizini belirlemeniz gerekiyor. 'Select..' tuşunu kullanarak Sylpheed dizinlerinden "SPAM"i seçin. Bu aşamada mutlaka "Register" tuşuna basarak bu filtreleme kuralını aktif hale getirin, yoksa o pencereyi kapatınca silinecektir. Aşağıdaki resimle karşılaştırarak filtreleme kuralını doğru olarak ayarlayabilirsiniz.



bogofilter'ın Sürekli Eğitimi

Şimdiye kadar yaptığız ayarlar tahmininizden çok daha fazla spam yakalayacaktır. Fakat şu bir gerçek ki spam göndermeyi meslek edinmis olan insanlar ellerindeki her türlü teknoloji ve imkanı kullanarak size her gün daha değişik ve yakalanması daha da zor emailler göndermeye devam edeceklerdir. Örneğin kısa süre önce aldığım bir spam emailde mesajın Gönderen (From:) ve Alıcı (To:) alanlarında kendime ait olan iki email adresi kullanılmıştı. Sadece bu kıstasla çalışan bir spam tarayıcının bunu yakayabilmesi imkansız. Bütün bu sebeplerden dolayı bogofilter'ı ilk kurduğumuz günkü gibi bırakamayız. Her an yeni spam mesajlarını ona tanıtarak eğitimine devam etmemiz gerekiyor. Email programlarında ileride olacağından emin olduğum "Bu Mesajı Spam Olarak İşaretle" türü bir seçenek henüz yaygın olmadığından bunu bir şekil kendimiz yapmamız gerekiyor. Linux kullandığımız ve mesajlar normal metin olarak saklandığı için bu işlemi çok kolay bir şekilde gerçekleştirebiliyoruz. Bunu başarmak için bogofilter'ın tesbit edemediği (umarım az sayıda) mesajı SPAM dizinine kendimiz taşıyacağız. Bu mesajlar SPAM dizinine taşındıktan sonra bogofilter komutunu '-s' seçeneği ile çalıştırarak eğitimi tamamlayacağız. Bunu her gün elle yapmaktansa cron sistemini kullanarak her gün otomatik olarak çalıştırmak daha kullanışlı. Bu yöntemle SPAM dizinine taşıdığımız her mesaja "Bu günkü otomatik bogofilter eğitim seansında halledilecek" gözüyle bakabiliriz. SPAM dizininde spam içerikli olan mesajlar kadar NON-SPAM dizinindeki temiz içerikli mesajlar da eğitimin önemli bir parçasını oluşturuyor. Bu yüzden eğer gündelik email dizininizi non-spam için kullanmıyorsanız, NON-SPAM dizinine de her gün bir kaç düzgün email mesajı eklemekte fayda var. Aşağıdaki programcığı kullanarak cron vasıtasıyla bogofilter'ın eğitimini gerçekleştirebilirsiniz:

#!/bin/sh 
#/home/oktay/bin/bogolearn.sh 
#bogofilter eğitim 
# Kullanıcı Adı: oktay varsayılıyor 
BOGOFILTER="/usr/bin/bogofilter"; 
GOODDIR="/home/oktay/Mail/NONSPAM"; 
SPAMDIR="/home/oktay/Mail/SPAM"; 
cd $SPAMDIR cat * | $BOGOFILTER -s cd $GOODDIR; 
cat * | $BOGOFILTER -n


Aşağıdaki crontab satırı bu programcığın her gece 3:30'da çalışmasını sağlayacaktır:

30 3 * * * /home/oktay/bin/bogolearn.sh


Umarım bogofilter ve Bayes tabanlı spam avı konulu bu makalemden faydalanabilirsiniz. Benim şahsi kanaatimce bu tip spam tarayıcılar hem kullanım kolaylığı hem de spam'e engel olmadaki etkinlikleri bakımından çok başarılılar. Spamsiz günlerde buluşabilmek dileğiyle.

Kaynaklar: (Bütün kaynaklar ingilizcedir)


Oktay Altunergil
5 Ocak 2003

Not: Bu makalenin İngilizce sunumu çok yakında http://oreillynet.com adresinde yayınlanacaktır.

Görüşler

0
FZ
Oktay Altunergil arkadaşıma bu ciddi teknik makaleden ötürü çok çok teşekkürler. FM sitesine yakışan bu tip makalelerin artarak devamını diliyorum ve Oktay'a burayı artık daha sık takip etmesini tavsiye ediyorum (burada yazılan tehlikeli şeyleri evde tek başına deneyip de yaralanan olur ve teknik destek gerekirse diye :-P
0
tongucyumruk
Eh, FZ gibi editörden de insan böyle başlangıç bekliyor zaten hehehe... (Kutlamayı unutmuşum, hayırlı olsun bu arada). Özellikle benim gibi spam manyağı insanlara ilaç gibi geleceğinden eminim... Hemen kurup denemelere başlıyorum. Eğer procmail+mutt ile sorunsuz çalıştırabilirsem nasıl olduğunu buraya yazarım. Tabii önce bir süre spam biriktirmem gerekecek (keşke şimdiye kadar gelenleri silmeseydim).
0
oktay
Mutt ve procmail ile cok daha fazla randiman alabilirsin. Cunku sylpheed''de olmayan ''Bu mesaji spam olarak isaretle ve sil'', veya ''bu mesaj spam degil, spam veritabanindan cikar'' tuslarini Mutt''da macrolar vasitasiyla kendin olusturabiliyorsun.

Bu konuda bilgi icin su Frenk''ce yaziya bakabilirsiniz.
http://www.linuxjournal.com/article.php?sid=6439

oktay
0
m1a2
Valla çok yararlı bir makale olmuş, eline sağlık. Kaç zamandır bir spam mail filtresi ile uğraşmak istiyor fakat üşeniyordum, şu bogofilter`a bir girelim bakalım.

BTW - FZ`nin editörlüğü bereketli geldi :) Bu arada kendisini tebrik ediyoruz tabii. Hadi bakalım birisi de çıksın da şu `usermod linux` olayını incelesin. O konuyu da merak etmekteyim... Maverick nerede gözükmüyor? Finaller başladı galiba ;)
0
oktay
Daha once belirttigim gibi.. ingilizcesi http://linux.oreillynet.com/pub/a/linux/synd/2003/01/30/bogofilter.html adresinde dun yayinlandi :P

oktay
Görüş belirtmek için giriş yapın...

İlgili Yazılar

Snort Saldırı Tespit ve Engelleme Sistemi Eğitimi

anonim

1-2 Mayıs 2010 tarihlerinde Snort - Saldırı Tespit ve Engelleme Sistemi eğitimi düzenlenecektir.

Snort(Ağ tabanlı saldırı tespit ve engelleme sistemi) eğitimi günümüzde ağ güvenliği denildiğinde akla ilk gelen bileşen Saldırı Engelleme Sistemleri(IPS)ni açık kaynak kodlu IPS yazılımı Snort kullanarak uygulamalı olarak öğreten bir eğitimdir.

Hacker`lar İşe Alınır mı?

FZ

Yukarıdaki sorunun cevabı nedir diye düşündünüz mü bilmiyorum ama benim cevabım "alınmalıdırlar, tabii haklarında gerekli araştırmalar ve testler yapıldıktan sonra" şeklindeydi.

Bugün okuduğum bir haberde ise yakın zamanda yapılmış bir araştırmaya göre şirket yöneticilerinin görüşlerinin bu konuda olumsuz olduğu anlatılıyor.

Hackerlar işe alınır mı? haberindeki sonuçların ilginç olan kısmı ise genel eğilimin hackerları tam zamanlı şirket elemanı olarak değil de daha çok aralıklarla başvurulacak bir tür danışman statüsünde yönünde olması.

Akşam'ın bilgisayar eki!

sundance

Bugünden itibaren Akşam gazetesi her hafta, özellikle yeni başlayanları hedef alan 32 sayfalık bir ek çıkartacak.

Internet'ten Linux'a birçok konunun işlendiği bu ekte Fazlamesai ekibi olarak Güvenlik bölümünden sorumlu olacağız. İşlememizi isteyeceğiniz konularda önerilerinizi ve eleştirilerinizi bekliyoruz.

JavaScrypt

FZ

Autodesk firmasının kurucularından ve efsanevi AutoCAD programının yazarlarından biri olan John Walker, DES şifreleme standardının yerini almış olan AES´i (yani Rijndael algoritmasını) JavaScript ortamına taşıdı. Şifreleme, şifre çözme, parola cümlesi oluşturma ve steganografi işlevlerini barındıran bu JavaScript kullanımı GPL lisanslı olarak isteyen herkesin kullanımına açık.

C/C++ dururken neden JavaScript kullanayım, deli miyim divane miyim ben tepkisini verecekler ilgili sayfada usta programcının gerekçelerini okuyabilirler.

Metacortex - OpenBSD PF Toolbox

ts

Metacortex BSD lisansı ile dağıtılan OpenBSD PF firewall için monitoring yazılımıdır. Web arabirimi ile sistem yöneticileri için kullanışlı bir araçtır.