LDAPサーバの構築(CentOS)



●ディレクトリサーバとは

 ディレクトリサーバとは、ネットワーク上でユーザ情報、組織情報などを保存、管理し、分散しているクライアントに対しこれらの情報を提供するサーバです。また、管理する情報に対するアクセスコントロールも提供します。
 したがって、クライアントはディレクトリサーバでの認証後、許可された操作を行うことになります。このため、サーバ/クライアント間でのプロトコルが必要ですが、現在主に使われているのがLDAP(Lightweight Directory Access Protocol)です。
 LDAPサーバは、商用製品ではマイクロソフトのActive Directory、サン・マイクロシステムズのSun Java System Directory Server、ノベルのeDirectoryなどが有名です。オープンソースでは、OpenLDAPのほか、Fedora Directory Server、Apache Directory、OpenDSなどがあります。

 OpenLDAPの情報は下記URLを参照してください。

 OpenLDAP 情報

 ディレクトリサーバのメリット

 個人で利用するコンピュータや、比較的小規模のオフィスにおいては、ユーザ情報はそれぞれのコンピュータで管理されることが多いでしょう。
 しかし、例えば数十人、またはそれを超える大規模の組織でユーザ情報を管理する場合は、それぞれのコンピュータで個別に管理するよりも、専用サーバ上で管理する方が、都合がよいでしょう。
 また、ディレクトリサービスを活用することでアプリケーションサーバやWebサーバと連携させてシングルサインオン環境や、Active Directoryで管理されるWindowsユーザを統合したアカウント管理へと発展させることも可能です。
 逆に、管理情報が各コンピュータに分散していれば、その数だけメンテナンスに掛かる手間が増えることになります。

●ディレクトリサーバ設計のポイント

 スキーマ設計

 「ディレクトリ情報を集中管理できる」というメリットを持つディレクトリサーバですが、利用に当たってはディレクトリ情報として格納する各エントリに、どのような情報を持たせるかを定義する必要があります。
 この定義には、ディレクトリサービスを利用するクライアント側の用途に基づいて、ディレクトリサーバに蓄積する必要があるデータを選定し、そのデータをディレクトリサーバが扱うことのできるデータ型へと落としていく作業が必要になります。
 ディレクトリサーバが扱うデータ型としては、標準的に利用されるものがあらかじめRFCに定義されています。OpenLDAPでは[OpenLDAPインストールDir]/etc/openldap/schema/ディレクトリにこれらのデータ型を定義したファイルが用意されています。
# less [OpenLDAPインストールDir]/etc/openldap/schema/README
File             Description
----             -----------
corba.schema     Corba Object
core.schema      OpenLDAP "core"
cosine.schema    COSINE Pilot
dyngroup.schema  Dynamic Group (experimental)
inetorgperson.schema InetOrgPerson
java.schema      Java Object
misc.schema      Miscellaneous Schema (experimental)
nis.schema       Network Information Service (experimental)
openldap.schema  OpenLDAP Project (FYI)
ppolicy.schema   Password Policy Schema (work in progress)

 オブジェクトクラスの設計

 例えば、Linuxクライアントからのユーザ認証に、/etc/passwdファイルではなくディレクトリサーバを利用する場合、LinuxはPAM(pam_ldap.so)を利用します。
 PAMは、認証対象のユーザがディレクトリサーバに存在することを確認するため、サーバ内の「posixAccount」オブジェクトクラスの「uid」属性を検索します。この「posixAccount」オブジェクトクラスの利用には、OpenLDAPが提供するnis.schemaファイルにあらかじめ用意されている定義を利用することができます。
# less [OpenLDAPインストールDir]/etc/openldap/schema/nis.schema
objectclass ( 1.3.6.1.1.1.2.0 NAME 'posixAccount'
      DESC 'Abstraction of an account with POSIX attributes'
      SUP top AUXILIARY
      MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory )
      MAY ( userPassword $ loginShell $ gecos $ description ) )
 上記のnis.schemaファイルの内容から、「posixAccount」オブジェクトクラスは
  • オブジェクトIDは、"1.3.6.1.1.1.2.0"
  • "top"という上位クラスから派生した補助型(AUXILIARY)のオブジェクトクラス
  • cn、uid、uidNumber、gidNumber、homeDirectoryの各属性を必須で備える
  • userPassword、loginShell、gecos、descriptionの各属性を任意に備えることができる
と、/etc/passwdファイルに含まれる情報が定義されていることが分かります。
 このオブジェクトクラスは、構造型(STRUCTURAL)、補助型(AUXILIARY)、抽象型(ABSTRACT)の3つに分類され、各エントリには構造型のオブジェクトクラスを必ず含めるという制約があります。
 このため、Linuxのユーザ認証という用途で利用する場合、ユーザエントリには、構造型のオブジェクトクラス、例えばcosine.schemaファイルにあらかじめ用意された「account」オブジェクトクラスなどを加えることになります。次のLDIFファイル(LDAP Data Interchange Format: LDAPエントリをテキスト形式で表現したファイル)は、posixAccountオブジェクトクラスを利用する場合に必要となる定義を行った例です。
# less sample_1.ldif
dn: uid=test1,ou=People,dc=bigbang,dc=dyndns,dc=org
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
uid: test1
cn: test1
uidNumber:5001
gidNumber:5001
homeDirectory: /home/test1
userPassword: password
...[略]

●「継承」の概念

 このほか、オブジェクトクラスには継承という概念があります。構造型のオブジェクトクラスとして「account」オブジェクトクラスではなく、例えばinetorgperson.schemaファイルに用意された「inetOrgPerson」オブジェクトクラスを追加することを選択した場合、ユーザエントリには、「account」オブジェクトクラスを選択した場合のエントリと比較し、「sn」属性が追加で必要になります。
 次のLDIFファイルは、inetOrgPersonオブジェクトクラスを利用する場合に必要となる定義を行った例です。
# less sample_2.ldif
dn: uid=test2,ou=People,dc=bigbang,dc=dyndns,dc=org
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: test2
cn: test2
sn: test2
uidNumber:5002
gidNumber:5002
homeDirectory: /home/test2
userPassword: password
...[略]
 これは、「inetOrgPerson」オブジェクトクラスが「organizationalPerson」オブジェクトクラスを継承し、さらにその「organizationalPerson」オブジェクトクラスが継承する「person」オブジェクトクラスにおいて、「sn」を必須の属性として定義しているためです。

ldap_01
図1 オブジェクトクラスの継承
# less [OpenLDAPインストールDir]/etc/openldap/schema/inetorgperson.schema
objectclass ( 2.16.840.1.113730.3.2.2
    NAME 'inetOrgPerson'
        DESC 'RFC2798: Internet Organizational Person'
    SUP organizationalPerson
    STRUCTURAL
        MAY (
...[略]
)
# less [OpenLDAPインストールDir]/etc/openldap/schema/core.schema
objectclass ( 2.5.6.7 NAME 'organizationalPerson'
                       → inetOrgPersonはorganizationalPersonを継承
    DESC 'RFC2256: an organizational person'
    SUP person STRUCTURAL
    MAY ( title $ x121Address $ registeredAddress $ destinationIndicator $
...[略]
)
objectclass ( 2.5.6.6 NAME 'person'
                       → organizationalPersonはpersonを継承
    DESC 'RFC2256: a person'
    SUP top STRUCTURAL
    MUST ( sn $ cn ) ← personhaはsn、cnを必須属性として持つ
    MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )
...[略]
)
 このように、スキーマを設計する作業においては、LDAPクライアントが必要とする情報を、ディレクトリサーバが扱うデータ型へと落としていくことになりますが、その過程ではオブジェクトクラスの持つ制約にも注意しながら作業を進める必要があります。

 属性設計

 オブジェクトクラスに任意属性、必須属性として定義された各属性もそれぞれがオブジェクトIDを持ち、属性値を比較するルール、属性値が取り得る構文(いわゆる型)などが定められています。
 例えば、posixAccountオブジェクトクラスに必須属性として定義されたuidNumber属性は、
  • オブジェクトIDは、"1.3.6.1.1.1.1.0"
  • 等価比較する場合のルール(EQUALITY)は、数値の一致
  • 属性値は、数値型(Integer)で構成される(SYNTAX)
  • 複数の値は取らない(SINGLE-VALUE)
と定義されています。
# less [OpenLDAPインストールDir]/etc/openldap/schema/core.schema
# Attribute Type Definitions
# builtin
#attributetype ( 1.3.6.1.1.1.1.0 NAME 'uidNumber'
#       DESC 'An integer uniquely identifying a user in an administrative domain'
#       EQUALITY integerMatch
#       SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
 また、同じくposixAccountオブジェクトクラスに必須属性として定義されたhomeDirectory属性は、
  • オブジェクトIDは、"1.3.6.1.1.1.1.3"
  • 等価比較する場合のルール(EQUALITY)は、大文字/小文字を区別する
  • 属性値は、International Alphabet 5(ASCII文字列)で構成される(SYNTAX)
  • 複数の値は取らない(SINGLE-VALUE)
と定義されています。
# less [OpenLDAPインストールDir]/etc/openldap/schema/core.schema
attributetype ( 1.3.6.1.1.1.1.3 NAME 'homeDirectory'
       DESC 'The absolute path to the home directory'
       EQUALITY caseExactIA5Match
       SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
 このような属性の定義を把握することで、対象となる属性にはどのような値の設定が可能か、検索時にはどのような比較が行われ、どのようなタイプのIndexを作成するべきかの判断が容易になります。
 このほか、属性もオブジェクトクラスと同様に、上位の属性の持つ性質を継承することができます。例えば、core.schemaファイルで定義される属性cn、snは、属性nameの持つ、
  • 等価比較する場合のルール(EQUALITY)は、大文字/小文字を無視する
  • 部分文字列を比較する場合のルール(SUBSTR)は、大文字/小文字を無視する
  • 属性値は、Directory String(UTF8文字列)で構成され(SYNTAX)32768文字まで
という定義を継承しています。
# less [OpenLDAPインストールDir]/etc/openldap/schema/core.schema
# system schema
#attributetype ( 2.5.4.3 NAME ( 'cn' 'commonName' )
#       DESC 'RFC2256: common name(s) for which the entity is known by'
#       SUP name )
attributetype ( 2.5.4.4 NAME ( 'sn' 'surname' )
        DESC 'RFC2256: last (family) name(s) for which the entity is known by'
    SUP name )
...[略]
# system schema
#attributetype ( 2.5.4.41 NAME 'name' ← 7行上、3行上から継承
#       EQUALITY caseIgnoreMatch
#       SUBSTR caseIgnoreSubstringsMatch
#       SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )
 このように、各属性の持つ定義に加え、継承という概念を理解することで、属性の拡張が必要となった場合の作業を容易に進めることができるようになります。

●そのほかの留意事項

 DIT(Directory Information Tree)設計

 ディレクトリ情報を集中管理できるディレクトリサーバですが、一方でデメリットもあります。
 ディレクトリサーバは、ユーザID、パスワードなどのユーザ情報を一元管理しているため、ディレクトリサーバそのものに障害が発生した場合、組織内のユーザはコンピュータにログインすることすらできなくなる可能性があります。コンピュータを中心にして活動している企業では、企業活動が停止してしまいかねません。
 この問題に対して、OpenLDAPはレプリケーションによるディレクトリ情報の冗長化を提供しています。
 OpenLDAPのレプリケーション機能は、DIT(Directory Information Tree:ディレクトリ情報ツリー)の特定の階層以下を指定して、レプリケーションできるというものです。このため、ディレクトリ全体でなく特定の階層から下のみを冗長化させることを予定している場合、DITの設計時には、レプリケーションさせるディレクトリ情報の階層を意識して設計を進める必要があります。

ldap_02
図2 レプリケーションのイメージ

 また、OpenLDAPはディレクトリ情報の一部の管理を、ほかのサーバへ委譲する機能を持ちます。この機能を利用することによりサーバ管理者はディレクトリ情報の管理を分担して行えることができるようになります。
 ディレクトリ情報を切り分ける単位はDITのサブツリーとなるため、この機能を利用する場合も、DITの設計時に、権限を委譲しディレクトリ情報を分散させる階層を意識して設計を進める必要があります。

ldap_03
図2 レプリケーションのイメージ

 レプリケーション設計

 多くの商用ディレクトリサーバが、マスタ兼スレーブサーバとして動作することができるマルチマスタレプリケーションをサポートしているのに対し、 OpenLDAPは最新のメジャーバージョンである2.4系まで、マルチマスタを正規の機能としてサポートしていませんでした。
 現時点でStable版とされている2.3.xでは、マルチマスタ機能は試験的なサポートにとどまっています。また、2.4系でのマルチマスタ構成はまだ実績が少ないことから、現時点においてのOpenLDAPでのレプリケーション構成はシングルマスタの採用が堅実と考えられます。
 また、OpenLDAPのレプリケーション方式には、slurpd方式とsyncrepl方式の2つがあります。slurpd方式は、信頼性が低く、同期が取れなくなることがあり、その場合は手動での同期が必要になるといった理由で2.4系では削除されています。反対に、syncrepl方式は同期を取るために必要な手間が少ないというメリットがあるため、今後はこちらが主要なレプリケーション方式としての利用、開発が進むことになります。
 さらに、syncrepl方式には非同期的なタイミングで複製を行うrefreshOnlyモードと、同期的なタイミングで複製を行うrefreshAndPersistモードがあります。マスタ-スレーブ間で更新データの複製タイミングの遅れが問題となり得る場合は、refreshAndPersistモードの採用を検討することになります。

 負荷への対策

 ディレクトリサーバはディレクトリ情報を一元管理しているため、導入前には個々のコンピュータで行われていたユーザID、パスワードを用いた認証要求や、ユーザ名、グループ名、メールアドレスといったディレクトリ情報の検索要求が集中することになります。この結果、サーバ負荷が増大する可能性もあります。
 この問題に対してOpenLDAPは、レプリケーション機能による冗長化構成を用いてのアクセス負荷の分散や、バックエンドデータベースにIndexを作成したバックエンドデータベース自体の検索処理の高速化といった対策を用意しています(このほか、LDAPクライアント側では、一度取得したディレクトリ情報を一定時間キャッシュすることにより、ディレクトリサーバへのアクセス数を抑制するといった対処が可能です)。
 クライアント数が多く、ディレクトリサーバへのアクセスが多い大規模な組織で利用する場合や、特定時間内でのアクセスが極端に多くなるような利用が見込まれる場合は、ディレクトリサーバに掛かる負荷への対策には特に注意が必要です。

 セキュリティ

 ディレクトリサーバは情報を一元管理するため、導入前には個々のコンピュータで管理されていたパスワードなどの情報を、ディレクトリサーバは組織内のユーザ数の分、まとめて管理することになります。万が一、ディレクトリサーバが侵入を受けてしまうと、組織内のさまざまな情報がまとめて流出することになりかねません。
 このリスクに対して、OpenLDAPはパスワードを平文で保存せずに、ハッシュ関数などで暗号化した状態で保存する機能を提供しています。また、OpenLDAPはクライアントからの通信経路をSSL/TLSで暗号化する機能も備えています。暗号化された経路より受け取ったパスワードを、同じハッシュ関数を利用し比較することで、すでにハッシュ化されて保存されたパスワードと一致するかを確認することができます。
 このほか、OpenLDAPでは、認証に必要な情報をOpenLDAPが持つバックエンドデータベース内に保存せずに、外部のSASL(Simple Authentication and Security Layer)データベースやKerberosデータベースに保存し、利用する機能を提供しています。ディレクトリサーバの設計時には、アクセスコントロールリストの設定も含め、他人に知られたくないパスワードなどの情報をどのように扱うかを検討する必要があります。

 運用管理

 前述したとおり、組織内のディレクトリ情報を一元管理するため、万が一、ディレクトリサーバに障害が発生するとその影響は甚大です。管理者はサーバの運用に問題が生じていないかを把握し、問題が発生した場合にはその原因を早急に特定し、障害から復旧させるよう努める必要があります。
 一般のサーバプログラムと同様、OpenLDAPにも動作ログをsyslogへ送る機能があり、ログレベルを指定することができます。健全なディレクトリサーバの運用のため、必要な範囲のログを出力させ、管理する必要があります。
 また、一般に更新頻度が少ない情報が格納されるディレクトリサーバですが、管理者は、万が一の場合に備えてディレクトリ情報のバックアップを取得する必要があります。データの保全作業は、ディレクトリサーバを適用する組織が大きくなればなるほど重要性も増す作業です。
 OpenLDAPにもバックアップ、リストアを行うコマンドが付属しています。実運用を開始する前に定期的なバックアップのスケジュールを計画し、運用条件に合わせ、これらのコマンドを利用したデータの保全策を確認しておく必要があります。

●OpenLDAPのインストール及び設定(CentOS 6、7編)推奨版

 OpenLDAPのサーバとクライアントをインストールします。
CentOS 6の場合
# yum -y install openldap-servers openldap-clients
# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# chown ldap. /var/lib/ldap/DB_CONFIG
# /etc/rc.d/init.d/slapd start
# chkconfig slapd on
CentOS 7の場合
# yum -y install openldap-servers openldap-clients
# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# chown ldap. /var/lib/ldap/DB_CONFIG
# systemctl start slapd
# systemctl enable slapd
 OpenLDAPの管理者パスワードを設定します。
# slappasswd
New password:
Re-enter new password:
{SSHA}xxxxxxxxxxxxxxxxxxxxxxxx
# vi chrootpw.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx
# ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"
 ldapsearchで先ほどのパスワードが設定されているか確認します。
# ldapsearch -x -LLL -D "cn=config" -W -b "cn=config" '(objectClass=*)'
Enter LDAP Password: 
dn: cn=config
objectClass: olcGlobal
cn: config
olcConfigFile: /usr/share/openldap-servers/slapd.conf.obsolete
olcConfigDir: /etc/openldap/slapd.d
olcAllows: bind_v2
olcArgsFile: /var/run/openldap/slapd.args
~以下、省略~
パスワードを間違えると下記のように出力されます。
ldap_bind: Invalid credentials (49)
 CentOS 7の場合、基本的なスキーマを読み込ませます。
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=cosine,cn=schema,cn=config"
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=nis,cn=schema,cn=config"
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=inetorgperson,cn=schema,cn=config"
 インストールした状態ではDNがdc=my-domain,dc=comで設定されていますので、これを自分のドメインに修正します(dc=bigbang,dc=dyndns,dc=org部分を適宜修正)。

 またこれ以降の作業でldapaddまたはldapmodifyコマンドを実行後、下記のようなエラーが表示される場合があります。
ldap_modify: Inappropriate matching (18)
	additional info: modify/add: olcRootPW: no equality matching rule
ldapmodify: modify operation type is missing at line 2, entry "**********"
 このようにどうしようもなくなった場合、一度OpenLDAP等をアンインストールする、所定のフォルダを削除する等の作業を実施して、再度OpenLDAP等をインストールしてください。
# yum -y remove openldap-servers openldap-clients
# rm -rf /var/lib/ldap
# rm -rf /etc/openldap
# yum -y install openldap-*
 このように最初から作業をやり直すことをおすすめします。
# vi chdomain.ldif
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
  read by dn.base="cn=Manager,dc=bigbang,dc=dyndns,dc=org" read by * none
dn: olcDatabase={2}bdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=bigbang,dc=dyndns,dc=org
dn: olcDatabase={2}bdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=bigbang,dc=dyndns,dc=org
dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}********************************
dn: olcDatabase={2}bdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to attrs=userPassword
  by self write
  by dn="cn=Manager,dc=bigbang,dc=dyndns,dc=org" write
  by anonymous auth
  by * none
olcAccess: {1}to attrs=shadowLastChange
  by self write
  by * read
olcAccess: {2}to dn.base=""
  by * read
olcAccess: {3}to *
  by dn="cn=Manager,dc=bigbang,dc=dyndns,dc=org" write
  by self write
  by * read
# ldapmodify -x -D cn=config -W -f chdomain.ldif
Enter LDAP Password: 
modifying entry "olcDatabase={1}monitor,cn=config"
modifying entry "olcDatabase={2}bdb,cn=config"
modifying entry "olcDatabase={2}bdb,cn=config"
modifying entry "olcDatabase={2}bdb,cn=config"
modifying entry "olcDatabase={2}bdb,cn=config"
 アクセスコントロールリストについては、「ディレクトリサービス OpenLDAP」を参照してください。

 ベースドメインの登録を実施します。
# vi base.ldif
dn: dc=bigbang,dc=dyndns,dc=org
objectClass: dcObject
objectClass: organization
dc: BIGBANG
o: BIGBANG
dn: cn=Manager,dc=bigbang,dc=dyndns,dc=org
objectclass: organizationalRole
cn: Manager
dn: ou=People,dc=bigbang,dc=dyndns,dc=org
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=bigbang,dc=dyndns,dc=org
objectClass: organizationalUnit
ou: Group
dn: ou=Services,dc=bigbang,dc=dyndns,dc=org
objectClass: organizationalUnit
ou: Services
dn: ou=Machines,dc=bigbang,dc=dyndns,dc=org
objectClass: organizationalUnit
ou: Machines
# ldapadd -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W -f base.ldif
Enter LDAP Password: 
adding new entry "dc=bigbang,dc=dyndns,dc=org"
adding new entry "cn=Manager,dc=bigbang,dc=dyndns,dc=org"
adding new entry "ou=People,dc=bigbang,dc=dyndns,dc=org"
adding new entry "ou=Group,dc=bigbang,dc=dyndns,dc=org"
adding new entry "ou=Services,dc=bigbang,dc=dyndns,dc=org"
adding new entry "ou=Machines,dc=bigbang,dc=dyndns,dc=org"
 登録情報を確認します。
# ldapsearch -x -LLL -H ldap:/// -b dc=bigbang,dc=dyndns,dc=org
dn: dc=bigbang,dc=dyndns,dc=org
objectClass: dcObject
objectClass: organization
dc: BIGBANG
o: BIGBANG
dn: cn=Manager,dc=bigbang,dc=dyndns,dc=org
objectClass: organizationalRole
cn: Manager
dn: ou=People,dc=bigbang,dc=dyndns,dc=org
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=bigbang,dc=dyndns,dc=org
objectClass: organizationalUnit
ou: Group
dn: ou=Services,dc=bigbang,dc=dyndns,dc=org
objectClass: organizationalUnit
ou: Services
dn: ou=Machines,dc=bigbang,dc=dyndns,dc=org
objectClass: organizationalUnit
ou: Machines


●ldapviを使用した編集

 OpenLDAP 2.4からは自身の設定ファイルもLDAPデータベースで管理されており、設定を修正するたびにLDIFを作成しldapmodifyして……というのが非常に面倒なので、viでファイルを編集する感覚で使えるldapviというコマンドがEPELにあるので、合わせてインストールしておきます。
# yum --enablerepo=epel install ldapvi
 デフォルトのDCがサンプルのdc=my-domain,dc=comになっているので、まずはこれを自分のドメインに変更します。ldapviの引数はホスト名のキーが-hで、ldapsearchの-Hと微妙に違う点だけ注意してください。
# ldapvi -Y EXTERNAL -h ldapi:/// -b cn=config
(変更箇所のみ記載)
olcAccess: {0}to * \
    by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" \
    read by dn.base="cn=Manager,dc=bigbang,dc=dyndns,dc=org" read by * none
olcSuffix: dc=bigbang,dc=dyndns,dc=org
olcRootDN: cn=Manager,dc=bigbang,dc=dyndns,dc=org
olcLogLevel stats
 viを保存して閉じると、以下のようなプロンプトが表示されます。yで「変更を保存」、eで「編集状態に戻る」、Qで「編集を破棄して終了」、vで「変更をLDIFで表示」です。
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
     21 entries read
add: 0, rename: 0, modify: 1, delete: 0
Action? [yYqQvVebB*rsf+?] v
Action? [yYqQvVebB*rsf+?] y
Done.
 管理者のパスワード変更するには下記のようにします。
# ldapvi -Y EXTERNAL -h ldapi:/// -b olcDatabase={2}hdb,cn=config
olcRootPW: {SSHA}********************************
 LDAPデータベースのアクセス権限を変更するには下記のようにします。
# ldapvi -Y EXTERNAL -h ldapi:/// -b olcDatabase={1}monitor,cn=config
 DbIndexを変更するには下記のようにします。
# ldapvi -Y EXTERNAL -h ldapi:/// -b olcDatabase={2}hdb,cn=config


●OpenLDAPのインストール及び設定(CentOS 6、Fedora 15編)

 ●OpenLDAPのインストール及び調整(通常の方法)以降に記載されている方法ではLDAPユーザ権限でldappasswd等を実行した場合にResult: Insufficient access (50)等が表示されてしまいます。
 下記の方法によりインストールすると問題が解消されました。

 参照先
 LDAPサーバー構築(CentOS 6)
 LDAPクライアントの設定(CentOS 6)

 openldap-servers、openldap-clientsをインストールします。
# yum -y install openldap-servers openldap-clients
 ldapを編集します。
# vi /etc/sysconfig/ldap
SLAPD_LDAPI=yes ← 変更
 slapd.confを作成します。
# vi /etc/openldap/slapd.conf
pidfile     /var/run/openldap/slapd.pid ← 追加
argsfile    /var/run/openldap/slapd.args ← 追加
 /etc/openldap/slapd.dディレクトリ以下を削除し、再作成します。
# rm -rf /etc/openldap/slapd.d/*
# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
config file testing succeeded
 cn=config/olcDatabase\={0}config.ldifを変更します。
# vi /etc/openldap/slapd.d/cn=config/olcDatabase\={0}config.ldif
olcAccess:{0}to * by dn.exact=gidNumber=0+uidNumber=0,
        \ cn=peercred,cn=external,cn=auth manage by * break ← 変更
 cn=config/olcDatabase\={1}monitor.ldifを作成します。
# vi /etc/openldap/slapd.d/cn=config/olcDatabase\={1}monitor.ldif
dn: olcDatabase={1}monitor
objectClass: olcDatabaseConfig
olcDatabase: {1}monitor
olcAccess: {1}to * by dn.exact=gidNumber=0+uidNumber=0,
        \ cn=peercred,cn=external,cn=auth manage by * break
olcAddContentAcl: FALSE
olcLastMod: TRUE
olcMaxDerefDepth: 15
olcReadOnly: FALSE
olcMonitoring: FALSE
structuralObjectClass: olcDatabaseConfig
creatorsName: cn=config
modifiersName: cn=config
 /etc/openldap/slapd.dディレクトリ以下の所有者及びアクセス権を変更します。
# chown -R ldap. /etc/openldap/slapd.d
# chmod -R 700 /etc/openldap/slapd.d
 LDAPの起動させ、また、自動起動を有効にします。
# service slapd start
Starting slapd: [ OK ]
# chkconfig slapd on 
 初期設定を行います。
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/core.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=core,cn=schema,cn=config"
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=cosine,cn=schema,cn=config"
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=nis,cn=schema,cn=config"
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=inetorgperson,cn=schema,cn=config"
 LDAP管理者用のパスワードを作成します。
# slappasswd
New password: ← 入力
Re-enter new password: ← 再入力
{SSHA}xxxxxxxxxxxxxxxxxxxxxxxx
 backend.ldifとfrontend.ldifを作成します。
# vi backend.ldif
# 「dc=***,dc=***」には自己環境に合わせてsuffixに置き換えてください
# 「olcRootPW: ***」にはslappasswdで生成したパスワードに置き換えてください
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulepath: /usr/lib64/openldap
olcModuleload: back_hdb
dn: olcDatabase=hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcSuffix: dc=bigbang,dc=dyndns,dc=org
olcDbDirectory: /var/lib/ldap
olcRootDN: cn=admin,dc=bigbang,dc=dyndns,dc=org
olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx
olcDbConfig: set_cachesize 0 2097152 0
olcDbConfig: set_lk_max_objects 1500
olcDbConfig: set_lk_max_locks 1500
olcDbConfig: set_lk_max_lockers 1500
olcDbIndex: objectClass eq
olcLastMod: TRUE
olcMonitoring: TRUE
olcDbCheckpoint: 512 30
olcAccess: to attrs=userPassword by dn="cn=admin,dc=bigbang,dc=dyndns,dc=org"
        _ write by anonymous auth by self write by * none
olcAccess: to attrs=shadowLastChange by self write by * read
olcAccess: to dn.base="" by * read
olcAccess: to * by dn="cn=admin,dc=bigbang,dc=dyndns,dc=org" write by * read
#ldapadd -Y EXTERNAL -H ldapi:/// -f backend.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=module,cn=config"
adding new entry "olcDatabase=hdb,cn=config"
# vi frontend.ldif
# 「dc=***,dc=***」には自己環境に合わせてsuffixに置き換えてください
# 「userPassword: ***」にはslappasswdで生成したパスワードに置き換えてください
dn: dc=bigbang,dc=dyndns,dc=org
objectClass: top
objectClass: dcObject
objectclass: organization
o: BIGBANG ← 自己環境に合わせる
dc: BIGBANG ← 自己環境に合わせる
dn: cn=admin,dc=bigbang,dc=dyndns,dc=org
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
userPassword: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx
dn: ou=People,dc=bigbang,dc=dyndns,dc=org
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=bigbang,dc=dyndns,dc=org
objectClass: organizationalUnit
ou: Group
# ldapadd -x -D cn=admin,dc=bigbang,dc=dyndns,dc=org -W -f frontend.ldif
Enter LDAP Password: ← 入力
adding new entry "dc=bigbang,dc=dyndns,dc=org"
adding new entry "cn=admin,dc=bigbang,dc=dyndns,dc=org"
adding new entry "ou=People,dc=bigbang,dc=dyndns,dc=org"
adding new entry "ou=Group,dc=bigbang,dc=dyndns,dc=org"
 ローカルユーザを登録します。
# vi ldapuser.sh
# ローカルのUIDが500-999番のユーザを抽出
# 「SUFFIX=***」には自身のsuffixに置き換えてください
#!/bin/bash
SUFFIX='dc=bigbang,dc=dyndns,dc=org'
LDIF='ldapuser.ldif'
echo -n > $LDIF
for line in `grep "x:[5-9][0-9][0-9]:" /etc/passwd | sed -e "s/ /%/g"`
do
   UID1=`echo $line | cut -d: -f1`
   NAME=`echo $line | cut -d: -f5 | cut -d, -f1`
   if [ ! "$NAME" ]
   then
      NAME=$UID1
   else
      NAME=`echo $NAME | sed -e "s/%/ /g"`
   fi
   SN=`echo $NAME | awk '{print $2}'`
   if [ ! "$SN" ]
   then
      SN=$NAME
   fi
   GIVEN=`echo $NAME | awk '{print $1}'`
   UID2=`echo $line | cut -d: -f3`
   GID=`echo $line | cut -d: -f4`
   PASS=`grep $UID1: /etc/shadow | cut -d: -f2`
   SHELL=`echo $line | cut -d: -f7`
   HOME=`echo $line | cut -d: -f6`
   EXPIRE=`passwd -S $UID1 | awk '{print $7}'`
   FLAG=`grep $UID1: /etc/shadow | cut -d: -f9`
   if [ ! "$FLAG" ]
   then
      FLAG="0"
   fi
   WARN=`passwd -S $UID1 | awk '{print $6}'`
   MIN=`passwd -S $UID1 | awk '{print $4}'`
   MAX=`passwd -S $UID1 | awk '{print $5}'`
   LAST=`grep $UID1: /etc/shadow | cut -d: -f3`
   echo "dn: uid=$UID1,ou=People,$SUFFIX" >> $LDIF
   echo "objectClass: inetOrgPerson" >> $LDIF
   echo "objectClass: posixAccount" >> $LDIF
   echo "objectClass: shadowAccount" >> $LDIF
   echo "uid: $UID1" >> $LDIF
   echo "sn: $SN" >>$LDIF
   echo "givenName: $GIVEN" >> $LDIF
   echo "cn: $NAME" >> $LDIF
   echo "displayName: $NAME" >> $LDIF
   echo "uidNumber: $UID2" >> $LDIF
   echo "gidNumber: $GID" >> $LDIF
   echo "userPassword: {crypt}$PASS" >> $LDIF
   echo "gecos: $NAME" >> $LDIF
   echo "loginShell: $SHELL" >> $LDIF
   echo "homeDirectory: $HOME" >> $LDIF
   echo "shadowExpire: $EXPIRE" >> $LDIF
   echo "shadowFlag: $FLAG" >> $LDIF
   echo "shadowWarning: $WARN" >> $LDIF
   echo "shadowMin: $MIN" >> $LDIF
   echo "shadowMax: $MAX" >> $LDIF
   echo "shadowLastChange: $LAST" >> $LDIF
   echo >> $LDIF
done
# sh ldapuser.sh ← ldapuser.shを実行
 ldapuser.ldifが作成される
# ldapadd -x -D cn=admin,dc=bigbang,dc=dyndns,dc=org -W -f ldapuser.ldif
Enter LDAP Password: ← 入力
adding new entry "uid=centos5,ou=People,dc=bigbang,dc=dyndns,dc=org"
adding new entry "uid=centos6,ou=People,dc=bigbang,dc=dyndns,dc=org"
adding new entry "uid=fedora14,ou=People,dc=bigbang,dc=dyndns,dc=org"
adding new entry "uid=fedora15,ou=People,dc=bigbang,dc=dyndns,dc=org"
 ローカルグループを登録
# vi ldapgroup.sh
# ローカルのGIDが500-999番のグループを抽出する
# 「SUFFIX=***」には自身の suffix に置き換えてください
#!/bin/bash
SUFFIX='dc=bigbang,dc=dyndns,dc=org'
LDIF='ldapgroup.ldif'
echo -n > $LDIF
for line in `grep "x:[5-9][0-9][0-9]:" /etc/group`
do
   CN=`echo $line | cut -d: -f1`
   GID=`echo $line | cut -d: -f3`
   echo "dn: cn=$CN,ou=Group,$SUFFIX" >> $LDIF
   echo "objectClass: posixGroup" >> $LDIF
   echo "cn: $CN" >> $LDIF
   echo "gidNumber: $GID" >> $LDIF
   users=`echo $line | cut -d: -f4 | sed "s/,/ /g"`
   for user in ${users} ; do
      echo "memberUid: ${user}" >> $LDIF
   done
   echo >> $LDIF
done
# sh ldapgroup.sh ← ldapuser.shを実行
 ldapgroup.ldifが作成される
# ldapadd -x -D cn=admin,dc=bigbang,dc=dyndns,dc=org -W -f ldapgroup.ldif
Enter LDAP Password: ← 入力
adding new entry "cn=centos5,ou=Group,dc=bigbang,dc=dyndns,dc=org"
adding new entry "cn=centos6,ou=Group,dc=bigbang,dc=dyndns,dc=org"
adding new entry "cn=fedora14,ou=Group,dc=bigbang,dc=dyndns,dc=org"
adding new entry "cn=fedora15,ou=Group,dc=bigbang,dc=dyndns,dc=org"
 登録したユーザとグループを削除する場合は以下のようにします。
# ldapdelete -x -W -D 'cn=admin,dc=bigbang,dc=dyndns,dc=org' 
                \ "uid=centos5,ou=People,dc=bigbang,dc=dyndns,dc=org"
Enter LDAP Password: ← 入力
# ldapdelete -x -W -D 'cn=admin,dc=bigbang,dc=dyndns,dc=org'
                \ "cn=centos5,ou=Group,dc=bigbang,dc=dyndns,dc=org"
Enter LDAP Password: ← 入力

●LDAPのマルチマスターレプリケーションの設定

 参考にしたページ
 OpenLDAP マルチマスターレプリケーション
 OpenLDAPの構築
 OpenLDAPマルチマスタ(ミラーモード)

 mod_syncprovを設定します。syncporv.laが存在しているディレクトリーのPATHを設定します。PATHはOSによって異なりますので確認しながら設定してください。すべてのサーバで設定します。
# vi mod_syncprov.ldif
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib64/openldap
olcModuleLoad: syncprov.la
# ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=module,cn=config"
 syncprovを設定します。syncporv.laが存在しているディレクトリーのPATHを設定します。すべてのサーバで設定します。
# vi syncprov.ldif
dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpSessionLog: 100
# ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "olcOverlay=syncprov,olcDatabase={2}hdb,cn=config"
 olcServerIDを設定します。LDAPマスターとする全てのサーバで設定をします。ただし、olcServerIDの番号は、サーバごとにことなるものを指定します。
# vi olcServerID.ldif
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 2
# ldapmodify -Y EXTERNAL -H ldapi:/// -f olcServerID.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
 olcModuleLoadを設定します。syncporv.laが存在しているディレクトリーのPATHを設定します。LDAPマスターとする全てのサーバで設定をします。
# vi olcModuleLoad.ldif
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: syncprov
# ldapmodify -Y EXTERNAL -H ldapi:/// -f olcModuleLoad.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=module{0},cn=config"
 olcDbIndexを設定します。LDAPマスターとする全てのサーバで設定をします。
# vi olcDbIndex.ldif
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: entryCSN eq
-
add: olcDbIndex
olcDbIndex: entryUUID eq
# ldapmodify -Y EXTERNAL -H ldapi:/// -f olcDbIndex.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}hdb,cn=config"
下記はCentOS 6での失敗例です。
# ldapmodify -Y EXTERNAL -H ldapi:/// -f olcDbIndex.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}hdb,cn=config"
ldap_modify: No such object (32)
	matched DN: cn=config
# ldapmodify -Y EXTERNAL -H ldapi:/// -f olcDbIndex.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}hdb,cn=config"
ldap_modify: No such object (32)
	matched DN: cn=config
下記はCentOS 6での成功例です。
# ldapmodify -Y EXTERNAL -H ldapi:/// -f olcDbIndex.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}bdb,cn=config"
 レプリケーション用ユーザを作成します。レプリケーションは参照さえできれば良いためRootDN(Manager)とは別にユーザを作成します。
# vi user_Replication.ldif 
dn: cn=Replication,dc=bigbang,dc=dyndns,dc=org
cn: Replication
objectClass: organizationalRole
objectClass: simpleSecurityObject
userPassword: {SSHA}**********************************
# ldapadd -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W -f user_Replication.ldif
 olcSyncReplを設定します。ミラーモードの設定を含みます。LDAPマスターとする全てのサーバで設定をします。ただし、それぞれのサーバーで「olcServerID」は一意の ID を、「provider=***」には相手側のサーバーを指定してください。
# vi olcSyncRepl.ldif 
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001 provider=ldap://192.168.0.1
 bindmethod=simple binddn="cn=Replication,dc=bigbang,dc=dyndns,dc=org" credentials=password
 scope=sub searchbase="dc=bigbang,dc=dyndns,dc=org" schemachecking=on
 type=refreshAndPersist retry="30 5 300 3" interval=00:00:05:00
-
add: olcMirrorMode
olcMirrorMode: TRUE
# ldapmodify -Y EXTERNAL -H ldapi:/// -f olcSyncRepl.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}hdb,cn=config"
下記はCentOS 6での失敗例です。
# ldapmodify -Y EXTERNAL -H ldapi:/// -f olcSyncRepl.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}hdb,cn=config"
ldap_modify: No such object (32)
	matched DN: cn=config
下記はCentOS 6での成功例です。
# ldapmodify -Y EXTERNAL -H ldapi:/// -f olcSyncRepl.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}bdb,cn=config"
※設定値の意味
# リトライ間隔 リトライ回数 再リトライまでの間隔 再リトライ回数
retry="30 5 300 3"
# レプリケーションの間隔
interval=00:00:05:00
下記はCentOS 7での失敗例です。
# ldapmodify -Y EXTERNAL -H ldapi:/// -f olcSyncRepl.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}hdb,cn=config"
ldap_modify: No such object (32)
	matched DN: cn=config
# ldapmodify -Y EXTERNAL -H ldapi:/// -f olcSyncRepl.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}bdb,cn=config"
ldap_modify: No such object (32)
	matched DN: cn=config
 olcOverlayを設定します。LDAPマスターとする全てのサーバで設定をします。
# vi olcOverlay.ldif
dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
# ldapmodify -Y EXTERNAL -H ldapi:/// -f olcOverlay.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "olcOverlay=syncprov,olcDatabase={2}hdb,cn=config"
下記はCentOS 6での失敗例です。
# ldapmodify -Y EXTERNAL -H ldapi:/// -f olcOverlay.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "olcOverlay=syncprov,olcDatabase={2}hdb,cn=config"
ldap_add: No such object (32)
	matched DN: cn=config
下記はCentOS 6での成功例です。
# ldapmodify -Y EXTERNAL -H ldapi:/// -f olcOverlay.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "olcOverlay=syncprov,olcDatabase={2}bdb,cn=config"
 LDAP クライアント側で全てのマスターを参照先として設定します。以上で設定完了です。データの登録はいずれのサーバからでも可能となっています。
# authconfig --enableldapauth --ldapserver=192.168.0.1,192.168.0.2 \
   --ldapbasedn="dc=bigbang,dc=dyndns,dc=org" --enablemkhomedir --disableldaptls --update

●LDAPのマルチマスターレプリケーションの設定(3台)

 3台でマルチマスターレプリケーションできるかどうか実験してみます。

 パターンA(1台をハブとする方法)

 ・サーバ情報
  サーバA(rid: 001、olcServerID: 1)
  サーバB(rid: 001、olcServerID: 2)
  サーバC(rid: 001、olcServerID: 3)

 サーバAはサーバB及びサーバCと双方向で同期するように設定します。
 ただし、サーバBとサーバCは双方向で同期しません。
 同期設定内容は下記コマンドで確認します。
# ldapsearch -x -LLL -D "cn=config" -W -b "cn=config" '(objectClass=*)' > /tmp/ldap.txt
Enter LDAP Password: 
# less /tmp/ldap.txt

 この条件のもと、あるユーザのパスワードを変更し同期するかどうか確認します。
 サーバAでパスワード変更を実施。
# ldappasswd -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" \
        -W -S "uid=sato,ou=People,dc=bigbang,dc=dyndns,dc=org";date
New password: 
Re-enter new password: 
Enter LDAP Password: 
 サーバB、サーバCでパスワードが変更されていることを確認しました。
# ldapsearch -x -D "uid=sato,ou=People,dc=bigbang,dc=dyndns,dc=org" \
        -W -b "dc=bigbang,dc=dyndns,dc=org" "(uid=sato)";date
 上記で表示されるuserPassword::部分を比較します。
 同様に、サーバB、サーバCの順にパスワードを変更し他のサーバでパスワードが変更されていることを確認しました。

 パターンB(3台ともハブとする方法)

 ・サーバ情報
  サーバA(rid: 001、olcServerID: 1)
  サーバB(rid: 001、olcServerID: 2)
  サーバC(rid: 001、olcServerID: 3)

 サーバA、サーバB、サーバCの各サーバで双方向で同期するように設定します。
 同期設定内容は下記コマンドで確認します。
# ldapsearch -x -LLL -D "cn=config" -W -b "cn=config" '(objectClass=*)' > /tmp/ldap.txt
Enter LDAP Password: 
# less /tmp/ldap.txt

 この条件のもと、あるユーザのパスワードを変更し同期するかどうか確認します。
 サーバA(サーバB、サーバC)でパスワード変更を実施。
# ldappasswd -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" \
        -W -S "uid=sato,ou=People,dc=bigbang,dc=dyndns,dc=org";date
New password: 
Re-enter new password: 
Enter LDAP Password: 
 サーバB(サーバA、サーバC)、サーバC(サーバA、サーバ)でパスワードが変更されていることを確認しました。
# ldapsearch -x -D "uid=sato,ou=People,dc=bigbang,dc=dyndns,dc=org" \
        -W -b "dc=bigbang,dc=dyndns,dc=org" "(uid=sato)";date
 上記で表示されるuserPassword::部分を比較します。

●LDAPクライアントのセットアップ(CentOS 7)

 openldap-clients及びnss-pam-ldapdをインストールします。
# yum -y install openldap-clients nss-pam-ldapd
 nslcdを自動起動するようにします。
# systemctl enable nslcd
# systemctl start nslcd
 authconfigコマンドを実行します。
# authconfig --enableldapauth --ldapserver=192.168.0.1,192.168.0.2 \
    --ldapbasedn="dc=bigbang,dc=dyndns,dc=org" --enablemkhomedir --disableldaptls --update
 「--ldapserver」で設定するサーバはldapsearch等の実行時にアクセスする順番となります。ローカルサーバ上でLDAPサーバが動作している時はローカルサーバを先頭に記載してください。
 これで設定はほぼ完了です。内容を確認するには下記コマンドを実行します。
# authconfig --test
 LDAPクライアントとしての動作確認をします。
$ getent passwd
$ getent shadow
$ getent group
$ id (LDAPアカウント)
 LDAPに登録されている情報が表示されればOKです。

 情報が表示されない場合の対処
 /etc/openldap/ldap.confファイルを編集します。
# vi /etc/openldap/ldap.conf

URI ldap://192.168.0.1/
BASE dc=bigbang,dc=dyndns,dc=org
 /etc/nsswitch.confファイルを編集します。
# vi /etc/nsswitch.conf
passwd:     files sss ldap
shadow:     files sss ldap
group:      files sss ldap
 これでも情報が表示されなければ、LDAPサーバでldapのポートが開放されているかどうか確認します。
# firewall-cmd --list-service
dns http https ssh
 ldapのポートを開放します。
# firewall-cmd --add-service=ldap --permanent
success

# firewall-cmd --reload
success

# firewall-cmd --list-service
dns http https ldap ssh
 これでも表示されなければ、下記ファイルを確認します。
 /etc/pam.d/system-authファイルにpam_ldap.soがあるか確認します。
 /etc/pam.d/password-authファイルにpam_ldap.soがあるか確認します。
 確認方法は「●SSHでログインできるか確認する」を参考にしてください。
 再度、LDAPクライアントとしての動作確認をします。
$ getent passwd
$ getent shadow
$ getent group
$ id (LDAPアカウント)
 LDAPに登録されている情報が表示されればOKです。



 以下作業は、CentOS 6、CentOS 7で不要。

 参照URL:LDAP 認証 - クライアントのセットアップ

 SSSDで基本的な認証を実施しない場合

 /etc/pam.d/su及び/etc/pam.d/su-lでsufficientのpam_ldap.soを下記のように追加します。
 pam_ldap.soを下記の位置に記載しない場合、rootからsuする場合もパスワードの入力を催促されるようになります。
 su-lファイルはユーザがsu --loginを実行したときに使用されます。authセクションにpam_unixの記載がある場合は、use_first_passを追加してください。
# vi /etc/pam.d/su
#%PAM-1.0
auth		sufficient	pam_rootok.so
auth		sufficient	pam_ldap.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth		sufficient	pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth		required	pam_wheel.so use_uid
auth		substack	system-auth
auth		include		postlogin
account		sufficient	pam_ldap.so
account		sufficient	pam_succeed_if.so uid = 0 use_uid quiet
account		include		system-auth
password	include		system-auth
session		sufficient	pam_ldap.so
session		include		system-auth
session		include		postlogin
session		optional	pam_xauth.so
# vi /etc/pam.d/su-l
#%PAM-1.0
auth            sufficient      pam_ldap.so
auth            include         su
account         sufficient      pam_ldap.so
account         include         su
password        include         su
session         sufficient      pam_ldap.so
session         optional        pam_keyinit.so force revoke
session         include         su
 ユーザが自分のパスワードを編集できるように、/etc/pam.d/passwdを編集します。
# vi /etc/pam.d/passwd
#%PAM-1.0
auth       include      system-auth
account    include      system-auth
password   sufficient   pam_ldap.so
password   substack     system-auth
-password   optional    pam_gnome_keyring.so use_authtok
password   substack     postlogin
 ログイン時にホームフォルダを作成したい場合(例:ホームフォルダを共有するのにNFSを使わない場合)、/etc/pam.d/loginを編集して pam_mkhomedir.soをsessionセクションの「sufficient」アイテムの上に追加してください。ssh、xdm、kdm、gdmなどからttyにログインしたときにホームフォルダが作成されるようになります。同じように/etc/pam.d/suや/etc/pam.d/su-lなどのファイルも編集することで、suやsu --loginでもホームフォルダの作成を有効にできます。sshログインの場合はホームフォルダを作成して欲しくないときはloginなどのかわりにlocal-loginを編集してください。
# vi /etc/pam.d/su
#%PAM-1.0
(途中省略)
password        include         system-auth
session         required        pam_mkhomedir.so skel=/etc/skel umask=077
session         sufficient      pam_ldap.so
session         include         system-auth
session         include         postlogin
session         optional        pam_xauth.so
# vi /etc/pam.d/su-l
#%PAM-1.0
(途中省略)
session         include         su
session         required        pam_mkhomedir.so skel=/etc/skel umask=077
session         sufficient      pam_ldap.so
 LDAPユーザからsudoを使用できるするには、/etc/pam.d/sudoを編集します。sudoersもあわせて編集する必要があります。
# vi /etc/pam.d/sudo
#%PAM-1.0
auth      sufficient    pam_ldap.so
auth      required      pam_unix.so  try_first_pass
auth      required      pam_nologin.so
 また、/etc/openldap/ldap.conf に以下を追加してください:
# vi /etc/openldap/ldap.conf
sudoers_base ou=sudoers,dc=AFOLA

 SSSDで基本的な認証を有効にする方法


●「su: 警告: ディレクトリを /home/sato に変更できません」と表示される

 ●LDAPクライアントのセットアップ(CentOS 7)に記載してあるとおりauthconfigコマンドを実行しましたがFedora 22が動作しているサーバで下記のようなエラーが表示されました。
[user@m-server ~]$ su - sato
パスワード:
su: 警告: ディレクトリを /home/sato に変更できません: そのようなファイルやディレクトリはありません
-bash-4.3$
 ます、/etc/pam.d/suを編集しログイン後にホームディレクトリが作成されるかどうか確認します。
# vi /etc/pam.d/su
#%PAM-1.0
auth            sufficient      pam_rootok.so
auth            sufficient      pam_ldap.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth           sufficient      pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth           required        pam_wheel.so use_uid
auth            substack        system-auth
auth            include         postlogin
account         sufficient      pam_ldap.so
account         sufficient      pam_succeed_if.so uid = 0 use_uid quiet
account         include         system-auth
password        include         system-auth
session         required        pam_mkhomedir.so skel=/etc/skel umask=077
session         sufficient      pam_ldap.so
session         include         system-auth
session         include         postlogin
session         optional        pam_xauth.so
 残念ながら想定したとおりとなりませんでした。
$ su - sato
パスワード:
su: 警告: ディレクトリを /home/sato に変更できません: そのようなファイルやディレクトリはありません
-bash-4.3$
 次に、/etc/pam.d/su-lを編集しログイン後にホームディレクトリが作成されるかどうか確認します。
# vi /etc/pam.d/su-l
#%PAM-1.0
auth            sufficient      pam_ldap.so
auth            include         su
account         sufficient      pam_ldap.so
account         include         su
password        include         su
session         required        pam_mkhomedir.so skel=/etc/skel umask=077
session         sufficient      pam_ldap.so
session         optional        pam_keyinit.so force revoke
session         include         su
 今度は想定とおりホームディレクトリが作成されました。
$ su - sato
パスワード:
ディレクトリ '/home/sato' を作成中
[sato@m-server ~]$


●LDAPユーザでSSHログインできない

 Fedora 22が動作しているサーバで下記のようなエラーが表示されました。
[user@n-server ~]$ ssh sato@mercury
sato@mercury's password: 
Permission denied, please try again.
sato@mercury's password: 
Permission denied, please try again.
sato@mercury's password: 
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
 /var/log/secureには下記のようなログが記録されていました。

May 2 10:43:04 mercury sshd[28713]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.0.4 user=sato
May 2 10:43:04 mercury sshd[28713]: pam_sss(sshd:auth): Request to sssd failed. Connection refused
May 2 10:43:06 mercury sshd[28713]: Failed password for sato from 192.168.0.4 port 46053 ssh2
May 2 10:43:10 mercury sshd[28713]: pam_sss(sshd:auth): Request to sssd failed. Connection refused
May 2 10:43:10 mercury sshd[28713]: pam_reauthorize: couldn't set permissions on kernel key: reauthorize/secret/sato: Permission denied
May 2 10:43:11 mercury sshd[28713]: Failed password for sato from 192.168.0.4 port 46053 ssh2
May 2 10:43:14 mercury sshd[28713]: pam_sss(sshd:auth): Request to sssd failed. Connection refused
May 2 10:43:14 mercury sshd[28713]: pam_reauthorize: couldn't set permissions on kernel key: reauthorize/secret/sato: Permission denied
May 2 10:43:15 mercury sshd[29011]: Connection closed by 192.168.0.12 [preauth] May 2 10:43:17 mercury sshd[28713]: Failed password for sato from 192.168.0.4 port 46053 ssh2
May 2 10:43:17 mercury sshd[28713]: Connection closed by 192.168.0.4 [preauth]
May 2 10:43:17 mercury sshd[28713]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.0.4 user=sato
 ●SSHでログインできるか確認するを参考にして設定します。
 上記の方法で問題なくSSHログインできるようになりました。

●LDAPクライアントのインストール及び設定(CentOS 6、Fedora 15編)

 openldap-clients及びnss-pam-ldapdをインストールします。
# yum -y install openldap-clients nss-pam-ldapd
 依存性関係でnscd-2.14-5.i686、pam_ldap-185-9.fc15.i686もインストールされました。
 下記コマンドを実行します。
# authconfig --enableldapauth --ldapserver=192.168.0.1,192.168.0.2 \
    --ldapbasedn="dc=bigbang,dc=dyndns,dc=org" --enablemkhomedir --disableldaptls --update
 これで設定はほぼ完了です。内容を確認するには下記コマンドを実行します。
# authconfig --test

 下記はこれまで各ファイルを手動で編集した方法です。斜字体は読み飛ばしてください。
 ldap.confを編集します。
# vi /etc/openldap/ldap.conf
URI ldap://127.0.0.1/ ← LDAPサーバの指定
BASE dc=bigbang,dc=dyndns,dc=org ← 自己環境に合わせる
TLS_CACERTDIR /etc/openldap/certs
 LDAPサーバの指定及びLDAPベースDN設定は以下のコマンドでも可能です。
# authconfig --ldapserver=<デフォルトのLDAPサーバ> --update
# authconfig --ldapbasedn=<デフォルトのLDAPベースDN> --update
 nslcd.confを編集します。
# vi /etc/nslcd.conf
uri ldap://127.0.0.1/ ← LDAPサーバの指定
base dc=bigbang,dc=dyndns,dc=org ← 自己環境に合わせる
ssl no
tls_cacertdir /etc/openldap/certs
 pam_ldap.confを編集します。
 今まで、使用していた/etc/ldap.confは存在しないようです。
# vi /etc/pam_ldap.conf
# host 127.0.0.1 ← コメントアウト
base dc=bigbang,dc=dyndns,dc=org ← 自己環境に合わせる
uri ldap://127.0.0.1/ ← LDAPサーバの指定
ssl no
tls_cacertdir /etc/openldap/certs
pam_password md5
 以下のコマンドでも可能です。
# authconfig --enableldapauth --update
 system-authを編集します。
# vi /etc/pam.d/system-auth
# 以下のように追記
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        sufficient    pam_fprintd.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        sufficient    pam_ldap.so use_first_pass
 ↑ pam_sss.soやpam_krb5.soより先に記載しないと、LDAPでログインできない
auth        sufficient    pam_sss.so use_first_pass
auth        sufficient    pam_krb5.so use_first_pass
auth        required      pam_deny.so
account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     [default=bad success=ok user_unknown=ignore] pam_ldap.so
 ↑ pam_sss.soやpam_krb5.soより先に記載しないと、LDAPでログインできない
account     [default=bad success=ok user_unknown=ignore] pam_sss.so
account     [default=bad success=ok user_unknown=ignore] pam_krb5.so
account     required      pam_permit.so
password    requisite     pam_cracklib.so try_first_pass retry=3 type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    sufficient    pam_ldap.so use_authtok
 ↑ pam_sss.soやpam_krb5.soより先に記載しないと、LDAPでログインできない
password    sufficient    pam_sss.so use_authtok
password    sufficient    pam_krb5.so use_authtok
password    required      pam_deny.so
session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_ldap.so
 ↑ pam_sss.soやpam_krb5.soより先に記載しないと、LDAPでログインできない
session     optional      pam_sss.so
session     optional      pam_krb5.so
# 必要であれば追記(ログイン時にホームディレクトリを自動作成)
session     optional      pam_mkhomedir.so skel=/etc/skel umask=077
*補足
 skel=/etc/skel umask=077はLDAPサーバがリモートである場合、ローカル側で自動作成されるホームディレクトリではumaskが有効にならない。ホームディレクトリのアクセス権が700ではなく755になってしまう。

 nsswitch.confを編集します。
# vi /etc/nsswitch.conf
passwd: files ldap ← 追記
shadow: files ldap ← 追記
group:  files ldap ← 追記
netgroup: ldap ← 変更
automount: files ldap ← 変更
 LDAP認証の有効化は下記コマンドで可能です。
# authconfig --enableldapauth --update
 authconfigを編集します。
# vi /etc/sysconfig/authconfig
USELDAP=yes ← 変更
 nslcdを自動起動するようにします
# chkconfig nslcd on
# service nslcd start
または
# systemctl enable nslcd
# systemctl start nslcd
 全ての設定内容は「authconfig --test」にて確認できます。また、getent passwdを実行することにより登録されているLDAPユーザを確認することができるはずです。
 サーバを再起動します。(Cent OS 7でサーバを再起動しなくても動作することを確認)
# shutdown -r now
login: test5000 ← LDAPに登録されているユーザ
Password:
ディレクトリ  '/home/test5000' を作成中
$ ← ログインできた
$ passwd ← LDAPパスワードを変更してみる
Changing password for user test5000.
Enter login(LDAP) password: ← 該当ユーザのLDAPパスワードを入力
新しいパスワード ← 新しいLDAPパスワードを入力
新しいパスワードを再入力してください: ← 新しいLDAPパスワードを再入力
LDAP password information changed for test5000
passwd: 全ての認証トークンが正しく更新できました。
 この時の/etc/openldap/slapd.dディレクトリ以下は下記のとおりです。
# ls -l /etc/openldap/slapd.d
drwx------ 3 ldap ldap 4096 10月 22 22:25 2011 cn=config
-rwx------ 1 ldap ldap  988 10月 22 22:16 2011 cn=config.ldif
# ls -l /etc/openldap/slapd.d/cn\=config
-rw------- 1 ldap ldap   463 10月 22 22:25 2011 cn=module{0}.ldif
drwxr-x--- 2 ldap ldap  4096 10月 22 22:20 2011 cn=schema
-rwx------ 1 ldap ldap 50253 10月 22 22:16 2011 cn=schema.ldif
-rwx------ 1 ldap ldap   499 10月 22 22:16 2011 olcDatabase={-1}frontend.ldif
-rwx------ 1 ldap ldap   562 10月 22 22:17 2011 olcDatabase={0}config.ldif
-rwx------ 1 ldap ldap   379 10月 22 22:17 2011 olcDatabase={1}monitor.ldif
-rw------- 1 ldap ldap  1193 10月 22 22:25 2011 olcDatabase={2}hdb.ldif
 設定を確認します。
$ getent passwd
$ getent shadow
$ getent group
$ id (LDAPアカウント)
 LDAPに登録されている情報が表示されればOKです。
 LDAPクライアントからLDAPにあるアカウントで接続しようとしたら接続出来ませんでした。ログを確認すると下記のようなエラーが記録されていました。
Dec 18 10:29:09 serverA slapd[4481]:
        \ conn=1414 fd=27 ACCEPT from IP=192.168.0.1:49215 (IP=0.0.0.0:389)
Dec 18 10:29:09 serverA slapd[4481]:
        \ conn=1414 op=0 EXT oid=1.3.6.1.4.1.1466.20037
Dec 18 10:29:09 serverA slapd[4481]:
        \ conn=1414 op=0 do_extended: unsupported operation "1.3.6.1.4.1.1466.20037"
Dec 18 10:29:09 serverA slapd[4481]:
        \ conn=1414 op=0 RESULT tag=120 err=2 text=unsupported extended operation
Dec 18 10:29:09 serverA slapd[4481]: conn=1414 op=1 UNBIND
Dec 18 10:29:09 serverA slapd[4481]: conn=1414 fd=27 closed
 これはLinuxクライアント上でLDAP+TLS併用機能を有効化しているために発生する要求です。サーバに対して正しいSSL要求を行うか、以下の手順でLDAP+TLS併用機能を無効化します。
# authconfig --disableldaptls --update

●LDAPクライアントのインストール及び設定(CentOS 5編)

 「CentOS5での設定」を参照しました。

 下記パッケージが必要となります。
・nss_ldap
・php-ldap
・nss_ldap
・openldap-clients
・openldap
・openldap-devel
 CentOSでは、ログイン認証の方式を容易に変更できるauthconfigというツールが用意されているのそれを利用してLDAPのための基本的な設定を実施します。
 なお、authconfigはGUI(X Window:authconfig-gui)用とCUI(テキストコンソール: authconfig-tui)用の2つが用意されているで、実行環境に合わせて選択してください。ここでは、authconfig-tuiを使った設定を説明します。
 コンソール画面を起動したら
# LANG=C; authconfig-tui 
を実行します。すると、下記のような画面が表示されます。

authconfig-01.jpg

 ここで、下記の項目を有効にします。

LDAPの利用項目 パラメータ 状態 意味
User Information Cache Information 有効 情報をLDAPキャッシュを経由して検索する
Use LDAP 有効 ユーザ情報の取得をLDAPから取得する
Authentication Use MD5 Passwords 有効 パスワードにMD5暗号を利用する
Use Shadow Passwords 有効 シャドーパスワードを利用する
Use LDAP Authntication 有効 LDAPを使った認証を有効にする


 [Next]をクリックすると、次の画面が表示されます。

authconfig-02.jpg

 ここで入力するのは、下記のような内容になります。

パラメータ 意味
Use TLS SSL暗号でLDAPサーバと通信する場合に有効にします。 ただし、Active Directoryとの間ではSSLは使えないので無効にしておきます。
Server LDAPサーバのアドレスを指定します。サーバアドレスは、DNSなどに障害があった場合でも認証が受けられるようにするため、IPアドレスで指定するほうが良いと思われます。
Base DN LDAPの検索を行う場合にどのDN名をベースにするかを選択します。ベースの範囲を狭めることで検索に必要な時間が短縮可能です。例えば、ADの標準ユーザ情報コンテナである「CN=Users,DC=xxx,DC=xxx)を指定すれば、LDAP情報はこのコンテナに登録されているものだけを検索します。また、自分でADに専用のオブジェクトコンテナを作成した場合には、それを使うようにすることも可能です(ex. OU=Users,OU=Unix,DC=xxx,DC=xxx)。ADのLDAPにどんなコンテナがあるかは、AD上にてmmcを起動して"ADSI Editスナップイン"を追加してドメインの情報に接続すれば、内容を表示・編集が可能になります。


 /etc/openldap/ldap.conf は、LDAPクライアント(ex. ldapsearchなど)で使用されるファイルで、LDAPサーバの情報を定義しています。このファイルが上記で設定した内容となっていることを確認してください。
#
# LDAP Defaults
#
# See ldap.conf(5) for details
# This file should be world readable but not world writable.
#BASE dc=example, dc=com
#URI ldap://ldap.example.com ldap://ldap-master.example.com:666
#SIZELIMIT 12
#TIMELIMIT 15
#DEREF never
URI ldap://192.168.100.30/
BASE dc=robata,dc=org
TLS_CACERTDIR /etc/openldap/certs
これらの設定は、authconfig ツールを使うと書き換えられてしまいますのでご注意ください。

●OpenLDAPのインストール及び調整(通常の方法)

 この情報は古いです(2016.04.13)

 OSはCentOS 6.0です。OpenLDAP関連のパッケージで何がインストール済みなのか確認します。
 OpenLDAPのバージョンが2.4.19から2.4.23に変更(2011.12.11、CenOS6)となり挙動が変わったようです。
 赤字で示しているのがその箇所です。
# yum list installed '*ldap*'
Installed Packages
apr-util-ldap.i686     1.3.9-3.el6_0.1    @updates                              
bind-dyndb-ldap.i686   0.1.0-0.9.b.el6    @anaconda-centos-201106051823.i386/6.0
krb5-server-ldap.i686  1.8.2-3.el6_0.7    @updates                              
mod_authz_ldap.i686    0.26-15.el6        @anaconda-centos-201106051823.i386/6.0
nss-pam-ldapd.i686     0.7.5-3.el6        @anaconda-centos-201106051823.i386/6.0
openldap.i686          2.4.19-15.el6_0.2  @updates                              
openldap-clients.i686  2.4.19-15.el6_0.2  @updates                              
openldap-devel.i686    2.4.19-15.el6_0.2  @updates                              
openldap-servers.i686  2.4.19-15.el6_0.2  @updates                              
pam_ldap.i686          185-5.el6          @anaconda-centos-201106051823.i386/6.0
php-ldap.i686          5.3.2-6.el6_0.1    @updates                              
python-ldap.i686       2.3.10-1.el6       @anaconda-centos-201106051823.i386/6.0
 少なくともopenldapパッケージ、openldap-clientsパッケージ、openldap-serversパッケージおよびnss_ldapパッケージがインストールされています。以上で、OpenLDAPサーバおよびクライアントツールが利用可能となります。
 不足のパッケージがある場合は、下記のようにインストールします。
# yum -y install openldap-clients.i686
# yum -y install openldap-servers.i686
 上記は、openldap-clientsパッケージ、openldap-serversパッケージをインストールする場合の例です。
 openldap-serversのインストール直後の/etc/openldap/slapd.d等の状態は下記のようになっています。
# ls -l /etc/openldap/
drwxr-xr-x 3 root root 4096  10月 19 00:01 2011 schema
drwx------ 3 ldap ldap 4096  10月 19 00:01 2011 slapd.d
# ls -l /etc/openldap/slapd.d
drwx------ 3 ldap ldap 4096 10月 19 00:01 2011 cn=config
-rw------- 1 ldap ldap 1007 10月 19 00:01 2011 cn=config.ldif
# ls -l /etc/openldap/slapd.d/cn\=config
drwx------ 2 ldap ldap  4096 10月 19 00:01 2011 cn=schema
-rw------- 1 ldap ldap 51236 10月 19 00:01 2011 cn=schema.ldif
-rw------- 1 ldap ldap   499 10月 19 00:01 2011 olcDatabase={-1}frontend.ldif
-rw------- 1 ldap ldap   496 10月 19 00:01 2011 olcDatabase={0}config.ldif
-rw------- 1 ldap ldap  1176 10月 19 00:01 2011 olcDatabase={1}bdb.ldif
-rw------- 1 ldap ldap   521 10月 19 00:01 2011 olcDatabase={2}monitor.ldif
 openldap-serversパッケージにサンプルとして付属する「DB_CONFIGファイル」をOpenLDAPサーバのデータディレクトリにコピーします。DB_CONFIGの詳細については●DB_CONFIGを参照してください。
# cp /usr/share/doc/openldap-servers-2.4.19/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
 slapdデーモンを起動します。
# service slapd start
slapd を起動中:		[  OK  ]
 この時、/var/lib/ldapフォルダにデータベースが作成されます。
# ls -l /var/lib/ldap
合計 808
-rw------- 1 ldap ldap    24576  9月 30 01:05 2011 __db.001
-rw------- 1 ldap ldap   180224  9月 30 01:05 2011 __db.002
-rw------- 1 ldap ldap   270336  9月 30 01:05 2011 __db.003
-rw------- 1 ldap ldap   163840  9月 30 01:05 2011 __db.004
-rw------- 1 ldap ldap   548864  9月 30 01:05 2011 __db.005
-rw------- 1 ldap ldap    32768  9月 30 01:05 2011 __db.006
-rw-r--r-- 1 ldap ldap     2048  9月 30 01:05 2011 alock
-rw------- 1 ldap ldap     8192  9月 30 01:05 2011 dn2id.bdb
-rw------- 1 ldap ldap    32768  9月 30 01:05 2011 id2entry.bdb
-rw------- 1 ldap ldap 10485760  9月 30 01:05 2011 log.0000000001
 slapdデーモンが起動しているか確認します。
# service slapd status
slapd (pid  19309) を実行中...
 openldap-serversパッケージをインストールしているにもかかわらずslapd.confが存在していません
 slapd.confをバックアップからコピーします。
# cp /etc/openldap/slapd.conf.bak /etc/openldap/slapd.conf
# cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf
 所有者及びアクセス権を変更します。
# chown ldap.ldap /etc/openldap/slapd.conf
# chmod 640 /etc/openldap/slapd.conf
 slapd.confファイルの編集前に、OpenLDAPの管理者パスワードを決め、パスワードの暗号化を行います。
# slappasswd
New password: 
Re-enter new password: 
{SSHA}******************************** ← 暗号化されたパスワード
 上記は、SSHAハッシュとして作成しています。
 /etc/openldap/slapd.confのsuffix、rootdn、rootpwを設定します。rootdnはcn=Managerが一般的です。セキュリティ上、心配な場合は変更してもかまいません。
 slapd.confを編集します。
# vi /etc/openldap/slapd.conf
suffix          "dc=bigbang,dc=dyndns,dc=org"
rootdn          "cn=Manager,dc=bigbang,dc=dyndns,dc=org"
rootpw          {SSHA}********************************
          ↑ slappasswdコマンドで得られたパスワード
 slapd.confの詳細については、●slapd.confを参照してください。
 slapdデーモンを再起動します。
# service slapd restart
slapd を停止中:		[  OK  ]
slapd を起動中:		[  OK  ]
 OpenLDAPサーバが正しく起動していることが確認できたならば、LDAPプロトコルを用いてOpenLDAPサーバからの応答を確認します。
 次のコマンド例では、"-x"オプションのみを利用して匿名ユーザでの簡易認証を行い、"-h"オプションにてローカルホスト上のOpenLDAPサーバに対し、"-b"オプションでディレクトリツリーの検索ベースを「dc=bigbang,dc=dyndns,dc=org」と指定した検索を行い、"-LLL"で最もシンプルなLDIFフォーマットへ出力を整形させています。
# ldapsearch -x -h localhost -b dc=bigbang,dc=dyndns,dc=org -LLL
No such object (32)
 上記の例では、起動したばかりのOpenLDAPサーバからは、「検索条件に一致する結果はなし」との応答が返りました。現時点ではまだエントリを登録していないため、これが正しい結果です。

 ldapsearchコマンド実行時に下記のようなエラーが表示されました。
ldap_result: Can't contact LDAP server (-1)
 これは、/etc/hosts.allowで制限をかけていたためでした。
# vi /etc/hosts.allow
slapd:All
 上記のように「slapd:All」追記してください。

●自己環境用のLDAPサーバの構築

 この情報は古いです(2016.04.13)

 自己環境用にLDAPサーバの構築するには、下記作業を実施します。
 OpenLDAPのバージョンが2.4.19から2.4.23にアップデート後(2011.12.11、CenOS6)、LDAPサーバが起動しなくなりました。その時にこの項目を応用しました。
 slapdを停止します。
 赤字はその時に参考とした箇所です。
# service slapd stop
slapd を停止中:		[  OK  ]
 この時点で自己環境に合わせ、新しいLDAP情報に書き換える作業を実施します。
 /etc/openldap/slapd.confのsuffix、rootdn、rootpw及びアクセス権を設定します。rootdnはcn=Managerが一般的です。セキュリティ上、問題がある場合は変更して問題ありません。
# vi /etc/openldap/slapd.conf
suffix          "dc=bigbang,dc=dyndns,dc=org" ← 自分の環境用に書き換える
rootdn          "cn=Manager,dc=bigbang,dc=dyndns,dc=org" ← 自分の環境用に書き換える
rootpw          {SSHA}********************************
           ↑ slappasswdコマンドで得られたパスワード
# ユーザ自身のuserPassword属性は読み書き可能
access to attrs=userPassword
    by self write
    by dn="cn=Manager,dc=bigbang,dc=dyndns,dc=org" write
    by anonymous auth
    by * none
# 
access to attrs=shadowLastChange
    by self write
    by * read
# ベースDN管理者(cn=Manager,dc=bigbang,dc=dyndns,dc=org)は全属性を読み書き可能
# 全ての人はuserPassword属性を除いた属性の読み込み可能
access to *
    by dn="cn=Manager,dc=bigbang,dc=dyndns,dc=org" write
    by self write
    by * read
 この編集したslapd.confを適当な場所へバックアップします。
# cp /etc/openldap/slapd.conf.bak /tmp/slapd.conf
 作成されたデータベースを削除します。
# rm -f /vat/lib/ldap/*
 /etc/openldap/slapd.dフォルダに作成されてしまう設定データベースを削除します(rpmインストール時のデフォルトが書き込まれる)。
# rm -rf /etc/openldap/slapd.d/*
    バージョンが2.4.23に変更になったときに、この後
    # yum -y install openldap-servers を実行しました。
 openldap-serversを削除します。
# yum -y remove openldap-servers
 /etc/openldap/slapd.confが存在しないことを確認します。もし存在している場合は削除してください。
 openldap-serversを再インストールします。
# yum -y install openldap-servers
 DB_CONFIGを元に戻します。
# cp /etc/openldap/DB_CONFIG.example /var/lib/ldap/DB_CONFIG ← CentOS 5の場合
# cp /usr/share/doc/openldap-servers-2.4.19/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
 ↑ CentOS 6の場合
# chown ldap.ldap /var/lib/ldap/DB_CONFIG
 先ほどバックアップしたslapd.confを戻します。所有者及びアクセス権を変更します。
# mv /tmp/slapd.conf /etc/openldap/slapd.conf
# chown ldap.ldap /etc/openldap/slapd.conf
# chmod 640 /etc/openldap/slapd.conf
 設定データベースを再構築。
# sudo -u ldap slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
bdb_db_open: database "dc=bigbang,dc=dyndns,dc=org": db_open(/var/lib/ldap/id2entry.bdb)
        \ failed: No such file or directory (2).
backend_startup_one (type=bdb, suffix="dc=bigbang,dc=dyndns,dc=org"): bi_db_open failed! (2)
slap_startup failed (test would succeed using the -u switch)
# ls -l /var/lib/ldap
-rw-r--r-- 1 ldap ldap       921 10月 21 00:41 2011 DB_CONFIG
-rw------- 1 ldap ldap     24576 10月 21 00:43 2011 __db.001
-rw------- 1 ldap ldap  14852096 10月 21 00:43 2011 __db.002
-rw------- 1 ldap ldap 335552512 10月 21 00:43 2011 __db.003
-rw------- 1 ldap ldap   2359296 10月 21 00:43 2011 __db.004
-rw------- 1 ldap ldap    548864 10月 21 00:43 2011 __db.005
-rw------- 1 ldap ldap     32768 10月 21 00:43 2011 __db.006
-rw-r--r-- 1 ldap ldap      2048 10月 21 00:43 2011 alock
# ls -l /etc/openldap/slapd.d
drwxr-x--- 3 ldap ldap 4096 10月 21 00:43 2011 cn=config
-rw------- 1 ldap ldap 1007 10月 21 00:43 2011 cn=config.ldif
# ls -l /etc/openldap/slapd.d/cn\=config
drwxr-x--- 2 ldap ldap  4096 10月 21 00:43 2011 cn=schema
-rw------- 1 ldap ldap 51236 10月 21 00:43 2011 cn=schema.ldif
-rw------- 1 ldap ldap   499 10月 21 00:43 2011 olcDatabase={-1}frontend.ldif
-rw------- 1 ldap ldap   487 10月 21 00:43 2011 olcDatabase={0}config.ldif
-rw------- 1 ldap ldap  2698 10月 21 00:43 2011 olcDatabase={1}bdb.ldif
-rw------- 1 ldap ldap   687 10月 21 00:43 2011 olcDatabase={2}monitor.ldif
 /etc/openldap/slapd.d/cn=config/olcDatabase={1}bdb.ldifのolcSuffixが更新されています。デフォルトでは追加出来なかったエントリが、この状態でエントリを追加することができるようになります。
 以降、slapd.d以下がメインで使われるので、slapd.confは不要…になります。
 slapd起動します。
# service slapd start
slapd を起動中:                                            [  OK  ]
 slapd自動起動するようにします。
# chkconfig slapd on
 データベースが更新されていることが分かります。
 ls -l /var/lib/ldap
-rw------- 1 ldap ldap     24576 10月 21 00:47 2011 __db.001
-rw------- 1 ldap ldap  14852096 10月 21 00:47 2011 __db.002
-rw------- 1 ldap ldap 335552512 10月 21 00:47 2011 __db.003
-rw------- 1 ldap ldap   2359296 10月 21 00:47 2011 __db.004
-rw------- 1 ldap ldap    548864 10月 21 00:47 2011 __db.005
-rw------- 1 ldap ldap     32768 10月 21 00:47 2011 __db.006
-rw-r--r-- 1 ldap ldap      2048 10月 21 00:47 2011 alock
-rw------- 1 ldap ldap      8192 10月 21 00:47 2011 dn2id.bdb
-rw------- 1 ldap ldap     32768 10月 21 00:47 2011 id2entry.bdb
-rw------- 1 ldap ldap  10485760 10月 21 00:47 2011 log.0000000001
 これで問題なくLDAPを利用することができるようになる場合があります。
 上記の方法、うまくいかなかったが判明したのは●ldifの作成の時でした。何度やっても登録することが出来ません。
# ldapadd -x -D cn=Manager,dc=bigbang,dc=dyndns,dc=org -W -f test1.ldif
Enter LDAP Password: 
ldap_bind: Invalid credentials (49)
 ここで取った方法は/etc/openldap/slapd.d以下を一旦削除し、openldap-serversをreinstallしました。
 この時のolcDatabase\=\{2\}hdb.ldifでおかしかった点は下記のとおりです。
修正前
# cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif 
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 ddef6772
dn: olcDatabase={2}hdb
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcSuffix: dc=my-domain,dc=com
olcAddContentAcl: FALSE
olcLastMod: TRUE
olcMaxDerefDepth: 15
olcReadOnly: FALSE
olcRootDN: cn=Manager,dc=my-domain,dc=com
olcSyncUseSubentry: FALSE
olcMonitoring: TRUE
olcDbDirectory: /var/lib/ldap
olcDbCacheSize: 1000
olcDbCheckpoint: 1024 15
olcDbNoSync: FALSE
olcDbDirtyRead: FALSE
olcDbIDLcacheSize: 0
olcDbIndex: objectClass pres,eq
olcDbIndex: cn pres,eq,sub
olcDbIndex: uid pres,eq,sub
olcDbIndex: uidNumber pres,eq
olcDbIndex: gidNumber pres,eq
olcDbIndex: ou pres,eq,sub
olcDbIndex: mail pres,eq,sub
olcDbIndex: loginShell pres,eq
olcDbIndex: sn pres,eq,sub
olcDbIndex: givenName pres,eq,sub
olcDbIndex: memberUid pres,eq,sub
olcDbIndex: nisMapName pres,eq,sub
olcDbIndex: nisMapEntry pres,eq,sub
olcDbLinearIndex: FALSE
olcDbMode: 0600
olcDbSearchStack: 16
olcDbShmKey: 0
olcDbCacheFree: 1
olcDbDNcacheSize: 0
structuralObjectClass: olcHdbConfig
entryUUID: 5f484368-c32c-1030-909e-b59d390b637e
creatorsName: cn=config
createTimestamp: 20111225101010Z
entryCSN: 20111225101010.160563Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20111225101010Z
修正後
# cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{1\}hdb.ldif 
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 19eac940
dn: olcDatabase={1}hdb
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcSuffix: dc=bigbang,dc=dyndns,dc=org
olcAccess: {0}to attrs=userPassword  by self write  by dn.base="cn=Manager,dc= \
 bigbang,dc=dyndns,dc=org" write  by anonymous auth  by * none
olcAccess: {1}to attrs=shadowLastChange  by self write  by * read
olcAccess: {2}to *  by dn.base="cn=Manager,dc=bigbang,dc=dyndns,dc=org" write 
  by self write  by * read
olcAddContentAcl: FALSE
olcLastMod: TRUE
olcMaxDerefDepth: 15
olcReadOnly: FALSE
olcRootDN: cn=Manager,dc=bigbang,dc=dyndns,dc=org
olcRootPW:: 98hiufadohnignsirouhgouwnrijoIUHunrufhosuGBUyebaief
olcSyncUseSubentry: FALSE
olcMonitoring: TRUE
olcDbDirectory: /var/lib/ldap
olcDbCacheSize: 1000
olcDbCheckpoint: 1024 15
olcDbConfig: {0}# $OpenLDAP$
olcDbConfig: {1}# Example DB_CONFIG file for use with slapd(8) BDB/HDB databas
 es.
olcDbConfig: {2}#
olcDbConfig: {3}# See the Oracle Berkeley DB documentation
olcDbConfig: {4}#   <http://www.oracle.com/technology/documentation/berkeley-d
 b/db/ref/env/db_config.html>
olcDbConfig: {5}# for detail description of DB_CONFIG syntax and semantics.
olcDbConfig: {6}#
olcDbConfig: {7}# Hints can also be found in the OpenLDAP Software FAQ
olcDbConfig:: ezh9Iwk8aHR0cDovL3d3dy5vcGVubGRhcC5vcmcvZmFxL2luZGV4LmNnaT9maWxl
 PTI+
olcDbConfig: {9}# in particular:
olcDbConfig: {10}#   <http://www.openldap.org/faq/index.cgi?file=1075>
olcDbConfig: {11}
olcDbConfig: {12}# Note: most DB_CONFIG settings will take effect only upon re
 building
olcDbConfig: {13}# the DB environment.
olcDbConfig: {14}
olcDbConfig: {15}# one 0.25 GB cache
olcDbConfig: {16}set_cachesize 0 268435456 1
olcDbConfig: {17}
olcDbConfig: {18}# Data Directory
olcDbConfig: {19}#set_data_dir db
olcDbConfig: {20}
olcDbConfig: {21}# Transaction Log settings
olcDbConfig: {22}set_lg_regionmax 262144
olcDbConfig: {23}set_lg_bsize 2097152
olcDbConfig: {24}#set_lg_dir logs
olcDbConfig: {25}
olcDbConfig: {26}# Note: special DB_CONFIG flags are no longer needed for "qui
 ck"
olcDbConfig:: ezI3fSMgc2xhcGFkZCg4KSBvciBzbGFwaW5kZXgoOCkgYWNjZXNzIChzZWUgdGhl
 aXIgLXEgb3B0aW9uKS4g
olcDbNoSync: FALSE
olcDbDirtyRead: FALSE
olcDbIDLcacheSize: 0
olcDbIndex: objectClass pres,eq
olcDbIndex: cn pres,eq,sub
olcDbIndex: uid pres,eq,sub
olcDbIndex: uidNumber pres,eq
olcDbIndex: gidNumber pres,eq
olcDbIndex: ou pres,eq,sub
olcDbIndex: mail pres,eq,sub
olcDbIndex: loginShell pres,eq
olcDbIndex: sn pres,eq,sub
olcDbIndex: givenName pres,eq,sub
olcDbIndex: memberUid pres,eq,sub
olcDbIndex: nisMapName pres,eq,sub
olcDbIndex: nisMapEntry pres,eq,sub
olcDbLinearIndex: FALSE
olcDbMode: 0600
olcDbSearchStack: 16
olcDbShmKey: 0
olcDbCacheFree: 1
olcDbDNcacheSize: 0
structuralObjectClass: olcHdbConfig
entryUUID: af795c3a-c338-1030-88dd-8533e369faf3
creatorsName: cn=config
createTimestamp: 20111225113818Z
entryCSN: 20111225113818.660555Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20111225113818Z

 LDAPクライアントの設定を行っていない場合は●LDAPクライアントのインストール及び設定(CentOS 6、Fedora 15編)を参照して設定してください。

●SSSD+LDAP+SUDOの構築

 参照URL:認証システムSSSD+LDAP+SUDOの構築手順

 LDAPサーバとユーザーデータは既にあるものとします。
 まず、SSSDをインストールします。nscdは共存できない(するべきではない)ので、削除しておきます。
# yum erase nscd
# yum install sssd sssd-client sssd-common sssd-ldap openldap-clients
# systemctl enable sssd
# systemctl status sssd
 自動設定をします。しかい、設定内容がぐちゃぐちゃであるのとsudo関連での設定が不足しているので、直接作成した方がいいかもしれません。
authconfigで設定
# authconfig --test
# authconfig \
  --enablesssd --enablesssdauth --enablelocauthorize \
  --enableldap --enableldapauth --disableldaptls \
  --ldapserver=ldap://192.168.0.1,192.168.0.2 \
  --ldapbasedn="dc=bigbang,dc=dyndns,dc=org" --enablemkhomedir \
  --update
 /etc/sssd/sssd.confを編集します。ファイルが存在しない(CentOS 6では新規作成しました。)場合は作成してください。
# vi /etc/sssd/sssd.conf
[sssd]
 
debug_level         = 0
config_file_version = 2
services            = nss, pam, ssh, sudo
domains             = default
 
[domain/default]
 
id_provider     = ldap
auth_provider   = ldap
chpass_provider = ldap
sudo_provider   = ldap
 
ldap_uri              = ldap://192.168.0.1/,ldap://192.168.0.2/
ldap_search_base      = dc=bigbang,dc=dyndns,dc=org
ldap_sudo_search_base = ou=SUDOers,dc=bigbang,dc=dyndns,dc=org
ldap_id_use_start_tls = False
 
ldap_search_timeout              = 3
ldap_network_timeout             = 3
ldap_opt_timeout                 = 3
ldap_enumeration_search_timeout  = 60
ldap_enumeration_refresh_timeout = 300
ldap_connection_expire_timeout   = 600
 
ldap_sudo_smart_refresh_interval = 600
ldap_sudo_full_refresh_interval  = 10800
 
entry_cache_timeout = 1200
cache_credentials   = True
 
[nss]
 
homedir_substring = /home
 
entry_negative_timeout        = 20
entry_cache_nowait_percentage = 50
 
[pam]
 
[sudo]
 
[autofs]
 
[ssh]
 
[pac]
 
[ifp]
 直接ファイルを作成した場合は、権限を設定します。
	
# chmod 600 /etc/sssd/sssd.conf
# chown root:root /etc/sssd/sssd.conf
 /etc/nsswitch.confを編集します(authconfigではsudoersを設定することはできません)。
 また、必要に応じて/etc/sudoersを編集します。
# /etc/nsswitch.conf
passwd:     files sss
shadow:     files sss
group:      files sss
sudoers:    files sss
# visudo
sato	ALL=(ALL) 	ALL
 再起動してデータの確認をします。
# systemctl restart sssd
# id example_user
# su - example_user
# sudo ls /root
 キャッシュ周りの確認をしたいときなどはキャッシュデータを削除しつつ再起動します。nscd -i passwdのようなクリーンアップツールsss_cacheもあります。
キャッシュの削除
# rm /var/lib/sss/db/cache_default.ldb
# systemctl restart sssd
 古いOpenSSHだと、OpenSSH-LPKというパッチを当ててコンパイルすることでSSHとLDAPを連携していましたが、v6.2 からはAuthorizedKeysCommandという設定で連携できるようになりました。
 アンコメント or 追記します。
# vi /etc/ssh/sshd_config
AuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeys
AuthorizedKeysCommandUser root
#UsePAM yes
 再起動し、他のクライアントからSSHで接続してみます。
# systemctl restart sssd
# systemctl restart sshd
 失敗したら、sss_ssh_authorizedkeys example_userでLDAPの公開鍵を標準出力できているかの確認やsshd, sssdのログを確認します。

●SSHでログインできるか確認する

 接続先のOSがCentOS 6でsshd_configの設定でRSAAuthentication yesが有効になっている場合、すんなりログインできました。
 ところが接続先のOSがCentOS 7の場合、RSAAuthentication yesが有効になっていてもログインすることができませんでした。もちろんパスワードの間違いではありません。
[user@centos6 ~]$ ssh -l sato n-server
sato@n-server's password: 
Permission denied, please try again.
sato@n-server's password: 
Permission denied, please try again.
sato@n-server's password: 
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
 この問題を解消するために下記の設定変更を実施しました。
 /etc/pam.d/system-authでところどころに記載されている「sss」を「ldap」へ修正します。
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        sufficient    pam_fprintd.so
auth        [default=1 success=ok] pam_localuser.so
auth        [success=done ignore=ignore default=die] pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
#auth        sufficient    pam_sss.so forward_pass
auth        sufficient    pam_ldap.so forward_pass
auth        required      pam_deny.so
account     required      pam_unix.so broken_shadow
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
#account     [default=bad success=ok user_unknown=ignore] pam_sss.so
account     [default=bad success=ok user_unknown=ignore] pam_ldao.so
account     required      pam_permit.so
password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
#password    sufficient    pam_sss.so use_authtok
password    sufficient    pam_ldap.so use_authtok
password    required      pam_deny.so
session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     optional      pam_oddjob_mkhomedir.so skel=/etc/skel umask=077
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
#session     optional      pam_sss.so
session     optional      pam_ldap.so
 /etc/pam.d/password-authでところどころに記載されている「sss」を「ldap」へ修正します。
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        [default=1 success=ok] pam_localuser.so
auth        [success=done ignore=ignore default=die] pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
#auth        sufficient    pam_sss.so forward_pass
auth        sufficient    pam_ldap.so forward_pass
auth        required      pam_deny.so
account     required      pam_unix.so broken_shadow
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
#account     [default=bad success=ok user_unknown=ignore] pam_sss.so
account     [default=bad success=ok user_unknown=ignore] pam_ldap.so
account     required      pam_permit.so
password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
#password    sufficient    pam_sss.so use_authtok
password    sufficient    pam_ldap.so use_authtok
password    required      pam_deny.so
session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     optional      pam_oddjob_mkhomedir.so skel=/etc/skel umask=077
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
#session     optional      pam_sss.so
session     optional      pam_ldap.so
 /etc/nsswitch.confでところどころに記載されている「sss」を「ldap」へ修正します。
(・・・途中省略・・・)
#passwd:     files sss
#shadow:     files sss
#group:      files sss
passwd:     files ldap
shadow:     files ldap
group:      files ldap
・・・
rpc:        files
#services:   files sss
services:   files ldap
#netgroup:   files sss
netgroup:   files ldap
(・・・途中省略・・・)
 nslcdを再起動します。
# systemctl restart nslcd
 ローカルでSSHログインできるかどうか確認します。
$ ssh sato@localhost
sato@localhost's password: 
Creating home directory for sato.
Attempting to create directory /home/sato/perl5
 リモートでSSHログインできるかどうか確認します。
$ ssh sato@n-server
sato@n-server's password: 
Creating home directory for sato.
Attempting to create directory /home/sato/perl5
 無事ログインすることができました。

●passwdコマンドでLDAPユーザのパスワードを変更することが出来ない

 後で分かったことですが、passwdコマンドでLDAPユーザのパスワードを変更することが出来ない現象が発生しました。

 CentOS 7でも、passwdコマンドでLDAPユーザのパスワードを変更することが出来ない現象が発生しました。(2016.04)
※CentOS 6の場合
$ passwd
ユーザ test1000 のパスワードを変更。
Enter login(LDAP) password: 
新しいパスワード:
新しいパスワードを再入力してください:
LDAP password information update failed: Insufficient access
passwd: 認証トークン操作エラー
 その時のログは下記のとおりです。

Dec 21 13:22:36 serverA slapd[21466]: conn=1000 op=12 SRCH base="dc=bigbang,dc=dyndns,dc=org" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uidNumber=1000))"
Dec 21 13:22:36 serverA slapd[21466]: conn=1000 op=12 SRCH attr=userPassword cn gidNumber uidNumber
loginShell objectClass gecos uid homeDirectory
Dec 21 13:22:36 serverA slapd[21466]: conn=1000 op=12 SEARCH RESULT tag=101 err=0 nentries=1 text=
Dec 21 13:22:36 serverA slapd[21466]: conn=1001 op=10 SRCH base="dc=bigbang,dc=dyndns,dc=org" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uid=test1000))"
Dec 21 13:22:36 serverA slapd[21466]: conn=1001 op=10 SRCH attr=userPassword cn gidNumber uidNumber loginShell objectClass gecos uid homeDirectory
Dec 21 13:22:36 serverA slapd[21466]: conn=1001 op=10 SEARCH RESULT tag=101 err=0 nentries=1 text=
Dec 21 13:22:36 serverA slapd[21466]: conn=1016 fd=27 ACCEPT from IP=127.0.0.1:36043 (IP=0.0.0.0:38
9) Dec 21 13:22:36 serverA slapd[21466]: conn=1016 op=0 BIND dn="" method=128
Dec 21 13:22:36 serverA slapd[21466]: conn=1016 op=0 RESULT tag=97 err=0 text=
Dec 21 13:22:36 serverA slapd[21466]: conn=1016 op=1 SRCH base="dc=bigbang,dc=dyndns,dc=org" scope=2 deref=0 filter="(uid=test1000)"
Dec 21 13:22:36 serverA slapd[21466]: conn=1016 op=1 SRCH attr=host authorizedService shadowExpire shadowFlag shadowInactive shadowLastChange shadowMax shadowMin shadowWarning uidNumber
Dec 21 13:22:36 serverA slapd[21466]: conn=1016 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=
Dec 21 13:22:40 serverA slapd[21466]: conn=1016 op=2 BIND dn="uid=test1000,ou=people,dc=bigbang,dc=dyndns,dc=org" method=128
Dec 21 13:22:40 serverA slapd[21466]: conn=1016 op=2 BIND dn="uid=test1000,ou=people,dc=bigbang,dc=dyndns,dc=org" mech=SIMPLE ssf=0
Dec 21 13:22:40 serverA slapd[21466]: conn=1016 op=2 RESULT tag=97 err=0 text=
Dec 21 13:22:40 serverA slapd[21466]: conn=1016 op=3 BIND anonymous mech=implicit ssf=0
Dec 21 13:22:40 serverA slapd[21466]: conn=1016 op=3 BIND dn="" method=128
Dec 21 13:22:40 serverA slapd[21466]: conn=1016 op=3 RESULT tag=97 err=0 text=
Dec 21 13:22:40 serverA slapd[21466]: conn=1002 op=11 SRCH base="dc=bigbang,dc=dyndns,dc=org" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uid=test1000))"
Dec 21 13:22:40 serverA slapd[21466]: conn=1002 op=11 SRCH attr=userPassword cn gidNumber uidNumber loginShell objectClass gecos uid homeDirectory
Dec 21 13:22:40 serverA slapd[21466]: conn=1002 op=11 SEARCH RESULT tag=101 err=0 nentries=1 text=
Dec 21 13:22:44 serverA slapd[21466]: conn=1003 op=14 SRCH base="dc=bigbang,dc=dyndns,dc=org" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uidNumber=1000))"
Dec 21 13:22:44 serverA slapd[21466]: conn=1003 op=14 SRCH attr=userPassword cn gidNumber uidNumber loginShell objectClass gecos uid homeDirectory
Dec 21 13:22:44 serverA slapd[21466]: conn=1003 op=14 SEARCH RESULT tag=101 err=0 nentries=1 text=
Dec 21 13:22:47 serverA slapd[21466]: conn=1016 op=4 BIND dn="uid=test1000,ou=people,dc=bigbang,dc=dyndns,dc=org" method=128
Dec 21 13:22:47 serverA slapd[21466]: conn=1016 op=4 BIND dn="uid=test1000,ou=people,dc=bigbang,dc=dyndns,dc=org" mech=SIMPLE ssf=0 Dec 21 13:22:47 serverA slapd[21466]: conn=1016 op=4 RESULT tag=97 err=0 text=
Dec 21 13:22:47 serverA slapd[21466]: conn=1016 op=5 MOD dn="uid=test1000,ou=people,dc=bigbang,dc=dyndns,dc=org"
Dec 21 13:22:47 serverA slapd[21466]: conn=1016 op=5 MOD attr=userPassword
Dec 21 13:22:47 serverA slapd[21466]: conn=1016 op=5 RESULT tag=103 err=50 text=
Dec 21 13:22:47 serverA slapd[21466]: conn=1004 op=12 SRCH base="dc=bigbang,dc=dyndns,dc=org" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uid=test1000))"
Dec 21 13:22:47 serverA slapd[21466]: conn=1004 op=12 SRCH attr=userPassword cn gidNumber uidNumber loginShell objectClass gecos uid homeDirectory
Dec 21 13:22:47 serverA slapd[21466]: conn=1004 op=12 SEARCH RESULT tag=101 err=0 nentries=1 text=
Dec 21 13:22:47 serverA slapd[21466]: conn=1000 op=13 SRCH base="dc=bigbang,dc=dyndns,dc=org" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uidNumber=1000))"
Dec 21 13:22:47 serverA slapd[21466]: conn=1000 op=13 SRCH attr=userPassword cn gidNumber uidNumber loginShell objectClass gecos uid homeDirectory
Dec 21 13:22:47 serverA slapd[21466]: conn=1000 op=13 SEARCH RESULT tag=101 err=0 nentries=1 text=
Dec 21 13:22:49 serverA slapd[21466]: conn=1016 op=6 UNBIND
Dec 21 13:22:49 serverA slapd[21466]: conn=1016 fd=27 closed

 調べたところ、/etc/openldap/slapd.d/cn\=config/olcDatabase\=\{1\}bdb.ldifの設定が問題なく動作するものとは異なっていました。下記を追加し、LDAPサーバを再起動後、passwdコマンドで変更出来るようになりました。
olcAccess: {0}to attrs=userPassword by dn="cn=Manager,dc=bigbang,dc=dyndns,dc=org"
        \ write by anonymous auth by self write by * none
olcAccess: {1}to attrs=shadowLastChange by self write by * read
olcAccess: {2}to dn.base="" by * read
olcAccess: {3}to * by dn="cn=Manager,dc=bigbang,dc=dyndns,dc=org" write by * read
※CentOS 7の場合(rootでのpasswd実行が不可。一般ユーザは問題無し。)
# passwd test5001
ユーザ test5001 のパスワードを変更。
LDAP administrator password: 
root によるパスワードのリセットはサポートされません。
passwd: 認証トークン操作エラー
 その時のログは下記のとおりです。

Apr 13 14:27:24 serverA passwd: pam_unix(passwd:chauthtok): user "test5001" does not exist in /etc/passwd
Apr 13 14:27:24 serverA passwd: pam_sss(passwd:chauthtok): Authentication failed for user test5001: 6 (拒否されたパーミッション)
Apr 13 14:27:24 serverA passwd: pam_sss(passwd:chauthtok): User info message: root によるパスワードのリセットはサポートされません。

 CentOS 7の場合の対応方法は「●LDAPクライアントのセットアップ(CentOS 7)を参照してください。

 2016年4月現在、この原因は解決していません。

●OpenLDAPサーバのログ出力

 OpenLDAPサーバは、インストールしたそのままの状態でログを記録するようには設定されていません。これは、肥大化するログがディスク領域を圧迫したり、パフォーマンスに影響を与えやすいディスクへの書き込みが少ない設定でもあります。
 しかしながらこのままの設定では、日々起こり得る、OpenLDAPサーバにとって不都合な事象を見逃して、不安定な運用にもつながりかねません。また、いざ障害が発生したときに、その原因を追究し、再発防止を検討する糸口を得られなかったりする可能性もあります。このため、管理上有効な情報はログとして記録し、定期的に古いログを削除できる設定が必要になります。
 OpenLDAPサーバは、デフォルトでsyslogのLOCAL4ファシリティにログを送付しています。このため、syslog.conf(またはrsyslog.conf)ファイルの設定を変更することで、syslogがOpenLDAPサーバのログを受けて記録できるようになります。
# vi /etc/syslog.conf または # vi /etc/rsyslog.conf
[...略...]
local4.*                          /var/log/slapd.log ← を追加
# service syslog restart
 syslogd(またはrsyslogd)とslapdを再起動します。これでLDAPのログを取ることができます。

 出力するログの内容を変更するには「●ログレベルの変更 」を参照してください。

 ログローテーションさせるには下記のように設定します。
# vi /etc/logrotate.d/syslog
/var/log/cron
/var/log/iptables.log
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/slapd.log
/var/log/spooler
{
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}


●ldifの作成及びエントリの追加

 日本語が含まれているLDIFファイルを登録する場合には、LDIFファイルがUTF-8エンコーディングされている必要があります。
 OpenLDAPのバージョンが2.4.19から2.4.23に変更後、起動しなくなりました。その際の内容は下記のとおりです。
# ldapadd -x -D cn=Manager,dc=bigbang,dc=dyndns,dc=org -W -f test1.ldif
Enter LDAP Password: 
ldap_bind: Invalid credentials (49)
 その後、エントリ追加できました。


 次のようなldifファイルおよびldif作成用のスクリプトを用います。
# mkdir /var/lib/ldap/ldif
# vi /var/lib/ldap/ldif/test1.ldif
dn: dc=bigbang,dc=dyndns,dc=org
objectClass: dcObject
objectClass: organization
dc: BIGBANG
o: BIGBANG
dn: cn=Manager,dc=bigbang,dc=dyndns,dc=org
objectclass: organizationalRole
cn: Manager
dn: ou=People,dc=bigbang,dc=dyndns,dc=org
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=bigbang,dc=dyndns,dc=org
objectClass: organizationalUnit
ou: Group
dn: ou=Services,dc=bigbang,dc=dyndns,dc=org
objectClass: organizationalUnit
ou: Services
dn: ou=Machines,dc=bigbang,dc=dyndns,dc=org
objectClass: organizationalUnit
ou: Machines
 /var/lib/ldap/ldif以下にldifを保存しておくのであれば、下記のように実行しよう。
# chmod -R 600 /var/lib/ldap/ldif ← 念のための設定
 下記コマンドで追加します。
# ldapadd -x -D cn=Manager,dc=bigbang,dc=dyndns,dc=org -W -f test1.ldif
補足
上記test2.ldifで登録した情報を削除するには下記のようにします。
# ldapdelete -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W -f "test1_del.ldif"
Enter LDAP Password: 
test1_del.ldifの内容
ou=People,dc=bigbang,dc=dyndns,dc=org
ou=Group,dc=bigbang,dc=dyndns,dc=org
ou=Services,dc=bigbang,dc=dyndns,dc=org
ou=Machines,dc=bigbang,dc=dyndns,dc=org
cn=Manager,dc=bigbang,dc=dyndns,dc=org
dc=bigbang,dc=dyndns,dc=org
このようにすることにより、容易に登録情報を削除することが出来ます。
 追加ユーザのシェルを作成します。
# vi /var/lib/ldap/ldif/test2.sh
#!/bin/bash
SUFFIX="dc=bigbang,dc=dyndns,dc=org"
OU_USERS="ou=People"
OU_Group="ou=Group"
BASE_NUM=1000
MAX_USERS=10
COUNTER=0
while [ $COUNTER -lt $MAX_USERS ]
do
    echo dn: uid=test$BASE_NUM,$OU_USERS,$SUFFIX
    echo uid: test$BASE_NUM
    echo cn: test$BASE_NUM
    echo objectClass: account
    echo objectClass: posixAccount
    echo objectClass: shadowAccount
    echo userPassword: `slappasswd -s test$BASE_NUM`
    echo shadowLastChange: $((`date +%s`/(60*60*24)))
    echo shadowMax: 99999
    echo shadowWarning: 7
    echo loginShell: /bin/bash
    echo uidNumber: $BASE_NUM
    echo gidNumber: $BASE_NUM
    echo homeDirectory: /home/test$BASE_NUM
    echo gecos: test$BASE_NUM; echo
    echo dn: cn=test$BASE_NUM,$OU_Group,$SUFFIX
    echo objectClass: posixGroup
    echo cn: test$BASE_NUM
    echo userPassword: !
    echo gidNumber: $BASE_NUM; echo
    BASE_NUM=`expr $BASE_NUM + 1`
    COUNTER=`expr $COUNTER + 1`
done
# sh test2.sh > test2.ldif
 /var/lib/ldap/ldif以下にldifを保存しておくのであれば、下記のように実行しよう。
# chmod -R 600 /var/lib/ldap/ldif ← 念のための設定
 下記コマンドで追加します。
# ldapadd -x -D cn=Manager,dc=bigbang,dc=dyndns,dc=org -W -f test2.ldif
 追加されたエントリを確認します。
# ldapsearch -x -h localhost -b dc=bigbang,dc=dyndns,dc=org -LLL
補足
上記test2.ldifで登録した情報を削除するには下記のようにします。
# ldapdelete -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W -f "test2_del.ldif"
Enter LDAP Password: 
test2_del.ldifの内容
uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org
cn=test1000,ou=Group,dc=bigbang,dc=dyndns,dc=org
uid=test1001,ou=People,dc=bigbang,dc=dyndns,dc=org
cn=test1001,ou=Group,dc=bigbang,dc=dyndns,dc=org
uid=test1002,ou=People,dc=bigbang,dc=dyndns,dc=org
cn=test1002,ou=Group,dc=bigbang,dc=dyndns,dc=org
uid=test1003,ou=People,dc=bigbang,dc=dyndns,dc=org
cn=test1003,ou=Group,dc=bigbang,dc=dyndns,dc=org
uid=test1004,ou=People,dc=bigbang,dc=dyndns,dc=org
cn=test1004,ou=Group,dc=bigbang,dc=dyndns,dc=org
uid=test1005,ou=People,dc=bigbang,dc=dyndns,dc=org
cn=test1005,ou=Group,dc=bigbang,dc=dyndns,dc=org
uid=test1006,ou=People,dc=bigbang,dc=dyndns,dc=org
cn=test1006,ou=Group,dc=bigbang,dc=dyndns,dc=org
uid=test1007,ou=People,dc=bigbang,dc=dyndns,dc=org
cn=test1007,ou=Group,dc=bigbang,dc=dyndns,dc=org
uid=test1008,ou=People,dc=bigbang,dc=dyndns,dc=org
cn=test1008,ou=Group,dc=bigbang,dc=dyndns,dc=org
uid=test1009,ou=People,dc=bigbang,dc=dyndns,dc=org
cn=test1009,ou=Group,dc=bigbang,dc=dyndns,dc=org
このようにすることにより、容易に登録情報を削除することが出来ます。

●移行ツールを用いたエントリの追加

 LDAPサーバへのエントリ登録については、これまでに説明したスクリプトなどを用いて新規アカウントを作成する方法のほか、PADLソフトウェアが配布する「MigrationTools」というスクリプトセットを用いて、既存アカウント(/etc/passwdファイルに存在するアカウント情報)を移行することも可能です。
 CentOSに付属するopenldap-serversパッケージには、Perlで記述されたこの移行スクリプトセットが含まれています。これを利用すると、OpenLDAPサーバのインストール後、すぐに既存アカウントの移行が行えるようになっています。
 移行ツールをインストールします。
# yum -y install migrationtools
 /etc/passwdから抽出したファイルを元に、登録用のLDIFファイルを作成する。作成にはmigrate_passwd.plを使用しますが、その前に/usr/share/migrationtools/migrate_common.phの以下の個所を修正します。
# cd /usr/share/migrationtools
# vi migrate_common.ph
$DEFAULT_MAIL_DOMAIN = "padl.com";
$DEFAULT_BASE = "dc=padl,dc=com";
       ↓ のように変更
$DEFAULT_MAIL_DOMAIN = "dc=bigbang,dc=dyndns,dc=org";
$DEFAULT_BASE = "dc=bigbang,dc=dyndns,dc=org";
# diff migrate_common.ph migrate_common.ph.org
71c71
< $DEFAULT_MAIL_DOMAIN = "padl.com";
---
> $DEFAULT_MAIL_DOMAIN = "dc=bigbang,dc=dyndns,dc=org;
74c74
< $DEFAULT_BASE = "dc=bigbang,dc=dyndns,dc=org";
---
> $DEFAULT_BASE = "dc=padl,dc=com";
 移行登録用のLDIFを作成します。/etc/passwdファイルからユーザ情報を抽出します。数が少なければ、テキストエディタでも十分可能です。多い場合は、grepコマンドなどで抽出します。一般ユーザ及びグループは各IDは500番から始まるため、以下のように実行します。
# grep :5[0-9][0-9] /etc/passwd > user.list
# grep :5[0-9][0-9] /etc/group > group.list
 migrate_passwd.pl及びmigrate_group.plを実行します。
# /usr/share/migrationtools/migrate_passwd.pl user.list > user.ldif
# /usr/share/migrationtools/migrate_group.pl group.list > group.ldif
 作成したuser.ldifとgroup.ldifをldapaddコマンドで追加します。
# ldapadd -f user.ldif -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W
Enter LDAP Password:
adding new entry "uid=user1,ou=People,dc=bigbang,dc=dyndns,dc=org"
adding new entry "uid=user2,ou=People,dc=bigbang,dc=dyndns,dc=org"
adding new entry "uid=user3,ou=People,dc=bigbang,dc=dyndns,dc=org"
# ldapadd -f group.ldif -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W
Enter LDAP Password:
adding new entry "cn=user1,ou=Group,dc=bigbang,dc=dyndns,dc=org"
adding new entry "cn=user2,ou=Group,dc=bigbang,dc=dyndns,dc=org"
adding new entry "cn=user3,ou=Group,dc=bigbang,dc=dyndns,dc=org"
 以上で、ユーザアカウントのLDAPサーバへの移行は完了です。念のため、追加されたエントリを確認します。
# ldapsearch -x -h localhost -b dc=bigbang,dc=dyndns,dc=org -LLL
 追加されていればOKです。

●LDAPコマンド

 LDAPコマンドの使用方法を記載します。

 ユーザまたはグループの追加

ldapadd [オプションその1] [DN] [オプションその2] [ファイル名]

[オプションその1]
 -h LDAPサーバを指定する(省略時はローカルホスト)
 -x SASLを使わず簡易認証を用いる
 -D 認証に利用するDNを指定する

[オプションその2]
 -W 認証時のパスワードを対話的に入力する
 -w 認証時のパスワードをコマンドラインで指定する
 -f LDIFファイルを指定する

 例は下記のとおりです。
$ ldapadd -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W -f users.ldif
$ ldapadd -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W -f group.ldif

 ユーザまたはグループの削除

ldapdelete [オプションその1] [DN] [オプションその2] [ユーザ・グループDN]

[オプションその1]
 -h LDAPサーバを指定する(省略時はローカルホスト)
 -x SASLを使わず簡易認証を用いる
 -D 認証に利用するDNを指定する

[オプションその2]
 -W 認証時のパスワードを対話的に入力する
 -w 認証時のパスワードをコマンドラインで指定する
 -f LDIFファイルを指定する

 例は下記のとおりです。
$ ldapdelete -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org"
        \ -W "uid=testuser,ou=People,dc=bigbang,dc=dyndns,dc=org"
$ ldapdelete -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org"
        \ -W "cn=testgrp,ou=Group,dc=bigbang,dc=dyndns,dc=org"
$ ldapdelete -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W -f user_del.ldif

 検索

ldapsearch [オプション] [DN] [検索条件]

[オプション]
 -h LDAPサーバを指定する(省略時はローカルホスト)
 -x SASLを使わず簡易認証を用いる
 -D 認証に利用するDNを指定する
 -W 認証時のパスワードを対話的に入力する
 -w 認証時のパスワードをコマンドラインで指定する
 -L 検索結果をLDIFv1形式で表示する
 -LL 検索結果をコメントなしの形式で表示する
 -LLL 検索結果をコメントとLDAPバージョン表示なしで表示する

 例は下記のとおりです。
ldapsearch -x -LLL -b "dc=bigbang,dc=dyndns,dc=org" "(uid=testuser)"

 パスワードの変更

ldappasswd [オプションその1] [DN] [オプションその2] [ユーザDN]

[オプションその1]
 -h LDAPサーバを指定する(省略時はローカルホスト)
 -x SASLを使わず簡易認証を用いる
 -D 認証に利用するDNを指定する

[オプションその2]
 -W 現在のパスワードを対話的に入力する
 -w 現在のパスワードをコマンドラインから入力する
 -S 新しいパスワードを対話的に入力する
 -s 新しいパスワードをコマンドラインから入力する
:-sも-Sオプションも付けないとパスワードが自動的に生成される

 例は下記のとおりです。
自分自身で変更する場合(ldappasswd)
$ ldappasswd -x -D "uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org" -W -S
補足(20150108問題解消  ●LDAPクライアントのインストール及び設定(CentOS 6、Fedora 15編)に 記載されているとおり、「pam_ldap.so」の記載位置を買えることにより解消しました。  CentOS 6で下記のとおり変更しようとしてもエラーが表示される。 $ ldappasswd -x -D "uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org" -W -S New password: Re-enter new password: Enter LDAP Password: Result: Insufficient access (50)
 passwdコマンドを使用してLDAPパスワードを変更した場合、 CentOS 5では成功するがCentOS 6では失敗する。
自分自身で変更する場合(passwd)
※CentOS 6の場合
$ passwd
ユーザ hoge のパスワードを変更。
Enter login(LDAP) password: (現在のパスワードを入力)
新しいパスワード:
新しいパスワードを再入力してください:
LDAP password information changed for hoge
passwd: 全ての認証トークンが正しく更新できました。
※CentOS 7の場合
$ passwd
ユーザ hoge のパスワードを変更。
(current) LDAP Password: (現在のパスワードを入力)
新しいパスワード:
新しいパスワードを再入力してください:
passwd: 全ての認証トークンが正しく更新できました。
 passwdによりLDAPパスワードが変更できない場合、LDAPサーバ側でパスワード変更権限を追加します。

管理者が変更する場合
$ ldappasswd -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W -S
        \ "uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org"
New password:(新しいパスワード)
Re-enter new password:(新しいパスワード:再入力)
Enter LDAP Password:(管理者のパスワード)
Result: Success (0)
 パスワードポリシーが「pwdInHistory: 5」のように設定されている場合、LDAPはパスワード履歴を参照します。
$ ldappasswd -x -D "uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org" -W -S
New password:(履歴にあるパスワード)
Re-enter new password:(履歴にあるパスワード:再入力)
Enter LDAP Password:(現在のパスワード)
Result: Constraint violation (19)
Additional info: Password is in history of old passwords

 アカウントのロック

 ロックするためのldifを作成します。
# vi test1001_modify_lock.ldif
dn: uid=test1001,ou=People,dc=bigbang,dc=dyndns,dc=org
changetype: modify
replace: loginShell
loginShell: /bin/false
 ldapmodifyコマンドを実行します。
# ldapmodify -x -D cn=Manager,dc=bigbang,dc=dyndns,dc=org \
                                -W -f test1001_modify_lock.ldif
 ldapsearchコマンドで確認します。
# ldapsearch -x -LLL -b "dc=bigbang,dc=dyndns,dc=org" "(uid=test1001)"
dn: uid=test1001,ou=People,dc=bigbang,dc=dyndns,dc=org
uid: test1001
cn: test1001
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
shadowMax: 99999
shadowWarning: 7
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/test1001
gecos: test1001
shadowLastChange: 15425
loginShell: /bin/false
 loginShellが『/bin/false』に変更されていればOKです。

 LDIFによるエントリの追加・削除・更新・識別名変更と未サポートのLDIF記述(詳細)

・エントリの追加
 changetype行に“add”を指定し、次行から属性定義を記述します。
dn: cn=User002,ou=User,dc=bigbang,dc=mydns,dc=jp
changetype: add
objectclass: top
objectclass: person
objectclass: organizationalPerson
cn: User002
sn: BIGBANG
・エントリの削除
 changetype行に“delete”を指定します。
dn: cn=User003,ou=User,dc=bigbang,dc=mydns,dc=jp
changetype: delete
・エントリの更新
 エントリの属性、属性値に対して、追加、削除、置換を行うには、changetype行に“modify”を指定します。さらに、次行に変更方法を示す種別を指定します。
 属性の変更種別は、以下の3つの中からどれか1つを指定します。

 add: 属性名
 dn行で指定したエントリに属性を追加します。その属性型がすでにエントリにある場合は、属性値を追加します。

 delete: 属性名
 dn行で指定したエントリから属性を削除します。その属性型に複数の属性値がある場合は、属性値すべてを削除します。複数の属性値のうち1つだけを削除する場合は、delete行の次の行で、属性名と属性値を記述します。

 replace: 属性名
 dn行で指定したエントリの属性を、指定した値で置き換えます。指定したエントリが指定した属性を持たない場合、その属性を作成します。

 属性の変更種別を省略した場合、次のように解釈されます。

 ldapmodifyコマンドで-rオプションを指定している場合:replace
 ldapmodifyコマンドで-rオプションを指定していない場合:add

 属性の変更種別の次の行には、変更する属性の内容を指定します。続けて複数の変更を記述する場合は、“-”(マイナス)で区切ります。次の書式で記述します。
dn: エントリのDN
changetype: modify
属性の変更種別(add|delete|replace): 属性型
属性型: 属性値
・属性値の追加

 属性の変更種別に“add”を指定します。

mail属性を追加する場合
dn: cn=User001,ou=User,dc=bigbang,dc=mydns,dc=jp
changetype: modify
add: mail
mail: user001@mail.bigbang.mydns.jp
2つのtelephonenumber属性と1つのjpegPhoto属性を追加する場合
dn: cn=User001,ou=User,dc=bigbang,dc=mydns,dc=jp
changetype: modify
add: telephonenumber
telephonenumber: 1111-1111
telephonenumber: 2222-2222
-
add: jpegPhoto
jpegPhoto:< file:///data/photo/user001.jpg
・属性値の削除

 属性の変更種別に“delete”を指定します。

 description属性を削除する場合
n: cn=User001,ou=User,dc=bigbang,dc=mydns,dc=jp
changetype: modify
delete: description
・複数の属性値から特定の属性値の削除

 属性の変更種別に“delete”を指定します。

 User001のエントリ情報が次の状態であるとします。
dn: cn=User001,ou=User,dc=bigbang,dc=mydns,dc=jp
objectclass: top
objectclass: person
objectclass: organizationalPerson
cn: User001
sn: BIGBANG
telephonenumber: 1111-1111
telephonenumber: 2222-2222
 telephonenumber 1111-1111を削除する場合
dn: cn=User001,ou=User,dc=bigbang,dc=mydns,dc=jp
changetype: modify
delete: telephonenumber
telephonenumber: 1111-1111
 この結果、User001のエントリ情報は次のようになります。
dn: cn=User001,ou=User,dc=bigbang,dc=mydns,dc=jp
objectclass: top
objectclass: person
objectclass: organizationalPerson
cn: User001
sn: BIGBANG
telephonenumber: 2222-2222
・属性値の置換

 属性の変更種別に“replace”を指定します。

mail を user001@mail.bigbang.mydns.jp から user777@mail.bigbang.mydns.jp に変更する場合
dn: cn=User001,ou=User,dc=bigbang,dc=mydns,dc=jp
changetype: modify
replace: mail
mail: user777@mail.bigbang.mydns.jp
・複数の属性値から特定の属性値の置換え

 対象の属性値を削除してから、置き換える値で追加します。

 User001のエントリ情報が次の状態であるとします。
dn: cn=User001,ou=User,dc=bigbang,dc=mydns,dc=jp
objectclass: top
objectclass: person
objectclass: organizationalPerson
cn: User001
sn: BIGBANG
telephonenumber: 1111-1111
telephonenumber: 2222-2222
 telephonenumber 1111-1111 を 3333-3333 で置き換える場合
dn: cn=User001,ou=User,dc=bigbang,dc=mydns,dc=jp
changetype: modify
delete: telephonenumber
telephonenumber: 1111-1111
-
add: telephonenumber
telephonenumber: 3333-3333
 この結果、User001のエントリ情報は次のようになります。
dn: cn=User001,ou=User,dc=bigbang,dc=mydns,dc=jp
objectclass: top
objectclass: person
objectclass: organizationalPerson
cn: User001
sn: BIGBANG
telephonenumber: 2222-2222
telephonenumber: 3333-3333
・エントリの識別名変更

changetype行に“modrdn”を指定します。さらに、次行にエントリの識別名変更の詳細方法を指定します。識別名変更の詳細方法は、以下の2つです。この順序で指定します。

 1.newrdn: 新しいRDN
 2.deleteoldrdn: (1|0)
  新しいRDNに変更した後、古いRDNを削除する場合は“1”、属性値として残す場合は“0”を指定します。

 “deleteoldrdn”は省略できます。省略すると古いRDNを削除します。次の書式で記述します。
dn: エントリのDN
changetype: modrdn
newrdn: 新しいRDN
deleteoldrdn: (1|0)
 User002のエントリのRDNを、user888に変更する場合
dn: cn=User002,ou=User,dc=bigbang,dc=mydns,dc=jp
changetype: modrdn
newrdn: cn=user888
deleteoldrdn: 1

●ldapsearchによる表示結果の違い

 slapd.confの設定は下記のとおりです。
access to attrs=userPassword
    by self write
    by dn="cn=Manager,dc=bigbang,dc=dyndns,dc=org" write
    by anonymous auth
    by * none
access to *
    by dn="cn=Manager,dc=bigbang,dc=dyndns,dc=org" write
    by self write
    by * read
 検索語の表示。
特段の権限を使用せずに検索(その1)
[test1000@localhost ~]$ ldapsearch -x -LLL \
        -b "dc=bigbang,dc=dyndns,dc=org" "(uid=test1000)"
dn: uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org
uid: test1000
cn: test1000
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/test1000
gecos: test1000
shadowLastChange: 15262
この場合、「-D」を使用して認証していないので自分自身を参照してもuserPasswordは表示されない。
自分自身の権限で検索(その1)
[test1000@localhost ~]$ ldapsearch -x \
    -D "uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org" \
    -W -LLL -b "dc=bigbang,dc=dyndns,dc=org" "(uid=test1000)"
Enter LDAP Password: 
dn: uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org
uid: test1000
cn: test1000
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/test1000
gecos: test1000
shadowLastChange: 15262
 ↓ userPasswordは表示される
userPassword:: e1NTSEF9b1FyeUZZUWRTM3R0ZnMvUnEvVFErSmo3R3hzcHlyemk=
自分自身の権限で検索(その2)
[user@serverA ~]$ ldapsearch -x \
    -D "uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org" \
  -W "(uid=test1000)"
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <dc=bigbang,dc=dyndns,dc=org> (default) with scope subtree
# filter: (uid=test1000)
# requesting: ALL
#
# test1000, people, bigbang.dyndns.org
dn: uid=test1000,ou=people,dc=bigbang,dc=dyndns,dc=org
uid: test1000
cn: test1000
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/test1000
gecos: test1000
shadowLastChange: 15339
 ↓ userPasswordは表示される
userPassword:: e1NTSEF9SU5PU29DWmVxckVVdDliQ3kxQmhJcG5PTHdkaWg4Uko=
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
管理者の権限で検索
[test1000@localhost ~]$ ldapsearch -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org"
                         \ -W -LLL -b "dc=bigbang,dc=dyndns,dc=org" "(uid=test1000)"
Enter LDAP Password: 
dn: uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org
uid: test1000
cn: test1000
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/test1000
gecos: test1000
 ↓ userPasswordは表示される
userPassword:: e2NyeXB0fSQxJDhodGpMYmtjJFFSSWpNLkkyOG90dDEyajN5LnBkYi4=
shadowLastChange: 15262

●slapcat

 ユーザの登録や削除等はslapcatでも確認できます。

●slapd.conf

 2016.4.21現在、slapd.confを直接編集するようなことはしません。

 参照ページ:slapdの設定
 2016.4.21現在、slapd.confを直接編集するようなことはしません。

 /etc/openldap/slapd.confはサーバデーモンの設定ファイルです。OpenLDAPサーバの実行プログラムであるslapdの起動時に解析されるファイルであり、このファイルに記述された設定は、slapdのみでなく、slapadd、slapcat、slapindex……といった各SLAPDツールコマンドの実行時にも参照されています。
 slapd.confファイルは、前半のOpenLDAPサーバ全体に適用される設定を記述する「グローバルセクション」と、それに続く後半のバックエンドデータベースに適用される「データベースセクション」より構成されています。後半のデータベースセクションは、「suffix」オプションを変えることで複数記述できるようになっています。
 とりあえず試験として動作させるだけなら、ほとんど触る箇所はありません。最低限調整の必要な項目は下の数カ所だけです。

include
 slapd.confファイル以外に読み込むファイルを指定します。前半のグローバルセクションにある「include」オプションには、core.schemaに加え、cosine.schema、nis.schemaが含まれている必要があります。これは、ユーザ認証に必要な「accountオブジェクトクラス」「posixAccountオブジェクトクラス」などを追加するために必要なスキーマが定義されているためです。
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema

pidfile、argsfile
 /etc/init.d/ldapでslapdはユーザldapの権限で動作します。/var/run/openldapディレクトリはオーナー、グループ共にldapである必要があり、755で設定します。
pidfile    /var/run/openldap/slapd.pid
argsfile   /var/run/openldap/slapd.args

データベースの位置とスーパーユーザの指定
database    bdb
 後半のデータベースセクションには、databaseオプションとして最も実績のあるバックエンドデータベースであるBerkeley DBを示す「bdb」が指定されています。「LDAPはデータベース」と言いながら、実はOpenLDAPはデータベースファイルの読み書きを外部の仕組みに頼っています。bdb以外のデータベースであるSQLサーバでデータを管理することもできます。
BDB
OpenLDAPで標準的に使用されるバックエンドデータベースであり、Berkeley DBを使ってデータを管理しています。BDBは内部的にBerkeley DBのトランザクション機能を使用しており、データの安全性が向上しています。また、データの復旧をはじめ、データを管理するにあたっては、Berkeley DBのユーティリティが利用されています。
HDB
BDBを改良したバックエンドデータベースで、ディレクトリツリーの階層構造についての情報をデータベース内に持つことで、更新性能が向上しています。
LDBM
OpenLDAPのバージョン2.0までの間、標準として使用されていたバックエンドデータベースです。LDBMはBerkeley DBまたはgdbmを利用してデータを管理しています。BDBのように、内部的なトランザクション機能を持っていないため、BDB、HDBと比較してデータの安全性は劣ります。
SQL
OpenLDAPはバックエンドデータベースとしてRDBMSを使用することもできます。このSQLバックエンドは、Berkeley DBの代替としてRDBMSを使用するというよりは、既存のRDBMSのデータに対してLDAP経由でアクセスすることを目的として設計されています。SQLバックエンドを使用するには、エントリのDN(Distinguished Name)やスキーマに関する情報を別途RDBMS内に格納しておく必要があります。
LDAP
バックエンドデータベースとしてLDAPサーバを使用します。このLDAPバックエンドはLDAPのプロキシサーバとして動作し、クライアントから受け付けた要求を指定したLDAPサーバに送信して、その結果をクライアントに返します。
meta
metaバックエンドは、LDAPバックエンド同様にLDAPサーバのプロキシサーバとして動作しますが、LDAPバックエンドと異なるのは、複数のLDAPサーバに対してプロキシを行い、それらのディレクトリツリーを単一のディレクトリツリーとして見せるということです。
Perl
Perlバックエンドは、Perlインタプリタとして動作し、設定ファイルで指定したPerlモジュールをバックエンド上で実行します。Perlバックエンドは、クライアントからの要求を受け付けると、その内容をPerlモジュールに引き渡し、その処理結果をクライアントに返します。
LDIF
LDIFバックエンドは、テキストファイルにLDIF形式でデータを格納します。LDIFバックエンドは、性能は低くとも、簡易に扱えるバックエンドデータベースとして設計されており、規模が小さく、更新頻度の少ないデータの管理に向いています。
monitor
moninorバックエンドは、サーバデーモンの動作状態に関する情報をクライアントに返します。
suffix    "dc=bigbang,dc=dyndns,dc=org"
 また、suffixオプションにはDIT(Directory Information Tree)のトップとなる「dc=bigbang,dc=dyndns,dc=org」が指定されていることを確認します。 suffixは、管理するデータベースの「名前空間 (namingContext)」の基底を定義します。これから作ろうとするデータベースはこの名前空間に属さなければなりません。別の名前空間のデータベースも作りたい場合には、 suffix "..." "..." のように複数定義することも可能です。
rootdn    "cn=Manager,dc=bigbang,dc=dyndns,dc=org"
rootpw     {SSHA}*************************
 さらに、エントリ登録時の認証に必要となるrootdnおよびrootpwオプションには、管理者用dnとしてcn=Manager,dc=bigbang,dc=dyndns,dc=orgおよび適切なパスワードを指定します。
 rootdnはLDAPの読み書き全ての権限を持つスーパーユーザのことで、上記のようにManagerというcnを指定する例が多いですが、adminやAdminも問題ありません。実際の認証の際には、大文字小文字は全く無視されますので、例えばldapdelete -x -D "cn=Admin,dc=bigbang,dc=dyndns,dc=org" ... としても認証はとおります。rootdnもsuffixの名前空間に必ず属していなければなりません(最近はそうでもようです。man slapd.confで確認してください)。スーパーユーザはデータベース上に実際に作成する必要はありません。
 rootpwはrootdnのパスワードとなります。テキストでの記載はセキュリティ上、非推奨です。上記は"secret"という文字列をSSHA(ソルト付きSHA:デフォルト)でハッシュした文字列。こうしたハッシュを作成するためのツールはOpenLDAPに付属していて、
slappasswd -h '{<暗号化方式>}' -s <パスワード>
# slappasswd -h {SSHA} -s secret
と実行すれば標準出力に出力されます。ハッシュ方法は{SSHA}の他、{SHA}、{MD5}、{SMD5}、{CRYPT}がサポートされています。-sで元文字列を指定しなければ、slappasswd プログラムが対話的に質問します。
directory    /var/lib/ldap
 directoryはBerkeley DB関連のファイルを作成するディレクトリを指定するオプションです。OSやOpenLDAPのパッケージによっても場所は異なりますが、たいていデフォルトのままでかまいません。ただし、初めてslapdデーモンを起動する前に、確かにそのディレクトリが存在し、パーミションがslapdサービス実行ユーザ(通常はldap)所有の700または770であることを確認した方がよいでしょう。データベースが壊れてslapdが固まったりするようになった際には、slapdデーモンを止めてからこのディレクトリを物理的に空にすれば、データは戻ってきませんがサービスは起動するようになります。
index objectClass                       eq,pres
index ou,cn,mail,surname,givenname      eq,pres,sub
index uidNumber,gidNumber,loginShell    eq,pres
index uid,memberUid                     eq,pres,sub
index nisMapName,nisMapEntry            eq,pres,sub
 indexは属性毎に管理するインデックスを指定します。ユーザ情報を扱うposixAccountのように検索キーとして頻繁に使用する属性(uid、uidNumber等)とほとんど使用しない属性(gecos等)がはっきりしている場合には検索キーにインデックスを作成しておくと検索速度が早くなります。
 ただし、インデックスを作成するとその分ディスク容量が必要になるので必要に応じて作成するようにします。
 書式は以下のとおりです。
index {<属性リスト>|default} [<インデックス設定>]
 <属性リスト>だけが指定された場合、デフォルトのインデックス(eq,pres)が指定されたものとみなされます。
pres(存在)
検索例:uid=*
eq(等価)
検索例:uid=ldapuser
approx(近似)
検索例:uid=ldapusr
sub(部分一致)
検索例:uid=ldap*
none(無し)
例:インデックスのデフォルトセットを存在(presence)と等価性(equality)を管理するように設定
 index default eq,pres
例:objectClassとuid属性型についてデフォルトのインデックス(eq,pres)を管理すように設定
 index objectClass,uid
例:cnとsn属性型について等価性(equality)、部分文字列(substring)、近似(approximate)のインデックスを管理するように設定
 index cn,sn eq,sub,approx
 インデックスの設定を行ったらslapindexを使ってインデックスを作成します。
# service slapd stop
# /usr/local/sbin/slapindex
# service slapd start
 なお、インデックスはslapd.confのdirectoryで指定されたディレクトリ配下に格納されます。
password-hash
 データの属性のひとつに、ユーザのパスワードの格納に使うuserPasswordというエントリがあります。slapd.confのpassword-hashディレクティブは、フロントエンドアプリケーションからのデータ作成/更新要求で値をuserPassword エントリへ格納する際に、サーバ側で行うハッシュの方式を指定します。指定可能なハッシュ方式の種類は前で説明しましたslappasswdコマンドで使用可能なものと、ハッシュしないことを示す{CLEARTEXT}です。
 最大の注意点は、この機構は、フロントエンドがLDAP Password Modify Extended Operation (RFC3062)に則って通信を行う場合にだけ働くということです。そうしたものには、例えば、ユーザ情報を一括管理するために利用するnss_ldap + PAMモジュールなどがあります。しかし、 OpenLDAPパッケージ付属ユーティリティのldapaddやldapmodifyはパスワード変更拡張手順を使しませんので、専らそれらを使ってデータを登録/変更するつもりであるのなら、このパラメータを{CRYPT}や{SSHA}に設定したとしても全く無駄ということになります。
 つまり、ハッシュは行われず、元のテキストがBase64エンコードされた状態でuserPasswordに格納されます。逆に、フロントエンドアプリケーション自体がハッシュ機能を備えていてそれを有効にしている場合には、こちらのパラメータは{CLEARTEXT}にしておく必要があります。
 最後に、このままの設定ではすべてのユーザがすべてのデータを読み書きできてしまいます。そのためユーザ自身のデータはすべて変更可能、匿名ユーザはすべてのuserPasswordをバインド可能、すべてのユーザはuserPassword以外のすべてのデータを読取り可能という設定をしました。
 なお、rootdnはこのアクセス権限設定を無視してすべてのデータを変更可能です。

CentOS 5の場合(ここから)
# パスワード変更に関する最低限のアクセス制御
#
# userPassword属性に対する設定
#  ・LDAP管理者(cn=Manager,dc=bigbang,dc=dyndns,dc=org)は書込可能(write)
#  ・自分自身(self)は書込可能(write)
#  ・匿名接続(anonymous)した場合は 認証時のみuserPasswordを利用できる
#  ・そのほかのユーザ(*)は何もできない(none)
access to attrs=userPassword
    by self write
    by dn="cn=Manager,dc=bigbang,dc=dyndns,dc=org" write
    by anonymous auth
    by * none
# userPassword属性以外(*)に対する設定-------
#  ・LDAP管理者(cn=Manager,dc=bigbang,dc=dyndns,dc=org)は書込可能(write)
#  ・自分自身(self)は書込可能(write)
#  ・そのほかのユーザ(*)は読取は可能(read)
access to *
    by dn="cn=Manager,dc=bigbang,dc=dyndns,dc=org" write
    by self write
    by * read
CentOS 5の場合(ここまで)
CentOS 6の場合(ここから)
# vi /etc/openldap/slapd.conf
# パスワード変更に関する最低限のアクセス制御
#
# userPassword属性に対する設定
#  ・LDAP管理者(cn=Manager,dc=bigbang,dc=dyndns,dc=org)は書込可能(write)
#  ・自分自身(self)は書込可能(write)
#  ・匿名接続(anonymous)した場合は 認証時のみuserPasswordを利用できる
#  ・そのほかのユーザ(*)は何もできない(none)
access to attrs=userPassword
  by self =rwcsx
  by anonymous auth
  by * none
# userPassword属性以外(*)に対する設定-------
#  ・LDAP管理者(cn=Manager,dc=bigbang,dc=dyndns,dc=org)は書込可能(write)
#  ・自分自身(self)は書込可能(write)
#  ・そのほかのユーザ(*)は読取は可能(read)
access to *
  by self =rwcsx
  by * read

CentOS 6の場合(ここまで)
アクセス制御については下記ページを参照してください。
参照ページ:slapdの設定 5.3. アクセス制御
 新しい設定を読み込ませるため、LDAPサーバを再起動します。
# service slapd restart
slapd を停止中:                                            [  OK  ]
slapd を起動中:                                            [  OK  ]

●slapd.conf設定内容の確認

 2016.4.21現在、slapd.confを直接編集するようなことはしません。

 slapd.confファイルに問題がある場合は、下記の例のように「config file testing succeeded」と表示されて終了するのではなく、問題の行まで解析が行われたところで、問題がある旨を示すメッセージが表示されます。slapd.confファイルに問題がある場合は、このメッセージを参考に問題点を修正することができます。
# slaptest -u -d 64 -f /etc/openldap/slapd.conf
reading config file /etc/openldap/slapd.conf
line 5 (include      /etc/openldap/schema/core.schema)
reading config file /etc/openldap/schema/core.schema
……[略]……
config file testing succeeded

●ユーザ認証の設定

 2016.4.21現在、slapd.conf等を直接編集するようなことはしません。

 ここまでの設定で、ユーザ認証に必要なエントリがOpenLDAPサーバに登録されました。ここからは、LDAP認証を行うクライアント側の設定を説明していきます。
 LDAPクライアントからOpenLDAPサーバに対してユーザ認証を行うには、LDAPクライアントとなるコンピュータ側で、どのLDAPサーバに対し、どのように問い合わせるかの設定が必要になります。具体的には、以下のファイルを変更する必要があります。

ファイル名 説明
/etc/nsswitch.conf NSS(Name Service Switch)の設定ファイルです。
/etc/pam.d/system-auth PAM(Pluggable Authentication Modules)がアプリケーションへ共通設定を提供するためのファイルであり、認証時に多くのプログラムから参照されます。PAM自体の概要は、/usr/share/doc/pam-X.XX……/以下のドキュメントを参考にしてください。
/etc/ldap.conf NSS、PAMがLDAPサーバへアクセスする際に利用するモジュール、nss_ldap.so、pam_ldap.so共通の設定ファイルです。このファイルの記述方法は、man nss_ldap、man pam_ldapで確認できます。今はこのファイルを利用せず、pam_ldap.confを利用します。
/etc/openldap/ldap.conf ldapadd、ldapmodifyなど、OpenLDAPのクライアントコマンドが参照する設定ファイルです。このファイルの記述方法は、man ldap.confで確認できます。

 NSSの設定ファイルは/etc/nsswitch.confで、さまざまな「名前解決」に関する情報をどこから得るのかを設定します。
 例えば、以下のような記述があったとします。
passwd:    files nisplus
 この場合、passwd(ユーザ情報)はローカルの/etc/passwd(files)、NIS+サーバ(nisplus)の順番で検索されます。
 nss_ldapをインストールした際に作成された/etc/nsswitch.ldapは、以下のようにユーザやグループ情報をローカルファイル、LDAPサーバの順で検索するように設定された/etc/nsswitch.confのひな型です。
passwd:    files ldap
group:     files ldap
CentOS 5の場合(ここから)
 必要なパッケージをインストールします。
# yum -y install openldap-clients nss_ldap
 ldap.confを編集します。
# vi /etc/openldap/ldap.conf
uri ldap://127.0.0.1/ ← LDAPサーバのURI
base dc=bigbang,dc=dyndns,dc=org ← Suffix指定
ssl on ← 追記
tls_cacertdir /etc/openldap/certs
pam_password md5 ← 最終行に追記
 system-auth-acを編集します。
 なお、PAMの設定を変更する場合は、必ず現在の設定ファイルをバックアップしてから行ってください。PAMの設定ファイルを間違って編集すると、ログインすらできなくなってしまう可能性があります。設定を変更する場合は、LDAP認証の動作確認が取れるまで、必ず1つはroot権限でログインした端末を残しておくことをお勧めします。万が一ログインできなくなった場合は、システムをシングルユーザモードで起動して設定を修正します。
# vi /etc/pam.d/system-auth-ac
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
#auth        sufficient    pam_unix.so nullok try_first_pass ← コメントアウト
auth        sufficient    pam_ldap.so nullok try_first_pass ← 変更
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        required      pam_deny.so
account     required      pam_unix.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     required      pam_permit.so
account     [default=bad success=ok user_unknown=ignore] pam_ldap.so ← 追記
password    requisite     pam_cracklib.so try_first_pass retry=3
 ↓ コメントアウト
#password    sufficient    pam_unix.so md5 shadow nullok try_first_pass use_authtok
password    sufficient    pam_ldap.so md5 shadow nullok try_first_pass use_authtok ← 変更
password    required      pam_deny.so
session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_ldap.so ← 追記
 ↓ 必要であれば追記(ログイン時にホームディレクトリを自動作成)
session     optional      pam_mkhomedir.so skel=/etc/skel umask=077
 nsswitch.confを編集します。
# vi /etc/nsswitch.conf
passwd:     files ldap ← 変更
shadow:     files ldap ← 変更
group:      files ldap ← 変更
netgroup:   ldap ← 変更
automount:  files ldap ← 変更
 authconfigを編集します。
# vi /etc/sysconfig/authconfig
USELDAP=yes ← 変更
# shutdown -r now
# su - test1000 ← LDAPに登録されているユーザ
Creating directory '/home/test1000'.
Creating directory '/home/test1000/.kde'.
Creating directory '/home/test1000/.kde/Autostart'.
Creating directory '/home/test1000/.mozilla'.
Creating directory '/home/test1000/.mozilla/extensions'.
Creating directory '/home/test1000/.mozilla/plugins'.
$ ← ログインできた
$ pwd
/home/test1000 ← ホームディレクトリが作成される
$ ls -ld
drwx------ 4 test1000 test1000 4096 10月 14 20:14 . ← umaskも反映された
$ passwd ← LDAPパスワードを変更してみる
Changing password for user test1000.
Enter login(LDAP) password:
New password:
Retype new password:
LDAP password information changed for test1000
passwd: all authentication tokens updated successfully. 
CentOS 5の場合(ここまで)

CentOS 6の場合(ここから)
 必要なパッケージをインストールします。
# yum -y install openldap-clients nss-pam-ldapd
 ldap.confを編集します。
# vi /etc/openldap/ldap.conf
URI ldap://127.0.0.1/ ← LDAPサーバのURI
BASE dc=bigbang,dc=dyndns,dc=org ← Suffix指定
TLS_CACERTDIR /etc/openldap/certs
 nslcd.confを編集します。
# vi /etc/nslcd.conf
##### 131行目付近
uri ldap://127.0.0.1/ ← LDAPサーバのURI
base dc=bigbang,dc=dyndns,dc=org ← Suffix指定
ssl no
tls_cacertdir /etc/openldap/certs
 pam_ldap.confを編集します。
 今まで、使用していた/etc/ldap.confは存在しないようです。
# vi /etc/pam_ldap.conf
##### 17行目
#host 127.0.0.1 ← コメントアウト
##### 20行目
base dc=bigbang,dc=dyndns,dc=org ← Suffix指定
##### 最終行に追記
uri ldap://127.0.0.1/
ssl no
tls_cacertdir /etc/openldap/certs
pam_password md5
 system-authを編集します。実際にはsystem-auth-acへのリンクとなっています。
 なお、PAMの設定を変更する場合は、必ず現在の設定ファイルをバックアップしてから行ってください。PAMの設定ファイルを間違って編集すると、ログインすらできなくなってしまう可能性があります。設定を変更する場合は、LDAP認証の動作確認が取れるまで、必ず1つはroot権限でログインした端末を残しておくことをお勧めします。万が一ログインできなくなった場合は、システムをシングルユーザモードで起動して設定を修正します。
# vi /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
#auth        sufficient    pam_sss.so use_first_pass ← コメントアウト
auth        sufficient    pam_ldap.so use_first_pass ← 変更
auth        required      pam_deny.so
account     required      pam_unix.so broken_shadow
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
#account     [default=bad success=ok user_unknown=ignore] pam_sss.so ← コメントアウト
account     [default=bad success=ok user_unknown=ignore] pam_ldap.so ← 変更
account     required      pam_permit.so
password    requisite     pam_cracklib.so try_first_pass retry=3 type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
#password    sufficient    pam_sss.so use_authtok ← コメントアウト
password    sufficient    pam_ldap.so use_authtok ← 変更
password    required      pam_deny.so
session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
 ↓ 必要であれば追記(ログイン時にホームディレクトリを自動作成)
# session     optional      pam_oddjob_mkhomedir.so skel=/etc/skel umask=077
 ↓ 上記の方法ではumaskが有効にならないので下記に変更
session     optional      pam_mkhomedir.so skel=/etc/skel umask=077
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
#session     optional      pam_sss.so ← コメントアウト
session     optional      pam_ldap.so ← 変更
 nsswitch.confを編集します。
# vi /etc/nsswitch.conf
passwd:files ldap
shadow:files ldap
group:files ldap
netgroup:ldap
automount: files ldap
 authconfigを編集します・
# vi /etc/sysconfig/authconfig
USELDAP=yes
# chkconfig nslcd on
# shutdown -r now
login:test1000 ← LDAPに登録されているユーザ
Password:
Creating directory '/home/test1000'.
$ ← ログインできた
$ passwd ← LDAPパスワードを変更してみる
Changing password for user test1000.
Enter login(LDAP) password:
New password:
Retype new password:
LDAP password information changed for test1000
passwd: all authentication tokens updated successfully. 
CentOS 6の場合(ここまで)

 これらの設定ファイルは、viなどのエディタを用いて1つ1つ手動で変更することも可能ですが、GUIツールを通して変更するほうが便利です。GUIツールを用いて変更作業を行うには、以下のコマンドを実行します。
# system-config-authentication
 または、[システム]-[管理]-[認証]を選択します。
 system-config-authenticationコマンドの実行後に起動するGUI画面では、ユーザ情報タブ(画面1)で、LDAPサポートを有効にする(L)のチェックを選択します。

画面1
画面1 system-config-authenticationコマンドで起動するGUI画面

次に、LDAPの設定(D)ボタンをクリックして表示される画面(画面2)では、
  • エントリを検索するベースとなるDITの位置(今回は"dc=bigbang,dc=dyndns,dc=org")
  • 接続するLDAPサーバのURL(今回はローカルホストを示す"ldap://127.0.0.1/")
を指定します。

画面2

画面2 LDAPの設定(D)ボタンをクリックして表示される画面

 続いて、認証タブ(画面3)に移動し、ユーザ情報タブでの設定と同様に、LDAPサポートを有効にする(L)を選択します。LDAPの設定(D)ボタンをクリックして現れる画面には先に入力した情報が保持されているので、ここではそのままOK(O)をクリックし、GUIツールを終了します。

画面3
画面3 認証タブ画面

 以上で、LDAPクライアントとなるコンピュータ上のPAMおよびNSS関連の設定ファイルの変更が完了しました。これで、LDAPサーバへ接続し、ユーザ認証ができるようになります。


●PAMを利用した認証

 LDAP認証の設定が完了すると、PAMを利用するさまざまなプログラムからのLDAP認証が可能になります。これは、先ほど変更した/etc/pam.d/system-authファイルが、多くのプログラムから認証処理時に参照されているためです。例えば、以下のようなプログラムからも、/etc/pam.d/system-authファイルが参照されています。

プログラム名 system-authを参照する設定ファイル
su /etc/pam.d/su
sshd /etc/pam.d/sshd
telnetd /etc/pam.d/remote
vsftpd /etc/pam.d/vsftpd
cvs /etc/pam.d/cvs


 それでは、OpenLDAPサーバに登録したユーザエントリを用いて、suコマンド、sshコマンドなどを用いてLDAP認証を行ってみましょう()。
# su - test1001
$
# ssh test1001@localhost
test1001@localhost's password:test1001
Last login: Sat Sep 20 18:13:57 2008 from hostname
$
 OpenLDAPサーバでのユーザ認証は成功したでしょうか。もしユーザ認証に失敗する場合は、syslogdに送付されるOpenLDAPサーバのアクセスログを確認し、問題を修正してください。
:各ユーザエントリのhomedir属性に指定したホームディレクトリを事前に作成していない場合、プログラムによって警告メッセージが表示されたり、またはエラーが発生することがあります。ここでの認証例は、ホームディレクトリをあらかじめ作成している場合の例です。

●PAMを利用しないLDAP認証

 このほか、PAMを経由したLDAP認証が実装されていないプログラムについては、別途、LDAPサーバへの接続方法を確認する必要があります。例えばApacheの場合は、Apache側で個別にLDAP認証のための設定を行う必要があります。●Apacheで作るファイルサーバ(LDAP認証編)を参照してください。

●PAM認証とは

 ユーザにアクセス特権を与えるようなプログラムは、必ずと言っていいほどユーザの認証機能を有します。システムにログインする際に、ユーザはユーザ名とパスワードを提供し、ログインプロセスがその情報を使用してログインの認証、すなわちユーザが申請した身元が本人のものであることを検証します。パスワード以外の認証形式も可能であり、異なる方法でパスワードを格納することもできます。
 PAM(Pluggable Authentication Modules)は認証プログラムをリコンパイルしなくても、システム管理者が認証ポリシーを設定できるようにする一つの方法です。PAMを使用する場合は、設定ファイルを編集することによってプログラムにモジュールをプラグインする方法を制御します。
 login認証をLDAP認証に対応させた場合の認証処理の流れは下記のようになります。
  1. ユーザ(test1001)からloginサービスにアクセスがあります。
    この時、ユーザはユーザIDとパスワードを入力します。
  2. loginサービスはPAMライブラリの認証処理を呼び出します。
  3. 認証処理のために呼び出されたPAMライブラリは、loginサービスのPAM設定ファイル(/etc/pam.d/login)に記載された情報により、認証方法を判断します。
  4. PAM設定ファイルに記載されている認証方法にしたがい、PAMモジュールに渡して認証処理を行います(下図では「LDAPで認証」を行う設定となっていますので、pam_ldapモジュールを呼び出します)。
  5. 処理を受け取ったPAMモジュール(下図では、pam_ldapモジュール)は、該当ユーザ(下図では、test1001)を検索します。
  6. 検索に成功し、パスワードが正しければ「認証OK」という返事を、loginサービスに返します。
  7. 「認証OK」の返答を受けたloginサービスは、ユーザのログインを許可します。

PAM流れ

 PAMモジュールのタイプ

 PAMには4つのタイプのモジュールがあります。
  • authモジュールは、おそらくパスワードを要求しチェックすることで実際の認証を行ない、グループの所属権やkerberosの「ticket」のような「証明書」を設定します。
  • accountモジュールは、認証が許可されること(カウントの期限が切れていないこと、ユーザがその時刻におけるログインを許されること、など)確認するためのチェックを行ないます。
  • passwordモジュールはパスワードを設定するために使用されます。
  • sessionモジュールは、ユーザのホームディレクトリをマウントしたり、メールボックスを利用可能にするなどして、認証されたユーザがアカウントを利用できるようにするために使用されます。
 これらのモジュールをスタックすることによって、複数のモジュールを設定することができるようになります。例えば、通常rloginは少なくとも2つの認証手段を利用します。rhostsの認証が成功した場合には、そのまま接続許可します。失敗した場合には、標準のパスワード認証が実行されます。
 いつでも新しいモジュールを追加することができます。その場合、PAMを認識するアプリケーションにそれらのモジュールを使用させることができます。例えば、ワンタイムパスワードシステムを使用しており、かつそのシステムをサポートするようなモジュールを作成することができる場合 (モジュールの作成方法に関するドキュメントは、/usr/doc/pam* に含まれています)、リコンパイルや修正を実行しなくても、PAMを認識するプログラムは、新しいモジュールを使用し、新しいワンタイムパスワードシステムと連動することができるようになります。

 PAMモジュールの制御フラグ

 PAM設定ファイルの第2パラメータは、制御フラグをあわらしています。これは、モジュールタイプ別に、認証に関する制御の度合いを設定するためのフラグです。
  • requiredは、許可される認証の順序で完全にチェックが行われていなければならないモジュールで、同タイプの他のモジュールがチェックされるまで、ユーザには何も通知しないことを表しています。
  • requisiteは、許可される認証の順序で完全にチェックが行われていなければならないモジュールで、認証に失敗したメッセージをユーザに通知することを表しています。
  • sufficientは、チェックが失敗した場合は、無視されるにモジュールを表しています。ただし、sufficientを利用したモジュールのの認証が成功し、さらにrequiredを利用したモジュールが全て認証に成功した場合は、同タイプの他のモジュールはチェックせず、認証が終了します。
  • optionalは、チェックが失敗した場合は、無視されるにモジュールを表しています。optionalのモジュールが全て成功/失敗した場合のみモジュールタイプ全てのPAM認証が決定されます。

 ライブラリの種類

 CentOS6のライブラリ。
# ls /lib/security/
pam_access.so        pam_gnome_keyring.so  pam_nologin.so           pam_tally2.so
pam_cap.so           pam_group.so          pam_oddjob_mkhomedir.so  pam_time.so
pam_chroot.so        pam_issue.so          pam_passwdqc.so          pam_timestamp.so
pam_ck_connector.so  pam_keyinit.so        pam_permit.so            pam_tty_audit.so
pam_console.so       pam_krb5              pam_postgresok.so        pam_umask.so
pam_cracklib.so      pam_krb5.so           pam_pwhistory.so         pam_unix.so
pam_debug.so         pam_krb5afs.so        pam_rhosts.so            pam_unix_acct.so
pam_deny.so          pam_lastlog.so        pam_rootok.so            pam_unix_auth.so
pam_echo.so          pam_ldap.so           pam_securetty.so         pam_unix_passwd.so
pam_env.so           pam_limits.so         pam_selinux.so           pam_unix_session.so
pam_exec.so          pam_listfile.so       pam_selinux_permit.so    pam_userdb.so
pam_faildelay.so     pam_localuser.so      pam_sepermit.so          pam_warn.so
pam_faillock.so      pam_loginuid.so       pam_shells.so            pam_wheel.so
pam_filter           pam_mail.so           pam_smbpass.so           pam_winbind.so
pam_filter.so        pam_mkhomedir.so      pam_sss.so               pam_xauth.so
pam_fprintd.so       pam_motd.so           pam_stress.so
pam_ftp.so           pam_namespace.so      pam_succeed_if.so

 サービス

 PAMを使用する各プログラムは、独自の「サービス」名を定義します。loginプログラムはサービスタイプloginを定義し、ftpdはサービスタイプ ftpを定義します。等々。一般に、サービスタイプはサービスにアクセスするために使用されるプログラムの名前であり、サービスを提供するために使用されるプログラムの名前ではありません (違いがある場合)。

 設定ファイル

 ディレクトリ/etc/pam.dはすべてのPAMアプリケーションを設定するために使用されます。(以前のバージョンでは、これは/etc/pam.confでした。)各アプリケーション(実際は、各サービス)は独自のファイルを持っています。ファイルは以下のようになります。以下はCentOS6の例です。
# ls /etc/pam.d/
atd                  halt              ricci              system-auth
authconfig           kcheckpass        run_init           system-auth-ac
authconfig-gtk       kdm               runuser            system-config-authentication
authconfig-tui       kdm-np            runuser-l          system-config-date
chfn                 kppp              samba              system-config-kdump
chsh                 kscreensaver      screen             system-config-keyboard
config-util          ksu               setup              system-config-network
crond                login             smartcard-auth     system-config-network-cmd
cups                 newrole           smartcard-auth-ac  system-config-users
cvs                  other             smtp               tuned-adm
dovecot              passwd            smtp.postfix       vlock
eject                password-auth     smtp.sendmail      webmin
fingerprint-auth     password-auth-ac  squid              wireshark
fingerprint-auth-ac  polkit-1          ssh-keycat         xdm
gdm                  postgresql        sshd               xserver
gdm-autologin        poweroff          su
gdm-fingerprint      ppp               su-l
gdm-password         reboot            sudo
gnome-screensaver    remote            sudo-i
 内容の例を下記に示します。
#%PAM-1.0
auth      required  /lib/security/pam_securetty.so
auth      required  /lib/security/pam_pwdb.so shadow nullok
auth      required  /lib/security/pam_nologin.so
account   required  /lib/security/pam_pwdb.so
password  required  /lib/security/pam_cracklib.so
password  required  /lib/security/pam_pwdb.so shadow nullok use_authtok
session   required  /lib/security/pam_pwdb.so
 先頭行はコメントです。2行目から4行目ではログイン認証で使用するモジュールを列挙しています。2行目は、ユーザがrootとしてのログインを試行したならば、かつ /etc/securettyファイルが存在するならば、ログイン試行時に使用されたttyがこのファイルにリストされていることを確認します。3行目によって、ユーザはパスワードを要求され、そのパスワードがチェックされます。4行目は/etc/nologinファイルが存在するか否かをチェックし、存在する場合にはそのファイルの内容を表示し、ユーザがrootでない場合には、そのユーザをログインさせません。
 最初のモジュールが失敗した場合であっても3つのモジュールのすべてがチェックされることに注意してください。これはセキュリティの決定です - 認証が拒否された理由をユーザに悟られないように設計されています。なぜならば、拒否された理由を知ることによって認証を突破することが容易になる可能性があるからです。この動きを変更するには、requiredをrequisiteに変更します。requisiteモジュールから失敗という結果が返された場合、その他のモジュールをコールすることなく、PAM認証は即座に失敗します。
 5行目によって必要なアカウント処理が実行されます。たとえば、シャドウパスワードが有効な場合、pam_pwdb.soモジュールは、アカウントの期限が切れていないか、またはユーザがパスワードを変更していないか、およびパスワード変更に関する猶予期間が切れていないか、をチェックします。
 6行目は新規に変更されたパスワードに対して一連のテストを実行することにより、そのパスワードがパスワードに対する辞書型攻撃プログラムによって簡単に判明するものでないこと、などを確認します。
 7行目(複数行になることもあります)によって、loginプログラムがユーザのパスワードを変更する際には、pam_pwdb.soモジュールを使用させることを指定しています(そのようなことが行われるのは、シャドウパスワードの期限が切れた場合などに、authモジュールがパスワードを変更する必要があると判断した場合に限られます)。
 最後の8行目は、pam_pwdb.soモジュールを使用してセッションを管理することを指定しています。現在のところ、このモジュールは何も行いません。したがって、必要なモジュールと置き換える(またはスタックすることで補足する。)ことができます。
 各ファイル内の行の順序が重要であることに注意してください。実際にはrequiredモジュールのコール順序はさして重要ではない一方で、その他の制御フラグを利用することができます。optionalが使用されることはめったになく、Linuxシステムでデフォルトで使用されることはまったくありません。sufficientおよびrequisiteでは順序が重要になります。
 例として、rlogin用のauth設定を見てみましょう。
auth  required    /lib/security/pam_securetty.so
auth  sufficient  /lib/security/pam_rhosts_auth.so
auth  required    /lib/security/pam_pwdb.so shadow nullok
auth  required    /lib/security/pam_nologin.so
 これはほとんどloginのエントリと同じですが、特別のモジュールを指定するための特別な行があり、かつモジュールの指定順序が異なっています。
 まず、pam_securetty.soは、安全ではないターミナルからrootのログインが行われないようにします。これにより、rootによるrlogin試行のすべてが効果的に拒否されます。許可したい場合(その場合には、インターネットに接続しないか、または優れたファイアウォールを設置することをお奨めします) には、この行を削除するだけで済みます。
 第二に、pam_rhosts_auth.soによるユーザ認証が成功した場合、PAMはパスワードチェックを実行せずに、ただちにrloginに対して成功という結果を返します。pam_rhosts_auth.soによるユーザ認証が失敗した場合、その失敗した認証は無視されます。
 第三に、pam_rhosts_auth.soによるユーザの認証が失敗した場合には、pam_pwdb.soモジュールによる通常のパスワード認証が実行されます。
 最後に、上記で指定したようにしてpam_nologin.soが/etc/nologinをチェックします。
 securettyチェックが失敗した場合にパスワードの入力を要求したくない場合には、pam_securetty.soモジュールをrequiredから requisiteに変更すれば良いことに注意してください。

 シャドウパスワード

 pam_pwdb.soモジュールはシャドウパスワードが使用されていることを自動的に検出し、必要な調整処理をすべて実行します。

●SSHの公開鍵をLDAPで管理する(ソース編)

 参照したページは下記のとおりです。
 第6回 OpenSSHの公開鍵をLDAPで管理
 LDAPでSSHの鍵認証を利用してみる
 OpenSSH の公開鍵を LDAP で管理
 SSHの公開鍵をLDAPで管理
 このページにも記載されているとおり、公開鍵認証方式を使用することが当たり前になってきた昨今、管理対象マシンが2、3台のうちならいいのですが、これが10台、20台となってきた場合、これまでの方法では1台1台に公開鍵を登録しては削除すると言う作業が非常に煩雑となります。
 これを解消する方法がLDAPによる公開鍵管理手法です。
 しかし、RPMパッケージで配布されているものはLDAPに対応していません。そこでOpenSSHのソースをダウンロードし、それにlpkのパッチ(OpenSSH LDAP Public Keys)を適用しLDAP上に格納されている公開鍵をsshdプロセスから参照させるようにします。
 今回はソース・パッチ共に5.8p1を使用します。
# cd /usr/local/src
# wget http://www.ftp.ne.jp/OpenBSD/OpenSSH/portable/openssh-5.8p1.tar.gz
# wget http://jfut.integ.jp/linux/openssh/openssh-lpk-5.8p1-0.3.13.patch
# tar zxvf openssh-5.8p1.tar.gz
# cd openssh-5.8p1
# patch -p0 < ../openssh-lpk-5.8p1-0.3.13.patch
 ↑ うまくパッチを適用できない場合は、「-p1」または「-p2」で実行してください。
# ./configure --with-ldap
 ↑ 上記より下記の方がいいかも
# ./configure -prefix=/usr \
                --sysconfdir=/etc/ssh --with-tcp-wrappers \
		--with-pam --with-ldap --with-md5-passwords
 ↑ yumでインストールされているsshを流用する場合は上記のようにする。
 ↑ この方がstart、stop等のオプションを流用出来る。
onfigure: error: PAM headers not found
上記のように表示された場合は「pam-devel」をインストールしてください。
# make
# make install
 下記のように表示された場合は、/etc/ssh以下のファイルを全て削除してから「make install」してください。
if [ ! -d /etc/ssh ]; then \
./mkinstalldirs /etc/ssh; \
fi
/etc/ssh/ssh_config already exists, install will not overwrite
/etc/ssh/sshd_config already exists, install will not overwrite
/etc/ssh/moduli already exists, install will not overwrite
/etc/ssh/ssh_host_key already exists, skipping.
/etc/ssh/ssh_host_dsa_key already exists, skipping.
/etc/ssh/ssh_host_rsa_key already exists, skipping.
/usr/sbin/sshd -t -f /etc/ssh/sshd_config
/etc/ssh/sshd_config line 80: Unsupported option GSSAPIAuthentication
/etc/ssh/sshd_config line 82: Unsupported option GSSAPICleanupCredentials
 これでパッチが適用されたOpneSSHがインストールされます。パッチが適用されているかどうかを確認します。
lddコマンドによるライブラリの確認
# ldd /usr/local/sbin/sshd  | egrep '(ldap|lber)'
 ↑ デフォルトのままインストールした場合
# ldd /usr/bin/ssh | egrep '(ldap|lber)'
 ↑ 「-prefix=/usr」を指定した場合
	libldap-2.4.so.2 => /usr/lib/libldap-2.4.so.2 (0x00e6f000)
	liblber-2.4.so.2 => /usr/lib/liblber-2.4.so.2 (0x00b64000)
設定ファイルの確認
# grep -i ldap /usr/local/etc/sshd_config
 ↑ デフォルトのままインストールした場合
# grep -i ldap /etc/ssh/sshd_config
 ↑ 「--sysconfdir=/etc/ssh」を指定した場合
# here are the new patched ldap related tokens
# entries in your LDAP must have posixAccount & ldapPublicKey objectclass
# LpkLdapConf /etc/ldap.conf
# LpkServers  ldap://10.1.7.1/ ldap://10.1.7.2/
 次にOpenLDAPの公開鍵用スキーマをコピーします。
# cp /usr/local/src/openssh-5.8p1/openssh-lpk_openldap.schema /etc/openldap/schema/
 このスキーマを読み込むようにslapd.confに下記を追加します。
# vi /etc/openldap/slapd.conf
include /etc/openldap/schema/openssh-lpk_openldap.schema
既にLDAPが構築されている場合の対処
まず、LDAPサービスを停止します。
# service slapd stop
lpk用の新たにスキーマを読み込ませるため下記のようにします。
# sudo -u ldap slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
「config file testing succeeded」と表示されればOKです。LDAPサービスを開始します。
# service slapd start
問題なくLDAPサービスが起動することを確認します。
 次は、DSA形式で秘密鍵と公開鍵を作成します。
$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/test1001/.ssh/id_dsa): そのままリターン押下
Created directory '/home/test1001/.ssh'.
Enter passphrase (empty for no passphrase): パスフレーズを入力
Enter same passphrase again: パスフレーズを再入力
Your identification has been saved in /home/test1001/.ssh/id_dsa.
Your public key has been saved in /home/test1001/.ssh/id_dsa.pub.
The key fingerprint is:
97:4d:8a:32:b3:f3:0d:62:06:92:5b:e4:79:07:46:35 test1001@fedora-star.bigbang.dyndns.org
 この操作で作成される~/.ssh/id_dsaが秘密鍵、~/.ssh/id_dsa.pubが公開鍵です。秘密鍵は途中で入力されるパスフレーズにより暗号化された状態で保存されます。後者の公開鍵は文字通り公開する鍵なので、他人に見られても問題ありません。
 次にLDAPサーバ側での操作です。既に登録してあるtest1001というユーザを利用し、次のように、公開鍵用の属性とオブジェクトクラスを追加します。変更部分はldapPublicKeyというオブジェクトクラスとsshPublicKeyという公開鍵用の属性です。この中にはid_rsa.pubやauthorized_keys2の中に1行で記録されている鍵情報をそのまま登録します。

dn: uid=test1001,ou=People,dc=bigbang,dc=dyndns,dc=org
uid: test1001
cn: test1001
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
objectClass: ldapPublicKey
userPassword:: e1NTSEF9MDlJNGQ2SzFNenhsKzlxZ0lIMmpuZGZPbEl6YXU2REI=
shadowLastChange: 15269
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/test1001
gecos: test1001
sshPublicKey: ssh-dss AAAAB3NzaC1kc3MAAACBAJ98cnqjoeNQTS53Fdp8E6K+aEhOaEsy5mvjGNod+dRNJbaL8kAyzhjxvrU0Bl45Q1dgHDTlRZcUXTi6kqEaVROQuuyGROSHTo /
KOwqqmnP02pCfzQ2712PzVPhk63bpQc01KUMKI4N291L8Q17Xe3VA7pisj9y410ooBAzRZk9vAAAAFQCE8E3v3RPmYib8IoBXtgFVezVzzwAAAIAjayYQ /
sC52THgfL614Gbe+6KXGJlMlVPSM8o8zRwfR/mE97aLNo66254m1i7Ko2I33wOQB0rnAlobdN01MJ+ySyTu /
TKytLR6M9746vLWRYN0JfQorT8gxoZHlfV1+xERBF435HFYZpNXtAFff6Xej2dwYPuy9rATYxmhoQXf0gAAAIB1gdM62AtMhXViLaaHBOINUGq5a464uat8 /
zgZHgsZ3D+P0DumLGrWcEPHxsELcCKTETRw6fhdoZUIilYVCiV16fCt9 Wx1ZdvCrVF3EHmWS4r05iSdTHoKlQzHpuBpditZI2Np/XWDBW+ceO3az7ogV7w /
Zx+wuyDfHbbGNuSKbjA== /
test1001@fedora-star.bigbang.dyndns.org


dn: cn=test1001,ou=Group,dc=bigbang,dc=dyndns,dc=org
objectClass: posixgroup
cn: test1001
userPassword: !
gidNumber: 1001

 このエントリをLDAP上に登録します。
$ ldapadd -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W -f test1001.ldif
 既にエントリが存在する場合は下記のような変更用のldifを作成し、登録します。

$ test1001_ssh_modify.ldif
dn: uid=test1001, ou=People,dc=bigbang,dc=dyndns,dc=org
changetype: modify
add: objectClass
objectClass: ldapPublickey
-
add: sshPublickey
sshPublickey: ssh-dss AAAAB3NzaC1kc3MAAACBAPRXd1S5gkahmbEoUIVEOGA17pIpFwLZsCU44cfqMxLqTZ9kimftK2cr++rI2VCQ87tr1BPBIRP3t /
Viojitkj8Qi+0bq6Uw8BXfLUFWlDWP7FgRkOdYEZBtdNNejfujuuWh2vpD4t3L+69VpvnSBV9svhakkIT0FVVocrgRylJAAAAFQDnC1RmbNMPhAZIuY0Tll /
7yEZNLkwAAAIEAp5JEo0Uh0O1WQ8Mr1lLql1gy8R61emsx2LhQmrU/qJT2shlWB8L6WBtjW6UI81b2Q76ByN9N8ISgxHcvShi1QuEvxCcBR85c3HtTJ77qy /
TY3okiiaKDx9+6Vj4fBnm0RUavmVIH8sGt9JK8FgYcSEgdAWiZPsq9xMWI5FsD8AAACBAKnZLMTJwG2dkzWSrjFpVJheFsDsdz1c1MinilwkALJ+RouQqhG /
3eQ63YOvhRRvEPkJHO+1t+ABxCTBP4Y5lv7aZqH+2ct0amxVy/E+6ejqQKLuoYkDvslPyk+HQmIaP4jaBCKuxHcR7bf+ArBKdWdf3bJ4QRHcO/QB3DiKm9Rp /
test1001@fedora-star.bigbang.dyndns.org
$ ldapmodify -x -D cn=Manager,dc=bigbang,dc=dyndns,dc=org -W -f test1000_ssh_modify.ldif
 やっぱりLDAP2.4ではすんなり登録できず、データベースを再作成するハメになりました。
 ●自己環境用のLDAPサーバの構築を参照してください。


 次にsshdプロセスがLDAPサーバを検索できるよう、/etc/ssh/sshd_config(上書きしなかった場合は/usr/local/etc/sshd_config)を修正します。下記のようにLDAP関連のオプションを有効にします。
UseLPK yes
LpkServers     ldap://127.0.0.1
LpkLdapConf    /etc/ldap.conf
LpkUserDN      ou=People,dc=bigbang,dc=dyndns,dc=org
LpkGroupDN     ou=Group,dc=bigbang,dc=dyndns,dc=org
LpkForceTLS    no
 /etc/ssh/ldap.confを編集します。存在しない場合は、新規作成します。
# vi /etc/ssh/ldap.conf
uri ldap://127.0.0.1/
base dc=bigbang,dc=dyndns,dc=org
host server.bigbang.dyndns.org
ssl no
#ssl start_tls
#tls_cacertdir /etc/openldap/cacerts
#tls_cacertfile /etc/pki/tls/certs/ca-bundle.crt
#tls_checkpeer no
 /etc/ssh/ldap.confの設定が完了すると/usr/libexec/openssh/ssh-ldap-wrapperコマンドを使ってユーザのRSA(またはDSA)鍵が取得できるようになります。下記コマンドを実行し、RSA(またはDSA)鍵が返ってくればOK。返ってこない場合は ldap.confまたはLDAPサーバ側の設定を見直します。
# /usr/libexec/openssh/ssh-ldap-wrapper username
 次に、/etc/ssh/sshd_configに下記2行を追加します。
AuthorizedKeysCommand /usr/libexec/openssh/ssh-ldap-wrapper
AuthorizedKeysCommandRunAs root
 RSA鍵を使用する場合は、RSAAuthenticationおよびPubkeyAuthenticationがyesである必要があります。
 準備ができたら、sshdプロセスを起動させ、クライアントから接続を行ってみます。
# service sshd restart
 問題なく起動することを確認します。
 あとは秘密鍵をクライアント側にコピーし、鍵認証で接続できるか確認してみましょう。.sshディレクトリがなくても接続できるはずです。
 ただし、ログイン時にサーバ側に該当ユーザのホームディレクトリが無い場合は、下記のようなエラーが表示されます。
Could not chdir to home directory /home/test1001: No such file or directory
 この対処方法は下記のようにしてください。
# vi /etc/ssh/sshd_config
UsePAM yes
 sshdを再起動します。
# service sshd restart
 これで、Windows上のTeraTermやPuTTYで初めてアクセスした場合に自動的にホームディレクトリが作成されます。
 ここで忘れてはならないのは「yum」によるopensshの自動更新の除外設定です。
# vi /etc/yum.conf
exclude= openssh*
 exclude行にopenssh*を追記すれば、自動更新対象外となります。

●SSHの公開鍵をLDAPで管理する(RPM編)

 OpenSSHサーバのインストールは済んでいるものとします。
 サーバ側の作業として下記を実施します。
 1.OpenSSHのLDAPサポートパッケージのインストール
 2.OpenLDAP設定ファイル編集
 3.LDAP情報の更新
 4.LDAPサーバに各ユーザの公開鍵を登録

 OpenSSHのLDAPサポートパッケージをインストールします。
# yum -y install openssh-ldap
# cp -a /usr/share/doc/openssh-ldap-5.8p1/openssh-lpk-openldap.schema
                                      \ /etc/openldap/schema/openssh.schema
 上記ファイルにinclude /etc/openldap/schema/openssh.schemaを追記します。
 必要であればLDAP情報を更新します。
# /etc/init.d/slapd stop
# rm -rf /etc/openldap/slapd.d/*
# sudo -u ldap slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
# /etc/init.d/slapd start
 LDAPサーバに各ユーザの公開鍵を登録します。
# vi hoge_ssh_modify.ldif
dn: uid=hoge,ou=People,dc=bigbang,dc=dyndns,dc=org
changetype: modify
add: objectClass
objectClass: ldapPublicKey
-
add: sshPublicKey
sshPublicKey: ssh-dss AAAAB3NzaC1kc3MAAACBAO6hNHcYgtncZrUtExcFwOvkv0pUrBacBg \
637LAaXpozjD8HLgOgnmLF01wYbRaP1outQzdDcpWyVZDH29hQwNGgROI4DIdG29EYZ8kHfPa4/G \
OXqi/XeEm9VemRyRhbaWBikrFEJrVSrV9T2D8LgFF654JUMsNSloQ37j5D4E6DAAAAFQD9t4AY+b \
Tx9KbzCxHLuO9aN9EbiQAAAIAUOw1AykiRAfJpNDRSqh4sRQVnaWyQuuwDwOYxD4Z1a2MjmOJ7qd \
qFjJ9MJrp2cY4kEUSiZP7u7sQirTIpl+ANKHP/0kxBojc7glTcxEieb87ChM2myM2QyCqgqRyipv \
u43vAhag85PnA3kHEkJ04zsc7BT4wpsFZGmK974lWF0gAAAIA3McRUTBDYJOIA9MEaw3btnVmNKd \
RNpYeLN8VbZoVYTKZwHVxO4qvDr3ooWnOxdmvM9QhuxPD1l1dwkshwHOID9mSua+YdJ+lz4fIPFT \
07+Wyk/z4NVREkYkK32xnsWNfIPGVOsDdEcr6LNvQaGMXHPbgLNE+bZELsBl59KyfTqg==
# ldapmodify -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" \
                         -W -f /etc/openldap/ldif/hoge_ssh_modify.ldif
 /etc/ssh/ldap.confを編集します。存在しない場合は、新規作成します。
# vi /etc/ssh/ldap.conf
uri ldap://127.0.0.1/
base dc=bigbang,dc=dyndns,dc=org
host server.bigbang.dyndns.org
ssl no
#ssl start_tls
#tls_cacertdir /etc/openldap/cacerts
#tls_cacertfile /etc/pki/tls/certs/ca-bundle.crt
#tls_checkpeer no
 /etc/ssh/ldap.confの設定が完了すると/usr/libexec/openssh/ssh-ldap-wrapperコマンドを使ってユーザのRSA(またはDSA)鍵が取得できるようになります。下記コマンドを実行し、RSA(またはDSA)鍵が返ってくればOK。返ってこない場合は ldap.confまたはLDAPサーバ側の設定を見直します。
# /usr/libexec/openssh/ssh-ldap-wrapper username
 次に、/etc/ssh/sshd_configに下記2行を追加します。
AuthorizedKeysCommand /usr/libexec/openssh/ssh-ldap-wrapper
AuthorizedKeysCommandRunAs root
 RSA鍵を使用する場合は、RSAAuthenticationおよびPubkeyAuthenticationがyesである必要があります。
 準備ができたら、sshdプロセスを起動させ、クライアントから接続を行ってみます。
# service sshd restart
 問題なく起動することを確認します。
 あとは秘密鍵をクライアント側にコピーし、鍵認証で接続できるか確認してみましょう。.sshディレクトリがなくても接続できるはずです。
 ただし、ログイン時にサーバ側に該当ユーザのホームディレクトリが無い場合は、下記のようなエラーが表示されます。
Could not chdir to home directory /home/test1001: No such file or directory
 この対処方法は下記のようにしてください。
# vi /etc/ssh/sshd_config
UsePAM yes
 sshdを再起動します。
# service sshd restart
 これで、Windows上のTeraTermやPuTTYで初めてアクセスした場合に自動的にホームディレクトリが作成されます。

●LDAPのレプリケーション

 LDAP Syncレプリケーションは、現在OpenLDAPの標準として開発が進められているレプリケーション方式です。LDAP SyncレプリケーションにはrefreshOnlyとrefreshAndPersistの2つのモードがあります。
 参照ページ:LDAP Sync 複製

 LDAP Syncレプリケーション

 LDAP Syncレプリケーションは、コンシューマ(スレーブサーバ)からプロバイダ(マスタサーバ)にレプリケーションの要求を送信するPULL型の仕組みを採用しています。
 LDAP Syncレプリケーションには「refreshOnly」と「refreshAndPersist」という2つのモードがあります。
 refreshOnlyモードは、コンシューマが同期要求をプロバイダに送信します。プロバイダはコンシューマとの間で更新差分があるエントリの情報を、コンシューマに対して送信します。コンシューマは、プロバイダから送信されたエントリ情報を受け取り、自身のデータに反映します。後は、この処理を定期的に繰り返すことで、データの同期を行います。

ldap-replication1.jpg
refreshOnlyモードでの処理の流れ

 refreshAndPersistモードでは、最初にコンシューマがrefreshOnlyモードと同様の方法で自身のデータとプロバイダのデータを同期させます。データの同期が完了した後、プロバイダは更新要求を受け付けるごとに、更新したエントリの情報をコンシューマに送信します。
 そして、コンシューマは受け取ったエントリ情報を自身のデータに反映します。以上のことから、refreshAndPersistモードのレプリケーションは同期的なタイミングのレプリケーションであるといえます。

ldap-replication2.jpg
refreshAndPersistモードでの処理の流れ

 LDAP Syncレプリケーションは、現在OpenLDAPの標準として開発が進められているレプリケーション方式です。LDAP SyncレプリケーションにはrefreshOnlyとrefreshAndPersistの2つのモードがありますが、今回はrefreshAndPersistモードの設定を行います。
 プロバイダ、コンシューマの「slapd.conf」に、前項で解説したBDBバックエンドの設定を行います。ここではindexにentryCSN、entryUUIDを設定しています。LDAP Syncレプリケーションでは内部処理として、entryCSNおよびentryUUIDの検索を頻繁に行うため、インデックスを作成することで、レプリケーションの性能向上をはかっています。
さらに、プロバイダ、コンシューマのslapd.confに次の設定をそれぞれ追加します。
プロバイダ
index objectclass,entryCSN,entryUUID eq
        overlay syncprov
        syncprov-checkpoint 100 10
        syncprov-sessionlog 100
(以下のような記載方法もありました)
index entryCSN,entryUUID eq
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100
コンシューマ
index objectclass,entryCSN,entryUUID eq
syncrepl rid=123
    provider=ldap://provider.bigbang.dyndns.org:389
    type=refreshOnly
    interval=01:00:00:00
    searchbase="dc=bigbang,dc=dyndns,dc=org"
    filter="(objectClass=organizationalPerson)"
    scope=sub
    attrs="cn,sn,ou,telephoneNumber,title,l"
    schemachecking=off
    bindmethod=simple
    binddn="cn=Manager,dc=bigbang,dc=dyndns,dc=org"
    credentials=secret
(以下のような記載方法もありました)
syncrepl rid=123
    provider=ldap://<コンシューマのホスト名>
    type=refreshAndPersist
    retry=”5 10 60 +”
    searchbase="dc=bigbang,dc=dyndns,dc=org"
    bindmethod=simple
    binddn="cn=Manager,dc=bigbang,dc=dyndns,dc=org"
    credentials=secret
 上記の例で、コンシューマはプロバイダslapd ldap://provider.bigbang.dyndns.orgにポート389で接続し、1日に1度pollingモード(refreshOnly)の同期を行います。バインドは簡易認証で行い、その際のDNはcn=Manager,dc=bigbang,dc=dyndns,dc=orgでパスワードは"secret"です。cn=Manager,dc=bigbang,dc=dyndns,dc=orgのアクセス権は、複製対象を期待するどおりに取得するために、プロバイダに適切な設定にしておかなければなりません。また、プロバイダに対する検索に関する制限は、要求した内容を完全に取り込めるよう十分に大きくしておく必要があります。コンシューマは自分のデータベースへの書込みにrootdnを使うので、あやゆる書込みに対して全権限を持ちます。
 上記の例での同期検索は、dc=bigbang,dc=dyndns,dc=orgをベースとしたサブツリー全体に対し、objectClassがorganizationalPersonであるエントリを検索します。取得する属性はcn、sn、ou、telephoneNumber、title、lです。スキーマ検査は無効にしてあるので、コンシューマslapd(8)はプロバイダslapd(8)から得た更新情報の処理時にエントリのスキーマ検査を行いません。コンシューマでは、syncprovオーバーレイを有効にしています。オーバーレイとは、OpenLDAPの機能拡張モジュールのことで、syncprovはLDAP Syncレプリケーションにおけるコンシューマの機能を追加します。
 コンシューマでは、searchbaseにsuffixで指定した「dc=bigbang,dc=dyndns,dc=org」を設定しています。レプリケーションの対象は、searchbaseで設定したDN(Distinguished Name)配下のエントリになるので、「dc=bigbang,dc=dyndns,dc=org」を設定することで、LDAPサーバの全エントリをレプリケーションするようにしています。

 syncrepl
        syncrepl rid=<replica ID>
                provider=ldap[s]://<hostname>[:port]
                [type=refreshOnly|refreshAndPersist]
                [interval=dd:hh:mm:ss]
                [retry=[<retry interval> <# of retries>]+]
                [searchbase=<base DN>]
                [filter=<filter str>]
                [scope=sub|one|base]
                [attrs=<attr list>]
                [attrsonly]
                [sizelimit=<limit>]
                [timelimit=<limit>]
                [schemachecking=on|off]
                [bindmethod=simple|sasl]
                [binddn=<DN>]
                [saslmech=<mech>]
                [authcid=<identity>]
                [authzid=<identity>]
                [credentials=<passwd>]
                [realm=<realm>]
                [secprops=<properties>]

ディレクティブ デフォルト値 説明
overlay - 指定したオーバーレイを有効にします。
syncrepl - 現在のデータベースをマスタの複製であることを指定します。つまり、syncrepl複製エンジンを動かして複製コンシューマとなります。マスタデータベースはproviderパラメータに指定した複製プロバイダにあることになります。
rid - ridは複製コンシューマサーバの設定の中のsyncreplディレクティブの識別子として利用されます。 <replica ID>は現在のsyncreplディレクティブによって記述される指定が一意に識別されるようにします。<replica ID>には0以上で3桁以内の整数値を指定してください。
provider - プロバイダのサイトのスキーム、ホスト、ポート(オプション)を指定します。ホスト指定<hostname>はドメイン名でもIPアドレスでもかまいません。たとえばldap://provider.bigbang.dyndns.org:389やldaps://192.168.1.1:636 のように指定します。ポート指定を省略した場合には標準LDAPポート番号(389または636)が使われます。syncreplはコンシューマ主動のプロトコルを使うので、その指定はコンシューマサイトにあるという点で、プロバイダサイトに指定のあるreplicaとは異なっています。
type - レプリケーションのモードとして、refreshOnlyまたはrefreshAndPersistを指定します。
interval - refreshOnly操作では定期的に同期検索操作を行います。それぞれの同期検索操作が終わった後に、次の同期検索操作を再スケジューリングします。この時間隔はintervalパラメータに指定します。時間隔のデフォルトは1日に設定されています。refreshAndPersist操作では、同期検索がプロバイダで継続されます。プロバイダに更新があると、継続している同期検索のレスポンスとしてコンシューマにsearchResultEntryを返します。
retry - 複製中にエラーが起きると、コンシューマは再トライパラーメータにしたがって再接続を試みます。再トライパラメータは <retry interval>と<# of retries>のペアのリストです。たとえばretry="60 10 300 3"という指定は、最初の10回の再トライが60秒おきに、続く3回が300秒ごとであることを意味します。<# of retries>に+を指定すると、成功するまで限りなく再トライすることを意味します。
searchbase - syncreplの複製対象は、検索指定を使って定義します。コンシューマは検索指定にしたがってプロバイダに検索要求を送ります。検索指定は、通常の検索指定と同様にsearchbase、scope、filter、attrs、attrsonly、sizelimit、timelimitパラメータを持ちます。syncreplの検索指定はldapsearchクライアント検索ツールのパラメータと同じ値の形式と同じデフォルト値を持ちます。
schemachecking - schemacheckingパラメータの切替えにより、LDAP Syncコンシューマサイトでスキーマ検査を行うかを指定できます。このパラメータをonにすると、複製に格納されるエントリすべてのスキーマがチェックされます。複製に格納するエントリはどれも、スキーマ定義の要求する属性を持っているべきです。このパラメータをoffにすると、エントリがスキーマの適合性の検査なしに格納されます。デフォルトはoffです。
bindmethod
saslmech
authcid
authzid
credentials
- bindmethodには、プロバイダに接続する際の認証方式を指定します。パスワードベースの簡易認証を利用するなら simple、SASL認証を利用するならsaslを指定します。簡易認証は、十分なデータの完全性と機密性の保護(TLSやIPSECなど)が無ければ使うべきではありません。簡易認証はbinddnとcredentialsパラメータの指定を必要とします。一般にはSASL認証を推奨します。SASL認証を行うにはsaslmechパラメータに機構の指定が必要です。指定する機構に依存して、認証IDや認証情報をauthcidやcredentialsに指定できます。パラメータ authzidは認可IDを指定するのに使います。
binddn - binddnパラメータには、プロバイダに対して syncrepl検索を行う際のbindに使うDNを指定します。このDNはマスタデータベースの複製対象に対してreadアクセス権を持っているべきです。


●DB_CONFIG

データベースのパラメータファイルをコピーします。
# cp /usr/share/doc/openldap-servers-2.4.19/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
 パラメータは以下のようなものがあります。
# set_cachesize <GigaBytes> <Bytes> <ncache>
#	物理メモリ上にキャッシュするサイズを指定します。
#	<GigaBytes>GB + <Bytes> のメモリを確保します。
#	<ncache> が 0または1の場合は、連続したメモリ領域を確保します。
#	<ncache> が 1より大きい場合は、<ncache>の数だけ分割して確保します。
#	デフォルトは 0 262144 0 のため、指定がない場合に応答が遅くなる可能性があります。
#	推奨値は4MB以上。最大は4GBまでです。実際には物理メモリの25~50%を確保するようです。
#	64bit版に関しては不明です。
set_cachesize 0 268435456 1
# set_lg_regionmax <Bytes>
#	データベースファイル名を物理メモリにキャッシュする最大サイズを指定します。
#	ファイル数(テーブル、インデックス)の増加にあわせて値を増やすほうが良いでしょう。
#	デフォルトは約60KB
#	推奨値は set_cachesize の 1/1024 です。
set_lg_regionmax 262144
# set_lg_bsize <Bytes>
#	トランザクションログへの書き込みバッファサイズを指定します。
set_lg_bsize 2097152
# set_flags
#	フラグを指定します。
#	DB_LOG_AUTOREMOVE 不要になったトランザクションログを自動的に削除します
#	DB_TXN_NOSYNC ディスクに直ちに書き込まないことでパフォーマンスを上げます
set_flags DB_LOG_AUTOREMOVE

●ログレベルの選択

 必要なログのみを出力するようにログレベルをカスタマイズする方法を説明します。OpenLDAPサーバのログは、次の一覧に示す値を用いて、1つまたは複数のログ出力内容を選択できます。

ログレベル(10進数) ログレベル(16進数) ログレベル(文字列) ログ出力内容
-1 - any すべてのログを出力
0 - - まったくログを出力しない
1 0x1 trace 内部の関数呼び出し
2 0x2 packets パケット操作
4 0x4 args 処理の詳細なトレース
8 0x8 conns コネクション管理
16 0x10 BER パケット送受信
32 0x20 filter 検索フィルタ処理
64 0x40 config 設定ファイルの処理
128 0x80 ACL アクセス制御リストの処理
256 0x100 stats ステータスログ(デフォルト)
512 0x200 stats2 ステータスログ2
1024 0x400 shell シェルバックエンドとの通信
2048 0x800 parse エントリの解析
16384 0x4000 sync syncrepl コンシューマ処理
32768 0x8000 none 設定に依存しない最低限の出力のみ


 デフォルトでは10進数で"256"、または文字列で"stats"に当たるログがsyslogに送付されています。デフォルト設定では、基本的なOpenLDAPサーバの管理に有効な
  • クライアントからどのような接続要求があり、それは成功/またはなぜ失敗したか
  • どのようなLDAPの操作が行われ、それは成功/またはなぜ失敗したか
といった情報が記録されます。
 実運用時のログレベルの選択は、例えばデフォルトのログレベルなど、必要最低限の内容に絞っておくとよいでしょう。これは、ログの出力が、性能劣化やディスク領域の圧迫につながるからです。さらに、出力量が多くなる詳細なログを取得している場合は、多くの情報に埋もれ、かえって問題の概要がつかみにくくなってしまうという理由もあります。
 もちろん、すでに問題が発生している状況では、より詳細なログを取得し調査する必要があります。


●ログレベルの変更

 これまで使用されていたsldap.confは利用されなくなりました。これに代わり、olc*****のようなものを使用し設定することになっています。
 ログレベルの変更は下記のように実施します。
# vi olcLogChange.ldif
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: filter config ACL stats sync
ldapmodify -x -D cn=config -W -f ldapWork/olcLogChange.ldif
Enter LDAP Password: 
modifying entry "cn=config"
 これにより、設定したレベルのログが出力されるようになります。
 ただし、statsを有効にするとログサイズが1日で数Gbyteになってしまうこともありますので注意が必要です。

 ログレベルの指定は、次のように、slapd.confのグローバルセクションにloglevelディレクティブを用いて行うことができます。
# vi /etc/openldap/slapd.conf
                        ↓ 以下のどれか1行を設定
loglevel 129 ← 10進数の128と、1を組み合わせて指定した例
loglevel 0x81 ← 上記の設定を、16進数で指定した例
loglevel trace,ACL ← 上記の設定を、文字列で指定した例
 slapd.confファイルへの変更後は、OpenLDAPサーバを再起動する必要があります。
# service slapd restart
 再起動後は、LDAPクライアントからの接続を行いながら、syslog.confファイルに指定した出力先に、指定した内容のログが記録されることを確認しておきましょう。
# tail -f /var/log/slapd.log

●ログの削除

 次は、ログの削除について説明します。このログ削除を怠って運用を続けていると、肥大化したログがディスク領域を圧迫しかねないので注意が必要です。
 最も簡単なOpenLDAPサーバのログ削除は、ログローテートを利用する方法です。
# vi /etc/logrotate.d/syslog
/var/log/slapd.log /var/log/messages [...略...] { ← ログファイルslapd.logを追加
    sharedscripts
    postrotate
        /bin/kill -HUP [...略...]
        /bin/kill -HUP [...略...]
    endscript
}
 例えば、上記の例のように、/etc/logrotate.d/syslogファイルにローテーション対象としてOpenDLAPサーバのログファイル(ここでは、/var/log/slapd.log)を追加することで、CentOSでは、「毎週日曜日の朝4時前後に現行のファイルがローテーションされ、過去4世代分のファイルを保持し、それより古い世代のファイルは削除される」ようになります。
# date
2011年 9月 25日 月曜日 09:46:15 JST ← いまの時刻
# ls -l /var/log/ldap.log*         ↓ ローテートされたログファイル
-rw------- 1 root root  3308 9月 25 09:41 /var/log/slapd.log
-rw------- 1 root root 17002 9月 18 04:02 /var/log/slapd.log.1
-rw------- 1 root root 27434 9月 11 04:02 /var/log/slapd.log.2
-rw------- 1 root root 45150 9月  4 04:02 /var/log/slapd.log.3

●Berkeley DBのトランザクションログファイル

 実際のOpenLDAPサーバの運用においては、OpenLDAPサーバが出力するログのほか、エントリ情報を蓄積するバックエンドデータベースのログファイルについても考慮しておく必要があります。ここでは、OpenLDAPサーバがデフォルトで採用するバックエンドデータベースBerkeley DBを対象にして、ログファイルの管理方法を説明します。
 次の表は、OpenLDAPサーバのデータディレクトリに作成されるファイル一覧です。

ファイル名 役割
DB_CONFIG Berkeley DBの設定ファイル。Berkeley DBのホームディレクトリ(OpenLDAPの「datadir」以下)に配置する
__db.[00X] Berkeley DBのプロセス、スレッドが共有利用するメモリ領域(shared memory regions)を記録するファイル
alock OpenLDAPがBerkeley DBの重複利用や正常停止を管理するために利用するアクセスロック(Access LOCK)ファイル
log.[000000000X] Berkeley DBのトランザクションログファイル。データの更新量に依存して増加。デフォルトのサイズは10Mbytes
[インデックス指定属性名].bdb OpenLDAPのインデックス情報を蓄積するデータファイル。インデックスを指定した属性ごとに作成される


 上記一覧中の、ファイル名が「log.」で始まり連番が付与されるファイルが、管理対象となるBerkeley DBのトランザクションログファイルです。

●トランザクションログファイルの削除

 Berkeley DBのトランザクションログファイルの削除方法は、大きく分けて、
  • 管理者が手動で行う方法
  • Berkeley DBが自動で行う方法
の2つがあります。
 管理者が手動で削除を行う方法では、db_archive -dコマンドを利用します。
# cd /usr/local/openldap-2.4.19/var/openldap-data ← ソースからインストールした場合
# PATH=$PATH:/usr/local/BerkeleyDB.4.7/bin ソースからインストールした場合
# db_checkpoint -h . -1 ← チェックポイントの明示的な実行
# db_archive -h . -d ← 不要なログファイルの削除
 トランザクションログファイルは、次の3つの条件を満たしている場合に削除が可能となります。ここで説明したdb_archive -dコマンドは、これら3つの条件を満たすファイルを選択したうえで削除できるコマンドです。
  1. 実行中のトランザクションに関連していない
  2. 新しいトランザクションログファイルが作成され、チェックポイントが実行されている
  3. Berkeley DBの実行環境で、唯一のトランザクションログファイルでない
 上記の例では、チェックポイントを明示的に実行し、更新内容をデータファイルへも書き出すことで、更新内容が、先行で書き込まれているトランザクションログファイルにのみ存在する状況をなくし、削除可能なトランザクションログファイルを増やしています。
 定期的にトランザクションログファイルをバックアップディレクトリに退避するような運用を行っている場合は、退避する前に削除してしまわないよう、db_archive -dコマンドを実行するタイミングに注意が必要です。
 一方のBerkeley DBに自動で削除を行わせる方法では、Berkeley DBの設定ファイルであるDB_CONFIGファイルに"DB_LOG_AUTOREMOVE"フラグを指定します。
# cd /usr/local/openldap-2.4.19 ← ソースからインストールした場合
# vi var/openldap-data/DB_CONFIG ← ソースからインストールした場合
# vi /var/lib/ldap/DB_CONFIG ← yumでのインストール時
set_flags DB_LOG_AUTOREMOVE ← 不要なログの自動削除を指定
# kill -INT `cat var/run/slapd.pid` ← ソースからインストールした場合
# ./libexec/slapd -u ldap ← ソースからインストールした場合
# service slapd restart ← yumでのインストール時
 この方法では、Berkeley DBへ更新が発生し、トランザクションログファイルへの書き込みが行われた時点で、削除可能なファイルがあるかどうかの判断が行われます。この方法は、定期的にトランザクションログファイルを退避させる運用には向かないことに注意してください

●OpenLDAPサーバのアクセスログ

 アクセスログとは、OpenLDAPサーバにモジュールを追加することで利用可能となる機能であり、アクセス状況を把握する目的で利用されます。このアクセスログは、指定するバックエンドデータベースに対して行われたbind(認証)、add(追加)、modify(変更)といった指定する操作を、ファイルではなく別のバックエンドデータベースへ記録することができます。また、記録したログはldapsearchにて条件を絞り込んで参照できます。
 CentOSにバンドルされるOpenLDAPサーバ(openldap-serversパッケージ)には、アクセスログモジュールが含まれていません。CentOS 5.3以降、アクセスログなどのオーバレイ機能は、openldap-servers-overlaysパッケージとして、別途、提供されています。
 また、アクセスログは、OpenLDAPサーバのコンパイル時にも、デフォルトでは含まれないオプションです。この機能を利用するには、コンパイルの過程で"--enable-accesslog=yes"または"--enable-overlays=yes"など、明示的にオプションを追加する必要があります()。
$ CPPFLAGS=-I/usr/local/BerkeleyDB.4.7/include \
> LDFLAGS=-L/usr/local/BerkeleyDB.4.7/lib \
> ./configure --prefix=/usr/local/openldap-2.4.19 --enable-accesslog=yes
:"enable-accesslog"はアクセスログモジュールのみ、"enable-overlays"はすべての追加モジュールを含めてコンパイルすることを指定するオプションです。
●アクセスログの出力

 ここでは、OpenLDAPサーバ側の設定を行う前に、アクセスログを記録するバックエンドデータベースを配置するディレクトリを"var/openldap-accesslog"として準備します。
# cd /usr/local/openldap-2.4.19
# mkdir var/openldap-accesslog
# cp etc/openldap/DB_CONFIG.example var/openldap-accesslog/
# chown -R ldap.ldap var/openldap-accesslog
# chmod 700 var/openldap-accesslog
 次の例では、OpenLDAPサーバの設定ファイルslapd.confに、アクセスログの調査対象とするバックエンドデータベースをsuffix"dc=bigbang,dc=dyndns,dc=org"、またアクセスログを蓄積するバックエンドデータベースをsuffix"cn=accesslog"としてディレクティブを設定しています。
# cd /usr/local/openldap-2.4.19
# vi etc/openldap/slapd.conf
...[略]...
# 監査対象のバックエンドデータベース
database        bdb
suffix          "dc=bigbang,dc=dyndns,dc=org"
rootdn          "cn=Manager,dc=bigbang,dc=dyndns,dc=org"
rootpw          secret
directory       /usr/local/openldap-2.4.19/var/openldap-data
index   objectClass     eq
...[略]...       ↓ 監査対象のDB "dc=bigbang,dc=dyndns,dc=org"への設定
overlay accesslog ← アクセスログモジュールを利用
logdb cn=accesslog ← アクセスログ用のデータベースを指定
logops bind ← 記録対象のLDAPの操作を指定
logpurge 7+00:00 1+00:00 ← 毎日チェックし、7日以前の記録は削除
logsuccess TRUE ← 記録対象であっても失敗した操作は記録しない
# アクセスログ用のデータベースの設定
database        bdb
suffix          "cn=accesslog"
directory       /usr/local/openldap-2.4.19/var/openldap-accesslog
index   objectClass,reqStart,reqDN    eq ← 検索対象の属性 
access to *
    by dn.base="cn=Manager,dc=bigbang,dc=dyndns,dc=org" read ← 管理者のみ参照可
注2:アクセスログで利用するスキーマ情報は、アクセスログモジュール内(overlays/accesslog.c)に実装されています。このため、設定ファイル内で、明示的にスキーマファイルを読み込む必要はありません。また、ここでのobjectClassはフィルタなしでの検索に備えるため、reqStartはlogpurge機能が利用するため、reqDNは後述の検索例でフィルタ条件に利用しているため、等価インデックス(eq)を指定しています。
 上記の設定例では、「あるエントリのユーザが、直近の1週間で、このOpenLDAPサーバを認証に利用できているか」を確認するアクセスログを取得することを目的としています。このような設定は、例えば、不要なエントリをクリーンアップする際に、現在もシステムを利用しているのか、それとも長くシステムを利用しておらず削除候補となるユーザのエントリであるのかの判定に応用することができます。
 設定変更後は、OpenLDAPサーバを再起動してアクセスログへの記録を開始します。
# cd /usr/local/openldap-2.4.19
# kill -INT `cat var/run/slapd.pid`
# ./sbin/slapindex -b cn=accesslog ← すでにアクセスログが記録された状態で
# chown -R ldap.ldap var/openldap-accesslog ← indexを変更した場合に実行が必要
# ./libexec/slapd -u ldap 
:アクセスログで利用するスキーマ情報は、アクセスログモジュール内(overlays/accesslog.c)に実装されています。このため、設定ファイル内で、明示的にスキーマファイルを読み込む必要はありません。また、ここでのobjectClassはフィルタなしでの検索に備えるため、reqStartはlogpurge機能が利用するため、reqDNは後述の検索例でフィルタ条件に利用しているため、等価インデックス(eq)を指定しています。
●アクセスログの確認

 次のコマンド例では、ここまでに説明したアクセスログ設定を行い、アクセスログが蓄積された後、特定エントリ(uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org)の認証が成功した記録を確認するため、reqDN属性を条件に検索を行っています。
# cd /usr/local/openldap-2.4.19
# ./bin/ldapsearch -x -b cn=accesslog -D cn=Manager,dc=bigbang,dc=dyndns,dc=org -W
    \ > reqDN=uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org -LLL
Enter LDAP Password: ← 管理者ユーザのパスワードを入力(ここでは"secret")

●アクセスログに設定可能なディレクティブ一覧

 アクセスログモジュールでは、次のディレクティブが利用可能です。

ディレクティブ 説明
logdb アクセスログを蓄積するバックエンドデータベースのsuffixを指定
例)logdb cn=accesslog
logops 記録対象とする操作(add、delete、modify、modrdn、compare、search、bind、unbind、abandon)を指定。次のエイリアス利用も可能。
writes:add、delete、modify、modrdnを含む
reads:compare、searchを含む
session:bind、unbind、abandonを含む
all:すべての操作を含む
例)logops bind writes
logold 削除(delete)、変更(modify)処理にて、変更前のエントリ情報を記録する対象エントリを特定するために、マッチさせるフィルタを指定
例)logold uid=test*
logoldattr 変更処理(modifyおよびmodrdn)にて、変更前の値も記録対象とする属性を指定
例)logoldattr cn uid uidNumber
logpurge ログを保持する期間および削除可能かどうかの確認を行う間隔を指定。時間の指定に利用するフォーマットは[ddd+]hh:mm[:ss]。日数、秒は省略可能
例)logpurge 7+00:00 1+00:00
logsuccess TRUEを設定した場合は、成功した操作のみを記録。デフォルトはFALSEであり、成功、失敗に関わらずlogopsで指定された操作を記録
例)logsuccess TRUE


●バックアップ

 データのバックアップにはオンラインバックアップが可能なslapcatコマンド(データをLDIFファイル形式で出力)を利用します。
 全データをバックアップする場合は以下のようになります。
# slapcat -l backup.ldif
 特定のサブディレクトリ配下をバックアップする場合は-sオプションを利用します。Users配下のバックアップを取る場合は以下のように指定します。
# slapcat -s "ou=Users,dc=oss-d,dc=net" -l backup.ldif

●phpLDAPadminのインストール

 まず、次のコマンドを実行してみます。
# yum install phpldapadmin
 しかし、パッケージが見つからないと表示されるかもしれません。その場合、EPEL(Extra Packages for Enterprise Linux)を利用します。EPELでは様々なFedoraのパッケージが、互換ディストリビューションで利用することを目的に管理されています。
# ls /etc/yum.repos.d/
CentOS-Base.repo       CentOS-Media.repo  CentOS-fasttrack.repo
CentOS-Debuginfo.repo  CentOS-Vault.repo
 
# yum install -y epel-release
 
# ls /etc/yum.repos.d/
CentOS-Base.repo       CentOS-Media.repo  CentOS-fasttrack.repo  epel.repo
CentOS-Debuginfo.repo  CentOS-Vault.repo  epel-testing.repo
 これでphpLDAPadminのパッケージを取得できるようになりました。ただし、EPELのドキュメントには、リポジトリを混在させると問題が出やすいとされていますので注意してください。
 そこで、この問題を避けるために、yum-plugin-prioritiesを導入します。
# yum install -y yum-plugin-priorities
 priorities.confにenabled=1の記述があることを確認しておきます。
# cat /etc/yum/pluginconf.d/priorities.conf
 
[main]
enabled = 1
 あとは、各リポジトリ用の設定ファイルにpriority=Nの形式で優先度を指定します。Nは1〜99の整数です。数字が小さいほど優先度が高くなります。たとえば、次のように記述します。
# vi /etc/yum.repos.d/CentOS-Base.repo
	
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever& \
                                arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
priority=1
 
#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever& \
                           arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
priority=1
 baseリポジトリやupdateリポジトリには1を、サードパーティのリポジトリには10より大きな値を設定することが推奨されています。この設定をすると、指定したパッケージがbaseリポジトリにない時にだけ、EPELへ探しにいってくれます。

 phpLDAPadminの設定ファイルを編集します。
#vi /etc/phpldapadmin/config.php
//(略)
$servers->setValue('login','attr','dn'); ← コメントアウトを外す
// $servers->setValue('login','attr','uid'); ← コメントアウトする
//(略)
 LDAPサーバが動作するWebサーバで、設定ファイルを必要に応じて編集します。(下記はApache 2.2です。)
# /etc/httpd/conf.d/phpldapadmin.conf
	
Alias /phpldapadmin /usr/share/phpldapadmin/htdocs
Alias /ldapadmin /usr/share/phpldapadmin/htdocs
 
<Directory /usr/share/phpldapadmin/htdocs>
  Order Deny,Allow
  Deny from all
  Allow from 127.0.0.1 <パブリックIPアドレス>
  Allow from ::1
</Directory>
 phpLDAPadminへのアクセスをhttps限定にさせるためhttpでアクセスしてきた場合、リダイレクトするようにhttpd.confを変更します。
# vi /etc/httpd/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so ← コメントアウトする
<ifModule mod_rewrite.c>
      RewriteEngine On
      # LogLevel alert rewrite:trace3
      RewriteCond %{HTTPS} off
      # RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
      RewriteRule ^/ldapadmin/(.*)?$ https://%{HTTP_HOST}/ldapadmin/$1 [R,L]
      RewriteRule ^/phpldapadmin/(.*)?$ https://%{HTTP_HOST}/phpldapadmin/$1 [R,L]
</ifModule>
・RewriteEngine On
 rewriteを有効にする。

・RewriteLog "logs/rewrite_log"(参考)
 rewrite動作のログファイル指定。Windowsなら"logs/rewrite.log"の方が扱いやすい。

・RewriteLogLevel 0(参考)
 rewriteのログレベル指定。「1」にするだけで膨大なログが出るので、デバッグが終わったら「0」にしないと大変なことになる

・RewriteCond %{SERVER_PORT} !^443$
 サーバ(apache)へのアクセスポートが443番では無かったら(即ち、httpsでのアクセスではなかったら)、以下のルールを適用するという意味。

・RewriteRule
 必要な分を1行づつ記述していくが、基本は正規表現でマッチングをとり、一致したらHTTPSにrewriteさせる

●Postfixとの連携

 LDAPを利用するので、以下の項目に関して事前に決めておきます。

管理する仮想ドメイン bigbang.dyndns.org
メール管理アカウント(for postfix) mail (UID: 8)
メール保存ディレクトリ /var/spool/mail/ or Maildir/
LDAP Data構造 自ドメインでの構造による
LDAP suffix dc=bigbang,dc=dyndns,dc=org
LDAP bind DN cn=Manager,dc=bigbang,dc=dyndns,dc=org
LDAP bind passwd ********

 OpenLDAPの設定を行います。LDAP標準のschemaではpostfixを使う際に色々不足しているので、新たにschemaを作成します。
 ページに提示しているmail.schemaの場合、既存のLDAPツリーにぶら下がっている各スタッフのエントリーにmailUserやmailGroup objectClassを追加することができませんので、これらを追加できるようにする変更を行います。また、attributeにて定義してあったhomeDirectoryは既に別の用途に利用しているため、これをメール配信用のディレクトリにするのもよくありません。したがって、新たにmailDirectoryというattributeを追加することにしました。そのため、メールボックスはこの属性で指定することになります。
# vi /etc/openldap/schema/mail.schema
attributetype (1.1.2.1.1.1 NAME 'mailForward'
    DESC 'forward address'
    EQUALITY caseExactIA5Match
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26)
attributetype (1.1.2.1.1.2 NAME 'mailAlias'
    DESC 'alias address'
    EQUALITY caseExactIA5Match
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26)
attributetype (1.1.2.1.1.3 NAME 'accountActive'
    DESC 'active or not active'
    EQUALITY booleanMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE)
attributetype (1.1.2.1.1.4 NAME 'domainName'
    DESC 'domain name'
    EQUALITY caseIgnoreIA5Match
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE)
attributetype (1.1.2.1.1.5 NAME 'transport'
    DESC 'transport'
    EQUALITY caseIgnoreIA5Match
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26)
attributetype (1.1.2.1.1.6 NAME 'mailQuota'
    DESC 'Mail Home Directory Max byte'
    EQUALITY integerMatch    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE)
attributetype (1.1.2.1.1.7 NAME 'mailDrop'
    DESC 'drop address'
    EQUALITY caseExactIA5Match
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26)
attributetype ( 1.3.6.1.4.1.15774.1.10.1.2.3 NAME 'mailDirectory'
    DESC 'mail directory'
    EQUALITY caseIgnoreIA5Match
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} SINGLE-VALUE )
objectClass (1.1.2.2.1.1 NAME 'mailUser'
    DESC 'mail user Object'
    SUP top AUXILIARY
    MUST ( transport $ mailDirectory \
                $ accountActive $ domainName $ userPassword $ mailQuota )
    MAY  ( mailForward $ mailAlias ))
objectClass (1.1.2.2.1.2 NAME 'mailGroup'
    DESC 'ML Group Account Object'
    SUP top AUXILIARY
    MUST ( accountActive $ domainName $ mailDrop ))

●root によるパスワードのリセットはサポートされません。

 CentOS 7でpasswdでLDAPユーザのパスワードを変更しようとすると、「root によるパスワードのリセットはサポートされません。」と表示されパスワードの変更ができません。
 /var/log/secureに下記のようなログが記録されていました。
Apr 13 08:37:53 serverA passwd: pam_unix(passwd:chauthtok): \
    user "test5001" does not exist in /etc/passwd
Apr 13 08:37:58 serverA passwd: pam_sss(passwd:chauthtok): \
    Authentication failed for user test5001: 6 (拒否されたパーミッション)
Apr 13 08:37:58 serverA passwd: pam_sss(passwd:chauthtok): \
    User info message: root によるパスワードのリセットはサポートされません。
 対応方法は「●LDAPクライアントのセットアップ(CentOS 7)を参照してください。

●getent passwdで表示されない

 CentOS 7でgetent passwdを実行してもLDAPユーザが表示されなくなってしまいました。/etc/pam.d以下をいろいろ変更していたのが原因かもしれません。
 原因は/etc/nsswitch.confを変更したことでした。このファイルを下記のとおり修正したところ表示されるようになりました。
# vi /etc/nsswitch.conf
#passwd:     files sss
#shadow:     files sss
#group:      files sss
 ↓
passwd:     files ldap sss
shadow:     files ldap sss
group:      files ldap sss


●LDAPユーザで登録されているユーザでpasswdでパスワードが変更できない

 それぞれのサーバの環境は下記のとおりです。

1 サーバ情報

 サーバ#1:nezumi、192.168.0.4
 サーバ#2:centos6、192.168.0.12

2 共通点
$ uname -r
2.6.32-573.22.1.el6.i686
$ rpm -qa | grep openldap-servers
openldap-servers-2.4.40-7.el6_7.i686
$ rpm -qa | grep openldap-clients
openldap-clients-2.4.40-7.el6_7.i686
$ rpm -qa | grep nss-pam-ldap
nss-pam-ldapd-0.7.5-20.el6_6.3.i686
$ rpm -qa | grep sssd
sssd-common-1.12.4-47.el6_7.8.i686
sssd-ldap-1.12.4-47.el6_7.8.i686
sssd-1.12.4-47.el6_7.8.i686
sssd-client-1.12.4-47.el6_7.8.i686
$ authconfig --test | grep ldap
パスワード:
nss_ldap is enabled
 LDAP server = "ldap://192.168.0.12/,ldap://192.168.0.4/"
pam_ldap is enabled
 LDAP server = "ldap://192.168.0.12/,ldap://192.168.0.4/"
 LDAPユーザにスイッチすることは可能。
OSがCentOS 6の場合
[user@nezumi ~]$ su - sato
パスワード:
[sato@nezumi ~]$
OSがCentOS 6の場合
[user@centos6 ~]$ su - sato
パスワード:
[sato@centos6 ~]$
OSがCentOS 7の場合
[user@n-server ~]$ su - sato
パスワード: 
su: 認証失敗

3 異なる点

 sssdはcentos6のみで動作。サーバnezumiでのpasswdよるLDAPパスワード変更は可能ですが、サーバcentos6では変更できません。
[sato@nezumi ~]$ passwd
ユーザー sato のパスワードを変更。
Enter login(LDAP) password: 
新しいパスワード:
新しいパスワードを再入力してください:
LDAP password information changed for sato
passwd: 全ての認証トークンが正しく更新できました。
[sato@centos6 ~]$ passwd
ユーザー sato のパスワードを変更。
現在のパスワード: (パスワードの入力)
パスワードの変更に失敗しました。 サーバーのメッセージ: Old password not accepted.
Kerberos 5 Password: (上記と同じパスワードの入力)
Enter login(LDAP) password: (上記と同じパスワードの入力)
新しいパスワード:
新しいパスワードを再入力してください:
パスワードの変更に失敗しました。 サーバーのメッセージ: Old password not accepted.
passwd: 認証トークン操作エラー
 下記のとおり、/etc/pam.d/passwdを変更したところサーバcentos6でも変更できるようになりました。
[root@centos6 ~]# vi /etc/pam.d/passwd
#%PAM-1.0
password   sufficient   pam_ldap.so
auth       include      system-auth
account    include      system-auth
password   substack     system-auth
-password   optional    pam_gnome_keyring.so
[root@centos6 ~]# exit
logout
[user@centos6 ~]$ su - sato
パスワード:
[sato@centos6 ~]$ passwd
ユーザー sato のパスワードを変更。
Enter login(LDAP) password: 
New password: 
Re-enter new password: 
LDAP password information changed for sato
passwd: 全ての認証トークンが正しく更新できました。
 CentOS 7でsuできなかったときの
Apr 28 13:03:36 n-server su: pam_sss(su-l:auth): authentication failure; \
        logname=user uid=1000 euid=0 tty=pts/4 ruser=user rhost= user=sato
Apr 28 13:03:36 n-server su: pam_sss(su-l:auth): \
        received for user sato: 6 (拒否されたパーミッション)


●Suppressed ???? messages from /system.slice/slapd.serviceが/var/log/messagesに記録される

 参考URL:syslogの溢れ対策

 5分毎に/var/log/messagesに「Suppressed 5768 messages from /system.slice/slapd.service」が記録されていることに気がつきました。
 5758件のメッセージが溢れたことを意味しています。
 この溢れを対処するため、journald.conf及びrsyslog.confを編集します。
# vi /etc/systemd/journald.conf
# 下記のように編集
RateLimitInterval=10s
RateLimitBurst=20000
# vi /etc/rsyslog.conf
# 末尾に追加する
$imjournalRatelimitInterval 10
$imjournalRatelimitBurst 20000
# systemctl restart systemd-journald
# systemctl restart rsyslog


●「bdb_equality_candidates: (uid) not indexed」が/var/log/slapd.logに頻繁に記録される

 参考URL:OpenLDAP - 「bdb_equality_candidates」エラーの対応方法

 「bdb_equality_candidates: (uid) not indexed」が/var/log/slapd.logに頻繁に記録されることに気がつきました。
 下記のように対処することにより、記録されなくなりました。
# ldapvi -Y EXTERNAL -h ldapi:/// -b cn=config
# olcDbIndexが記載されている行を探します。見つかったらその下に下記行を追記します。
olcDbIndex: uid eq
olcDbIndex: member eq
olcDbIndex: uniqueMember eq
olcDbIndex: memberUid eq
# 変更が完了したら「:wq」と入力、Enterを押下します。
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
     13 entries read                                                                                
add: 0, rename: 0, modify: 1, delete: 0
Action? [yYqQvVebB*rsf+?] y (「y」と入力し、編集を反映させる)
Done.
 LDAPを再起動する必要はありません。
 この作業後、ログサイズが非常に小さくなりました。