Павел Семенец
Кто из нас не мечтал создать свою мультидоменную почтовую систему,
которая работала бы стабильно, надежно и безопасно, предлагала множество
удобных функций, защищала от вирусов и спама, умела авторизовывать
пользователей, шифровать передаваемый трафик, и в то же время была проста в
обслуживании. Это особенно актуально для почтовых систем больших компаний или
провайдерских серверов, предоставляющих почтовые сервисы внешним клиентам. Как
добиться такого результата, затратив минимум усилий?
Сразу хотелось бы отметить, что данный труд не предназначен для
новичков в мире 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