URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 90237
[ Назад ]

Исходное сообщение
"Sendmail+procmail+dovecot. Проблема с правами"

Отправлено mr brightside , 08-Ноя-10 17:48 
Добрый день, всем!

Система 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.

Задача - сделать так, чтобы новые письма создавались с правами действительных владельцев.

Помогите разобраться, плиз...


Содержание

Сообщения в этом обсуждении
"Sendmail+procmail+dovecot. Проблема с правами"
Отправлено DeadLoco , 08-Ноя-10 22:15 
> Можно ли решить трабл правкой конфига 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 их будет еще больше.


"Sendmail+procmail+dovecot. Проблема с правами"
Отправлено mr brightside , 08-Ноя-10 22:54 
>[оверквотинг удален]
> 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 я не хотел делать доставщиком по очень банальной причине - я не знал, как прописать правила)
По прокмейлу много инфы, да и синтаксис разжеван... как то уже привык к нему...

Ладно, с кусками кода я попробую завтра на работе, посмотрим, что из этого выйдет =)

Огромное спасибо за советы!


"Sendmail+procmail+dovecot. Проблема с правами"
Отправлено DeadLoco , 08-Ноя-10 23:13 
> P.S. Нашел решение (похоже) для procmail'a:
> - надо в конфиг добавить:
> DROPPRIVS=yes
> UMASK=777 (ну или какую надо)

Это что, настежь открытые мейлдиры? Тогда это не решение, это костыль.

Довекот в локальное хранилище кладет файло от своего имени. И доступа туда системные юзеры не имеют. То-есть, в отличие от, скажем, popa3d, поп/имап сервер не форчится суидно, чтобы получить доступ в бокс/дир, а на самом деле авторизует пользователя отдельно, а к файлам доступается отдельно, от своего собственного имени.


> А dovecot я не хотел делать доставщиком по очень банальной причине -
> я не знал, как прописать правила)
> По прокмейлу много инфы, да и синтаксис разжеван... как то уже привык
> к нему...

Я пять лет ковырялся с сенд/процмейлами, и ушел на экзим/довекот с невыносимым облегчением. Уж поверьте, шеллоподобный синтакс сива на два порядка удобней привычного процмейлового. Конфиг экзима с конфигом сендмейла вообще сравнивать неприлично.


"Sendmail+procmail+dovecot. Проблема с правами"
Отправлено DeadLoco , 08-Ноя-10 23:32 
> хочу, чтобы спамовые письма падали в /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-хеш от тела письма, и, в зависимости от того, было ли письмо положено в спам сассассином или юзером, кладет его в один из двух ацтойников. Письма, проскочившие сассассин и идентифицированные, как спам, человеками - очень ценные письма. Их в сутки накапливается всего с десяток, но именно на них есть смысл обучать байесы синтаксических анализаторов.