Тази статия е продължение на Подобрение ВИРТУАЛИЗАЦИЯ и MySQL До тук имаме: ● инсталиран сървър за електронна ● инсталиран и настроен PostFix ● инсталиран и настроен Dovecot ● инсталиран и настроен Roundcube ● PostFix приема и изпраща писма, след това ги предава на Dovecot ● Dovecot отговаря за пощенските кутии и удостоверенията, включително за PostFix ● ползваме потребители и домейни от база данни на MySQL. Усложняваме задачата с: ● инсталиране и настройване на програми за Антиспам ● защита от фишинг атаки ● инсталиране и настройване на антивирус за сървъра
SpamAssasin работи по следния начин:
От 1 до 3 сървъра за електронна поща получава писмо от външен сървър. т.4 - получил писмото PostFix прави заявка към базата данни дали е отговорен за получателя. Ако има валиден получател, PostFix го поставя на опашка и го изпраща за проверка на СПАМ. т.5 - SpamAssasin получава копие на писмото използвайки протокола milter. Извършва проверка на копието и изчислява вероятността за спам. Добавя запис към заглавието на писмото показващ дали е спам или не е. Връща резултата отново на PostFix т.6,7 - Ако писмото не е спам PostFix го препраща на Dovecot който пък ще го запише на диска на сървъра Така работи проверката за СПАМ. В случая ползваме SpamAssasin да проверява, но по същата логика работят и другите антиспам решения. Примерно едно различно такова е RSpamd. В случая ще се занимаем със SpamAssassin защото е по-лесен за настройка и по-разбираем, а в някоя друга статия ще покажа и RSpamd. Поглеждайки ръководството на Debian https://wiki.debian.org/DebianSpamAssassin имаме два пътя за осъществяване на задачата. 1. PostFix заедно със SpamAssassin сканират имейлите за спам. SpamAssassin ще се използва като филтър на съдържанието на подателя SMTP. Двоичния файл spamc предава мейла към spamd - демона на SpamAssassin и след това се връща обратно към опашката на пощата. За целта са необходими инсталирани postfix, spamassassin и spamc. 2. Другия начин на стартиране на SpamAssassin с PostFix е като Milter. Демонът spamass-milter ще бъде звикан от двоичния файл на PostFix spamc. spamass-milter ще изпълни файла spamc, който предава мейла на spamd. За целта се ползва протокола Milter за изпращане на промените в заглавието на писмото. Необходимо е да са инсталирани postfix, spamassassin, spamass-milter и spamc. Ще разгледаме и двата варианта.
apt install spamassassin spamc -y
Инсталирахме: spamassassin - базиран на Perl спам филтър, използващ анализ на текст spamc - клиент за демон за филтриране на спам SpamAssassin едновременно с това бе създаден потребител debian-spamd, който е член на групата debian-spamd За конфигуриране име два файла /etc/default/spamd - файл описващ как да се стартира демона /etc/spamassassin/local.cf - файл създаващ правила за определяне на спама Започваме с първия файл /etc/default/spamd
nano /etc/default/spamd OPTIONS="--create-prefs --max-children 5 --helper-home-dir" PIDFILE="/run/spamd.pid"
В по-стари версии на Debian този файл беше /etc/default/spamassassin. Освен горните параметри имаше и CRON=1. Това правеше запис в CRON в /etc/cron.daily/spamassasin и караше всяка вечер да се теглят нови антиспам правила. В сегашната версия на Debian, тази опция я няма. Но независимо от това в CRON правилото съществура. Можем да проверим:
ls -l /etc/cron.daily total 24 -rwxr-xr-x 1 root root 539 Oct 11 2023 apache2 -rwxr-xr-x 1 root root 1478 May 25 2023 apt-compat -rwxr-xr-x 1 root root 123 Mar 26 2023 dpkg -rwxr-xr-x 1 root root 377 Dec 14 2022 logrotate -rwxr-xr-x 1 root root 1395 Mar 12 2023 man-db -rwxr-xr-x 1 root root 1662 Apr 30 2023 spamassassin
Да проверим дали SpamAssassin е стартиран.
service spamd status ● spamd.service - Perl-based spam filter using text analysis Loaded: loaded (/lib/systemd/system/spamd.service; enabled; preset: enabled) Active: active (running) since Mon 2024-05-13 16:18:20 EDT; 33min ago Main PID: 4453 (spamd) Tasks: 3 (limit: 4644) Memory: 135.9M CPU: 1.568s CGroup: /system.slice/spamd.service ├─4453 /usr/bin/perl "-T -w" /usr/sbin/spamd --pidfile=/run/spamd.pid --create-prefs --max-children 5 --helper-home-dir ├─4461 "spamd child" └─4462 "spamd child" May 13 16:18:20 ns1 systemd[1]: Started spamd.service - Perl-based spam filter using text analysis. May 13 16:18:21 ns1 spamd[4453]: zoom: able to use 388/388 'body_0' compiled rules (100%) May 13 16:18:22 ns1 spamd[4453]: spamd: server started on IO::Socket::IP [::1]:783, IO::Socket::IP [127.0.0.1]:783 (running version 4.0.0) May 13 16:18:22 ns1 spamd[4453]: spamd: server pid: 4453 May 13 16:18:22 ns1 spamd[4453]: spamd: server successfully spawned child process, pid 4461 May 13 16:18:22 ns1 spamd[4453]: spamd: server successfully spawned child process, pid 4462 May 13 16:18:22 ns1 spamd[4453]: prefork: child states: II
Значи демона стои и чака от PostFix писмо за проверка. За целта трябва да свържем PostFix и SpamAssasin да работят заедно, а по-точно SpamAssasin да получи копие от писмото от PostFix, да го обработи и да върне отговор. Начина на обработка на файла се конфигурира в /etc/spamassassin/local.cf
nano /etc/spamassassin/local.cf # Add *****SPAM***** to the Subject header of spam e-mails # # rewrite_header Subject *****SPAM***** rewrite_header Subject ***** SPAM _SCORE_ ***** report_safe 0 required_score 5.0 use_bayes 1 use_bayes_rules 1 bayes_auto_learn 1 skip_rbl_checks 0 use_razor2 0 use_dcc 0 use_pyzor 0
rewrite_header Тема *****SPAM***** - маркираме спам в MUA заглавието на писмото. Вече сме готови да получим писмото от PostFix за обработка и да му го върнем. Дефинирахме няколко правила за проверка на спам. По-подразбиране SpamAssassin идва с много строги правила и доста често нормално писмо го взема за спам. Примерно ако е пратено с по-стар мейл клиент, тогава писмото го маркира като спам , а то не е. Затова създадохме малко по-меки правила за тест на спама. За целта да настроим PostFix.
nano /etc/postfix/master.cf # ========================================================================== smtp inet n - y - - smtpd -o content_filter=spamassassin submission inet n - - - - smtpd -o content_filter=spamassassin smtps inet n - y - - smtpd -o content_filter=spamassassin ### Най-накрая на файла spamassassin unix - n n - - pipe user=debian-spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient} service postfix restart service spamd restart
Внимавайте, пред (-o) и user=debian-spamd винаги оставяйте отстъп поне една табулация или една шпация. Едната част от задачата я свършихме. Да проверим как ще се маркира писмото като спам. Първо пращаме писмо като спам.
swaks --to tachko@my.tlan.net --server localhost --data /usr/share/doc/spamassassin/examples/sample-spam.txt
Проверяваме писмото в пощенската кутия на https://my.tlan.net/roundcube/
Писмото е маркирано като спам, значи е открито като такова. Записано е в папката за нормални писма. До го накараме да се записва в папка за спам.
За целта се грижи файла /etc/dovecot/conf.d/90-sieve.conf
nano /etc/dovecot/conf.d/90-sieve.conf # Търсим реда: #sieve_after = # Под него поставяме: sieve_after = /etc/dovecot/sieve-after
Горното действие ни заставя да създадем папката /etc/dovecot/sieve-after
mkdir /etc/dovecot/sieve-after
Да създадем и следния файл:
nano /etc/dovecot/sieve-after/spam-to-folder.sieve require ["fileinto","mailbox"]; if header :contains "X-Spam-Flag" "YES" { fileinto :create "INBOX.Junk"; stop; }
Ако SpamAssasin маркира заглавие като спам, то ще премести писмото в Junk папката. Dovecot все още не знае какво да прави затова трябва да му се укаже за спама:
sievec /etc/dovecot/sieve-after/spam-to-folder.sieve
Рестартираме Dovecot:
service dovecot restart service dovecot status
И отново да тестваме спама:
swaks --to tachko@my.tlan.net --server localhost --data /usr/share/doc/spamassassin/examples/sample-spam.txt
Сега ако влезем с браузъра в пощенската кутия, ще видим, че писмото се намира в папка Спам. Готово антиспама работи.
Една благинка, Анди Олсен казва, че Dovecot е въвел функция за автоматично изтриване на съдържанието в папките Trash и Junk. Нека да се възползваме:
nano /etc/dovecot/conf.d/15-mailboxes.conf namespace inbox { # These mailboxes are widely used and could perhaps be created automatically: mailbox Drafts { auto = create special_use = \Drafts } mailbox Junk { special_use = \Junk autoexpunge = 30d } mailbox Trash { auto = create special_use = \Trash autoexpunge = 30d } service dovecot restart
След 30-тия ден, автоматично папките Спам и Кошче ще се изпразнят.
Сега нещо важно: Понякога сървъра се пълни със страшно много спам. И тогава:
postqueue -p Mail queue is empty
В случая няма заявки за спам, но ако имаше и то много се предлага следното:
postsuper -d ALL И ако имаше много заявки ще върне нещо от рода: postsuper: Deleted: 11018 messages в зависимот от броя спам
След тази операция като се провери ще се получи следнот:
postqueue -p Mail queue is empty
Всичко това чисти опашката за спам. Това е единия начин за справяне със спама. Този метод работи и то добре, при условие, че не получавате много поща. Примрно ако получавате по 100 000 писма на ден то има по добър нчин но в следващата статия.
Всичко се върти около един стринг. XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X Когато този стринг го има в писмото, антиспама го засича, оценява го и казва, че е спам. По-долу ще покажа няколко начина да си изпратите писмо което да е спам.
swaks --to tachko@my.tlan.net --server localhost --data /usr/share/doc/spamassassin/examples/sample-spam.txt
Изпращаме писмо до себе си като за съдържание използваме съдържанието на файла /usr/share/doc/spamassassin/examples/sample-spam.txt. Ако пък разгледаме какво има във файла, отново ще открием прословутия стринг. Втори начин на тест.
echo 'XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X' > body && \ swaks --to tachko@my.tlan.net --body body
Отново стригна го вкарваме в тялото на писмото и го изпращаме до себе си. Крайния резултат отново е спам писмо. Трети вариант.
cd wget http://spamassassin.apache.org/gtube/gtube.txt sendmail tachko@my.tlan.net < gtube.txt
Смъкваме файл gtube.txt от http://spamassassin.apache.org/gtube/. Със sendmail го изпращаме до себе си. Крайния резултат отново е спам писмо. Вместо sendmail може да се пробва помощната програма mail която инсталирахме чрез пакета на mailutils.
mail tachko@my.tlan.net < gtube.txt
Крайния резултат отново ще е както горните. Ако пък имате и антивирусна програма на сървъра то тогава теста ще изглежда по следния начин.
cd ~ && \ wget https://secure.eicar.org/eicar.com && \ swaks --to tachko@my.tlan.net --attach - --server my.tlan.net < eicar.com
Обърнете внимание, ако вместо eicar.com пратите файла gtube.txt, то нямаше да откриете вирус в писмото а ще го маркирате като спам. С това приключваме първия вариант на инсталация и настройка на SpamAssassin
Колко е хубаво да се ползват виртуални машини. Точно за този момент става на въпрос. Трябва да се върнем в състояние Подобрение ВИРТУАЛИЗАЦИЯ и MySQL, защото ще тестваме работата на SpamAssassin по друг начин. Отново се връщаме в състояние на инсталиран сървър за електронна поща с виртуални потребители и домейни използващи SQL база данни. Ще инсталираме защита от спам, чрез SpamAssassin. Последния ще е стартиран като демон и ще чака за проверка на писмо от PostFix. Разликата с първия вариант е, че ще се ползва Milter протокол за тази цел. PostFix и SpamAssassin ще работят през сокет. Стандартно PostFix работи в chroot по подразбиране. Започваме с инсталацията. Имаме инсталиран postfix, необходими са spamassassin, spamc и spamass-milter.
apt install spamassassin spamc spamass-milter -y
Инсталирахме: spamassassin - базиран на Perl спам филтър, използващ анализ на текст spamc - клиент за демон за филтриране на спам SpamAssassin spamass-milter - milter протокол едновременно с това бяха създадени потребители debian-spamd, който е член на групата debian-spamd и spamass-milter, който е член на spamass-milter За конфигуриране име няколко файла /etc/default/spamd - файл описващ как да се стартира демона /etc/spamassassin/local.cf - файл създаващ правила за определяне на спама /etc/default/spamass-milter - файл определящ milter протокола /etc/postfix/main.cf - конфигурационен файл на PostFix Демонът spamass-milter ще извика PostFix. Също така активира и spamc. Предава писмото от PostFix на spamd (демона на SpamAssassin). Ако писмото е спам му се променя заглавието и отново през протокола Milter се връща на PostFix. Казахме по пдразбиране smtpd_milters е във вида smtpd_milters = unix:/spamass/spamass.sock (chroot). Може да имате и други Milters които да ги допълвате. Използвайте запетаи за да ги разделите. smtpd_milters може да има друго значение, примерно smtpd_milters = unix:/var/spool/postfix/spamass/spamass.sock. Да пробваме да го дефинираме в /etc/postfix/main.cf и това ще е през команда.
SpamAssassin ще се стартира като демон и ще чака през цялото време за връзка с Postfix. Връзката ще работи върху milter протокол.
postconf smtpd_milters=unix:/spamass/spamass.sock
SpamAssasin ще очаква специални променливи (макроси), затова ще се добавят и те към Postfix за да се страртират.
postconf milter_connect_macros="i j {daemon_name} v {if_name} _"
Да настроим и SpamAssassin:
nano /etc/default/spamd OPTIONS="--create-prefs --max-children 5 --helper-home-dir -x -u vmail"
Допълнителните опции -x -u vmail поясняват на SpamAssasin да гледа за its Bayes database в домашната папка на vmail потребителите. За по голяма точност ще се поставят в /var/vmail/.spamassassin директорията. В по-стари версии на Debian имаше опция CRON=1 прави запис на Cron в /etc/cron.daily/spamassasin и тегли нови антиспам правила всяка вечер. Тук без да се дефинира това правило в CRON-a имаме това условие. За да се стартира автоматично процеса spamd изпълнете:
systemctl enable spamd Synchronizing state of spamassassin.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable spamassassin
SpamAssain milter се нуждае от досъпт до данните на spamd. Трябва да се дефинира потребител с права да пуска и спира демона spamd. Ще се добави потребител debian-spamd в групата spamass-milter.
adduser spamass-milter debian-spamd Adding user `spamass-milter' to group `debian-spamd' ... Adding user spamass-milter to group debian-spamd Done.
Да проверм дали всичко е направено:
groups spamass-milter spamass-milter : spamass-milter debian-spamd
Всичко е точно, да рестартираме антиспама:
service spamd restart
service spamass-milter restart
service spamd status
С инсталацията на SpamAssasin идва тестово спам писмо. То се нарича
swaks --to tachko@my.tlan.net --server localhost --data /usr/share/doc/spamassassin/examples/sample-spam.txt
cat /var/log/mail.log
Jul 8 20:31:00 post dovecot: imap-login: Login: user=<tachko@home.tlan.net>, method=PLAIN, rip=::1, lip=::1, mpid=3122, secured, session=<M/G8zi6NSrAAAAAAAAAAAAAAAAAAAAAB>
Jul 8 20:31:00 post dovecot: imap(tachko@home.tlan.net): Logged out in=123 out=1194
Jul 8 20:31:00 post postfix/smtpd[3100]: connect from localhost[::1]
Jul 8 20:31:00 post postfix/smtpd[3100]: 59CCF100ACE: client=localhost[::1]
Jul 8 20:31:00 post postfix/cleanup[3103]: 59CCF100ACE: message-id=<GTUBE1.1010101@example.net>
Jul 8 20:31:00 post spamd[2971]: spamd: connection from ::1 [::1]:38232 to port 783, fd 5
Jul 8 20:31:00 post spamd[2971]: spamd: processing message <GTUBE1.1010101@example.net> for tachko:5000
Jul 8 20:31:00 post spamd[2971]: spamd: identified spam (1001.3/5.0) for tachko:5000 in 0.1 seconds, 1096 bytes.
Jul 8 20:31:00 post spamd[2971]: spamd: result: Y 1001 - ALL_TRUSTED,DATE_IN_PAST_96_XX,GTUBE,HEADER_FROM_DIFFERENT_DOMAINS scantime=0.1,size=1096,user=tachko,uid=5000,required_score=5.0,rhost=::1,raddr=::1,rport=38232,mid=<GTUBE1.1010101@example.net>,autolearn=no autolearn_force=no
Jul 8 20:31:00 post postfix/qmgr[773]: 59CCF100ACE: from=
SpamAssassin е отбелязал 1001 точки което е много. Границата е 5 и така мейла е маркиран като спам. Проверката за спам работи. Трябва писмата маркирани като спам да се поставят в папката за спам. Както и в горния вариант, ако проверим писмото ще видим че във папка Входящи писма.
За целта се грижи файла /etc/dovecot/conf.d/90-sieve.conf
nano /etc/dovecot/conf.d/90-sieve.conf # Търсим реда: #sieve_after = # Под него поставяме: sieve_after = /etc/dovecot/sieve-after
Горното действие ни заставя да създадем папката /etc/dovecot/sieve-after
mkdir /etc/dovecot/sieve-after
Да създадем и следния файл:
nano /etc/dovecot/sieve-after/spam-to-folder.sieve require ["fileinto","mailbox"]; if header :contains "X-Spam-Flag" "YES" { fileinto :create "INBOX.Junk"; stop; }
Ако SpamAssasin маркира заглавие като спам, то ще премести писмото в INBOX.Junk папката. Dovecot все още не знае какво да прави затова трябва да му се укаже за спама:
sievec /etc/dovecot/sieve-after/spam-to-folder.sieve
Рестартираме Dovecot:
service dovecot restart service dovecot status
И отново да тестваме спама:
swaks --to tachko@my.tlan.net --server localhost --data /usr/share/doc/spamassassin/examples/sample-spam.txt
Сега ако влезем с браузъра в пощенската кутия, ще видим, че писмото се намира в папка Спам. Готово антиспама работи.
Една благинка, Анди Олсен казва, че Dovecot е въвел функция за автоматично изтриване на съдържанието в папките Trash и Junk. Нека да се възползваме:
nano /etc/dovecot/conf.d/15-mailboxes.conf # These mailboxes are widely used and could perhaps be created automatically: mailbox Drafts { auto = create special_use = \Drafts autoexpunge = 30d } mailbox Junk { special_use = \Junk } mailbox Trash { auto = create special_use = \Trash autoexpunge = 30d } service dovecot restart
autoexpunge = 30d - след 30-тия ден, автоматично папките Спам и Кошче ще се изпразнят.
Сега нещо важно: Понякога сървъра се пълни със страшно много спам. И тогава:
# postqueue -p Mail queue is empty
В случая няма заявки за спам, но ако имаше и то много се предлага следното:
# postsuper -d ALL И ако имаше много заявки ще върне нещо от рода: postsuper: Deleted: 11018 messages в зависимот от броя спам
След тази операция като се провери ще се получи следнот:
# postqueue -p Mail queue is empty
Всичко това чисти опашката за спам. Това е единия начин за справяне със спама. Този метод работи и то добре, при условие, че не получавате много поща. Примрно ако получавате по 100 000 писма на ден то има по добър нчин но в следващата статия.