Главная | Контакты



Главная > Программы > Postfix

Строим почтовый сервер. Postfix+Dovecot+Mysql. Часть Первая: pop3/imap сервер

Строим почтовый сервер. Postfix+Dovecot+Mysql. Часть Первая: pop3/imap сервер

Ни для кого не секрет, что электронная почта в настоящее время является важнейшим элементом коммуникации. И хоть у меня и нет статистики, но я более чем уверен, что объем электронных почтовых сообщений уже давно превзошел объем обычных писем. Это делает электронную почту критически важным сервисом в процессе функционирования отдельного предприятия. Соответственно на системного администратора ложится тяжелый груз ответственности за функционирование этой службы. И все бы хорошо, казалось бы, поставил сервер и забыл, но... Не все так просто. Электронная почта, без преувеличения можно сказать, стала настоящим полем боя, между спаммерами, стремящимся завалить пользователя всякого рода рекламными сообщениями, и системными администраторами и программистами, стремящимися оградить пользователей от нежелательных сообщений. И я вынужден констатировать победу спаммеров, во всяком случае на сегодняшний день это так. Но тем не менее используя определенные средства можно свести объем нежелательной почты до вполне разумных пределов. В моем понимании это не более 1% от количества полезных почтовых сообщений.

Вторая проблема состоит в том какое решение выбрать. Почтовых серверов несть числа. И потребитель оказывается перед нелегким выбором, что использовать. И этот выбор не легок. Хочется обеспечить максимальную безопасность и удобство, а зачастую это вещи не совместимые. Кроме этого к современным почтовым системам, бизнес предъявляет требования не свойственные классической электронной почте. Яркий пример тому Exchange компании Microsoft и Lotus от IBM. Назвать эти системы групповой работы почтовыми серверами невозможно. Скорее это комбайны, отдельной незначительной функцией которых, по недоразумению является передача почты. И к сожалению создатели этих систем в угоду функциональности принести именно безопасность. Кроме дырявости самих этих замечательных (я не иронизирую) серверов, стоит отметить и дырявость их клиентов. В отношении Outlook, это уже притча во языцах. Кроме этого встроенные средства фильтрации спама и вирусов у этих продуктов оставляют желать много лучшего. Есть сторонние платные решения, но они стоят не малых денег, увеличивая стоимость и без того не дешевых выше обозначенных продуктов.

Не плохие результаты дает совмещение решений, когда в качестве релея используется свободное решение, а внутри сети сервер групповой работы Exchange или Lotus. Но в этом моем скромном труде, я не буду это рассматривать. Об этом уже написано довольно много. Но далеко не всем нужен весь функционал Exchange или Lotus, да и стоимость решения не всем по карману. Около двух лет описываемое тут решение проработало без единого глюка. Функционала данного решения вполне хватает. А безопасность несравнимо выше дорогостоящих платных решений. И это не пустые слова. Процент отклоненного спама составляет 99%, а вирусов зарегистрировано не более десятка в год.

Итак перед нами стоит задача построить почтовую систему которая использует MYSQL в качестве хранилища учетных записей и паролей. Умеет фильтровать спам и вирусы. Поддерживает SMTP авторизацию и TLS. В *nix системах почта именно строится, я не оговорился.

Для решения мной были выбраны

  • в качестве MTA — Postfix
  • в качестве POP3/IMAP сервера — Dovecot
  • в качестве почтового клиента Mozilla Thunderbird с расширениями:
  • AddressbooksSync
  • Lightning
  • Provider_for_google_calendar

Оба эти сервера можно собрать с поддержкой MYSQL, кроме этого у Dovecot есть LDA (Local Delivery Agent) который без танцев с бубном прикручивается к Postfix. Но самое главное, с моей точки зрения, не считая легкости конфигурирования, это проверенная безопасность этих серверов. В отличие от дырявого Sendmail, в котором постоянно находили критические дыры, эти серверы были написаны с оглядкой на безопасность.

Прежде чем начать устанавливать потовую систему вам нужно создать все необходимые записи в DNS. Очень важно, чтобы кроме записи в прямой зоне, была еще и запись в обратной, без этого вообще не стоит устанавливать почтовый сервер. Обратная зона ДОЛЖНА БЫТЬ. Большинство почтовых серверов ОБЯЗАТЕЛЬНО делают обратный DNS запрос и если полученный ответ не совпадает с прямым запросом, делается вывод о том, что вы спаммер.

Наш сервер будет работать под управлением операционной системы CentOS x86

Так как CentOS по умолчанию предоставляет postfix собранным только с поддержкой LDAP, то нам необходимо сделать некоторые изменения, а именно отредактировать файлик /etc/yum.repos.d/CentOS-Base.repo и добавить exclude=postfix* в раздел [base] и [update], а вот в разделе [centosplus] поставить enabled=1 и добавить includepkgs=postfix*

Теперь подключим дополнительный репозиторий – rpmforge.

[den@centos ~]$ sudo wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.$dist.rf.$arch.rpm
[den@centos ~]$ sudo rpm -Uhv rpmforge-release-0.5.1-1.$dist.rf.$arch.rpm

С репозиториями пока все. Теперь можно приступать к конфигурированию наших серверов.

Я обычно начинаю с pop3/imap сервера.
Установим его:

yum install dovecot

Переименуем файл /etc/dovecot-example.conf в /etc/dovecot.conf
Редактируем:


[den@centos ~]$ sudo vi /etc/dovecot.conf
# Base directory where to store runtime data.
base_dir = /var/run/dovecot/ # Каталог где Dovecot хранит свои сокеты и прочие нужные ему вещи.
protocols = imap imaps pop3 pop3s
listen = * # Слушаем на всех интерфейсах
disable_plaintext_auth = no
log_path = /var/log/dovecot/dovecot.log #Путь до файла лога
info_log_path = /var/log/dovecot/info-dovecot.log #Путь до файла информационного лога
#log_timestamp = "%b %d %H:%M:%S " #Формат лога
ssl_disable = no #Не запрещаем SSL/TLS, для нашей схемы шифрование просто необходимо!
ssl_cert_file = /etc/pki/dovecot/certs/dovecot.pem #Пути до кодированного X.509 сертификата и секретного ключа, читаются эти файлы основным процессом еще до того как привилегии будут понижены, так что доступ на чтение должен иметь только root! В /usr/share/doc/dovecto-версия/examples есть скрипт mkcert.sh с помощью которого мы все необходимое сгененрируем.
ssl_key_file = /etc/pki/dovecot/private/dovecot.pem
login_dir = /var/run/dovecot/login #Директория где процесс аутентификации размещает свой сокет.
login_user = dovecot #Пользователь из под которого работает процесс логина.
login_process_per_connection = yes #Один процесс обрабатывает один логин. Это более безопасно но требует больше ресурсов.
login_processes_count = 3 #Количество запускаемых процессов логина.

# Greeting message for clients.
login_greeting = Dovecot ready.

mail_location = maildir:/var/spool/mail/virtual/ #Очень важный для нас параметр. Место где находятся почтовые директории пользователей.

#Диапазон UID пользователей, для того чтобы пользователи не пересекались с системными пользователями. Мы жестко укажем uid пользователя vmail который будет владельцем почтовых директорий. Этого пользователя и все необходимое мы создадим чуть позже.
first_valid_uid = 203
last_valid_uid = 203

first_valid_gid = 203
last_valid_gid = 203

##
## IMAP specific settings
##

protocol imap {
#Расположение исполняемого файла авторизации
login_executable = /usr/libexec/dovecot/imap-login
#Расположение исполняемого файла IMAP
mail_executable = /usr/libexec/dovecot/imap
#Расположение подключаемых модулей, я использую квоты.
mail_plugins = quota imap_quota
mail_plugin_dir = /usr/lib/dovecot/imap
#Не посылаем список возможностей IMAP в приветственном сообщении
login_greeting_capability = no
#Обрабатываем общеизвестные ошибки IMAP клиентов.
imap_client_workarounds = outlook-idle delay-newmail netscape-eoh
}

##
## POP3 specific settings
##

protocol pop3 {
# Login executable location.
#Расположение исполняемого файла pop3 авторизации
login_executable = /usr/libexec/dovecot/pop3-login
#Расположение исполняемого файла pop3
mail_executable = /usr/libexec/dovecot/pop3
#Не пытаемся выявить новые сообщения для pop3 ради экономии дискового ввода/вывода.
pop3_no_flag_updates = no
#Не поддерживаем команду LAST, некоторые почтовые клиенты ее еще поддерживают, но мне такие не попадались.
pop3_enable_last = no
#Формат UIDL (уникального почтового идентификатора), поставил как советует автор.
pop3_uidl_format = %08Xu%08Xv
#Подключаем квоты для pop3
mail_plugins = quota
mail_plugin_dir = /usr/lib/dovecot/pop3
#Обрабатываем известные ошибки почтовых клиентов для pop3
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}

##
## LDA specific settings
##

protocol lda {
# Куда слать отвергнутые письма. Очевидно, что раз уж они были приняты MTA, то тут они могут быть отвергнуты только по одной причине- превышении квоты.
postmaster_address = postmaster@example.com

#Указываем FQDN своего сервера, куда писать логи доставки и в каком формате.
hostname = mail.example.com
log_path = /var/log/dovecot/delivery.log
info_log_path = /var/log/dovecot/delivery-info.log
#Все те же квоты.
mail_plugins = quota
mail_plugin_dir = /usr/lib/dovecot/lda
#Путь к сокету.
auth_socket_path = /var/run/dovecot/auth-master
}

##
## Authentication processes
##

# Расположение процесса аутентификации
auth_executable = /usr/libexec/dovecot/dovecot-auth


auth default {
#Список механизмов
mechanisms = plain login
#Далее начинается самое важное, указываем базу данных паролей, можно одновременно использовать несколько баз. Но у меня такой нужды не было. Поэтому используется только то, что мне необходимо.
passdb sql {
args = /etc/sql.conf
}

#База данных пользователей:
userdb sql {
args = /etc/sql.conf
}

user = root

#Путь к сокету и права доступа к нему.
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0660
# Default user/group is the one who started dovecot-auth (root)
user = vmail
group = vmail
}
client {
# Assuming the default Postfix $queue_directory setting
path = /var/spool/postfix/private/auth
mode = 0660
#Assuming the default Postfix user and group
user = postfix
group = postfix
}

}
}
#Задаем квоты.
plugin {
quota = maildir:storage=1024000
}

Теперь создадим пользователя и группу vmail который будет владельцем почты, именно от этого пользователя будет работать процесс imap и осуществляться доставка почты в ящики пользователей.

sudo groupadd -g 203 vmail sudo useradd -u 203 -d /dev/null -s /bin/false -g vmail vmail

Проследите чтобы uid и gid были уникальными, выше мы указывали uid и gid именно этого пользователя и группы. Будьте внимательны.

Создадим конфиг подключения к mysql для Dovecot. Как вы уже поняли это должен быть файл /etc/sql.conf

driver = mysql connect = host=localhost dbname=postfix user=postfix password=yourpass
user_query = SELECT concat('/var/spool/mail/virtual/', maildir) as home, concat('maildir:/var/spool/mail/virtual/', maildir) as mail, 203 AS uid, 203 AS gid, concat('maildir:storage=', quota) AS quota FROM mailbox WHERE username = '%u' AND active = '1'
password_query = SELECT username as user, password, concat('/var/spool/mail/virtual/', maildir) as userdb_home, concat('maildir:/var/spool/mail/virtual/', maildir) as userdb_mail, 203 as userdb_uid, 203 as userdb_gid FROM mailbox WHERE username = '%u' AND active = '1'

Теперь нам необходимо настроить и запустить MYSQL сервер и создать базы.

Я обычно начинаю с mysql. Установим базы, зададим пароль для рута, сделаем чтоб сервер запускался при старте:

 

[den@centos ~]$ sudo mysql_install_db
[den@centos ~]$ sudo service mysqld start
Starting MySQL: [ OK ]
[den@centos ~]$ sudo chkconfig mysqld on
[den@centos ~]$ sudo /usr/bin/mysqladmin -u root password 'new-password' [den@centos ~]$ mysql -u root -p
#Вводим свой пароль CREATE DATABASE postfix;
GRANT ALL ON postfix.* TO postfix@localhost IDENTIFIED BY "yourpassword";

Теперь пишем в гугле postfixadmin и качаем последнюю версию, распаковываем и кладем в /var/www/html.
Находим файлик DATABASE_MYSQL.TXT и в консоли пишем:

mysql --database=postfix -u postfix -p < DATABASE_MYSQL.TXT

Таким образом, мы создали базу данных с таблицами для наших пользователей.
В силу того, что мы вынуждены использовать открытую схему авторизации, и пароль передается в открытом виде, необходимо обязательно зашифровать pop3/imap сессию. Выше в основном конфиге мы разрешили шифрование, и указали путь к сертификату и ключу. Настало время их создать.
В директории /usr/share/doc/dovecot-1.0.7/examples/ есть скрипт mkcert.sh, с его помощью можно генерировать сертификаты. Аргументы для работы скрипта должны быть в файле /etc/pki/dovecot/dovecot-openssl.cnf, если этого файла там нет, то его надо создать вручную и наполнить вот таким содержимым:

[ req ]
default_bits = 1024 #Длина ключа
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type
prompt = no

[ req_dn ]
# country (2 letter code)
C=RU #Код страны

# State or Province Name (full name)
ST= Bobruysk Reg #Регион

# Locality Name (eg. city)
L=Bobruysk #Название населенного пункта

# Organization (eg. company)
O=Dovecot #Компания, организация

Organizational Unit Name (eg. section)
OU=IMAP server #Отдел в компнии, организации

# Common Name (*.example.com is also possible)
CN=imap.example.com #Самое важное! Тут надо написать FQDN вашего сервера!

# E-mail contact
emailAddress=postmaster@example.com #Контакты

[ cert_type ]
nsCertType = server

Делаем скрипт запускаемым и выполняем его:

sudo /usr/share/doc/dovecot-1.0.7/examples/mkcert.sh

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

sudo mkdir /var/spool/mail/vmail

И сделать хозяином этой директории созданного нами для этого пользователя vmail:

sudo chown vmail:vmail /var/spool/mail/vmail

Теперь запускаем dovecot и проверяем его работоспособность:

sudo service dovecot start
telnet localhost 110

В ответ мы должны получить:

[den@centos ~]$ telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
+OK Dovecot ready.

С Dovecot пок все, переходим к Postfix...

Copyright © ABC-BIT 2010
info@abc-bit.ru

Материал взят с сайта: http://abc-bit.ru/help/articles/articles_15.html

Главная > Программы > Postfix