Вече има работещ сървър но проблема със спама си остава. Има няколко начина за справяне с проблема. Примерно SpamAssassin или rspamd. Втория е по-гъвкав, производителен и по-лесен за интегриране. RSpamd работи като сървис на сървъра и слуша PostFix използвайки milter (mail filter) протокола. Всеки път когато пристигне писмо, PostFix ще го прати до rspamd за проверка на съдържанието. RSpamd ще го анализира, оцени и ако резултата е висок имейла ще се счита за непоискан.
RSpamd е сравнително нов продукт и го няма в репозиторите на Debian 9. За да го включим първо трябв да добавим PGP ключ:
# wget -O- https://rspamd.com/apt-stable/gpg.key | apt-key add -
След това да добавим програмата в репозиторите:
# echo "deb http://rspamd.com/apt-stable/ stretch main" > /etc/apt/sources.list.d/rspamd.list
Репозиторa се описва в /etc/apt/sources.list.d/rspamd.list Да обновим репозиторите
# apt-get update
И сега да инсталираме RSpamd:
# apt-get install rspamd
Нека накараме PostFix да изпраща всички входящи писма чрез rspamd:
# postconf smtpd_milters=inet:127.0.0.1:11332 # postconf non_smtpd_milters=inet:127.0.0.1:11332 # postconf milter_protocol=6 # postconf milter_mail_macros="i {mail_addr} {client_addr} {client_name} {auth_authen}" # service postfix restart
PostFix ще се свърже с rspamd, който слуша на TCP порт 11332 на localhost(127.0.0.1). Ще предаде имейла. smtpd_milters определя тази връзка чрез протокола SMTP. non_smtpd_milters setting е опция, която кара PostFix да проверява всички мейли произлизащи от системата. milter_mail_macros дефинира няколко променливи, които rspamd очаква за по-добро откриване на спам. RSPamd след това изпълнява проверките си и казва на PostFix дали мейла трябва да мине или да бъде отхвърлен.
За теста ще ползваме спам мейл, който идва със SpamAssassin. Той се нарича GTUBE и съдържа артикулен модел, който се разпознава като спам от SpamAssassin. За тази цел първо ще смъкнем файла от сайта
# wget http://spamassassin.apache.org/gtube/gtube.txt
Зачистваме логовете
# > /var/log/mail.log # > /var/log/mail.err
А сега да изпратим този мейл до себе си
# sendmail tachko@home.tlan.net < gtube.txt
И проверяваме мейл лога
# cat /var/log/mail.log Feb 25 01:18:03 home postfix/pickup[6972]: 25F7680C3B: uid=0 from=<root> Feb 25 01:18:03 home postfix/cleanup[7994]: 25F7680C3B: message-id=<GTUBE1.1010101@example.net> Feb 25 01:18:03 home postfix/cleanup[7994]: 25F7680C3B: milter-reject: END-OF-MESSAGE from localhost[127.0.0.1]: 5.7.1 Gtube pattern; from=<root@home.tlan.net> to=<tachko@home.tlan.net> Feb 25 01:18:03 home postfix/cleanup[7994]: 25F7680C3B: to=<tachko@home.tlan.net>, relay=none, delay=0.05, delays=0.05/0/0/0, dsn=5.7.1, status=bounced (Gtube pattern)
5.7.1 Gtube pattern - причина 5.7.1 Gtube модел кара PostFix да отхвърли мейла. Много е важна първата цифра на генерирания код. За пример: - 2 = Успех - 4 = Времене проблем, повторно връщане - 5 = Постоянен проблем, не опитвай повече В нашия случай кода казва "Провал не пробвай повече" Кодовете може да намерите в RFC 3463
RSpamd няма да отхвърли всички спам мейли. Той ще ги изчисли и в зависимост от процента вероятност за спам ще вземе решение. Да разгледаме файла /etc/rspamd/actions.conf
# vi /etc/rspamd/actions.conf actions { reject = 15; add_header = 6; greylist = 4; }
Това са действия по подразбиране. RSpamd изчислява и оценява. Когато достигне точки: - 15 - отхвъля мейла (както в горния случай на Gtube шаблона) - 6 и нагоре - добавя заглавна линия "X-Spam" - 4 и нагоре - ще задейства greylisting механизма който временно ще отхвърли мейла и ще чака за нов опит. Ако си мислите, че сте открили топлата вода, много се лъжете. Зловредния софтуер ако праща мейла оценен на 4 точки по Gtube, само веднъж ще задейства greylist-ата и успешно ще отхвърли спама, но хакерите правят след няколко минути нов опит и я заобикалят прослоутата greylist-ата. Ако искате да си направите свое точкуване то:
# vi /etc/rspamd/override.d/metrics.conf actions { reject = 150; add_header = 2; greylist = 5; }
Този файл може да го променяте да правите свои конфигурации. Примери може да намерите от ТУК.. Не правете промени по файловете в /etc/rspamd/local.d/, защото след актуализациите ще върне оригиналните стойности по-подразбиране. След всяка промяна в конфигурацията задължително трябва да се рестартира rspamd.
# service rspamd restart
Проверка дали rspamd е усвоил конфигурацията си
# rspamadm configdump
Отговора е много дълъг затова, ако искате примерно да видите стойността на
# rspamadm configdump |grep reject
И ако сте въвели собсвена конфигурация където е указан reject да е 150, трябва да зареди такава стойност.
Конфигурацията може да се тества чрез:
# rspamadm configtest syntax OK
Може да проверим и кои процси вървят:
# pgrep -a rspam 7942 rspamd: main process 7975 rspamd: rspamd_proxy process 7976 rspamd: controller process 7977 rspamd: normal process 7978 rspamd: normal process 7979 rspamd: normal process 7980 rspamd: normal process 7981 rspamd: hs_helper process
Както знаете всеки мейл има заглавие и тяло. В заглавието влизат неша като изпращач, получател, дата, час и предмет. По принцип в заглавието има много повече неша. Тези допълнителни заглавия rspamd може да ги добавя като започват с "X-". За тази цел създаваме следния файл:
# vi /etc/rspamd/override.d/milter_headers.conf extended_spam_headers = true;
Това ще добави нови заглавия, които може да видите ТУК.
Потребителите нямат за цел постоянно да следят логовете и да гледат кой мейл е спам и кой колко е маркиран. Нормалното състояние е да се влезе в пощата и да види какви писме има, а системата сама да каже кое писмо е спам и да го сложи в папка с рискови/нежалани писма. За целта Dovecot поддръжа sieve филтри
#vi /etc/dovecot/conf.d/90-sieve.conf # Identical to sieve_before, only the specified scripts are executed after the # user's script (only when keep is still in effect!). Multiple script # locations can be specified by appending an increasing number. #sieve_after = sieve_after = /etc/dovecot/sieve-after #sieve_after2 = #sieve_after2 = (etc...)
Така казваме, че sieve филтрите ще ги поместваме в /etc/dovecot/sieve-after Да създадем и директорията за начало
# mkdir /etc/dovecot/sieve-after
Сега в тази директория да създадем файл(филтър) spam-to-folder.sieve
# vi /etc/dovecot/sieve-after/spam-to-folder.sieve require ["fileinto","mailbox"]; if header :contains "X-Spam" "Yes" { fileinto :create "INBOX.Junk"; stop; }
Чрез този файл маркираните файлове като спам се преместват в пощенска кутия Junk. Папката INBOX.Junk ако още не съществува то тя се създава. До сега генреирахме спам, но той не се намира в папката за спам. Създадохме и самата папка но за да прехвърлим текушия спам там, а и за в бъдеще спама там да се помещава изплняваме сленото:
# sievec /etc/dovecot/sieve-after/spam-to-folder.sieve
Това генерира машинно четим файл /etc/dovecot/sieve-after/spam-to-folder.svbin. Рестартираме Dovecot
# service dovecot restart
В предни версии за антиспам се ползваше SpamAssasin. Той ползва базата данни Bayes за да увеличи откриваемостта на спам. Проблема е, че rspamd не може да ползва тези данни за обучение заради другия алгоритъм на работа. За да обучим rspamd се ползват три метода: 1. Без обучение 2. Използване на предварителни шаблони 3. Сами си обучаваме системата. Да ги разгледаме:
Без обучение
Това не е толкова лошо. Препоръчвам да се активира. RSpamd е много функционален и добре замислен и върши страхотна работа. За да работи създаваме файл в /etc/rspamd/override.d/.
# vi /etc/rspamd/override.d/classifier-bayes.conf autolearn = true;
Лошото е, че подхода е много консервативен, някои писма като спам направо ги изучава за много лоши и после ги отхвърля. В началото докато се натрупа база от обучение може да се пусне.
Използване на предварителни шаблони
RSpamd има база с над 3000 научени майла. С това може и да се започне. Спираме RSpamd
# service rspamd stop
Вземаме предварителните статистики и ги поставяме в директорията /var/lib/rspamd. След това изпълняваме:
# cd /var/lib/rspamd/ root@home:/var/lib/rspamd# wget https://rspamd.com/rspamd_statistics/bayes.ham.sqlite root@home:/var/lib/rspamd# wget https://rspamd.com/rspamd_statistics/bayes.spam.sqlite # chown _rspamd._rspamd /var/lib/rspamd/*sqlite
Стартираме RSpamd
# service rspamd start
Уверяваме се, че базата данни е изпълнена:
# rspamc stat Statfile: BAYES_SPAM type: sqlite3; length: 36.86k; free blocks: 0; total blocks: 0; free: 0.00%; learned: 0; users: 1; languages: 1 Statfile: BAYES_HAM type: sqlite3; length: 36.86k; free blocks: 0; total blocks: 16; free: 0.00%; learned: 1; users: 1; languages: 1 Total learns: 1
В случая имаме една поща и беше обучена само тя.
Сами си обучаваме системата
Ако сървъра е работил достатъчно дълго време то той събира много писма със спам и хам. Именно това ще послужи за база за нашето обучение. Командата rspamc позволява да зареждаме цели директории/папки с имейли за обучение. Има и още нещо което улеснява работата. Формта на Maildir за съхранение на писмата съвпада с този на rspamd. Нека да се обучим за спам като ползваме спам директорията на tachko. Доверяваме се, че tachko не лъже със спама и неговата директоря е доверена за правилен спам:
# rspamc learn_spam /home/vmail/home.tlan.net/tachko/Maildir/.INBOX.Junk/cur
Така казахме, че спама на tachko е истински и вече писмата пристигащи с такъв маркер ще са спам. Колко качествено ще се открива спам зависи колко са добри данните за източника. Така, че не се обучават спам мейли на случаен принцип, поставени в папката Junk. Да проверим броя на писма, които сме научили:
# rspamc stat Statfile: BAYES_SPAM type: sqlite3; length: 36.86k; free blocks: 0; total blocks: 0; free: 0.00%; learned: 0; users: 1; languages: 1 Statfile: BAYES_HAM type: sqlite3; length: 36.86k; free blocks: 0; total blocks: 0; free: 0.00%; learned: 0; users: 1; languages: 1 Total learns: 0
Проверката на спам с Bayes няма да работи, преди да научи най-малко 200 имейла за спам. Преподаването на rspamd по-малко имейли или просто спам имейли няма да работи. Това се определя от променливата min_learns, дефинирана в /etc/rspamd/statistic.conf. Качеството на откриване на спам зависи от това колко добри са източниците. Пример: - имате потребители които съвестно слагат спама в папка Junk. Това прави статистиката точна - имате потребители които слагат произволни писма в папка Junk. Това е лъжлива информация и системата се обучава неправилно Затова внимавайте кои папки избирате за обучение на системата. Не слагайте всички папки от потребителите Junk като база за обучение.
Нека да кажем на Dovecot, че прместването на писмата в папката за нежелани съобщения веднага да показва, че е спам. Същевременно системата да се обучи, че е спам. Ще се добави Sieve сккрипт към действието преместване на писмо чрез IMAP. Dovecot съдържа в себе си приставка IMAPSieve, която ще конфигурираме за тази цел. Бъдете внимателни, базата за обучение за спам е глобална за всички потребители. Ако един потребител обучава безмислици то скоростта на проверка ще се съсипе. Този вид обучение се прави само на доверени потребители, които знаят какво правят, а не тренират. И така за начало да влкючим приставката IMAPSieve.
# vi /etc/dovecot/conf.d/20-imap.conf # Търсим реда: #mail_plugins = $mail_plugins # Променяме го на: mail_plugins = $mail_plugins imap_sieve
Също трябва да се редактира Dovecot's Sieve конфигурацията, за да се активират две необходими приставки. Sieve е скриптов език, който автоматизира нещата в съчетание с писма и папки.
# vi /etc/dovecot/conf.d/90-sieve.conf # Търсим реда: #sieve_plugins = # Променяме го на: sieve_plugins = sieve_imapsieve sieve_extprograms # И под този ред добавете: # From elsewhere to Junk folder ("От другаде до папка Junk") imapsieve_mailbox1_name = Junk imapsieve_mailbox1_causes = COPY imapsieve_mailbox1_before = file:/etc/dovecot/sieve/learn-spam.sieve # From Junk folder to elsewhere ("От папка за нежелана поща на друго място") imapsieve_mailbox2_name = * imapsieve_mailbox2_from = Junk imapsieve_mailbox2_causes = COPY imapsieve_mailbox2_before = file:/etc/dovecot/sieve/learn-ham.sieve sieve_pipe_bin_dir = /etc/dovecot/sieve sieve_global_extensions = +vnd.dovecot.pipe
Първото правило казва на Dovecot да изпълни правилото на сито, определено във файла /etc/dovecot/sieve/learn-spam.sieve
Второто правило определя другия начин. "Всеки път, когато писмо се премества от папка Junk във всяка папка (*), да се извиква /etc/dovecot/sieve/learn-ham.sieve скрипт".
sieve_pipe_bin_dir определя къде могат да се намират изпълнимите скриптове. Там ще бъдат и нашите присти скриптове за обучение.
sieve_global_extensions, позволява да се включи плъгин, който да изпраща писма към външни команди.
Забележка: ако ползвате предни версии от ръководството, пощенските директории могат да използват "." вместо "/". Ясен знак е, че намирате директории като .INBOX.Junk вместо просто Junk в директорията /home/vmail/home.tlan.net/tachko/Maildir/. В този случай заменете Junk със INBOX.Junk. Следва да създадем сценария на Sieve, за които сме казали за Dovecot. # mkdir /etc/dovecot/sieve После създайте следния файл: # vi /etc/dovecot/sieve/learn-spam.sieve
require ["vnd.dovecot.pipe", "copy", "imapsieve"];
pipe :copy "rspamd-learn-spam.sh"; И още един файл: # vi /etc/dovecot/sieve/learn-ham.sieve
require ["vnd.dovecot.pipe", "copy", "imapsieve"];
pipe :copy "rspamd-learn-ham.sh"; Тези два скрипта трябва да бъдат компилирани, но преди това да рестартираме Dovecot за да влязат в сила плъгините sieve_imapsieve и sieve_extprograms за да могат да се компилират скриптовете. # service dovecot restart
# sievec /etc/dovecot/sieve/learn-spam.sieve
# sievec /etc/dovecot/sieve/learn-ham.sieve Това създаде два файла learn-ham.svbin и learn-spam.svbin във формат плъгина на Dovecot да може да ги разбере. Да редактираме и правата върху файловете: # chmod u=rw,go= /etc/dovecot/sieve/learn-{spam,ham}.sieve
# chown vmail.vmail /etc/dovecot/sieve/learn-{spam,ham}.sieve Последна стъпка е създаване на прост шел скрипт правещ действително обучението за спам: # vi /etc/dovecot/sieve/rspamd-learn-spam.sh
#!/bin/sh
exec /usr/bin/rspamc learn_spam Друго не е необходимо. Спам писмото се подава към този скрипт и rspamd го научава като спам писмо и съответно коригира базата си за откриване на спам. Следващия скрипт е за ham. # vi /etc/dovecot/sieve/rspamd-learn-ham.sh
#!/bin/sh
exec /usr/bin/rspamc learn_ham Тези два шел скрипта трябва да са изпълними: # chmod u=rwx,go= /etc/dovecot/sieve/rspamd-learn-{spam,ham}.sh
# chown vmail.vmail /etc/dovecot/sieve/learn-{spam,ham}.sieve Да повторим как работи процеса:
- потребителя премества спама в папка Junk.
- Dovecot разбира, че е задействано правилото # vi /etc/dovecot/conf.d/10-logging.conf
# Търсим реда:
#mail_debug = no
# Променяме го на:
mail_debug = yes Рестартираме Dovecot: # service dovecot restart И гледаме следния файл: # tail -f /var/log/mail.log
Jul 10 05:25:03 home dovecot: imap(tachko@home.tlan.net): Debug: Loading modules from directory: /usr/lib/dovecot/modules
Jul 10 05:25:03 home dovecot: imap(tachko@home.tlan.net): Debug: Module loaded: /usr/lib/dovecot/modules/lib95_imap_sieve_plugin.so
Jul 10 05:25:03 home dovecot: imap(tachko@home.tlan.net): Debug: Effective uid=5000, gid=5000, home=/home/vmail/home.tlan.net/tachko
Jul 10 05:25:03 home dovecot: imap(tachko@home.tlan.net): Debug: Namespace inbox: type=private, prefix=, sep=, inbox=yes, hidden=no, list=yes, subscriptions=yes location=maildir:/home/vmail/home.tlan.net/tachko/Maildir
Jul 10 05:25:03 home dovecot: imap(tachko@home.tlan.net): Debug: maildir++: root=/home/vmail/home.tlan.net/tachko/Maildir, index=, indexpvt=, control=, inbox=/home/vmail/home.tlan.net/tachko/Maildir, alt=
Jul 10 05:25:03 home dovecot: imap(tachko@home.tlan.net): Logged out in=50 out=511
Трябва да се види накрая, че Dovecot извиква скрипта rspamd-learn-spam.sh
Очаквайте продължение ...