Инсталация на Postfix Admin с поддръжка на PostgreSQL

Целта на тази статия е да опише процедурата по инсталиране и настройка на Postfix Admin (версия 2.1.0) и е предназначена към администраторите на пощенски сървъри, които използват Postfix. Авторът на тази статия не си поставя за задача да сравнява различни пощенски сървъри и да се изказва относно качествата им, а само предлага едно възможно и доказано работещо решение. 

Какво е 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, постигането на което също не е цел на тази статия.

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *

Този сайт използва Akismet за намаляване на спама. Научете как се обработват данните ви за коментари.