FreeBSD — Postfix: ClamSMTP, Clamav, Spamassassin

FreeBSD — Postfix: ClamSMTP, Clamav, Spamassassin

Открываю небольшой цикл заметок про post­fix. Почему post­fix — долго выбирал MTA для нужд компании (не провайдера) и по удобству/​гибкости/​надежности остановился на post­fix.
Cобственно первая статься — защищаем post­fix от спама и вирусов.

Для начала считаем что у нас post­fix стоит и работает.
Устанавливаим и настраиваем Cla­mav (Не забываем обновлять порты) .

# cd /usr/ports/security/clamav
# make install clean

Далее настраиваем Cla­mav — /usr/local/etc/clamd.conf

##
## config file for the Clam AV daemon
##

Log­File /var/log/clamav/clamd.log
Log­File­Max­Size 0
Log­Time yes
LogSys­log yes
Pid­File /var/run/clamav/clamd.pid
Data­baseDi­rec­tory /​var/​db/​clamav
Local­Socket /var/run/clamav/clamd.sock
FixStale­Socket yes
User cla­mav
Allow­Sup­ple­men­tary­Groups yes
TCP­Socket 3310
TCPAddr 127.0.0.1
Max­Con­nec­tion­Queue­Length 30
Max­Threads 50
Read­Time­out 300
Scan­PDF yes
ScanPE yes
ScanELF yes
Detect­Bro­kenEx­e­cuta­bles yes
ScanOLE2 yes
Scan­Mail yes
Sca­n­Ar­chive yes
Archive­Block­En­crypted no
#Archive­Max­File­Size 5M

Кидаем в загрузку и запускаем:

# echo 'clamav_clamd_enable="YES"' >> /etc/rc.conf
# /usr/local/etc/rc.d/clamav-clamd start

Далее необходимо обновить базы — для этого настраиваем /usr/local/etc/freshclam.conf

##
## config file for freshclam
##
DatabaseDirectory /var/db/clamav
UpdateLogFile /var/log/clamav/freshclam.log
PidFile /var/run/clamav/freshclam.pid
DatabaseOwner clamav
AllowSupplementaryGroups yes
DatabaseMirror db.ru.clamav.net
Checks 24
NotifyClamd /usr/local/etc/clamd.conf

Запускаем и прописываем в крон для ежедневного запуска обновления в 23:45:

# /usr/local/bin/freshclam
# crontab -e
45 23 * * * /usr/local/bin/freshclam

Все Cla­mav настроен и работает. Теперь производим настройку и установку Spa­mas­sas­sin.
Установим из портов:

# cd /usr/ports/mail/p5-Mail-SpamAssassin
# make install clean

Ставим в загрузку

# echo 'spamd_enable="YES"' >> /etc/rc.conf

и настраиваем /usr/local/etc/mail/spamassassin/local.cf

rewrite_header Subject *****SPAM*****
report_safe 1
required_score 7.0
use_bayes 1
bayes_auto_learn 1
bayes_ignore_header X-Bogosity
bayes_ignore_header X-Spam-Flag
bayes_ignore_header X-Spam-Status

и запускаем

/usr/local/etc/rc.d/sa-spamd start

Осталось настроить ClamSMTP. Ставим из портов:

# cd /usr/ports/security/clamsmtp
# make install clean

Далее настраиваем /usr/local/etc/clamsmtpd.conf :

#
# config file for clamsmtpd
#

# The address to send scanned mail to.
# This option is required unless Trans­par­ent­Proxy is enabled
Out­Ad­dress: 10026

# The max­i­mum num­ber of con­nec­tion allowed at once.
# Be sure that clamd can also han­dle this many con­nec­tions
#Max­Con­nec­tions: 64

# Amount of time (in sec­onds) to wait on net­work IO
#Time­Out: 180

# Keep Alives (ie: NOOP’s to server)
#KeepAlives: 0

# Send XCLIENT com­mands to receiv­ing server
#XClient: off

# Address to lis­ten on (defaults to all local addresses on port 10025)
#Lis­ten: 0.0.0.0:10025
Lis­ten: 127.0.0.1:10025

# The address clamd is lis­ten­ing on
#Cla­mAd­dress: /​var/​run/​clamav/​clamd
Cla­mAd­dress: /var/run/clamav/clamd.sock

# A header to add to all scanned email
Header: X-​​Virus-​​Scanned: Cla­mAV Scanned

# Direc­tory for tem­po­rary files
Tem­pDi­rec­tory: /​tmp

# What to do when we see a virus (use ‘bounce’ or ‘pass’ or ‘drop’
Action: drop

# Whether or not to keep virus files
Quar­an­tine: on

# Enable trans­par­ent proxy sup­port
#Trans­par­ent­Proxy: off

# User to switch to
User: clamav

# Virus actions: There’s an option to run a script every time a virus is found.
# !IMPORTANT! This can open a hole in your server’s secu­rity big enough to drive
# farm vehi­cles through. Be sure you know what you’re doing. !IMPORTANT!
#Virus­Ac­tion: /path/to/some/script.sh

Вносим в rc.conf и и запускаем

# echo clamsmtpd_enable="YES"' >> /etc/rc.conf
# /usr/local/etc/rc.d/clamsmtpd start

Теперь вносим изменения в настройки post­fix, по умолчанию они находятся в /​usr/​local/​etc/​postfix

main.cf:
content_filter = scan:[127.0.0.1]:10025
receive_override_options = no_address_mappings

mas​ter​.cf
# AV scan fil­ter (used by content_​filter)
scan unix — — n — 16 smtp
–o smtp_send_xforward_command=yes
–o smtp_enforce_tls=no

# For inject­ing mail back into post­fix from the fil­ter
127.0.0.1:10026 inet n — n — 16 smtpd
–o content_​filter=
–o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
–o smtpd_​helo_​restrictions=
–o smtpd_​client_​restrictions=
–o smtpd_​sender_​restrictions=
–o smtpd_recipient_restrictions=permit_mynetworks,reject
–o mynetworks_style=host
–o smtpd_authorized_xforward_hosts=127.0.0.0/8

# Check spam
smtp inet n — n — — smtpd
–o content_filter=spam:dummy

spam unix — n n — — pipe
flags=R user=virtual argv=/usr/local/bin/spamc –u vir­tual –e /​usr/​sbin/​sendmail –f $sender $recipient

Осталось протестировать. Необходимо вставить в тело письма тестовые сигнатуры

Для определения вируса:
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Для определения спама:
Sub­ject: Relax, be happy
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

Вот и все — все работает.