EXIM Ldap
EXIM Ldap
Jan-Piet Mens
mens.de
Overview
BASEDN = dc=fupps,dc=com
BINDDN = uid=exim,ou=machines,BASEDN
Access Control Lists
check recipients, authenticated, relay, etc.
Routers
dnslookup, system aliases, forwarding, local users
Transports
remote smtp, local delivery, pipe, file
Retry
Rewrites
Authenticators
Exim: Routers and Transports
LDAP queries in Exim
> ${lookup
ldap{ldap:///dc=fupps,dc=com?uid,cn?sub?uid=janej}}
cn="Jane Jolie" uid="janej"
Debugging: Exim
> ${lookup
ldap{ldap:///dc=fupps,dc=com?uid,cn?sub?uid=janej}}
cn="Jane Jolie" uid="janej"
ldap:///dc=fupps,dc=com?rfc822MailMember?sub?(&(objectClass=
nisMailAlias)(cn=${quote_ldap:$local_part}))}
{$value} fail }
...
extract item: jpm
extract item: [email protected]
extract item: [email protected]
extract item: [email protected]
extract item: [email protected]
Debugging: LDAP connections
slapd.log
conn=4 SRCH base="dc=fupps,dc=com" scope=2 \
filter="(uid=janej)"
conn=4 SRCH attr=uid cn mail
conn=4 ENTRY dn="cn=jane jolie,dc=fupps,dc=com"
conn=4 SEARCH RESULT tag=101 err=0 nentries=1 text=
conn=4 UNBIND
conn=4 fd=12 closed
Warning only:
<= bdb_equality_candidates: (eximCfActive) not indexed
Using LDAP queries in Exim
Multivalued ‘rfc822MailMember’
dn: cn=postmaster,ou=Aliases,dc=fupps,dc=com
objectClass: top
objectClass: nisMailAlias
cn: postmaster
rfc822MailMember: jpm
rfc822MailMember: [email protected]
Example:
ldap_aliases:
driver = redirect
allow_fail
allow_defer
data = ${lookup \
ldapm { \
user=BINDDN \
pass=BINDPW \
ldap:///BASEDN?rfc822MailMember?sub?\
(&\
(objectClass=nisMailAlias)\
(cn=${quote_ldap:$local_part}))\
} {$value} fail }
file_transport = address_file
pipe_transport = address_pipe
Using groups
The group:
dn: cn=g2,ou=Groups,dc=fupps,dc=com
objectClass: groupOfNames
cn: g2
member: cn=Jane Jolie,ou=Users,dc=fupps,dc=com
member: cn=John Duck,ou=Users,dc=fupps,dc=com
Using groups: groupOfNames
The group:
dn: cn=g2,ou=Groups,dc=fupps,dc=com
objectClass: groupOfNames
cn: g2
member: cn=Jane Jolie,ou=Users,dc=fupps,dc=com
member: cn=John Duck,ou=Users,dc=fupps,dc=com
The member:
dn: cn=John Duck,ou=Users,dc=fupps,dc=com
objectClass: inetOrgPerson
cn: John Duck
uid: johnd
mail: [email protected]
memberOf: cn=g2,ou=Groups,dc=fupps,dc=com
Using groups: groupOfNames
The group:
dn: cn=g2,ou=Groups,dc=fupps,dc=com
objectClass: groupOfNames
cn: g2
member: cn=Jane Jolie,ou=Users,dc=fupps,dc=com
member: cn=John Duck,ou=Users,dc=fupps,dc=com
The member:
dn: cn=John Duck,ou=Users,dc=fupps,dc=com
objectClass: inetOrgPerson
cn: John Duck
uid: johnd
mail: [email protected]
memberOf: cn=g2,ou=Groups,dc=fupps,dc=com
The pain.
Referential integrity needs maintaining...
Using groups: groupOfNames
Schema file:
1. attributetype ( 1.3.6.1.4.1.7637.30.1.1.2
2. NAME ’eximCfActive’
3. DESC ’Config setting enabled?’
4. EQUALITY booleanMatch
5. SYNTAX 1.3.6.1.4.1.1466.115.121.1.7
6. SINGLE-VALUE
7. )
8.
9. objectclass ( 1.3.6.1.4.1.7637.30.1.2.1
10. NAME ’eximConf’
11. SUP top STRUCTURAL
12. DESC ’Exim configuration stanza’
13. MUST ( cn $ eximCfActive )
14. MAY ( eximCfValue $ description $ seeAlso )
15. )
Custom schema: LDIF
dn: cn=exim-smarthost,ou=Conf,dc=fupps,dc=com
cn: exim-smarthost
objectclass: eximConf
eximCfActive: FALSE
eximCfValue: my-smarthost.example.org
description: If you need a smart host for
outgoing mails from this host, set its
hostname in eximCfValue and enable smart-host
processing by setting eximCfActive.
Custom schema: Smarthost in Exim
A macro
SMARTHOST = ldap:///ou=Conf,BASEDN?eximCfValue?\
one?(&\
(objectclass=eximConf)\
(cn=exim-smarthost)\
(eximCfActive=TRUE)\
)
The corresponding Exim router
ldap_smart_route:
driver = manualroute
domains = !+local_domains
condition = ${lookup ldap{SMARTHOST}}
transport = remote_smtp
route_list = * "${lookup ldap{SMARTHOST}}"
SMTP Authentication
Plain, Login
Authentication data plain text. Use TLS encryption!
CRAM-MD5
Challenge/response. Server needs access to unencrypted password.
How should users authenticate?
e-mail address: [email protected]
username: jdoe
Authentication with LDAP requires DN.
Can you afford to "construct" the DN?
user="uid=$auth1,ou=People,dc=fupps,dc=com"
Better to search for the DN:
user="${lookup ldapdn {\
ldaps:///BASEDN?dn?sub?\
(&(uid=${quote_ldap:$auth1})(mail=*))}}"
SMTP Authentication: server_condition
ldap_plain:
driver = plaintext
public_name = PLAIN
server_condition = ${if ldapauth {\
user="${lookup ldapdn {USER}{$value}fail}" \
pass=${quote:$auth3} \
ldap:///BASEDN/ \
}{yes} {no} \
}
server_set_id = ${sg{$ldap_dn}{\s+}{}}
Integrate your Groupware Server
Groupware
IBM/Lotus Domino, Microsoft Exchange, Novell Groupwise
domino_split:
driver = manualroute
domains = megacorp.info
condition = ${lookup ldap{MEGACORPUSER}}
route_list = * "domino.megacorp.info"
transport = remote_smtp
Summary
Philip Hazel, 2007, The Exim SMTP Mail Server, 2nd ed.
http://uit.co.uk/content/exim-smtp-mail-server
Jan-Piet Mens, 2009, Alternative DNS Servers, UIT
http://uit.co.uk/altdns
Thank you
Questions?