The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Postfix и база пользователей в MySQL (postfix mail mysql auth)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: 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

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

 Добавить комментарий
Имя:
E-Mail:
Заголовок:
Текст:




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2020 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру