Postfix + Courier + LDAP virtual domains HOWTO
Revisions:So what will we have today? these are the versions of the software I'm using:
- Mandrake Linux version 9.0
- Postfix version 1.1.11
- Courier IMAP version 1.5.2
- OpenLDAP version 2.0.25
- Apache version 2.0.40
- PHP version 4.2.3
Optionally, I use the LDAP Browser/Editor by Jarek Gawor version 2.8.2 to set things up. once I finish the web interface, you will not need to use this specific piece of software, but it is a very good LDAP browser - best I've seen so far - and its written in Java, so you can have your non-Linux sysadmins use it too :-).
# # postfix-ldap v3 directory schema # # Postfix schema for using LDAP to manage Postfix virtual domains # # Created by: Oded Arbel# # This schema depends on: # - core.schema # # Attribute Type Definitions attributetype ( 1.3.6.1.4.1.7602.1.2.1.1 NAME 'mailLogin' DESC 'Login id for Courier IMAP' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributetype ( 1.3.6.1.4.1.7602.1.2.1.2 NAME 'mailDomain' DESC 'Domain id underwhich this user will login' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributetype ( 1.3.6.1.4.1.7602.1.2.1.3 NAME 'mailForward' DESC 'Location of .forward files for this user' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributetype ( 1.3.6.1.4.1.7602.1.2.1.4 NAME 'mailStorage' DESC 'Path to the mail storage directory' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributetype ( 1.3.6.1.4.1.7602.1.2.1.5 NAME 'mailHomeDir' DESC 'Base directory for user specific files' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributetype ( 1.3.6.1.4.1.7602.1.2.1.6 NAME 'mailDir' DESC 'Relative path from the mailHomeDir to the mailStorage' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) # objectClass definitions objectclass ( 1.3.6.1.4.1.7602.1.2.2.1 NAME 'postfixUser' DESC 'Postfix-LDAP User' SUP top AUXILIARY MAY ( mail $ uid $ mailLogin $ mailDomain $ mailForward $ mailStorage $ mailHomeDir $ mailDir ) )
# Basic ACL
access to attr=userPassword
by self write
by anonymous auth
by dn="uid=root,cn=Administrators,ou=People,dc=geek,dc=co,dc=il" write
by dn="cn=courier,ou=Services,dc=geek,dc=co,dc=il" read
by * none
access to *
by dn="uid=root,cn=Administrators,ou=People,dc=geek,dc=co,dc=il" write
by * read
rootdb
+-- Services
| +-- Courier
| +-- Other services that need authentication..
+-- People
| +-- Administrators
| | +-- root
| | +-- Other administration accounts..
| +-- Other user groups..
+-- Mail Domains
+-- Geek
| +-- Oded Arbel
| +-- Other users on geek.co.il..
+-- Other virtual domains..
dn: dc=geek,dc=co,dc=il
dc: geek
objectClass: dcObject
objectClass: organization
o: Geek
dn: ou=Services, dc=geek,dc=co,dc=il
ou: Services
objectClass: top
objectClass: organizationalUnit
dn: cn=courier,ou=Services, dc=geek,dc=co,dc=il
userPassword: {SSHA}QWxho4T9Uv5fLaunTGScZYogRvxJCV15
objectClass: top
objectClass: applicationProcess
objectClass: simpleSecurityObject
description: Courier IMAP
cn: courier
dn: ou=People, dc=geek,dc=co,dc=il
ou: People
objectClass: top
objectClass: organizationalUnit
dn: cn=Administrators,ou=People, dc=geek,dc=co,dc=il
gidNumber: 0
objectClass: top
objectClass: posixGroup
description: System Administrators
cn: Administrators
dn: uid=root,cn=Administrators,ou=People, dc=geek,dc=co,dc=il
sn: Administrator
userPassword: {SSHA}QWxho4T9Uv5fLaunTGScZYogRvxJCV15
loginShell: /bin/bash
uidNumber: 0
gidNumber: 0
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: organizationalRole
uid: root
cn: Administrator
homeDirectory: /root
description: System Administrator
dn: ou=Mail Domains, dc=geek,dc=co,dc=il
ou: Mail Domains
objectClass: top
objectClass: organizationalUnit
dn: ou=Geek,ou=Mail Domains, dc=geek,dc=co,dc=il
mail: geek.co.il
uid: geek
ou: Geek
objectClass: top
objectClass: organizationalUnit
objectClass: postfixUser
dn: cn=Oded Arbel,ou=Geek,ou=Mail Domains, dc=geek,dc=co,dc=il
objectClass: top
objectClass: person
objectClass: postfixUser
cn: Oded Arbel
sn: Oded Arbel
uid: oded
userPassword: {SSHA}QWxho4T9Uv5fLaunTGScZYogRvxJCV15
mail: oded@geek.com
mail: odeda@geek.com
mailLogin: geek.oded
mailDomain: geek
mailHomeDir: /var/spool/mail/geek.oded
mailForward: /var/spool/mail/geek.oded/forward
mailStorage: /var/spool/mail/geek.oded/mail/
mailDir: mail
virtual_maps = ldap:ldapvirtual
local_recipient_maps = ldap:ldapvirtual
alias_maps = hash:/etc/postfix/aliases, ldap:ldapdeliver
forward_path =
/var/spool/mail/$user/forward/forward-${recipient_delimiter}${extension},
/var/spool/mail/$user/forward/forward
ldapvirtual_server_host = localhost
#ldapvirtual_server_port = 389
ldapvirtual_search_base = dc=geek, dc=co, dc=il
#ldapvirtual_timeout = 10
ldapvirtual_query_filter = (mail=%s)
ldapvirtual_result_attribute = mailLogin
ldapvirtual_bind = no
ldapdeliver_server_host = localhost
#ldapdeliver_server_port = 389
ldapdeliver_search_base = dc=geek, dc=co, dc=il
#ldapdeliver_timeout = 10
ldapdeliver_query_filter = (mailLogin=%s)
ldapdeliver_result_attribute = mailStorage
ldapdeliver_bind = no
mkdir -p /var/spool/mail/<mailLogin>/forward maildirmake /var/spool/mail/<mailLogin>/mail chown mail -R /var/spool/mail/<mailLogin>while replacing <mailLogin> with the mailLogin attribute from each user account.