LINUX-BG   Адрес : http://www.linux-bg.org
Dovecot като LDA плюс ManageSieve и SASL
От: Иво Гелов
Публикувана на: 26-01-2008
Адрес на статията: http://www.linux-bg.org/cgi-bin/y/index.pl?page=article&id=programs&key=400458676
Dovecot е мъничък и сравнително лесен за конфигуриране POP3 и IMAP сървър, вероятно мнозина от вас го използват и са
доволни от него. Колегите постепенно се отказват от POP3 клиентите си (обиквено Outlook Express или Mozilla ThunderBird)
и използват WEB-интерфейса SquirrelMail като IMAP клиент. Възникна нуждата от прилагане на правила към писмата - например
писмата от различни клиенти да отиват в разлини подпапки на INBOX. SquirrelMail има плъгини за такива правила, главно
като мярка срещу SPAM. Тяхното използване обаче води до забавяне, поради няколко причини:

1. Тези филтри се изпълняват от страна на IMAP клиента (в случая SquirrelMail) в момента, когато потребителя реши да
разгледа INBOX. Ако в него има голям брой писма - може да се получи timeout

2. Тъй като SquirrelMail е написан на PHP, скоростта на работа на филтрите е по-ниска, отколкото компилирана програма

3. Филтрите не могат да реагират на писмата в реално време - те се изпълняват при логване на потребителя в SquirrelMail,
а не в момента на пристигане на писмата

Това би могло да се реши от LDA (Local Delivery Agent) - програмата, която се извиква от пощенския сървър (в случая това е
Postfix). Например maildrop, или procmail. При мен ролята на LDA се изпълнява от самия Postfix, и тъй като нямам опит нито
с maildrop, нито с procmail, пък и ми се сториха малко сложнички и неудобни (говоря за мен самия) - реших да се опитам да
настроя Dovecot като LDA, и да използвам един от неговите плъгини като ManageSieve сървър. Това е сървър, който приема
Sieve скриптове по TCP/IP и ги изпълнява при нужда. Повече информация може да намерите тук (http://sieve.info/overview)
MANAGESIEVE е стандартен протокол (както SMTP, FTP и т.н.) Sieve скриптовете са обикновено текстови файлове с лесни
команди, предоставят малко повече от минимална функционалност, но не предоставят "опасни" команди, които биха могли да
повредят системата (например Buffer-Overflow) от неподготвени или злонамерени потребители. ManageSieve сървърите обикновено
компилират тези текстови файлове в собствен формат, за да се изпълняват по-бързо. Ето един пример за Sieve скрипт:

require ["fileinto","envelope","comparator-i;ascii-numeric","regex"];
if
address :is "From" "some_address@my_domain.com"
{
fileinto "Junk";
}

Сигурно вече сте се досетили, че този филтър премества писмата от "some_address@my_domain.com" в папка Junk :-)
Сега да пристъпим към инсталирането и конфигурирането. Трябва да направим 2 неща:

I. Да добавим ManageSieve сървър
II. Да добавим плъгин за връзка с този сървър
III. Да конфигурираме Dovecot като LDA и да укажем, че трябва да използва този плъгин

И вече по-подробно.

I.1. Сваляме пач за съответната версия на Dovecot (аз използвам 1.0.10) от тук (http://sinas.rename-it.nl/~sirius/)

I.2. Записваме diff файла в същата папка, в която се намира configure скрипта на Dovecot
Например, аз държа в "/usr/local/sources" разархивираните изходни кодове на всички програми, които съм инсталирал.
Съответно Dovecot се намира в "/usr/local/sources/dovecot-1.0.10", и в тази папка записвам файла
dovecot-1.0.10-MANAGESIEVE-v9.1.diff.gz (независимо от разширението, това е обикновен текстов файл)

I.3. Осъществяваме пача по обичайния начин

patch -p1 < ./dovecot-1.0.10-MANAGESIEVE-v9.1.diff.gz

I.4. Преди да пристъпим към ./configure, make и make install - трябва да обновим automake/autoconf конфигурацията,
за да се добавят файловете за ManageSieve в процеса на компилацията. Това става с поредицата команди

aclocal
autoreconf -i
automake

При мен обаче изгърмя с разни съобщения за липсващи M4 макроси. Ще ви спестя обясненията и ще пристъпя направо
към решението. При вас може да е по-различно (аз съм с Fedora 4), при мен беше достатъчно да се снабдя с файловете
iconv.m4 и aclocal.m4, да добавя текста на aclocal.m4 в началото на iconv.m4 и да запиша iconv.m4 в папка
"/usr/share/aclocal" Файлът iconv.m4 го взех от Midnight Commander - от папка m4, а пък aclocal.m4 успях да открия
на този адрес (http://dev.splitbrain.org/download/darc...)
След това горните 3 команди се изпълниха без нито една грешка.

I.5. Продължаваме по обичайния начин

./configure
make
sudo make install  

II.1. Сваляме Sieve plugin от сайта на Dovecot (http://www.dovecot.org/download.html) за съответната версия (в моя
случай това е версия 1.0.2)

II.2. Разархивираме съдържанието на архива в папка на същото ниво, на което е папката с изходния код на Dovecot.
В моя случай това е "/usr/local/sources/dovecot-sieve-1.0.2"

II.3. Намирайки се в папката на плъгина, изпълняваме командите

./configure --with-dovecot=../dovecot-1.0.10
make
sudo make install

По този начин освен плъгина (cmusieve) инсталираме sievec и sieved - съответно компилатор и декомпилатор за Sieve
скриптове.

III.1. Указваме на Dovecot да използва cmusieve плъгина - в /etc/dovecot.conf записваме следното

protocol lda {
 # Address to use when sending rejection mails.
 postmaster_address = postmaster@domain.com

 mail_plugins = cmusieve
 mail_plugin_dir = /usr/local/dovecot/lib/dovecot/lda

 # UNIX socket path to master authentication server to find users.
 auth_socket_path = /var/run/dovecot/auth-master

 # remember to give proper permissions for these files as well
 log_path = /var/log/dovecot-deliver.log
 info_log_path = /var/log/dovecot-deliver.log

 # If there is no user-specific Sieve-script, global Sieve script is
 # executed if set. (v1.0.1 and older used "global_script_path")
 #sieve_global_path =
}

Тук също така съм указал, че Deliver (който всъщност изпълнява ролята на LDA) трябва да използва собствен лог-файл,
вместо основния лог-файл на Dovecot. Имайте впредвид, че Deliver ще се изпълнява като непривилегирован потребител
(извикван от Postfix) и затова е добре предварително да създадете лог-файловете с touch и да им прикачите правилни
потребител и група. Освен това с командата "auth_socket_path" указвам UNIX сокет, който да се използва
от LDA за получаване на mail-папката на съответния потребител, където трябва да се записват получените писма.
Да не забравяме - трябва да пуснем и ManageSieve сървъра. Това става чрез добавяне на параметър "managesieve" в списъка с
протоколи:

protocols = imap pop3 managesieve

III.2. Указваме на ManageSieve сървъра къде да съхранява Sieve скриптовете

protocol managesieve {
 listen = localhost:2000

 # Specifies the location of the symlink pointing to the active script in
 # the sieve storage directory. This must match the SIEVE setting used by
 # deliver (refer to http://wiki.dovecot.org/LDA/Sieve#locat... for more
 # info). Variable substitution with % is recognized.
 #sieve = ~/.dovecot.sieve
 sieve = /var/mail/sieve/%d/%n/dovecot.sieve

 # This specifies the path to the directory where the uploaded scripts must
 # be stored. In terms of '%' variable substitution it is identical to
 # dovecot's mail_location setting used by the mail protocol daemons.
 sieve_storage = /var/mail/sieve/%d/%n
}

Папка "/var/mail/sieve/" трябва да бъде създадена от името на потребителя и групата, с които ще работи LDA (deliver).
Това е необходимо, тъй като Dovecot работи като ROOT-потребител и може да записва в тази папка без проблем - обаче Deliver
се извиква от Postfix като непривилегирован потребител, и трябва да може да записва файлове и да създава подпапки.
Файлове се създават при компилацията на Sieve скриптове, а папки се създават динамично (ако дотогава не са съществували)
за домейна и потребителското име от емайл адреса. При мен цялата "/var/mail" е прикачена към mail:mail. По-надолу ще
опиша как точно се настройва Postfix, за да използва Dovecot като LDA, а също и за SASL оторизация при изпращане на писма.

III.3. Указваме на cmusieve и на LDA къде да търсят Sieve скриптовете. Ако искаме глобален скрипт, който да се изпълнява
когато даден потребител няма собствен Sieve скрипт, тогава по-горе задаваме пътя до файла с този скрипт в "sieve_global_path".
За личните скриптове на потребителите имаме 2 варианта - да укажем общ щаблон в /etc/dovecot.conf, или в противен случай
ще се търси файл .dovecot.sieve в mail-папката на всеки потребител. Аз използвам шаблон:

plugin {
 sieve = /var/mail/sieve/%d/%n/dovecot.sieve
}

Забележете, че този файл трябва да е същия, който указахме по-горе за ManageSieve сървъра - иначе просто нищо няма да стане.
%d означава да се вземе всичко след '@' от емайл адреса, а пък %n - всичко преди '@'.

III.4. Настройка на Postfix, за да използва Dovecot като LDA
Във файла "/etc/postfix/main.cf" добавяме следните редове

virtual_transport = dovecot
dovecot_destination_recipient_limit = 1

От файла могат да отпаднат няколко команди, които се използват от Postfix LDA. С тях се указва идентификатора на потребителя
и групата, на когото принадлежи папката, където ще се записват писмата. При мен това е postfix:postdrop (501:504)

virtual_minimum_uid = 501
virtual_uid_maps = static:501
virtual_gid_maps = static:504

Във файла "/etc/postfix/master.cf" добавяме следните команди (това са 2 отделни реда, втория започва поне от 2-ра колона)

dovecot   unix  -       n       n       -       -       pipe
 flags=DRhu user=mail:mail argv=/usr/local/dovecot/libexec/dovecot/deliver -c /etc/dovecot.conf -d ${recipient}

В конфигурацията на Dovecot (/etc/dovecot.conf) разрешаваме достъпа до модула за оторизация от външни програми (тоест
позволяваме на Deliver да разбира дали съществува такъв потребител, и коя е неговата папка за получаване на писма)

auth default {
 # Space separated list of wanted authentication mechanisms:
 #   plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi
 # NOTE: See also disable_plaintext_auth setting.
 mechanisms = plain digest-md5

 # SQL database <doc/wiki/AuthDatabase.SQL.txt>
 passdb sql {
   args = /etc/dovecot-sql.conf
 }

 # User database specifies where mails are located and what user/group IDs
 # own them. For single-UID configuration use "static".
 # <doc/wiki/UserDatabase.txt>

 # UID = mail, GID = mail
 userdb static {
   args = uid=8 gid=12 home=/var/mail/vhosts/%d/%n allow_all_users=yes
 }

 user = mail

 # It's possible to export the authentication interface to other programs:
 socket listen {
   master {
     # Master socket provides access to userdb information. It's typically
     # used to give Dovecot's local delivery agent access to userdb so it
     # can find mailbox locations.
     path = /var/run/dovecot/auth-master
     mode = 0775
     # Default user/group is the one who started dovecot-auth (root)
     user = mail
     group = mail
   }
}
}

III.5. Настройка на Postfix да използва Dovecot за SASL оторизация
Това означава, че потребителите, които имат пощенска кутия на сървъра, могат да изпращат писма през него със своите име и парола.
Във файла "/etc/postfix/master.cf" добавяме командите

smtpd_sasl_type = dovecot
smtpd_sasl_path = /var/run/dovecot/auth-client

В "smtpd_sasl_path" указваме UNIX-сокет, който сме указали в подсекция "master" на секция "socket listen" в раздел "auth default"
в конфигурационния файл "/etc/dovecot.conf".

Сега остава да кажа няколко думи за AVELSIEVE - това е плъгин за SquirrelMail, с негова помощ се създават Sieve скриптове. Можете
да си го изтеглите от сайта на SquirrelMail. Плъгина на места куца малко със съобщенията за грешки - не са достатъчно
информативни, и понякога заблуждават. Но ако имате добре настроен Dovecot - върви като пушка.

<< | >>

Авторите на сайта, както и техните сътрудници запазват авторските права върху собствените си материали публикувани тук, но те са copyleft т.е. могат свободно да бъдат копирани и разпространявани с изискването изрично да се упоменава името на автора, както и да се публикува на видно място, че те са взети от оригиналния им URL-адрес на този сървър (http://www.linux-bg.org). Авторските права на преводните материали принадлежат на техните автори. Ако с публикуването тук на някакъв материал неволно са нарушени нечии права - след констатирането на този факт материалът ще бъде свален.

All trademarks, logos and copyrights mentioned on this site are the property of their respective owners.
Linux is copyright by Linus Torvalds.
© Линукс за българи ЕООД 2007
© Slavei Karadjov 1999 - 2006

All rights reserved.

Изпълнението отне: 1 wallclock secs ( 0.15 usr + 0.03 sys = 0.18 CPU)