]> git.sur5r.net Git - openldap/blob - doc/man/man5/slapo-ppolicy.5
Fix typos
[openldap] / doc / man / man5 / slapo-ppolicy.5
1 .\" $OpenLDAP$
2 .\" Copyright 2004-2005 The OpenLDAP Foundation All Rights Reserved.
3 .\" Copying restrictions apply.  See COPYRIGHT/LICENSE.
4 .TH SLAPO_PPOLICY 5 "RELEASEDATE" "OpenLDAP LDVERSION"
5 .SH NAME
6 slapo-ppolicy \- Password Policy overlay
7 .SH SYNOPSIS
8 ETCDIR/slapd.conf
9 .SH DESCRIPTION
10 .LP
11 The 
12 .B ppolicy
13 overlay
14 is an implementation of the most recent IETF Password
15 Policy proposal for LDAP.   When instantiated, it intercepts,
16 decodes and applies specific password policy controls to overall
17 use of a backend database, changes to user password fields, etc.
18 .P
19 The overlay provides a variety of password control mechanisms.  They
20 include password aging--both minimum and maximum ages, password
21 reuse and duplication control, account time-outs, mandatory password
22 resets, acceptable password content, and even grace logins.
23 Different groups of users may be associated with different password
24 policies, and there is no limit to the number of password policies
25 that may be created.
26
27 .SH CONFIGURATION
28 These 
29 .B slapd.conf
30 configuration options apply to the ppolicy overlay. They should appear
31 after the
32 .B overlay
33 directive.
34 .TP
35 .B ppolicy_default <policyDN>
36 Specify the DN of the pwdPolicy object to use when no specific policy is
37 set on a given user's entry. If there is no specific policy for an entry
38 and no default is given, then no policies will be enforced.
39 .TP
40 .B ppolicy_hash_cleartext
41 Specify that cleartext passwords present in Add and Modify requests should
42 be hashed before being stored in the database. This violates the X.500
43 information model, but may be needed to compensate for LDAP clients that
44 don't use the Password Modify exop to manage passwords.
45 .TP
46 .B ppolicy_use_lockout
47 A client will always receive an LDAP
48 .B InvalidCredentials
49 response when
50 Binding to a locked account. By default, when a Password Policy control
51 was provided on the Bind request, a Password Policy response will be
52 included with no special error code set. This option changes the
53 Password Policy response to include the
54 .B AccountLocked
55 error code. Note
56 that sending the
57 .B AccountLocked
58 error code provides useful information
59 to an attacker; sites that are sensitive to security issues should not
60 enable this option.
61
62 .SH OBJECT CLASS
63 The 
64 .B ppolicy
65 overlay depends on the
66 .B pwdPolicy
67 object class.  The definition of that class is as follows:
68 .LP
69 .RS 4
70 (  1.3.6.1.4.1.42.2.27.8.2.1
71     NAME 'pwdPolicy'
72     AUXILIARY
73     SUP top
74     MUST ( pwdAttribute )
75     MAY (
76         pwdMinAge $ pwdMaxAge $ pwdInHistory $
77         pwdCheckSyntax $ pwdMinLength $
78         pwdExpireWarning $ pwdGraceAuthnLimit $
79         pwdLockout $ pwdLockoutDuration $
80         pwdMaxFailure $ pwdFailureCountInterval $
81         pwdMustChange $ pwdAllowUserChange $
82         pwdSafeModify ) )
83 .RE
84
85 This implementation also provides an additional
86 .B pwdPolicyChecker
87 objectclass, used for password quality checking (see below).
88 .LP
89 .RS 4
90 (  1.3.6.1.4.1.4754.2.99.1
91     NAME 'pwdPolicyChecker'
92     AUXILIARY
93     SUP top
94     MAY ( pwdCheckModule ) )
95 .RE
96 .P
97 Every account that should be subject to password policy control should
98 have a
99 .B
100 pwdPolicySubentry
101 attribute containing the DN of a valid
102 .B pwdPolicy
103 entry, or they can simply use the configured default.
104 In this way different users may be managed according to
105 different policies.
106
107 .SH OBJECT CLASS ATTRIBUTES
108 .P
109 Each one of the sections below details the meaning and use of a particular
110 attribute of this
111 .B pwdPolicy
112 object class.
113 .P
114
115 .B pwdAttribute
116 .P
117 This attribute contains the name of the attribute to which the password
118 policy is applied. For example, the password policy may be applied
119 to the
120 .B userPassword
121 attribute.
122 .P
123 Note: in this implementation, the only
124 value accepted for
125 .B pwdAttribute
126 is
127 .RI " userPassword ".
128 .LP
129 .RS 4
130 (  1.3.6.1.4.1.42.2.27.8.1.1
131    NAME 'pwdAttribute'
132    EQUALITY objectIdentifierMatch
133    SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )
134 .RE
135
136 .B pwdMinAge
137 .P
138 This attribute contains the number of seconds that must elapse
139 between modifications allowed to the password. If this attribute
140 is not present, zero seconds is assumed (i.e. the password may be
141 modified whenever and however often is desired).
142 .LP
143 .RS 4
144 (  1.3.6.1.4.1.42.2.27.8.1.2
145    NAME 'pwdMinAge'
146    EQUALITY integerMatch
147    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
148    SINGLE-VALUE )
149 .RE
150
151 .B pwdMaxAge
152 .P
153 This attribute contains the number of seconds after which a modified
154 password will expire.  If this attribute is not present, or if its
155 value is zero (0), then passwords will not expire.
156 .LP
157 .RS 4
158 (  1.3.6.1.4.1.42.2.27.8.1.3
159    NAME 'pwdMaxAge'
160    EQUALITY integerMatch
161    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
162    SINGLE-VALUE )
163 .RE
164
165 .B pwdInHistory
166 .P
167 This attribute is used to specify the maximum number of used
168 passwords that will be stored in the
169 .B pwdHistory
170 attribute.  If the
171 .B pwdInHistory
172 attribute is not present, or if its value is
173 zero (0), used passwords will not be stored in
174 .B pwdHistory
175 and thus any previously-used password may be reused.
176 .LP
177 .RS 4
178 (  1.3.6.1.4.1.42.2.27.8.1.4
179    NAME 'pwdInHistory'
180    EQUALITY integerMatch
181    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
182    SINGLE-VALUE )
183 .RE
184
185 .B pwdCheckQuality
186 .P
187 This attribute indicates if and how password syntax will be checked
188 while a password is being modified or added. If this attribute is
189 not present, or its value is zero (0), no syntax checking will be
190 done. If its value is one (1), the server will check the syntax,
191 and if the server is unable to check the syntax,
192 whether due to a client-side hashed password or some other reason,
193 it will be
194 accepted. If its value is two (2), the server will check the syntax,
195 and if the server is unable to check the syntax it will return an
196 error refusing the password.
197 .LP
198 .RS 4
199 (  1.3.6.1.4.1.42.2.27.8.1.5
200    NAME 'pwdCheckQuality'
201    EQUALITY integerMatch
202    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
203    SINGLE-VALUE )
204 .RE
205
206 .B pwdMinLength
207 .P
208 When syntax checking is enabled
209 (see also the
210 .B pwdCheckSyntax
211 attribute), this attribute contains the minimum
212 number of characters that will be accepted in a password. If this
213 attribute is not present, minimum password length is not
214 enforced. If the server is unable to check the length of the password,
215 whether due to a client-side hashed password or some other reason,
216 the server will, depending on the
217 value of
218 .BR pwdCheckSyntax ,
219 either accept the password
220 without checking it (if
221 .B pwdCheckSyntax
222 is zero (0) or one (1)) or refuse it (if
223 .B pwdCheckSyntax
224 is two (2)).
225 .LP
226 .RS 4
227 (  1.3.6.1.4.1.42.2.27.8.1.6
228    NAME 'pwdMinLength'
229    EQUALITY integerMatch
230    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
231    SINGLE-VALUE )
232 .RE
233
234 .B pwdExpireWarning
235 .P
236 This attribute contains the maximum number of seconds before a
237 password is due to expire that expiration warning messages will be
238 returned to a user who is authenticating to the directory.
239 If this attribute is not
240 present, or if the value is zero (0), no warnings will be sent.
241 .LP
242 .RS 4
243 (  1.3.6.1.4.1.42.2.27.8.1.7
244    NAME 'pwdExpireWarning'
245    EQUALITY integerMatch
246    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
247    SINGLE-VALUE )
248 .RE
249
250 .B pwdGraceAuthnLimit
251 .P
252 This attribute contains the number of times that an expired password
253 may be used to authenticate a user to the directory. If this
254 attribute is not present or if its value is zero (0), users with
255 expired passwords will not be allowed to authenticate to the
256 directory.
257 .LP
258 .RS 4
259 (  1.3.6.1.4.1.42.2.27.8.1.8
260    NAME 'pwdGraceAuthnLimit'
261    EQUALITY integerMatch
262    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
263    SINGLE-VALUE )
264 .RE
265
266 .B pwdLockout
267 .P
268 This attribute specifies the action that should be taken
269 by the directory when a user has made a number of failed attempts
270 to authenticate to the directory.  If
271 .B pwdLockout
272 is set (its value is "TRUE"), the user will not be allowed to
273 attempt to authenticate to the directory after there have been a
274 specified number of consecutive failed bind attempts.  The maximum
275 number of consecutive failed bind attempts allowed is specified by
276 the
277 .B pwdMaxFailure
278 attribute.  If
279 .B pwdLockout
280 is not present, or if its value is "FALSE", the password may be
281 used to authenticate no matter how many consecutive failed bind
282 attempts have been made.
283 .LP
284 .RS 4
285 (  1.3.6.1.4.1.42.2.27.8.1.9
286    NAME 'pwdLockout'
287    EQUALITY booleanMatch
288    SYNTAX 1.3.6.1.4.1.1466.115.121.1.7
289    SINGLE-VALUE )
290 .RE
291
292 .B pwdLockoutDuration
293 .P
294 This attribute contains the number of seconds during
295 which the password cannot be used to authenticate the
296 user to the directory due to too many consecutive failed
297 bind attempts.
298 (See also
299 .B pwdLockout
300 and
301 .BR pwdMaxFailure .)
302 If
303 .B pwdLockoutDuration
304 is not present, or if its value is zero (0), the password
305 cannot be used to authenticate the user to the directory
306 again until it is reset by an administrator.
307 .LP
308 .RS 4
309 (  1.3.6.1.4.1.42.2.27.8.1.10
310    NAME 'pwdLockoutDuration'
311    EQUALITY integerMatch
312    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
313    SINGLE-VALUE )
314 .RE
315
316 .B pwdMaxFailure
317 .P
318 This attribute contains the number of consecutive failed bind
319 attempts after which the password may not be used to authenticate
320 a user to the directory.
321 If
322 .B pwdMaxFailure
323 is not present, or its value is zero (0), then a user will
324 be allowed to continue to attempt to authenticate to
325 the directory, no matter how many consecutive failed 
326 bind attempts have occurred with that user's DN.
327 (See also
328 .B pwdLockout
329 and
330 .BR pwdLockoutDuration .)
331 .LP
332 .RS 4
333 (  1.3.6.1.4.1.42.2.27.8.1.11
334    NAME 'pwdMaxFailure'
335    EQUALITY integerMatch
336    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
337    SINGLE-VALUE )
338 .RE
339
340 .B pwdFailureCountInterval
341 .P
342 This attribute contains the number of seconds after which old
343 consecutive failed bind attempts are purged from the failure counter,
344 even though no successful authentication has occurred.
345 If
346 .B pwdFailureCountInterval
347 is not present, or its value is zero (0), the failure
348 counter will only be reset by a successful authentication.
349 .LP
350 .RS 4
351 (  1.3.6.1.4.1.42.2.27.8.1.12
352    NAME 'pwdFailureCountInterval'
353    EQUALITY integerMatch
354    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
355    SINGLE-VALUE )
356 .RE
357
358 .B pwdMustChange
359 .P
360 This attribute specifies whether users must change their passwords
361 when they first bind to the directory after a password is set or
362 reset by the administrator, or not.  If
363 .B pwdMustChange
364 has a value of "TRUE", users must change their passwords when they
365 first bind to the directory after a password is set or reset by
366 the administrator.  If
367 .B pwdMustChange
368 is not present, or its value is "FALSE",
369 users are not required to change their password upon binding after
370 the administrator sets or resets the password.
371 .LP
372 .RS 4
373 (  1.3.6.1.4.1.42.2.27.8.1.13
374   NAME 'pwdMustChange'
375   EQUALITY booleanMatch
376   SYNTAX 1.3.6.1.4.1.1466.115.121.1.7
377   SINGLE-VALUE )
378 .RE
379
380 .B pwdAllowUserChange
381 .P
382 This attribute specifies whether users are allowed to change their own
383 passwords or not.  If
384 .B pwdAllowUserChange
385 is set to "TRUE", or if the attribute is not present, users will be
386 allowed to change their own passwords.  If its value is "FALSE",
387 users will not be allowed to change their own passwords.
388 .LP
389 .RS 4
390 (  1.3.6.1.4.1.42.2.27.8.1.14
391    NAME 'pwdAllowUserChange'
392    EQUALITY booleanMatch
393    SYNTAX 1.3.6.1.4.1.1466.115.121.1.7
394    SINGLE-VALUE )
395 .RE
396
397 .B pwdSafeModify
398 .P
399 This attribute denotes whether the user's existing password must be sent
400 along with their new password when changing a password.  If
401 .B pwdSafeModify
402 is set to "TRUE", the existing password must be sent
403 along with the new password.  If the attribute is not present, or
404 its value is "FALSE", the existing password need not be sent
405 along with the new password.
406 .LP
407 .RS 4
408 (  1.3.6.1.4.1.42.2.27.8.1.15
409    NAME 'pwdSafeModify'
410    EQUALITY booleanMatch
411    SYNTAX 1.3.6.1.4.1.1466.115.121.1.7
412    SINGLE-VALUE )
413 .RE
414
415 .B pwdCheckModule
416 .P
417 This attribute names a user-defined loadable module that must
418 instantiate the check_password() function.  This function
419 will be called to further check a new password if
420 .B pwdCheckQuality
421 is set to one (1) or two (2),
422 after all of the built-in password compliance checks have
423 been passed.  This function will be called according to this
424 function prototype:
425 .RS 4
426 int
427 .I check_password
428 (char *pPasswd, char **ppErrStr, Entry *pEntry);
429 .RE
430 The
431 .B pPasswd
432 parameter contains the clear-text user password, the
433 .B ppErrStr
434 parameter contains a double pointer that allows the function
435 to return human-readable details about any error it encounters.
436 The optional
437 .B pEntry
438 parameter, if non-NULL, carries a pointer to the
439 entry whose password is being checked.
440 If
441 .B ppErrStr
442 is NULL, then 
443 .I funcName
444 must NOT attempt to use it/them.
445 A return value of LDAP_SUCCESS from the called
446 function indicates that the password is ok, any other value
447 indicates that the password is unacceptable.  If the password is
448 unacceptable, the server will return an error to the client, and
449 .B ppErrStr
450 may be used to return a human-readable textual explanation of the
451 error. The error string must be dynamically allocated as it will
452 be free()'d by slapd.
453 .LP
454 .RS 4
455 (  1.3.6.1.4.1.4754.1.99.1
456    NAME 'pwdCheckModule'
457    EQUALITY caseExactIA5Match
458    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
459    SINGLE-VALUE )
460 .RE
461 .P
462 Note: 
463 The user-defined loadable module named by
464 .B pwdCheckModule     
465 must be in
466 .B slapd's
467 standard executable search PATH.
468 .P
469 Note:
470 .B pwdCheckModule
471 is a non-standard extension to the LDAP password
472 policy proposal.
473
474 .SH OPERATIONAL ATTRIBUTES
475 .P
476 The operational attributes used by the
477 .B passwd_policy
478 module are stored in the user's entry.  Most of these attributes
479 are not intended to be changed directly by users; they are there
480 to track user activity.  They have been detailed here so that
481 administrators and users can both understand the workings of
482 the
483 .B ppolicy
484 module.
485
486 .B userPassword
487 .P
488 The
489 .b userPassword
490 attribute is not strictly part of the
491 .B ppolicy
492 module.  It is, however, the attribute that is tracked and controlled
493 by the module.  Please refer to the standard OpenLDAP schema for
494 its definition.
495
496 .B pwdPolicySubentry
497 .P
498 This attribute refers directly to the
499 .B pwdPolicy
500 subentry that is to be used for this particular directory user.
501 If
502 .B pwdPolicySubentry
503 exists, it must contain the DN of a valid
504 .B pwdPolicy
505 object.  If it does not exist, the
506 .B ppolicy
507 module will enforce the default password policy rules on the
508 user associated with this authenticating DN. If there is no
509 default, or the referenced subentry does not exist, then no
510 policy rules will be enforced.
511 .LP
512 .RS 4
513 (  1.3.6.1.4.1.42.2.27.8.1.23
514    NAME 'pwdPolicySubentry'
515    DESC 'The pwdPolicy subentry in effect for
516        this object'
517    EQUALITY distinguishedNameMatch
518    SYNTAX 1.3.6.1.4.1.1466.115.121.1.12
519    SINGLE-VALUE
520    NO-USER-MODIFICATION
521    USAGE directoryOperation)
522 .RE
523
524 .B pwdChangedTime
525 .P
526 This attribute denotes the last time that the entry's password was
527 changed.  This value is used by the password expiration policy to
528 determine whether the password is too old to be allowed to be used
529 for user authentication.  If
530 .B pwdChangedTime
531 does not exist, the user's password will not expire.
532 .LP
533 .RS 4
534 (  1.3.6.1.4.1.42.2.27.8.1.16
535    NAME 'pwdChangedTime'
536    DESC 'The time the password was last changed'
537    SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
538    EQUALITY generalizedTimeMatch
539    ORDERING generalizedTimeOrderingMatch
540    SINGLE-VALUE
541    NO-USER-MODIFICATION
542    USAGE directoryOperation)
543 .RE
544
545 .B pwdAccountLockedTime
546 .P
547 This attribute contains the time that the user's account was locked.
548 If the account has been locked, the password may no longer be used to
549 authenticate the user to the directory.  If
550 .B pwdAccountLockedTime   
551 is set to zero (0), the user's account has been permanently locked
552 and may only be unlocked by an administrator.
553 .LP
554 .RS 4
555 (  1.3.6.1.4.1.42.2.27.8.1.17
556    NAME 'pwdAccountLockedTime'
557    DESC 'The time an user account was locked'
558    SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
559    EQUALITY generalizedTimeMatch
560    ORDERING generalizedTimeOrderingMatch
561    SINGLE-VALUE
562    NO-USER-MODIFICATION
563    USAGE directoryOperation)
564 .RE
565
566 .B pwdFailureTime
567 .P
568 This attribute contains the timestamps of each of the consecutive
569 authentication failures made upon attempted authentication to this
570 DN (i.e. account).  If too many timestamps accumulate here (refer to
571 the
572 .B pwdMaxFailure
573 password policy attribute for details),
574 and the
575 .B pwdLockout
576 password policy attribute is set to "TRUE", the
577 account may be locked.
578 (Please also refer to the
579 .B pwdLockout
580 password policy attribute.)
581 Excess timestamps beyond those allowed by
582 .B pwdMaxFailure
583 may also be purged.  If a successful authentication is made to this
584 DN (i.e. to this user account), then
585 .B pwdFailureTime   
586 will be cleansed of entries.
587 .LP
588 .RS 4
589 (  1.3.6.1.4.1.42.2.27.8.1.19
590    NAME 'pwdFailureTime'
591    DESC 'The timestamps of the last consecutive
592        authentication failures'
593    SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
594    EQUALITY generalizedTimeMatch
595    ORDERING generalizedTimeOrderingMatch
596    NO-USER-MODIFICATION
597    USAGE directoryOperation )
598 .RE
599
600 .B pwdHistory
601 .P
602 This attribute contains the history of previously used passwords
603 for this DN (i.e. for this user account).
604 The values of this attribute are stored in string format as follows:
605
606 .RS 4
607
608 pwdHistory=
609 .RS 4
610 time "#" syntaxOID "#" length "#" data
611 .RE
612
613 time=
614 .RS 4
615 generalizedTimeString as specified in section 6.14 of [RFC2252]
616 .RE
617
618 .P
619 syntaxOID = numericoid
620 .RS 4
621 This is the string representation of the dotted-decimal OID that
622 defines the syntax used to store the password.  numericoid is
623 described in section 4.1 of [RFC2252].
624 .RE
625
626 length = numericstring
627 .RS 4
628 The number of octets in the data.  numericstring is described in
629 section 4.1 of [RFC2252].
630 .RE
631
632 data =
633 .RS 4
634 Octets representing the password in the format specified by syntaxOID.
635 .RE
636
637 .RE
638
639 This format allows the server to store and transmit a history of
640 passwords that have been used.  In order for equality matching
641 on the values in this attribute to function properly, the time
642 field is in GMT format.
643 .LP
644 .RS 4
645 (  1.3.6.1.4.1.42.2.27.8.1.20
646    NAME 'pwdHistory'
647    DESC 'The history of user passwords'
648    SYNTAX 1.3.6.1.4.1.1466.115.121.1.40
649    EQUALITY octetStringMatch
650    NO-USER-MODIFICATION
651    USAGE directoryOperation)
652 .RE
653
654 .B pwdGraceUseTime
655 This attribute contains the list of timestamps of logins made after
656 the user password in the DN has expired.  These post-expiration
657 logins are known as
658 .RI " "grace logins" ."
659 If too many
660 .I grace logins
661 have been used (please refer to the
662 .B pwdGraceLoginLimit
663 password policy attribute), then the DN will no longer be allowed
664 to be used to authenticate the user to the directory until the
665 administrator changes the DN's
666 .B userPassword
667 attribute.
668 .LP
669 .RS 4
670 (  1.3.6.1.4.1.42.2.27.8.1.21
671    NAME 'pwdGraceUseTime'
672    DESC 'The timestamps of the grace login once the password has expired'
673    SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
674    EQUALITY generalizedTimeMatch
675    NO-USER-MODIFICATION
676    USAGE directoryOperation)
677 .RE
678
679 .B pwdReset
680 .P
681 This attribute indicates whether the user's password has been reset
682 by the administrator and thus must be changed upon first use of this
683 DN for authentication to the directory.  If
684 .B pwdReset   
685 is set to "TRUE", then the password was reset and the user must change
686 it upon first authentication.  If the attribute does not exist, or
687 is set to "FALSE", the user need not change their password due to
688 administrative reset.
689 .LP
690 .RS 4
691 (  1.3.6.1.4.1.42.2.27.8.1.22
692    NAME 'pwdReset'
693    DESC 'The indication that the password has
694        been reset'
695    EQUALITY booleanMatch
696    SYNTAX 1.3.6.1.4.1.1466.115.121.1.7
697    SINGLE-VALUE
698    USAGE directoryOperation)
699 .RE
700
701 .SH EXAMPLES
702 .LP
703 .RS
704 .nf
705 database bdb
706 suffix dc=example,dc=com
707 \...
708 overlay ppolicy
709 ppolicy_default "cn=Standard,ou=Policies,dc=example,dc=com"
710 .fi
711 .RE
712
713 .SH SEE ALSO
714 .BR ldap (3),
715 .BR slapd.conf (5),
716 .LP
717 "OpenLDAP Administrator's Guide" (http://www.OpenLDAP.org/doc/admin/)
718 .LP
719 IETF LDAP password policy proposal by P. Behera, L.  Poitou and J.
720 Sermersheim:  documented in IETF document
721 "draft-behera-ldap-password-policy-09.txt".
722
723 .SH BUGS
724 The LDAP Password Policy specification is not yet an approved standard,
725 and it is still evolving. This code will continue to be in flux until the
726 specification is finalized.
727
728 .SH ACKNOWLEDGEMENTS
729 .P
730 This module was written in 2004 by Howard Chu of Symas Corporation
731 with significant input from Neil Dunbar and Kartik Subbarao of Hewlett-Packard.
732 .P
733 This manual page borrows heavily and shamelessly from the specification
734 upon which the password policy module it describes is based.  This
735 source is the
736 IETF LDAP password policy proposal by P. Behera, L.
737 Poitou and J. Sermersheim.
738 The proposal is fully documented in
739 the
740 IETF document named draft-behera-ldap-password-policy-09.txt,
741 written in July of 2005.
742 .P
743 .B OpenLDAP
744 is developed and maintained by The OpenLDAP Project (http://www.openldap.org/).
745 .B OpenLDAP
746 is derived from University of Michigan LDAP 3.3 Release.