Простая почтовая система с защитой от вирусов и спама (FreeBSD+ClamAV)

Антон Пищулин
http://www.clamav.net.ua

2006-07-06

Идеи для самой простой, в моем понимании, почтовой системы я частично собрал на opennet.ru, частично повзаимствовал у более продвинутых коллег, а на что-то наступил сам :)

FreeBSD & Postfix & ClamAV & SmtpClamAV & Popa3d & Postgrey

Вникать в детали, как установить и настроить FreeBSD мы не будем - этому вопросу посвящено множество ресурсов и печатных изданий. Упомяну лишь мелочи, без которых хорошо работающую систему не получить.

Итак... мы имеем установленную и настроенную для работы в сети FreeBSD в минимальной конфигурации с коллекцией портов. Всегда желательно иметь свежие порты для компиляции более современного программного обеспечения.

Для обновления коллекции портов, можно использовать cvsup. Рекомендую устанавливать вместе с системой freeBSD

Итак!

cp /usr/share/examples/cvsup/ports-supfile /root/ports-supfile

редактируем /root/ports-supfile

меняем

*default host=CHANGE_THIS.FreeBSD.org
на
*default host=cvsup8.FreeBSD.org

По моим личным наблюдениям, с этого или с cvsup7.FreeBSD.org удачнее всего получается обновиться
Но ... каждый пусть делает по-своему :)

cvsup -g -L 2 /root/ports-supfile

после окончания обновлений - начинаем установку

1) Postfix

cd /usr/ports/mail/postfix
make install clean

Я отказываюсь от изменения mailer.conf.
При компиляции, создаются соответствующие логины, пароли, ставки, явки, каталоги и прочее - увидите все сами.

Для запуска постфикса при старте FreeBSD необходимо добавить

postfix_enable="YES"

в файл /etc/rc.conf

Это будет работать в том случае, если в каталог /usr/local/etc/rc.d
добавлен скрипт запуска либо вами, либо при компиляции.
Детализация этого - ваш экспириенс :)

Теперь ... sendmail. Надо бы в rc.conf пристрелить его.

sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"

Дальше редактируем /etc/aliases

root: вашемыло@вашдомен

Выполняем newaliases

Здесь я столкнулся с одним казусом, который толком не смог решить. Команда newaliases "поправляет" файл /etc/mail/aliases.db, а мой postfix почему-то искал /etc/aliases.db. Ни явное указание в конфигурационном файле пути, ни стук в бубен не помогли и я, как человек ленивый, создал символический линк и этим ограничился. Ваше право решить это по-своему.

2) ClamAV - полагаю, что весь сыр-бор сайта clamav.net.ua из-за этого ПО :)

cd /usr/ports/security/clamav
make install clean
Добавляем в /etc/rc.conf

clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"

И редактируем конфигурационный файл /usr/local/etc/clamd.conf
Рекомендую базироваться на екзампле
Вот, что поулчилось у меня

##
## Example config file for the Clam AV daemon
## Please read the clamd.conf(5) manual before editing this file.
##

LogFile /var/log/clamav/clamd.log
LogFileMaxSize 2M
LogTime
PidFile /var/run/clamav/clamd.pid
TemporaryDirectory /tmp
DatabaseDirectory /var/db/clamav
LocalSocket /var/run/clamav/clamd
FixStaleSocket
MaxConnectionQueueLength 30
StreamMaxLength 20M
MaxThreads 10
User clamav
AllowSupplementaryGroups
ScanPE
DetectBrokenExecutables
ScanOLE2
ScanMail
ScanHTML
ScanArchive
#ScanRAR
# отключено, ибо рекомендуют - нужны какие-то там патчи и прочее
# как не морочить себе голову с эти, я расскажу потом - про amavisd :).
ArchiveMaxFileSize 15M
ArchiveMaxRecursion 9
ArchiveMaxFiles 1500
ArchiveMaxCompressionRatio 300
ArchiveBlockEncrypted
ArchiveBlockMax

Посматривайте на комментарии в конфигурационных файла - значение настроек станет понятным :)

Теперь /usr/local/etc/freshclam.conf

##
## Example config file for freshclam
## Please read the freshclam.conf(5) manual before editing this file.
## This file may be optionally merged with clamd.conf.
##

DatabaseDirectory /var/db/clamav
UpdateLogFile /var/log/clamav/freshclam.log
LogSyslog
PidFile /var/run/clamav/freshclam.pid
DatabaseOwner clamav
AllowSupplementaryGroups
DNSDatabaseInfo current.cvd.clamav.net
DatabaseMirror database.clamav.net
NotifyClamd

Сравнив дефолтовые конфиги и мои, вы увидите, что я далеко от них не отклонился.

3) ClamSmtpD - это, собственно, прокладка между postfixom и ClamAV - механизм включается с минимальными усилиями и максимальным эффектом

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

в /etc/rc.conf

добавляем

clamav_clamsmtp_enable="YES"

и редактируем конфигурационный файл /usr/local/etc/clamsmtpd.conf

# ------------------------------------------------------------------------------
#                        SAMPLE CLAMSMTPD CONFIG FILE
# ------------------------------------------------------------------------------
#
# - Comments are a line that starts with a #
# - All the options are found below with sample settings

OutAddress: 10026
Listen: 127.0.0.1:10025
ClamAddress: /var/run/clamav/clamd
Header: X-Virus-Scanned: ClamAV (www.clamav.net.ua)
TempDirectory: /tmp
User: clamav

4) Popa3D - ну раз у нас есть smtp сервер, то не грех обзавестись и pop3 сервером :)

cd /usr/ports/mail/popa3d
make install clean

софт в конфигурировании не нуждается - это самый простой, с моей точки зрения, вариант pop3

Запуск этого сервера происходит следующим образом

добавляем строку в конфигурационный файл

/etc/inetd.conf
pop3 stream tcp nowait root /usr/local/libexec/popa3d popa3d

и в /etc/rc.conf

inetd_enable="YES"

5) Postgrey - очень занятная программа, позволяющая отфильтровывать многие почтовые сообщения - как спам, так и почтовые вирусы

Что и как она делает ?
Получив почтовое сообщение postgrey отвечает серверу отправителю требованием повторить отправку позже. Если сервер -отправитель - "правильный" smtp сервер, то он повторит отправку письма через одному ему известный промежуток времени и оно дойдет до получателя, а если это машина-зомби, то, вероятнее всего, письмо больше не придет*. Такой механизм позволяет отфильтровывать 50-90 % спама, потому, что многие спамеры не читают нужных мануалов и их доморощенные серверы не обладают необходимой функциональностью. :)

cd /usr/ports/mail/postgrey/
make install clean

добавляем в /etc/rc.conf

postgrey_enable="YES"

6) Завершающие штрихи - необходимо все это связать в кучу.

Сначала редактируем

/usr/local/etc/postfix/main.cf

Находим нужное и пишем свое.

# кое какие специфические настройки сервера.

myhostname = mail.any-host.com.ua
mydomain = any-host.com.ua
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks_style = subnet
mynetworks = 192.168.0.0/24, 127.0.0.0/8
relayhost = smtp.prov-serv.ua
default_destination_concurrency_limit = 2

#эти две строки - ClamAV

content_filter = scan:127.0.0.1:10025
receive_override_options = no_address_mappings

maps_rbl_reject_code = 554

strict_rfc821_envelopes = yes
disable_vrfy_command = yes

smtpd_helo_required = yes

# полезный блок - можете что-то повыбрасывать или дописать

smtpd_recipient_restrictions =
 permit_sasl_authenticated,
 permit_mynetworks,
 reject_unauth_destination,
 reject_unknown_recipient_domain,
 reject_non_fqdn_recipient,
 reject_rbl_client      list.dsbl.org,
 reject_rbl_client      relays.ordb.org,
 reject_rbl_client      dynablock.wirehub.net,
 reject_rbl_client      blackholes.wirehub.net,
 reject_rbl_client      dnsbl.njabl.org,
 reject_rbl_client      dialups.mail-abuse.org,
 reject_rbl_client      dul.ru,
 reject_rbl_client      blackholes.mail-abuse.org,
 reject_rbl_client      dialups.mail-abuse.org,
 reject_rbl_client      opm.blitzed.org,
 reject_rbl_client      sbl.spamhaus.org,
 reject_rbl_client      cbl.abuseat.org,
 reject_rbl_client      dul.dnsbl.sorbs.net,
 reject_rbl_client      dnsbl.njabl.org,
 reject_rbl_client      dynablock.njabl.org,
 reject_rbl_client      combined.njabl.org

# это postgrey

check_policy_service inet:127.0.0.1:10023

теперь правим

/usr/local/etc/postfix/main.cf

#
# Postfix master process configuration file.  For details on the format
# of the file, see the Postfix master(5) manual page.
#
# ===================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ===================================

########## начало нашей вставки :)

#antivirus
scan      unix  -       -       n       -       16      smtp
        -o smtp_send_xforward_command=yes

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

########## коней нашей вставки :)

smtp      inet  n       -       n       -       -       smtpd
#submission inet n      -       n       -       -       smtpd



...
Имейте ввиду, что от postgrey'я есть эффект, если у вашего домена 1 MX сервер и его ip адрес - адрес этой машины, если их более одного - то там тоже следует поставить какую-либо защиту от спама, иначе спам просто потечет через второй MX :)

Если что-то забыл, или ошибся - пишите на http://www.clamav.net.ua/forum/- отвечу - исправлю

*Прим.ред. Имейте в виду, что требование повтора отправления приведет к тому, что Вы будете получать ВСЕ письма с непредсказуемой задержкой (от получаса до нескольких суток), а некоторые дельные письма Вы не получите вообще. Возможно, Вас это устраивает, от некоторого спама действительно должно помогать.