Виртуальные
пользователи и домены, почтовый сервер
на основе Postfix, Courier, MySQL и SquirrelMail (Ubuntu
8,04 LTS).
Версия
1.0
Автор:
Falko Timme <ft [at] falkotimme [dot] com>
Последнее
редактирование 05/15/2008
Перевод:
Глушков Вадим <plusv [at] yandex [dot] ru>
Оригинальный
текст руководства можно найти по
следующему адресу
http://www.howtoforge.org/virtual-users-domains-postfix-courier-mysql-squirrelmail-ubuntu8.04
Права
на данное руководство принадлежат Falko
Timme (Copyright (c) 2008 by Falko Timme). Оно взято из
учебника Christoph Haas, которое вы можете
найти по адресу http://workaround.org. Вы можете
свободно использовать данное руководство,
оно распространяется по лицензии
Creative Commons версии 2.5 и других более поздних
версий.
В данном руководстве описана установка
почтового сервера Postfix, в который
использует виртуальных пользователей
и виртуальные домены (т.е. все учетные
записи и наименование доменов сохраняются
в базе данных MySQL). Также показана
установка и настройка Courier (Courier-POP3,
Courier-IMAP), с возможностью аутентификации
Postfix с использованием базы данных MySQL.
В
результате Postfix будет поддерживать
SMTP-AUTH, TLS и quota (по умолчанию поддержка
квот не встроена в Postfix и я покажу как
необходимо применить path к Postfix). Пароли
будут хранится в базе данных в зашифрованном
виде (в большинстве руководств я
обнаружил, что пароли хранятся в не
зашифрованном виде в текстовых файлах,
которые создают угрозу безопасности).
Кроме этого в данном руководстве
рассмотрена установка и настройка
Amavisd, SpamAssassin и ClamAV
это дает возможность сканировать
сообщения на наличие вирусов и спама.
Я также покажу как установить веб
интерфейс к почте SquirrelMail для того чтобы
пользователи могли получать, отправлять
почту изменять свои пароли.
Преимущество такой «виртуальной»
установки (виртуальные пользователи и
домены хранятся в базе данных MySQL) состоит
в том, что такая установка обладает
большей гибкостью и мощностью, чем
установка с «реальными» пользователями.
С таким «виртуальным» почтовым сервером
можно легко обрабатывать тысячи
пользователей и доменов. Кроме этого
ими легче управлять, так управление
осуществляется через базу данных MySQL,
вы с легкостью можете добавлять новые
или изменять существующие. Отпадает
необходимость использование команды
postmap для создания bd файлов, нет необходимости
перезагрузки Postfix и т.п. Для управления
базой данных вы можете использовать
веб инструменты, такие как phpmyadmin,
установка которого также описанна в
данном руководстве. Третье преимущество
заключается в том, что пользователи
будут иметь адрес электронной почты в
качестве имени пользователя электронной
почты (вместо имени пользователя + адрес
электронной почты), которые легче понять
и запомнить.
Этот документ предназначен для
использования в качестве практического
руководства в нем не раскрыты теоретические
основы. Они представлены во множестве
других документах в Интернет.
Этот документ поставляется без гарантий
любого рода! Я хочу сказать, что это не
единственный способ создания такой
системы. Есть много способов достижения
этой цели, но это такой, который я принял.
Я не выдают никаких гарантий, что это
будет работать у Вас!
1. Предварительные замечания
Это
руководство для Ubuntu 8.04 Server (Hardy Heron), вам
необходимо произвести базовую установку
Ubuntu 8.04 server перед началом (как это сделать
можно посмотреть на страницах 1-3
руководства «The Perfect Server — Ubuntu Hardy Heron
(Ubuntu 8.04 LTS Server)»
http://www.howtoforge.com/perfect-server-ubuntu8.04-lts)
. Система должна иметь статический IP
адрес. Я использую 192.168.0.100 как мой IP
адрес в данном руководстве и
server1.example.com как имя хоста.
Убедитесь, что вы зашли как суперпользователь,
sudo
su
потому что в данном руководстве необходимо
выполнять все шаги от его имени.
Очень важным является, чтобы вы сделали
символическую ссылку /bin/sh на /bin/bash...
ln
-sf /bin/bash /bin/sh
... и еще отключите AppArmor:
/etc/init.d/apparmor stop update-rc.d
-f apparmor remove
2. Установка
Postfix, Courier, Saslauthd, MySQL, phpMyAdmin
Для
установки Postfix, Courier, Saslauthd, MySQL и phpMyAdmin,
нам просто необходимо вполнить:
apt-get
install postfix postfix-mysql postfix-doc mysql-client mysql-server
courier-authdaemon courier-authlib-mysql courier-pop courier-pop-ssl
courier-imap courier-imap-ssl postfix-tls libsasl2-2 libsasl2-modules
libsasl2-modules-sql sasl2-bin libpam-mysql openssl phpmyadmin
apache2 libapache2-mod-php5 php5 php5-mysql libpam-smbpass
Вам
будет задано несколько вопросов на
которые необходимо ответить:
New password for the MySQL
"root" user: <-- yourrootsqlpassword Repeat
password for the MySQL "root" user: <--
yourrootsqlpassword Create
directories for web-based administration? <-- No General
type of mail configuration: <-- Internet
Site System mail name: <-- server1.example.com SSL
certificate required <-- Ok Web
server to reconfigure automatically: <-- apache2
3. Применение патча квоты
Postfix
Мы
должны получить исходники Postfix, патч к
нему, построить .deb пакеты и установить
эти .deb пакеты:
apt-get
install build-essential dpkg-dev fakeroot debhelper libgdbm-dev
libldap2-dev libpcre3-dev libssl-dev libsasl2-dev
postgresql-server-dev-8.2 po-debconf dpatch libmysqlclient15-dev
lsb-release libcdb-dev libdb-dev
cd
/usr/src apt-get source postfix
(Убедитесь
что вы используете корректную версию
Postfix. У меня установлена версия Postfix
2.5.1. Вы можете узнать вашу версию выполнив
следующие команды:
postconf -d | grep mail_version
Вы
должны увидеть после выполнения команд
следующее:
root@server1:/usr/src#
postconf -d | grep mail_version mail_version =
2.5.1 milter_macro_v = $mail_name
$mail_version root@server1:/usr/src#
)
wget
http://vda.sourceforge.net/VDA/postfix-2.5.1-vda-ng.patch.gz gunzip
postfix-2.5.1-vda-ng.patch.gz cd postfix-2.5.1 patch -p1 <
../postfix-2.5.1-vda-ng.patch dpkg-buildpackage
Вы
можете увидеть предупреждения при
выполнении команды dpkg-buildpackage, например
такие:
dpkg-buildpackage:
warning: Failed to sign .dsc and .changes file
такие
сообщения можно игнорировать
Сейчас
мы перейдем на один уровень вверх и
посмотрим какие новые .deb пакеты были
созданы:
cd
..
Выполним
команду
ls
-l
она
покажет нам все доступные пакеты:
root@server1:/usr/src#
ls -l
total
5804
drwxr-sr-x
19 root src 4096 2008-05-15 00:36 postfix-2.5.1
-rw-r--r--
1 root src 235739 2008-05-15 00:35 postfix_2.5.1-2ubuntu1.diff.gz
-rw-r--r--
1 root src 787 2008-05-15 00:35 postfix_2.5.1-2ubuntu1.dsc
-rw-r--r--
1 root src 2236 2008-05-15 00:37
postfix_2.5.1-2ubuntu1_i386.changes
-rw-r--r--
1 root src 1165838 2008-05-15 00:37 postfix_2.5.1-2ubuntu1_i386.deb
-rw-r--r--
1 root src 3153629 2008-02-26 03:04 postfix_2.5.1.orig.tar.gz
-rw-r--r--
1 root src 57952 2008-03-24 01:51 postfix-2.5.1-vda-ng.patch
-rw-r--r--
1 root src 39796 2008-05-15 00:37
postfix-cdb_2.5.1-2ubuntu1_i386.deb
-rw-r--r--
1 root src 139888 2008-05-15 00:37
postfix-dev_2.5.1-2ubuntu1_all.deb
-rw-r--r--
1 root src 916386 2008-05-15 00:37
postfix-doc_2.5.1-2ubuntu1_all.deb
-rw-r--r--
1 root src 46694 2008-05-15 00:37
postfix-ldap_2.5.1-2ubuntu1_i386.deb
-rw-r--r--
1 root src 41730 2008-05-15 00:37
postfix-mysql_2.5.1-2ubuntu1_i386.deb
-rw-r--r--
1 root src 41530 2008-05-15 00:37
postfix-pcre_2.5.1-2ubuntu1_i386.deb
-rw-r--r--
1 root src 41796 2008-05-15 00:37
postfix-pgsql_2.5.1-2ubuntu1_i386.deb
root@server1:/usr/src#
Выбираем
пакеты postfix и postfix-mysql и устанавливаем
их:
dpkg
-i postfix_2.5.1-2ubuntu1_i386.deb
dpkg
-i postfix-mysql_2.5.1-2ubuntu1_i386.deb
4. Создание
базы данных MySQL для Postfix/Courier.
Сначала
создадим базу данных с названием mail:
mysqladmin
-u root -p create mail
Затем
мы перейдем в оболочку MySQL:
mysql
-u root -p
В
оболочке MySQL скорлупы, мы создадим
пользователя mail_admin с паролем
mail_admin_password (замените на свои) которые
будет иметь следующие привилегии
SELECT, INSERT, UPDATE, DELETE на базу данных mail. Этот
пользователь будет использоваться
Postfix и Courier для подключения к почтовой
базе:
GRANT
SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost'
IDENTIFIED BY 'mail_admin_password'; GRANT SELECT, INSERT, UPDATE,
DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED
BY 'mail_admin_password'; FLUSH PRIVILEGES;
Сейчас
используя оболочку MySQL, мы создадим
таблицы необходимые Postfix и Courier:
USE
mail;
CREATE
TABLE domains (
domain
varchar(50) NOT NULL,
PRIMARY
KEY (domain) )
TYPE=MyISAM;
CREATE
TABLE forwardings (
source
varchar(80) NOT NULL,
destination
TEXT NOT NULL,
PRIMARY
KEY (source) )
TYPE=MyISAM;
CREATE
TABLE users (
email
varchar(80) NOT NULL,
password
varchar(20) NOT NULL,
quota
INT(10) DEFAULT '10485760',
PRIMARY
KEY (email)
)
TYPE=MyISAM;
CREATE
TABLE transport (
domain
varchar(128) NOT NULL default '',
transport
varchar(128) NOT NULL default '',
UNIQUE
KEY domain (domain)
)
TYPE=MyISAM;
quit;
Как
вы уже наверное заметили мы покинули
оболочку MySQL и ввернулись командную
оболочку Linux.
Таблица
domains будет хранить наименования
виртуальных доменов для которых Postfix
будет получать письма.
Таблица
forwardings будет
содержать псевдонимы почтовых ящиков,
например почтовые сообщения направленные
на info@example.com будт перенаправлены на
sales@example.com.
source
|
destination
|
info@example.com
|
sales@example.com
|
Таблица
users будет содержать всю информацию
о виртуальных пользователях (например,
адреса электронной почты, потому что
адрес электронной почты и имя пользователя
одно и тоже) и паролей (в зашифрованном
виде!), а также размер квоты для каждого
почтового ящика (в данном примере
значение по умолчанию равно 10485760 байт,
что означает 10 Мб)
email
|
password
|
quota
|
sales@example.com
|
No9.E4skNvGa.
("secret" in encrypted form)
|
10485760
|
Таблица
transport необязательного характера,
она для продвинутых пользователей.
Позволяет перенаправлять почту отдельных
пользователей, доменов либо всю почту
на другой почтовый сервер. Например,
domain
|
transport
|
example.com
|
smtp:[1.2.3.4]
|
направит
все сообщения приходящие для example.com по
протоколу smtp на сервер IP-адресом 1.2.3.4
(квадратные скобки [] означают "не
делать поиск MX записи в DNS" (это имеет
смысл для IP-адреса .. .). Если вы используете
полное доменное имя (FQDN), а вам не нужно
использовать квадратные скобки.).
Между
прочим (предполагая, что адрес вашего
почтового сервера 192.168.0.100), для доступа
к почтовой базе данных через phpMyAdmin вы
можете набрать в вашем браузере
http://192.168.0.100/phpmyadmin/ и войти как mail_admin.
После этого вы можете посмотреть базу
данных. В дальнейшем вы можете использовать
phpMyAdmin для администрирования почтового
сервера.
5. Настройка Postfix
Сейчас
нам необходимо указать Postfix, где ему
искать информацию в базе данных. Для
этого создадим шесть текстовых файлов.
Как вы можете заметить, я указываю
Postfix соединяться с MySQL через IP адрес
127.0.0.1 вместо localhost. Это связанно с тем,
что Postfix запущенный в chroot окружении не
сможет иметь доступа к MySQL сокету, если
будет пытаться использовать localhost для
подключения. Если же я буду использовать
127.0.0.1 будет использовать TCP сеть для
подключения к MySQL, и это снимет проблему
соединения из chroot окружения (в качестве
альтернативы можно поместить соект
MySQL в chroot окружение, но это вызовет
дополнительные проблемы).
Убедитесь что /etc/mysql/my.cnf содержит
следующие строки:
vi
/etc/mysql/my.cnf
[...]
bind-address = 127.0.0.1
[...]
Если вы изменили
/etc/mysql/my.cnf, пожалуйста
перезапустите MySQL:
/etc/init.d/mysql
restart
Запустите
netstat
-tap | grep mysql
чтобы
убедится, что MySQL прослушивает
127.0.0.1 (localhost.localdomain):
root@server1:/usr/src#
netstat -tap | grep mysql
tcp
0 0 localhost.localdo:mysql *:*
LISTEN 6177/mysqld
root@server1:/usr/src#
Сейчас
давайте создадим шесть необходимых нам
файлов:
vi
/etc/postfix/mysql-virtual_domains.cf
user
= mail_admin
password
= mail_admin_password
dbname
= mail
query
= SELECT domain AS virtual FROM domains WHERE domain='%s'
hosts
= 127.0.0.1
vi
/etc/postfix/mysql-virtual_forwardings.cf
user
= mail_admin
password
= mail_admin_password
dbname
= mail
query
= SELECT destination FROM forwardings WHERE source='%s'
hosts
= 127.0.0.1
vi
/etc/postfix/mysql-virtual_mailboxes.cf
user
= mail_admin
password
= mail_admin_password
dbname
= mail
query
= SELECT
CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
FROM users WHERE email='%s'
hosts
= 127.0.0.1
vi
/etc/postfix/mysql-virtual_email2email.cf
user
= mail_admin
password
= mail_admin_password
dbname
= mail
query
= SELECT email FROM users WHERE email='%s'
hosts
= 127.0.0.1
vi
/etc/postfix/mysql-virtual_transports.cf
user
= mail_admin
password
= mail_admin_password
dbname
= mail
query
= SELECT transport FROM transport WHERE domain='%s'
hosts
= 127.0.0.1
vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf
user
= mail_admin
password
= mail_admin_password
dbname
= mail
query
= SELECT quota FROM users WHERE email='%s'
hosts
= 127.0.0.1
Изменяем права доступа и группа для
этих файлов:
chmod
o= /etc/postfix/mysql-virtual_*.cf
chgrp
postfix /etc/postfix/mysql-virtual_*.cf
Создаем нового пользователя и группу
с названием vmail с домашней директорией
/home/vmail , где будут находится почтовые
ящики:
groupadd
-g 5000 vmail useradd -g vmail -u 5000 vmail -d /home/vmail -m
Сейчас
мы настроим Postfix. Обязательно замените
server1.example.com with на настоящий FQDN, иначе
ваш почтовый сервер Postfix не сможет
корректно работать!
postconf
-e 'myhostname = server1.example.com' postconf -e 'mydestination =
server1.example.com, localhost, localhost.localdomain' postconf -e
'mynetworks = 127.0.0.0/8' postconf -e 'virtual_alias_domains
=' postconf -e 'virtual_alias_maps =
proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf,
mysql:/etc/postfix/mysql-virtual_email2email.cf' postconf -e
'virtual_mailbox_domains =
proxy:mysql:/etc/postfix/mysql-virtual_domains.cf' postconf -e
'virtual_mailbox_maps =
proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf' postconf -e
'virtual_mailbox_base = /home/vmail' postconf -e 'virtual_uid_maps
= static:5000' postconf -e 'virtual_gid_maps =
static:5000' postconf -e 'smtpd_sasl_auth_enable = yes' postconf
-e 'broken_sasl_auth_clients = yes' postconf -e
'smtpd_sasl_authenticated_header = yes' postconf -e
'smtpd_recipient_restrictions = permit_mynetworks,
permit_sasl_authenticated, reject_unauth_destination' postconf -e
'smtpd_use_tls = yes' postconf -e 'smtpd_tls_cert_file =
/etc/postfix/smtpd.cert' postconf -e 'smtpd_tls_key_file =
/etc/postfix/smtpd.key' postconf -e 'transport_maps =
proxy:mysql:/etc/postfix/mysql-virtual_transports.cf' postconf -e
'virtual_create_maildirsize = yes' postconf -e
'virtual_mailbox_extended = yes' postconf -e
'virtual_mailbox_limit_maps =
proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf' postconf
-e 'virtual_mailbox_limit_override = yes' postconf -e
'virtual_maildir_limit_message = "The user you are trying to
reach is over quota."' postconf -e 'virtual_overquota_bounce
= yes' postconf -e 'proxy_read_maps = $local_recipient_maps
$mydestination $virtual_alias_maps $virtual_alias_domains
$virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps
$relay_domains $canonical_maps $sender_canonical_maps
$recipient_canonical_maps $relocated_maps $transport_maps $mynetworks
$virtual_mailbox_limit_maps'
Создадим
сертификат SSL необходимый для TLS:
cd
/etc/postfix openssl req -new -outform PEM -out smtpd.cert -newkey
rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509
Country
Name (2 letter code) [AU]: <-- Введите страну
(например, "RU").
State
or Province Name (full name) [Some-State]: <-- Введите
название области (например,"Moskow")
.
Locality
Name (eg, city) []: <-- Введите населенный пункт
(например, "Moskow").
Organization
Name (eg, company) [Internet Widgits Pty Ltd]: <-- Введите
наименование вашей организации (например,
"Ltd DoIt").
Organizational
Unit Name (eg, section) []: <-- Введите наименование
вашего подразделения (например. "IT
Department").
Common
Name (eg, YOUR name) []: <-- Введите Fully Qualified Domain
Name (например. "server1.example.com").
Email
Address []: <-- Введите ваш email.
Изменяем права доступа на smtpd.key:
chmod
o= /etc/postfix/smtpd.key
6 Настройка Saslauthd
Сначала
выполним следующую команду:
mkdir
-p /var/spool/postfix/var/run/saslauthd
Затем
изменим /etc/default/saslauthd. Установив параметр
START в yes и заменим строку OPTIONS="-c -m
/var/run/saslauthd" на OPTIONS="-c -m
/var/spool/postfix/var/run/saslauthd -r":
vi
/etc/default/saslauthd
#
# Settings for saslauthd daemon
# Please read /usr/share/doc/sasl2-bin/README.Debian for details.
#
# Should saslauthd run automatically on startup? (default: no)
START=yes
# Description of this saslauthd instance. Recommended.
# (suggestion: SASL Authentication Daemon)
DESC="SASL Authentication Daemon"
# Short name of this saslauthd instance. Strongly recommended.
# (suggestion: saslauthd)
NAME="saslauthd"
# Which authentication mechanisms should saslauthd use? (default: pam)
#
# Available options in this Debian package:
# getpwent -- use the getpwent() library function
# kerberos5 -- use Kerberos 5
# pam -- use PAM
# rimap -- use a remote IMAP server
# shadow -- use the local shadow password file
# sasldb -- use the local sasldb database file
# ldap -- use LDAP (configuration is in /etc/saslauthd.conf)
#
# Only one option may be used at a time. See the saslauthd man page
# for more information.
#
# Example: MECHANISMS="pam"
MECHANISMS="pam"
# Additional options for this mechanism. (default: none)
# See the saslauthd man page for information about mech-specific options.
MECH_OPTIONS=""
# How many saslauthd processes should we run? (default: 5)
# A value of 0 will fork a new process for each connection.
THREADS=5
# Other options (default: -c -m /var/run/saslauthd)
# Note: You MUST specify the -m option or saslauthd won't run!
#
# See /usr/share/doc/sasl2-bin/README.Debian for Debian-specific information.
# See the saslauthd man page for general information about these options.
#
# Example for postfix users: "-c -m /var/spool/postfix/var/run/saslauthd"
#OPTIONS="-c -m /var/run/saslauthd"
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"
Создаем файл /etc/pam.d/smtp. И добавляем в
него две строчки (обязательно используйте
корректные значения относящиеся к вашей
базе данных):
vi
/etc/pam.d/smtp
auth required pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1
Создаем файл /etc/postfix/sasl/smtpd.conf. Он должен
быть подобного вида:
vi
/etc/postfix/sasl/smtpd.conf
pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: mail_admin
sql_passwd: mail_admin_password
sql_database: mail
sql_select: select password from users where email = '%u'
Добавляем пользователя postfix в группу
sasl (это даст Postfix права доступа к
saslauthd):
adduser
postfix sasl
Перезапускаем
Postfix и Saslauthd:
/etc/init.d/postfix
restart /etc/init.d/saslauthd restart
|