]> git.sur5r.net Git - openldap/blob - doc/man/man5/slapd.access.5
d448f83e9f170322226b1ec35c0575da805d278c
[openldap] / doc / man / man5 / slapd.access.5
1 .TH SLAPD.ACCESS 5 "RELEASEDATE" "OpenLDAP LDVERSION"
2 .\" Copyright 1998-2004 The OpenLDAP Foundation All Rights Reserved.
3 .\" Copying restrictions apply.  See COPYRIGHT/LICENSE.
4 .SH NAME
5 slapd.access \- access configuration for slapd, the stand-alone LDAP daemon
6 .SH SYNOPSIS
7 ETCDIR/slapd.conf
8 .SH DESCRIPTION
9 The 
10 .BR slapd.conf (5)
11 file contains configuration information for the
12 .BR slapd (8)
13 daemon. This configuration file is also used by the
14 .BR slurpd (8)
15 replication daemon and by the SLAPD tools
16 .BR slapacl (8),
17 .BR slapadd (8),
18 .BR slapauth (8),
19 .BR slapcat (8),
20 .BR slapdn (8),
21 .BR slapindex (8),
22 and
23 .BR slaptest (8).
24 .LP
25 The
26 .B slapd.conf
27 file consists of a series of global configuration options that apply to
28 .B slapd
29 as a whole (including all backends), followed by zero or more database
30 backend definitions that contain information specific to a backend
31 instance.
32 .LP
33 The general format of
34 .B slapd.conf
35 is as follows:
36 .LP
37 .nf
38     # comment - these options apply to every database
39     <global configuration options>
40     # first database definition & configuration options
41     database    <backend 1 type>
42     <configuration options specific to backend 1>
43     # subsequent database definitions & configuration options
44     ...
45 .fi
46 .LP
47 Both the global configuration and each backend-specific section can
48 contain access information.  Backend-specific access control
49 directives are used for those entries that belong to the backend,
50 according to their naming context.  In case no access control
51 directives are defined for a backend or those which are defined are
52 not applicable, the directives from the global configuration section
53 are then used.
54 .LP
55 For entries not held in any backend (such as a root DSE), the
56 directives of the first backend (and any global directives) are
57 used.
58 .LP
59 Arguments that should be replaced by actual text are shown in
60 brackets <>.
61 .SH THE ACCESS DIRECTIVE
62 The structure of the access control directives is
63 .TP
64 .B access to <what> "[ by <who> <access> [ <control> ] ]+"
65 Grant access (specified by 
66 .BR <access> ) 
67 to a set of entries and/or attributes (specified by 
68 .BR <what> ) 
69 by one or more requestors (specified by 
70 .BR <who> ).
71 .SH THE <WHAT> FIELD
72 The field
73 .BR <what>
74 specifies the entity the access control directive applies to.
75 It can have the forms
76 .LP
77 .nf
78         [dn[.<dnstyle>]=]<dnpattern>
79         filter=<ldapfilter>
80         attrs=<attrlist>[ val[.<style>]=<attrval>]
81 .fi
82 .LP
83 The statement
84 .B dn=<dnpattern>
85 selects the entries based on their naming context.
86 The 
87 .B dn=
88 part is optional
89 The
90 .B <dnpattern>
91 is a string representation of the entry's DN.
92 The wildcard
93 .B *
94 stands for all the entries, and it is implied if no
95 .B dn
96 form is given.
97 .LP
98 The 
99 .B <dnstyle> 
100 is also optional; however, it is recommended to specify both the 
101 .B dn=
102 and the
103 .B <dnstyle>
104 to avoid ambiguities.
105 .B Base 
106 (synonym of
107 .BR baseObject ),
108 the default,
109 or
110 .B exact 
111 (an alias of 
112 .BR base )
113 indicates the entry whose DN is equal to the
114 .BR <dnpattern> ;
115 .B one
116 (synonym of
117 .BR onelevel )
118 indicates all the entries immediately below the
119 .BR <dnpattern> ,
120 .B sub
121 (synonym of
122 .BR subtree )
123 indicates all entries in the subtree at the
124 .BR <dnpattern> ,
125 .B children
126 indicates all the entries below (subordinate to) the 
127 .BR <dnpattern> .
128 .LP
129 If the
130 .B <dnstyle>
131 qualifier is
132 .BR regex ,
133 then 
134 .B <dnpattern>
135 is a regular expression pattern,
136 as detailed in
137 .BR regex (7),
138 matching a normalized string representation of the entry's DN.
139 The regex form of the pattern does not (yet) support UTF-8.
140 .LP
141 The statement
142 .B filter=<ldapfilter>
143 selects the entries based on a valid LDAP filter as described in RFC 2254.
144 A filter of
145 .B (objectClass=*)
146 is implied if no
147 .B filter
148 form is given.
149 .LP
150 The statement
151 .B attrs=<attrlist>
152 selects the attributes the access control rule applies to.
153 It is a comma-separated list of attribute types, plus the special names
154 .BR entry ,
155 indicating access to the entry itself, and
156 .BR children ,
157 indicating access to the entry's children. ObjectClass names may also
158 be specified in this list, which will affect all the attributes that
159 are required and/or allowed by that objectClass.
160 Actually, names in 
161 .B <attrlist>
162 that are prefixed by
163 .B @
164 are directly treated as objectClass names.  A name prefixed by
165 .B !
166 is also treated as an objectClass, but in this case the access rule
167 affects the attributes that are not required nor allowed 
168 by that objectClass.
169 If no
170 .B attrs
171 form is given, 
172 .B attrs=@extensibleObject
173 is implied, i.e. all attributes are addressed.
174 .LP
175 Using the form
176 .B attrs=<attr> val[.<style>]=<attrval>
177 specifies access to a particular value of a single attribute.
178 In this case, only a single attribute type may be given. A value
179 .B <style>
180 of
181 .B exact
182 (the default) uses the attribute's equality matching rule to compare the
183 value. If the value
184 .B <style>
185 is
186 .BR regex ,
187 the provided value is used as a regular expression pattern.
188 If the attribute has DN syntax, the value
189 .B <style>
190 can be any of
191 .BR base ,
192 .BR onelevel ,
193 .B subtree
194 or
195 .BR children ,
196 resulting in base, onelevel, subtree or children match, respectively.
197 .LP
198 The dn, filter, and attrs statements are additive; they can be used in sequence 
199 to select entities the access rule applies to based on naming context,
200 value and attribute type simultaneously.
201 .SH THE <WHO> FIELD
202 The field
203 .B <who>
204 indicates whom the access rules apply to.
205 Multiple 
206 .B <who>
207 statements can appear in an access control statement, indicating the
208 different access privileges to the same resource that apply to different
209 accessee.
210 It can have the forms
211 .LP
212 .nf
213         *
214         anonymous
215         users
216         self
217
218         dn[.<dnstyle>[,<modifier>]]=<DN>
219         dnattr=<attrname>
220         group[/<objectclass>[/<attrname>]]
221                 [.<groupstyle>]=<group>
222         peername[.<peernamestyle>]=<peername>
223         sockname[.<style>]=<sockname>
224         domain[.<domainstyle>[,<modifier>]]=<domain>
225         sockurl[.<style>]=<sockurl>
226         set[.<setstyle>]=<pattern>
227
228         ssf=<n>
229         transport_ssf=<n>
230         tls_ssf=<n>
231         sasl_ssf=<n>
232
233         aci=<attrname>
234 .fi
235 .LP
236 with
237 .LP
238 .nf
239         <dnstyle>={{exact|base}|regex|sub(tree)|one(level)|children}
240         <groupstyle>={exact|expand}
241         <style>={exact|regex|expand}
242         <peernamestyle>={<style>|ip|path}
243         <domainstyle>={exact|regex|sub(tree)}
244         <setstyle>={exact|regex}
245         <modifier>={expand}
246 .fi
247 .LP
248 They may be specified in combination.
249 .LP
250 .nf
251 .fi
252 .LP
253 The wildcard
254 .B *
255 refers to everybody.
256 .LP
257 The keyword
258 .B anonymous
259 means access is granted to unauthenticated clients; it is mostly used 
260 to limit access to authentication resources (e.g. the
261 .B userPassword
262 attribute) to unauthenticated clients for authentication purposes.
263 .LP
264 The keyword
265 .B users
266 means access is granted to authenticated clients.
267 .LP
268 The keyword
269 .B self
270 means access to an entry is allowed to the entry itself (e.g. the entry
271 being accessed and the requesting entry must be the same).
272 .LP
273 The statement
274 .B dn=<DN>
275 means that access is granted to the matching DN.
276 The optional style qualifier
277 .B dnstyle
278 allows the same choices of the dn form of the
279 .B <what>
280 field.  In addition, the
281 .B regex
282 style can exploit substring substitution of submatches in the
283 .B <what>
284 dn.regex clause by using the form
285 .BR $<digit> ,
286 with 
287 .B digit
288 ranging from 1 to 9.
289 Since the dollar character is used to indicate a substring replacement,
290 the dollar character that is used to indicate match up to the end of
291 the string must be escaped by a second dollar character, e.g.
292 .LP
293 .nf
294     access to dn.regex="^(.+,)?uid=([^,]+),dc=[^,]+,dc=com$"
295         by dn.regex="^uid=$2,dc=[^,]+,dc=com$$" write
296 .fi
297 .LP
298 The style qualifier
299 allows an optional
300 .BR modifier .
301 At present, the only type allowed is 
302 .BR expand ,
303 which causes substring substitution of submatches to take place
304 even if 
305 .B dnstyle
306 is not 
307 .BR regex .
308 Note that the 
309 .B regex 
310 dnstyle in the above example may be of use only if the 
311 .B by
312 clause needs to be a regex; otherwise, if the
313 value of the second (from the right)
314 .B dc=
315 portion of the DN in the above example were fixed, the form
316 .LP
317 .nf
318     access to dn.regex="^(.+,)?uid=([^,]+),dc=example,dc=com$"
319         by dn.exact,expand="uid=$2,dc=example,dc=com" write
320 .fi
321 .LP
322 could be used; if it had to match the value in the 
323 .B what
324 clause, the form
325 .LP
326 .nf
327     access to dn.regex="^(.+,)?uid=([^,]+),dc=([^,]+),dc=com$"
328         by dn.exact,expand="uid=$2,dc=$3,dc=com" write
329 .fi
330 .LP
331 could be used.
332 .LP
333 It is perfectly useless to give any access privileges to a DN 
334 that exactly matches the
335 .B rootdn
336 of the database the ACLs apply to, because it implicitly
337 possesses write privileges for the entire tree of that database.
338 Actually, access control is bypassed for the
339 .BR rootdn ,
340 to solve the intrinsic chicken-and-egg problem.
341 .LP
342 The statement
343 .B dnattr=<attrname>
344 means that access is granted to requests whose DN is listed in the
345 entry being accessed under the 
346 .B <attrname>
347 attribute.
348 .LP
349 The statement
350 .B group=<group>
351 means that access is granted to requests whose DN is listed
352 in the group entry whose DN is given by
353 .BR <group> .
354 The optional parameters
355 .B <objectclass>
356 and
357 .B <attrname>
358 define the objectClass and the member attributeType of the group entry.
359 The optional style qualifier
360 .B <style>
361 can be
362 .BR expand ,
363 which means that
364 .B <group>
365 will be expanded as a replacement string (but not as a regular expression)
366 according to regex (7), and
367 .BR exact ,
368 which means that exact match will be used.
369 .LP
370 For static groups, the specified attributeType must have
371 .B DistinguishedName
372 or
373 .B NameAndOptionalUID
374 syntax. For dynamic groups the attributeType must
375 be a subtype of the
376 .B labeledURI
377 attributeType. Only LDAP URIs of the form
378 .B ldap:///<base>??<scope>?<filter>
379 will be evaluated in a dynamic group, by searching the local server only.
380 .LP
381 The statements
382 .BR peername=<peername> ,
383 .BR sockname=<sockname> ,
384 .BR domain=<domain> ,
385 and
386 .BR sockurl=<sockurl>
387 mean that the contacting host IP (in the form 
388 .BR "IP=<ip>:<port>" )
389 or the contacting host named pipe file name (in the form
390 .B "PATH=<path>"
391 if connecting through a named pipe) for
392 .BR peername ,
393 the named pipe file name for
394 .BR sockname ,
395 the contacting host name for
396 .BR domain ,
397 and the contacting URL for
398 .BR sockurl
399 are compared against
400 .B pattern
401 to determine access.
402 The same
403 .B style
404 rules for pattern match described for the
405 .B group
406 case apply, plus the
407 .B regex
408 style, which implies submatch
409 .B expand
410 and
411 .BR regex (7)
412 match of the corresponding connection parameters.
413 The
414 .B exact
415 style of the
416 .BR peername
417 clause (the default) implies a case-exact match on the client's
418 .BR IP , 
419 including the
420 .B "IP="
421 prefix and the trailing
422 .BR ":<port>" , 
423 or the client's 
424 .BR path ,
425 including the
426 .B "PATH="
427 prefix if connecting through a named pipe.
428 The special
429 .B ip
430 style interprets the pattern as 
431 .BR <peername>=<ip>[%<mask>][{<n>}] ,
432 where
433 .B <ip>
434 and 
435 .B <mask>
436 are dotted digit representations of the IP and the mask, while
437 .BR <n> ,
438 delimited by curly brackets, is an optional port.
439 When checking access privileges, the IP portion of the
440 .BR peername 
441 is extracted, eliminating the
442 .B "IP="
443 prefix and the
444 .B ":<port>"
445 part, and it is compared against the
446 .B <ip>
447 portion of the pattern after masking with
448 .BR <mask> .
449 As an example, 
450 .B peername.ip=127.0.0.1
451 allows connections only from localhost,
452 .B peername.ip=192.168.1.0%255.255.255.0 
453 allows connections from any IP in the 192.168.1 class C domain, and
454 .B peername.ip=192.168.1.16%255.255.255.240{9009}
455 allows connections from any IP in the 192.168.1.[16-31] range 
456 of the same domain, only if port 9009 is used.
457 The special 
458 .B path
459 style eliminates the 
460 .B "PATH="
461 prefix from the 
462 .B peername
463 when connecting through a named pipe, and performs an exact match 
464 on the given pattern.
465 The
466 .BR domain 
467 clause also allows the
468 .B subtree
469 style, which succeeds when a fully qualified name exactly matches the
470 .BR domain
471 pattern, or its trailing part, after a 
472 .BR dot ,
473 exactly matches the 
474 .BR domain
475 pattern.
476 The 
477 .B expand
478 style is allowed, implying an
479 .B exact 
480 match with submatch expansion; the use of 
481 .B expand 
482 as a style modifier is considered more appropriate.
483 As an example,
484 .B domain.subtree=example.com
485 will match www.example.com, but will not match www.anotherexample.com.
486 The
487 .B domain
488 of the contacting host is determined by performing a DNS reverse lookup.
489 As this lookup can easily be spoofed, use of the
490 .B domain
491 statement is strongly discouraged.  By default, reverse lookups are disabled.
492 The optional
493 .B domainstyle
494 qualifier of the
495 .B domain
496 clause allows a
497 .B modifier
498 option; the only value currently supported is
499 .BR expand ,
500 which causes substring substitution of submatches to take place even if
501 the 
502 .B domainstyle
503 is not 
504 .BR regex ,
505 much like the analogous usage in 
506 .B dn
507 clause.
508 .LP
509 The statement
510 .B set=<pattern>
511 is undocumented yet.
512 .LP
513 The statement
514 .B aci=<attrname>
515 means that the access control is determined by the values in the
516 .B attrname
517 of the entry itself.
518 ACIs are experimental; they must be enabled at compile time.
519 .LP
520 The statements
521 .BR ssf=<n> ,
522 .BR transport_ssf=<n> ,
523 .BR tls_ssf=<n> ,
524 and
525 .BR sasl_ssf=<n>
526 set the required Security Strength Factor (ssf) required to grant access.
527 .SH THE <ACCESS> FIELD
528 The field
529 .B <access> ::= [self]{<level>|<priv>}
530 determines the access level or the specific access privileges the
531 .B who 
532 field will have.
533 Its component are defined as
534 .LP
535 .nf
536         <level> ::= none|auth|compare|search|read|write
537         <priv> ::= {=|+|-}{w|r|s|c|x|0}+
538 .fi
539 .LP
540 The modifier
541 .B self
542 allows special operations like having a certain access level or privilege
543 only in case the operation involves the name of the user that's requesting
544 the access.
545 It implies the user that requests access is bound.
546 An example is the
547 .B selfwrite
548 access to the member attribute of a group, which allows one to add/delete
549 its own DN from the member list of a group, without affecting other members.
550 .LP
551 The 
552 .B level 
553 access model relies on an incremental interpretation of the access
554 privileges.
555 The possible levels are
556 .BR none ,
557 .BR auth ,
558 .BR compare ,
559 .BR search ,
560 .BR read ,
561 and
562 .BR write .
563 Each access level implies all the preceding ones, thus 
564 .B write
565 access will imply all accesses.
566 While
567 .B none
568 is trivial, 
569 .B auth
570 access means that one is allowed access to an attribute to perform
571 authentication/authorization operations (e.g.
572 .BR bind )
573 with no other access.
574 This is useful to grant unauthenticated clients the least possible 
575 access level to critical resources, like passwords.
576 .LP
577 The
578 .B priv
579 access model relies on the explicit setting of access privileges
580 for each clause.
581 The
582 .B =
583 sign resets previously defined accesses; as a consequence, the final 
584 access privileges will be only those defined by the clause.
585 The 
586 .B +
587 and
588 .B -
589 signs add/remove access privileges to the existing ones.
590 The privileges are
591 .B w
592 for write,
593 .B r
594 for read,
595 .B s 
596 for search,
597 .B c 
598 for compare, and
599 .B x
600 for authentication.
601 More than one of the above privileges can be added in one statement.
602 .B 0
603 indicates no privileges and is used only by itself (e.g., +0).
604 .LP
605 The optional field
606 .B <control>
607 controls the flow of access rule application.
608 It can have the forms
609 .LP
610 .nf
611         stop
612         continue
613         break
614 .fi
615 .LP
616 where
617 .BR stop ,
618 the default, means access checking stops in case of match.
619 The other two forms are used to keep on processing access clauses.
620 In detail, the
621 .B continue
622 form allows for other 
623 .B <who>
624 clauses in the same 
625 .B <access>
626 clause to be considered, so that they may result in incrementally altering
627 the privileges, while the
628 .B break
629 form allows for other
630 .B <access>
631 clauses that match the same target to be processed.
632 Consider the (silly) example
633 .LP
634 .nf
635         access to dn.subtree="dc=example,dc=com" attrs=cn
636                 by * =cs break
637
638         access to dn.subtree="ou=People,dc=example,dc=com"
639                 by * +r
640 .fi
641 .LP
642 which allows search and compare privileges to everybody under
643 the "dc=example,dc=com" tree, with the second rule allowing
644 also read in the "ou=People" subtree,
645 or the (even more silly) example
646 .LP
647 .nf
648         access to dn.subtree="dc=example,dc=com" attrs=cn
649                 by * =cs continue
650                 by users +r
651 .fi
652 .LP
653 which grants everybody search and compare privileges, and adds read
654 privileges to authenticated clients.
655 .SH OPERATION REQUIREMENTS
656 Operations require different privileges on different portions of entries.
657 The following summary applies to primary database backends such as
658 the LDBM, BDB, and HDB backends.   Requirements for other backends may
659 (and often do) differ.
660 .LP
661 The
662 .B add
663 operation requires
664 .B write (=w)
665 privileges on the pseudo-attribute 
666 .B entry
667 of the entry being added, and 
668 .B write (=w)
669 privileges on the pseudo-attribute
670 .B children
671 of the entry's parent.
672 .LP
673 The 
674 .B bind
675 operation, when credentials are stored in the directory, requires 
676 .B auth (=x)
677 privileges on the attribute the credentials are stored in (usually
678 .BR userPassword ).
679 .LP
680 The
681 .B compare
682 operation requires 
683 .B compare (=c)
684 privileges on the attribute that is being compared.
685 .LP
686 The
687 .B delete
688 operation requires
689 .B write (=w)
690 privileges on the pseudo-attribute
691 .B entry 
692 of the entry being deleted, and
693 .B write (=w)
694 privileges on the
695 .B children
696 pseudo-attribute of the entry's parent.
697 .LP
698 The
699 .B modify
700 operation requires 
701 .B write (=w)
702 privileges on the attibutes being modified.
703 .LP
704 The
705 .B modrdn
706 operation requires
707 .B write (=w)
708 privileges on the pseudo-attribute
709 .B entry
710 of the entry whose relative DN is being modified,
711 .B write (=w)
712 privileges on the pseudo-attribute
713 .B children
714 of the old and new entry's parents, and
715 .B write (=w)
716 privileges on the attributes that are present in the new relative DN.
717 .B Write (=w)
718 privileges are also required on the attributes that are present 
719 in the old relative DN if 
720 .B deleteoldrdn
721 is set to 1.
722 .LP
723 The
724 .B search
725 operation, for each entry, requires
726 .B search (=s)
727 privileges on the attributes that are defined in the filter.
728 Then, the resulting entries are tested for 
729 .B read (=r)
730 privileges on the pseudo-attribute
731 .B entry
732 (for read access to the entry itself)
733 and for
734 .B read (=r)
735 access on each value of each attribute that is requested.
736 Also, for each
737 .B referral
738 object used in generating continuation references, the operation requires
739 .B read (=r)
740 access on the pseudo-attribute
741 .B entry
742 (for read access to the referral object itself),
743 as well as
744 .B read (=r)
745 access to the attribute holding the referral information
746 (generally the
747 .B ref
748 attribute).
749 .LP
750 Some internal operations and some
751 .B controls
752 require specific access privileges.
753 The
754 .B authzID
755 mapping and the 
756 .B proxyAuthz
757 control require
758 .B auth (=x)
759 privileges on all the attributes that are present in the search filter
760 of the URI regexp maps (the right-hand side of the
761 .B authz-regexp
762 directives).
763 .B Auth (=x)
764 privileges are also required on the
765 .B authzTo
766 attribute of the authorizing identity and/or on the 
767 .B authzFrom
768 attribute of the authorized identity.
769 .SH CAVEATS
770 It is strongly recommended to explicitly use the most appropriate
771 .B <dnstyle>
772 in
773 .B <what>
774 and
775 .B <who>
776 clauses, to avoid possible incorrect specifications of the access rules 
777 as well as for performance (avoid unrequired regex matching when an exact
778 match suffices) reasons.
779 .LP
780 An administrator might create a rule of the form:
781 .LP
782 .nf
783         access to dn.regex="dc=example,dc=com"
784                 by ...
785 .fi
786 .LP
787 expecting it to match all entries in the subtree "dc=example,dc=com".
788 However, this rule actually matches any DN which contains anywhere
789 the substring "dc=example,dc=com".  That is, the rule matches both
790 "uid=joe,dc=example,dc=com" and "dc=example,dc=com,uid=joe".
791 .LP
792 To match the desired subtree, the rule would be more precisely
793 written:
794 .LP
795 .nf
796         access to dn.regex="^(.+,)?dc=example,dc=com$"
797                 by ...
798 .fi
799 .LP
800 For performance reasons, it would be better to use the subtree style.
801 .LP
802 .nf
803         access to dn.subtree="dc=example,dc=com"
804                 by ...
805 .fi
806 .LP
807 When writing submatch rules, it may be convenient to avoid unnecessary
808 .B regex
809 .B <dnstyle>
810 use; for instance, to allow access to the subtree of the user 
811 that matches the
812 .B what
813 clause, one could use
814 .LP
815 .nf
816         access to dn.regex="^(.+,)?uid=([^,]+),dc=example,dc=com$"
817                 by dn.regex="^uid=$2,dc=example,dc=com$$" write
818                 by ...
819 .fi
820 .LP
821 However, since all that is required in the 
822 .B by
823 clause is substring expansion, a more efficient solution is
824 .LP
825 .nf
826         access to dn.regex="^(.+,)?uid=([^,]+),dc=example,dc=com$"
827                 by dn.exact,expand="uid=$2,dc=example,dc=com" write
828                 by ...
829 .fi
830 .LP
831 In fact, while a
832 .B <dnstyle>
833 of
834 .B regex
835 implies substring expansion, 
836 .BR exact ,
837 as well as all the other DN specific
838 .B <dnstyle>
839 values, does not, so it must be explicitly requested.
840 .LP
841 .SH FILES
842 .TP
843 ETCDIR/slapd.conf
844 default slapd configuration file
845 .SH SEE ALSO
846 .BR slapd (8),
847 .BR slapacl (8),
848 .LP
849 "OpenLDAP Administrator's Guide" (http://www.OpenLDAP.org/doc/admin/)
850 .SH ACKNOWLEDGEMENTS
851 .B OpenLDAP
852 is developed and maintained by The OpenLDAP Project (http://www.openldap.org/).
853 .B OpenLDAP
854 is derived from University of Michigan LDAP 3.3 Release.