Инсталация на 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
postgresql postgresql-contrib \
courier-pop courier-imap courier-authpostgresql |
Настройка на допълнителния софтуер
Настройка на PostgreSQL
1. Създаване на потребител posftix
Създаване на потребител в PGSQL |
root@hostname:/root
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 |
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 |
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 |
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
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
root@hostname:/root |
Остава да презаредим демона:
Презареждане на courier-authdaemon |
root@hostname:/root
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
root@hostname |
Сега вече трябва да кажем на 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
Reloading Postfix configuration...done. |
Инсталация на Postfix Admin
Всъщност, стигнахме до най-лесната част. Харесваме си място, където ще разположим скриптовете, като предвиждаме това място да е все пак директория, видима чрез нашия уебсървър. Добра идея е да си дефинираме отделен виртуален хост, описанието на което обаче не е цел на тази статия. Тук условно приемаме, че използваме директория по подразбиране, а именно /var/www:
Инсталация на PostfixAdmin |
root@hostname:/root
root@hostname:/var/www
http://d.linux-bg.org/download/apps/Postfixadmin/postfixadmin-2.1.0.tar.gz
...
root@hostname:/var/www
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
/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
/var/www/postfixadmin-2.1.0/admin/.htpasswd
root@hostname:/root
/var/www/postfixadmin-2.1.0/admin/.htpasswd |
Това е! Сега остава да влезем в администраторски режим, като заредим в уеббраузера си адреса:
http://domain.tld/postfixadmin-2.1.0/admin
Разбира се, излишно е да подчертавам, че е най-добре да пренесем комуникацията със сървъра върху SSL, постигането на което също не е цел на тази статия.