Postfix+dovecot+Антиспам+Антивирус

Под таким названием решил представить такую сборку: postfix(MTA), dovecot(POP3/IMAP server), mysql (для хранения юзеров), amavis(антиспам — spamassassin, антивирус — clamav), postfixadmin (для заведения почтовых аккаунтов), roundcube (для доступа через web интерфейс к почтовым ящикам) и с защитой TLS

Тестовый стенд: Debian 6.0

Перед установкой обновим репозитарий:

#apt-get update

1) Установка postfix

#apt-get install postfix-mysql postfix postfix-pcre

После установки приводим переходим в каталог /etc/postfix и конфигурационные файлы приводим к такому виду:

— файл main.c:

mydomain = domain.com.ua
myorigin = $myhostname
inet_interfaces = all
mydestination = $myhostname, mysql:/etc/postfix/mysql/mydestination.cf
local_recipient_maps = unix:passwd.byname $alias_maps $virtual_mailbox_maps
unknown_local_recipient_reject_code = 550
unverified_recipient_reject_code = 550
mynetworks_style = subnet
mynetworks = 127.0.0.0/8
relay_domains = $mydestination
alias_maps = hash:/etc/aliases
transport_maps = mysql:/etc/postfix/mysql/transport.cf
virtual_alias_maps =mysql:/etc/postfix/mysql/virtual.cf
virtual_alias_domains = $virtual_alias_maps
alias_database =hash:/etc/aliases
debug_peer_level = 3
smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_pipelining, permit
smtpd_helo_restrictions = permit
smtpd_sender_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_sender, reject_unknown_sender_domain, reject_unverified_sender, reject_rbl_client bl.spamcop.net, reject_rbl_client dnsbl.njabl.org, reject_rbl_client dul.dnsbl.sorbs.net, reject_rbl_client sbl-xbl.spamhaus.org, reject_rbl_client zen.spamhaus.org, permit
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unauth_destination, reject_unknown_recipient_domain, reject_unverified_recipient, reject_rbl_client bl.spamcop.net, reject_rbl_client dnsbl.njabl.org, reject_rbl_client dul.dnsbl.sorbs.net, reject_rbl_client sbl-xbl.spamhaus.org, reject_rbl_client dul.ru, reject_rbl_client zen.spamhaus.org, permit
smtpd_data_restrictions = permit
smtpd_end_of_data_restrictions = permit
smtpd_etrn_restrictions = permit
virtual_mailbox_base = /var/spool/vmail
virtual_mailbox_maps = mysql:/etc/postfix/mysql/virtual_mailbox.cf
virtual_minimum_uid = 990
virtual_mailbox_limit_maps=mysql:/etc/postfix/mysql/virtual_mailbox_limit.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user’s maildir has no space available in their inbox.
virtual_overquota_bounce = yes
virtual_uid_maps = static:990
virtual_gid_maps = static:990
virtual_maps = mysql:/etc/postfix/mysql/virtual.cf
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
smtpd_sasl_type = dovecot
smtpd_sasl_path = /var/run/dovecot/auth-client
broken_sasl_auth_clients = yes
smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /etc/ssl/smtpd.pem
smtpd_tls_cert_file = /etc/ssl/smtpd.pem
smtpd_tls_loglevel = 5
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
content_filter = smtp-amavis:[127.0.0.1]:10024

— файл master.cf :

Расскоментируем такие строки (если же нет — просто добавляем; вторая и третья строка должны начинаться с пробела)

smtps inet n - - - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes

После строки

scache    unix  -       -       -       -       1       scache

удаляем всё и добавляем такое (все строки, кроме dovecot, smtp-amavis и 127.0.0.1:10025 должны начинаться с отступов, табуляции):

dovecot unix - n n - - pipe
flags=DRhu user=virtual:virtual argv=/usr/libexec/dovecot/deliver -d ${recipient}

smtp-amavis unix - - n - 8 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
-o max_use=8

127.0.0.1:10025 inet n - n - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_delay_reject=no
-o smtpd_client_restrictions=permit_mynetworks,reject
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o mynetworks=127.0.0.0/8
-o strict_rfc821_envelopes=yes
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o smtpd_client_connection_count_limit=0
-o smtpd_client_connection_rate_limit=0
-o receive_override_options=no_header_body_checks,no_unknown_recipient_checks

Создаём папку /etc/postfix/mysql и в ней такие файлы:

— mydestination.cf такого содержания:

hosts = 127.0.0.1
dbname = postfixadmin
user = mail
password = mail
table = domain
select_field = transport
where_field = domain
additional_conditions = AND (transport = 'local' OR transport = 'virtual')

— transport.cf такого содержания:

hosts = 127.0.0.1
dbname = postfixadmin
user = mail
password = mail
table = domain
select_field = transport
where_field = domain

— virtual.cf такого содержания:

hosts = 127.0.0.1
dbname = postfixadmin
user = mail
password = mail
table = alias
select_field = goto
where_field = address

— virtual_mailbox.cf такого содержания:

hosts = 127.0.0.1
dbname = postfixadmin
user = mail
password = mail
table = mailbox
select_field = maildir
where_field = username
additional_conditions = and active = '1'

— virtual_mailbox_limit.cf такого содержания:

hosts = 127.0.0.1
dbname = postfixadmin
user = mail
password = mail
table = mailbox
select_field = quota
where_field = username

2) Установка dovecot.

#apt-get install dovecot-common dovecot-imapd dovecot-pop3d

После установки приводим переходим в каталог /etc/devecot и конфигурационные файлы приводим к такому виду:

— файл dovecot.conf:

protocols = imaps pop3s
listen = *
disable_plaintext_auth = yes
log_path = /var/log/maillog
log_timestamp = "%b %d %H:%M:%S "
syslog_facility = mail
ssl=yes
ssl_cert_file = /etc/ssl/smtpd.pem
ssl_key_file = /etc/ssl/smtpd.pem
mail_location = maildir:%h
mail_privileged_group = mail
dotlock_use_excl = yes
verbose_proctitle = yes
first_valid_uid = 990
first_valid_gid = 990
maildir_copy_with_hardlinks = yes
protocol imap {
imap_client_workarounds = delay-newmail outlook-idle netscape-eoh tb-extra-mailbox-sep
}
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}
protocol lda {
postmaster_address = postmaster@domain.com.ua
auth_socket_path = /var/run/dovecot/auth-master
}
auth_default_realm = domain.com.ua
auth_username_format = %Lu
auth_verbose = yes
auth_debug = yes
auth default {
mechanisms = digest-md5 plain login
passdb pam {
}
passdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
userdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
user = root
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0660
user = vmail
group = vmail
}
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
}
dict {
}
plugin {
}

— файл dovecot-sql.conf:

driver = mysql
connect = host=localhost user=mail password=mail dbname=postfixadmin
default_pass_scheme = MD5
user_query = SELECT CONCAT('/var/spool/vmail/',maildir) AS home, 990 AS uid, 990 AS gid FROM mailbox WHERE username = '%n@%d'
password_query = SELECT password AS password FROM mailbox WHERE username = '%n@%d' AND active = '1'

3) Установка mysql

#apt-get install mysql-server mysql-client

В процессе установки устанавливаем пароль для root’a. После установки подключаемся к mysql и создаём базу postfixadmin, пользователей postfixadmin и mail. В базе postfixadmin будут храниться наши ящики, пользователь postfixadmin с паролем postfixadmin будет иметь полные права на эту БД (от его имени будут вноситься изменения в БД), а пользователь mail с паролем mail — права только на чтение (этот пользователь нужен для postfix’a и dovecot’a):

#mysql -p

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 284
Server version: 5.0.81 FreeBSD port: mysql-server-5.0.81
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>CREATE DATABASE postfixadmin;
mysql>GRANT ALL PRIVILEGES ON postfixadmin.* TO 'postfixadmin'@'localhost' IDENTIFIED BY 'postfixadmin';
mysql>GRANT SELECT ON postfixadmin.* TO 'mail'@'localhost' IDENTIFIED BY 'mail';
mysql>FLUSH PRIVILEGES;
mysql>QUIT;

4) Установка антивируса clamav

#apt-get install clamav-base clamav

5) Установка антиспама spamassassin

#apt-get install spamassassin

После установки редактируем файл /etc/default/spamassassin:

ENABLED=1
OPTIONS="--create-prefs --max-children 100 --helper-home-dir -u amavis"
CRON=1

6) Установка amavis.

#apt-get install amavisd-new arj bzip2 cabextract cpio file gzip nomarch pax unzip zip zoo

Кроме самого амависа мы установили поддержку архивов (что бы проверялись архивные сообщения).

Переходим в каталог /etc/amavis/conf.d и правим такие файлы:

— файл 05-node_id:

$myhostname = "mail.domain.com.ua";

— файл 15-av_scanners:

удаляем всё, оставляем только упоминания о clamav.

— файл 15-content_filter_mode:

расскоментируем строки (собственно включаем проверку на вирусы спам)

@bypass_virus_checks_maps = (
\%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);

@bypass_spam_checks_maps = (
\%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

— файл 20-debian_defaults:

$virus_admin = "virus\@$mydomain";
$mydomain='domain.com.ua';

7) Установка postfixadmin

В репозитариях нету такого пакета, поэтому скачиваем с офф.сайта (http://sourceforge.net/projects/postfixadmin/) .

Дополнительно придётся поставить такие пакеты:

#apt-get install php5-mysql php5-imap

Теперь отредактируем файл config.inc.php:

$CONF['configured'] = true;
$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = 'postfixadmin';
$CONF['database_name'] = 'postfixadmin';
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';

Остальные параметры по желанию. После этого запускаем установку http://IP/postfixadmin/setup.php и следуем указанием установщика. В конце будет предложено создать админа.

8) Установка roundcube.

В репозитариях находится довольно старый релиз (0.3), поэтому рекомендую качать с офф.сайта версию 0.5. Переходим к настройкам:

файл db.inc.php:

$rcmail_config['db_dsnw'] = 'mysql://roundcube:roundcube@localhost/roundcube';

файл main.inc.php

$rcmail_config['default_host'] = 'ssl://localhost';
$rcmail_config['default_port'] = 993;
$rcmail_config['imap_auth_type'] = 'LOGIN';
$rcmail_config['smtp_server'] = 'ssl://localhost';
$rcmail_config['smtp_port'] = 465;
$rcmail_config['smtp_user'] = '%u';
$rcmail_config['smtp_pass'] = '%p';
$rcmail_config['smtp_auth_type'] ='LOGIN';
$rcmail_config['username_domain'] = 'domain.com.ua';
$rcmail_config['mail_domain'] = 'domain.com.ua';
$rcmail_config['default_charset'] = 'UTF-8';

9) Подготовительные работы.

— создадим каталог /var/spool/vmail, в котором собственно и будет храниться наша почта.

#mkdir /var/spool/vmail

— заведём юзера vmail и группу vmail, с uid=990, gid=990 и сделаем его владельцем папки /var/spool/vmail с правами 700.

#groupadd -g 990 vmail
#useradd -u 990 -g 990 -d /var/spool/vmail vmail
#chmod -R 0700 /var/spool/vmail

— добавим юзера postfix в группы mail, dovecot, vmail

#usermod -G mail,dovecot,vmail postfix

— добавим юзера amavis в группу clamav, и пользователя clamav в группу amavis

#usermod -G amavis clamav
#usermod -G clamav amavis

— генерируем сертификаты:

#cd /etc/ssl/ && openssl req -new -x509 -nodes -out smtpd.pem -keyout smtpd.pem -days 100000

Внимание!

В случае проблем с сертификатам или с тем, что почтовый клиент не хочет цепляться на ssl порт, попробуйте рекомендации из этой статьи

Запускаем теперь сервисы:

-mysql:

#/etc/init.d/mysql start

-clamav:

#/etc/init.d/clamav-daemon start

-spamassassin:

#/etc/init.d/spamassassin start

-dovecot:

#/etc/init.d/dovecot start

-postfix:

#/etc/init.d/postfix start

После этого можно полноценно отправлять почту.

Postfix+dovecot+Антиспам+Антивирус: 36 комментариев

  1. Андрей

    добрый день. Не понял как установить roundcube и вот эти пункты

    — заведём юзера vmail и группу vmail, с uid=990, gid=990 и сделаем его владельцем папки /var/spool/vmail с правами 700.
    — добавим юзера postfix в группы mail, dovecot, vmail
    — добавим юзера amavis в группу clamav, и пользователя clamav в группу amavis

    можно пожалуйста подробее

  2. Андрей

    Огромное спасибо.
    Сделал всё по инструкции, создал главного админа в postfixadmin, но не могу попасть в roundcube. Постоянно ошибка «Неудачное соединение с IMAP сервером».

    1. skeletor Автор записи

      Рекомендую смотреть в логи /var/log/mail.log, скорее всего неправильно указан порт или адрес сервера. Так же можно включить дебаг в dovecot’e и тогда ещё яснее будет.

  3. Андрей

    Всё перерыл, а ошибка из лога такая: IMAP Error: Login failed for pupkin@pupkin.org from XXX.XXX.XXX.XXX. Could not connect to ssl://localhost:993: В соединении отказано in /usr/share/roundcube/program/include/rcube_imap.php on line 205 (POST /mail/?_task=login&_action=login)

    1. skeletor Автор записи

      Вот ошибка Could not connect to ssl://localhost:993 Видимо то ли неправильно указан адрес, то ли порт закрыт, то ли указать вместо localhost ->>> 127.0.0.1

  4. Artur

    Очень занимательная статья — спасибо! Но вот только вы не осветили подробно, как создавать пользователей, ведь их может быть более 1000 например 😉

    1. skeletor Автор записи

      В самом начале статьи я писал

      postfixadmin (для заведения почтовых аккаунтов)

      А сколько их будет — разницы нет. Если нужно добавить быстро 1000 пользователей — писать скрипт, который будет загонять их прямо в mysql.

      1. Gaura

        Postfixadmin создает пользователей только в базе. Ведь по идее, исходя из статьи, он должен создавать каталоги по адресу var/spool/vmail. Но там ничего не создается. Где же ждать появления ящиков?

        1. skeletor Автор записи

          Postfixadmin создает пользователей только в базе. Ящики по адресу /var/spool/vmail создаёт MTA или MUA, то есть postfix или dovecot.

  5. zorrkin

    Спасибо за статью.
    Не подскажите, какие строки отвечают за smtp аунтификацию.
    Оутлук не отправляет relay acces denied. roundcube Тоже =( хотелось бы разобраться!

    1. skeletor Автор записи

      99% проблема в отправке без авторизации. За отправку отвечает настройка smtpd_sender_restrictions, которая разрешает\запрещает отправку по определённым условиям.

      1. zorrkin

        Прошу прощения, дело в том что у меня даже не запрашивается авторизация. acces denied. куда копать?

          1. skeletor Автор записи

            В статье рассмотрена отправка с использованием авторизации

          1. zorrkin

            То есть, оутлук должен запрашивать пароль при отправке письма?

          2. skeletor Автор записи

            Вы должны его настроить и в нём прописать параметры отправки (логин, пароль)

  6. zorrkin

    18:51:57 small postfix/smtpd[5214]: fatal: no SASL authentication mechanisms
    вот такая ошибка если пытаюсь отправить через roundcube.
    В outlook при заданном пароле relay acces denied.

    1. skeletor Автор записи

      У вас не настроена авторизация в postfix’e. То есть он не знает какие механизмы авторизации есть.

      1. zorrkin

        Хм. Всё делал по статье. Спасибо буду терзать гугл. Извините за беспокойство!

          1. kuzya

            как ты решил эту проблему???? postfix/smtpd[7412]: fatal: no SASL authentication mechanisms

          2. skeletor Автор записи

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

  7. Олег

    Добрый день.

    уже 2 суток не могу настроить. Нашел вашу инструкцию, по отзывам у всех все ок.

    но не у меня…

    Ubuntu 12.04 все как у вас. Перед установкой снес предыдущие Posfix Dovecot
    apt-get autoremove —purge dovecot-common dovecot-pop3d dovecot-imapd
    apt-get autoremove —purge postfix

    Initializing mail storage from mail_location setting failed: mkdir(/var/www/Maildir) failed: Permission denied

    заменил на mail_location = maildir:/var/spool/vmail/%u/

    auth: Fatal: Unknown database driver ‘mysql’
    master: Error: service(auth): command startup failed, throttling
    pop3-login: Error: Timeout waiting for handshake from auth server.

    1. skeletor Автор записи

      Добрый.
      dovecot собран без поддержки mysql, установите пакет dobecot-mysql.

      1. Олег

        Хух!

        В postfix где настройки на SQL localhost ему не нравится хотел 127.0.0.1 хотя в базе созданы юзера и на localhost и на 127.0.0.1. И при том, что postfixadmin на MySQL 127.0.0.1 конектился.

        у меня не прокатила строка
        smtpd_sasl_path = /var/run/dovecot/auth-client

        надо
        /etc/postfix/main.cf:
        smtpd_sasl_path = private/auth

        и клиент для получения почты на 110 порту а нужно было 995

        еще postfix при перезапуске, запуске ругается на postfix, но я думаю на работу это не повлияет.
        /usr/sbin/postconf: warning: /etc/postfix/main.cf: unused parameter: virtual_mailbox_limit_maps=mysql:/etc/postfix/mysql/virtual_mailbox_limit.cf
        /usr/sbin/postconf: warning: /etc/postfix/main.cf: unused parameter: virtual_maildir_limit_message=Sorry, the user???s maildir has no space available in their inbox.
        /usr/sbin/postconf: warning: /etc/postfix/main.cf: unused parameter: virtual_mailbox_limit_override=yes

        Инструкция лучшая. У меня никакой другой мануал не получился.

  8. Олег

    почемуто если имею ящики
    luda@ukraine.com.ua
    vita@russia.ru

    при логине под luda или vita пароль ищется в домене ukraine.com.ua

    т.е. что нужно создать

    luda@ukraine.com.ua
    vita@ukraine.com.ua алиасы с @russia.ru на vita@ukraine.com.ua

    так зачем тогда алиасы для каждого домена?

    Как закоментарить вывод отладочной инфы в логи, типа подробно о коннекте и SQL запросы?

    спасибо.

    1. skeletor Автор записи

      Вообще-то правильно использовать логин=email, тогда не будет путаниц, где искать, в каком домене.
      Включите-выключите Debug

  9. Олег

    Вам не встречалось решение типа Postfix Blacklist ?
    например

    smtpd_recipient_restrictions = check_sender_access mysql:/etc/postfix/blacklist.cf

    в файле или в базе хранить ИП адреса черного спика в виде
    96.4.130.0/24
    96.4.130.130

    1. skeletor Автор записи

      Да, встречались, раньше использовал. Сейчас полностью перешёл на exim.

      1. Олег

        Спасибо.

        тоже использовал раньше Exim, где-то начитался что Postfix лучше Exim’а и вот намучился с настройкой. Теперь черній список прикрутить, с ИП работает, а с маской подсети не работает типа:

        smtpd_recipient_restrictions = check_client_access hash:/etc/postfix/blacklist,

        nano /etc/postfix/blacklist
        117.102.89.4 REJECT You are spmmer.

        postmap /etc/postfix/blacklist

  10. Danil

    Здравствуйте
    В конфиге вместо 127.0.0.1 необходимо указывать свой внешний адрес ?

    1. skeletor Автор записи

      В каком из 10-ти конфигов? Нужно указывать тот адрес, который «слушается».

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *