воскресенье, 19 января 2014 г.

Установка и настройка Postfixadmin

Ранее я уже описывал настройку почтовой системы, использующей Postfixadmin в качестве веб-интерфейса для её администрирования: Настройка почтовой системы на основе Postfix, Dovecot, PostfixAdmin.

Тогда я просто скомпилировал свою заметку из различных рецептов, которые мне больше всего понравились. Сейчас я вижу в той заметке достаточное количество недостатков. Например, в той заметке настраивается SASL через плагин auxprop из Cyrrus, хотя Postfix может использовать SASL, встроенный в Dovecot. Для фильтрации спама по серым спискам был выбран Postgrey, просто потому что он был тогда на слуху. Фильтрация вирусов осуществляется с использованием SMTP-прокси, хотя есть более подходящий для этого способ - milter.

Начнём, как и в прошлый раз, с настройки Postfixadmin. Кроме Postfixadmin имеется множество других различных веб-интерфейсов для управления почтовой системой (одну я даже написал для себя сам), однако Postfixadmin наиболее популярен. Настройка начнётся с него, потому что остальные системы зависят от него, а он сам от них относительно независим.

1. Немного о терминологии

Имеется несколько устоявшихся аббревиатур для различных компонентов почтовой системы:

MTA - Mail Transfer Server - сервер передачи почты, занимается лишь отправкой и приёмом почты по протоколу SMTP. Примеры таких программ: Exim, Postfix, Sendmail, Qmail, Microsoft Exchange, MDaemon.

MUA - Mail User Agent - агент пользователя почты. Это программа для чтения писем, их сбора с почтовых ящиков, для отправки писем. Эта программа взаимодействует непосредственно с пользователем. Примеры программ: графические Mozilla Thunderbird, ClawsMail, Evolution, Outlook, Outlook Express, веб-приложения SquirrelMail, RoundCube, консольные приложения mutt, gnus.

MDA - Mail Delivery Agent - агент доставки почты. Занимается управлением почтовыми ящиками - кладёт в них новые письма, удаляет, перемещает, отдаёт их содержимое по запросу MUA. В общем и целом - это сервер, работающий по протоколу POP3 или IMAP. Примеры серверов: Cyrrus IMAP, Courier IMAP, Dovecot.

LDA - Local Delivery Agent - агент локальной доставки. Небольшой компонент MTA или MDA, задача которого сводится к тому, чтобы положить в ящик пользователя почту, принятую MTA. Может работать по протоколу LMTP, являющимся упрощённым вариантом SMTP. Во время приёма письма от MTA может производить подсчёт использования квоты почтового ящика, может осуществлять фильтрацию почты, оценивая степень её похожести на спам или просто раскладывая письма в нужные каталоги почтового ящика, руководствуясь правилами, заданными пользователем.

2. Установка сервера MySQL

Установим сервер MySQL:
# apt-get install mysql-server
Подробнее останавливаться на настройке сервера MySQL не стану.

3. Установка Postfixadmin

Ставим пакет:
# apt-get install postfixadmin
В процессе установки запустится мастер настройки базы данных:


Настройки подключения Postfixadmin к базе данных находятся в файле /etc/postfixadmin/dbconfig.inc.php, где их можно впоследствии изменить.

4. Настройка веб-сервера

Традиционно, я воспользуюсь Lighttpd. Установим веб-сервер, Postfixadmin и PHP для его работы:
# apt-get install lighttpd php5-cgi
Скопируем имеющийся в пакете файл /etc/postfixadmin/lighttpd.conf в каталог /etc/lighttpd/conf-available/ под именем 30-postfixadmin.conf:
# cp /etc/postfixadmin/lighttpd.conf /etc/lighttpd/conf-available/30-postfixadmin.conf
Я вписал в файл /etc/lighttpd/conf-available/30-postfixadmin.conf следующие настройки:
$HTTP["host"] == "mail.domain.tld" {
  alias.url += (
    "/admin" => "/usr/share/postfixadmin",
  )
}
Теперь включим модули Lighttpd, необходимые для работы Postfixadmin:
# lighty-enable-mod fastcgi fastcgi-php postfixadmin
# /etc/init.d/lighttpd force-reload
5. Веб-настройка Postfixadmin

Когда веб-сервер настроен для обслуживания веб-интерфейса Postfixadmin, можно зайти на страницу setup.php и сгенерировать хэш пароля для дальнейшей настройки:

Копируем хэш:

Вставляем хэш в файл /etc/postfixadmin/config.inc.php. Затем вводим пароль и данные учётной записи суперадминистратора, которая будет создана:

После того, как появится сообщение о добавлении администратора, можно войти под этой учётной записью в интерфейс администрирования:


6. Тонкая настройка Postfixadmin

Настройки Postfixadmin находятся в файле /etc/postfixadmin/config.inc.php. Ниже показаны полезные опции из этого файла с моими комментариями. Жирным шрифтом показаны опции, на которые следует обратить особое внимание. fetchmail и отсылку уведомлений при отсутствии адресата (vactions) я не настраивал, поэтому эти опции подробно не рассмотрены.
$CONF['configured'] = true;                    // Разрешает работу Postfixadmin
$CONF['setup_password'] = 'changeme';          // Хэш пароля, используемого при настройке Postfixadmin через веб
                                               // После настройки можно очистить
$CONF['postfix_admin_url'] = '/admin';         // База для URL интерфейса
$CONF['default_language'] = 'ru';              // Язык интерфейса
$CONF['database_prefix'] = '';                 // Префикс таблиц в базе данных
$CONF['database_tables'] = array (             // Здесь можно выполнить тонкую настройку имён таблиц
    'admin' => 'admin',
    'alias' => 'alias',
    'alias_domain' => 'alias_domain',
    'config' => 'config',
    'domain' => 'domain',
    'domain_admins' => 'domain_admins',
    'fetchmail' => 'fetchmail',
    'log' => 'log',
    'mailbox' => 'mailbox',
    'vacation' => 'vacation',
    'vacation_notification' => 'vacation_notification',
    'quota' => 'quota',
    'quota2' => 'quota2',
);

$CONF['admin_email'] = 'postmaster@domain.tld';   // Почтовый ящик,
$CONF['smtp_server'] = 'mail.domain.tld';         // Полностью определённое доменное имя SMTP-сервера и
$CONF['smtp_port'] = '25';                        // порт SMTP-сервера для отправки уведомлений о вновь созданных ящиках

$CONF['encrypt'] = 'md5crypt';                    // Алгоритм хэширования, который будет использоваться для сохранения паролей
                                                  // в базе данных
                                                  // При указании cleartext пароль будет храниться в открытом виде
$CONF['authlib_default_flavor'] = 'md5raw';       // При указании authlib здесь указывается алгоритм хэширования из authlib
$CONF['dovecotpw'] = "/usr/sbin/dovecotpw"        // При указании dovecot:* здесь указывается путь к утилите dovecotpw

$CONF['min_password_length'] = 9;                 // Минимальное количество символов в пароле - 9
$CONF['generate_password'] = 'YES';               // При заведении ящика сгенерировать пароль и показать его
$CONF['show_password'] = 'NO';                    // Не показывать пароль после создания ящика

$CONF['page_size'] = '30';                        // Количество строк в таблице, отображаемой в веб-интерфейсе
$CONF['default_aliases'] = array (                // Создавать для каждого нового домена указанные псевдонимы для пересылки писем
    'abuse' => 'admin@domain.tld',
    'hostmaster' => 'admin@domain.tld',
    'postmaster' => 'admin@domain.tld',
    'webmaster' => 'admin@domain.tld',
    'info' => 'admin@domain.tld'
);
$CONF['domain_path'] = 'YES';                     // Указывает, что каталог ящика хранится в каталоге домена
                                                  // YES - /var/mail/virtual/domain/user@domain, NO - /var/main/virtual/user@domain
$CONF['domain_in_mailbox'] = 'NO';                // Указывает, что в каталоге с именем ящика не должно быть домена
                                                  // YES - /var/mail/virtual/domain/user@domain, NO - /var/mail/virtual/domain/user
$CONF['maildir_name_hook'] = 'NO';                // Здесь можно задать собственную функцию для генерирования пути к ящику

$CONF['aliases'] = '100';                         // Максимальное количество псевдонимов по умолчанию в одном домене
$CONF['mailboxes'] = '100';                       // максимальное количество почтовых ящиков по умолчанию в одном домене
$CONF['maxquota'] = '100';                        // Максимальный объём ящика по умолчанию (см. ниже множитель квоты)
$CONF['quota'] = 'YES';                           // Использовать квоты почтовых ящиков
$CONF['quota_multiplier'] = '1048576';            // Множитель для размера квоты почтовых ящиков,
                                                  // реальный объём квоты по умолчанию составит maxquota * quota_multiplier = 100 Мегабайт

$CONF['transport'] = 'YES';                       // Использовать таблицу транспортов
$CONF['transport_options'] = array (
    'dovecot',                                    // Для виртуальных почтовых ящиков
    'relay'                                       // Транспорт для доменов, для которых почтовый сервер является резервным
);
$CONF['transport_default'] = 'dovecot';           // Транспорт по умолчанию

$CONF['vacation'] = 'NO';                         // Не использовать механизм уведомлений (для использования нужно установить плагин)
$CONF['vacation_domain'] = 'autoreply.domain.tld';// Домен для отсылки уведомлений, прописывать в DNS не обязательно
$CONF['vacation_control'] ='YES';                 // Разрешить пользователям настраивать уведомления для собственных почтовых ящиков
$CONF['vacation_control_admin'] = 'YES';          // Разрешить администраторам доменов настраивать уведомления почтовых ящиков

$CONF['alias_control'] = 'YES';                   // Разрешить суперадминам редактировать пересылки
$CONF['alias_control_admin'] = 'YES';             // Разрешить администраторам доменов редактировать пересылки
$CONF['special_alias_control'] = 'NO';            // Разрешить администраторам доменов редактировать специальные пересылки
                                                  // (см. выше default_aliases)
$CONF['alias_goto_limit'] = '0';                  // Максимальное количество пересылок, отображаемых в одной строке (0 - без лимита)
$CONF['alias_domain'] = 'NO';                     // Не "зеркалировать" пересылки и ящики в другой домен
$CONF['backup'] = 'YES';                          // Показывать вкладку резервного копирования
$CONF['sendmail'] = 'YES';                        // Показывать вкладку отправки почты
$CONF['logging'] = 'YES';                         // Вести журнал редактирований
$CONF['fetchmail'] = 'NO';                        // Не показывать вкладку получения почты с других серверов
$CONF['fetchmail_extra_options'] = 'NO';          // Не разрешить пользователям задавать дополнительные опции fetchmail
                                                  // (Разрешать опасно, т.к. пользователь сможет выполнить произвольную команду!)
$CONF['show_header_text'] = 'NO';                 // Не показывать текст заголовка
$CONF['header_text'] = ':: Postfix Admin ::';     // Текст заголовка
$CONF['user_footer_link'] = "http://domain.tld";  // Ссылка, отображаемая в главном меню при входе под обычным пользователем
$CONF['show_footer_text'] = 'YES';                // Показывать "подвал" на каждой странице
$CONF['footer_text'] = 'Вернуться на domain.tld'; // Текст "подвала"
$CONF['footer_link'] = 'http://domain.tld';       // Ссылка "подвала"
$CONF['welcome_text'] = <<<EOM                    // Текст письма, отправляемого новым пользователям
  Добрый день!

  Поздравляем вас с получением новой учётной записи!
EOM;
$CONF['emailcheck_resolve_domain'] = 'YES';       // При создании ящика или пересылки проверять наличие домена 
$CONF['used_quotas'] = 'YES';                     // Показывать использование квот из словаря Dovecot в базе данных
$CONF['new_quota_table'] = 'YES';                 // Использовать таблицу quota2 для отображения информации об использовании квот
$CONF['theme_logo'] = 'images/logo-default.png';  // Путь к своему логотипу
$CONF['theme_css'] = 'css/default.css';           // Путь к собственному файлу стилей
На этом настройку Postfixadmin можно считать оконченой. Продолжение: Установка и настройка Dovecot

9 комментариев:

Oleg комментирует...

Здравствуйте.
Что значит строчка:
$HTTP["host"] == "mail.domain.tld"
(в дальнейшем при работе веб-сервера вместо "mail.domain.tld" автоматически будет поставляться имя хоста?) Информацию о хосте веб-сервер получит от ДНС?
Еще раз спасибо за статью!

morbo комментирует...

>Что значит строчка:
>$HTTP["host"] == "mail.domain.tld"

Вообще-то - это условие. Добавьте перед ним в уме слово if, если вам так будет понятнее. Означает что настройки в фигурных скобках будут применяться только тогда, когда запрос от браузера обращён к этому доменному имени.

Используя несколько таких условий можно организовать виртуальный хостинг - несколько сайтов, обслуживаемых одним веб-сервером. Веб сервер узнаёт, какой сайт затребован, по заголовку Host из запроса браузера.

Unknown комментирует...

Здравствуйте, подскажите пж регистрирую администратора говорит

Некорректный адрес администратора!Почтовый адрес

admin@domain.com

Soket комментирует...

Подскажите пожалуйста? Пользуюсь ваше инструкцией.
Дошел до пункта 5 и не могу попасть на вебинтерфейс.
У вас не написан полный адрес, в сети нашел:
http://ВАШ IP/postfixadmin/setup.php
Со скриншота http://ВАШ IP/dmin/setup.php
везде пишет 404 - Not Found
Если просто заходить на IP страница приветствия работает
Если я правильно понял в эту строчку нужно подставить свой домен
>$HTTP["host"] == "mail.domain.tld"
Заранее благодарен за ответ

Анонимный комментирует...

извините за ламерский вопрос.Зачем во время установки lighttpd вы установили postfixadmin еще раз?

morbo комментирует...

>Зачем во время установки lighttpd вы установили postfixadmin еще раз?

Просто опечатка. Изначально я ставил всё сразу, а когда писал статью - разделил на отдельные этапы. Вот при этом делении на этапы и забыл исправить строчку, которая была записана в черновике.

Алексей. комментирует...

Здравствуйте.
Спасибо за хорошие статьи.

Но имхо тут опечатка

$CONF['welcome_text'] = <<'YES';// Показывать использование квот из словаря Dovecot в базе данных

Должно быть
$CONF['used_quotas'] = 'YES';

morbo комментирует...

Алексей, спасибо за подсказку. Действительно, HTML-разметка съела часть текста. Исправил.

Анонимный комментирует...

Возможно ли при переустановке postfixadmin, использовать базу оставшуюся с предыдущей установке?