Почтовый сервер под Ubuntu Server: связка DBmail + Postfix + sasl + spamassassin + clamav

24.12.2009 13 Автор Vovanys

В статье будет описано создание связки DBmail, Postfix, sasl, spamassassin и clamav.

О каждом поподробнее:

DBmail будет использоваться для хранения почты, учетных записей в базе данных mysql.

Postfix — для отправки  писем и получения из вне.

Sasl используется для авторизации, чтобы использовать postfix как relay, для того чтобы отправлять почту вне нашего домена.

Spamassassin для поиска спама в письмах.

Clamav — антивирус который будет в данном случае проверять почту.

перед установкой DBmail необходимо установить mysql-server

apt-get install mysql-server
Шаг 1. Установка DBmail

Для установки DBmail в Ubuntu уже имеется готовый пакет.

apt-get install dbmail-mysql

Создаем базу данных для хранения писем и учетных записей.
mysql -p
вводим пароль root mysql сервера
CREATE DATABASE dbmail;
GRANT ALL ON dbmail.* TO 'dbmail'@'localhost' IDENTIFIED BY 'пароль';
\q
gunzip < /usr/share/doc/dbmail-mysql/examples/create_tables.mysql.gz |mysql dbmail -p

База создана, переходим к настройке DBmail.

Открываем любимым редактором файл /etc/default/dbmail и вносим такие строчки:

START_IMAPD=1
START_LMTPD=1

Это необходимо для автоматического старта из скрипта /etc/init.d/dbmail.

Редактируем сам скрипт запуска /etc/init.d/dbmail, приводим к вот такому виду:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
IMAPD=/usr/sbin/dbmail-imapd
LMTPD=/usr/sbin/dbmail-lmtpd
IMAPD_NAME=dbmail-imapd
LMTPD_NAME=dbmail-lmtpd
NAME="dbmail"
PID_DIR="/var/run/$NAME/"
DESC="dbmail servers"
test -x $IMAPD || exit 0
test -x $LMTPD || exit 0
set -e
. /lib/lsb/init-functions
[ -e /etc/default/dbmail ] && . /etc/default/dbmail
if [ ! -d ${PID_DIR} ]; then
mkdir -p -m 0755 ${PID_DIR}
chown dbmail:dbmail ${PID_DIR}
fi
service_start() {
eval '_daemon=$'$1
eval '_name=$'$1'_NAME'
[ -e $_daemon ] || return 0
log_progress_msg "$_name"
start-stop-daemon --start --exec $_daemon
r=$?
if [ $r -gt 0 ]; then
log_failure_msg "failed"
return $r
fi
return 0
}
service_stop() {
eval '_daemon=$'$1
eval '_name=$'$1'_NAME'
log_progress_msg "$_name"
start-stop-daemon --stop --retry 10 \
--pidfile ${PID_DIR}/${_name}.pid >/dev/null 2>&1 || true
pidof ${_name} >/dev/null 2>&1 || return 0
# try harder
echo -n "."
killall ${_name} >/dev/null 2>&1 || true
sleep 4
pidof ${_name} >/dev/null 2>&1 || return 0
echo -n "."
killall -9 ${_name} >/dev/null 2>&1 || true
sleep 2
pidof ${_name} >/dev/null 2>&1 || return 0
echo -n "."
log_failure_msg "failed"
return 1
}
service_reload() {
eval '_daemon=$'$1
eval '_name=$'$1'_NAME'
log_progress_msg "$_name"
start-stop-daemon --stop --signal HUP --quiet --pidfile ${PID_DIR}/${_name}.pid
r=$?
if [ $r -gt 0 ]; then
log_failure_msg "failed"
return $r
fi
return 0
}
case "$1" in
start)
log_daemon_msg "Starting $DESC"
r=0
if [ "$START_IMAPD" ]; then service_start "IMAPD" || r=1; fi
if [ "$START_LMTPD" ]; then service_start "LMTPD" || r=1; fi
log_end_msg $r
;;
stop)
log_daemon_msg "Stopping $DESC"
r=0
if [ "$START_IMAPD" ]; then service_stop "IMAPD" || r=1; fi
if [ "$START_LMTPD" ]; then service_stop "LMTPD" || r=1; fi
log_end_msg $r
;;
reload)
log_daemon_msg "Reloading $DESC"
r=0
if [ "$START_IMAPD" ]; then service_reload "IMAPD" || r=1; fi
if [ "$START_LMTPD" ]; then service_reload "LMTPD" || r=1; fi
log_end_msg $r
;;
restart|force-reload)
$0 stop
$0 start
;;
*)
N="$NAME"
echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
exit 1
;;
esac
exit 0

Теперь редактируем конфигурационных файл /etc/dbmail/dbmail.conf и до водим его до такого состояния.
# Configuration file for DBMAIL
[DBMAIL]
driver = mysql
authdriver = sql
host = localhost
sqlport = 3306
sqlsocket = /var/run/mysqld/mysqld.sock
user = dbmail
pass = пароль_который_был_создан_при_создании_базы_данных
db = dbmail
table_prefix = dbmail_
encoding = latin1
default_msg_encoding = latin1
postmaster = postmaster@ваш_хост_точка_чего_то
sendmail = /usr/sbin/sendmail
TRACE_SYSLOG = 3
TRACE_STDERR = 1
EFFECTIVE_USER = dbmail
EFFECTIVE_GROUP = dbmail
BINDIP = *
NCHILDREN = 2
MAXCHILDREN = 10
MINSPARECHILDREN = 2
MAXSPARECHILDREN = 4
MAXCONNECTS = 10000
MAX_ERRORS = 500
TIMEOUT = 300
login_timeout = 60
RESOLVE_IP = no
logfile = /var/log/dbmail/dbmail.log
errorlog = /var/log/dbmail/dbmail.err
pid_directory = /var/run/dbmail
state_directory = /var/run/dbmail
query_time_info = 10
query_time_message = 20
query_time_warning = 30
[LMTP]
BINDIP = 127.0.0.1
PORT = 24
[IMAP]
PORT = 143
TIMEOUT = 4000
IMAP_BEFORE_SMTP = no
# end of configuration file

Рестартуем DBmail: /etc/init.d/dbmail restart

Проверяем: netstat -an |grep 24 и netstat -an |grep 143

Если все поднялось заводим новые учетки:
dbmail-users -a юзер@твой_хост_точка_чего_то -w пароль_нового_ящика

Шаг 2. Установка Postfix

Установка стандартна:

apt-get install postfix-mysql

В появляющемся окне нажимаем Internet Site, вводим полное название вашего хоста.

Редактируем файл /etc/postfix/master.cf .

Добавляем в конец файла:

dbmail-lmtp     unix    -       -       n       -       -       lmtp

Не забываем про пустую строку в конце файла.

Редактируем файл /etc/postfix/main.cf
local_recipient_maps = mysql:/etc/postfix/dbmail-aliases.cf mysql:/etc/postfix/dbmail-recip.cf
mailbox_transport = dbmail-lmtp:127.0.0.1:24

Так же не забываем про пустую строку.

Создаем файл который будет отвечать за извлечение логинов и паролей из БД:

/etc/postfix/dbmail-aliases.cf

user = dbmail
password = пароль
hosts = 127.0.0.1
dbname = dbmail
table = dbmail_aliases
select_field = alias
where_field = alias

/etc/postfix/dbmail-recip.cf

user = dbmail
password = пароль
hosts = 127.0.0.1
dbname = dbmail
table = dbmail_users
select_field = userid
where_field = userid

В этих файлах была зарыта собака которую я искал 2 часа 🙁

Если указывать hosts = localhost, то postfix лезет в mysql не через порт 3306, а через сокет.

А если указать ip то все нормально.

Все можем перезагружать Postfix: /etc/init.d/postfix restart

В итоге у нас работающая почтовая система, но без пересылки, без авторизации, без антиспама и антивируса.

Шаг 3. Установка SASL для авторизации, с помощью которой будет разрешать пересылка (relay).

По умолчанию при установке Posfix-а sasl и tls устанавливаются автоматически, но для авторизации в mysql необходимо доставить пакет libsasl2-modules-sql:
apt-get install libsasl2-modules-sql

Для того чтобы активировать sasl и научить его брать пароли из mysql нужно создать файл /etc/postfix/sasl/smtpd.conf и внести данные соединении.

auxprop_plugin: sql
sql_engine: mysql
sql_user: dbmail
sql_passwd: пароль
sql_hostnames: 127.0.0.1
sql_database: dbmail
sql_statement: select passwd from dbmail_users where userid='%u@%r'

Вносим изменения в /etc/postfix/main.cf

smtpd_sasl_local_domain =
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination
smtpd_tls_auth_only = no
smtp_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

И как бы все 🙂 Перезапускаем и проверяем.

Шаг 4. Установка антиспама Spamassassin.

Устанавливаем:
apt-get install spamassassin

Для автостарта антиспама надо внести изменения в /etc/default/spamassassin

ENABLED=1

Создаем пользователя для запуска антиспама:
adduser --disabled-password --disabled-login --home /etc/spamassassin spamd

Приводим файл конфигурации антиспама /etc/spamassassin/local.cf  к такому:

rewrite_header Subject *****SPAM*****
report_safe 0
required_score 5.0
use_bayes 1
bayes_auto_learn 1
bayes_ignore_header X-Bogosity
bayes_ignore_header X-Spam-Flag
bayes_ignore_header X-Spam-Status

Стартуем /etc/init.d/spamassassin start .

Редактируем файл постфикса /etc/postfix/master.cf

Строку  smtp      inet  n       -       -       -       -       smtpd заменяем на:

smtp      inet  n       -       -       -       -       smtpd -o content_filter=spamassassin

Перед dbmail-lmtp     unix    -       -       n       -       -       lmtp добавляем:

spamassassin unix -     n       n       -       -       pipe    user=spamd argv=/usr/bin/spamc -s 5120000 -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}

Шаг 5. Установка антивируса Clamav.

Устанавливаем:

apt-get install clamsmtp

Редактируем /etc/clamsmtpd.conf : OutAddress: 10026
Listen: 127.0.0.1:10025
ClamAddress: /var/run/clamav/clamd.ctl
Header: X-AV-Checked: ClamAV using ClamSMTP
TempDirectory: /tmp
PidFile: /var/run/clamsmtp/clamsmtpd.pid
Quarantine: off
TransparentProxy: off
User: clamsmtp

Перезапускаем: /etc/init.d/clamsmtp restart

Редактируем конфиг постфикса /etc/postfix/main.cf :

content_filter = avscan:127.0.0.1:10025
receive_override_options = no_address_mappings

Добавляем в  /etc/postfix/master.cf  до dbmail-lmtp     unix    -       -       n       -       -       lmtp строки:

avscan unix - - n - 10 smtp -o smtp_send_xforward_command=yes
127.0.0.1:10026 inet n - n - 10 smtpd -o content_filter=
spamassassin unix - n n - - pipe user=spamd argv=/usr/bin/spamc -s 5120000 -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}

Перезапускаем: /etc/init.d/postfix restart

Вот как бы и все.

P.S. При настройке почтовой программы либо еще чего, логин к почте пишется полностью вместе с @ и доменом:

root@vpupkin.ru
При  вставке текста  в конфиги лучше использовать nano т.к. он расставляет табуляцию как надо.