Debian – Инсталация на Postfix Admin с поддръжка на PostgreSQL
Целта на тази статия е да опише процедурата по инсталиране и настройка на Postfix Admin (версия 2.1.0) и е предназначена към администраторите на пощенски сървъри, които използват Postfix. Авторът на тази статия не си поставя за задача да сравнява различни пощенски сървъри и да се изказва относно качествата им, а само предлага едно възможно и доказано работещо решение. Документът е написан въз основа на конкретна реализация за нуждите на проектите Линукс за българи и Фото форум, като използваната дистрибуция е Debian GNU/Linux 3.1 Sarge.
Какво е Postfx Admin?
Postfix Admin е уеббазиран интерфейс за управление на домейни и пощенски кутии на потребители, обслужвани от сървър Postfix и съхраняващи се в SQL база от данни. PostfixAdmin е написан на PHP и доскоро поддържаше само MySQL.
Postfix Admin позволява:
- да контролирате потребителите, които се явяват администратори на домейни;
- да добавяте, премахвате и редактирате домейни и пощенски кутии;
- за всеки домейн можете да зададете максимум брой кутии, псевдоними, подразбираща се квота;
- обикновените потребители могат да си сменят паролите и да пренасочват писмата си където пожелаят.
Официалната последна версия на Postfix Admin е 2.1.0. В тази версия е осигурена поддръжка на MySQL 4.1. Въпреки анонсираната поддръжка на PGSQL все още са налице някои проблеми, които са отстранени чрез поправка на Troels Arvin.
Предполагам, че поправката ще влезе в следващата официална версия, но дотогава можете да изтеглите готов пакет с приложената поправка оттук.
Необходим софтуер
- Postfix (минимум версия 2.0)
- PostfixAdmin
- Courier IMAP/POP
- PostgreSQL – съхранява данните на виртуалните потребители и домейни
- Разбира се – работещ уебсървър с поддръжка на PHP и PostgreSQL, инсталацията на които не е предмет на тази статия!
Потребителите на Debian (testing/unstable) могат да изпълнят следната команда:
Инсталация на необходимите пакети в Debian |
root@hostname:/root# apt-get install postfix postfix-pgsql \
postgresql postgresql-contrib \
courier-pop courier-imap courier-authpostgresql
|
Настройка на допълнителния софтуер
Настройка на PostgreSQL
1. Създаване на потребител posftix
Създаване на потребител в PGSQL |
root@hostname:/root# su postgres postgres@hostname:/root$ creatuser postfix -P Enter password for new user: Enter it again: Shall the new user be allowed to create databases? (y/n) n Shall the new user be allowed to create more new users? (y/n) n CREATE USER |
След като сме създали потребител с парола, трябва да настроим контрола на достъпа за този потребител от файла /etc/postfix/pg_hba.conf, като добавим следното нещо:
/etc/postgresql/pg_hba.conf |
# TYPE DATABASE IP_ADDRESS MASK AUTH_TYPE AUTH_ARGUMENT
local postfix postfix password
...
host postfix postfix 127.0.0.1 255.255.255.255 password
|
Горната директива се поставя преди реда “local all all ident sameuser” и означава, че потребителят postfix ще има локален достъп (чрез Unix socket или чрез TCP на адрес 127.0.0.1) само до базата данни postfix след удостоверяване пред сървъра с парола. Презареждаме сървъра:
Презареждане на PGSQL |
root@hostname:/root# /etc/init.d/postgresql reload
|
2. Създаване на база данни за потребителя postfix
Създаване на база данни |
postgres@hostname:/root$ createdb --owner=postfix postfix CREATE DATABASE |
3. Създаване на схема за базата данни
Можете да използвате следния SQL скрипт:
postfix.sql |
CREATE TABLE admin ( username character varying(255) DEFAULT ''::character varying NOT NULL, "password" character varying(255) DEFAULT ''::character varying NOT NULL, created timestamp with time zone DEFAULT now(), modified timestamp with time zone DEFAULT now(), active boolean DEFAULT false NOT NULL ); CREATE TABLE alias ( address character varying(255) DEFAULT ''::character varying NOT NULL, goto text NOT NULL, "domain" character varying(255) DEFAULT ''::character varying NOT NULL, created timestamp with time zone DEFAULT now(), modified timestamp with time zone DEFAULT now(), active boolean DEFAULT true NOT NULL ); CREATE TABLE "domain" ( "domain" character varying(255) DEFAULT ''::character varying NOT NULL, description character varying(255) DEFAULT ''::character varying NOT NULL, aliases integer DEFAULT 0 NOT NULL, mailboxes integer DEFAULT 0 NOT NULL, maxquota integer DEFAULT 0 NOT NULL, transport character varying(255), backupmx boolean DEFAULT false NOT NULL, created timestamp with time zone DEFAULT now(), modified timestamp with time zone DEFAULT now(), active boolean DEFAULT true NOT NULL ); CREATE TABLE domain_admins ( username character varying(255) DEFAULT ''::character varying NOT NULL, "domain" character varying(255) DEFAULT ''::character varying NOT NULL, created timestamp with time zone DEFAULT now(), active boolean DEFAULT true NOT NULL ); CREATE TABLE log ( "timestamp" timestamp with time zone DEFAULT now(), username character varying(255) DEFAULT ''::character varying NOT NULL, "domain" character varying(255) DEFAULT ''::character varying NOT NULL, "action" character varying(255) DEFAULT ''::character varying NOT NULL, data character varying(255) DEFAULT ''::character varying NOT NULL ); CREATE TABLE mailbox ( username character varying(255) DEFAULT ''::character varying NOT NULL, "password" character varying(255) DEFAULT ''::character varying NOT NULL, name character varying(255) DEFAULT ''::character varying NOT NULL, maildir character varying(255) DEFAULT ''::character varying NOT NULL, quota integer DEFAULT 0 NOT NULL, "domain" character varying(255) DEFAULT ''::character varying NOT NULL, created timestamp with time zone DEFAULT now(), modified timestamp with time zone DEFAULT now(), active boolean DEFAULT true NOT NULL ); CREATE TABLE vacation ( email character varying(255) DEFAULT ''::character varying NOT NULL, subject character varying(255) DEFAULT ''::character varying NOT NULL, body text NOT NULL, "cache" text NOT NULL, "domain" character varying(255) DEFAULT ''::character varying NOT NULL, created timestamp with time zone DEFAULT now(), active boolean DEFAULT true NOT NULL ); |
След като сме записали тези команди примерно във файл postfix.sql, остава само да изпълним:
Изпълняване на скрипта в базата данни |
postgres@hostname:/root$ psql -U postfix -f postfix.sql postfix Password: |
С това може да се каже, че сме приключили настройката на тази част от решението, която засяга PostgreSQL.
Настройка на Courier
От цялата система от сървъри, която ни предлага Courier, ние ползваме само демона за автентикация в SQL базата, POP и IMAP сървърите. Следователно първо трябва да посочим кой демон за автентикация ще използваме, тъй като за всеки метод на автентикация (pam, unix, mysql и т.н.) има отделен демон. В случа ние използваме “authpgsql”. Трябва да посочим това във файла /etc/courirer/authdaemonrc:
/etc/courirer/authdaemonrc |
##NAME: authmodulelist:0
authmodulelist="authpgsql"
|
Сега трябва да настроим файла /etc/courier/authpgsql, където трябва да посочим информация за достъпа до базата данни и други неща, засягащи местоположението на писмата на потребителите.
/etc/courier/authpgsql |
#Адрес на сървъра за бази данни PGSQL_HOST localhost PGSQL_PORT 5432 #Потребител, парола, име на базата PGSQL_USERNAME postfix PGSQL_PASSWORD [парола] PGSQL_DATABASE postfix PGSQL_USER_TABLE mailbox PGSQL_CRYPT_PWFIELD password #UID и GID на непривилегирован Unix потребител PGSQL_UID_FIELD '108' PGSQL_GID_FIELD '8' PGSQL_LOGIN_FIELD username PGSQL_HOME_FIELD '/var/mail' PGSQL_NAME_FIELD name PGSQL_MAILDIR_FIELD maildir PGSQL_QUOTA_FIELD quota |
Относно редовете PGSQL_UID_FIELD и PGSQL_GID_FIELD следва да се има предвид, че стойностите зависят от Вашия собствен избор. Просто създайте един непривилегирован потребител без shell. При мен той е наречен vmail. Настройките на този потребител в /etc/passwd изглеждат примерно така:
/etc/passwd |
vmail:x:108:65534:vmail:/home/nogroup/vmail:/bin/false |
В случая съм направил този потребител член на групата mail (GID 108), а правата на директорията /var/mail изглеждат така:
Права на директорията /var/mail |
drwxrwsr-x 32 root mail |
Поддиректориите с писмата на потребителите се създават автоматично с права, които изглеждат така:
Права на поддиректориите във /var/mail |
drwx--S--- 5 vmail mail |
Трябва да защитим файла /etc/courier/authpgsql от погледа на света:
Права за файла /etc/courier/authpgsql |
root@hostname:/root# chown daemon.daemon /etc/courier/authpgsql root@hostname:/root# chmod 640 /etc/courier/authpgsql |
Остава да презаредим демона:
Презареждане на courier-authdaemon |
root@hostname:/root# /etc/init.d/courier-authdaemon reload Stopping Courier authdaemon: done. Starting Courier authdaemon: done. |
Настройка на Postfix
Postfix се обръща към базата данни с настройките на потребителите, като чете в познатите на всички администратори на Postfix map-файлове. Трябва да създадем отделен map-файл за всяка таблица в базата данни. Ето какви файлове трябва да създадем в директорията /etc/postfix и какво трябва да съдържат те:
/etc/postfix/pgsql_virtual_mailbox_maps.cf |
user = postfix password = [парола] hosts = localhost dbname = postfix table = mailbox select_field = maildir where_field = username additional_conditions = and active = true |
/etc/postfix/pgsql_virtual_alias_maps.cf |
user = postfix
password = [парола]
hosts = localhost
dbname = postfix
table = alias
select_field = goto
where_field = address
|
/etc/postfix/pgsql_virtual_domains_maps.cf |
user = postfix password = [парола] hosts = localhost dbname = postfix table = domain select_field = description where_field = domain additional_conditions = and backupmx = 'false' and active = 'true' |
/etc/postfix/pgsql_virtual_mailbox_size.cf |
user = postfix password = [парола] hosts = localhost dbname = postfix table = mailbox select_field = quota where_field = username additional_conditions = and active = true |
/etc/postfix/pgsql_transport_maps.cf |
user=postfix password=[парола] dbname=postfix table=domain select_field=transport where_field=domain hosts=localhost |
/etc/postfix/pgsql_relay_maps.cf |
user=postfix password=[парола] dbname=postfix table=domain select_field=domain where_field=domain hosts=localhost additional_conditions = and backupmx = 'true' and active = 'true' |
Задължително защитаваме файловете от погледа на света:
Защитаване на файловете |
root@hostname# chown root.postfix /etc/postfix/pgsql_*.cf root@hostname# chmod 640 /etc/postfix/pgsql_*.cf |
Сега вече трябва да кажем на Postfix да взима предвид тези файлове, което става от главния му конфигурационен файл /etc/postfix/main.cf:
/etc/postfix/main.cf |
relay_domains = proxy:pgsql:/etc/postfix/pgsql_relay_maps.cf transport_maps=pgsql:/etc/postfix/pgsql_transport_maps.cf virtual_minimum_uid = 100 virtual_uid_maps = static:108 virtual_gid_maps = static:8 virtual_mailbox_domains = pgsql:/etc/postfix/pgsql_virtual_domains_maps.cf virtual_mailbox_maps = pgsql:/etc/postfix/pgsql_virtual_mailbox_maps.cf virtual_alias_maps = pgsql:/etc/postfix/pgsql_virtual_alias_maps.cf virtual_transport = virtual virtual_create_maildirsize = yes virtual_mailbox_extended = yes virtual_mailbox_limit_maps = pgsql:/etc/postfix/pgsql_mailbox_size.cf virtual_mailbox_limit_override = yes virtual_overquota_bounce = yes |
Следва презареждане на сървъра:
Презареждане на Postfix |
root@hostname:/root# /etc/init.d/postfix reload Reloading Postfix configuration...done. |
Инсталация на Postfix Admin
Всъщност, стигнахме до най-лесната част. Харесваме си място, където ще разположим скриптовете, като предвиждаме това място да е все пак директория, видима чрез нашия уебсървър. Добра идея е да си дефинираме отделен виртуален хост, описанието на което обаче не е цел на тази статия. Тук условно приемаме, че използваме директория по подразбиране, а именно /var/www:
Инсталация на PostfixAdmin |
root@hostname:/root# cd /var/www root@hostname:/var/www# wget \ http://d.linux-bg.org/download/apps/Postfixadmin/postfixadmin-2.1.0.tar.gz ... root@hostname:/var/www# tar xvfz postfixadmin-2.1.0.tar.gz postfixadmin-2.1.0/ postfixadmin-2.1.0/ADDITIONS/ postfixadmin-2.1.0/ADDITIONS/cleanupdirs.pl postfixadmin-2.1.0/ADDITIONS/mailbox_remover.pl postfixadmin-2.1.0/ADDITIONS/mkeveryone.pl ... |
На посочения адрес има и разписан с GPG пакет на Postfix Admin с приложената “кръпка”. Пакетът е разписан с моя публичен PGP ключ, който можете да откриете наhttp://wwwkeys.pgp.net или да изтеглите от личния ми FTP сървър.
Сега остава да редактираме конфигурационния файл config.inc.php, където трябва да посочим данните за достъп до базата в PostgreSQL и да зададем някои добре описани и ясни за всеки грамотен администратор потребителски настройки като:
- URL на системата;
- адреси по подразбиране на hostmaster, postmaster и т.н.;
- искаме ли интерфейсът да ни предлага управление на пощенските псевдоними (aliases);
- квоти за потребителите и т.н.
Изборът на тези настройки вече зависи изцяло от Вашите нужди.
Внимание! Поддиректорията admin/ се защитава чрез файл .htpasswd и .htaccess. Необходимо е да редактираме файла admin/.htaccess, като вземем предвид директорията, в която сме инсталирали PostfixAdmin. Ако тя е /var/www/postfixadmin-2.1.0, то съдържанието на файла следва да изглежда така:
admin/.htaccess |
AuthUserFile /var/www/postfixadmin-2.1.0/admin/.htpasswd AuthGroupFile /dev/null AuthName "Postfix Admin" AuthType Basic <limit GET POST> require valid-user </limit> |
Следва да настроим суперадминистратор (той ще делегира права на отделните администратори на домейните) чрез командата htpasswd:
admin/.htpasswd |
root@hostname:/root# htpasswd -c \ /var/www/postfixadmin-2.1.0/admin/.htpasswd admin New password: Re-type new password: Adding password for user admin |
Задължително трябва да защитим този файл, като разрешим само на потребителя, с чиито права работи уебсървърът. В Debian това е www-data:
Защитаване на файла .htpasswd |
root@hostname:/root# chown root.www-data \ /var/www/postfixadmin-2.1.0/admin/.htpasswd root@hostname:/root# chmod 640 \ /var/www/postfixadmin-2.1.0/admin/.htpasswd |
Това е! Сега остава да влезем в администраторски режим, като заредим в уеббраузера си адреса:
http://domain.tld/postfixadmin-2.1.0/admin
Разбира се, излишно е да подчертавам, че е най-добре да пренесем комуникацията със сървъра върху SSL, постигането на което също не е цел на тази статия.