Павел Семенец
Строим мультидоменный почтовый сервер с защитой от вирусов и спама
Кто из нас не мечтал создать свою мультидоменную почтовую систему, которая работала бы стабильно, надежно и безопасно, предлагала множество удобных функций, защищала от вирусов и спама, умела авторизовывать пользователей, шифровать передаваемый трафик, и в то же время была проста в обслуживании. Это особенно актуально для почтовых систем больших компаний или провайдерских серверов, предоставляющих почтовые сервисы внешним клиентам. Как добиться такого результата, затратив минимум усилий?
Сразу хотелось бы отметить, что данный труд не предназначен для новичков в мире 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");"
# perl -MMIME::Base64 -e "print encode_base64("password");"
Смотрим:
# 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.
Ссылки:
- http://www.exim.org – официальный сайт MTA Агента Exim.
- http://www.clamav.com – официальный сайт антивирусного фильтра.
- http://dspamwiki.woozle.org/DspamWithExim – Wiki-сайт по настройке Dspam.
- http://www.mysql.com – официальный сайт cервера баз данных.
- http://www.php.net – официальный сайт языка програмирования PHP.
- http://www.apache.com – официальный сайт веб-сервера Apache.
- http://www.squirrelmail.org – официальный сайт веб-интерфейса написанного на языке PHP для работы с почтовыми ящиками.
- http://www.freebsg.org – официальный сайт операционной системы FreeBSD.
- http://www.samag.ru/cgi-bin/go.pl?q=source – сайт журнала «Системный администратор», раздел «Исходный код».