Sendmail. Эффективная борьба со спамом и вирусами


Итак в исходной задаче мы имеем виртуальный выделенный сервер системой
FreeBSD под управлением VDSmanager на хостинг-площадке с предустановленным набором программного обеспечения ISPmananger.
Стандартно там установлен Sendmail и наша задача сделать почту наиболее эффективно работающей и безопасной, без спама и вирусов.
Что будем ставить и настраивать в первую очередь.
Антиспам:
Черные списки DNSBL- это такая штука, есть публичные листы, которые собирают адреса машин с которых рассылается спам. И эти IP-адреса туда заносятся. На какое-то время или пока админ сети не удалит их. GreyListing. Когда первый раз приходит письмо на сервер, он говорит, попробуй позднее. Спам робот пробовать не будет (оно ему не надо), а нормальный сервер попробует, письмо примется и добавится в белый список его IP-адрес.
SpamAssassin. Ну это больше для удобства пользователей. Пишет с сабжектах писем слово SPAM и можно настроить почтовую программу для сортировки таких писем в отдельную папку.
Антиспамовые функции sendmail. Про это чуть ниже.
Антивирус:
Ну тут думать не стал даже долго. Должно быть просто и бесплатно. Вообще весь софт который стоит на сервере бесплатен и следовательно "лицензионно чист". Антивирус ClamAV - это мой выбор.
Да, попутно, еще выяснилось, что их ISPmanager поддерживает работу с DNSBL, Milter-GreyList и SpamAssassin, подробности в документации.
Списки DNSBL можно прямо добавить через менюшку и все пропишется и заработает.
Начинаем настройку
Антиспам.
Черные списки DNSBL - я просто использую листы
bl.spamcop.net
cbl.abuseat.org
dnsbl.njabl.org
dnsbl.njabl.org
dnsbl.sorbs.net
list.dsbl.org
zen.spamhaus.org
Я их взял и добавил через ISPmanager, что получилось в конфиге sendmail - смотрите ниже.
Выяснилось, что milter-greylist уже установлен на сервере и надо только включить. Правим /etc/rc.conf
miltergreylist_enable="YES"
SpamAssassin пришлось поставить из портов
# cd /usr/ports/mail/p5-Mail-SpamAssassin
# make install clean
и milter к sendmail
# cd /usr/ports/mail/spamass-milter
# make install clean
Все опции оставляем по-умолчанию
Все очень просто и быстро, малость пришлось повозиться с ключами для запуска, объясню что к чему, пишем в /etc/rc.conf
spamd_enable="YES"
spamd_flags="-A 82.146.xx.xx -u spamd -x -c -d -r /var/run/spamd/spamd.pid"
spamass_milter_enable="YES"
Ключи
-A 82.146.xx.xx (82.146.xx.xx - ip-адрес вашего сервера, смотрится командой ifconfig)
На виртуальном выделенном сервере нет локального интерфейса, поэтому будем работать с внешним и разрешим с него запросы -u spamd - пользователь под которым запускается spamassassin (я считаю это более правильно, чем запускать под root)
-x - не создавать пользовательские конфиги. Вообщем то конфигурация пользователя будет вся лежать в /var/spool/spamd/.spamassassin/, ставим так
-c - создать конфиг автоматом если нет
-d - запуск в режиме демона
-r /var/run/spamd/spamd.pid - путь к PID-файлу.
Настраиваем конфиг SpamAssassin
# vi /usr/local/etc/mail/spamassassin/local.cf
rewrite_header Subject *****SPAM*****
Будет добавляться к заголовку письма слово *****SPAM*****
report_safe 0
Чтобы почта, которая пометилась как спам приходила как письмо, а не в виде аттачмента
trusted_networks 82.146.XX.XX
Указываем IP-адрес сервера. Почта с него (локальная почта) никогда не будет обрабатываться и помечаться как спам.
Настраиваем ежедневное автообновление спам-баз (кстати, планировщиком
Cron можно управлять и через ISPmanager)
# crontab -e -u root
@daily /usr/local/bin/sa-update --nogpg
Делаем ящики для обучения спаму. Пользователи должны пересылать письма на эти адреса ТОЛЬКО(!) как вложения. Я создал руками отредактировав
/etc/mail/virtusertable и /etc/mail/aliases
vi /etc/mail/virtusertable
spam@mydomain.ru spam
not-spam@mydomain.ru not-spam
vi /etc/mail/aliases
spam: "|/usr/local/bin/sa-learn --spam"
not-spam: "|/usr/local/bin/sa-learn --ham"
После чего сказать make в директории /etc/mail
Нам еще потребовалось создать директорию
# mkdir /var/spool/mqueue/.spamassassin/
и права на нее
# chmod 777 /var/spool/mqueue/.spamassassin/
Антивирус. Настраиваем clamav.
Он уже оказывается установлен, просто включите его, демон для автообновления базы и milter
clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"
clamav_milter_enable="YES"
Запускаем все
# /usr/local/etc/rc.d/milter-greylist.sh start
# /usr/local/etc/rc.d/sa-spamd start
# /usr/local/etc/rc.d/spamass-milter start
# /usr/local/etc/rc.d/clamav-clamd start
# /usr/local/etc/rc.d/clamav-freshclam start
# /usr/local/etc/rc.d/clamav-milter start
(может не запуститься не найдя себя в конфиге sendmail)
Мой конфиг sendmail (/etc/mail/myhostname.mc) с комментариями (сделал одним файлом, чтобы не писать 10 раз одно и то же) Содержит как защиту от спама, так и защиту от излишней нагрузки на сервер.
divert(-1)
#
# Copyright (c) 1983 Eric P. Allman
# Copyright (c) 1988, 1993
# The Regents of the University of California. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. All advertising materials mentioning features or use of this software
# must display the following acknowledgement:
# This product includes software developed by the University of
# California, Berkeley and its contributors.
# 4. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#

#
# This is a generic configuration file for FreeBSD 5.X and later systems.
# If you want to customize it, copy it to a name appropriate for your
# environment and do the modifications there.
#
# The best documentation for this .mc file is:
# /usr/share/sendmail/cf/README or
# /usr/src/contrib/sendmail/cf/README
#

divert(0)
# Это все было по умолчанию
VERSIONID(`$FreeBSD: src/etc/sendmail/freebsd.mc,v 1.30 2005/06/14 02:25:17 gshapiro Exp $')
OSTYPE(freebsd6)
DOMAIN(generic)
FEATURE(access_db, `hash -o -T<tmpf> /etc/mail/access')
FEATURE(blacklist_recipients)
FEATURE(local_lmtp)
FEATURE(mailertable, `hash -o /etc/mail/mailertable')
FEATURE(virtusertable, `hash -o /etc/mail/virtusertable')

dnl Uncomment to allow relaying based on your MX records.
dnl NOTE: This can allow sites to use your server as a backup MX without
dnl your permission.
dnl FEATURE(relay_based_on_MX)
dnl DNS based black hole lists
dnl --------------------------------
dnl DNS based black hole lists come and go on a regular basis
dnl so this file will not serve as a database of the available servers.
dnl For that, visit
dnl http://directory.google.com/Top/Computers/Internet/Abuse/Spam/Blacklists/
dnl Uncomment to activate Realtime Blackhole List
dnl information available at http://www.mail-abuse.com/
dnl NOTE: This is a subscription service as of July 31, 2001
dnl FEATURE(dnsbl)
dnl Alternatively, you can provide your own server and rejection message:
dnl FEATURE(dnsbl, `blackholes.mail-abuse.org', `"550 Mail from " $&{client_addr} " rejected, see http://mail-abuse.org/cgi-bin/lookup?" $&{client_addr}')
dnl Dialup users should uncomment and define this appropriately
dnl define(`SMART_HOST', `your.isp.mail.server')
dnl Uncomment the first line to change the location of the default
dnl /etc/mail/local-host-names and comment out the second line.
dnl define(`confCW_FILE', `-o /etc/mail/sendmail.cw')
define(`confCW_FILE', `-o /etc/mail/local-host-names')
dnl Enable for both IPv4 and IPv6 (optional)
DAEMON_OPTIONS(`Name=IPv4, Family=inet')
dnl DAEMON_OPTIONS(`Name=IPv6, Family=inet6, Modifiers=O')
define(`confBIND_OPTS', `WorkAroundBrokenAAAA')
define(`confNO_RCPT_ACTION', `add-to-undisclosed')
define(`confPRIVACY_FLAGS', `authwarnings,noexpn,novrfy')
TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS',`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confCACERT_PATH', `/usr/local/share/certs')
define(`confCACERT', `/usr/local/share/certs/ca-root.crt')
define(`confSERVER_CERT', `/etc/ssl/certs/sendmail.crt')
define(`confSERVER_KEY', `/etc/ssl/private/sendmail.key')
# antispam Это я добавил dnsbl-списки через ISPmanager, можно добавить и руками если надо
#
FEATURE(dnsbl, `bl.spamcop.net', `"550 Mail from " $&{client_addr} " rejected - see bl.spamcop.net"')
FEATURE(dnsbl, `cbl.abuseat.org', `"550 Mail from " $&{client_addr} " rejected - see cbl.abuseat.org"')
FEATURE(dnsbl, `dnsbl.njabl.org', `"550 Mail from " $&{client_addr} " rejected - see dnsbl.njabl.org"')
FEATURE(dnsbl, `dnsbl.sorbs.net', `"550 Mail from " $&{client_addr} " rejected - see dnsbl.sorbs.net"')
FEATURE(dnsbl, `list.dsbl.org', `"550 Mail from " $&{client_addr} " rejected - see list.dsbl.org"')
FEATURE(dnsbl, `zen.spamhaus.org', `"550 Mail from " $&{client_addr} " rejected - see zen.spamhaus.org"')
# Спамеры часто указывают неверный helo при установке smtp-сессии
FEATURE(`block_bad_helo')dnl
# Аккуратнее с это опцией, надо чтобы у серверов клиентов была прямая и обратная
# записи в DNS и они совпадали, если вы не знаете что это такое - не включайте
FEATURE(`require_rdns')dnl

# Если у хоста отправителя неправильная MX-запись - не принимаем почту
FEATURE(`badmx')dnl
# Ожидаем 5000ms перед выдачей приглашения, если команды писал спам-бот раньше приглашения,
# то почту от него принимать не будем.
FEATURE(`delay_checks')dnl
FEATURE(`greet_pause', `5000')dnl
# Максимальное число неправильных адресов и адресатов письма
define(`confBAD_RCPT_THROTTLE', `1')dnl
define(`confMAX_RCPTS_PER_MESSAGE', `20')dnl
# antiflood
# Ограничим число процессов sendmail. Каждый процесс требует почти 2 мегабайта памяти
define(`confMAX_DAEMON_CHILDREN', `30')dnl
# Это различные таймауты. Бывает спамботы не закрывают соединение сами, тем самым
# вызывают перерасход ресурсов, устраним это.
define(`confTO_CONNECT', `30s')dnl
define(`confTO_IDENT', `0')dnl
define(`confTO_COMMAND', `30s')dnl
define(`confTO_DATABLOCK', `2m')dnl
define(`confTO_STARTTLS', `2m')dnl
# Максимальное число коннектов в секунду
define(`confCONNECTION_RATE_THROTTLE', `10')dnl
# MAILER был уже, не трогаем
MAILER(local)
MAILER(smtp)
# Подключаем наши фильтры. Скопируйте один в один.
INPUT_MAIL_FILTER(`greylist', `S=local:/var/milter-greylist/milter-greylist.sock,F=, T=S:1m;R:1m')dnl
INPUT_MAIL_FILTER(`clmilter',`S=local:/var/run/clamav/clmilter.sock,F=, T=S:4m;R:4m')dnl
INPUT_MAIL_FILTER(`spamassassin', `S=local:/var/run/spamass-milter.sock, F=,T=S:4m;R:4m')dnl
# greylist macro
# Различные опции - макросы нужные для работы milter-greylist
#
define(`confMILTER_MACROS_CONNECT', `j, {if_addr}')dnl
define(`confMILTER_MACROS_HELO', `{verify}, {cert_subject}')dnl
define(`confMILTER_MACROS_ENVFROM', `i, {auth_authen}')dnl
define(`confMILTER_MACROS_ENVRCPT', `{greylist}')dnl
# spamassassin macro
# Тоже самое для работы spamassassin
#
define(`confMILTER_MACROS_CONNECT',`b, j, _, r, {daemon_name}, {if_name}, {if_addr}')dnl
# Собственно говоря включили фильтры
#
define(`confINPUT_MAIL_FILTERS', `greylist,clmilter,spamassassin')dnl
# fake banner
# Подменили стандарное приветствие sendmail на что-либо другое
#
define(`confSMTP_LOGIN_MSG', `exchange.srv.local Microsoft MAIL Service, Version: 6.0.3790.1830 ready')dnl
ну а пересобрать конфиг очень просто
заходите в /etc/mail
и пишите
# make
поставить
# make install
перезапустить
# make restart
Также, если вы используете ISPmananger вам необходимо добавить в его конфигурационный файл /usr/local/ispmgr/etc/ispmgr.conf строки для
возможности управления SpamAssassin через эту панель управления
Option ForceSpamAssassin
path spamassassin.conf /usr/local/etc/mail/spamassassin/local.cf
path spamassassinctl /usr/local/etc/rc.d/sa-spamd restart
Собственно говоря все. Мы получили эффективный почтовый сервер, который не пропустит спам и вирусы, а если и пропустит какой-либо спам, так вы его легко отфильтруете благодаря фильтру в почтовой программе.

Обновлено: 12.03.2015