от Иво Гелов(26-01-2008)

рейтинг (40)   [ добре ]  [ зле ]

Printer Friendly Вариант за отпечатване

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 - върви като пушка.


<< | >>