Устанавливаем почтовый сервер. Часть первая

Наверное установкой собственного почтового сервера никого не удивишь, поэтому выкладываю информацию об установке и настройке почтового сервера скорее больше для себя. Так сказать собрать воедино информацию, разбив на логические части. Дело в том, что вся эта информация появилась не сразу, а постепенно, появлялись какие-то новые «хотелки», что-то переставало устраивать в работе корпоративного почтовика, что-то добавлялось, что-то убиралось. Могу лишь сказать, что данная конфигурация работает уже несколько лет в организации, где я сейчас работаю, плюс ещё в паре фирм, где мне довелось поработать, ну ещё друзья/знакомые «поднимали» аналогичный сервер. Этот материал даже не совсем инструкция, которой следует неукоснительно действовать, а скорее размышления и описание.

Так сложилось исторически или ещё по каким-то причинам, что когда я устроился на работу в нынешнюю фирму, вся почта компании была устроена очень своеобразно. Для внутренней переписки использовался MS Exchange, а для внешней переписки использовался почтовый сервер хостинг-провайдера. Сотрудники постоянно путались с отправкой почты внутри компании и клиентам, поэтому очень часто отправляли электронную почту своим клиентам не с почтового ящика провайдера, а с внутреннего сервера. Естественно, клиент отправлял ответ и письмо просто не доходило. К тому же, предыдущий системный администратор как-то совсем не умело пытался восстановить или обновить сервер MS Exchange, что он периодически зависал, терял почтовое хранилище, короче, иногда начинал жить своей жизнью. Это, естественно, раздражало не только сотрудников, но и руководство компании. Поэтому первым делом решено было избавиться от сервера MS Exchange и перенести всю почтовую на сервер хостинг-провайдер.

По началу это было неплохой идеей. Один почтовый адрес для внешней и внутренней переписки, сотрудники стали просто отправлять электронную почту, а не задумываться с какого адреса ему отправить почту клиенту или сотруднику компании. Но появился один большой минус — место на диске хостинг-провайдера стало катастрофически не хватать. Пока почта как-то ещё работала, на железо, где крутился MS Exchange, была установлена Zimbra в её бесплатном (свободно распространяемом) варианте. Про почту на сервере хостинг провайдера тоже забыли, т.к. Zimbra неплохо справлялась со своей задачей. С увеличением количества сотрудников стал ужасно глючить и тормозить веб-интерфейс. Причём у одного сотрудника могло всё нормально работать, а у другого ничего не отправлять. Да и по ресурсам Zimbra стала требовать железо даже по круче, чем для MS Exchange, а менять нормально работающее железо, только ради непонятных свистелок почтового сервера, как-то не очень-то хотелось.

К этому времени очень удачно подвернулась Яндекс.Почта для домена. По началу всё кажется прекрасно и очень здорово, но со временем начинают выползать какие-то неудобства, косяки и глюки. Вполне возможно, что у кого она работает до сих пор, но мне показалось, что я попал в то время, когда сервис Яндекс.Почта для домена постоянно тестировался, изменялся, обновлялся. Одним словом, через три месяца начали доставать постоянные глюки в работе сервиса, то почта не уходит, то веб-интерфейс не открывается, то пропадают заведённые ранее группы и пользователи. И последнее, что меня добило, так это блокировка почтовых аккаунтов некоторых моих сотрудников. Объяснили просто, за рассылку спама. Да, любят у меня сотрудники рассылать своим клиентам всякую рекламу и прочую информацию по продукции и вышедших новинках. Причём рассылают они письма не с помощью каких-то программ массовой отправки, а с помощью обыкновенного почтового клиента, причём каждое письмо персонализировано. Ну да бог с ними. Яндекс.Почта для домена для меня была временной заменой, чтобы окончательно и надолго установить, и настроить свой собственный нормальный сервер электронной почты. В процессе установки и настройки сервера были какие-то промежуточные варианты и версии, о которых сейчас уже и не вспомнишь, но в итоге получилось то, что будет описано ниже.

С лирической частью и историей покончено, итак приступаем. Чтобы проще было понимать весь процесс установки и настройки, — статья получилась достаточно объёмной, — я разбил данный материал на три части. Но прежде, чем сломя голову броситься устанавливать на какой-нибудь свободный или на не нужный компьютер почтовый сервер, определитесь, чего вы хотите от своего сервера электронной почты; какие задачи он должен выполнять. После переговоров с руководством, остановились на следующих пунктах.

  1. Собственно: доставка и отправка электронной почты;
  2. Копирование всей исходящей почты на специальный ящик (руководству хочет всё знать);
  3. Хранение все почты на сервере;
  4. Фильтрация спама;
  5. Проверка почтовых вложений на вирусы;
  6. Доступ к почтовому ящику по протоколам POP3/IMAP;
  7. Доступ к почте через браузер;
  8. Просмотр и хранение статистики по работе почтового сервера;
  9. Веб-интерфейс управления почтовыми аккаунтами;

Какой дистрибутив Линукса вы будете использовать не суть важно, ПО и конфигурационные файлы одни и те же. Могут быть различия в путях хранения и в версиях ПО, но это уже мелочи. Первоначально я использовал стабильную версию Debian, но на одном из этапов было решено перекинуть почтовый сервер со старой и слабенькой машины на более мощное железо. Новое железо, почему бы не «пощупать» что-то новенькое, ранее не смотренное? Вместо уже проверенной стабильной версии Debian, решил установить Ubuntu Server, как раз тогда уже вышла версия 12.04. Что касается самого сервера, то он располагается во внутренней сети компании и статичного «белого» IP не имеет. Доступ из вне осуществляется через общий корпоративный шлюз с соответствующими настройками. Были произведены соответствующие записи на DNS-серверах локальной сети, а также на DNS-серверах нашего провайдера, который предоставляет компании услуги по доступ в сети интернет.

Из особенностей хочу сразу отметить, что вся почта храниться на отдельном диске (тупо два диска в аппаратный RAID 0), который монтируется в /home/vmail. Почему так? Не помню уже, но вот так захотелось. После установки самого сервера в минимальной конфигурации, было произведено обновление установленного ПО. Никаких дополнительных репозиториев не подключал.

Все действия выполняются от пользователя root, поэтому, чтобы не выводить каждый раз команду sudo, выполним команду sudo -i. Внимание! Перед редактированием конфигурационных файлов, не забывайте сохранять на всякий пожарный случай оригинал. Например, так:

cp /etc/postfix/main.cf /etc/postfix/main.cf.orig

Настройка Apache, PHP5, MySQL

Для начала установим веб-сервер Apache, PHP5 и MySQL

# aptitude install apache2 php5 php5-cli libapache2-mod-php5 php5-mysql php5-imap mysql-server

Во время установки пакетов будет предложено задать пароль для пользователя root сервера базы данных MySQL. Задаём пароль и запоминаем его. На данном этапе работ какой-либо настройки веб-сервера Apache не предусмотрено, пока оставляем как есть, настраивать будем позже. Займёмся созданием базы данных для функционирования почты и пользователя, из под которого у нас почтовый сервер будет общаться с базой данных.

# mysql -u root -p
Enter password:
mysql> CREATE DATABASE maildbname;
mysql> CREATE USER 'mailadmin'@'localhost' IDENTIFIED BY 'mailadmin_password';
mysql> GRANT ALL PRIVILEGES ON `maildbname`.* TO 'mailadmin'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> QUIT;

где

  • maildbname — название базы данных
  • mailadmin — имя пользователя базы данных
  • mailadmin_password — пароль пользователя mailadmin

Настройка PostfixAdmin

Скачиваем с сайта Postfix Admin последний стабильный релиз, распаковываем архив и перемещаем его в /var/www.

# wget http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.3.5/postfixadmin-2.3.5.tar.gz
# tar -xvzf postfixadmin-2.3.5.tar.gz
# mv ./postfixadmin-2.3.5 /var/www/postfixadmin
# cd /var/www/postfixadmin

Приступаем к редактированию конфигурационного файла PostfixAdmin config.inc.php. Для сокращения материала я указал здесь только те переменные, которые были изменены. Пояснения к переменным указаны в коде в качестве комментариев.

<?php
#…
$CONF['configured'] = true; # изменяем false на true
#…
$CONF['postfix_admin_utl'] = 'http://your.domain.path/postfixadmin'; # указываем URL Postfixadmin'а
#…
$CONF['default_language'] = 'ru'; # если хотите интерфейс на русском языке, замените en на ru. Список доступных переводов можно посмотреть в каталоге ./languages
#…
$CONF['database_user'] = 'mailadmin'; # Имя пользователя для доступа к базе данных
$CONF['database_password'] = 'mailadmin_password'; # Пароль пользователя
$CONF['database_name'] = 'maildbname'; # Наименование базы данных.
#…
# Меняем change-this-to-your.domain.ltd на свой домен
$CONF['admin_email'] = 'postmaster@change-this-to-your.domain.ltd'; # Можете указать свой адрес электронной почты
#…
$CONF['default_aliases'] = array(
    'abuse' => 'abuse@change-this-to-your.domain.ltd',
    'hostmaster' => 'hostmaster@change-this-to-your.domain.ltd',
    'postmaster' => 'postmaster@change-this-to-your.domain.ltd',
    'webmaster' => 'webmaster@change-this-to-your.domain.ltd'
);
#…
$CONF['domain_path'] = 'YES'; # Меняем значение NO на YES, чтобы путь к почтовым ящика содержал имя вашего домена
$CONF['domain_in_mailbox'] = 'NO'; # Меняем значение YES на NO, чтобы убрать из имени почтового ящика название домена
#…
# Меняем change-this-to-your.domain.ltd на свой домен
$CONF['user_footer_link'] = 'http://change-this-to-your.domain.ltd/main';
#…
$CONF['footer_text'] = 'Return to change-this-to-your.domain.ltd';
$CONF['footer_link'] = 'http://change-this-to-your.domain.ltd';
#…
$CONF['fetchmail'] = 'NO';
#…
# Раскомментируем следующие строки, внеся небольшое исправление в строку вызова
$CONF['mailbox_postcreation_script']='/usr/bin/sudo -u vmail /usr/local/bin/postfixadmin-mailbox-postcreation.sh';
$CONF['mailbox_postdeletion_script']='/usr/bin/sudo -u vmail /usr/local/bin/postfixadmin-mailbox-postdeletion.sh';
$CONF['domain_postdeletion_script']='/usr/bin/sudo -u vmail /usr/local/bin/postfixadmin-domain-postdeletion.sh';
?>

Скопируем из каталога ADDITIONS указанные в конфигурационном файле скрипты, и сделаем их исполняемыми.

# cp ./ADDITIONS/postfixadmin-*.sh /usr/local/bin
# chmod +x /usr/local/bin/postfixadmin-*.sh

Затем в скриптах postfixadmin-mailbox-postdeletion.sh и postfixadmin-domain-postdeletion.sh необходимо изменить два параметра:

  • basedir— путь расположения хранилища почты (в моём случае это /home/vmail)
  • trashbase — путь расположения удалённых почтовых ящиков (в моём случае это /home/vmail/deleted)

А в скрипте postfixadmin-mailbox-postcreation.sh необходимо изменить только один параметр:

  • basedir — путь расположения хранилища почты (в моём случае это /home/vmail)

Осталось только подправить файл /etc/sudoers. Открываем данный файл для редактирования командой

# visudo

В конец файла добавим следующие строки:

www-data ALL=(vmail) NOPASSWD: /usr/local/bin/postfixadmin-mailbox-postdeletion.sh
www-data ALL=(vmail) NOPASSWD: /usr/local/bin/postfixadmin-domain-postdeletion.sh
www-data ALL=(vmail) NOPASSWD: /usr/local/bin/postfixadmin-mailbox-postcreation.sh

Не знаю, как было в других версиях, но вот в версии 2.3.5 существовал один неприятный баг: если в описании домена и добавляемого пользователя использовать русский язык, то на выходе получим не читаемые «кракозябры». Лечится сие не просто, а очень просто. Открываем в любом текстовом редакторе (nano, mcedit, vim) файл templates/list-virtual.php, находим представленный ниже код

<?php
print " <td>" . htmlentities($tMailbox[$i]['name']) . "</td>\n";
?>

и меняем его на этот код

<?php
print " <td>" . htmlentities($tMailbox[$i]['name'], ENT_QUOTES, 'UTF-8') . "</td>\n";
?>

Затем в любимом редакторе открываем файл templates/admin_list-domain.php, находим представленный ниже код

<?php
print "<td>" . htmlentities($domain_properties[$i]['description']) . "</td>";
?>

и меняем его на этот код

<?php
print "<td>" . htmlentities($domain_properties[$i]['description'], ENT_QUOTES, 'UTF-8') . "</td>";
?>

Всё. С правкой конфигурационных файлов PostfixAdmin'а закончили. Теперь запускаем установку, набрав в браузере http://your.domain.com/postfixadmin/setup.php. PostfixAdmin проверит текущую конфигурацию вашего сервера. Если все необходимые компоненты установлены, то PostfixAdmin создаст необходимые таблицы в базе данных, которую мы указали в конфигурационном файле, и предложит изменить пароль установки. Дважды вводим пароль в предложенную форму и нажимаем кнопку «Generate password hash». Поолученный таким образом hash помещаем в конфигурационный файл PostfixAdmin'а в параметр $CONF['setup_password'].

Внимание! В ранних версиях PostfixAdmin'а необходимо было удалять файл установки setup.php. Начиная с версии 2.3 удалять файл установки setup.php не обязательно.

Добавляем администратора PostfixAdmin'а, заполнив все поля предложенной формы. Теперь можно зайти в веб-интерфейс управления почтовыми аккаунтами. Для в адресной строке вашего браузера наберите http://your.domain.com/postfixadmin/login.php, вводите данные администратора. Пока это не совсем рабочий инструмент, и, чтобы он таковым стал, нам необходимо закончить установку и настройку почтового сервера.

Хранилище почты

Для работы с хранилищем почты создадим нового пользователя и группу. Как я уже писал в самом начале, хранилище почты у меня располагается на отдельном диске, который монтируется в /home/vmail, который и будет корнем домашнего каталога нашего пользователя. Почта будет храниться в виде /home/vmail/DOMAINNAME/USERNAME. UID для почтовых аккаунтов, должен быть меньше 5000. У меня UID 1005, у вас должен быть свободен, если он занят то выбираем свободный, и везде в будущем не забываем его менять.

Внимание! Вы можете указать собственный путь к хранилищу почты.

# groupadd -g 1005 vmail
# useradd -g vmail -u 1005 vmail -d /home/vmail -s /sbin/nologin -c "Virtual mailbox" -m
# mkdir -p /home/vmail/deleted
# chown -R vmail:vmail /home/vmail
# chmod 770 /home/vmail

Создание сертификатов для Postfix и Dovecot

Для работы нашего почтового сервера создадим самоподписные сертификаты. Единственная «засада» при использовании таких сертификатов, это MS Outlook будет постоянно ругаться (запускать окошко при запуске программы), что невозможно проверить данный сертификат безопасности. Добавление данного сертификаты в постоянные хранилища не помогает.

Итак, создаём защищённый ключ.

# cd /etc/ssl
# openssl genrsa -des3 -out yourmail.domain.com.key 2048

При запросе дважды вводим пароль и запоминаем его. Теперь создадим незащищённый ключ.

# openssl rsa -in yourmail.domain.com.key -out yourmail.domain.com.key.insecure
# mv yourmail.domain.com.key yourmail.domain.com.key.secure
# mv yourmail.domain.com.key.insecure yourmail.domain.com.key

При запросе введём пароль защищённого ключа. Затем создадим подписанный сертификат.

# openssl req -new -key yourmail.domain.com.key -out yourmail.domain.com.csr

Необходимо будет ответить на ряд вопросов, которые заполняются на английском языке.

Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:MO
Locality Name (eg, city) []:Moscow
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Your CompanyName Ltd.
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:domain.com
Email Address []:yourmail@domain.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

где

  • Country Name — Страна, в виде двухсимвольного ISO-кода
  • State or Province Name — Область, в которой официально зарегистрирована организация
  • Locality Name — Город, где официально зарегистрирована организация
  • Organization Name — Точное наименование организации в соответствии с Уставом организации
  • Organizational Unit Name — Наименование отдела, подразделения
  • Common Name — Полное доменное имя для вашего веб-сервера
  • Email Address — Адрес электронной почты (можете указать какой-нибудь общий адрес компании)

Устанавливаем ключ сервер

# cp yourmail.domain.com.key /etc/ssl/private

Для создания внутреннего центра сертификации (Certification Authority) создадим необходимые каталоги

# mkdir /etc/ssl/CA
# mkdir /etc/ssl/newcerts

Создадим необходимые файлы.

# sh -c "echo '01' > /etc/ssl/CA/serial"
# touch /etc/ssl/CA/index.txt

Откроем в любимом текстовом редакторе файл /etc/ssl/openssl.cnf и в секции [ CA_default ] изменим следующие параметры:

dir = /etc/ssl/
database = $dir/CA/index.txt
certificate = $dir/certs/cacert.pem
serial = $dir/CA/serial
default_days = 3650

Теперь создадим самоподписной корневой сертификат.

# openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -newkey rsa:2048 -out cacert.pem

По запросу дважды вводим пароль и отвечаем на вопросы (пример заполнения чуть выше). Установим корневой сертификат и ключ:

# mv cakey.pem /etc/ssl/private/
# mv cacert.pem /etc/ssl/certs/

Создадим сертификат для Postfix:

# openssl ca -in yourmail.domain.com.csr -config /etc/ssl/openssl.cnf

Вводим пароль, указанный при создании корневого сертификата и утвердительно отвечаем на вопросы (для тех кто в танке: вводим символ «Y» и нажимаем клавишу Enter).

Устанавливаем полученный сертификат

# cat /etc/ssl/newcerts/01.pem | sed -n '/-----BEGIN CERTIFICATE-----/,$p' > /etc/ssl/certs/postfix.pem

Перед созданием следующего сертификата необходимо исправить параметр unique_subject с yes на no в файле /etc/ssl/CA/index.txt.attr

unique_subject = no

Теперь создаём сертификат для Dovecot.

# openssl ca -in yourmail.domain.com.csr -config /etc/ssl/openssl.cnf

Вводим пароль, указанный при создании корневого сертификата и утвердительно отвечаем на вопросы (для тех кто всё ещё в танке: вводим символ «Y» и нажимаем клавишу Enter).

Устанавливаем полученный сертификат.

# cat /etc/ssl/newcerts/02.pem | sed -n '/-----BEGIN CERTIFICATE-----/,$p' > /etc/ssl/certs/mydovecot.pem

Все необходимые в дальнейшем сертификаты мы создали. В следующей части мы приступим к установке и настройке Dovecot и Poxtfix.

Часть Вторая. Часть Третья.

Устанавливаем почтовый сервер. Часть первая: 8 комментариев

  1. А почему бы для этих целей не использовать уже готовые сборки типа например zentyal? Ставится в пару кликов, все работает из коробки, потом можно уже какие-то настройки под себя допилить...

  2. Ну хотите используйте, лично мне готовые сборки никогда не нравились. И потом, лично мне не нужен комбайн всего и вся.

  3. >Из особенностей хочу сразу отметить, что вся почта храниться на отдельном диске (тупо два диска в аппаратный RAID 0)

    Как-то фигово.

  4. создаете базу maildbname, а в config.inc.php $CONF['database_name'] = 'mail'; # Наименование базы данных.

  5. скрипты не работают 🙁

    # Раскомментируем следующие строки, внеся небольшое исправление в строку вызова

    $CONF['mailbox_postcreation_script']='/usr/bin/sudo -u vmail /usr/local/bin/postfixadmin-mailbox-postcreation.sh';

    $CONF['mailbox_postdeletion_script']='/usr/bin/sudo -u vmail /usr/local/bin/postfixadmin-mailbox-postdeletion.sh';

    $CONF['domain_postdeletion_script']='/usr/bin/sudo -u vmail /usr/local/bin/postfixadmin-domain-postdeletion.sh';

    Вот здесь поправленные :perl.no-tubo.net/category...AB/postfixadmin/

  6. #Создадим сертификат для Postfix:

    # openssl ca -in yourmail.domain.com.csr -config /etc/ssl/openssl.cnf

    Пошло, после изменения в файле openssl.cnf:

    basicConstraints=CA:FALSE на TRUE

    До этого, упиралось.

    Debian 8

Обсуждение закрыто.