[Dovecot] trying to combine static userdb with LDAP passdb with per-user userdb_mail and userdb_home

Igor Zinovik zinovik.igor at gmail.com
Tue Apr 12 10:31:41 EEST 2011


I solved my problem doing this:
/etc/dovecot/dovecot.conf
...
mail_uid = 89
mail_gid = 89

userdb {
  driver = prefetch;
}

passdb {
  driver = ldap
  args = /etc/dovecot/dovecot-ldap.conf
}


/etc/dovecot/dovecot-ldap.conf
pass_filter = (&(objectClass=mailAccount)(uid=%n)(accountStatus=TRUE))

pass_attrs = mail=userdb_user,\
             userPassword=password,\
             mailQuota=userdb_quota_rule=*:bytes=%$,\
             homeDirectory=userdb_home,\
             mailMessageStore=userdb_mail

Setting mail_uid and mail_gid to numeric values of postfix user i
achieved my goal.

On Apr 11, Igor Zinovik wrote: 
> I'm trying to cope with following problem I have single computer which
> will be going to be final destination for several virtual domains.
> Domains are stored in LDAP catalog.  Dovecot will be working together
> with Postfix MTA running on same computer.
> 
> I'm a bit confused how to achieve following thing: I want Postfix to use
> Dovecot LMTP server for mail delivery.  All my mail is located under
> /var/vmail partition.  I designed my own ldap schema and according to
> dovecot documentation that user should always has home and mail directory
> i added separate attributes for user home and mail.  My typical user
> that is stored in LDAP has homeDirectory (which stores value like
> /var/vmail/domain.com/j/joe) and mailMessageStore (which stores value
> like /var/vmail/domain.com/j/joe/Maildir).  All data under /var/vmail is
> owned by Postfix MTA user (which is called `postfix', uid=89).  After
> reading dovecot documentation I understand that my setup needs to
> combine static userdb with LDAP passdb.  But i also want dovecot to be
> able to deliver mail for local system users (that are stored in
> /etc/passwd).  For system users i want to store their mail in
> $HOME/Mail.  So i set mail_location = ~/Mail (which turns into
> /home/user/Mail),  but for virtual (which are stored in LDAP) users i
> want to set mail (or maybe i should write here userdb_mail) to LDAP
> value mailMessageStore.  Seems to me that LMTP server needs separate
> userdb query to fetch mail_location from LDAP.
> 
> Setting mail_location = /var/vmail/%d/%n1/%u solves my problem, but I
> want dovecot to dynamically fetch maildir location from LDAP.  Maybe in
> near future I would also store mail somewhere else not only under
> /var/vmail.  And dovecot will fetch this information from LDAP.
> 
> Here is excerpt from dovecot log when user tries to login:
> Apr 11 13:32:29 auth: Debug: Loading modules from directory: /usr/lib64/dovecot/auth
> Apr 11 13:32:29 auth: Debug: Module loaded: /usr/lib64/dovecot/auth/libauthdb_ldap.so
> Apr 11 13:32:29 auth: Debug: Module loaded: /usr/lib64/dovecot/auth/libdriver_mysql.so
> Apr 11 13:32:29 auth: Debug: Module loaded: /usr/lib64/dovecot/auth/libdriver_pgsql.so
> Apr 11 13:32:29 auth: Debug: Module loaded: /usr/lib64/dovecot/auth/libdriver_sqlite.so
> Apr 11 13:32:29 auth: Debug: Module loaded: /usr/lib64/dovecot/auth/libmech_gssapi.so
> Apr 11 13:32:29 auth: Debug: auth client connected (pid=14748)
> Apr 11 13:32:29 auth: Debug: client in: AUTH    1       PLAIN   service=imap    lip=172.20.21.26        rip=172.20.20.216 lport=143        rport=1227      resp=<hidden>
> Apr 11 13:32:29 auth: Debug: ldap(joe at domain.com,172.20.20.216): pass search: base=pdomain=domain.com,ou=mail,dc=org,dc=ru scope=onelevel filter=(&(objectClass=mailAccount)(uid=joe)(accountStatus=TRUE)) fields=mail,userPassword,mailQuota,homeDirectory,mailMessageStore
> Apr 11 13:32:29 auth: Debug: ldap(joe at domain.com,172.20.20.216): result: mail(user)=joe at domain.com mailQuota(userdb_quota_rule=*:bytes=%$)=1073741824 mailMessageStore(userdb_mail)=/var/vmail/domain.com/p/joe/Maildir homeDirectory(userdb_home)=/var/vmail/domain.com/p/joe userPassword(password)=<hidden>
> Apr 11 13:32:29 auth: Debug: client out: OK     1       user=joe at domain.com
> Apr 11 13:32:29 auth: Debug: master in: REQUEST 2814377985      14748   1       5e00190b4fbfd1a4b8a50e13fa6562b1
> Apr 11 13:32:29 auth: Debug: master out: USER   2814377985      joe at domain.com      uid=89  gid=89
> Apr 11 13:32:29 imap-login: Info: Login: user=<joe at domain.com>, method=PLAIN, rip=172.20.20.216, lip=172.20.21.26, mpid=14750
> Apr 11 13:32:29 imap: Debug: Loading modules from directory: /usr/lib64/dovecot
> Apr 11 13:32:29 imap: Debug: Module loaded: /usr/lib64/dovecot/lib10_quota_plugin.so
> Apr 11 13:32:29 imap: Debug: Module loaded: /usr/lib64/dovecot/lib11_imap_quota_plugin.so
> Apr 11 13:32:29 imap: Debug: Module loaded: /usr/lib64/dovecot/lib11_trash_plugin.so
> Apr 11 13:32:29 imap: Debug: Module loaded: /usr/lib64/dovecot/lib20_autocreate_plugin.so
> Apr 11 13:32:29 imap: Debug: Module loaded: /usr/lib64/dovecot/lib20_expire_plugin.so
> Apr 11 13:32:29 imap(joe at domain.com): Debug: Effective uid=89, gid=89, home=
> Apr 11 13:32:29 imap(joe at domain.com): Debug: Quota root: name=User quota backend=maildir args=
> Apr 11 13:32:29 imap(joe at domain.com): Debug: Quota rule: root=User quota mailbox=* bytes=1073741824 messages=0
> Apr 11 13:32:29 imap(joe at domain.com): Debug: Quota warning: bytes=1020054732 (95%) messages=0 reverse=no command=/usr/libexec/dovecot/quota-warning.sh 95 joe at domain.com domain.com
> Apr 11 13:32:29 imap(joe at domain.com): Debug: Quota warning: bytes=966367641 (90%) messages=0 reverse=no command=/usr/libexec/dovecot/quota-warning.sh 90 joe at domain.com domain.com
> Apr 11 13:32:29 imap(joe at domain.com): Debug: Quota warning: bytes=858993459 (80%) messages=0 reverse=no command=/usr/libexec/dovecot/quota-warning.sh 80 joe at domain.com domain.com
> Apr 11 13:32:29 imap(joe at domain.com): Error: user joe at domain.com: Initialization failed: Initializing mail storage from mail_location setting failed: Home directory not set for user. Can't expand ~/ for mail root dir in: ~/Mail
> Apr 11 13:32:29 imap(joe at domain.com): Error: Invalid user settings. Refer to server log for more information.
> 
> Here is my ldap query:
> pass_filter = (&(objectClass=mailAccount)(uid=%n)(accountStatus=TRUE))
> 
> # ldap_attr = dovecot_variable
> pass_attrs = mail=user, userPassword=password, mailQuota=userdb_quota_rule=*:bytes=%$,\
>              homeDirectory=userdb_home, mailMessageStore=userdb_mail 
> 
> What is the best way to do in my situation?  Should i just add two
> attributes to each LDAP user like mailuid and mailgid and set both these
> variables to `postfix'.  Or maybe i should just forget about mail for
> local system users and just user `prefetch' userdb.  I'm just mazed
> about dovecot userdb and passdb queries.  It so powerful but also so
> hard to understand.
> 
> I would appreciate any help, since I peck dovecot authentication and
> userdb-passdb queries like woodpecker starting from last week.
> 
> Do I understand right that dovecot during userdb fetches Unix UID which
> will be used to access data on disk?  I just want postfix (uid=89) to
> allow to do this.
> 
> Here is `dovecot -n' output:
> # 2.0.11: /etc/dovecot/dovecot.conf
> # OS: Linux 2.6.18-238.1.1.1.el5 x86_64 CentOS release 5.5 (Final) 
> auth_debug = yes
> auth_failure_delay = 3 secs
> auth_mechanisms = plain login
> auth_verbose = yes
> base_dir = /var/run/dovecot/
> disable_plaintext_auth = no
> first_valid_gid = 89
> first_valid_uid = 89
> last_valid_gid = 89
> last_valid_uid = 89
> listen = *
> log_path = /var/log/dovecot
> login_greeting = Dovecot ready to serve.
> mail_debug = yes
> mail_fsync = always
> mail_location = maildir:~/Mail
> mail_nfs_index = yes
> mail_nfs_storage = yes
> managesieve_notify_capability = mailto
> managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date imapflags
> mmap_disable = yes
> passdb {
>   args = /etc/dovecot/dovecot-ldap.conf
>   driver = ldap
> }
> plugin/autocreate = &BBoEPgRABDcEOAQ9BDA-
> plugin/autocreate2 = &BCEEPwQwBDw-
> plugin/autosubscribe = &BBoEPgRABDcEOAQ9BDA-
> plugin/autosubscribe2 = &BCEEPwQwBDw-
> plugin/expire = &BBoEPgRABDcEOAQ9BDA- 7 &BCEEPwQwBDw- 30
> plugin/login_executable = /usr/libexec/dovecot/managesieve-login
> plugin/mail_executable = /usr/libexec/dovecot/managesieve
> plugin/quota = maildir:User quota
> plugin/quota_rule = *:storage=1GB
> plugin/quota_warning = storage=95%% /usr/libexec/dovecot/quota-warning.sh 95 %u %d
> plugin/quota_warning2 = storage=90%% /usr/libexec/dovecot/quota-warning.sh 90 %u %d
> plugin/quota_warning3 = storage=80%% /usr/libexec/dovecot/quota-warning.sh 80 %u %d
> plugin/sieve_dir = /var/vmail/%d/%1n/%n/.dovecot.sieve
> plugin/sieve_extensions = +imapflags
> plugin/sieve_storage = /var/vmail/%d/%1n/%n/sieve
> protocols = pop3 imap lmtp sieve
> service auth {
>   unix_listener /var/spool/postfix/private/auth {
>     group = postfix
>     mode = 0660
>     user = postfix
>   }
> }
> service imap-login {
>   executable = /usr/libexec/dovecot/imap-login
>   inet_listener imap {
>     port = 143
>   }
>   inet_listener imaps {
>     port = 993
>     ssl = yes
>   }
>   service_count = 1
> }
> service imap {
>   executable = /usr/libexec/dovecot/imap
> }
> service lmtp {
>   unix_listener /var/spool/postfix/private/dovecot-lmtp {
>     group = postfix
>     mode = 0666
>     user = postfix
>   }
> }
> service managesieve-login {
>   executable = /usr/libexec/dovecot/managesieve-login
>   inet_listener sieve {
>     port = 4190
>   }
>   service_count = 1
> }
> service managesieve {
>   executable = /usr/libexec/dovecot/managesieve
> }
> service pop3-login {
>   executable = /usr/libexec/dovecot/pop3-login
>   inet_listener pop3 {
>     port = 110
>   }
>   inet_listener pop3s {
>     port = 995
>     ssl = yes
>   }
>   service_count = 1
> }
> service pop3 {
>   executable = /usr/libexec/dovecot/pop3
> }
> service quota-warning {
>   executable = script /usr/libexec/dovecot/quota-warning.sh
>   user = dovecot
> }
> ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
> ssl_key = </etc/pki/dovecot/private/dovecot.pem
> userdb {
>   args = uid=postfix gid=postfix
>   driver = static
> }
> protocol imap {
>   imap_client_workarounds = delay-newmail tb-extra-mailbox-sep
>   mail_plugin_dir = /usr/lib64/dovecot
>   mail_plugins = autocreate expire quota imap_quota trash
> }
> protocol pop3 {
>   pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
>   pop3_lock_session = yes
>   pop3_uidl_format = %08Xu%08Xv
> }
> protocol lmtp {
>   info_log_path = /var/log/dovecot-lmtp-info.log
>   log_path = /var/log/dovecot-lmtp.log
>   mail_plugins = quota sieve
> }
> 
> Here is my typical LDAP user:
> dn: uid=joe,pdomain=domain.com,ou=mail,dc=org,dc=ru
> objectClass: top
> objectClass: uidObject
> objectClass: mailAccount
> accountStatus: TRUE
> mail: joe at domain.com
> mailQuota: 1073741824
> mailMessageStore: /var/vmail/domain.com/j/joe/Maildir
> mailOwnerFirstName: Joe
> mailOwnerLastName: User
> registerPersonFirstName: Joe
> registerPersonLastName: User
> registerDate: 1301665769
> homeDirectory: /var/vmail/domain.com/j/joe
> uid: joe
> userPassword: {SSHA}FvxQwgDycssHhfoMTtkzogZ0Nh43PpHL


More information about the dovecot mailing list