Ключевые слова:postfix, mail, mysql, auth, (найти похожие документы)
From: Константин Климчев <koka at atknet.ru>
Date: Mon, 28 Aug 2004 14:31:37 +0000 (UTC)
Subject: Postfix и база пользователей в MySQL
Оригинал: http://www.phantom.atknet.ru/articles/3.html
Предисловие
-----------
Воюя с postfix'ом на предмет виртуальных пользователей (реально не
присутствующих в системе) приобрел некоторое (маааааленькое) понимание
этого вопроса. Сразу хочу оговориться, что в инете достаточное
количество информации по этому. Зайдите на google.com и задайте поиск
по "postfix mysql", да и на самом сайте www.postfix.org есть ряд
ссылок. Но все это меня не очень устраивало, одним словом, было
неуютным. Я пошел своим собственным путем, в результате которого и
родилась эта статейка или как хотите, так и называйте. Вообщем,
представляю еще одно нетленное творение по проблеме.
Первые опыты
------------
Начитавшись информации по этому вопросу я уяснил одно: "вроде бы как
должно работать" и пошел путем наименьшего сопротивления - сделать по
образцу. Но в каждом из вариантов мне что-то не устраивало, а
скрестить "ужа с ежем" не получалось. Помучившись какое-то время, я
все же пришел к мысли, что разбираться придется по-серьезному (по
крайней мере в таком объеме, когда начинаешь понимать - что же ты
делаешь).
Стоит отметить, что в ходе работы "по образцу" какое-то понимание
процесса появилось, но оно не складывалось в единое целое. Так вот, в
одном из руководств было упоминание о файле VIRTUAL_README, идущем с
postfix'ом, по этому я начал с него. Не буду вдаваться в подробности,
но то, что там было и позволило свести концы с концами в единое целое.
Хотя там идет описание на основе hash'овских файлов, адаптировать к
любому другому случаю уже не представляется проблемой. (Еще раз сам
себе напоминаю о пользе чтения документации ;) ). Не буду здесь
повторять содержимое VIRTUAL_README, скажу только, что первые два
примера этого файлика и будут базовыми для решения поставленной
задачи.
Куда ж оно денется с подводной лодки
Итак, ставим перед собой задачу:
* иметь почтовые ящики пользователей, которые не имеют аккаунтов в
системе (попросту говоря, не создавались бы по useradd)
* хорошо бы еще и в alias'ах применять виртуальных пользователей
* ну и почтовые ящики локальных пользователей не потерять бы
* в качестве "внешнего" хранилища пользователей выберем mysql
Перво-наперво, необходимо, чтобы postfix был собран с поддержкой
mysql. Радует тот факт, что поддержка mysql в postfix'е нативная и
никаких внешних патчей накладывать не нужно (как в случае postgresql,
но тут тоже проблем никаких). Сразу оговорюсь, что приводить здесь
буду для двух Linux-дистрибутивов: ALT-Master (используется на
серверах, так исторически сложилось) и ASP (использую лично, как на
работе так и дома).
Очень часто предлагают ставить напрямую, по make install, я же
предпочитаю сначала собрать rpm'ку, а затем ее поставить, ибо считаю
это более идеологически правильным. В нашем случае все намного проще -
нужно взять соответствующую srpm'ку из дистрибутива, изменить spec и
пересобрать пакет.
Для ASP 7.3 (9 до меня еще не дошел):
-------------------------------------
создайте (если еще не создано), где будете собирать (от рута
осуществлять сборку - не очень хорошая идея):
mkdir $HOME/rpm
mkdir $HOME/rpm/RPMS
mkdir $HOME/rpm/RPMS/i386
mkdir $HOME/rpm/RPMS/i686
mkdir $HOME/rpm/SRPMS
mkdir $HOME/rpm/SPECS
mkdir $HOME/rpm/SOURCES
mkdir $HOME/rpm/BUILD
echo "%_topdir $HOME/rpm" >$HOME/.rpmmacros
Инсталлируйте source rpm postfix'а:
rpm -ivh postfix-1.1.10-1.asp.src.rpm
Не забудьте перед этим инсталлировать необходимые для сборки rpm
пакеты, а также mysql-devel (иначе как будем скрещивать postfix с
mysql) и пакет zlib-devel (из-за которого бывает иногда много хлопот -
вроде собралось, но почему не работает не понятно).
Переходим в $HOME/rpm/SPECS:
cd `rpm --eval '%{_specdir}'`
и изменяем значение %define MYSQL в файле postfix.spec с "0" на "1" ,
после этого производим пересборку пакета:
rpm -ba postfix.spec
Если пересборка заканчивается ошибкой - возможно у Вас не установлен
какой-то пакет(ы), и после доустановки его попробуйте пересобрать
postfix еще раз.
Пересобранный пакет находится в $HOME/rpm/RPMS/i386
Для ALT-Master 2.2 (для 2.0 аналогично):
----------------------------------------
для Мастера насколько сложнее, но не настолько, чтобы впадать в панику.
Инсталлируйте source rpm postfix'а (не забудьте себя включить в группу rpm):
rpm -ivh postfix-1.1.12-alt2.src.rpm
Далее в спеке postfix.spec добавляем (помечено "+"):
%def_with pcre
%def_with ldap
%def_with sasl
+%def_with mysql
%if_with ldap
CCARGS="$CCARGS -DHAS_LDAP"
AUXLIBS="$AUXLIBS -lldap -llber"
%endif #with ldap
+%if_with mysql
+CCARGS="$CCARGS -DHAS_MYSQL -I%_includedir/mysql"
+AUXLIBS="$AUXLIBS -lmysqlclient -lm"
+%endif #with mysql
+
Далее - все аналогично тому, как делалось в ASPLinux, только хочется
добавить: получится несколько пакетов. Нас интересуют
postfix-1.1.12-alt2.i686.rpm и postfix-smtpd-1.1.12-alt2.i686.rpm или
с sasl в имени, если Вас интересует авторизированная отправка почты.
После инсталляции необходимых пакетов переходим к конфигурированию
всего этого хозяйства
MySQL:
------
Перво-наперво создаем в mysql базу mail и пользователя, например,
postfix c паролем postfix, имеющего право на чтение этой базы:
mysql>create database mail;
mysql>GRANT select ON `mail`.* TO 'postfix'@'127.0.0.1' IDENTIFIED BY 'postfix';
Далее создаем необходимые таблицы (описание что для чего - позже):
# Таблица: 'alias'
#
CREATE TABLE alias (
address varchar(128) NOT NULL default '',
goto varchar(128) NOT NULL default '',
PRIMARY KEY (address)
) TYPE=MyISAM;
# Таблица: 'transport'
#
CREATE TABLE transport (
domain varchar(128) NOT NULL default '',
transport varchar(128) NOT NULL default '',
PRIMARY KEY (domain)
) TYPE=MyISAM;
# Таблица: 'users'
#
CREATE TABLE users (
email varchar(128) NOT NULL default '',
passwd varchar(128) NOT NULL default '',
uid int(11) unsigned NOT NULL default '1000',
gid int(11) unsigned NOT NULL default '12',
maildir varchar(255) NOT NULL default '/var/spool/mail',
enabled tinyint(4) NOT NULL default '1',
quota int(11) unsigned NOT NULL default '2048000',
PRIMARY KEY (email)
) TYPE=MyISAM;
Описание таблиц:
----------------
Таблица 'transport' (из man transport):
Таблица transport описывает соответствия между иерархиями доменов и
транспортами доставки сообщений и/или пересылочными машинами.
Пример:
mysql>select * from transport;
+--------------------+-----------+
| domain | transport |
+--------------------+-----------+
| virtual1.domain | virtual |
+--------------------+-----------+
1 row in set (0.00 sec)
Таблица 'alias' (из man aliases):
Таблица alias обеспечивает общесистемный механизм перенаправления почты
Пример:
mysql> select * from alias;
+-------------------------+------+
| address | goto |
+-------------------------+------+
| root@testmail.atknet.ru | root |
+-------------------------+------+
1 row in set (0.00 sec)
Таблица 'users':
К этой таблице нужно уделить более пристальное внимание, ибо это
основная таблица, хранящая информацию о почтовых пользователях
системы.
Пример:
mysql> select * from users;
+---------------------+------+------+-----+----------------------+---------+--------+
| email |passwd| uid | gid | maildir | enabled |quota |
+---------------------+------+------+-----+----------------------+---------+--------+
| test@virtual1.domain|test | 1001 | 12 | /var/spool/mail/test | 1 |4096000 |
+---------------------+------+------+-----+----------------------+---------+--------+
1 row in set (0.00 sec)
Давайте по подробнее остановимся на полях этой таблицы:
email - и так понятно, имя почтового ящика пользователя;
passwd - пароль на доступ к почтовому ящику пользователя (используется
для авторизованного подключения пользователя по pop3 или imap;
понадобится в дальнейших описаниях; в рассматриваемом вопросе не
применяется);
uid - uid виртуального пользователя;
gid - gid виртуального пользователя, по умолчанию он равен gid
пользователя mail;
mildir - место расположения ящика;
enabled - используется для того, чтобы временно (не удаляя из базы)
закрыть ящик пользователя;
quota - размер почтового ящика пользователя (понадобится в дальнейших
описаниях; в рассматриваемом вопросе не применяется).
POSTFIX:
--------
Здесь я просто приведу, что необходимо изменить в конфигах, а смысл
изменений, я думаю вы поймете (помните я давал ссылку на VIRTUAL_README)
# Файл: main.cf:
#
mydestination = localhost, $myhostname, localhost.$mydomain,
$config_directory/mydestination, mysql:/etc/postfix/mysql-mydestination.cf
local_recipient_maps = unix:passwd.byname $alias_maps $virtual_mailbox_maps
#======== MySQL ===================
virtual_mailbox_base = /
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-maps.cf
virtual_maps = mysql:/etc/postfix/mysql-virtual.cf
virtual_minimum_uid = 500
virtual_uid_maps = mysql:/etc/postfix/mysql-virtual-uid.cf
virtual_gid_maps = mysql:/etc/postfix/mysql-virtual-gid.cf
transport_maps = mysql:/etc/postfix/mysql-transport.cf
# Файл: mysql-mydestination.cf
#
user = postfix
password = postfix
dbname = mail
table = transport
select_field = domain
where_field = domain
hosts = 127.0.0.1
# Файл: mysql-transport.cf
#
user = postfix
password = postfix
dbname = mail
table = transport
select_field = transport
where_field = domain
hosts = 127.0.0.1
# Файл: mysql-virtual-maps.cf
#
user = postfix
password = postfix
dbname = mail
table = users
select_field = maildir
where_field = email
additional_conditions = and enabled = 1
hosts = 127.0.0.1
# Файл: mysql-virtual-uid.cf
#
user = postfix
password = postfix
dbname = mail
table = users
select_field = uid
where_field = email
additional_conditions = and enabled = 1
hosts = 127.0.0.1
# Файл: mysql-virtual-gid.cf
#
user = postfix
password = postfix
dbname = mail
table = users
select_field = gid
where_field = email
additional_conditions = and enabled = 1
hosts = 127.0.0.1
# Файл: mysql-virtual.cf
#
user = postfix
password = postfix
dbname = mail
table = alias
select_field = goto
where_field = address
hosts = 127.0.0.1
Самое главное: не забудьте в файле master.cf изменить строку:
virtual unix - n y - - virtual
на
virtual unix - n n - - virtual
Тестирование всего этого хозяйства оставим на домашнее задание
(подсказка - Ваши любимые места, где вы будете бывать во время
тестирования: mail.log и лог, куда записываются результаты работы
mysql (если у Вас он по умолчанию не включена эта возможность -
сделайте это: опция в конфигурационном файле log=куда).
Финал, занавес.
---------------
В конце скажу, что это первая статья по использованию postfix. В
будущем я отражу следующие вопросы: postfix+DrWeb; "забор" почты
виртуальных пользователей на основе courier-imap и, возможно, qpopper;
не забуду также такой вопрос как использование блок-листов (вам не
надоел валящийся спам?).
Postfix + MySQL + Qpopper для ASPLinux
Оригинал: http://www.phantom.atknet.ru/articles/4.html
Предисловие
-----------
Поводом к написанию послужило то, что я ничего не нашел по этому
вопросу и решил восполнить пробел. Хочу отметить тот факт, что
сведения этого руководства можно применить не только для ASPLinux, но
и для любого другого rpm-дистрибутива (возможно с незначительной
правкой .spec'а), а возможно и любого дистрибутива Linux - тут я не
проверял.
Еще хочу отметить: если Вы заметите какую-либо неточность или более
красивое решение - пишите, я это отражу (разумеется герои не будут
забыты в руководстве).
В конце есть ссылки на собранные (пересобранные) файлы, которые я
использовал при написании этой статьи
Инсталляция
-----------
MySQL:
тут ничего не обычного нет - просто ставите и все. Единственное, что
отмечу - нужны пакеты mysql, mysql-server, mysql-devel, zlib-devel
Postfix:
Вот тут необходимо пересобрать пакет. Необходимо "включить" поддержку
MySQL. Но тут все очень просто - необходимо взять srpm'ку из
дистрибутива, развернуть ее в то место, где у Вас осуществляется
сборка пакетов и в spec'е изменить одно значение:
с %define MYSQL 0
на %define MYSQL 1
и осуществить пересборку (rpm -ba postfix.spec), а после
инсталлировать (если переинсталлировать, то rpm -Uvh --force
имя_пакета.rpm) пакет.
Qpopper:
Возьмите srpm'ку у меня, разверните ее в то место, где у Вас
осуществляется сборка пакетов и в spec'е (если необходимо) поправьте
%define'ы. Осуществите пересборку пакета и после этого инсталлируйте
его.
Если хотите все сделать сами - главный патч, заставляющий qpopper
дружить с mysql берите [3]здесь. на момент написания - последний
qpopper-mysql-0.11.patch. А далее - в пакете неплохая документация.
Одним словом - дерзайте
Все. С инсталляцией покончено. Следующий шаг - конфигурирование.
Конфигурирование
----------------
MySQL:
все конфигурирование заключается в создании базы виртуальных
пользователей и пользователя, от которого будет осуществляться доступ
к указанной базе.
mysql>create database mail;
mysql>GRANT select ON `mail`.* TO 'postfix'@'127.0.0.1' IDENTIFIED BY 'postfix';
mysql>use mail;
mysql>create table alias (address varchar(128) not null default '', \
goto varchar(128) not null default '', primary key (address));
mysql>create table transport (domain varchar(128) not null default '', \
transport varchar(128) not null default '', primary key (domain));
mysql>create table users (email varchar(128) not null default '', \
passwd varchar(128) not null default '', uid int(11) unsigned not null default'1000', \
gid int(11) unsigned not null default '12', \
maildir varchar(255) not null default '/var/spool/mail', \
enabled tinyint(4) not null default '1', primary key (email) );
mysql>insert into transport VALUES ('virtual1.domain', 'virtual');
mysql>insert into users VALUES ('test@virtual1.domain', 'password', '1000', '12', \
'/var/spool/mail/virtual1.domain/test', '1');
Postfix:
Конфигурирование postfix'а заключается в редактировании
конфигурационных файлов. Сразу скажу - здесь я не буду описывать весь
процесс конфигурирования postfix'а (смотрите документацию к postfix'у
- там есть много чего интересного), а только тем моменты, которые
затрагивают рассматриваемый вопрос.
файл /etc/postfix/master.cf
строку:
virtual unix - n y - - virtual
меняем на:
virtual unix - n n - - virtual
файл /etc/postfix/main.cf
mydestination = localhost, $myhostname, localhost.$mydomain,
mysql:/etc/postfix/mysql-mydestination.cf
local_recipient_maps = unix:passwd.byname $alias_maps $virtual_mailbox_maps
#======== MySQL ===================
virtual_mailbox_base = /
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-maps.cf
virtual_maps = mysql:/etc/postfix/mysql-virtual.cf
virtual_minimum_uid = 500
virtual_uid_maps = mysql:/etc/postfix/mysql-virtual-uid.cf
virtual_gid_maps = mysql:/etc/postfix/mysql-virtual-gid.cf
transport_maps = mysql:/etc/postfix/mysql-transport.cf
строка local_recipient_maps = ... необходима для того, чтобы почту
могли получать и локальные пользователи (не нужно было бы их
прописывать в базе), которым направляются результаты работы сервисов
системы (запускаемые по cron, ошибки и т.п.), а эту почту локального
пользователя (например, root) можно потом перенаправить на
виртуального в файле /etc/postfix/aliases.
файл /etc/postfix/mysql-mydestination.cf
user = postfix
password = postfix
dbname = mail
table = transport
select_field = domain
where_field = domain
hosts = 127.0.0.1
файл /etc/postfix/mysql-virtual-maps.cf
user = postfix
password = postfix
dbname = mail
table = users
select_field = maildir
where_field = email
additional_conditions = and enabled = 1
hosts = 127.0.0.1
файл /etc/postfix/mysql-virtual.cf
user = postfix
password = postfix
dbname = mail
table = alias
select_field = goto
where_field = address
hosts = 127.0.0.1
файл /etc/postfix/mysql-virtual-uid.cf
user = postfix
password = postfix
dbname = mail
table = users
select_field = uid
where_field = email
additional_conditions = and enabled = 1
hosts = 127.0.0.1
файл /etc/postfix/mysql-virtual-gid.cf
user = postfix
password = postfix
dbname = mail
table = users
select_field = gid
where_field = email
additional_conditions = and enabled = 1
hosts = 127.0.0.1
файл /etc/postfix/mysql-transport.cf
user = postfix
password = postfix
dbname = mail
table = transport
select_field = transport
where_field = domain
hosts = 127.0.0.1
Не забываем создать каталог /var/spool/mail/virtual1.domain с правами:
drwxrwxr-x root:mail
Qpopper:
Тут тоже все просто. Измените содержимое конфигурационного файла
/etc/qpopper/mysql-popper.conf на следующее:
MysqlAuthHost 127.0.0.1
MysqlAuthPort 3306
MysqlAuthDb mail
MysqlUsername postfix
MysqlPassword postfix
MysqlAuthTable users
MysqlAuthPasswordMethod cleartext
MysqlAuthUsernameField email
MysqlAuthPasswordField passwd
MysqlAuthUidField uid
MysqlAuthGidField gid
MysqlAuthAcctStatusField enabled
MysqlSpoolField maildir
Также измените в файле /etc/xinetd.d/pop3 строку:
disable = no
на
disable = yes
и перезапустите xinetd.
На этом этап конфигурирования закончен. Следующее - тестирование.
Тестирование
------------
Перво-наперво нужно проверить возможность получения почты виртуальными
пользователями. Пользователь test@virtual1.domain у нас создан. Нужно
попытаться послать ему какое либо письмо. Самый простой способ (это
нужно делать с машины, на которой и происходит процесс установки):
$cat какой_либо_текстовый_файл |mail test@virtual1.domain
далее смотрим, что появилось в файле /var/log/maillog. Если возникли
какие-либо ошибки - описывается довольно подробно где смотреть. Обычно
это опечатки в конфигурационных файлах. Если не совсем понятно -
попробуйте включить режим логирования в mysql (в этом логе будут
писаться обращения к серверу и его ответы).
Если все работает, то в maillog'е будет запись типа:
May 20 10:05:41 localhost postfix/virtual[9779] DF0B1C79D: to=<test@virtual1.domain>, \
relay=virtual, delay=1, status=sent(mailbox)
После этого посмотрите содержитое каталога
/var/spool/mail/virtual1.domain/ Там должен будет появиться файл test
с содержимым письма.
После того, как все получилось, попробуйте аналогичное для локальных
пользователей (например, postmaster - смотрите куда он алиасится в
файле /etc/postfix/aliases).
С получением почты разобрались. Займемся доступом по pop3. Самый
простой способ это с машины, на которой происходит процесс установки
выполняем:
$telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK ready
user test@virtual1.domain
+OK Password required for test@virtual1.domain.
pass test
+OK test@virtual1.domain has 1 visible message (0 hidden) in 1612 octets.
quit
+OK Pop server at localhost.localdomain signing off.
Connection closed by foreign host.
если что-то не то - смотрите /var/log/maillog и лог запросов к mysql.
Если попали в засаду - пишите на форум (http://www.phantom.atknet.ru/cgi-bin/cgiforum.pl).
Попробуем разобраться (но перед этим еще раз внимательно
проверьте - ничего-ли Вы не забыли сделать и нет ли ошибок в конфигурационных
файлах).
В завершение напоминаю: Создаете виртуальный почтовый домен - не
забудьте создать пользователей этого домена: "root@", "postmaster@" и "abuse@"
Упоминаемые в статье файлы:
* postfix-1.1.10-1.asp.i386.rpm модифицированный
http://www.phantom.atknet.ru/articles/files/postfix/postfix-1.1.10-1.asp.i386.rpm
* postfix-1.1.10-1.asp.src.rpm модифицированный
http://www.phantom.atknet.ru/articles/files/postfix/postfix-1.1.10-1.asp.src.rpm
* qpopper-4.0.5-1.i386.rpm
http://www.phantom.atknet.ru/articles/files/qpopper/qpopper-4.0.5-1.i386.rpm
* qpopper-4.0.5-1.src.rpm
http://www.phantom.atknet.ru/articles/files/qpopper/qpopper-4.0.5-1.src.rpm