Строим мультидоменный почтовый сервер с защитой от вирусов и спама::Журнал СА 1.2006
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Подписка
Архив номеров
Где купить
Наука и технологии
Авторам
Рекламодателям
Контакты
   

  Опросы
  Статьи

Дата-центры  

Дата-центры: есть ли опасность утечки данных?

Российские компании уже несколько лет испытывают дефицит вычислительных мощностей. Рост числа проектов,

 Читать далее...

Книжная полка  

Защиты много не бывает

Среди книжных новинок издательства «БХВ» есть несколько изданий, посвященных методам социальной инженерии

 Читать далее...

Событие  

В банке рассола ждет сисадмина с полей фрактал-кукумбер

Читайте впечатления о слете ДСА 2024, рассказанные волонтером и участником слета

 Читать далее...

Организация бесперебойной работы  

Бесперебойная работа ИТ-инфраструктуры в режиме 24/7 Как обеспечить ее в нынешних условиях?

Год назад ИТ-компания «Крок» провела исследование «Ключевые тренды сервисного рынка 2023». Результаты

 Читать далее...

Книжная полка  

Читайте и познавайте мир технологий!

Издательство «БХВ» продолжает радовать выпуском интересных и полезных, к тому же прекрасно

 Читать далее...

СУБД PostgreSQL  

СУБД Postgres Pro

Сертификация по новым требованиям ФСТЭК и роль администратора без доступа к данным

 Читать далее...

Критическая инфраструктура  

КИИ для оператора связи. Готовы ли компании к повышению уровня кибербезопасности?

Похоже, что провайдеры и операторы связи начали забывать о требованиях законодательства

 Читать далее...

Архитектура ПО  

Архитектурные метрики. Качество архитектуры и способность системы к эволюционированию

Обычно соответствие программного продукта требованиям мы проверяем через скоуп вполне себе понятных

 Читать далее...

Как хорошо вы это знаете  

Что вам известно о разработках компании ARinteg?

Компания ARinteg (ООО «АРинтег») – системный интегратор на российском рынке ИБ –

 Читать далее...

Графические редакторы  

Рисование абстрактных гор в стиле Paper Cut

Векторный графический редактор Inkscape – яркий представитель той прослойки open source, с

 Читать далее...

День сисадмина  

Учите матчасть! Или как стать системным администратором

Лето – время не только отпусков, но и хорошая возможность определиться с профессией

 Читать далее...

День сисадмина  

Живой айтишник – это всегда движение. Остановка смерти подобна

Наши авторы рассказывают о своем опыте и дают советы начинающим системным администраторам.

 Читать далее...

Виртуализация  

Рынок решений для виртуализации

По данным «Обзора российского рынка инфраструктурного ПО и перспектив его развития», сделанного

 Читать далее...

Книжная полка  

Как стать креативным и востребованным

Издательский дом «Питер» предлагает новинки компьютерной литературы, а также книги по бизнесу

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 6407
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 7112
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

12.03.2018г.
Просмотров: 4392
Комментарии: 0
Глубокое обучение с точки зрения практика

 Читать далее...

12.03.2018г.
Просмотров: 3085
Комментарии: 0
Изучаем pandas

 Читать далее...

12.03.2018г.
Просмотров: 3880
Комментарии: 0
Программирование на языке Rust (Цветное издание)

 Читать далее...

19.12.2017г.
Просмотров: 3896
Комментарии: 0
Глубокое обучение

 Читать далее...

19.12.2017г.
Просмотров: 6385
Комментарии: 0
Анализ социальных медиа на Python

 Читать далее...

19.12.2017г.
Просмотров: 3231
Комментарии: 0
Основы блокчейна

 Читать далее...

19.12.2017г.
Просмотров: 3527
Комментарии: 0
Java 9. Полный обзор нововведений

 Читать далее...

16.02.2017г.
Просмотров: 7361
Комментарии: 0
Опоздавших не бывает, или книга о стеке

 Читать далее...

17.05.2016г.
Просмотров: 10723
Комментарии: 0
Теория вычислений для программистов

 Читать далее...

30.03.2015г.
Просмотров: 12443
Комментарии: 0
От математики к обобщенному программированию

 Читать далее...

18.02.2014г.
Просмотров: 14093
Комментарии: 0
Рецензия на книгу «Читаем Тьюринга»

 Читать далее...

13.02.2014г.
Просмотров: 9191
Комментарии: 0
Читайте, размышляйте, действуйте

 Читать далее...

12.02.2014г.
Просмотров: 7140
Комментарии: 0
Рисуем наши мысли

 Читать далее...

10.02.2014г.
Просмотров: 5445
Комментарии: 3
Страна в цифрах

 Читать далее...

18.12.2013г.
Просмотров: 4683
Комментарии: 0
Большие данные меняют нашу жизнь

 Читать далее...

18.12.2013г.
Просмотров: 3494
Комментарии: 0
Компьютерные технологии – корень зла для точки роста

 Читать далее...

04.12.2013г.
Просмотров: 3211
Комментарии: 0
Паутина в облаках

 Читать далее...

03.12.2013г.
Просмотров: 3449
Комментарии: 0
Рецензия на книгу «MongoDB в действии»

 Читать далее...

02.12.2013г.
Просмотров: 3090
Комментарии: 0
Не думай о минутах свысока

 Читать далее...

Друзья сайта  

 Строим мультидоменный почтовый сервер с защитой от вирусов и спама

Архив номеров / 2006 / Выпуск №1 (38) / Строим мультидоменный почтовый сервер с защитой от вирусов и спама

Рубрика: Администрирование /  Продукты и решения   | Дополнительные материалы

Павел Семенец

Строим мультидоменный почтовый сервер с защитой от вирусов и спама

Кто из нас не мечтал создать свою мультидоменную почтовую систему, которая работала бы стабильно, надежно и безопасно, предлагала множество удобных функций, защищала от вирусов и спама, умела авторизовывать пользователей, шифровать передаваемый трафик, и в то же время была проста в обслуживании. Это особенно актуально для почтовых систем больших компаний или провайдерских серверов, предоставляющих почтовые сервисы внешним клиентам. Как добиться такого результата, затратив минимум усилий?

Сразу хотелось бы отметить, что данный труд не предназначен для новичков в мире UNIX. Несмотря на мои старания излагать всё как можно подробнее, многие вещи, очевидные для любого подкованного UNIX-админа, остались за бортом, иначе пришлось бы писать целый сериал. По ходу повествования я буду кратко объяснять, что и зачем мы делаем. Надеюсь, такого уровня подробностей хватит большинству читателей.

Итак, наша почтовая система будет использовать только свободное программное обеспечение. Для выполнения поставленной задачи нам понадобится следующее:

  • Exim – MTA (Mail Tranfer Agent), на момент написания статьи доступная версия 4.53.
  • MySQL – реляционная СУБД требуется для более удобного управления пользователями и доменами, которые будет поддерживать наш почтовый сервер.
  • Courier-Imap – один из самых быстрых и защищенных серверов для работы с почтовыми ящиками, поддерживающий работу по протоколу SSL.
  • DSPAM – быстрый и очень гибкий в настройке антиспам фильтр.
  • SquirrelMail – один из самых лучших веб-интерфейсов для работы с почтовыми ящиками.
  • ClamAV – наиболее зрелый из бесплатных антивирусных фильтров.
  • ОС FreeBSD версии 5.4 с последними патчами.

В принципе можно взять любую другую UNIX-подобную ОС. Немного изменится принцип установки программного обеспечения, но в целом все остальное будет актуально.

Надеюсь, у всех присутствует подключение к Интернету, имеется последняя обновленная версия портов, DNS настроен верно, MX-записи не кривые, и имя хоста отвечает вашим желаниям для использования его в качестве почтового сервера.

Предупреждение: использование мультидоменного почтового сервера накладывает определенные правила на формат учетных записей пользователя, которые используются для аутентификации. Аутентификация пользователей производится по полному почтовому адресу, включая название домена (к примеру, user@test.com).

Для создания файлов будем использовать следующую конструцию: «cat > filename << "EOF"». Записывать данные в файл, пока не встретится слово EOF.

Установка MySQL

Установить СУБД MySQL несложно, требуется лишь соблюдать определенные правила при сборке. Нужно точно определиться, будут ли база сервера и сам почтовый сервер на одном хосте или на разных (я всегда держу отдельной машиной сервер баз данных, к которому произвожу подключение, дабы разгрузить основной сервер, но это на ваше усмотрение). Если БД будет на другом хосте, требуется позаботиться об удаленном доступе к хосту с базой, а для хоста с почтовым сервером достаточно собрать только клиента. В нашем случае все работает на одной машине.

Собираем MySQL:

# cd /usr/ports/databases/mysql41-server/

# make WITH_CHARSET=koi8_ru WITH_CHARSET=cp1251 WITH_CHARSET=utf8 WITH_CHARSET=latin1 WITH_XCHARSET=all all install clean

Настраиваем запуск так, чтобы MySQL стартовал перед всеми сервисами.

Создаем скрипты для запуска MySQL:

# cd /usr/local/etc/rc.d/

# mv 000.mysql-client.sh  010.mysqlc.sh

# mv mysql-server.sh 015.mysqls.sh

При стандартной установке FreeBSD создается слишком маленький раздел /var для хранения базы нашего почтового сервера, этого не достаточно, для этого переместим БД MySQL в /usr/local/database/mysql во избежание проблем с нехваткой места для базы в дальшейшем.

Добавляем в файл /etc/rc.conf:

mysql_enable="YES"

mysql_dbdir="/usr/local/database/mysql"

Создадим директорию для хранения базы MySQL и передадим права пользователю, от которого работает MySQL:

# mkdir -p /usr/local/database/mysql

# chown -R mysql:mysql /usr/local/database/mysql

Запускаем сервер баз данных:

# /usr/local/etc/rc.d/010.mysqlc.sh start

# /usr/local/etc/rc.d/015.mysqls.sh start

Все должно пройти без сучка и без задоринки, если что-то пошло не так, проверьте права на папку /usr/local/database/mysql, она должна принадлежать пользователю mysql, иначе сервер откажется запускаться.

Производим первичную настройку и защиту нашего SQL-сервера. Вместо «testpassword» и «youpassword» следует использовать пароли, которые вы придумаете сами. Выполнив вышеуказанные действия, можно хотя бы минимально обезопасить себя от взлома. В случае если база MySQL находится на удаленной машине, нужно вместо «exim@localhost» использовать имя с указанием хоста, от которого будет производиться соединение.

# /usr/local/bin/mysqladmin -u root password 'testpassword';

Запускаем клиент mysql и попадаем в консоль сервера MySQL, дальнейшие команды выполняем в нем:

# mysql -u root -ptestpassword

Удаляем тестовую базу:

mysql> drop database test;

Подключаемся к базе с именем mysql:

mysql> use mysql;

Удаляем все записи о правах на базы данных:

mysql> delete from db;

Удаляем все учетные записи, которые не относятся к руту и локальному хосту:

mysql> delete from user where not (user='root' and host='localhost');

Создаем базу данных для Exim:

mysql> create database mail;

Передаем права пользователю Exim на почтовую базу данных:

mysql> grant all on mail.* to exim@localhost identified by 'youpassword';

Выходим из консоли сервера:

mysql> \q

MySQL мы подготовили, теперь приступим к установке собственно самого Exim. Зачем нужны приведенные ниже опции, разобраться будет несложно, достаточно внимательно прочитать файл EDITME, находящийся в папке src корневого каталога с исходными текстами Exim.

# cd /usr/ports/mail/exim

# make fetch

# cd /usr/

# mkdir Install

# cd Install

# tar -xvjpf /usr/ports/distfiles/exim/exim-4.53.tar.bz2

# cd exim-4.53/Local

Создаем пользователя, от имени которого будет работать Exim.

# pw adduser exim -g mail -d /var/spool/mqueue -C "Exim Server" -s /usr/sbin/nologin

Затем требуется просмотреть файл /etc/passwd или с помощью команды id выяснить, какой UID и GID у пользователя exim. В моем случае – это 1001 и 6 соответственно. Нам это понадобится для конфигурационного файла Exim, описанного ниже.

Настроить ключи сборки Exim через configure не представляется возможным, об этом прямо сказано в документации, идущей с пакетом. Поэтому создаем файл Makefile:

# cat > Makefile << "EOF"

BIN_DIRECTORY=/usr/sbin

CONFIGURE_FILE=/etc/mail/exim.conf

EXIM_USER=1001

EXIM_GROUP=6

SPOOL_DIRECTORY=/var/spool/mqueue

SUPPORT_MAILDIR=yes

LOOKUP_MYSQL=yes

LOOKUP_INCLUDE=-I /usr/local/include/mysql

LOOKUP_LIBS=-L/usr/local/lib/mysql -lmysqlclient -lz -lcrypt -lm

AUTH_CRAM_MD5=yes

AUTH_PLAINTEXT=yes

SUPPORT_TLS=yes

TLS_LIBS=-lssl -lcrypto

TLS_INCLUDE=-I/usr/include/openssl

LOG_FILE_PATH=syslog

EXIM_PERL=perl.o

SYSTEM_ALIASES_FILE=/etc/mail/aliases

CHOWN_COMMAND=/usr/sbin/chown

SUPPORT_MOVE_FROZEN_MESSAGES=yes

ROUTER_ACCEPT=yes

ROUTER_DNSLOOKUP=yes

ROUTER_IPLITERAL=yes

ROUTER_MANUALROUTE=yes

ROUTER_QUERYPROGRAM=yes

ROUTER_REDIRECT=yes

TRANSPORT_APPENDFILE=yes

TRANSPORT_AUTOREPLY=yes

TRANSPORT_PIPE=yes

TRANSPORT_SMTP=yes

HEADERS_CHARSET="CP1251"

HAVE_ICONV=yes

CFLAGS=-O -I/usr/local/include

EXTRALIBS_EXIM=-L/usr/local/lib -liconv

INFO_DIRECTORY=/usr/share/info

COMPRESS_COMMAND=/usr/bin/gzip

COMPRESS_SUFFIX=gz

ZCAT_COMMAND=/usr/bin/zcat

TMPDIR="/tmp"

WITH_CONTENT_SCAN=yes

WITH_OLD_DEMIME=yes

EOF

Собираем и устанавливаем Exim и создаем необходимые ссылки.

# cd ../

# make

# make install

# ln -fs /usr/sbin/exim /usr/lib/sendmail

# ln -fs /usr/sbin/exim /usr/sbin/sendmail

# ln -fs /usr/sbin/exim /usr/bin/mailq

# ln -fs /usr/sbin/exim /usr/bin/runq

Этот шаг не обязателен. Данное действие удалит все отладочные символы, тем самым уменьшив размер исполняемых файлов:

# strip /usr/sbin/exim*

Далее пока оставляем настройку Exim (вернемся к ней позже). Продолжим подготавливать нашу базу данных для работы Exim.

Созаем файл exim.sql:

# cd /usr/local/databases

# cat > exim.sql << "EOF"

--  Таблица алиасов

CREATE TABLE `aliases` (

`local_part` varchar(64) NOT NULL default '',

`domain` varchar(128) NOT NULL default '',

`recipients` text,

PRIMARY KEY  (`local_part`,`domain`)

) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

-- Данные о алиасах

INSERT INTO `aliases` VALUES ('root', 'test.com', 'user');

INSERT INTO `aliases` VALUES ('postmaster', 'test.com', 'root');

INSERT INTO `aliases` VALUES ('mailer-daemon', 'test.com', 'postmaster');

INSERT INTO `aliases` VALUES ('uucp', 'test.com', 'root');

INSERT INTO `aliases` VALUES ('operator', 'test.com', 'root');

INSERT INTO `aliases` VALUES ('abuse', 'test.com', 'root');

INSERT INTO `aliases` VALUES ('webmaster', 'test.com', 'root');

INSERT INTO `aliases` VALUES ('hostmaster', 'test.com', 'root');

-- Таблица описания доменов

CREATE TABLE `domains` (

`domain` varchar(128) NOT NULL default '',

`type` enum('LOCAL','RELAY','VIRTUAL') default 'LOCAL',

PRIMARY KEY  (`domain`)

) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

-- Данные о доменах

INSERT INTO `domains` VALUES ('test.com', 'LOCAL');

-- Таблица форвардинга почты

CREATE TABLE `userforward` (

`local_part` varchar(64) NOT NULL default '',

`domain` varchar(128) NOT NULL default '',

`recipients` text,

PRIMARY KEY  (`local_part`,`domain`)

) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

-- Таблица описания пользователей

CREATE TABLE `users` (

`id` varchar(64) NOT NULL default '',

`crypt` varchar(64) NOT NULL default '',

`passwd` varchar(64) NOT NULL default '',

`uid` int(10) unsigned default '8',

`gid` int(10) unsigned default '12',

`mbox_host` varchar(128) NOT NULL default 'test.com',

`shell` varchar(32) character set cp1251 collate cp1251_bin default '/sbin/nologin',

`home` varchar(128) character set cp1251 collate cp1251_bin default '/usr/local/vmail/test.com',

`quota` tinyint(4) default '30',

`active` enum('Y','N') default 'Y',

PRIMARY KEY  (`id`,`mbox_host`)

) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

INSERT INTO `users` VALUES ('user', ENCRYPT('password'), 'password', 1001, 6, 'test.com','/usr/sbin/nologin','/usr/local/vmail/test.com/user', 127, 'Y');

EOF

Выполняем команды, записанные в файл. Существует несколько способов сделать это.

Вариант 1:

# mysql -u root -ptestpassword exim < exim.sql

Вариант 2:

# mysql -u root -ptestpassword

mysql> use exim

mysql> ./exim.sql

mysql> \q

Возвращаемся к настройке Exim, SSL-соединения и аутентификации на SMTP-сервер:

# cd /etc/mail/

# mkdir ssl

# cd ssl

# openssl req -x509 -newkey rsa:1024 -keyout mail.pem -out mail.pem -days 3650 -nodes

# chmod 400 mail.pem

# chown exim:mail mail.pem

В директории /etc/mail создаем файл exim.conf (FQDN mail.test.com взят для примера):

# cat > exim.conf << "EOF"

primary_hostname = mail.test.com

# Домены, для которых принимаем почту

domainlist local_domains = ${lookup mysql{SELECT domain FROM domains WHERE domain='${domain}' AND (type='LOCAL' OR type='VIRTUAL')}}

# Домены, которым разрешено отправлять почту через данный сервер

domainlist relay_to_domains = ${lookup mysql{SELECT domain FROM domains WHERE domain='${domain}' AND type='RELAY'}}

# Включаем проверку на вирусы

hostlist   relay_from_hosts = 127.0.0.1

av_scanner = clamd:127.0.0.1 3310

# Включаем проверку по содержимому письма

acl_smtp_rcpt = acl_check_rcpt

acl_smtp_data = acl_check_virus

qualify_domain = test.com

auth_advertise_hosts = *

daemon_smtp_ports = 25 : 465

# Включаем SSL-соединение

tls_on_connect_ports = 465

tls_advertise_hosts = *

tls_certificate = /etc/mail/ssl/mail.pem

tls_privatekey = /etc/mail/ssl/mail.pem

# Включаем лог действий сервера

log_selector = \

    +all_parents \

    +lost_incoming_connection \

    +received_sender \

    +received_recipients \

    +smtp_confirmation \

    +smtp_syntax_error \

    +smtp_protocol_error \

    -queue_run

allow_domain_literals = false

# Запрещаем привелигированным пользователям отправлять почту через данный сервер

never_users = root:daemon:bin # Нет, им просто запрещается отправлять почту и все

host_lookup = *

rfc1413_hosts = *

rfc1413_query_timeout = 0s

ignore_bounce_errors_after = 30m

timeout_frozen_after = 3d

freeze_tell = postmaster

auto_thaw = 1h

message_size_limit = 10M

smtp_accept_max = 50

smtp_accept_max_per_connection = 50

smtp_connect_backlog = 50

smtp_accept_max_per_host = 25

split_spool_directory = true

remote_max_parallel = 15

# Подключем базу MySQL

hide mysql_servers = localhost/mail/exim/youpassowrd

# Подключаем фильтры

begin acl

    acl_check_rcpt:

    deny    local_parts   = ^.*[@%!/|] : ^\\.

    accept  local_parts   = postmaster

            domains       = +local_domains

    require verify        = sender

    deny    message       = HELO/EHLO required by SMTP RFC

            condition     = ${if eq{$sender_helo_name}{}{yes}{no}}

    deny    message       = Go Away! You are spammer.

            condition     = ${if match{$sender_host_name}{bezeqint\\.net|net\\.il|dialup|dsl|pool|peer|dhcp}{yes}{no}}

    deny    message       = host is

           listed in $dnslist_domain

            dnslists      = sbl.spamhaus.org : \

                            relays.ordb.org : \

                            opm.blitzed.org : \

                            proxies.blackholes.easynet.nl

    accept  domains       = +local_domains

            endpass

            message       = unknown user

            verify        = recipient

    accept  domains       = +relay_to_domains

            endpass

            message       = unrouteable address

            verify        = recipient

    accept  hosts         = +relay_from_hosts

    accept  authenticated = *

    deny    message       = relay not permitted

acl_check_virus:

    deny   message        = Messege rejected: Virus $malware_name) Found. Your message was successfully trashed.

           malware        = *

    accept

# Описываем транспорты и и роутеры

begin routers

    dnslookup:

        driver = dnslookup

        domains = ! +local_domains

        transport = remote_smtp

        ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8

        no_more

    system_aliases:

        driver = redirect

        allow_fail

        allow_defer

        data = ${lookup mysql{SELECT recipients FROM aliases WHERE local_part='${local_part}' AND domain='${domain}'}}

    userforward:

        driver = redirect

        allow_fail

        allow_defer

        data = ${lookup mysql{SELECT recipients FROM userforward WHERE local_part='${local_part}' AND domain='${domain}'}}

    mysqluser:

        driver = accept

        condition = ${if eq{} {${lookup mysql{SELECT home FROM users WHERE id='${local_part}' AND mbox_host='${domain}' AND \

                    active='Y'}}}{no}{yes}}transport = mysql_delivery

begin transports

remote_smtp:

    driver = smtp

mysql_delivery:

    driver = appendfile

    check_string = ""

    create_directory

    delivery_date_add

    directory = ${lookup mysql{SELECT CONCAT(home, "/Maildir") FROM users WHERE id='${local_part}' AND mbox_host='${domain}'}}

    directory_mode = 770

    envelope_to_add

    group = mail

    maildir_format

    maildir_tag = ,S=$message_size

    message_prefix = ""

    message_suffix = ""

    mode = 0600

    quota = ${lookup mysql{SELECT quota FROM users WHERE id='${local_part}' AND mbox_host='${domain}'}{${value}M}}

    quota_size_regex = S=(\d+)$

    quota_warn_threshold = 95%

    return_path_add

address_pipe:

    driver = pipe

    return_output

address_file:

    driver = appendfile

    delivery_date_add

    envelope_to_add

    return_path_add

address_reply:

    driver = autoreply

begin retry

*          quota

*   F,2h,15m; G,16h,1h,1.5; F,4d,6h

begin rewrite

# Включаем аутентификацию

begin authenticators

# Метод - Plain

auth_plain:

    driver = plaintext

    public_name = PLAIN

    server_condition = ${lookup mysql{SELECT id FROM users WHERE id = '${quote_mysql:${local_part:$2}}' AND \

                       mbox_host = '${quote_mysql:${domain:$2}}' AND passwd = '${quote_mysql:$3}' AND active = 'Y'}{yes}{no}}

    server_prompts = :

    server_set_id = $2

# Метод - Login

auth_login:

    driver = plaintext

    public_name = LOGIN

    server_condition = ${lookup mysql{SELECT id FROM users WHERE id = '${quote_mysql:${local_part:$1}}' AND \

                       mbox_host = '${quote_mysql:${domain:$1}}' AND passwd = '${quote_mysql:$2}' AND active = 'Y'}{yes}{no}}

    server_prompts = Username:: : Password::

    server_set_id = $1

#Метод - Cram-MD5

auth_cram_md5:

    driver = cram_md5

    public_name = CRAM-MD5

    server_secret = ${lookup mysql{SELECT passwd FROM users WHERE id = '${quote_mysql:${local_part:$1}}' AND \

                    mbox_host = '${quote_mysql:${domain:$1}}' AND active = 'Y'}{$value}fail}

   server_set_id = $1

EOF

Приступим к сборке и настройке антивирусного фильтра. Что означает каждая опция, можно найти в том же файле конфигурации или в документации к ClamAV:

# cd /usr/ports/security/clamav

# make all install clean

# cd /usr/local/etc

Создаем файл clamd.conf следующего содержания:

# cat > clamd.conf << "EOF"

LogFile /var/log/clamav/clamd.log

LogTime

LogClean

LogSyslog

PidFile /var/run/clamav/clamd.pid

TemporaryDirectory /var/tmp

DatabaseDirectory /var/db/clamav

FixStaleSocket

TCPSocket 3310

TCPAddr 127.0.0.1

User clamav

AllowSupplementaryGroups

ScanPE

ScanOLE2

ScanMail

ScanHTML

ScanArchive

ScanRAR

ArchiveMaxFiles 10000

EOF

И файл freshclam.conf следующего содержания:

# cat > freshclam.conf << "EOF"

DatabaseDirectory /var/db/clamav

UpdateLogFile /var/log/clamav/freshclam.log

LogVerbose

PidFile /var/run/clamav/freshclam.pid

DatabaseOwner clamav

AllowSupplementaryGroups

DatabaseMirror database.clamav.net

MaxAttempts 5

Checks 3

NotifyClamd

EOF

Запускаем ClamAV:

# cd /usr/local/etc/rc.d

# mv clamav-clamd.sh 020.clamav.sh

# mv clamav-freshclam.sh 025.freshclam.sh

Добавляем в файл rc.conf следующие строки:

clamav_freshclam_enable="YES"

clamav_clamd_enable="YES"

Запускаем антивирусный фильтр:

# ./020.clamav.sh start

# ./025.freshclam.sh start

Далее создаем директорию, в которой собственно будем хранить почту наших пользователей. Для этих целей я выбрал директорию vmail, созданную в подкаталоге local каталога usr.

# mkdir -p /usr/local/vmail

# chown -R exim:mail /usr/local/vmail /var/spool/mqueue

# chmod 0770 /usr/local/vmail

Создаем скрипт для запуска Exim:

# cat > /usr/local/etc/rc.d/030.exim.sh << "EOF"

# !/bin/sh

case "$1" in

start)

    echo "starting Exim..."

    /usr/sbin/exim -bd -q15m

;;

restart)

    echo "restarting Exim..."

    kill -HUP `cat /var/spool/mqueue/exim-daemon.pid` 

;;

stop)

    echo "stopping Exim..."

    kill -TERM `cat /var/spool/mqueue/exim-daemon.pid` 

;;

*)

    echo "Usage: $0 {start|stop|restart}"

exit 1

;;

esac

EOF

# chmod +x /usr/local/etc/rc.d/030.exim.sh

Запускаем Exim:

# /usr/local/etc/rc.d/030.exim.sh start

Проверяем правильность настройки и работоспособность Exim. Для этого отправим тестовое письмо сами себе.

# /usr/local/etc/rc.d/030.exim.sh start

Trying 127.0.0.1...

Connected to localhost.

Escape character is "^]".

220 mail.test.com ESMTP Exim 4.53 Wed, 19 Oct 2005 16:49:58 +0400

ehlo mail.test.com

250-mail.test.com Hello localhost.test.com [127.0.0.1]

250-SIZE 10485760

250-PIPELINING

250-AUTH PLAIN LOGIN CRAM-MD5

250 HELP

mail from:user@test.com

250 OK

rcpt to:user@test.com

250 Accepted

data

354 Enter message, ending with "." on a line by itself

test

.

250 OK

quit

В подкаталоге /usr/local/vmail после отправки письма должна создаться директория test.com. Проверим это, выполнив команду «ls /usr/local/vmail».

Следующим этапом проверяем методы аутентификации. Для каждой проверки с помощью Perl будем кодировать аутентификационный запрос согласно используемому методу.

Метод PLAIN. Для этого метода нужно получить специальную строку, которая используется в процессе аутентификации. Создадим ее следующей командой:

# perl -MMIME::Base64 -e "print encode_base64("user@test.com?user@test.com?password");"

DXNlckB0ZXN0LmNvbQB1c2VyQHRlc3QuY29tAHBhc3N3b3Jk

Полученная строка и является нашей строкой аутентификации.

# telnet 127.0.0.1 25

ehlo mail.test.com

...

...

AUTH PLAIN dXNlckB0ZXN0LmNvbQB1c2VyQHRlc3QuY29tAHBhc3N3b3Jk

235 Authentication succeeded

quit

Метод LOGIN:

# perl -MMIME::Base64 -e "print encode_base64("user@test.com");"

dXNlckB0ZXN0LmNvbQ==

# perl -MMIME::Base64 -e "print encode_base64("password");"

cGFzc3dvcmQ=

Смотрим:

# telnet 127.0.0.1 25

ehlo mail.test.com

...

AUTH LOGIN

334 VXNlcm5hbWU6

dXNlckB0ZXN0LmNvbQ==

334 UGFzc3dvcmQ6

cGFzc3dvcmQ=

235 Authentication succeeded

quit

Метод CRAM-MD5:

# telnet 127.0.0.1 25

ehlo mail.test.com

AUTH CRAM-MD5

334 PDUwNy4xMTI5Nzk3MzkyQG1haWwucnVzZ2F0ZS5vcmc+

А здесь нам понадобится дополнительная манипуляция, так как для этого метода требуется еще знать и очередь сообщения.

Предупреждение: cпецификация метода Cram-MD5 не допускает криптованные пароли.

Декодируем имя очереди следующей командой:

# perl -MMIME::Base64 -e "print MIME::Base64::decode_base64(shift), " "" PDUwNy4xMTI5Nzk3MzkyQG1haWwucnVzZ2F0ZS5vcmc+

Получаем очередь письма:

<507.1129797392@mail.test.com>

После кодируем строку для аутентификации, используя данные об очереди, логин и пароль:

# perl -MMIME::Base64 -MDigest::HMAC_MD5 -e "print MIME::Base64::encode_base64($ARGV[0] . " " .  

       Digest::HMAC_MD5::hmac_md5_hex($ARGV[2], $ARGV[1]))" "user@test.ru" "password" "<507.1129797392@mail.test.com>"

Используем полученную последовательность символов для аутентификации:

Z2luZ2VyQGV4YW1wbGUucnUgYjllN2Q1OTUxMGMxNjE0YzIwYjU4N2JkNmFkODk2MDI=

235 Authentication succeeded

quit

Проверяем антивирусный фильтр. Для этого отправим как тело сообщения тестовую сигнатуру EICAR-вируса:

ehlo mail.test.com

mail from:user@test.com

250 OK

rcpt to:user@test.com

250 Accepted

data

354 Enter message, ending with «.» on a line by itself

X5O!P%@APX5O!P%@AP[4PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

.

550-Messege rejected: Virus (Eicar-Test-Signature) Found. Your message was

550 successfully trashed.

Как мы видим, антивирусный фильтр работает нормально, далее приступаем к проверке SSL-соединения. Для этого тербуется подключиться через SSL-клиента на порт к TCPпорту 465:

# openssl

OpenSSL> s_client -host localhost -port 465

Если SSL-соединение прошло успешно, вы увидите приглашение Exim.

Ну вот настройку Exim и проверку работоспособности почти закончили, приступим к сборке и настройке CourierIMAP.

# cd /usr/ports/mail/courier-imap

# make all install clean

В открывшемся меню отмечаем:

[X]       OPENSSL            Build with OpenSSL support

[X]       TRASHQUOTA         Include deleted mails in the quota

[X]       AUTH_MYSQL         MySQL support

Нажимаем , потом . Ждем, пока процесс дойдет до сборки Courier-AuthLib и отмечаем поодержку MySQL:

[X]       AUTH_MYSQL         MySQL support

И так же, как с CourierIMAP: , потом . Ждем окончания сборки. Переходим в директорию /usr/local/etc/authlib/:

# cd /usr/local/etc/authlib

# cat >  authdaemonrc << "EOF"

authmodulelist="authmysql"

authmodulelistorig="authuserdb authvchkpw authpam authldap authmysql authpgsql"

daemons=5

authdaemonvar=/var/run/authdaemond

subsystem=mail

DEBUG_LOGIN=0

DEFAULTOPTIONS="wbnodsn=1"

LOGGEROPTS=""

EOF

С authmysql немного сложнее, так как мы с вами авторизуем пользователя по схеме «username@domain», то нам с вами придется переписать запрос авторизации:

#cat > authmysqlrc << "EOF"

MYSQL_SERVER            localhost

MYSQL_USERNAME          exim

MYSQL_PASSWORD          youpassowrd

MYSQL_PORT              3306

MYSQL_OPT               0

MYSQL_DATABASE          mail

MYSQL_SELECT_CLAUSE     SELECT CONCAT(id,'@',mbox_host), crypt, "", 1001, 6, home, \

CONCAT(home,'/Maildir'), "", id, ""  FROM users WHERE CONCAT(id,'@', mbox_host) = ‘'$(local_part)@$(domain)’'

EOF

Далее приступаем к настройке собственно самих сервисов POP3 и IMAP:

# cd /usr/local/etc/courier-imap

# cat > pop3d << "EOF"

PIDFILE=/var/run/pop3d.pid

MAXDAEMONS=40

MAXPERIP=4

POP3AUTH=""

POP3AUTH_ORIG="PLAIN LOGIN CRAM-MD5 CRAM-SHA1 CRAM-SHA256"

POP3AUTH_TLS=""

POP3AUTH_TLS_ORIG="LOGIN PLAIN"

POP3_PROXY=0

PORT=110

ADDRESS=0

TCPDOPTS="-nodnslookup -noidentlookup"

LOGGEROPTS="-name=pop3d"

POP3DSTART=YES

MAILDIRPATH=Maildir

EOF

# cat > imapd << "EOF"

ADDRESS=0

PORT=143

MAXDAEMONS=40

MAXPERIP=4

PIDFILE=/var/run/imapd.pid

TCPDOPTS="-nodnslookup -noidentlookup"

LOGGEROPTS="-name=imapd"

IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE"

IMAP_KEYWORDS=1

IMAP_CAPABILITY_ORIG="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 AUTH=CRAM-SHA256 IDLE"

IMAP_PROXY=0

IMAP_PROXY_FOREIGN=0

IMAP_IDLE_TIMEOUT=60

IMAP_CAPABILITY_TLS="$IMAP_CAPABILITY AUTH=PLAIN"

IMAP_CAPABILITY_TLS_ORIG="$IMAP_CAPABILITY_ORIG AUTH=PLAIN"

IMAP_DISABLETHREADSORT=0

IMAP_CHECK_ALL_FOLDERS=0

IMAP_OBSOLETE_CLIENT=0

IMAP_UMASK=022

IMAP_ULIMITD=65536

IMAP_USELOCKS=1

IMAP_SHAREDINDEXFILE=/usr/local/etc/courier-imap/shared/index

IMAP_ENHANCEDIDLE=0

IMAP_TRASHFOLDERNAME=Trash

IMAP_EMPTYTRASH=Trash:7

IMAP_MOVE_EXPUNGE_TO_TRASH=0

SENDMAIL=/usr/sbin/sendmail

HEADERFROM=X-IMAP-Sender

IMAPDSTART=YES

MAILDIRPATH=Maildir

EOF

Настраиваем SSL

Для этого редактируем файлы imapd.cnf и pop3d.cnf. Первый из них должен выглядеть следующим образом:

# cat > imapd.cnf << "EOF"

RANDFILE = /usr/local/share/courier-imap/imapd.rand

[ req ]

default_bits = 1024

encrypt_key = yes

distinguished_name = req_dn

x509_extensions = cert_type

prompt = no

[ req_dn ]

C=RU

ST=Russia Federaton

L=Moscow

O=Exim Super Server

OU=IT DEpartament

CN=mail.test.com

emailAddress=abuse@test.com

[ cert_type ]

nsCertType = server

Второй файл pop3d.cnf отличается первой строкой:

RANDFILE = /usr/local/share/courier-imap/pop3d.rand

Создаем самоподписанные сертификаты:

# cd /usr/local/share/courier-imap

# ./mkimapdcert

# ./mppop3dcert

Копируем полученные сертификаты в директорию /usr/local/etc/courier-imap:

# cd /usr/local/etc/courier-imap

# mkdir ssl && cd ssl

# cp /usr/local/share/courier-imap/*.pem .

Настраиваем SSL-соединения для imap и pop3:

# cd ../

Создаем файлы imapd-ssl и pop3d-ssl следующего содержания:

# cat > imapd-ssl << "EOF"

SSLPORT=993

SSLADDRESS=0

SSLPIDFILE=/var/run/imapd-ssl.pid

SSLLOGGEROPTS="-name=imapd-ssl"

IMAPDSSLSTART=YES

IMAPDSTARTTLS=YES

IMAP_TLS_REQUIRED=0

COURIERTLS=/usr/local/bin/couriertls

TLS_PROTOCOL=SSL3

TLS_STARTTLS_PROTOCOL=TLS1

TLS_CERTFILE=/usr/local/etc/courier-imap/ssl/imapd.pem

TLS_VERIFYPEER=NONE

TLS_CACHEFILE=/usr/local/var/couriersslcache

TLS_CACHESIZE=524288

MAILDIRPATH=Maildir

EOF

# cat > pop3d-ssl << "EOF"

SSLPORT=995

SSLADDRESS=0

SSLPIDFILE=/var/run/pop3d-ssl.pid

SSLLOGGEROPTS="-name=pop3d-ssl"

POP3DSSLSTART=YES

POP3_STARTTLS=YES

POP3_TLS_REQUIRED=0

COURIERTLS=/usr/local/bin/couriertls

TLS_PROTOCOL=SSL3

TLS_STARTTLS_PROTOCOL=TLS1

TLS_CERTFILE=/usr/local/etc/courier-imap/ssl/pop3d.pem

TLS_VERIFYPEER=NONE

TLS_CACHEFILE=/usr/local/var/couriersslcache

TLS_CACHESIZE=524288

MAILDIRPATH=Maildir

EOF

Создаем скрипты для запуска:

# cd /usr/local/etc/rc.d

# mv courier_authdaemond.sh 035.courier-auth.sh

# mv courier_imap_imapd.sh 040.courier-imap.sh

# mv courier_imap_pop3d.sh 045.courier-pop3d.sh

# mv courier_imap_imapd_ssl 050.courier-imaps.sh

# mv courier_imap_pop3d_ssl 055.courier_pop3ds.sh

Добавляем записи в rc.conf для запуска скриптов в процессе загрузки:

courier_authdaemond_enable-"YES"

courier_imap_imapd_enable-"YES"

courier_imap_pop3d_enable-"YES"

courier_imap_imapd_ssl_enable-"YES"

courier_imap_pop3d_ssl_enable-"YES"

Запускаем Courier-IMAP:

# /usr/local/etc/rc.d/035.courier-auth.sh start

# /usr/local/etc/rc.d/040.courier-imapd.sh start

# /usr/local/etc/rc.d/045.courier-pop3d.sh start

# /usr/local/etc/rc.d/050.courier-imaps.sh start

# /usr/local/etc/rc.d/055.courier-pop3ds.sh start

Проверяем работу Courier-IMAP по протоколу POP3:

# telnet 127.0.0.1 110

Trying 127.0.0.1...

Connected to mail.test.com.

Escape character is "^]".

+OK Hello there.

user user@test.com

+OK Password required.

pass password

+OK logged in.

list

quit

Проверяем работу Courier-IMAP по протоколу IMAP:

# telnet 127.0.0.1 143

Trying 127.0.0.1...

Connected to mail.test.com.

* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA

IDLE ACL ACL2=UNION STARTTLS] Courier-IMAP ready. Copyright 1998-2005 Double Precision, Inc. 

See COPYING for distribution information.

a001 login user@test.com password

a001 OK LOGIN Ok. // ответ сервера

a001 logout

* BYE Courier-IMAP server shutting down

a001 OK LOGOUT completed

Connection closed by foreign host.

Проверяем работу Courier-IMAP по протоколу POP3 через SSL-соединение:

# openssl

OpenSSL> s_client -host localhost -port 995

.....

.....

.....

Connected to mail.test.com.

+OK Hello there.

quit

Проверяем работу Courier-IMAP по протоколу IMAP через SSL-соединение:

OpenSSL> s_client -host localhost -port 993

......

......

......

* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA

IDLE AUTH=PLAIN ACL ACL2=UNION] Courier-IMAP ready. Copyright 1998-2005 Double Precision, Inc. 

See COPYING for distribution information.

a001 login user@test.com password

a001 OK LOGIN Ok. // ответ сервера

a001 logout

* BYE Courier-IMAP server shutting down

a001 OK LOGOUT completed

closed

Ну вот, в общем, все почти готово. Приступим к настройке DSPAM и свяжем его с Exim, а заодно установим веб-интерфейс для администрирования спам-фильтра. Последним стабильным дистрибутивом на дату написания статьи была версия 3.4.8.

# cd /usr/ports/mail/dspam

# make fetch

# cd /usr/Install

# tar -xvzf /usr/ports/distfiles/dspam-3.4.8.tar.gz

# cd dspam-3.4.8

# ./configure -prefix=/usr/local/dspam \

  --includedir=/usr/local/dspam/include \

  --mandir=/usr/local/dspam/share/man \

  --infodir=/usr/local/dspam/share/info \

  --sysconfdir=/usr/local/dspam/etc \

  --localstatedir=/usr/local/dspam/var \

  --libexecdir=/usr/local/dspam/lib \

  --with-dspam-home=/usr/local/dspam/var/spool \

  --enable-debug \

  --enable-domain-scale \

  --enable-signature-headers \

  --with-delivery-agent="/usr/sbin/exim -oi -oMr spam-scanned"  \

  --enable-whitelist \

  --enable-virtual-users \

  --enable-experimental \

  --with-logdir=/var/log/dspam \

  --enable-neural-networking \

  --with-storage-driver=mysql_drv \

  --with-mysql-includes=/usr/local/include/mysql \

  --with-mysql-libraries=/usr/local/lib/mysql \

  --enable-preferences-extension

# make

# make install

Создаем файл конфигурации. Что означают приведенные ниже опции, вы сможете узнать из официальной документации по DSPAM:

# cd /usr/local/dspam/etc/

# cat > dspam.conf << "EOF"

# Домашняя директория DSPM для работы сервиса

Home /usr/local/dspam/var/spool

# Агент для обработки почты

TrustedDeliveryAgent "/usr/sbin/exim -oi -oMr spam-scanned"

OnFail error

# Пользователи с привилегиями которых может работать DSPAM

Trust exim

Trust root

Trust mail

Trust mailnull

Trust smmsp

Trust daemon

# Включаем отладку

Debug *

# Включаем самообучение

TrainingMode teft

Feature chained

Feature tb=5

Feature whitelist

# Включаем алгоритмы проверки писем

Algorithm graham burton

PValue graham

Preference "spamAction=quarantine"

Preference "signatureLocation=message"      # 'message' or 'headers'

Preference "showFactors=on"

AllowOverride trainingMode

AllowOverride spamAction spamSubject

AllowOverride statisticalSedation

AllowOverride enableBNR

AllowOverride enableWhitelist

AllowOverride signatureLocation

AllowOverride showFactors

AllowOverride optIn optOut

AllowOverride whitelistThreshold

# Описываем подключение к базе данных

MySQLServer             localhost

MySQLPort        3306

MySQLUser        exim

MySQLPass        youpassword

MySQLDb                 dspam

MySQLCompress           true

Notifications   on

PurgeSignatures         14

PurgeNeutral            90

PurgeUnused             90

PurgeHapaxes            30

PurgeHits1S             15

PurgeHits1I             15

LocalMX 127.0.0.1

SystemLog on

UserLog   on

Opt out

EOF

Создаем базу данных для DSPAM:

# mysql -u root -ppassword

mysql> create database dspam;

mysql> grant all on dspam.* to exim@localhost identified by 'youpassword';

mysql> \quit

Далее заносим данные в базу:

# cd /usr/Install/dspam-3.4.8/src/tools.mysql_drv

# mysql -u exim -pyoupassowrd dspam < mysql_objects-4.1.sql

# mysql -u exim -pyoupassowrd dspam < neural.sql

# mysql -u exim -pyoupassowrd dspam < virtual_users.sql

Итак, приступаем собственно к настройке Exim для работы с dspam. Для этого открываем /etc/mail/exim.conf и ищем такую строчку begin routers. После вписываем следующие строки:

dspam_addspam:

        driver = accept

        expn = false

        domains = +local_domains

        local_parts = spam

        transport = addspam

        headers_add = "X-DSPAM-REPORT: Missclassified"

Этот маршрут используется для отправки писем о спаме спам-фильтру в случаях, если спам-фильтр не распознал спам и пропустил письмо как нормальное. Маршрут создает виртуальный адрес вида «spam@domain», где «domain» – имя вашего домена (test.com) по умолчанию, на который и следует пересылать вышеуказанные письма.

dspam_falsepositive:

        driver = accept

        expn = false

        domains = +local_domains

        local_parts = ham:nospam

        transport = falsepositive

        headers_add = "X-DSPAM-REPORT: Falsepositive"

Применяется для отправки писем при ошибочных срабатываниях спам-фильтра, то есть когда спам-фильтр распознал нормальное письмо как спам. Маршрут создает виртуальный адрес вида «ham@domain» и nospam@domain, где domain – имя вашего домена (test.com) по умолчанию, на который и следует пересылать вышеуказанные письма.

spamscan_router:

        no_verify

        headers_remove = X-FILTER-SPAM : X-Spam-Score : X-Spam-Score-Gate : X-Spam-Report : X-Spam-Gate-Subject : X-Spam-Flag : X-S

        condition = "${if and {{!eq{$received_protocol}{spam-scanned}} {!def:h_X-FILTER-SPAM:}} {1}{0}}"

        driver = accept

        headers_add = X-FILTER-SPAM: ICF Team Spam Filter on $primary_hostname, $tod_full\n

           X-SENDER-INFO: ${if def:authenticated_id {ID - ${authenticated_id},}} \

           ${if def:authenticated_sender {authenticated_sender - ${authenticated_sender},}} \

           ${if def:sender_ident {rfc1413(ident) - ${sender_ident},}} \

           ${if def:originator_uid {UID - ${originator_uid},}} \

           ${if def:originator_gid {GID - ${originator_gid}}}

           local_parts = !addham:!addspam:!ham:!spam:!sexy

           transport = spamcheck_transport

           require_files = /usr/local/dspam/var/spool:/usr/local/dspam/bin/dspam

Следующий маршрут используется для прохождения и проверки всей входящей и исходящей почты.

spam_reject:

        driver = redirect

        check_local_user

        user = exim

        group = mail

        headers_add = "X-DSPAM-Rreport: Rejected"

        condition = ${if eq {$h_X-DSPAM-Result:}{Spam}{yes}{no}}

        allow_fail = true

        require_files = $local_part:/usr/local/vmail/${domain}/spam/$local_part

        errors_to = ""

        data = :blackhole:

        more = false

Включает удаление писем, классифицированных как спам для каждого пользователя индивидуально, путем создания файла /usr/local/vmail/domainname/spam/usernamе. Если файл присутствует, то письма удаляются без какого-либо уведомления, если нет, то только помечаются как спам и доставляются как обычно.

Ищем следующую строку begin transports. После описываем транспорты:

spamcheck_transport:

        driver = pipe

        command = "/usr/sbin/exim -oi -oMr spam-scanned -bS"

        transport_filter = /usr/local/dspam/bin/dspam --stdout --deliver=innocent,spam --user $local_part@$domain \

                           --mail-from "${lc:$sender_address}" --rcpt-to "${lc:$local_part}@${lc:$domain}"

        user = exim

        group = mail

        use_bsmtp = true

        home_directory = "/usr/local/dspam/var/spool"

        current_directory = "/usr/local/dspam/var/spool"

        delivery_date_add = true

        return_path_add = true

        envelope_to_add = true

        log_fail_output = true

        log_defer_output = true

        return_fail_output = true

        message_prefix = ""

        message_suffix = ""

        temp_errors = *

Этот транспор запускает спам-фильтр и классифицирует входящие и исходящие письма.

addspam:

        driver = pipe

        command = /usr/local/dspam/bin/dspam --user ${lc:$sender_address} --class=spam --source=error

        return_path_add = false

        return_fail_output = true

        log_output = true

        home_directory = "/usr/local/dspam/var/spool"

        current_directory = "/usr/local/dspam/var/spool"

        user = exim

        group = mail

        message_prefix = ""

        message_suffix = ""

Выполняет обучение спам-фильтра при отправке писем, ошибочно класифицированных как нормальное письмо.

falsepositive:

        driver = pipe

        command = /usr/local/dspam/bin/dspam --user ${lc:$sender_address} --class=innocent --source=error

        return_path_add = false

        return_fail_output = true

        log_output = true

        home_directory = "/usr/local/dspam/var/spool"

        current_directory = "/usr/local/dspam/var/spool"

        user = exim

        group = mail

        message_prefix = ""

        message_suffix = ""

Обучает спам-фильтр при отправке писем, ошибочно классифицированных как спам.

Перезапускаем Exim:

# /usr/local/etc/rc.d/030.exim.sh restart

Смотрим в /var/log/maillog, если видим ошибки, то еще раз проверяем действия по всем пунктам с начала статьи.

Приступаем к настройке CGI-интерфейса для отслеживания работы спам-фильтра и веб-интерфейса для работы с почтовыми ящиками. Для этого нам понадобится WWW-сервер Apache с поддержкой suexec и mod_perl, для желающих можно использовать ssl. Я предлагаю настроить отдельный виртуальный хост для просмотра статистики по отработке фильтра.

# cd /usr/ports/www/apache13-modssl

# make WITH_APACHE_SUEXEC=yes APACHE_SUEXEC_DOCROOT=/usr/local/www/vhosts APACHE_SUEXEC_UIDMIN=50 APACHE_SUEXEC_GIDMIN=5

# make

# make install

# cd /usr/ports/www/mod_perl

# make all install clean

# cd /usr/ports/graphics/p5-GD-Graph3d/

# make all install clean

# cd /usr/ports/lang/php4-extensions

# make all install clean

После того как вы выполните эту команду, выйдет достаточно длинный список выбора модулей. Каждый может выбрать по вкусу, но обязательные модули – это session gd mysql iconv.

Редактируем файл /usr/local/etc/apache/httpd.conf.

Ищем строчку «ServerName» и пишем там fqdn-имя нашего сервера, в данном случае «mail.test.com».

Ищем строчку «AddType application/x-tar .tgz» и после нее вписываем две строки:

AddType application/x-httpd-php .php .phtml

AddType application/x-httpd-php-source .phps

Теперь настроим два виртуальных хоста для SquirrelMail и для dspam.

В самом конце конфигурационного файла вписываем следующее:

NameVirtualHost *

# CGI-интерфейс DSPAM

<VirtualHost *>

ServerName dspam.test.com

ServerAlias dspam.test.com

Options Includes Indexes FollowSymLinks ExecCGI

DocumentRoot /usr/local/www/vhosts/dspam.test.com

User exim

Group mail

<Directory "/usr/local/www/vhosts/dspam.test.com">

    Options Includes Indexes FollowSymLinks ExecCGI

    AllowOverride All

    Order allow,deny

    Allow from all

    DirectoryIndex index.html

    AddHandler cgi-script .cgi

    <IfModule mod_perl.c>

        PerlSendHeader On

        AddHandler cgi-script .cgi

        PerlHandler Apache::Registry

    </IfModule>

</Directory>

ErrorLog /usr/local/www/logs/dspam.test.com/errors.log

CustomLog /usr/local/www/logs/dspam.test.com/access.log common

</VirtualHost>

# Веб-интерфейс SquirrelMail

<VirtualHost *>

ServerName mail.test.com

ServerAlias test.com

Options Includes Indexes FollowSymLinks MultiViews

DocumentRoot /usr/local/www/vhosts/mail.test.com    

DirectoryIndex index.php index.phtml index.html

ErrorLog /usr/local/www/logs/mail.test.com/errors.log

CustomLog /usr/local/www/logs/mail.test.com/access.log common

</VirtualHost>

Сохраняем, выходим и переходим в директорию наших будущих виртуальных хостов:

# cd /usr/local/www

Создаем каталоги для контента и протоколов:

# mkdir -p vhosts/dspam.test.com vhosts/mail.test.com logs/dspam.test.com logs/mail.test.com

Создаем файлы логов, я предлагаю использовать на каждый виртуальный хост свой журнал обращений и ошибок, дабы облегчить поиск ошибок в дальнейшем.

# touch logs/dspam.test.com/access.log logs/mail.test.com/access.log logs/dspam.test.com/errors.log logs/mail.test.com/errors.log

Передаем права пользователю www на директорию logs:

# chown -R www:www logs

Копируем содержимое /usr/Install/dspam-3.4.8/cgi в директорию, предназначенную для анитиспам-фильтра:

# cd vhosts/dspam.test.com

# cp -R /usr/Install/dspam-3.4.8/cgi/* .

Передаем права пользователю Exim:

# cd ../

# chown -R exim:mail dspam.test.com

Cледующие команды выполняются в директории /usr/local/www/vhosts/dspam.test.com.

Создаем файл .htpasswd следующего содержания:

#cat > .htaccess << "EOF"

AuthType Basic

AuthName "DSPAM Statistic Server"

AuthUserFile /usr/local/www/passwd/htpaasswd

require valid-user

EOF

После правим файл admins, убираем запись суперпользователя и вписываем адреса пользователей, которые имеют право администрировать сервер статистики (в нашем случае user@test.com).

Выставляем права на файл .htaccess:

# chown www:www .htaccess

# chmod 640 .htaccess

Создаем директорию для хранения файла паролей:

# mkdir /usr/local/etc/apache/htpasswd

Передаем права на директорию пользователю www:

# chown www:www /usr/local/etc/apache/htpasswd

Создаем файл паролей:

# htpasswd -c /usr/local/etc/apache/htpasswd/htpasswd user@test.com

Вводим пароль такой же, который использовали при создании почтового.

Устанавливаем права на файл:

# chown www:www /usr/local/etc/apache/htpasswd/htpasswd

# chmod 640 /usr/local/etc/apache/htpasswd/htpaswd

Выполняем сборку и устанавливаем SquirrelMail:

# cd /usr/ports//mail/squirrelmail

# make all install clean

После установки нужно скопировать полученный при сборке SquirrelMail в предназначенную для него директорию:

# cd /usr/local/www/vhosts/mail.test.com

# cp -R ../../squirrelmail/* .

# cd ../

# chown -R www:www mail.test.com

# cd mail.test.com

# ./configure

Настраиваем для наших потребностей.

Рассказывать про конфигурацию SquirrelMail не вижу смысла, так как там все до банальности просто. Здесь находится исчерпывающая документация по настройке и конфигурированию этого сервиса – http://www.squirrelmail.org/wiki/SquirrelMail.

Добавляем в rc.conf следующую строчку для запуска Apache:

apache_enable="YES"

Создаем скрипт для запуска Apache:

# cd /usr/local/etc/rc.d

# cp apache.sh 060.apache.sh

Запускаем Apache:

# ./060.apache.sh start

Ну вот вроде и все.

Заключение

За время эксплуатации (примерно полтора года) данный комплекс показал себя как надежный почтовый сервер. При грамотном обучении DSPAM начинает распознавать 99% процентов спама, делая одну ошибку примерно на 5060 тысяч проходящих писем. Задержка при обработке каждого письма составляет примерно 1-2 секунды.

Благодарности

Выражаю благодарность Сергею Супрунову за его замечательную статью по описанию работы DSPAM в журнале «Системный администратор», которая послужила руководством для использования DSPAM в место Spamassasin + Amavisd.

Ссылки:

  1. http://www.exim.org – официальный сайт MTA Агента Exim.
  2. http://www.clamav.com – официальный сайт антивирусного фильтра.
  3. http://dspamwiki.woozle.org/DspamWithExim – Wiki-сайт по настройке Dspam.
  4. http://www.mysql.com – официальный сайт cервера баз данных.
  5. http://www.php.net – официальный сайт языка програмирования PHP.
  6. http://www.apache.com – официальный сайт веб-сервера Apache.
  7. http://www.squirrelmail.org – официальный сайт веб-интерфейса написанного на языке PHP для работы с почтовыми ящиками.
  8. http://www.freebsg.org – официальный сайт операционной системы FreeBSD.
  9. http://www.samag.ru/cgi-bin/go.pl?q=source – сайт журнала «Системный администратор», раздел «Исходный код».

Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-45
E-mail: sa@samag.ru