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