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.