Добрый день, всем!Система FreeBSD 7.2.
Весь софт установлен из портов.Sendmail - MTA. Procmail - LDA. Dovecot - pop3/imap server.
Почту переконвертировал в maildir формат и, соответственно, складывается она по одному письмишку в каталог cur пользователя.
Проблема в том, что новые письма туда кладутся с владельцем рута и правами 700, т.е. почту читать можно исключительно руту.
В логе dovecot я, соответственно, получаю:
Код:
Error: open(/usr/home/spam/.maildir/cur/1289147747.8685_0.my.server.ru:2,) failed: Permission denied (euid=1017(spam) egid=1001(mailusers) missing +r perm: /usr/home/spam/.maildir/cur/1289147747.8685_0.my.server.ru
Sendmail запущен от рута, соответственно procmail вызывается тоже от рута - в этом проблема?Можно ли решить трабл правкой конфига dovecot'a?
конфиг dovecot:
-------------------
ase_dir = /var/run/dovecot/
protocols = imap pop3
disable_plaintext_auth = no
shutdown_clients = yes
log_path = /var/log/dovecot/dovecot-error.log
info_log_path = /var/log/dovecot/dovecot-info.log
log_timestamp = "%b %d %H:%M:%S "
#syslog_facility = mail#----------SSL---------------
#ssl_listen=
ssl = no
#ssl_cert_file = /etc/ssl/certs/dovecot.pem
#ssl_key_file = /etc/ssl/private/dovecot.pem
#ssl_key_password =
#ssl_ca_file =
#ssl_verify_client_cert = no
#ssl_cert_username_field = commonName
#ssl_parameters_regenerate = 168
#ssl_cipher_list = ALL:!LOW:!SSLv2
#verbose_ssl = no
#----------SSL---------------login_dir = /var/run/dovecot/login
login_chroot = yes
login_user = dovecot
#login_process_size = 64
login_process_per_connection = yes
#login_processes_count = 3
login_max_processes_count = 30
#only, if login_process_per_connection = yes
#login_max_connections = 256
login_greeting = Faeton's IMAP4/POP3 server ready!
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c
login_log_format = %$: %s
mail_location = maildir:%h/%u/email/#mail_uid =
#mail_gid =
mail_privileged_group = mail
mail_full_filesystem_access = no
mail_debug = yes
#mail_log_prefix = "%Us(%u): "
#this feature si ignored, when mail_debug=yes
#mail_log_max_lines_per_sec = 10#--------Don't use these settings----------
#mmap_disable = no
#fsync_disable = no
#--------Don't use these settings----------dotlock_use_excl = yes
#lock_method = fcntl
#mail_drop_priv_before_exec = no
verbose_proctitle = yes
first_valid_uid = 1000
#last_valid_uid = 0
first_valid_gid = 1000
#last_valid_gid = 0
max_mail_processes = 100
#mail_process_size = 256
#mail_max_keyword_length = 50
#valid_chroot_dirs =
#mail_chroot =#--------------Maildir specific settings--------------
#maildir_stat_dirs = no
maildir_copy_with_hardlinks = yes
#maildir_copy_preserve_filename = no
#maildir_very_dirty_syncs = no
#--------------Maildir specific settings--------------protocol imap {
#login_executable = /usr/local/libexec/dovecot/imap-login
#mail_executable = /usr/local/libexec/dovecot/imap
#imap_max_line_length = 65536
#mail_max_userip_connections = 10
#mail_plugins =
#mail_plugin_dir = /usr/local/lib/dovecot/imap
#imap_logout_format = bytes=%i/%o
#imap_capability =
#imap_idle_notify_interval = 120
#imap_id_send =
#imap_id_log =
imap_client_workarounds = delay-newmail netscape-eoh tb-extra-mailbox-sep
listen = *:143
}
protocol pop3 {
#login_executable = /usr/local/libexec/dovecot/pop3-login
#mail_executable = /usr/local/libexec/dovecot/pop3
#pop3_no_flag_updates = no
#pop3_enable_last = no
#pop3_reuse_xuidl = no
#pop3_lock_session = no
pop3_uidl_format = XuXv
#pop3_save_uidl = no
#pop3_logout_format = top=%t/%p, retr=%r/%b, del=%d/%m, size=%s
#mail_max_userip_connections = 3
#mail_plugins =
#mail_plugin_dir = /usr/local/lib/dovecot/pop3
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
listen = *:110
}
#auth_executable = /usr/local/libexec/dovecot/dovecot-auth
#auth_process_size = 256
#auth_cache_size = 0
#auth_cache_ttl = 3600
#auth_cache_negative_ttl = 3600
#auth_realms =
#auth_default_realm =
#auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@
#auth_username_translation =
auth_username_format = %Lu
#auth_master_user_separator =
#auth_anonymous_username = anonymous
#auth_verbose = no
auth_debug = yes
#auth_debug_passwords = no
#auth_worker_max_count = 30
#auth_gssapi_hostname =
#auth_krb5_keytab =
#auth_use_winbind = no
#auth_winbind_helper_path = /usr/local/bin/ntlm_auth
#auth_failure_delay = 2
auth default {
mechanisms = plain login
#passdb passwd-file {
#args = /usr/local/etc/dovecot.deny
#deny = yes
#}
#passdb pam {
#args = dovecot
#args = session=yes dovecot
#}
#passdb passwd {
#args =
#}
#passdb shadow {
#args =
#}
#passdb bsdauth {
#args =
#}
#passdb passwd-file {
#args =
#}
#passdb checkpassword {
#args =
#}
#passdb sql {
#args = /usr/local/etc/dovecot-sql.conf
#}
#passdb ldap {
#args = /usr/local/etc/dovecot-ldap.conf
#}
#passdb vpopmail {
#args =
#}
#userdb prefetch {
#}
userdb passwd {
#args =
}
#userdb passwd-file {
#args =
#}
#userdb checkpassword {
#args =
#}
#userdb static {
#args =
#}
#userdb sql {
#args = /usr/local/etc/dovecot-sql.conf
#}
#userdb ldap {
#args = /usr/local/etc/dovecot-ldap.conf
#}
#userdb vpopmail {
#}
#Only shadow and pam authentication requires roots!
#user = root
#chroot =
#count = 1
#ssl_require_client_cert = no
#ssl_username_from_cert = no
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
#user =
#group =
}
client {
path = /var/run/dovecot/auth-client
mode = 0660
}
}
}
#auth external {
# socket connect {
# master {
# path = /var/run/dovecot/auth-master
# }
# }
#}
#dict {
#quota = mysql:/usr/local/etc/dovecot-dict-quota.conf
#expire = db:/var/db/dovecot/expire.db
#}
#dict_db_config = /usr/local/etc/dovecot-db.conf
#plugin {
#quota = maildir
#acl = vfile:/usr/local/etc/dovecot-acls:cache_secs=300
#acl_shared_dict = file:/var/lib/dovecot/shared-mailboxes
#convert_mail = mbox:%h/mail
#convert_skip_broken_mailboxes = no
#convert_skip_dotdirs = no
#convert_alt_hierarchy_char = _
#trash = /usr/local/etc/dovecot-trash.conf
#expire = Trash 7 Spam 30
#expire_dict = proxy::expire
#lazy_expunge = .EXPUNGED/ .DELETED/ .DELETED/.EXPUNGED/
#mail_log_events = delete undelete expunge copy mailbox_delete mailbox_rename
#mail_log_group_events = no
#mail_log_fields = uid box msgid size
#sieve=~/.dovecot.sieve
#sieve_dir=~/sieve
#}
#!include /usr/local/etc/dovecot/conf.d/*.conf
#!include_try /usr/local/etc/dovecot/extra.conf-------------------
конфиг procmail:
-------------------
MAILDIR=$HOME/.maildir/
DEFAULT=$MAILDIR/
LOGFILE=/var/log/procmaillog
LOGABSTRACT=no
VERBOSE=on:0
* ^Subject:.*SPAM
/usr/home/spam/.maildir/
-------------------т.е., еще раз поясню всю схемы работы и проблему:
Письмо приходит и кладется в папку пользователя-адресата при помощи локального доставщика в виде procmail. У меня все пользователи системные, - соответственно и почта кладется в их домашние каталоги.
До того, как я решил использовать dovecot вся почта хранилась в формате mbox и лежала в /var/mail/$USERs_mbox.
Так как довекот хочу юзать и как имап сервер тоже, решил переконвертировать почтовые каталоги в формат maildir и сделать домашние каталоги хранилищем для писем каждого пользователя.
Как известно, в этом формате каждое письмо - отдельный файл. Так вот когда это письмо приходит - файл создается с владельцем root и правами 700.Задача - сделать так, чтобы новые письма создавались с правами действительных владельцев.
Помогите разобраться, плиз...
> Можно ли решить трабл правкой конфига dovecot'a?А зачем вам процмейл? У довекота есть собственный ЛДА deliver, который умеет делать sieve.
Все, что нужно сделать, это добавить в конфиг довекота две секции:> protocol lda {
> postmaster_address = postmaster
> auth_socket_path = /var/run/dovecot/auth-master
> deliver_log_format = mail from %f: %$
> mail_plugins = sieve
> mail_plugin_dir = /usr/local/lib/dovecot/lda
> sendmail_path = /usr/sbin/sendmail
> }и
> plugin {
> sieve_before = /usr/local/etc/dovecot/before.sieve
> }В файлик /usr/local/etc/dovecot/before.sieve кладете следующее:
> require "fileinto";
> if anyof (header :contains "Subject" "SPAM")
> {
> fileinto "Junk";
> }
> else
> {
> keep;
> }А в конфиг сендмейла прописать вызов деливера вместо вызова процмейла. Это вы уж сами, я сендмейл успел давно забыть. Только не забудьте при вызове деливера прописать ему опции с Return-Path и Envelope-to, а то баунсы ходить не будут. В экзиме он вызывается вот так:
> /usr/local/libexec/dovecot/deliver -d $local_part@$domain -f $sender_address
Что у вас получится на выходе:
- с локальным хранилищем будут работать ТОЛЬКО довекот и его деливер, а работают они с одним и тем же конфигом, т.е. от одного и того же юзера.
- выкинете процмейл за ненадобностью
- в перспективе сможете добавить управляемый юзерами фильтрёж почты через довекотовский же managesieve
- сможете задействовать довекотовские же квоты на размеры мейлдиров
- переход с одного МТА на любой другой будет предельно прост, потому что при такой схеме МТА держится только за 25 порт и за вызов деливера.ну и так далее, бонусов там весьма немало, а с надвигающейся версией довекота 2.0 их будет еще больше.
>[оверквотинг удален]
> require "fileinto";
> if anyof (header :contains "Subject" "SPAM")
> {
> fileinto "Junk";
> }
> else
> {
> keep;
> }
> А в конфиг сендмейла прописать вызов деливера вместо вызова процмейла.Ну там что то вроде этого (с флагами только пошаманить):
--------------
FEATURE(`local_procmail', `/usr/local/libexec/dovecot/deliver',`deliver -d $u')
MODIFY_MAILER_FLAGS(`LOCAL', `-f')
MAILER(procmail)
--------------Ок, это я все добавлю, только хочу, чтобы спамовые письма падали в /usr/home/spam/.maildir - значит надо изменить в конфиге довекота:
> if anyof (header :contains "Subject" "SPAM")
> {
> fileinto /usr/local/spam/.maildir/;
> }????
> ну и так далее, бонусов там весьма немало, а с надвигающейся версией
> довекота 2.0 их будет еще больше.Дык, ееже уже можно юзать - в портах не лежит, но никто не мешает скачать пакетик =)
Правда, я как сторонник устанавливать все из портов, посему я и поставил 1ую версию...
P.S. Нашел решение (похоже) для procmail'a:
- надо в конфиг добавить:DROPPRIVS=yes
UMASK=777 (ну или какую надо)А dovecot я не хотел делать доставщиком по очень банальной причине - я не знал, как прописать правила)
По прокмейлу много инфы, да и синтаксис разжеван... как то уже привык к нему...Ладно, с кусками кода я попробую завтра на работе, посмотрим, что из этого выйдет =)
Огромное спасибо за советы!
> P.S. Нашел решение (похоже) для procmail'a:
> - надо в конфиг добавить:
> DROPPRIVS=yes
> UMASK=777 (ну или какую надо)Это что, настежь открытые мейлдиры? Тогда это не решение, это костыль.
Довекот в локальное хранилище кладет файло от своего имени. И доступа туда системные юзеры не имеют. То-есть, в отличие от, скажем, popa3d, поп/имап сервер не форчится суидно, чтобы получить доступ в бокс/дир, а на самом деле авторизует пользователя отдельно, а к файлам доступается отдельно, от своего собственного имени.
> А dovecot я не хотел делать доставщиком по очень банальной причине -
> я не знал, как прописать правила)
> По прокмейлу много инфы, да и синтаксис разжеван... как то уже привык
> к нему...Я пять лет ковырялся с сенд/процмейлами, и ушел на экзим/довекот с невыносимым облегчением. Уж поверьте, шеллоподобный синтакс сива на два порядка удобней привычного процмейлового. Конфиг экзима с конфигом сендмейла вообще сравнивать неприлично.
> хочу, чтобы спамовые письма падали в /usr/home/spam/.maildirА зачем, извините, вы этого хотите?
У мейлдира есть стандартная структура с дефолтными каталогами Sent, Drafts, Trash и Junk. Все софты, которые работают с мейлдирами, именно их пытаются и найти.
Если вы хотите накапливать весь спам в отдельной папке, то возможны фальш-позитивы, когда письмо ошибочно распознается, как спам. Гораздо корректней класть спам юзеру в подкаталог его мейлдира, и ждать его реакции. А спустя месяц можно письма из индивидуальных ящиков перемещать в общий ацтойник. У меня по крону раз в сутки вызывается нечто вроде:
find -E $MROOT -type f -iregex ".*Junk.*" -Btime 31 -exec /usr/local/etc/mail/collector.sh {} \;
Скрипт collector.sh указанное письмо еще раз прогоняет через sa-learn, вычищает оттуда все локальные мыла, переименовывает в МД5-хеш от тела письма, и, в зависимости от того, было ли письмо положено в спам сассассином или юзером, кладет его в один из двух ацтойников. Письма, проскочившие сассассин и идентифицированные, как спам, человеками - очень ценные письма. Их в сутки накапливается всего с десяток, но именно на них есть смысл обучать байесы синтаксических анализаторов.