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