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)
- Paul Graham'ın Makalesi: http://www.paulgraham.com/spam.html
- Bogofilter Web Sitesi: http://bogofilter.sourceforge.net
- Thomas Bayes Kimdir? : http://www-gap.dcs.st-and.ac.uk/~history/Mathematicians/Bayes.html
- Bayes Olasılığı Teorisi: http://www.wikipedia.org/wiki/Bayesian_probability
- Sylpheed Web Sitesi: http://sylpheed.org
- Sylpheed-Claws Web Sitesi: http://claws.sylpheed.org
- Sylpheed Hakkında bir Makalem: http://linux.oreillynet.com/pub/a/linux/2001/12/06/sylpheed.html
Oktay Altunergil
5 Ocak 2003
Not: Bu makalenin İngilizce sunumu çok yakında http://oreillynet.com adresinde yayınlanacaktır.