Журнал Системный Администратор, Январь 2006

Журнал Системный Администратор

Январь 2006

Цена: $4.5 US

  Подписаться

Зарегистриванные пользователи, пожалуйста следуйте этой ссылке

Версия для печати Вернуться к оглавлению

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

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

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

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

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

n  Exim – MTA (Mail Tranfer Agent), на момент написания статьи доступная версия 4.53.

n  MySQL – реляционная СУБД требуется для более удобного управления пользователями и доменами, которые будет поддерживать наш почтовый сервер.

n  Courier-Imap – один из самых быстрых и защищенных серверов для работы с почтовыми ящиками, поддерживающий работу по протоколу SSL.

n  DSPAM – быстрый и очень гибкий в настройке антиспам фильтр.

n  SquirrelMail – один из самых лучших веб-интерфейсов для работы с почтовыми ящиками.

n  ClamAV – наиболее зрелый из бесплатных антивирусных фильтров.

n  ОС 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\0user\@test.com\0password");'

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), "\n"' 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[4\PZX54(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

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

[X]       AUTH_MYSQL         MySQL support

И так же, как с CourierIMAP: <TAB>, потом <Enter>. Ждем окончания сборки. Переходим в директорию /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