Expand PMF_FN_* macros.
[netbsd-mini2440.git] / external / ibm-public / postfix / dist / README_FILES / LDAP_README
blob043b311a20e41c9a5c27e0e67c77cb18d3899bbc
1 P\bPo\bos\bst\btf\bfi\bix\bx L\bLD\bDA\bAP\bP H\bHo\bow\bwt\bto\bo
3 -------------------------------------------------------------------------------
5 L\bLD\bDA\bAP\bP S\bSu\bup\bpp\bpo\bor\brt\bt i\bin\bn P\bPo\bos\bst\btf\bfi\bix\bx
7 Postfix can use an LDAP directory as a source for any of its lookups: aliases
8 (5), virtual(5), canonical(5), etc. This allows you to keep information for
9 your mail service in a replicated network database with fine-grained access
10 controls. By not storing it locally on the mail server, the administrators can
11 maintain it from anywhere, and the users can control whatever bits of it you
12 think appropriate. You can have multiple mail servers using the same
13 information, without the hassle and delay of having to copy it to each.
15 Topics covered in this document:
17   * Building Postfix with LDAP support
18   * Configuring LDAP lookups
19   * Example: aliases
20   * Example: virtual domains/addresses
21   * Example: expanding LDAP groups
22   * Other uses of LDAP lookups
23   * Notes and things to think about
24   * Feedback
25   * Credits
27 B\bBu\bui\bil\bld\bdi\bin\bng\bg P\bPo\bos\bst\btf\bfi\bix\bx w\bwi\bit\bth\bh L\bLD\bDA\bAP\bP s\bsu\bup\bpp\bpo\bor\brt\bt
29 These instructions assume that you build Postfix from source code as described
30 in the INSTALL document. Some modification may be required if you build Postfix
31 from a vendor-specific source package.
33 Note 1: Postfix no longer supports the LDAP version 1 interface.
35 Note 2: to use LDAP with Debian GNU/Linux's Postfix, all you need is to install
36 the postfix-ldap package and you're done. There is no need to recompile
37 Postfix.
39 You need to have LDAP libraries and include files installed somewhere on your
40 system, and you need to configure the Postfix Makefiles accordingly.
42 For example, to build the OpenLDAP libraries for use with Postfix (i.e. LDAP
43 client code only), you could use the following command:
45     % ./configure  --without-kerberos --without-cyrus-sasl --without-tls \
46         --without-threads --disable-slapd --disable-slurpd \
47         --disable-debug --disable-shared
49 If you're using the libraries from the UM distribution (http://www.umich.edu/
50 ~dirsvcs/ldap/ldap.html) or OpenLDAP (http://www.openldap.org), something like
51 this in the top level of your Postfix source tree should work:
53     % make tidy
54     % make makefiles CCARGS="-I/usr/local/include -DHAS_LDAP" \
55         AUXLIBS="-L/usr/local/lib -lldap -L/usr/local/lib -llber"
57 On Solaris 2.x you may have to specify run-time link information, otherwise
58 ld.so will not find some of the shared libraries:
60     % make tidy
61     % make makefiles CCARGS="-I/usr/local/include -DHAS_LDAP" \
62         AUXLIBS="-L/usr/local/lib -R/usr/local/lib -lldap \
63                 -L/usr/local/lib -R/usr/local/lib -llber"
65 The 'make tidy' command is needed only if you have previously built Postfix
66 without LDAP support.
68 Instead of '/usr/local' specify the actual locations of your LDAP include files
69 and libraries. Be sure to not mix LDAP include files and LDAP libraries of
70 different versions!!
72 If your LDAP libraries were built with Kerberos support, you'll also need to
73 include your Kerberos libraries in this line. Note that the KTH Kerberos IV
74 libraries might conflict with Postfix's lib/libdns.a, which defines dns_lookup.
75 If that happens, you'll probably want to link with LDAP libraries that lack
76 Kerberos support just to build Postfix, as it doesn't support Kerberos binds to
77 the LDAP server anyway. Sorry about the bother.
79 If you're using one of the Netscape LDAP SDKs, you'll need to change the
80 AUXLIBS line to point to libldap10.so or libldapssl30.so or whatever you have,
81 and you may need to use the appropriate linker option (e.g. '-R') so the
82 executables can find it at runtime.
84 C\bCo\bon\bnf\bfi\big\bgu\bur\bri\bin\bng\bg L\bLD\bDA\bAP\bP l\blo\boo\bok\bku\bup\bps\bs
86 In order to use LDAP lookups, define an LDAP source as a table lookup in
87 main.cf, for example:
89     alias_maps = hash:/etc/aliases, ldap:/etc/postfix/ldap-aliases.cf
91 The file /etc/postfix/ldap-aliases.cf can specify a great number of parameters,
92 including parameters that enable LDAP SSL and STARTTLS. For a complete
93 description, see the ldap_table(5) manual page.
95 E\bEx\bxa\bam\bmp\bpl\ble\be:\b: l\blo\boc\bca\bal\bl(\b(8\b8)\b) a\bal\bli\bia\bas\bse\bes\bs
97 Here's a basic example for using LDAP to look up local(8) aliases. Assume that
98 in main.cf, you have:
100     alias_maps = hash:/etc/aliases, ldap:/etc/postfix/ldap-aliases.cf
102 and in ldap:/etc/postfix/ldap-aliases.cf you have:
104     server_host = ldap.example.com
105     search_base = dc=example, dc=com
107 Upon receiving mail for a local address "ldapuser" that isn't found in the /
108 etc/aliases database, Postfix will search the LDAP server listening at port 389
109 on ldap.example.com. It will bind anonymously, search for any directory entries
110 whose mailacceptinggeneralid attribute is "ldapuser", read the "maildrop"
111 attributes of those found, and build a list of their maildrops, which will be
112 treated as RFC822 addresses to which the message will be delivered.
114 E\bEx\bxa\bam\bmp\bpl\ble\be:\b: v\bvi\bir\brt\btu\bua\bal\bl d\bdo\bom\bma\bai\bin\bns\bs/\b/a\bad\bdd\bdr\bre\bes\bss\bse\bes\bs
116 If you want to keep information for virtual lookups in your directory, it's
117 only a little more complicated. First, you need to make sure Postfix knows
118 about the virtual domain. An easy way to do that is to add the domain to the
119 mailacceptinggeneralid attribute of some entry in the directory. Next, you'll
120 want to make sure all of your virtual recipient's mailacceptinggeneralid
121 attributes are fully qualified with their virtual domains. Finally, if you want
122 to designate a directory entry as the default user for a virtual domain, just
123 give it an additional mailacceptinggeneralid (or the equivalent in your
124 directory) of "@fake.dom". That's right, no user part. If you don't want a
125 catchall user, omit this step and mail to unknown users in the domain will
126 simply bounce.
128 In summary, you might have a catchall user for a virtual domain that looks like
129 this:
131          dn: cn=defaultrecipient, dc=fake, dc=dom
132          objectclass: top
133          objectclass: virtualaccount
134          cn: defaultrecipient
135          owner: uid=root, dc=someserver, dc=isp, dc=dom
136     1 -> mailacceptinggeneralid: fake.dom
137     2 -> mailacceptinggeneralid: @fake.dom
138     3 -> maildrop: realuser@real.dom
140     1: Postfix knows fake.dom is a valid virtual domain when it looks for this
141     and gets something (the maildrop) back.
143     2: This causes any mail for unknown users in fake.dom to go to this entry
144     ...
146     3: ... and then to its maildrop.
148 Normal users might simply have one mailacceptinggeneralid and maildrop, e.g.
149 "normaluser@fake.dom" and "normaluser@real.dom".
151 E\bEx\bxa\bam\bmp\bpl\ble\be:\b: e\bex\bxp\bpa\ban\bnd\bdi\bin\bng\bg L\bLD\bDA\bAP\bP g\bgr\bro\bou\bup\bps\bs
153 LDAP is frequently used to store group member information. There are a number
154 of ways of handling LDAP groups. We will show a few examples in order of
155 increasing complexity, but owing to the number of independent variables, we can
156 only present a tiny portion of the solution space. We show how to:
158  1. query groups as lists of addresses;
160  2. query groups as lists of user objects containing addresses;
162  3. forward special lists unexpanded to a separate list server, for moderation
163     or other processing;
165  4. handle complex schemas by controlling expansion and by treating leaf nodes
166     specially, using features that are new in Postfix 2.4.
168 The example LDAP entries and implied schema below show two group entries
169 ("agroup" and "bgroup") and four user entries ("auser", "buser", "cuser" and
170 "duser"). The group "agroup" has the users "auser" (1) and "buser" (2) as
171 members via DN references in the multi-valued attribute "memberdn", and direct
172 email addresses of two external users "auser@example.org" (3) and
173 "buser@example.org" (4) stored in the multi-valued attribute "memberaddr". The
174 same is true of "bgroup" and "cuser"/"duser" (6)/(7)/(8)/(9), but "bgroup" also
175 has a "maildrop" attribute of "bgroup@mlm.example.com" (5):
177          dn: cn=agroup, dc=example, dc=com
178          objectclass: top
179          objectclass: ldapgroup
180          cn: agroup
181          mail: agroup@example.com
182     1 -> memberdn: uid=auser, dc=example, dc=com
183     2 -> memberdn: uid=buser, dc=example, dc=com
184     3 -> memberaddr: auser@example.org
185     4 -> memberaddr: buser@example.org
187          dn: cn=bgroup, dc=example, dc=com
188          objectclass: top
189          objectclass: ldapgroup
190          cn: bgroup
191          mail: bgroup@example.com
192     5 -> maildrop: bgroup@mlm.example.com
193     6 -> memberdn: uid=cuser, dc=example, dc=com
194     7 -> memberdn: uid=duser, dc=example, dc=com
195     8 -> memberaddr: cuser@example.org
196     9 -> memberaddr: duser@example.org
198          dn: uid=auser, dc=example, dc=com
199          objectclass: top
200          objectclass: ldapuser
201          uid: auser
202     10 -> mail: auser@example.com
203     11 -> maildrop: auser@mailhub.example.com
205          dn: uid=buser, dc=example, dc=com
206          objectclass: top
207          objectclass: ldapuser
208          uid: buser
209     12 -> mail: buser@example.com
210     13 -> maildrop: buser@mailhub.example.com
212          dn: uid=cuser, dc=example, dc=com
213          objectclass: top
214          objectclass: ldapuser
215          uid: cuser
216     14 -> mail: cuser@example.com
218          dn: uid=duser, dc=example, dc=com
219          objectclass: top
220          objectclass: ldapuser
221          uid: duser
222     15 -> mail: duser@example.com
224 Our first use case ignores the "memberdn" attributes, and assumes that groups
225 hold only direct "memberaddr" strings as in (3), (4), (8) and (9). The goal is
226 to map the group address to the list of constituent "memberaddr" values. This
227 is simple, ignoring the various connection related settings (hosts, ports, bind
228 settings, timeouts, ...) we have:
230         simple.cf:
231             ...
232             search_base = dc=example, dc=com
233             query_filter = mail=%s
234             result_attribute = memberaddr
235         $ postmap -q agroup@example.com ldap:simple.cf
236         auser@example.org,buser@example.org
238 We search "dc=example, dc=com". The "mail" attribute is used in the
239 query_filter to locate the right group, the "result_attribute" setting
240 described in ldap_table(5) is used to specify that "memberaddr" values from the
241 matching group are to be returned as a comma separated list. Always check
242 tables using postmap(1) with the "-q" option, before deploying them into
243 production use in main.cf.
245 Our second use case instead expands "memberdn" attributes (1), (2), (6) and
246 (7), follows the DN references and returns the "maildrop" of the referenced
247 user entries. Here we use the "special_result_attribute" setting from
248 ldap_table(5) to designate the "memberdn" attribute as holding DNs of the
249 desired member entries. The "result_attribute" setting selects which attributes
250 are returned from the selected DNs. It is important to choose a result
251 attribute that is not also present in the group object, because result
252 attributes are collected from both the group and the member DNs. In this case
253 we choose "maildrop" and assume for the moment that groups never have a
254 "maildrop" (the "bgroup" "maildrop" attribute is for a different use case). The
255 returned data for "auser" and "buser" is from items (11) and (13) in the
256 example data.
258         special.cf:
259             ...
260             search_base = dc=example, dc=com
261             query_filter = mail=%s
262             result_attribute = maildrop
263             special_result_attribute = memberdn
264         $ postmap -q agroup@example.com ldap:special.cf
265         auser@mailhub.example.com,buser@mailhub.example.com
267 Note: if the desired member object result attribute is always also present in
268 the group, you get surprising results: the expansion also returns the address
269 of the group. This is a known limitation of Postfix releases prior to 2.4, and
270 is addressed in the new with Postfix 2.4 "leaf_result_attribute" feature
271 described in ldap_table(5).
273 Our third use case has some groups that are expanded immediately, and other
274 groups that are forwarded to a dedicated mailing list manager host for delayed
275 expansion. This uses two LDAP tables, one for users and forwarded groups and a
276 second for groups that can be expanded immediately. It is assumed that groups
277 that require forwarding are never nested members of groups that are directly
278 expanded.
280         no_expand.cf:
281             ...
282             search_base = dc=example, dc=com
283             query_filter = mail=%s
284             result_attribute = maildrop
285         expand.cf
286             ...
287             search_base = dc=example, dc=com
288             query_filter = mail=%s
289             result_attribute = maildrop
290             special_result_attribute = memberdn
291         $ postmap -q auser@example.com ldap:no_expand.cf ldap:expand.cf
292         auser@mailhub.example.com
293         $ postmap -q agroup@example.com ldap:no_expand.cf ldap:expand.cf
294         auser@mailhub.example.com,buser@mailhub.example.com
295         $ postmap -q bgroup@example.com ldap:no_expand.cf ldap:expand.cf
296         bgroup@mlm.example.com
298 Non-group objects and groups with delayed expansion (those that have a maildrop
299 attribute) are rewritten to a single maildrop value. Groups that don't have a
300 maildrop are expanded as the second use case. This admits a more elegant
301 solution with Postfix 2.4 and later.
303 Our final use case is the same as the third, but this time uses new features in
304 Postfix 2.4. We now are able to use just one LDAP table and no longer need to
305 assume that forwarded groups are never nested inside expanded groups.
307         fancy.cf:
308             ...
309             search_base = dc=example, dc=com
310             query_filter = mail=%s
311             result_attribute = memberaddr
312             special_result_attribute = memberdn
313             terminal_result_attribute = maildrop
314             leaf_result_attribute = mail
315         $ postmap -q auser@example.com ldap:fancy.cf
316         auser@mailhub.example.com
317         $ postmap -q cuser@example.com ldap:fancy.cf
318         cuser@example.com
319         $ postmap -q agroup@example.com ldap:fancy.cf
321     auser@mailhub.example.com,buser@mailhub.example.com,auser@example.org,buser@example.org
322         $ postmap -q bgroup@example.com ldap:fancy.cf
323         bgroup@mlm.example.com
325 Above, delayed expansion is enabled via "terminal_result_attribute", which, if
326 present, is used as the sole result and all other expansion is suppressed.
327 Otherwise, the "leaf_result_attribute" is only returned for leaf objects that
328 don't have a "special_result_attribute" (non-groups), while the
329 "result_attribute" (direct member address of groups) is returned at every level
330 of recursive expansion, not just the leaf nodes. This fancy example illustrates
331 all the features of Postfix 2.4 group expansion.
333 O\bOt\bth\bhe\ber\br u\bus\bse\bes\bs o\bof\bf L\bLD\bDA\bAP\bP l\blo\boo\bok\bku\bup\bps\bs
335 Other common uses for LDAP lookups include rewriting senders and recipients
336 with Postfix's canonical lookups, for example in order to make mail leaving
337 your site appear to be coming from "First.Last@example.com" instead of
338 "userid@example.com".
340 N\bNo\bot\bte\bes\bs a\ban\bnd\bd t\bth\bhi\bin\bng\bgs\bs t\bto\bo t\bth\bhi\bin\bnk\bk a\bab\bbo\bou\but\bt
342   * The bits of schema and attribute names used in this document are just
343     examples. There's nothing special about them, other than that some are the
344     defaults in the LDAP configuration parameters. You can use whatever schema
345     you like, and configure Postfix accordingly.
347   * You probably want to make sure that mailacceptinggeneralids are unique, and
348     that not just anyone can specify theirs as postmaster or root, say.
350   * An entry can have an arbitrary number of mailacceptinggeneralids or
351     maildrops. Maildrops can also be comma-separated lists of addresses. They
352     will all be found and returned by the lookups. For example, you could
353     define an entry intended for use as a mailing list that looks like this
354     (Warning! Schema made up just for this example):
356         dn: cn=Accounting Staff List, dc=example, dc=com
357         cn: Accounting Staff List
358         o: example.com
359         objectclass: maillist
360         mailacceptinggeneralid: accountingstaff
361         mailacceptinggeneralid: accounting-staff
362         maildrop: mylist-owner
363         maildrop: an-accountant
364         maildrop: some-other-accountant
365         maildrop: this, that, theother
367   * If you use an LDAP map for lookups other than aliases, you may have to make
368     sure the lookup makes sense. In the case of virtual lookups, maildrops
369     other than mail addresses are pretty useless, because Postfix can't know
370     how to set the ownership for program or file delivery. Your q\bqu\bue\ber\bry\by_\b_f\bfi\bil\blt\bte\ber\br
371     should probably look something like this:
373         query_filter = (&(mailacceptinggeneralid=%s)(!(|(maildrop="*|*")
374         (maildrop="*:*")(maildrop="*/*"))))
376   * And for that matter, even for aliases, you may not want users able to
377     specify their maildrops as programs, includes, etc. This might be
378     particularly pertinent on a "sealed" server where they don't have local
379     UNIX accounts, but exist only in LDAP and Cyrus. You might allow the fun
380     stuff only for directory entries owned by an administrative account, so
381     that if the object had a program as its maildrop and weren't owned by
382     "cn=root" it wouldn't be returned as a valid local user. This will require
383     some thought on your part to implement safely, considering the
384     ramifications of this type of delivery. You may decide it's not worth the
385     bother to allow any of that nonsense in LDAP lookups, ban it in the
386     q\bqu\bue\ber\bry\by_\b_f\bfi\bil\blt\bte\ber\br, and keep things like majordomo lists in local alias
387     databases.
389         query_filter = (&(mailacceptinggeneralid=%s)(!(|(maildrop="*|*")
390         (maildrop="*:*")(maildrop="*/*"))(owner=cn=root, dc=your, dc=com)))
392   * LDAP lookups are slower than local DB or DBM lookups. For most sites they
393     won't be a bottleneck, but it's a good idea to know how to tune your
394     directory service.
396   * Multiple LDAP maps share the same LDAP connection if they differ only in
397     their query related parameters: base, scope, query_filter, and so on. To
398     take advantage of this, avoid spurious differences in the definitions of
399     LDAP maps: host selection order, version, bind, tls parameters, ... should
400     be the same for multiple maps whenever possible.
402 F\bFe\bee\bed\bdb\bba\bac\bck\bk
404 If you have questions, send them to postfix-users@postfix.org. Please include
405 relevant information about your Postfix setup: LDAP-related output from
406 postconf, which LDAP libraries you built with, and which directory server
407 you're using. If your question involves your directory contents, please include
408 the applicable bits of some directory entries.
410 C\bCr\bre\bed\bdi\bit\bts\bs
412   * Manuel Guesdon: Spotted a bug with the timeout attribute.
413   * John Hensley: Multiple LDAP sources with more configurable attributes.
414   * Carsten Hoeger: Search scope handling.
415   * LaMont Jones: Domain restriction, URL and DN searches, multiple result
416     attributes.
417   * Mike Mattice: Alias dereferencing control.
418   * Hery Rakotoarisoa: Patches for LDAPv3 updating.
419   * Prabhat K Singh: Wrote the initial Postfix LDAP lookups and connection
420     caching.
421   * Keith Stevenson: RFC 2254 escaping in queries.
422   * Samuel Tardieu: Noticed that searches could include wildcards, prompting
423     the work on RFC 2254 escaping in queries. Spotted a bug in binding.
424   * Sami Haahtinen: Referral chasing and v3 support.
425   * Victor Duchovni: ldap_bind() timeout. With fixes from LaMont Jones:
426     OpenLDAP cache deprecation. Limits on recursion, expansion and search
427     results size. LDAP connection sharing for maps differing only in the query
428     parameters.
429   * Liviu Daia: Support for SSL/STARTTLS. Support for storing map definitions
430     in external files (ldap:/path/ldap.cf) needed to securely store passwords
431     for plain auth.
432   * Liviu Daia revised the configuration interface and added the main.cf
433     configuration feature.
434   * Liviu Daia with further refinements from Jose Luis Tallon and Victor
435     Duchovni developed the common query, result_format, domain and
436     expansion_limit interface for LDAP, MySQL and PosgreSQL.
437   * Gunnar Wrobel provided a first implementation of a feature to limit LDAP
438     search results to leaf nodes only. Victor generalized this into the Postfix
439     2.4 "leaf_result_attribute" feature.
441 And of course Wietse.