Статья напечатана в журнале
Дочитавшие до конца получат видео 😉
Электронная почта появилась и стала популярной задолго до появления Интернета и сегодня без нее уже просто не возможно представить современный мир. Это очень быстрый и главное простой в использовании способ передачи информации, понятный даже новичку. Но вот настроить всю эту сложную систему отправки и приема сообщений не так просто, как это может показаться на первый взгляд. От администратора часто потребуется мобилизовать весь свой опыт, чтобы создать надежную, безопасную и удобную почтовую систему. В статье показан только один из возможных вариантов решения этой задачи.
Устанавливаем Postfix + Dovecot
Для нашего почтового сервера выберем связку Postfix
Устанавливать все это будем на Ubuntu 7.04, но практически все за исключением команд для установки пакетов будет действительно и в остальных дистрибутивах. Советую не навешивать сразу дополнительную функциональность на эти сервисы, вроде проверку на спам и вирусы, работу с БД и прочее. Если в настройках будет допущена ошибка, найти ее будет на порядок сложнее. Лучше фиксировать настройки на некотором этапе, а убедившись в работоспособности добавлять следующую функциональность. Итак, ищем нужные пакеты с помощью “sudo apt-cache search postfix” и “sudo apt-cache search dovecot” и ставим:$ sudo apt-get install dovecot-common dovecot-imapd dovecot-pop3d postfix-mysql
В процессе установки будут добавлены системные пользователи postfix и dovecot, группы postfix, postdrop, а также созданны все необходимые каталоги. Кроме этого пользователь dovecot будет добавлен в группу mail:
$ cat /etc/group | grep mail
mail:x:8:dovecot
Я выбрал два пакета dovecot-imapd и dovecot-pop3d в каждом находятся модули обеспечивающие доступ по соответствующему протоколу. Если какой либо из них не нужен, пакет можно не ставить. Смотрим, какие модули для Postfix доступны:
$ postconf -a
cyrus
dovecot
Нужный модуль для работы с dovecot в списке есть, поэтому пересобирать Postfix нет необходимости. Но для тех, кто все-таки захочет самостоятельно собрать оба сервера (например, чтобы использовать самую последнюю версию), советую установить сначала пакеты для удовлетворения зависимостей:
$ sudo apt-get build-dep postfix-mysql dovecot-common dovecot-imapd dovecot-pop3d
Компиляция Postfix и Dovecot стандарты, все нужное как правило устанавливается по умолчанию, только при сборке Postfix необходимо использовать команду:
$ make makefiles CCARGS=’-DUSE_SASL_AUTH -DDEF_SERVER_SASL_TYPE=\»dovecot\»‘
Последняя строка вообщем не обязательна, она позволяет не указывать на тип аутентификации “smtpd_sasl_type = dovecot” в конфигурационном файле Postfix. Вот собственно и все премудрости по установке.
Конфигурационный файл Postfix
По ходу установки через репозитарий пакетов в Ubuntu будут задаваться некоторые вопросы по архитектуре будущей почтовой системе (доставка почты на прямую, локальная доставка, смарт-хост), кроме того некоторые параметры будут взяты из настроек системы. Поэтому после установки Postfix практически на 99% уже готов к работе. Основной конфигурационный файл называется /etc/postfix/main.cf:
$ sudo mcedit /etc/postfix/main.cf
# имя, домен и псевдонимы почтового узла
myhostname = grinder.com
mydomain = grinder.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = $myhostname
# список доменов через которые будет оcуществляться локальная доставка
mydestination = $myhostname, localhost.$mydomain, localhost
# не будем автоматически добавлять домен к имени
append_dot_mydomain = no
# список сетей которым разрешен relay и слушем на всех интерйфейсах
mynetworks = 127.0.0.0/8, 192.168.1.0/24
inet_interfaces = all
# баннер выдавемый при подключении
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
# снимаем комметарий, если хотим снять ограничение на размер ящика (по умолчанию 51200000 байт)
# mailbox_size_limit = 0
recipient_delimiter = +
# формат почтового ящика, возможен вариант Mailbox
home_mailbox = Maildir/
# каталоги для хранения почты и очереди Postfix
mail_spool_directory = /var/mail
queue_directory = /var/spool/postfix
# Генерация сообщения о задержке почты
delay_warning_time = 4h
# TLS настройки
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache
# настройки SASL
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
smtpd_sasl_local_domain = $myhostname
# файл-сокет для обмена информацией с Dovecot
# здесь указывается путь относительно queue_directory
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
# используем тип dovecot
smtpd_sasl_type = dovecot
Многие параметры опущены, так как оставлены значения по умолчанию, просмотреть их значения можно введя команду “postconf ”.
В каталоге /usr/share/postfix лежит несколько шаблонов, в main.cf.dist представлены практически все основные настройки. При установке сервера создаются необходимые SSL ключи и сертификаты, следует лишь проверить их наличие. По окончании настроек перезапускаем Postfix:
$ sudo /etc/init.d/postfix restart
И пробуем подключиться телнетом к 25 порту, если сервер ответил, переходим к настройке Dovecot.
Конфигурационный файл Dovecot
Все настройки Dovecot производятся в одном файле /etc/dovecot/dovecot.conf. Файл большой, его вывод занимает несколько экранов. Спасает, что он хорошо комментирован и разбит на секции, помогающие сориентироваться. Хотя большинство настроек также можно оставить в значении по умолчанию, то есть закомментироваными.
$ sudo mcedit /etc/dovecot/dovecot.conf
# каталог для сохранения временных файлов
base_dir = /var/run/dovecot/
# протоколы которые будем использовать, я включил все но можно убрать лишние
# если dovecot используется только для аутендификации, а не доставки почты ставим здесь «none».
protocols = pop3 pop3s imap imaps
# отключение команды LOGIN, соединения принимаются только через SSL/TLS
#disable_plaintext_auth = yes
# Останавливаем все IMAP и POP3 процессы перед выключением Dovecot master process
#shutdown_clients = yes
# Время в журнале в формате strftime(3)
log_timestamp = «%Y-%m-%d %H:%M:%S »
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c
syslog_facility = mail
# IP или имя с которого будут приниматься SSL соединения (по умолчанию все).
#ssl_listen =
# отключение поддержкиSSL/TLS
#ssl_disable = no
# ключи и сетификаты
ssl_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
ssl_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
# пароль для доступа к файлу ключей, и файл с CA SSL сертификатом (если требуются)
#ssl_key_password =
#ssl_ca_file =
# учетная запись используемая при регистрации
login_user = dovecot
# Расположение почтовых ящиков пользователей ( ранее default_mail_env
# setting). По умолчанию он пустой и Dovecot пробует найти их самостоятельно.
# Если не получится следует указать на прямую, %u соответсвует имени пользователя.
# В /usr/share/doc/dovecot-common/variables.txt есть примеры.
mail_location = maildir:/var/mail/%u/Maildir:INDEX=/var/mail/%u
# группы позволяющие получить доступ к каталогам почтовых ящиков
mail_extra_groups = mail
# полный доступ в пределах почтового ящика
mail_full_filesystem_access = no
# Первый разрешенный UID, для того чтобы пользователи не могли регистрироваться как демоны или системные пользователи.
first_valid_uid = 500
#last_valid_uid = 0
# маска для вновь создаваемых файлов
umask = 0077
# список разрешенных символов в имени пользователя
auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@
# возможна трансляция символов, например чтобы символы ‘#’ и ‘/’ перевести в ‘@’, используем.
#auth_username_translation = #@/@
# пользователь при SASL anonymous механизме аутентификации
#auth_anonymous_username = anonymous
# механизмы SASL аутентификации
auth default {
# возможны варианты plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi
mechanisms = plain login
# эта строка специфическая для взаимодействия с Postfix
socket listen {
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
# Для начала настроим систему на работу с локальными пользователями
# занесенными в /etc/passwd
passdb passwd {
}
userdb passwd {
}
# пользователь от имени, которого будет производиться проверка учетных данных
user = root
Перезапускаем Dovecot:
$ sudo /etc/init.d/dovecot restart
Для проверки работы системы можно использовать telnet, но пароль в открытом виде воспринят не будет, поэтому нам понадобится Perl модуль MIME-Base64:
$ wget – c http://cpan.uwinnipeg.ca/cpan/authors/id/G/GA/GAAS/MIME-Base64-3.07.tar.gz
Устанавливаем:
$ tar xzvf MIME-Base64-3.07.tar.gz
$ cd MIME-Base64-3.07/
$ perl Makefile.PL
$ make
$ make test
…….
All tests successful, 1 test skipped.
Files=5, Tests=339, 1 wallclock secs ( 0.14 cusr + 0.05 csys = 0.19 CPU)
Все тесты прошли нормально, устанавливаем:
$ sudo make install
Теперь нужно получить перекодированную строку, в качестве параметра нужно ввести два раза логин и один раз пароль:
$ perl -MMIME::Base64 -e ‘print encode_base64(«grinder\0grinder\0password»);’
Z3JpbmRlcgBncmluZGVyAHBhc3N3b3Jk
Соединяемся с сервером:
$ sudo telnet localhost 25
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
220 grinder.com ESMTP Postfix (Ubuntu)
EHLO grinder.com
250-grinder.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
# вводим полученную ранее строку.
AUTH PLAIN Z3JpbmRlcgBncmluZGVyAHBhc3N3b3Jk
235 2.0.0 Authentication successful
QUIT
221 2.0.0 Bye
Connection closed by foreign host.
Cистема аутендификации при отправке сообщения работает нормально. Для проверки всего цикла, настраиваем почтовый клиент (POP3 порт 110, POP3/SSL – 995, IMAP – 143 и IMAP/SSL – 993) и пробуем отправить и получить почту. Параллельно для анализа журналов в консоли вводим «tail -f /var/log/mail.log».
В итоге мы получили простую в администрировании и безопасную почтовую систему, которая подойдет для небольших организаций. Достаточно добавить нового пользователя командой «adduser» и он может отправлять и получать почту с нового сервера. В организациях с число большим числом пользователей, такая схема не подойдет. И систему следует наращивать дальше. Для примера добавим Postfix Admin и учетные записи пользователей перенесем в базу данных.
Прикручиваем Postfix Admin
Для начала следует убедиться, что Postfix собран c подержкой нужной БД:
$ postconf -m | grep mysql
mysql
Все нормально. Устанавливаем Apache, MySQL и необходимые модули:
$ sudo apt-get install mysql-server mysql-client apache2.2-common php5-mysql
Сайт проекта Postfix Admin находится по адресу sf.net/projects/postfixadmin, забираем последнюю версию и устанавливаем:
$ wget -c http://mesh.dl.sourceforge.net/sourceforge/postfixadmin/postfixadmin-2.1.0.tgz
$ tar xvzf postfixadmin-2.1.0.tgz
$ cd ./postfixadmin-2.1.0/
Внутри каталога находится файл с описанием параметров доступа к БД, вводим “sudo mcedit DATABASE_MYSQL.TXT” и редактируем все нужное в секции “Postfix user & password” и “ Postfix Admin user & password ”. По окончании устанавливаем новую базу данных:
$ mysql -u root -p < DATABASE_MYSQL.TXT
Далее следует скопировать все файлы в корневой каталог веб-сервера, в Ubuntu это /var/www:
$ cd ..
$ sudo cp -r postfixadmin-2.1.0 /var/www/
$ sudo mv /var/www/postfixadmin-2.1.0 /var/www/postfixadmin
Патчим Postfix Admin:
$ wget –c http://troels.arvin.dk/db/postfixadmin/postfixadmin-2.1.0-arvin-martin.patch
$ sudo cat postfixadmin-2.1.0-arvin-martin.patch | patch -p1
Переименовывем шаблон конфигурационного файла:
$ cd /var/www/postfixadmin/
$ sudo mv config.inc.php.sample config.inc.php
И правим:
$ sudo mcedit config.inc.php
# заменяем все строки «change-this-to-your.domain.tld» на имя своего узла
# проверяем параметры доступа к БД и правим следующие переменные
$CONF[‘domain_path’] = ‘YES’;
$CONF[‘domain_in_mailbox’] = ‘NO’;
$CONF[‘encrypt’] = ‘cleartext’;
Смотрим от имени под какой учетной записью работает веб-сервер и устаналиваем соответствующие права доступа к каталогу:
$ cat /etc/apache2/apache2.conf | grep User
User www-data
$ sudo chown -R www-data:www-data /var/www/postfixadmin
$ sudo chmod -R 700 postfixadmin
Если в Ubuntu сейчас попробовать зайти через браузер по адресу http://localhost/postfixadmin веб-сервер выдаст запрос на поиск программы для открытия PHTML файла. Поэтому в конфигурационный файл веб сервера добавим пару строк:
$ sudo mcedit /etc/apache2/apache2.conf
…
<IfModule mod_mime.c>
AddType application/x-httpd-php .php .phtml
AddHandler cgi-script .pl
…
Теперь перезапускаем веб-сервер и пробуем зайти на нужную страницу. Для того чтобы проверить установки следует нажать на Setup. Будет произведен поиск всех компонентов, особое внимание обращаем на наличие ошибок (Error), что означает отсутсвие нужного компонента.
По окончании настроек рекомендуется удалить файл setup.php и создать файл .htpasswd в каталоге /var/www/postfixadmin/admin.
Прикручиваем MySQL к Postfix и Dovecot
Теперь нужно сказать Postfix и Dovecot, чтобы они работали с MySQL. Сначала добавляем следующие строки в main.cf Postfix:
$ sudo mcedit /etc/postfix/main.cf
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:506
virtual_mailbox_base = /var/mail
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 506
virtual_transport = virtual
virtual_uid_maps = static:506
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unauth_destination,
reject_unauth_pipelining,
reject_invalid_hostname
И создаем новые файлы с именами указанными в main.cf:
$ sudo mcedit /etc/postfix/mysql_virtual_alias_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = alias
select_field = goto
where_field = address
ХХХХХХХХХХХХХХХХХХX
$ sudo mcedit /etc/postfix/mysql_virtual_domains_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = ‘0’ and active = ‘1’
$ sudo mcedit /etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
X
И переходим к настройке Dovecot. В каталоге /etc/dovecot лежит шаблон dovecot-sql.conf в котором описывается подключение к базе данных:
$ sudo mcedit /etc/dovecot/dovecot-sql.conf
driver = mysql
connect = host=localhost dbname=postfix user=postfix password=postfix
default_pass_scheme = PLAIN
password_query = SELECT password FROM mailbox WHERE username = ‘%u’
user_query = SELECT maildir, 125 AS uid, 125 AS gid FROM mailbox WHERE username = ‘%u’
В последнем запросе цифра 125 соответвует UID/GID пользователя postfix. В другой системе она может отличаться “cat /etc/passwd | grep postfix” и “ cat /etc/group | grep postfix ”. Теперь укажем на этот файл в dovecot.conf:
$ sudo mcedit /etc/dovecot/dovecot.conf
passdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
userdb sql{
args = /etc/dovecot/dovecot-sql.conf
}
Перезапускаем Apache, Postfix и Dovecot заходим на Postfix Admin создаем пользователей и работаем. В дальнейшем к этой системе можно добавить фильтры проверки на спам и антивирус.
INFO
Автор Dovecot Тимо Сираинен (Timo Sirainen) шел к первому релизу (13 апреля 2007) целых пять лет и настолько помешан на безопасности, что готов отдать свои кровные в размере 1000 евро тому, кто найдет первым уязвимость в его сервере.
//
добрый день.
все пробую стаить на 7.10
хотел бы внести небольшие поправки
1)ссылка на MIME-Base64 уже не рабочая, но в гугле прекрасно находится другое место.
2) к сожалению make и gcc не входят в базовый набор Ubuntu Server 7.10 но это легко реашется, в отличии от попытки собрать make test. для любой версии gcc выдает кучу ошибок и ругается 8(
поэтому пока что работу авторизации не получилось проверить.
//
290260510 Свяжись со мной? есть вопросы по поводу почтовика.
//
2Maxx Лучше на мыло
//
Все отлично работает, огромное спасибо.
Только вот не хочется mx записи на домене менять, может есть способ просто забирать почту с домена?
//
Вот что-то подобное.
http://www.samag.ru/art/07.2005/07.2005_09.html
//
Спасибо конечно. Рабочий вариант, но зачем еще один сервер если к этому варианту еще sieve и fetchmail прикрутить и будет решение проблемы.
Не могу разобраться c sieve, fetch забирает но никуда не отдает почту..
Есть желание уйти от платных вариантов, дорого получается.
//
Не нашел у себя готовых конфигов. Это нужно чутка поэкспериментировать.
//
Спасибо большое за статью и за видео! Grinder, не мог бы ты выложить из статьи файл dovecot.conf ?
Заранее спасибо!