Search

LDAP パスワードポリシーについて

2015年10月19日

とりあえず、情報があるリンク
http://www.zytrax.com/books/ldap/ch6/ppolicy.html

しかし、よくわからんので、自分で解析することにした。
取り急ぎ、ppolicy.scemaの必要そうな部分をgoogle翻訳で和訳した。
でも、和訳がおかしい(笑

わかりづらい箇所は要約を付けた。

これから検証を始める。

ppolicy.schema内容確認

[root@ldap schema]# cat ppolicy.schema
# $OpenLDAP: pkg/ldap/servers/slapd/schema/ppolicy.schema,v 1.7.2.5 2010/04/13 20:23:49 kurt Exp $
## This work is part of OpenLDAP Software <http://www.openldap.org/>.
##
## Copyright 2004-2010 The OpenLDAP Foundation.
## All rights reserved.
##
## Redistribution and use in source and binary forms, with or without
## modification, are permitted only as authorized by the OpenLDAP
## Public License.
##
## A copy of this license is available in the file LICENSE in the
## top-level directory of the distribution or, alternatively, at
## <http://www.OpenLDAP.org/license.html>.
#
## Portions Copyright (C) The Internet Society (2004).
## Please see full copyright statement below.

# Definitions from Draft behera-ldap-password-policy-07 (a work in progress)
#       Password Policy for LDAP Directories
# With extensions from Hewlett-Packard:
#       pwdCheckModule etc.

# Contents of this file are subject to change (including deletion)
# without notice.
#
# Not recommended for production use!
# Use with extreme caution!

#Network Working Group                                     J. Sermersheim
#Internet-Draft                                               Novell, Inc
#Expires: April 24, 2005                                        L. Poitou
#                                                        Sun Microsystems
#                                                        October 24, 2004
#
#
#                  Password Policy for LDAP Directories
#                draft-behera-ldap-password-policy-08.txt
#
#Status of this Memo
#
#   This document is an Internet-Draft and is subject to all provisions
#   of section 3 of RFC 3667.  By submitting this Internet-Draft, each
#   author represents that any applicable patent or other IPR claims of
#   which he or she is aware have been or will be disclosed, and any of
#   which he or she become aware will be disclosed, in accordance with
#   RFC 3668.
#
#   Internet-Drafts are working documents of the Internet Engineering
#   Task Force (IETF), its areas, and its working groups.  Note that
#   other groups may also distribute working documents as
#   Internet-Drafts.
#
#   Internet-Drafts are draft documents valid for a maximum of six months
#   and may be updated, replaced, or obsoleted by other documents at any
#   time.  It is inappropriate to use Internet-Drafts as reference
#   material or to cite them other than as "work in progress."
#
#   The list of current Internet-Drafts can be accessed at
#   http://www.ietf.org/ietf/1id-abstracts.txt.
#
#   The list of Internet-Draft Shadow Directories can be accessed at
#   http://www.ietf.org/shadow.html.
#
#   This Internet-Draft will expire on April 24, 2005.
#
#Copyright Notice
#
#   Copyright (C) The Internet Society (2004).
#
#Abstract
#
#   Password policy as described in this document is a set of rules that
#   controls how passwords are used and administered in Lightweight
#   Directory Access Protocol (LDAP) based directories.  In order to
#   improve the security of LDAP directories and make it difficult for
#   password cracking programs to break into directories, it is desirable
#   to enforce a set of rules on password usage.  These rules are made to
#
#  [trimmed]
#
#5.  Schema used for Password Policy
#
#   The schema elements defined here fall into two general categories.  A password policy object class is defined which contains a set of administrative password policy attributes, and a set of operational attributes are defined that hold general password policy state information for each user.
#
#5.2  Attribute Types used in the pwdPolicy ObjectClass
#
#   Following are the attribute types used by the pwdPolicy object class.
#
#5.2.1  pwdAttribute
#
#   This holds the name of the attribute to which the password policy is applied.  For example, the password policy may be applied to the userPassword attribute.
# これは、パスワード·ポリシーが適用される属性の名前を保持します。例えば、パスワードポリシーがuserPassword属性に適用することができる。

attributetype ( 1.3.6.1.4.1.42.2.27.8.1.1
      NAME 'pwdAttribute'
      EQUALITY objectIdentifierMatch
      SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )

#5.2.2  pwdMinAge
#
#   This attribute holds the number of seconds that must elapse between modifications to the password.  If this attribute is not present, 0 seconds is assumed.
# この属性は、パスワードの変更の間で経過しなければならない秒数を保持しています。この属性が存在しない場合は、0秒が想定される。

# ※パスワードの変更禁止期間。秒数で指定。

attributetype ( 1.3.6.1.4.1.42.2.27.8.1.2
      NAME 'pwdMinAge'
      EQUALITY integerMatch
      SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
      SINGLE-VALUE )

#5.2.3  pwdMaxAge
#
#   This attribute holds the number of seconds after which a modified password will expire.
# この属性は変更されたパスワードが期限切れになるまでの秒数を保持しています。
#   If this attribute is not present, or if the value is 0 the password does not expire.  If not 0, the value must be greater than or equal to the value of the pwdMinAge.
# と、この属性が存在しない場合、または値が0の場合はパスワードが期限切れになりません。 0でない場合、値は以上pwdMinAgeの値に等しくなければなりません。

# パスワードの有効期限。秒数で指定。

attributetype ( 1.3.6.1.4.1.42.2.27.8.1.3
      NAME 'pwdMaxAge'
      EQUALITY integerMatch
      SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
      SINGLE-VALUE )

#5.2.4  pwdInHistory
#
#   This attribute specifies the maximum number of used passwords stored in the pwdHistory attribute.
# この属性はpwdHistory属性に格納される使用済パスワードの最大数を指定します。

#   If this attribute is not present, or if the value is 0, used passwords are not stored in the pwdHistory attribute and thus may be reused.
# この属性が存在しない場合、値が0の場合、または、使用されるパスワードはpwdHistory属性に格納されていないので、再使用することができる。

# パスワード使用履歴。数値で指定。

attributetype ( 1.3.6.1.4.1.42.2.27.8.1.4
      NAME 'pwdInHistory'
      EQUALITY integerMatch
      SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
      SINGLE-VALUE )

#5.2.5  pwdCheckQuality
#
#   {TODO: Consider changing the syntax to OID.  Each OID will list a quality rule (like min len, # of special characters, etc).  These rules can be specified outsid ethis document.}
# {TODO:OIDに構文を変更することを検討。各OIDは(#特殊文字などの、分LENような)品質ルールの一覧が表示されます。これらのルールはoutsid ethis文書を指定することができます。}

#   {TODO: Note that even though this is meant to be a check that happens during password modification, it may also be allowed to happen during authN.  This is useful for situations where the password is encrypted when modified, but decrypted when used to authN.}
# {TODO:これは、パスワード変更中に起こるチェックであることを意味しているにもかかわらず、それはまたauthN中に発生させてもよいことに注意してください。これは修正されたときにパスワードが暗号化されている場合に便利ですが、authNに使用された場合復号化されます。}

#   This attribute indicates how the password quality will be verified while being modified or added.  If this attribute is not present, or if the value is '0', quality checking will not be enforced.  A value of '1' indicates that the server will check the quality, and if the server is unable to check it (due to a hashed password or other reasons) it will be accepted.  A value of '2' indicates that the server will check the quality, and if the server is unable to verify it, it will return an error refusing the password.
# この属性は、変更または追加されている間、パスワードの品質が検証される方法を示しています。この属性が存在しない場合、または値が'0'の場合、品質のチェックが強制されません。 '1'の値は、サーバが品質をチェックすることを示し、サーバが(ハッシュ化されたパスワード、またはその他の理由により)それをチェックできない場合、それが受け入れられます。 '2'の値は、サーバが品質をチェックすることを示し、サーバがそれを確認することができないなら、それはパスワードを拒否エラーを返します。

# パスワードの構文を検査するかを指定する。
#   0 or なし: チェックなし
#   1        : サーバが品質をチェックし、サーバー側での検査が不可能な場合には検査せずに受け入れる
#   2        : サーバが品質をチェックし、サーバー側での検査が不可能な場合にはエラーを返す

attributetype ( 1.3.6.1.4.1.42.2.27.8.1.5
      NAME 'pwdCheckQuality'
      EQUALITY integerMatch
      SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
      SINGLE-VALUE )

#5.2.6  pwdMinLength
#
#   When quality checking is enabled, this attribute holds the minimum number of characters that must be used in a password.  If this attribute is not present, no minimum password length will be enforced.  If the server is unable to check the length (due to a hashed password or otherwise), the server will, depending on the value of the pwdCheckQuality attribute, either accept the password without checking it ('0' or '1') or refuse it ('2').
# 品質チェックが有効になっている場合、この属性は、パスワードで使用する必要がある文字の最小数を保持しています。この属性が存在しない場合、パスワードの最小長は強制されません。サーバは('0 'または'1')それをチェックせずにパスワードを受け入れるどちらか、pwdCheckQuality属性の値に応じて、サーバは意志長(ハッシュ化されたパスワードまたはその他に起因する)、チェックしたり、拒否することができない場合それ('2 ')。

# パスワードの最少の文字数で指定する。Defaultなし。数値で指定。

attributetype ( 1.3.6.1.4.1.42.2.27.8.1.6
      NAME 'pwdMinLength'
      EQUALITY integerMatch
      SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
      SINGLE-VALUE )

#5.2.7  pwdExpireWarning
#
#   This attribute specifies the maximum number of seconds before a password is due to expire that expiration warning messages will be returned to an authenticating user.
# パスワード期限切れになる前に、パスワードが期限切れの警告メッセージが認証ユーザーに返される。この属性は、その際の最大秒数を指定します。
#   If this attribute is not present, or if the value is 0 no warnings will be returned.  If not 0, the value must be smaller than the value of the pwdMaxAge attribute.
# この属性が存在しない場合、または値が0の場合、警告は戻されません場合。 0でない場合、値はpwdMaxAge属性の値よりも小さくなければなりません。

# パスワード期限満了警告日数。「パスワードがもうすぐ期限切れになる」と警告を何日前に出すかを秒数で指定する。Default は 「0」。
# 秒数で指定。

attributetype ( 1.3.6.1.4.1.42.2.27.8.1.7
      NAME 'pwdExpireWarning'
      EQUALITY integerMatch
      SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
      SINGLE-VALUE )

#5.2.8  pwdGraceAuthNLimit
#
#   This attribute specifies the number of times an expired password can be used to authenticate.  If this attribute is not present or if the value is 0, authentication will fail.
# この属性は、期限切れのパスワードが認証に使用できる回数を指定する。この属性が存在したり、値が0である場合はない場合、認証は失敗します。

# パスワードの期限が切れたあとに猶予認証によるログインを何回許可するかを設定。数値で指定。

attributetype ( 1.3.6.1.4.1.42.2.27.8.1.8
      NAME 'pwdGraceAuthNLimit'
      EQUALITY integerMatch
      SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
      SINGLE-VALUE )

#5.2.9  pwdLockout
#
#   This attribute indicates, when its value is "TRUE", that the password may not be used to authenticate after a specified number of consecutive failed bind attempts.  The maximum number of consecutive failed bind attempts is specified in pwdMaxFailure.
# その値が"TRUE"である場合、この属性は、パスワードが連続して失敗したバインド試行の指定番号の後に認証するために使用することはできませんことを、示しています。連続して失敗したバインド試行の最大数は回数だけで指定されます。

#   If this attribute is not present, or if the value is "FALSE", the password may be used to authenticate when the number of failed bind attempts has been reached.
# この属性が存在しない場合、値は"FALSE"である場合、または、パスワードがバインド試行の失敗回数に達した場合に認証するために使用することができる。

# アカウントロックの有無。指定方法は、TRUE or FALSE
# TRUEの場合、pwdMaxFailureが必須項目

attributetype ( 1.3.6.1.4.1.42.2.27.8.1.9
      NAME 'pwdLockout'
      EQUALITY booleanMatch
      SYNTAX 1.3.6.1.4.1.1466.115.121.1.7
      SINGLE-VALUE )

#5.2.10  pwdLockoutDuration
#
#   This attribute holds the number of seconds that the password cannot be used to authenticate due to too many failed bind attempts.  If this attribute is not present, or if the value is 0 the password cannot be used to authenticate until reset by a password administrator.
# この属性は、パスワードが多すぎる失敗したバインド試行のために認証するために使用することはできません秒数を保持しています。この属性が存在しない場合、値が0である場合、またはパスワードは、パスワード管理者がリセットされるまで認証するために使用することができない。

# アカウントロック時の時間指定。秒数で指定する。この時間はロックされる。
# 指定なしおよび0の場合、ロック解除は自動で行われない。管理者による手動解除が必要となる。

attributetype ( 1.3.6.1.4.1.42.2.27.8.1.10
      NAME 'pwdLockoutDuration'
      EQUALITY integerMatch
      SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
      SINGLE-VALUE )

#5.2.11  pwdMaxFailure
#
#   This attribute specifies the number of consecutive failed bind attempts after which the password may not be used to authenticate. If this attribute is not present, or if the value is 0, this policy is not checked, and the value of pwdLockout will be ignored.
# この属性は、パスワードが認証に使用することはできませんした後に連続して失敗したバインドの試行回数を指定します。この属性が存在しない場合、値が0の場合、または、このポリシーはチェックされず、pwdLockoutの値は無視される。

# 何回パスワードを間違えたら、アカウントロックになるかを設定する。数値で指定する。
# 指定なしおよび0の場合、アカウントロックが無効化される。
# pwdLockoutが必須項目

attributetype ( 1.3.6.1.4.1.42.2.27.8.1.11
      NAME 'pwdMaxFailure'
      EQUALITY integerMatch
      SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
      SINGLE-VALUE )

#5.2.12  pwdFailureCountInterval
#
#   This attribute holds the number of seconds after which the password failures are purged from the failure counter, even though no successful authentication occurred.
# この属性は認証に成功が発生していないにもかかわらず、パスワードの失敗は失敗カウンタからパージされるまでの秒数を保持しています。

#   If this attribute is not present, or if its value is 0, the failure counter is only reset by a successful authentication.
# この属性が存在しない場合、その値が0である場合、又は、失敗カウンタは、認証の成功によってリセットされる。

# パスワード失敗回数をリセットする時間。秒数で指定。
# 設定なし、および0の場合、認証の成功によってリセットされる。
#
attributetype ( 1.3.6.1.4.1.42.2.27.8.1.12
      NAME 'pwdFailureCountInterval'
      EQUALITY integerMatch
      SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
      SINGLE-VALUE )

#5.2.13  pwdMustChange
#
#   This attribute specifies with a value of "TRUE" that users must change their passwords when they first bind to the directory after a password is set or reset by a password administrator.  If this attribute is not present, or if the value is "FALSE", users are not required to change their password upon binding after the password administrator sets or resets the password.  This attribute is not set due to any actions specified by this document, it is typically set by a password administrator after resetting a user's password.
# この属性は、パスワードはパスワード管理者によって設定またはリセットされた後に、彼らは最初のディレクトリにバインドするときに、ユーザーがパスワードを変更しなければならない"TRUE"の値で指定します。この属性が存在しない場合値は"FALSE"である場合、または、ユーザーがパスワードを管理者が設定またはリセットパスワードの後に結合すると、パスワードを変更する必要はありません。この属性は、この文書で指定された任意のアクションのために設定されていない、それは一般的に、ユーザーのパスワードをリセットした後、パスワードの管理者によって設定されます。

# パスワードをパスワード管理者によって設定またはリセットされた後に、最初のバインド直後にユーザがパスワードを変更するかどうかを指定。
# TRUE  : 変更する
# FALSE : 変更しない
# ※DefaultはFALSE

attributetype ( 1.3.6.1.4.1.42.2.27.8.1.13
      NAME 'pwdMustChange'
      EQUALITY booleanMatch
      SYNTAX 1.3.6.1.4.1.1466.115.121.1.7
      SINGLE-VALUE )

#5.2.14  pwdAllowUserChange
#
#   This attribute indicates whether users can change their own passwords, although the change operation is still subject to access control.  If this attribute is not present, a value of "TRUE" is assumed.  This attribute is intended to be used in the absense of an access control mechanism.
# 変更操作は、まだコントロールにアクセスすることがありますが、この属性は、ユーザーが自分のパスワードを変更できるかどうかを示します。この属性が存在しない場合、"TRUE"の値が想定される。この属性は、アクセス制御機構の不在をにおいて使用されることを意図している。

# ユーザーが自分のパスワードを変更できるようする。
# TRUE  : 変更できる
# FALSE : 変更できない
# ※DefaultはTRUE

attributetype ( 1.3.6.1.4.1.42.2.27.8.1.14
      NAME 'pwdAllowUserChange'
      EQUALITY booleanMatch
      SYNTAX 1.3.6.1.4.1.1466.115.121.1.7
      SINGLE-VALUE )

#5.2.15  pwdSafeModify
#
#   This attribute specifies whether or not the existing password must be sent along with the new password when being changed.  If this attribute is not present, a "FALSE" value is assumed.
# この属性は、既存のパスワードが変更され、新しいパスワードと一緒に送られなければならないかどうかを指定します。この属性が存在しない場合は、"FALSE"の値が想定される。
#
# パスワード変更時に旧パスワードを入力するかの指定。
# TRUE  : 旧パスワードを入力する
# FALSE : 旧パスワードを入力しない
# ※DefaultはFALSE

attributetype ( 1.3.6.1.4.1.42.2.27.8.1.15
      NAME 'pwdSafeModify'
      EQUALITY booleanMatch
      SYNTAX 1.3.6.1.4.1.1466.115.121.1.7
      SINGLE-VALUE )

# HP extensions
#
# pwdCheckModule
#
#    This attribute names a user-defined loadable module that provides a check_password() function. If pwdCheckQuality is set to '1' or '2' this function will be called after all of the internal password quality checks have been passed. The function has this prototype:
# この属性は、check_password()関数を提供し、ユーザー定義のロード可能なモジュールの名前を指定します。 pwdCheckQualityが'1'または'2'に設定されている場合、この関数は、内部パスワード品質チェックのすべての後に渡されていると呼ばれる。関数は、このプロトタイプがあります:

#    int check_password( char *password, char **errormessage, void *arg )
#  int型check_password(char *のパスワード、char型** ErrorMessageの、無効* argは)
#
#    The function should return LDAP_SUCCESS for a valid password.
# この関数は、有効なパスワードをLDAP_SUCCESSを返すべきです。

attributetype ( 1.3.6.1.4.1.4754.1.99.1
     NAME 'pwdCheckModule'
     EQUALITY caseExactIA5Match
     SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
     DESC 'Loadable module that instantiates "check_password() function'
     SINGLE-VALUE )

objectclass ( 1.3.6.1.4.1.4754.2.99.1
      NAME 'pwdPolicyChecker'
      SUP top
      AUXILIARY
      MAY ( pwdCheckModule ) )

#5.1  The pwdPolicy Object Class
#
#   This object class contains the attributes defining a password policy in effect for a set of users.  Section 10 describes the administration of this object, and the relationship between it and particular objects.
# このオブジェクト·クラスは、一連のユーザーに対して有効なパスワードポリシーを定義する属性が含まれています。部10は、このオブジェクトの管理、およびそれと特定のオブジェクト間の関係を説明しています。

objectclass ( 1.3.6.1.4.1.42.2.27.8.2.1
      NAME 'pwdPolicy'
      SUP top
      AUXILIARY
      MUST ( pwdAttribute )
      MAY ( pwdMinAge $ pwdMaxAge $ pwdInHistory $ pwdCheckQuality $
      pwdMinLength $ pwdExpireWarning $ pwdGraceAuthNLimit $ pwdLockout
      $ pwdLockoutDuration $ pwdMaxFailure $ pwdFailureCountInterval $
      pwdMustChange $ pwdAllowUserChange $ pwdSafeModify ) )

#5.3  Attribute Types for Password Policy State Information
#
# Password policy state information must be maintained for each user. The information is located in each user entry as a set of operational attributes.  These operational attributes are: pwdChangedTime, pwdAccountLockedTime, pwdFailureTime, pwdHistory, pwdGraceUseTime, pwdReset, pwdPolicySubEntry.
# パスワードポリシー状態情報は、各ユーザのために維持されなければならない。情報は操作属性のセットとして各ユーザエントリに置かれる。これらの運用属性は次のとおりです。pwdChangedTime、pwdAccountLockedTime、pwdFailureTime、pwdHistory、pwdGraceUseTime、6651645、pwdPolicySubEntry。

#
#5.3.1  Password Policy State Attribute Option
#
#   Since the password policy could apply to several attributes used to store passwords, each of the above operational attributes must have an option to specify which pwdAttribute it applies to.  The password policy option is defined as the following:
# パスワードポリシーは、パスワードを保存するために使用するいくつかの属性は、上記の操作属性のそれぞれに適用される可能性があるためには、それが適用されるpwdAttribute指定するオプションを持っている必要があります。パスワードポリシーオプションは、次のように定義されています
#
#   pwd-
#
#   where passwordAttribute a string following the OID syntax (1.3.6.1.4.1.1466.115.121.1.38).  The attribute type descriptor (short name) MUST be used.
# どこpasswordAttribute OID構文(1.3.6.1.4.1.1466.115.121.1.38)に続く文字列を。属性の型記述子が(短い名前)を使用しなければなりません。

#   For example, if the pwdPolicy object has for pwdAttribute "userPassword" then the pwdChangedTime operational attribute, in a user entry, will be:
# pwdPolicyオブジェクトがpwdAttribute"userPasswordを"のために持っている場合たとえば、その後pwdChangedTime操作属性は、ユーザーエントリで、次のようになります。

#   pwdChangedTime;pwd-userPassword: 20000103121520Z
#
#   This attribute option follows sub-typing semantics.  If a client requests a password policy state attribute to be returned in a search operation, and does not specify an option, all subtypes of that policy state attribute are returned.
# この属性はオプションでは、サブタイプのセマンティクスに従います。クライアントは、検索操作で返されると、オプションが指定されていないパスワードポリシー状態属性を要求した場合、そのポリシーの状態属性のすべてのサブタイプが返されます。

#5.3.2  pwdChangedTime
#
#   This attribute specifies the last time the entry's password was changed.  This is used by the password expiration policy.  If this attribute does not exist, the password will never expire.
# この属性は、エントリのパスワードが変更された最後の時間を指定します。これは、パスワードの有効期限ポリシーによって使用されます。この属性が存在しない場合、パスワードは期限切れになりません。
#
#      ( 1.3.6.1.4.1.42.2.27.8.1.16
#      NAME 'pwdChangedTime'
#      DESC 'The time the password was last changed'
#      EQUALITY generalizedTimeMatch
#      ORDERING generalizedTimeOrderingMatch
#      SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
#      SINGLE-VALUE
#      USAGE directoryOperation )
#
#5.3.3  pwdAccountLockedTime
#
#   This attribute holds the time that the user's account was locked.  A locked account means that the password may no longer be used to authenticate.  A 000001010000Z value means that the account has been locked permanently, and that only a password administrator can unlock the account.
# この属性は、ユーザーのアカウントがロックされた時間を保持しています。ロックされたアカウントには、パスワードがもはや認証するために使用することはできないことを意味します。000001010000Z値は、アカウントが永久にロックされ、唯一のパスワード管理者がアカウントのロックを解除することができていることを意味します。
#
#      ( 1.3.6.1.4.1.42.2.27.8.1.17
#      NAME 'pwdAccountLockedTime'
#      DESC 'The time an user account was locked'
#      EQUALITY generalizedTimeMatch
#      ORDERING generalizedTimeOrderingMatch
#      SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
#      SINGLE-VALUE
#      USAGE directoryOperation )
#
#5.3.4  pwdFailureTime
#
#   This attribute holds the timestamps of the consecutive authentication failures.
# この属性は、連続的な認証失敗のタイムスタンプを保持しています。
#
#      ( 1.3.6.1.4.1.42.2.27.8.1.19
#      NAME 'pwdFailureTime'
#      DESC 'The timestamps of the last consecutive authentication
#      failures'
#      EQUALITY generalizedTimeMatch
#      ORDERING generalizedTimeOrderingMatch
#      SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
#      USAGE directoryOperation )
#
#5.3.5  pwdHistory
#
#   This attribute holds a history of previously used passwords.  Values of this attribute are transmitted in string format as given by the following ABNF:
# この属性は、以前に使用したパスワードの履歴を保持しています。以下のABNFによって与えられるように、この属性の値は文字列形式で送信されています:
#
#   pwdHistory = time "#" syntaxOID "#" length "#" data
#
#   time       =
# 時間=<generalizedTimeStringとして指定[RFC2252]>の6.14に
#
#   syntaxOID  = numericoid    ; the string representation of the dotted-decimal OID that defines the syntax used to store the password. numericoid is described in 4.1 of [RFC2252].
# syntaxOIDは= NUMERICOID;を格納するために使用する構文を定義パスワードドット付き10進OIDの文字列表現。 NUMERICOIDは[RFC2252]の4.1で説明されています。
#
#   length     = numericstring ; the number of octets in data. numericstring is described in 4.1 of [RFC2252].
# 長さ= numericstring;データのオクテット数。 numericstringは[RFC2252]の4.1で説明されています。
#
#   data       = .
# データ= syntaxOID>によって指定された形式でパスワードを表す<octets。
#
#   This format allows the server to store, and transmit a history of passwords that have been used.  In order for equality matching to function properly, the time field needs to adhere to a consistent format.  For this purpose, the time field MUST be in GMT format.
# このフォーマットは、サーバーが使用されてきたパスワードの履歴を格納し、送信することを可能にする。適切に機能するために等価の一致するためには、時間フィールドは、一貫した形式に準拠する必要があります。この目的のために、時間フィールドはGMT形式でなければなりません。
#
#      ( 1.3.6.1.4.1.42.2.27.8.1.20
#      NAME 'pwdHistory'
#      DESC 'The history of user s passwords'
#      EQUALITY octetStringMatch
#      SYNTAX 1.3.6.1.4.1.1466.115.121.1.40
#      USAGE directoryOperation )
#
#5.3.6  pwdGraceUseTime
#
#   This attribute holds the timestamps of grace authentications after a password has expired.
# パスワードの有効期限が切れた後にこの属性には、猶予認証のタイムスタンプを保持しています。
#
#      ( 1.3.6.1.4.1.42.2.27.8.1.21
#      NAME 'pwdGraceUseTime'
#      DESC 'The timestamps of the grace authentication after the
#      password has expired'
#      EQUALITY generalizedTimeMatch
#      SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
#
#5.3.7  pwdReset
#
#   This attribute holds a flag to indicate (when TRUE) that the password has been updated by the password administrator and must be changed by the user on first authentication.
# この属性は、パスワードは、パスワード管理者によって更新され、最初の認証にユーザによって変更されなければならないこと時(TRUE)を示すフラグを保持する。
# FALSEは変更する必要はない。
#
#      ( 1.3.6.1.4.1.42.2.27.8.1.22
#      NAME 'pwdReset'
#      DESC 'The indication that the password has been reset'
#      EQUALITY booleanMatch
#      SYNTAX 1.3.6.1.4.1.1466.115.121.1.7
#      SINGLE-VALUE
#      USAGE directoryOperation )
#
#5.3.8  pwdPolicySubentry
#
#   This attribute points to the pwdPolicy subentry in effect for this object.
# この属性は、このオブジェクトのために有効なpwdPolicyサブエントリを指しています。
#
#      ( 1.3.6.1.4.1.42.2.27.8.1.23
#      NAME 'pwdPolicySubentry'
#      DESC 'The pwdPolicy subentry in effect for this object'
#      EQUALITY distinguishedNameMatch
#      SYNTAX 1.3.6.1.4.1.1466.115.121.1.12
#      SINGLE-VALUE,nm.
#      USAGE directoryOperation )
#
#
#Disclaimer of Validity
#
#   This document and the information contained herein are provided on an
#   "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
#   OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET
#   ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,
#   INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
#   INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
#   WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
#
#
#Copyright Statement
#
#   Copyright (C) The Internet Society (2004).  This document is subject
#   to the rights, licenses and restrictions contained in BCP 78, and
#   except as set forth therein, the authors retain all their rights.

*ppolicy設定方法

slapd.conf に以下を追加
# vim slapd.conf
overlay ppolicy
ppolicy_default "cn=Standard Policy,ou=Policies,dc=cse,dc=com"
ppolicy_use_lockout

slapd.confのチェック
# slaptest -u -f /etc/openldap/slapd.conf -v

/etc/openldap/slapd.d の更新
# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
# chown -R ldap:ldap /etc/openldap/slapd.d

slapd再起動
# /etc/init.d/slapd start

policy.ldifを作成。ここにはデフォルトポリシールールを記載
# vi policy.ldif
dn: cn=Standard Policy,ou=Policies,dc=cse,dc=com
objectClass: top
objectClass: device
objectClass: pwdPolicy
cn: Standard Policy
pwdAttribute: userPassword
pwdMaxFailure: 4
pwdMustChange: FALSE
pwdMinLength: 6
pwdInHistory: 1
pwdCheckQuality: 1
pwdMinAge: 0
pwdLockout: TRUE
pwdMaxAge: 2592000

# ldapadd -x -W -D "cn=Manager,dc=cse,dc=com" -f ./policy.ldif

これで設定完了。

確認

アカウントロックをかけてみる。
いかのように4回失敗してみる。

[root@ldap openldap]# ldapsearch -x -D "uid=test,ou=a_1,ou=a,dc=cse,dc=com" -W password -e ppolicy
Enter LDAP Password:
ldap_bind: Invalid credentials (49)
[root@ldap openldap]# ldapsearch -x -D "uid=test,ou=a_1,ou=a,dc=cse,dc=com" -W password -e ppolicy
Enter LDAP Password:
ldap_bind: Invalid credentials (49)
[root@ldap openldap]# ldapsearch -x -D "uid=test,ou=a_1,ou=a,dc=cse,dc=com" -W password -e ppolicy
Enter LDAP Password:
ldap_bind: Invalid credentials (49)
[root@ldap openldap]# ldapsearch -x -D "uid=test,ou=a_1,ou=a,dc=cse,dc=com" -W password -e ppolicy
Enter LDAP Password:
ldap_bind: Invalid credentials (49)
[root@ldap openldap]# ldapsearch -x -D "uid=test,ou=a_1,ou=a,dc=cse,dc=com" -W password -e ppolicy
Enter LDAP Password:
ldap_bind: Invalid credentials (49); Account locked

ロック確認方法

[root@ldap openldap]# ldapsearch -x -D "cn=Manager,dc=cse,dc=com" -W  -b "dc=cse,dc=com" pwdAccountLockedTime=* pwdAccountLockedTime
Enter LDAP Password:
# extended LDIF
#
# LDAPv3
# base <dc=cse,dc=com> with scope subtree
# filter: pwdAccountLockedTime=*
# requesting: pwdAccountLockedTime
#

# test, a_1, a, cse.com
dn: uid=test,ou=a_1,ou=a,dc=cse,dc=com
pwdAccountLockedTime: 20130912124600Z

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

testユーザのアカウントロックを「pwdAccountLockedTime」で確認。

ロック解除

以下の属性をユーザエントリから削除する。

アンロックするユーザのldifファイルを作成
# vi ./unlockAccount20130912.ldif
dn:uid=test,ou=a_1,ou=a,dc=cse,dc=com
changetype:modify
delete: pwdAccountLockedTime

ldifファイルを読み込む
# ldapmodify -x -D "cn=Manager,dc=cse,dc=com" -W -f ./unlockAccount20130912.ldif
Enter LDAP Password:
modifying entry "uid=test,ou=a_1,ou=a,dc=cse,dc=com"

ログインしてみる。
[root@ldap openldap]# ldapsearch -x -D "uid=test,ou=a_1,ou=a,dc=cse,dc=com" -W password -e ppolicy
Enter LDAP Password:
# extended LDIF
#
# LDAPv3

ログインできることが確認できた。

ppolicy-pwdcheck

パスワードの複雑性を実現するには、ppolicy-pwdcheckを使用する。
参考サイト:http://open-groove.net/openldap/check-password-module/

以下からソースを取得する。
https://github.com/onyxpoint/ppolicy-check-password

openldap-2.4.23-32をyumでいれたため、そのソースを取得する。
# cd /usr/local/src/
# wget ftp://mirror.switch.ch/pool/4/mirror/redhat/linux/enterprise/6ComputeNode/en/os/SRPMS/openldap-2.4.23-32.el6_4.src.rpm

ソースをtgzに変換し、回答する。
# rpm2cpio openldap-2.4.23-32.el6_4.src.rpm | cpio -id “openldap-2.4.23.tgz”
# tar zxvf openldap-2.4.23.tgz

コンパイル
# cd openldap-2.4.23
# ./configure
# ./make depend

チェック用の定義ファイルを作成する。
# vi /etc/openldap/check_password.conf

min Points 8   ←パスワードは8文字以上
use Cracklib 0 ←Cracklibは使用しない
min Upper 1    ←パスワードに大文字を1文字以上含める
min Lower 1    ←パスワードに小文字を1文字以上含める
min Digit 1    ←パスワードに数字を1文字以上含める
min Punct 1    ←パスワードに記号を1文字以上含める

# cd /usr/local/src/ldap/openldap-2.4.23/contrib/slapd-modules/
gitから取得したcheck-password-moduleを配置
# mv /usr/local/src/ppolicy-check-password-master check_passwd

Makefileを修正(パス等が合わない、checklibを使用しないため、修正した)
必要に応じて変更すること。

vi /usr/local/src/openldap-2.4.23/contrib/slapd-modules/check_passwd/Makefile

# contrib/slapd-modules/check_password/Makefile
# Copyright 2007 Michael Steinmann, Calivia. All Rights Reserved.
# Updated by Pierre-Yves Bonnetain, B&A Consultants, 2008
# Updated by Trevor Vaughan, Onyx Point Inc., 2011
#

CC=gcc

# Where to look for the CrackLib dictionaries
#
CRACKLIB=/usr/share/cracklib/pw_dict

# Path to the configuration file
#
# Make sure this is a writable location to use the cpass tests.
# check_password.confの配置場所を変更
CONFIG=/etc/openldap/check_password.conf
#CONFIG=check_password.conf

# Turn on local debugging.
#OPT=-g -O2 -Wall -fpic 						\
# -DHAVE_CRACKLIB -DCRACKLIB_DICTPATH="\"$(CRACKLIB)\""	\
# -DCONFIG_FILE="\"$(CONFIG)\"" \
# -DLDEBUG

# CRACKLIBを使用しないため、変更
#OPT=-g -O2 -Wall -fpic 						\
#	-DHAVE_CRACKLIB -DCRACKLIB_DICTPATH="\"$(CRACKLIB)\""	\
#	-DCONFIG_FILE="\"$(CONFIG)\""
OPT=-g -O2 -Wall -fpic 						\
	-DCONFIG_FILE="\"$(CONFIG)\""

# パスをフルパスに変更
#LDAP_INC_PATH=.
LDAP_INC_PATH=/usr/local/src/openldap-2.4.23

# Where to find the OpenLDAP headers.
#
#LDAP_INC=-I$(LDAP_INC_PATH)/include -I$(LDAP_INC_PATH)/servers/slapd -I$(LDAP_INC_PATH)/build-servers/include
# -I$(LDAP_INC_PATH)/build-servers/includeは存在しないため、省く
LDAP_INC=-I$(LDAP_INC_PATH)/include -I$(LDAP_INC_PATH)/servers/slapd

# Where to find the CrackLib headers.
#
#CRACK_INC=

INCS=$(LDAP_INC) $(CRACK_INC)

LDAP_LIB=-lldap_r -llber

# Comment out this line if you do NOT want to use the cracklib.
# You may have to add an -Ldirectory if the libcrak is not in a standard
# location
#
CRACKLIB_LIB=-lcrack

# CRACKLIB_LIBは使用しないため、省く
#LIBS=$(LDAP_LIB) $(CRACKLIB_LIB)
LIBS=$(LDAP_LIB)

LIBDIR=/usr/lib/openldap/

all: 	check_password_test

check_password.o:
	$(CC) $(OPT) -c $(INCS) check_password.c

check_password: clean check_password.o
        # $(CRACKLIB_LIB)を使用しないため、省く
	#$(CC) -shared -o check_password.so check_password.o $(CRACKLIB_LIB)
	$(CC) -shared -o check_password.so check_password.o
	ln -sf check_password.so libcheck_password.so

check_password_test: check_password
	$(CC) -g -O2 -DCONFIG_FILE="\"$(CONFIG)\"" -fpic $(INCS) -Wall check_password_test.c -o cpass -L. -llber -lcheck_password

install: check_password
        # libの指定が違うため変更
	#cp -f check_password.so /usr/lib/openldap/modules/
	cp -f check_password.so /usr/lib64/openldap/

clean:
	$(RM) check_password.o check_password.so check_password.lo libcheck_password.so cpass check_password.conf
	$(RM) -r .libs

distclean: clean
	$(RM) -rf openldap-*

# make
# make install
# /etc/init.d/slapd restart

dn: cn=Standard Policy,ou=Policies,dc=cse,dc=comに以下を追加する。

objectClass: PwdPloicy Checker
pwd Check Module: check_password.so

期待通りのパスワードの複雑性ができた。

 

しかし、以下の方がラクだと気づき、ppolicy-pwdcheckは使用しない結論に至った。
ppolicy : パスワードポリシー、文字数やパスワード有効期限など
pam : パスワードの複雑性(大文字、小文字、数字を1文字ずつ含む)、リトライ回数
※pam認証パスワードポリシー