]> git.sur5r.net Git - openldap/blob - doc/man/man5/slapo-ppolicy.5
More for ITS#3655 draft-8 updates
[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 PasswordModify 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 wil 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    USAGE directoryOperation)
521 .RE
522
523 .B pwdChangedTime
524 .P
525 This attribute denotes the last time that the entry's password was
526 changed.  This value is used by the password expiration policy to
527 determine whether the password is too old to be allowed to be used
528 for user authentication.  If
529 .B pwdChangedTime
530 does not exist, the user's password will not expire.
531 .LP
532 .RS 4
533 (  1.3.6.1.4.1.42.2.27.8.1.16
534    NAME 'pwdChangedTime'
535    DESC 'The time the password was last changed'
536    SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
537    EQUALITY generalizedTimeMatch
538    ORDERING generalizedTimeOrderingMatch
539    SINGLE-VALUE
540    USAGE directoryOperation)
541 .RE
542
543 .B pwdAccountLockedTime
544 .P
545 This attribute contains the time that the user's account was locked.
546 If the account has been locked, the password may no longer be used to
547 authenticate the user to the directory.  If
548 .B pwdAccountLockedTime   
549 is set to zero (0), the user's account has been permanently locked
550 and may only be unlocked by an administrator.
551 .LP
552 .RS 4
553 (  1.3.6.1.4.1.42.2.27.8.1.17
554    NAME 'pwdAccountLockedTime'
555    DESC 'The time an user account was locked'
556    SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
557    EQUALITY generalizedTimeMatch
558    ORDERING generalizedTimeOrderingMatch
559    SINGLE-VALUE
560    USAGE directoryOperation)
561 .RE
562
563 .B pwdFailureTime
564 .P
565 This attribute contains the timestamps of each of the consecutive
566 authentication failures made upon attempted authentication to this
567 DN (i.e. account).  If too many timestamps accumulate here (refer to
568 the
569 .B pwdMaxFailure
570 password policy attribute for details),
571 and the
572 .B pwdLockout
573 password policy attribute is set to "TRUE", the
574 account may be locked.
575 (Please also refer to the
576 .B pwdLockout
577 password policy attribute.)
578 Excess timestamps beyond those allowed by
579 .B pwdMaxFailure
580 may also be purged.  If a successful authentication is made to this
581 DN (i.e. to this user account), then
582 .B pwdFailureTime   
583 will be cleansed of entries.
584 .LP
585 .RS 4
586 (  1.3.6.1.4.1.42.2.27.8.1.19
587    NAME 'pwdFailureTime'
588    DESC 'The timestamps of the last consecutive
589        authentication failures'
590    SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
591    EQUALITY generalizedTimeMatch
592    ORDERING generalizedTimeOrderingMatch
593    USAGE directoryOperation )
594 .RE
595
596 .B pwdHistory
597 .P
598 This attribute contains the history of previously used passwords
599 for this DN (i.e. for this user account).
600 The values of this attribute are stored in string format as follows:
601
602 .RS 4
603
604 pwdHistory=
605 .RS 4
606 time "#" syntaxOID "#" length "#" data
607 .RE
608
609 time=
610 .RS 4
611 generalizedTimeString as specified in section 6.14 of [RFC2252]
612 .RE
613
614 .P
615 syntaxOID = numericoid
616 .RS 4
617 This is the string representation of the dotted-decimal OID that
618 defines the syntax used to store the password.  numericoid is
619 described in section 4.1 of [RFC2252].
620 .RE
621
622 length = numericstring
623 .RS 4
624 The number of octets in the data.  numericstring is described in
625 section 4.1 of [RFC2252].
626 .RE
627
628 data =
629 .RS 4
630 Octets representing the password in the format specified by syntaxOID.
631 .RE
632
633 .RE
634
635 This format allows the server to store and transmit a history of
636 passwords that have been used.  In order for equality matching
637 on the values in this attribute to function properly, the time
638 field is in GMT format.
639 .LP
640 .RS 4
641 (  1.3.6.1.4.1.42.2.27.8.1.20
642    NAME 'pwdHistory'
643    DESC 'The history of user passwords'
644    SYNTAX 1.3.6.1.4.1.1466.115.121.1.40
645    EQUALITY octetStringMatch
646    USAGE directoryOperation)
647 .RE
648
649 .B pwdGraceUseTime
650 This attribute contains the list of timestamps of logins made after
651 the user password in the DN has expired.  These post-expiration
652 logins are known as
653 .RI " "grace logins" ."
654 If too many
655 .I grace logins
656 have been used (please refer to the
657 .B pwdGraceLoginLimit
658 password policy attribute), then the DN will no longer be allowed
659 to be used to authenticate the user to the directory until the
660 administrator changes the DN's
661 .B userPassword
662 attribute.
663 .LP
664 .RS 4
665 (  1.3.6.1.4.1.42.2.27.8.1.21
666    NAME 'pwdGraceUseTime'
667    DESC 'The timestamps of the grace login once the password has expired'
668    SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
669    EQUALITY generalizedTimeMatch
670    USAGE directoryOperation)
671 .RE
672
673 .B pwdReset
674 .P
675 This attribute indicates whether the user's password has been reset
676 by the administrator and thus must be changed upon first use of this
677 DN for authentication to the directory.  If
678 .B pwdReset   
679 is set to "TRUE", then the password was reset and the user must change
680 it upon first authentication.  If the attribute does not exist, or
681 is set to "FALSE", the user need not change their password due to
682 administrative reset.
683 .LP
684 .RS 4
685 (  1.3.6.1.4.1.42.2.27.8.1.22
686    NAME 'pwdReset'
687    DESC 'The indication that the password has
688        been reset'
689    EQUALITY booleanMatch
690    SYNTAX 1.3.6.1.4.1.1466.115.121.1.7
691    SINGLE-VALUE
692    USAGE directoryOperation)
693 .RE
694
695 .SH EXAMPLES
696 .LP
697 .RS
698 .nf
699 database bdb
700 suffix dc=example,dc=com
701 \...
702 overlay ppolicy
703 ppolicy_default "cn=Standard,ou=Policies,dc=example,dc=com"
704 .fi
705 .RE
706
707 .SH SEE ALSO
708 .BR ldap (3),
709 .BR slapd.conf (5),
710 .LP
711 "OpenLDAP Administrator's Guide" (http://www.OpenLDAP.org/doc/admin/)
712 .LP
713 IETF LDAP password policy proposal by P. Behera, L.  Poitou and J.
714 Sermersheim:  documented in IETF document
715 "draft-behera-ldap-password-policy-08.txt".
716
717 .SH BUGS
718 The LDAP Password Policy specification is not yet an approved standard,
719 and it is still evolving. This code will continue to be in flux until the
720 specification is finalized.
721
722 .SH ACKNOWLEDGEMENTS
723 .P
724 This module was written in 2004 by Howard Chu of Symas Corporation
725 with significant input from Neil Dunbar and Kartik Subbarao of Hewlett-Packard.
726 .P
727 This manual page borrows heavily and shamelessly from the specification
728 upon which the password policy module it describes is based.  This
729 source is the
730 IETF LDAP password policy proposal by P. Behera, L.
731 Poitou and J. Sermersheim.
732 The proposal is fully documented in
733 the
734 IETF document named draft-behera-ldap-password-policy-08.txt,
735 written in October of 2004.
736 .P
737 .B OpenLDAP
738 is developed and maintained by The OpenLDAP Project (http://www.openldap.org/).
739 .B OpenLDAP
740 is derived from University of Michigan LDAP 3.3 Release.