Podczas używania i konfiguracja Spamassassina wielu z was często na pewno spotyka się ze zmiennymi ze słowem Bayes. Cóż to jest to określenie, skąd się wzięło i jak poprawnie skonfigurować. Przedstawię to w tym wpisie ponieważ nie znalazłem kompletnego opisu tego problemu.
Czemu akurat Bayes?
Nie wchodząc w szczegóły matematyczne schemat ten na podstawie nauczonych i pokazanych spamów/niespamów potrafi rozróżnić czy dana wiadomość jest spamem.Określa to prawdopodobieństwem. Czym wyższe ty większa szansa, ze to poczta której nie chcemy na serwerze. A czemu Bayes? Bo działa:)
Czego nie robić w związku z Bayesem
Na pewno nie należy ściągać przykładowych maili. Są różne bazy którymi możemy nauczyć filtr. Ale.. Po pierwsze dużo z nich jest po angielsku a najwięcej spamu jest jednak z Polski. baza będzie bezużyteczna. Po drugie jednak na każdym serwerze samem jest coś innego wiec lepiej poduczyć filtr pod swoje potrzeby.
Konfiguracja Bayesa.
Podstawowe parametry konfiguracyjne Bayesa:
bayes_auto_learn 1 #wlacza autonauke bayesa
use_bayes 1 # uzywanie bayesa
bayes_min_ham_num – ilość niespamu po jakiej filtr zacznie działać (po autonauce) np 300
bayes_min_spam_num ilość spamu po jakiej filtr zacznie działać (po autonauce) np 300
bayes_auto_learn_threshold_nonspam poniżej tej wartości mail jest traktowany jako niespam i wliczany do nauki
bayes_auto_learn_threshold_spam powyżej tej wartości mail jest traktowany jako spam i wliczany do nauki
Jedna uwaga: maile odrzucone z powodu istnieją ich w Blackliscie nie są brane pod uwagę do autonauki. Trzeba pamiętać o tym.
Jak uczyć
Jak dobrac te parametry? Właściwie zostaje tylko doświadczalnie. Dwa parametry bayes_min_ham_num i bayes_min_spam_num ustawiamy np na 500.
bayes_min_ham_num 500
bayes_min_spam_num 500
Gdy ilośc spamu i niespamu przekroczy po 500 wtedy zacznie nam działać filtr. Ale jak go dobrze nauczyć? Ważne jest to aby ilość maili dobrych i złych były zblizone. To można tylko doświadczalnie zrobić. Ustawiamy parametry
bayes_auto_learn_threshold_nonspam 0.2
bayes_auto_learn_threshold_spam 12.0
i sprawdzamy czy jest równomiernie przy pomocy komendy:
sa-learn –dump magic
najbardziej interesujące linie to
0.000 0 57659 0 non-token data: nspam
0.000 0 52567 0 non-token data: nham
nspam- to number spam a nham number ham(czyli niespam). Obie powinny równomiernie rosnąć. Jeśli któraś za szybko rośnie poprawiamy parametry. Za dużo spamu to należy zwiększyć bayes_auto_learn_threshold_spam (aby mniej było traktowane jako spam do nauki) lub zwiększyć bayes_auto_learn_threshold_nonspam (aby przyspieszyć naukę niespamu). Po dobraniu parametrów dobrze możemy skasować bazę i naukę rozpocząć od początku.Komenda sa-learn –clear. otem należy utworzyć pliki bayes_seen i bayes_toks (w Debianie w katalogu /var/amavis/.spamassassin) i nadać prawa 666. Oczywiście jak ktoś nie używa bazy.
Podumowanie
Dobrze dobrane początkowe parametry pozwalają utrzymać równowage między spamem/niespamem. Powoduje to, ze filtr działa bardzo dobrze. Nauka na swoim serwerze powoduje, ze Bayes uczy się spamu jaki naprawdę do nas dochodzi
Zakładając, że spamassassin działa w systemie z użytkownikiem przykładowo : amavis, a bayes zapisuje swoje nauki w bazie danych. Zauważyłem w bazie, że spamassasin uczy się i dla użytkownika amavis. Rozumiem, że taka nauczony filtr będzie działał globalnie dla wszystkich użytkowników gdy amavis sprawdza w bazie rekordy dla użytkownika amavis.
Co jednak jeżeli pozwolimy aby użytkownicy sami uczyli filtr (oznaczając wiadomości jako spam lub jako nie spam), tym samym w bazie bayes pojawiają się rekordy dla konkretnych użytkowników ale gdy spamassassin działa dla użytkownika amavis to rozumiem, że będzie on czytał z bazy rekordy dotyczące użytkownika amavis i nie będzie brał pod uwagę danych dotyczących nauki per user.
Jak skonfigurować spamassassin aby brał pod uwagę bayes globalnie nauczone np. przez auto_learn ale również sprawdzał bazę pod kątem konkretnego użytkownika ?
Próbowałem to robić tak, że najpierw amavis sprawdza pocztę globalnie a później zapisując wiadomość do skrzynki lmtp uruchamia spamassassina per user.
Jednak nie wiem czy to dobry pomysł. Bo co jeżeli filtr globalny uzna wiadomość za spam a użytkownik uczył filtr, że to nie spam albo odwrotnie , globalny filtr uznał pocztę jako nie spam a użytkownik uczył, że jest to spam, bayes musiałby działać w tym wypadku jakoś wyliczając wypadkową z nauczonego global i per user bayes ???