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