Сервер в кармане, или просто о сложном!

главная - Статьи - Почта - Postfix + Dovecot + MySQL

Настройка Postfix

Теги: Linux Почтовый сервер Postfix

Dovecot Postfix MySQL Apache PostfixAdmin Roundcube

 

Postfix стоит "на передовой" вашего почтового сервера. Именно он решает, что делать с почтой, которая попала к нему - Postfix может отдать ее на сохранение на локальной машине, переслать ее дальше или просто отбросить. Как правило, Postfix настраивается в связке с IMAP/POP сервером (например, Dovecot) и базой данных для хранения настроек, паролей пользователей и пр. (например, MySQL). В данном руководстве описывается настройка Postfix с прицелом именно на совместную работу с Dovecot и MySQL.

Крайне рекомендую к прочтению книгу "Postfix. Подробное руководство" Ральфа Гильдебрандта и Патрика Кеттера (из-во Символ-Плюс). Также думаю, что использовать текстовые конфиги для "моего первого простого сервера" вместо использования базы данных, не очень хорошо. Везде в сети есть примеры так называемых "связок", и почти всегда это будет Postfix, Exim или Dovecot и база данных, скорее всего MySQL. Почему? Потому что это знают все, это отработано годами и общий опыт работы с базами данных тут тоже придется к месту. Ну и кроме того, сразу после установки MySQL, никакой разницы для вас не будет.

Итак, мы находимся в середине пути к успеху:

  1. (уже сделали!) MySQL - нам надо сразу сделать хранилище настроек, т.к. и Postfix и Dovecot будут "завязаны" на базу данных.
  2. (тоже сделали!) PostfixAdmin - аналогично, сразу создаем инструмент управления базой данных, проверяем, что пользователи добавляются и пр.
     
  3. Postfix - ставим MTA (Mail Transfer Agent) Postfix.
     
  4. (скоро будет делать) Dovecot - финал - хранение почты, авторизация и пр.
  5. (а может, и не будет делать вовсе) Только после этого можно думать про антивирусы, веб-интерфейсы типа Roundcube Mail.
Если вы настраиваете почтовый сервер на недавно установленную систему, то вы скорее всего не отключали еще SELinux. И вы можете столкнуться с неочевидными проблемами, которые создаст вам SELinux, который охраняет вашу систему от нестандартного поведения служб.

Например, Postfix может не отправлять письма, особенно при условии авторизации для отправки через Dovecot. И еще много разных вариантов. Поэтому рекомендую отключить SELinux на время настройки.

Делается это разными способами:
  1. Временное отключение (до перезагрузки):
    # setenforce 0
    или
    # echo 0 > /selinux/enforce
  2. Выключить насовсем - в файле /etc/selinux/config изменить параметр: SELINUX=disabled
    Перезагрузить компьютер.

Установка Postfix

В данном случае речь пойдет о настройке Postfix версии 2.6.6, установленного из rpm в CentOS.

Установка сводится к одной команде:

> yum install postfix

Установка закончена, но настройка будет более интересной!

На всякий случай проверяем, поддерживает ли наш Postfix базы данных MySQL:

> postconf -m | grep mysql
mysql

Подготовительные действия

Создаем пользователя vmail (user id 5000) и группу vmail (group id 5000). Этот пользователь будет владельцем каталога почты /var/vmail.

> groupadd -g 5000 vmail
> useradd -g vmail -u 5000 vmail -d /home/vmail -m

Создаем каталог /var/vmail:

> mkdir /var/vmail
> chown -R vmail:vmail /var/vmail

Права 777 нужны на этапе отладки:

> chmod -R 777 /var/vmail

 

Подготовка сделана, можно переходить непосредственно к настройке. Основные настройки Postfix хранятся в двух файлах "/etc/postfix/main.cf" и "/etc/postfix/master.cf".

/etc/postfix/main.cf

Как правило, после установки главный файл настроек Postfix находится по адресу:

/etc/postfix/main.cf

Сделаем копию исходного файла конфигурации Postfix:

> cp /etc/postfix/main.cf /etc/postfix/main.cf.bak

Думаю, будут удобнее сразу привести работающий пример этого файла.

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

### Config

### Common config
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
myhostname = centos6.virtual.local
mydomain = virtual.local
inet_interfaces = all
inet_protocols = ipv4
mydestination = $myhostname, localhost.$mydomain, localhost, localhost.localdomain
unknown_local_recipient_reject_code = 550
mynetworks = 127.0.0.0/8
#in_flow_delay = 1s
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

local_recipient_maps = $virtual_mailbox_maps, $virtual_alias_maps

home_mailbox = Maildir/
mail_spool_directory = /var/spool/mail
smtpd_banner = $myhostname ESMTP $mail_name
debug_peer_level = 2
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix


# The mail_owner parameter specifies the owner of the Postfix queue
# and of most Postfix daemon processes.  Specify the name of a user
# account THAT DOES NOT SHARE ITS USER OR GROUP ID WITH OTHER ACCOUNTS
# AND THAT OWNS NO OTHER FILES OR PROCESSES ON THE SYSTEM.  In
# particular, don't specify nobody or daemon. PLEASE USE A DEDICATED
# USER.
#
mail_owner = postfix
# setgid_group: The group for mail submission and queue management
# commands.  This must be a group name with a numerical group ID that
# is not shared with other accounts, not even with the Postfix account.
#
setgid_group = postdrop

html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.6.6/samples
readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES

virtual_transport = dovecot
dovecot_destination_recipient_limit=1

### Auth
smtpd_sasl_auth_enable=yes
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth # см. конфиг Dovecot

### Relay Domains:
#relay_domains = mysql:/etc/postfix/sql/mysql_relay_domains.cf

### Virtual Domains:
virtual_mailbox_base = /var/vmail
virtual_mailbox_domains =
   mysql:/etc/postfix/sql/virtual_mailbox_domains.cf
virtual_alias_maps =
   mysql:/etc/postfix/sql/virtual_alias_maps.cf
virtual_mailbox_maps =
   mysql:/etc/postfix/sql/virtual_mailbox_maps.cf

virtual_minimum_uid = 5000
virtual_minimum_gid = 5000
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

### Quotas
# Квоты пока не проверял
#virtual_create_maildirsize = yes
#virtual_mailbox_extended = yes
#virtual_mailbox_limit_maps = mysql:/etc/postfix/sql/mysql_virtual_mailbox_limit_maps.cf
#virtual_mailbox_limit_override = yes
#virtual_maildir_limit_message = "Sorry, the user's maildir has overdrawn his diskspace quota."
#virtual_overquota_bounce = yes

### Restrictions
smtpd_client_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_unknown_reverse_client_hostname,
        permit

smtpd_helo_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_invalid_helo_hostname,
        reject_non_fqdn_helo_hostname,
        reject_unknown_helo_hostname,
        permit

smtpd_sender_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_non_fqdn_sender,
        reject_unknown_sender_domain,
        reject

smtpd_recipient_restrictions =
        reject_non_fqdn_recipient,
        reject_unknown_recipient_domain,
        permit_sasl_authenticated,
        reject_unlisted_recipient,
        permit_mynetworks,
        reject_unauth_destination,
        reject

smtpd_data_restrictions =
    permit_mynetworks,
    reject_unauth_pipelining,
    reject_multi_recipient_bounce,
    permit

smtpd_etrn_restrictions = reject
smtpd_helo_required = yes

#strict_rfc821_envelopes = yes

smtpd_discard_ehlo_keywords = etrn, silent-discard
smtpd_forbidden_commands = CONNECT GET POST
disable_vrfy_command = yes

### TLS
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/pki/dovecot/certs/dovecot.pem
smtpd_tls_key_file =  /etc/pki/dovecot/private/dovecot.pem
smtp_tls_security_level=may
smtpd_tls_mandatory_protocols=TLSv1, TLSv1.1, TLSv1.2, !SSLv2, !SSLv3
smtpd_tls_auth_only = yes

smtp_tls_loglevel = 1
smtpd_tls_loglevel = 1

### Secure headers
# Погуглите на эту тему - интересно!
#header_checks = regexp:/etc/postfix/header_checks

Вот он какой, здоровый, черт... Но по сути своей, здесь все не так сложно.

Давайте посмотрим описание настроек Postfix в конфигурационном файле.

Секция Config

В этой секции задаются пути до файлов конфигураций, переменные, имя пользователя, от которого запускается Postfix и пр. Как правило, содержимое этой секции задается по-умолчанию (раскидано по дефолтному конфигу) и не требует серьезной доработки. Эти параметры зависят от дистрибутива, если вы ставите из бинарника (например, rpm), от параметров при сборке из исходников и др.

Секция Auth

Здесь задаются параметры авторизации пользователей для отправки почты. Это обязательно, если у вас не локальный почтовый сервер и вы не собираетесь бесплатно рассылать спам!

  • smtpd_sasl_security_options = noanonymous # не разрешаем никому отправлять почту с нашего сервера без авторизации! 
  • broken_sasl_auth_clients = yes # включаем поддержку "устаревших" почтовых клиентов, не поддерживающих RFC 2222.
  • smtpd_sasl_type = dovecot # за авторизацию будет отвечать dovecot
  • smtpd_sasl_path = private/auth # указывается относительный путь до сокета, для передачи функций аутентификации пользователей от Postfix серверу Dovecot. Полный путь до сокета складывается из пути до директории очереди Postfix + "private/auth" = "/var/spool/postfix" + "private/auth" = "/var/spool/postfix/private/auth".

Секция Relay Domains

"Домены для пересылки". Это самая короткая секция. Здесь указываются те домены, почту которых наш сервер будет стараться переслать дальше соответственно старшинству MX записей для этого домена. Например, это может быть использовано при создании резервного сервера.

  • relay_domains = mysql:/etc/postfix/sql/mysql_relay_domains.cf

Секция Virtual Domains

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

  • virtual_mailbox_base указывает, где хранится почта (физическое расположение на сервере).
  • virtual_mailbox_domains перечисляет виртуальные домены, которые может обслуживать этот сервер.

    Содержимое файла /etc/postfix/sql/virtual_mailbox_domains.cf:

    user = postfix
    password = pass_FROM_postfix_user
    hosts = localhost
    dbname = mail
    query = SELECT domain FROM domain WHERE domain='%s' AND transport <> 'relay'  AND active = '1'

  • virtual_alias_maps - (мое толкование директивы virtual alias maps) Postfix ищет все алиасы (псевдонимы), куда можно отправить письмо. Если у одного пользователя есть несколько псевдонимов, то письмо будет отправлено по каждому псевдониму (alias).

    Содержимое файла /etc/postfix/sql/virtual_alias_maps.cf:
     

    user = postfix
    password = pass_FROM_postfix_user
    hosts = localhost
    dbname = mail
    query = SELECT goto FROM alias WHERE address='%s' AND active = '1'

    Небольшой экскурс: таблица "alias" в базе "mail" создается командой:

    CREATE TABLE IF NOT EXISTS `alias` (
      `address` varchar(255) NOT NULL,
      `goto` text NOT NULL,
      `domain` varchar(255) NOT NULL,
      `created` datetime NOT NULL default '0000-00-00 00:00:00',
      `modified` datetime NOT NULL default '0000-00-00 00:00:00',
      `active` tinyint(1) NOT NULL default '1',
      PRIMARY KEY  (`address`),
      KEY `domain` (`domain`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Virtual Aliases';

    и каждому полю "address" соответствует минимум  один алиас (судя по дапму базы данных). По-умолчанию, значение "alias" равно значению "address". Я не видел ни одной записи в базе, в которой поле goto было бы пустым.
  • virtual_mailbox_maps
    Разрешенные адреса получателей указаны в параметре virtual_mailbox_maps. SMTP сервер Postfix отклоняет недопустимые адреса получателей с сообщением "User unknown in virtual mailbox table" (Пользователь неизвестен в таблице виртуальных почтовых ящиков). Если параметр virtual_mailbox_maps пуст, то Postfix принимает адреса получателей, принадлежащие доменам из $virtual_mailbox_domains.

    Содержимое файла /etc/postfix/sql/virtual_mailbox_maps.cf:

    user = postfix
    password = pass_FROM_postfix_user
    hosts = localhost
    dbname = mail
    query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'

  • virtual_minimum_uid
    По умолчанию владелец почтового ящика не может иметь UID меньше 5000. Это сделано для предотвращения возможности записи в файловую систему с правами системных учетных записей. Это значение можно изменить с помощью vrtual_minimum_uid. 
  • virtual_uid_maps и virtual_gid_maps
    Пользователи виртуальных доменов на то и виртуальные, они не могут что-то записать/удалить на жестком диске сервера. Чтобы сервер знал, от имени кого записывать файлы почты, существуют параметры virtual_uid_maps и virtual_gid_maps. Они указывают UID (user id) и GID (group id) пользователя из файла /etc/passwd, с правами которого будут записаны файлы почты.

Секция Quotas

Ограничения на размер почтового ящика и др.

  • virtual_create_maildirsize
  • virtual_mailbox_extended
  • virtual_mailbox_limit_maps
  • virtual_mailbox_limit_override
  • virtual_maildir_limit_message - сообщение о превышении квоты.
  • virtual_overquota_bounce - посылать или нет сообщение пользователю о превышении квоты.

Секция Restrictions

Дополнительно предлагаю ознакомиться с настройками ограничений Postfix (в новом окне).

Мы же не хотим, чтобы мы погрязли в спаме?

  • smtpd_sender_restrictions - проверка адреса отправителя (т.е. проверяются те, кто пытается отправить письмо на наш сервер).
    permit_mynetworks - разрешаем отправлять нам из нашей же сети (логично)
    permit_sasl_authenticated - разрешаем отправлять тем, кто прошел проверку паролем (если виртуальный домен один, это означает, что один коллега шлет письма другому коллеге. На серверах с большим количеством доменов возможны ситуации, когда два незнакомых человека в разных доменах обслуживаются нашим почтовым сервером)
    reject_non_fqdn_sender, reject_unknown_sender_domain - неправильные и несуществующие домены отвергаем - скорее всего, это спам или неправильно сконфигурированный почтовый сервер отправителя.
    permit - почту от всех остальных все-таки принимаем! В эту категорию войдут все нормальные люди. Можете проверить, поставьте reject и попробуйте написать письмо на этот сервер с другого сервера. Вы должны будете получить сообщение об ошибке доставки.
     
  • smtpd_recipient_restrictions - для кого можно принимать почту.
    reject_non_fqdn_recipient - нельзя принимать почту для неправильных доменов 
    reject_unknown_recipient_domain - нельзя принимать почту для несуществующих доменов
    permit_sasl_authenticated - можно принимать почту для авторизовавшихся
    reject_unlisted_recipient -
    permit_mynetworks - можно принимать почту для тех, кто из нашей сети
    reject_unauth_destination -
    permit_auth_destination -
    reject

Секция TLS

Шифрование сеансов связи с сервером от атак Man-in-the-Middle, от перехвата пароля... В настоящее время уже необходимость, нежели чрезмерность. Практически все крупные бесплатные почтовые системы реализовали TLS или SSL. А мы чем хуже?

Секция Secure headers

Не обязательная, но - полезная секция. Например, можно удалить информацию об IP-адресе в локальной сети, если таковая фигурирует в отправленных письмах, или о том, какой почтовый клиент вы используете (X-Mailer).

 

Настраиваем /etc/postfix/master.cf

Сейчас мы будем переходить к настройке Dovecot, поэтому сразу пропишем в конфиге Postfix, что Dovecot отвечает за локальную доставку почты.

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

В конец файла /etc/postfix/master.cf добавляем две строки:

dovecot unix - n n - - pipe
  flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -d $(recipient)

Перед flags два пробела! Это очень важно. Работать иначе не будет.

Дополнительная информация

Переходим к настройке Dovecot...

Авторизуйтесь для добавления комментариев!


    забыли пароль?    новый пользователь?