Интегриране на Postfixadmin

Едно от нещата, заради които уважавам QMail, е великолепния пакет Qmailadmin. Дава чудесната възможност да управлявате културно и удобно огромен брой виртуални пощенски домейни. А това е направо необходимост за съвременния пощенски сървър – често клиенти искат да управлявате домейна си сами.

Стар поклонник съм обаче на един друг MTA – Postfix. Свикнал съм с него, удобен ми е, и майлсървърът на фирмата е под него. И когато опрях до инструмент, подобен на Qmailadmin, хич не ми се искаше да го сменя. Около месец писах някакво подобие на Qmailadmin – равносметката беше общо 2 часа заделени за този месец: очевидно нямаше да го бъде в срок.

Със свита душа се наложи да се върна към един пакет, който преди ми беше правил неприятно и конфузно впечатление – Postfixadmin. (Всъщност, просто не бях успял да го интегрирам преди – системата ми е каша от Postfix, Courier, Amavis, Spamassassin, ClamAV, Cyrrus SASL, Mailman, Squirrelmail и какво ли не още.) За да открия, че преди 2 месеца е излязла нова версия – 2.2.0 – която ми изглежда много по-симпатична. След един ден юнашко ровене и писане на конфигурационни файлове успях да го интегрирам.

И си мисля, че си струва да споделя опита.

Изходно положение: Debian Etch. Postfix като основен MTA, Courier като допълнителни обслужващи модули, Amavis като скенер за вируси и спам, Spamassassin и ClamAV като модули към него за конкретните проверки. Настроени са според каша от най-различни ръководства; основно е използвано това на Christoph Haas за Sarge, но има и още много мои донастройки. За съжаление, не ги помня всички, а и биха били материал за огромен отделен запис. А хубавото е, че нямат много отношение към темата. 🙂

(Бележка: Кристоф има чудесно ново ръководство за Etch. Много богато е, покрива какви ли не съпътстващи софтуери, включително два PHP скрипта за администриране на базата данни. Набляга на Dovecot вместо на Courier, но аз си се справям по старому… За съжаление, отново нищо за Postfixadmin. Ако ми остане време, може да преведа част от този запис и да му го пратя. Workaround.org е много полезен сайт. 🙂 )

0. Преди всичко

Преди да започнете процедурата, горещо ви съветвам да си направите копия на директориите /etc/courier, /etc/postfix и /etc/amavis. (Всъщност, копие на цялата /etc няма да навреди.) Ако нещата се оплескат, ще можете лесно и удобно да се върнете към старата система, за да си дадете време да премислите какво сте объркали. (Подсетка: При обратното връщане на старите директории си запазете някъде пък новите – огледът им може да ви подскаже къде точно са грешките.)

1. Инсталиране на Postfixadmin

Кодът на 2.2.0 може да бъде свален оттук. Има готов пакет за Дебиан, но аз си го свалих като .tar.gz архив. (По принцип дебианските пакети обикновено са най-добрият начин за инсталиране на нещо под Дебиан, но на този етап още не знаех какво и колко ме очаква, и предпочетох да имам повече контрол. Май обаче не опрях до разликата.)

Сваленият архив се разархивира:

tar -zxvf postfixadmin_2.2.0.tar.gz

Това създава в текущата директория поддиректория postfixadmin_2.2.0. Копирайте я в основната директория на сайта, където ще е администриращият интерфейс, ако не е вече там.

След това направете симлинк към нея с име postfixadmin. (Или, ако сте свалили и инсталирали дебиански пакет – към където е поставил директорията той.)

2. Създаване на базата данни.

Postfixadmin съхранява информацията за виртуалните домейни и адреси в база данни; програмите, които работят с тях, ги четат от нея. Може да използвате вече съществуващи база данни и потребител за нея; аз предпочетох да направя отделна. При мен базата е под MySQL, и проверено работи с всичкия описан софтуер. PostgreSQL също би работил с Postfixadmin и повечето, може би всички други софтуери, но не съм го проверил лично.

Закоравелите хакери вероятно биха направили базата и потребителя от командния ред, но аз предпочетох да използвам универсалния инструмент за MySQL бази данни – phpmyadmin. (PostgreSQL има свой аналог – phppgadmin.) Не е нужно да подбирате за потребителя лесна за помнене парола – спокойно изгенерирайте някаква отвратителна, няма да се налага да я помните. Също, не забравяйте да му дадете пълни права върху базата данни. 🙂

3. Настройване на Postfixadmin

В директорията му има файл на име INSTALL.TXT, в който е описано всичко необходимо. За допълнително улеснение, давам някои от подробностите тук:

Ще намерите файла config.inc.php в директорията на Postfixadmin. Там е мястото за повечето настройки. Отворете го с текстов редактор, и го разгледайте. Имената на настройките са ясни за разбиране, и има чудесни поясняващи коментари. На мен лично се наложи да пипам следното (променете съответните юзери, пароли и имена на сайтове както трябва да са при вас):

$CONF['configured'] = true; # вместо false

$CONF['postfix_admin_url'] = 'http://my.site.name/postfixadmin'; # беше празно

$CONF['database_type'] = 'mysqli'; # беше 'mysql'
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'user'; # името на потребителя за базата данни
$CONF['database_password'] = 'password'; # паролата на този потребител
$CONF['database_name'] = 'dbname'; # името на базата данни

$CONF['admin_email'] = 'postmaster@my.site.name'; # от този адрес ще се пращат е-майлите за създаване на кутиите

# Тези двете определят как ще изглежда системата от директории, където да се държат е-майлите.
# Ще работи всякак: настроих си го да използва съществуващата ми система. :-)
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';

$CONF['vacation'] = 'YES'; # активира модула за автоматичен отговор при отпуска
$CONF['vacation_domain'] = 'autoreply.serdica.org'; # настройка, свързана с този модул

$CONF['fetchmail'] = 'NO'; # не използвам fetchmail, засега

$CONF['user_footer_link'] = "http://my.site.name/index.php"; # линк за цъкане
$CONF['footer_text'] = 'Return to my.site.name'; # оформление на екрана
$CONF['footer_link'] = 'http://my.site.name'; # и линк за него...

(Може и да съм пропуснал нещо – пиша нещата по памет.)

След това отворете в браузер http://my.site.name/postfixadmin/setup.php. Postfixadmin ще създаде в базата данни (ако сте настроили правилно нещата) необходимите таблици, и ще ви предложи да създадете супер-администраторски акаунт. Създайте го (потребителското име трябва да е е-майл адрес!), и сте ОК.

(Забележка: Възможно е диалогът за създаване на супер-администратора да е на (кошмарно омазана) кирилица. Не съм имал време да издирвам и оправям проблема; просто чрез дропдауна за език превключих на английски… а ми се искаше да го оправя, и да го пратя на екипа на postfixadmin.)

Последната стъпка от настройката е да изтриете файла setup.php от директорията на Postfixadmin – без това той няма да тръгне. (Аз просто го прекръстих – mv setup.php setup.php.disabled.)

След това трябва да настроите мъничко и модула за автоматичен отговор при отпуска (Virtual Vacation). Намира се в поддиректорията VIRTUAL_VACATION. Там също има INSTALL.TXT, с чудесни и пълни указания какво да направите. Няма да го преписвам тук, безсмислено е.

Не забравяйте, преди да откопирате съгласно указанията файла vacation.pl, да промените настройките в него! На мен ми се наложи да пипам следното:

my $db_type = 'mysql'; # по подразбиране беше 'Pg', тоест Postgresql

my $db_username = 'user'; # поставете тук вашите потребител, парола и база данни
my $db_password = 'password';
my $db_name = 'dbname';

Е, дотук вече имате настроен Postfixadmin. Можете да въвеждате в него домейни, потребители, администратори и т.н.

Логиката му е следната:

– Опишете домейните, които ще администрирате. Ако ще обслужвате е-майла някойси@нещоси.там, значи трябва да добавите в списъка домейни нещоси.там.
– Опишете администраторите, които ще ги администрират. Супер-администратор е добре да има само един, за поддръжката на сървъра (той е, който може да създава администратори, и да им определя какво могат да пипат). Определете на кой администратор кои домейни може да настройва (става с избиране от списъка домейни, в настройките на администратора). След това можете да кажете на съответните хора съответните им логини и пароли. 🙂
– Създайте пощенските кутии (mailboxes) и пренасочките (aliases) за всеки домейн. (Или по-добре хванете съответните новосъздадени администратори да го направят. 🙂 )

(Бележка: В полето “Goto” на alias можете да въведете няколко е-майл адреса, разделени със запетая и пауза. По този начин можете да си съставяте мини-пощенски списъци. За съжаление, прозорчето на формата за въвеждане в това поле е микроскопично и неудобно – ще си го преправя на TEXTAREA, като ми остане време, и ще предупредя авторите на postfixadmin. 🙂 )

… Дотук добре. Пуснахме и настроихме програмата, въведохме нужните данни. Време е да накараме и другите програми да използват нея.

4. Настройване на Postfix.

Част от настройките на Postfix са направени при конфигурирането на Postfixadmin и Virtual Vacation – добавянето на нов сървис в master.cf и на нов мапинг в transport (а и на самия хеш transport в main.cf – на мен не ми се наложи, беше вече там заради Mailman). Трябва обаче да бъде добавено четене на необходимата информация от новата база данни.

Като начало, в main.cf трябва да бъде вписано следното:

virtual_maps = mysql:/etc/postfix/mysql-virtual_aliases.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailboxes.cf

Ако тези ключови думи вече имат стойности (при мен, естествено, имаха – връзката към старата база данни), старите се махат.

След това е нужно да създадете въпросните три файла, или да промените съдържанието им, ако вече съществуват. (Заменете “user”, “password” и “dbname” с вашите потребител, парола и име на базата данни.):

mysql-virtual_aliases.cf:

user = user
password = password
dbname = dbname
hosts = 127.0.0.1
# don't use 'hosts = localhost' - in some cases doesn't work! use 127.0.0.1 instead.
query = SELECT goto FROM alias WHERE address = '%s' AND active = 1

mysql-virtual_domains.cf:

user = user
password = password
dbname = dbname
hosts = 127.0.0.1
query = SELECT domain FROM domain WHERE domain = '%s'

mysql-virtual_mailboxes.cf:

user = user
password = password
dbname = dbname
hosts = 127.0.0.1
query = SELECT maildir FROM mailbox WHERE username = '%s' AND active = 1

Ако имате инсталиран SASL, в /etc/postfix вероятно ще имате поддиректория sasl, и в нея файл smtpd.conf. Трябва да съдържа следното:

pwcheck_method: auxprop
auxprop_plugin: mysql
mech_list: plain login cram-md5 digest-md5
sql_engine: mysql
sql_hostnames: localhost
sql_user: user
sql_passwd: password
sql_database: dbname
sql_select: select password from mailbox where username = '%u@%r'

След това вече можете да престартирате Postfix. (Аз предпочетох да престартирам postfix, courier-authdaemon и amavis накрая, след като конфигурирах всичко. Така намалявам възможността едното да работи по едни данни, другите – по други.)

5. Настройване на Courier

Единственото променено в цялата работа е откъде се вземат данните за домейни, потребители и пренасочки. Съответно, единственото, което трябва да се пипне, е конфигурацията на модула courier-authdaemon – и по-точно файлът /etc/courier/authmysqlrc (ако сте с MySQL). Наложи ми се да пипна следните стойности:

MYSQL_USERNAME user
MYSQL_PASSWORD password

MYSQL_DATABASE dbname

MYSQL_USER_TABLE mailbox

MYSQL_CRYPT_PWFIELD password

MYSQL_LOGIN_FIELD username

MYSQL_MAILDIR_FIELD maildir

(Предупреждения:
– синтаксисът на файла е МНОГО заядлив! табове са позволени, но не и паузи!
– не може да има дефинирани едновременно MYSQL_CRYPT_PWFIELD и MYSQL_CLEAR_PWFIELD! Ако досега сте били на видима парола, изкоментирайте втората ключова дума (и празнувайте, че сте отстранили огромна дупка в сигурността).)

След тази операция можете да престартирате courier-authdaemon (или да оставите престартирането за накрая).

6. Настройване на Amavis.

Amavis проверява домейните, за които му се праща пощата. Източникът на данни за проверката се настройва в /etc/amavis/conf.d/05-domain_id. Трябва да бъдат зададени (или променени) следните 2 ключови думи:

@lookup_sql_dsn = ( [ 'DBI:mysql:dbname', 'user', 'password' ] );
$sql_select_policy = 'SELECT "Y" as local FROM domain WHERE CONCAT("@",domain) IN (%k)';

След това вече можете да рестартирате Amavis (и другите настройвани програми, ако не сте ги рестартирали).

7. След рестарта

Първото място, което трябва да проверите веднага, е /var/log/syslog. Ако някоя от програмите среща какъвто и да е проблем с конфигурацията си, тя ще се оплаче най-напред там. Проверете, и БЕЗ ПАНИКА коригирайте проблема. (Паниката може да ви докара много повече бели на главата, отколкото някой и друг час без поща – особено ако сте се изхитрили да правите промяната в малко натоварено време на неработен ден.)

Ако там няма никакви видими белези за проблеми, проверете /var/log/mail.log. В зависимост от настройките на системата, някои проблеми може да се покажат (първо) там. Отново без паника отстранявате възможните ядове.

Ако всичко има вид като да работи чудесно, следва да го проверите. Правят се следните проверки:

– изпраща се съобщение от домейн, поддържан от този майлсървър, на друг домейн, поддържан също от него.
– изпраща се съобщение от домейн, поддържан от този майлсървър, на домейн извън него.
– изпраща се съобщение от домейн извън този майлсървър на домейн в него.

Ако някое от съобщенията не се получи, проверявате във /var/log/mail.log какво става. С почти пълна сигурност наличието (или липсата) на информация там ще ви насочи към проблема. Решавате го (помните за паниката, нали?).

След като сте отстранили всички възможни проблеми, идва ред на последната проба. Архивирайте, и след това изтрийте базата данни с домейни и адреси, която е използвана допреди Postfixadmin. Отново престартирайте трите модула, повторете описаните по-горе проверки, и действайте по познатите ви вече указания.

(При мен всичко тръгна от първото пускане. Което, мисля си, е белег не на гениалност или кадърност, а на диагноза. Май Весо Колев е прав, че трябва да се прегледам. 🙂 )

Успех! 🙂

2 Responses to 'Интегриране на Postfixadmin'

  1. Тодор Says:

    Харно си го описал! Все ми иде на акъла и аз да го пробвам тоя постфикс колко е добър с виртуални усери и база данни. 🙂

  2. Григор Says:

    @Тодор: При мен работи без никакви ядове вече 4 години. 🙂

Leave a Reply