OpenLDAP

2008/3/21更新

対応バージョン: 2.4.8

slappasswdで暗号化方式に「CRYPT」を指定すると以下のエラーが出る場合がある。

% slappasswd -h '{CRYPT}'
New password: *****
Re-enter new password: *****
Password generation failed for scheme {CRYPT}: scheme not recognized

これはOpenLDAPインストール時に同方式が有効になっていないのが原因なので、以下のオプションを付けてconfigureを行い、再インストールする。

--enable-crypt

関連資料・記事

2008/4/24更新

対応バージョン: 2.4.8

slappasswdの暗号化方式はデフォルトで「SSHA」が使われるが、-hオプションに続けて任意の暗号化方式を指定できる。

以下に使用可能な暗号化方式を記す。

CRYPT

crypt(3)を使用する。

MD5

MD5アルゴリズム(RFC 1321)を使用する。

SMD5

seed付きMD5。

SHA

SHA-1アルゴリズム(FIPS 160-1)使用する。

SSHA

seed付きSHA。この方式がデフォルト。

例)

% slappasswd -h '{MD5}'
New password: *****
Re-enter new password: *****
{MD5}Z2ISxhoUeeXvu7E6EBh3Tw==

関連資料・記事

2008/3/22更新

対応バージョン: 2.4.8

OpenLDAP導入時にconfigureでmonitorバックエンドを有効にしている(*)にも関わらず、slapd.confで「database monitor」の設定がない。

(*) 当バージョンのOpenLDAPではデフォルトで有効になる。

対処としては以下の方法がある。

monitorバックエンドを使用しない場合

configureで明示的に「--enable-monitor=no」と指定して再インストールする。

monitorバックエンドを使用する場合

slapd.confに「database monitor」行を追加してslapdを再起動する。

関連資料・記事

2008/3/21更新

対応バージョン: 2.4.8

同ディレクトリにDB_CONFIGファイルが存在しない。

通常インストール時には同ディレクトリにDB_CONFIG.example(DB_CONFIGの雛型)だけがインストールされるのでこれをコピーして適宜編集する。

# cd /usr/local/var/openldap-data
# cp DB_CONFIG.example DB_CONFIG
# vi DB_CONFIG
(設定内容は省略する)

2008/4/29更新

対応バージョン: 2.4.8

OpenLDAPでは目的に応じた適切な検索インデックスを作成することによって検索を高速化することができる。

ここではidコマンドでユーザ情報を検索する場合の検索インデックス作成手順を示す。

インデックス対象属性調査

まずインデックス対象となる属性を調べる。

idコマンド実行時のsyslogの結果から「filter=」を探す。

% id ldapuser999
uid=10999(ldapuser999) gid=10999 所属グループ=10999

以下のような検索クエリが発行されていることが分かる。

filter="(&(objectClass=posixAccount)(uid=ldapuser999))"
filter="(&(objectClass=posixAccount)(uidNumber=10999))"
filter="(&(objectClass=posixGroup)(gidNumber=10999))"
filter="(&(objectClass=posixGroup)(|(memberUid=ldapuser999)(uniqueMember=uid=ldapuser999,ou=people,dc=private,dc=jp)))"

対象属性インデックス化

前述の「filter=」で確認した属性をslapd.confに記述してインデックスを作成する。

# vi /usr/local/etc/openldap/slapd.conf
:
index objectClass,uid,uidNumber,gidNumber,memberUid,uniqueMember eq

# service slapd stop ← slapdをいったん停止
# slapindex ← インデックス作成
# service slapd start ← slapdを起動

インデックスファイルはslapd.confのdirectoryで指定されたディレクトリに「<属性名>.bdb」として作成される。

関連資料・記事

検索

実際に検索を行ってみるとインデックス化の効果が確認できる。

インデックスなしの場合が検索に1秒以上かかっているのに対し、インデックスを作成した場合は0.1秒もかかっていない。

インデックスなし
% time id ldapuser999
uid=10999(ldapuser999) gid=10999 所属グループ=10999

real    0m1.134s
user    0m0.003s
sys     0m0.011s
インデックスあり
% time id ldapuser999
uid=10999(ldapuser999) gid=10999 所属グループ=10999

real    0m0.067s
user    0m0.003s
sys     0m0.008s

また、nscd(name service cache daemon)が使える環境ではLDAPサーバへの問い合わせをキャッシュすることで更なる高速化が期待できる。

関連資料・記事

2008/5/16更新

対応バージョン: 2.4.8

LDIFファイルからLDAPサーバにUNIXグループ情報を登録する手順を示す。

ここでは以下のツリー内にグループ情報を作成してみる。

dc=jp
  |
  +- dc=private
       |
       +- ou=Group
            |
            +- cn=div1

またこのグループに属するユーザはfoo、barの2つとする。

用意するLDIFファイルは以下のような内容になる。

% vi sample.ldif
dn: ou=Group,dc=private,dc=jp
objectclass: organizationalUnit
ou: Group

dn: cn=div1,ou=Group,dc=private,dc=jp
objectClass: posixGroup
objectClass: top                                                
cn: div1                                                         
gidNumber: 1000
memberUid: foo
memberUid: bar

次にこのファイルの内容をLDAPサーバに登録する。

登録時にはslapdが停止させる必要がある。

% sudo service slapd stop

% sudo /usr/local/sbin/slapadd -l sample.ldif

% sudo service slapd start

LDIFファイルやslapaddに関する詳細については以下を参照のこと。

関連資料・記事

実際に格納されたかどうかldapsearchで調べてみる。

% ldapsearch -h localhost -x -b 'ou=Group,dc=private,dc=jp' 'cn=div1'
# extended LDIF
#
# LDAPv3
# base <ou=Group,dc=private,dc=jp> with scope subtree
# filter: cn=div1
# requesting: ALL
#

# div1, Group, private.jp
dn: cn=div1,ou=Group,dc=private,dc=jp
objectClass: posixGroup
objectClass: top
cn: div1
gidNumber: 1000
memberUid: foo
memberUid: bar

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

2008/3/22更新

対応バージョン: 2.4.8

LDIFファイルからLDAPサーバにUNIXユーザ情報を登録する手順を示す。

ここでは以下のツリー内にユーザ情報を作成してみる。

dc=jp
  |
  +- dc=private
       |
       +- ou=People
            |
            +- uid=ldapuser

用意するLDIFファイルは以下のような内容になる。

尚、userPasswordに設定する内容は平文でもよいが、あらかじめslappasswdコマンドで暗号化パスワードを生成しておいてもよい(暗号化方式のデフォルトはSSHA)。

どちらの場合でも登録時には暗号化されて格納される。

% /usr/local/sbin/slappasswd -s <パスワード>
{SSHA}3M9xmc89c8TRf1xXlDJ4lary4WTiHD5S

関連資料・記事

% vi sample.ldif
dn: dc=private,dc=jp
objectClass: dcObject
objectClass: organization
dc: private
o: private Organization

dn: ou=People,dc=private,dc=jp
objectclass: organizationalUnit
ou: People

dn: uid=ldapuser,ou=People,dc=private,dc=jp
objectClass: account
objectClass: posixAccount
uid: ldapuser
userPassword: {SSHA}3M9xmc89c8TRf1xXlDJ4lary4WTiHD5S
uidNumber: 1000
gidNumber: 1000
cn: ldapuser
homeDirectory: /home/ldapuser
loginShell: /bin/bash

objectClassにposixAccountを指定しているが、これはデフォルトでincludeするスキーマcore.schemaではなくnis.schemaで定義されている(nis.schemaで使用するmanager属性はさらにcosine.schemaで定義されている)のでslapd.confで上記2スキーマをincludeしておく。

このLDIFファイルをsample.ldifとして作成し、実際にLDAPサーバに登録してみる。

openldapにはLDIFフォーマットのファイルの内容をLDAPサーバに登録するためにslapaddというコマンドが用意されているのでこれを使用する。

尚、LDIFファイルに日本語が含まれていても問題ないようにファイルの文字コードはUTF-8にしておく。

登録時にはslapdが停止させる必要がある。

% sudo service slapd stop

% sudo /usr/local/sbin/slapadd -l sample.ldif

% sudo service slapd start

-fでslapdと同様に設定ファイルを指定することができるが、slapdと同じくデフォルトが/usr/local/etc/openldap/slapd.confなので、ここでは-fオプションは使わない。

これで/usr/local/var/openldap-dataディレクトリに上記の登録情報が格納される。

実際に格納されたかどうかldapsearchで調べてみる。

% ldapsearch -h localhost -x -b 'ou=People,dc=private,dc=jp' 'uid=ldapuser'

これは、

% ldapsearch -h localhost -x -b 'dc=private,dc=jp' 'uid=ldapuser'

として検索ベースからou=Peopleを省いてもよい。

そうすると検索対象はdc=private,dc=jp以下の全てのサブツリーから行なわれる。

# extended LDIF
#
# LDAPv3
# base <dc=private,dc=jp> with scope subtree
# filter: uid=ldapuser
# requesting: ALL
#

# ldapuser, People, private.jp
dn: uid=ldapuser,ou=People,dc=private,dc=jp
objectClass: account
objectClass: posixAccount
uid: ldapuser
userPassword:: e1NTSEF9M005eG1jODljOFRSZjF4WGxESjRsYXJ5NFdUaUhENVM=
uidNumber: 1000
gidNumber: 1000
cn: ldapuser
homeDirectory: /home/ldapuser
loginShell: /bin/bash

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

ここでuserPassword属性の表示に着目する。

userPasswordは{SSHA}...で登録したはずだが検索結果はe1NT...となっている。

このようにuserPassword属性の値はエンコードされて表示される。

属性名の後に::が続く場合はBase64でエンコードされたものという意味である。

これはバイナリデータでも同様にエンコードされる。

これらデータは単にBase64でエンコードされているだけなのでアクセス制御をきちんとかけておかないと外部に漏洩してしまうので注意が必要である。

また、登録されている情報を参照するにはldapsearchによる検索の他にslapcatを使用して登録内容の一覧が確認する方法もある。

# /usr/local/sbin/slapcat
dn: dc=private,dc=jp
objectClass: dcObject
objectClass: organization
dc: private
o: private Organization
structuralObjectClass: organization
entryUUID: ddafe7aa-8baf-102c-9c1c-cdb4c4747cc6
creatorsName: cn=Manager,dc=private,dc=jp
modifiersName: cn=Manager,dc=private,dc=jp
createTimestamp: 20080321163030Z
modifyTimestamp: 20080321163030Z
entryCSN: 20080321163030.509867Z#000000#000#000000

dn: ou=People,dc=private,dc=jp
objectClass: organizationalUnit
ou: People
structuralObjectClass: organizationalUnit
entryUUID: ddb07238-8baf-102c-9c1d-cdb4c4747cc6
creatorsName: cn=Manager,dc=private,dc=jp
modifiersName: cn=Manager,dc=private,dc=jp
createTimestamp: 20080321163030Z
modifyTimestamp: 20080321163030Z
entryCSN: 20080321163030.513469Z#000000#000#000000

dn: uid=ldapuser,ou=People,dc=private,dc=jp
objectClass: account
objectClass: posixAccount
uid: ldapuser
userPassword:: e1NTSEF9SkpMTUNZWnloRitmOG0rMUlCb01xK1E0WHZuZWwxUjI=
uidNumber: 1000
gidNumber: 1000
cn: ldapuser
homeDirectory: /home/ldapuser
loginShell: /bin/bash
structuralObjectClass: account
entryUUID: ddb35ed0-8baf-102c-9c1e-cdb4c4747cc6
creatorsName: cn=Manager,dc=private,dc=jp
modifiersName: cn=Manager,dc=private,dc=jp
createTimestamp: 20080321163030Z
modifyTimestamp: 20080321163030Z
entryCSN: 20080321163030.532633Z#000000#000#000000

関連資料・記事

2008/3/22更新

対応バージョン: 2.4.8

既にslapdが実行中の場合に、slapdのデータベース(/usr/local/var/openldap-data配下)を再構築するようなコマンド(slapindex、slapaddなど)を実行するとこのエラーが出る。

可能であればいったんslapdを停止して当該コマンドを実行した後、再度slapdを開始する。

2008/3/22更新

対応バージョン: 2.4.8

LDAPサーバにデータを登録するには通常LDIF(LDAP Data Interchange Format)フォーマットのファイルを作成してそれを読み込ませることによって行う。

LDIFはLDAPのデータを表現することができ、LDAPとその他のデータベースなどとの間でデータ交換を行うための標準フォーマットである。

LDIFファイルのフォーマットは以下のとおり。

dn: <識別名>
<属性記述子>: <属性値>
<属性記述子>: <属性値>
:
<空行>  ← レコードの区切りは空行で
dn: <識別名>  ← 2レコード目
:

dn(Distinguished Name)は識別子であり全レコードを通じて一意である必要がある。

人事情報などを管理する場合、氏名を識別名にすると同性同名の場合に困るので登録番号のような属性を加えたものを使用したようがよいだろう。

また、属性記述子の代表的なものとして以下のようなものがある。

cn (commonName)

一般名

sn (surName)

gn (givenName)

uid (userName)

ユーザ名

uidNumber (userID)

ユーザID

gidNumber (groupID)

グループID

homeDirectory

ホームディレクトリ

loginShell

ログインシェル

telephoneNumber

電話番号

userPassword

パスワード

o (organizationName)

組織名

ou (organizationUnit)

部署名

title

役職

c (countryName)

国名

l (localityName)

地域名

dc (domainComponent)

ドメイン構成要素

関連資料・記事

2008/4/5更新

対応バージョン: 2.4.8

具体的には以下のようなエラーが出る。

slapd: conn=16 fd=11 ACCEPT from IP=127.0.0.1:54937 (IP=0.0.0.0:389) 
slapd: conn=16 op=0 EXT oid=1.3.6.1.4.1.1466.20037 
slapd: do_extended: unsupported operation "1.3.6.1.4.1.1466.20037" 
slapd: conn=16 op=0 RESULT tag=120 err=2 text=unsupported extended operation 
slapd: conn=16 op=1 UNBIND 
slapd: conn=16 fd=11 closed 

OID=1.3.6.1.4.1.1466.20037はRFC2830で規定された「Start TLS拡張機能」である。

これはLinuxクライアント上でLDAP+TLS併用機能を有効化しているために発生するリクエストなので、サーバに対して正しいSSL要求を行うか、以下の手順でLDAP+TLS併用機能を無効化する。

# authconfig --disableldaptls --update

関連資料・記事

2008/4/5更新

対応バージョン: 2.4.8

ldapsearchコマンドを使用する。

例として、「dn: uid=ldapuser,ou=People,dc=private,dc=jp」の認証を受け、その状態で「uid=ldapuser」(自分自身)を検索する。

% ldapsearch -x -D "uid=ldapuser,ou=People,dc=private,dc=jp" -w <ldapuserのパスワード> \
-b "dc=private,dc=jp" "uid=ldapuser"

# extended LDIF
#
# LDAPv3
# base <dc=private,dc=jp> with scope subtree
# filter: uid=ldapuser
# requesting: ALL
#

# ldapuser, People, private.jp
dn: uid=ldapuser,ou=People,dc=private,dc=jp
objectClass: account
objectClass: posixAccount
uid: ldapuser
userPassword:: e1NTSEF9M005eG1jODljOFRSZjF4WGxESjRsYXJ5NFdUaUhENVM=
uidNumber: 1000
gidNumber: 1000
cn:: 44OG44K544OI44Om44O844K2
homeDirectory: /home/ldapuser
loginShell: /bin/bash

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

また、何もオプションを指定しなければ全エントリを表示する。

% ldapsearch -x

# extended LDIF
#
# LDAPv3
# base <> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# private.jp
dn: dc=private,dc=jp
objectClass: dcObject
objectClass: organization
dc: private
o: private

# People, private.jp
dn: ou=People,dc=private,dc=jp
objectClass: organizationalUnit
ou: People

# ldapuser, People, private.jp
dn: uid=ldapuser,ou=People,dc=private,dc=jp
objectClass: account
objectClass: posixAccount
uid: ldapuser
userPassword:: e1NTSEF9M005eG1jODljOFRSZjF4WGxESjRsYXJ5NFdUaUhENVM=
uidNumber: 1000
gidNumber: 1000
cn:: ldapuser
homeDirectory: /home/ldapuser
loginShell: /bin/bash

# taro@private.jp, People, private.jp
dn: mail=taro@private.jp,ou=People,dc=private,dc=jp
objectClass: inetOrgPerson
displayName: Taro Suzuki
sn: Suzuki
cn: Taro
mail: taro@private.jp

# search result
search: 2
result: 0 Success

# numResponses: 5
# numEntries: 4

管理用の特殊な情報が格納されるエントリの属性を表示する場合は以下のようにする。

% ldapsearch -x -s base "(objectclass=*)" "*" "+"

# extended LDIF
#
# LDAPv3
# base <> with scope baseObject
# filter: (objectclass=*)
# requesting: * + 
#

# private.jp
dn: dc=private,dc=jp
objectClass: dcObject
objectClass: organization
dc: private
o: private Organization
structuralObjectClass: organization
entryUUID: 10a20062-05f0-102c-8782-bd2b3a43d9fd
creatorsName: cn=Manager,dc=private,dc=jp
modifiersName: cn=Manager,dc=private,dc=jp
createTimestamp: 20071003113227Z
modifyTimestamp: 20071003113227Z
entryCSN: 20071003113227Z#000000#00#000000
entryDN: dc=private,dc=jp
subschemaSubentry: cn=Subschema
hasSubordinates: TRUE

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

2008/4/5更新

対応バージョン: 2.4.8

ldappasswdコマンドを使用する。

オプションはldap*コマンド群共通オプションの他に以下のオプションが使用できる。

-s

新パスワードをコマンドラインから指定

-S

新パスワードをプロンプトから入力

(*) -sも-Sオプションも付けないとパスワードが自動的に生成される。

例) cn=Managerに接続してuid=ldapuserのパスワードを変更する。

% ldappasswd -x -D "cn=Manager,dc=private,dc=jp" -S -w <バインドDNパスワード> \
"uid=ldapuser,ou=People,dc=private,dc=jp"

New password: ***** ← 新しいパスワード
Re-enter new password: ***** ← 新しいパスワード(再入力)
Result: Success (0)

例) uid=ldapuserのパスワードを(自身で)変更する。

% ldappasswd -x -D "uid=ldapuser,ou=People,dc=private,dc=jp" -S -w <ldapuserのパスワード> \
"uid=ldapuser,ou=People,dc=private,dc=jp"

New password: ← 新しいパスワード
Re-enter new password: ← 新しいパスワード
Result: Success (0)

2008/4/5更新

対応バージョン: 2.4.8

ldapdeleteコマンドにより情報を削除する。

例)

% ldapdelete -x -D "cn=Manager,dc=private,dc=jp" -w <パスワード> \
"uid=ldapuser,ou=People,dc=private,dc=jp"

2008/4/5更新

対応バージョン: 2.4.8

以下の原因が考えられる。

LDIFファイル内のobjectClassで指定したクラス名が誤っている。
LDIFファイル内のobjectClassで指定したクラスが定義されているスキーマファイルをslapd.confでincludeしていない。

関連資料・記事

2008/4/5更新

対応バージョン: 2.4.8

LDAPサーバにデータを登録するにはLDIFファイルを作成してldapaddコマンドにより行う。

登録するデータには様々な種類があるので、ここでは例としてメールアドレスの登録方法を紹介する。

% vi mail.ldif
dn: mail=taro@private.jp,ou=People,dc=private,dc=jp
objectclass: inetOrgPerson
displayName: Taro Suzuki
sn: Suzuki
cn: Taro
mail: taro@private.jp

% ldapadd -f mail.ldif -x -D 'cn=Manager,dc=private,dc=jp' -w <パスワード>
adding new entry "mail=taro@private.jp,ou=People,dc=private,dc=jp"

関連資料・記事

2008/4/5更新

対応バージョン: 2.4.8

バインドしたアカウントにその処理を実行する権限がない。

例えばUNIXアカウントのパスワードを変更しようとして、変更権限のないアカウントでバインドした場合などにこのエラーが出る。

例) fooアカウントがbarアカウントのパスワードを変更しようとしている

% ldappasswd -x -D "uid=foo,ou=People,dc=private,dc=jp" \
-W -s <fooのパスワード> "uid=bar,ou=People,dc=private,dc=jp" 

New password: ← 新しいパスワード
Re-enter new password: ← 新しいパスワード(再入力)
Result: Insufficient access (50)

2008/4/5更新

対応バージョン: 2.4.8

ldap*コマンド群で共通に使用できる主なオプションを以下に示す。

-x

認証の際にSASLを使用しない指定。

-H

接続先サーバの指定。

省略するとローカルホストが使われる。

例)

-H "ldap://192.168.0.1/"
-b

検索ベースの指定。

LDAPサーバのディレクトリシステム管理用の特殊な情報を対象とする場合は「-b ''」となる。

-s

検索スコープの指定。

識別名の属性だけを検索する場合は「-s base」となる。

-D

バインドDN。

例)

-D "cn=Manager,dc=private,dc=jp"
-A

検索結果に含まれるデータは取り出さずに属性名だけ取り出す。

-v

冗長モード。

デバッグなどに使用する。

-w

バインド対象先パスワードをコマンドラインから指定。

-W

バインド対象先パスワードをプロンプトから入力。

2008/3/22更新

対応バージョン: 2.4.8

slapd.confは多くの設定項目があるので、ここでは初期インストール時に有効になっている項目についてのみ説明する。他の設定項目については別資料にて説明する。

まず注意すべき点として、行がスペースで始まっている場合は前の行からの継続であるとみなされる。次に設定項目と設定値の間はスペースでなくタブである必要がある。これらの仕様はトラブルの元になることが多いので意識して設定を行うこと。

以下、それぞれの設定項目について説明する。

スキーマ読み込み

使用するスキーマ定義を読み込む。1行ずつ複数指定可能である。

include    <スキーマ定義ファイル>

例)

include    /usr/local/etc/openldap/schema/core.schema
include    /usr/local/etc/openldap/schema/cosine.schema
include    /usr/local/etc/openldap/schema/inetorgperson.schema

(*) このオプションの取り扱いには注意すること。入れ子になったincludeオプションに制限はなくincludeがループになった場合でも検出されない。

OpenLDAPにはあらかじめ以下のスキーマ定義が用意されている。

この中でcore.schemaは必須であり、それ以外は必要に応じてincludeする。

基本

core.schema

OpenLDAPのコアスキーマ定義

cosine.schema

X.500シリーズ(*1)準拠スキーマ定義

inetorgperson.schema

core.schemaのorganizationalPersonオブジェクトクラス(*2)を拡張し、メールアドレスなどのインターネットで使用する属性を加えたinetOrgPersonオブジェクトクラスが定義されている。

(*1) X.500シリーズは分散ディレクトリサービスに関する世界統一規格。この規格に準拠したネームスペースを使用すれば異なるディレクトリサービス間で相互運用性が確保される。

(*2) organizationalPersonオブジェクトクラスはpersonオブジェクトクラスの拡張。つまり、inetOrgPerson > organizationalPerson > personという継承関係になる。

サービス/プロトコル関連

corba.schema

CORBA関連

java.schema

Java関連

nis.schema

NIS関連

その他

openldap.schema

OpenLDAPプロジェクトPR用

ppolicy.schema (*)

パスワードポリシー用

dyngroup.schema (*)

Netscapeによるダイナミックグループ定義

misc.schema (*)

雑多なスキーマ定義

(*) これらのスキーマは実験用なので実運用にはなるべく使用しないこと!

slapd管理ファイル

slapdのPIDや起動時のコマンドラインオプションを保存するファイルを指定する。

内容はslapd起動時に書き込まれる。

pidfile     /var/run/slapd.pid
argsfile    /var/run/slapd.args

バックエンドデータベース

バックエンドに使用するデータベースの種類を指定する。

database    <データベースタイプ>

データベースは「bdb」(Berkeley DB)を使用するのが一般的であるが、その他にも以下の種類が利用できる。

dnssrv

DNS SRV

hdb

Hierarchical variant of bdb

ldap

Lightweight Directory Access Protocol(代理)

ldbm

軽量DBM

meta

メタディレクトリ

monitor

モニタ

passwd

passwd(5)への読取り専用アクセス

perl

Perlプログラム可能なバックエンド

shell

Shell(外部プログラム)バックエンド

sql

SQLプログラム可能なバックエンド

サフィックス

データツリーのベース部分を定義する。以降のデータは全てこのツリー下に配置される。

suffix    "<ベース指定>"

例えば「dc=example,dc=com」というベースを定義する場合は以下のようになる。

suffix    "dc=example,dc=com"

root DN

管理者のDNを定義する。

rootdn    "<root DN>"

例えば以下のように前述のサフィックスと共に指定する。

rootdn    "cn=Manager,dc=example,dc=com"

rootpw

上記管理者のパスワードを指定する。

rootpw    <root DNのパスワード>

平文で指定することも可能であるが、セキュリティを考慮して通常はSSHA形式などエンコードされた値を使用すべきである。

指定可能な暗号化方式を以下に示す。

CRYPT
MD5
SMD5
SSHA (デフォルト)
SHA

パスワードはOpenLDAP付属のslappasswdコマンドにて生成することができる。

# /usr/local/sbin/slappasswd -s <パスワード> -h '{<暗号化方式>}'
{<暗号化方式>}k3aOoaWZat8snR3O4LmNzHwcWTYV5rPe

出力された結果をそのままrootpwに指定すればよい。例えば以下のように指定する。

rootpw    {SHA}eOZi3nfyPWFJueGFZS5i3jaQMD8=

尚、暗号化方式に「CRYPT」を指定すれば/etc/shadow内のパスワードをそのまま流用できる。

関連資料・記事

directory

データの実体を保存するディレクトリを指定する。

directory   <ディレクトリ>

index

属性毎に管理するインデックスを指定する。

ユーザ情報を扱うposixAccountのように検索キーとして頻繁に使用する属性(uid,uidNumber等)とほとんど使用しない属性(gecos等)がはっきりしている場合には検索キーにインデックスを作成しておくと検索速度が早くなる。

ただ、インデックスを作成するとその分ディスク容量が必要になるので必要に応じて作成するようにする。

設定は以下の書式で行なう。

index {<属性リスト>|default} [<インデックス設定>]
<属性リスト>だけが指定された場合、デフォルトのインデックス(pres,eq)が指定されたものとみなされる。

以下、インデックス設定の種類についてそれぞれ説明する。

pres (存在)

検索例)

uid=*

eq (等価)

検索例)

uid=ldapuser

approx (近似)

検索例)

uid=ldapusr

sub (部分一致)

検索例)

uid=ldap*

none (無し)

例) インデックスのデフォルトセットを存在(presence)と等価性(equality)を管理するように設定

index    default pres,eq

例) objectClassとuid属性型についてデフォルトのインデックス(pres,eq)を管理すように設定

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で指定されたディレクトリ配下に格納される。

関連資料・記事

2008/3/21更新

対応バージョン: 2.4.8

公式サイト

準備

あらかじめインストールしておくもの

BerkeleyDB(db4)

導入OS

Fedora 8

インストール

配布ファイル展開

% tar zxvf openldap-2.4.8.tgz
% cd openldap-2.4.8

make,インストール

% ./configure <オプション>
% make depend
% make
% sudo make install

インストール物 (man,infoは除く)

ライブラリ
/usr/local/lib/liblber*
/usr/local/lib/libldap*
設定ファイル(サンプル)
/usr/local/etc/openldap/ldap.conf
/usr/local/etc/openldap/ldap.conf.default
/usr/local/etc/openldap/slapd.conf
/usr/local/etc/openldap/slapd.conf.default
/usr/local/etc/openldap/DB_CONFIG.example

/usr/local/var/openldap-data/DB_CONFIG.example
スキーマ定義
/usr/local/etc/openldap/schema/*
ヘッダファイル
/usr/local/include/lber*
/usr/local/include/ldap*
/usr/local/include/slapi-plugin.h
デーモン
/usr/local/libexec/slapd
ツール
/usr/local/bin/ldapadd -> ldapmodify
/usr/local/bin/ldapcompare
/usr/local/bin/ldapdelete
/usr/local/bin/ldapmodify
/usr/local/bin/ldapmodrdn
/usr/local/bin/ldappasswd
/usr/local/bin/ldapsearch
/usr/local/bin/ldapwhoami

/usr/local/sbin/slapacl -> ../libexec/slapd
/usr/local/sbin/slapadd -> ../libexec/slapd
/usr/local/sbin/slapauth -> ../libexec/slapd
/usr/local/sbin/slapcat -> ../libexec/slapd
/usr/local/sbin/slapdn -> ../libexec/slapd
/usr/local/sbin/slapindex -> ../libexec/slapd
/usr/local/sbin/slappasswd -> ../libexec/slapd
/usr/local/sbin/slaptest -> ../libexec/slapd

各種設定

基本設定

/usr/local/etc/openldap/slapd.confにて基本的な設定を行う。

ここではとりあえず以下のような設定にする。

include     /usr/local/etc/openldap/schema/core.schema

pidfile     /var/run/slapd.pid
argsfile    /var/run/slapd.args

database    bdb

suffix      "dc=private,dc=jp"

rootdn      "cn=Manager,dc=private,dc=jp"
rootpw      secret

directory   /usr/local/var/openldap-data

index   objectClass     eq

それ以外の設定については以下を参照のこと。

関連資料・記事

DB_CONFIG準備

今回データベースとしてbdb(Berkeley DB)を使用するので、同DB用の設定ファイルを準備しておく。

% cd /usr/local/var/openldap-data
% sudo cp DB_CONFIG.example DB_CONFIG
% sudo vi DB_CONFIG
(設定内容は省略する)

syslog設定

/etc/rsyslog.confに以下の設定を追加し、rsyslogdにHUPシグナルを送る。

local4.*    /var/log/slapd.log

動作確認

slapd(LDAPサーバ)を起動する。

% sudo /usr/local/libexec/slapd

待ち受けポートがLISTENになっているか確認する。

% netstat -nat|egrep '(Proto|389)'
Proto Recv-Q Send-Q Local Address  Foreign Address  State      
tcp        0      0 0.0.0.0:389    0.0.0.0:*        LISTEN      

以下のようにして情報が取り出せればOKである。

% ldapsearch -h localhost -b '' -s base '(objectclass=*)' '*' '+'
:
objectClass: top
:

initスクリプト設置

スクリプト作成

/etc/rc.d/init.d/slapdを作成する。

#!/bin/bash
#
# slapd
#
# chkconfig: 345 80 20
# description: slapd server

TARGET=slapd
DST_PREFIX=/usr/local
DST_BIN=${DST_PREFIX}/libexec/${TARGET}
DST_CONF=${DST_PREFIX}/etc/openldap/${TARGET}.conf
DST_PIDF=/var/run/${TARGET}.pid

[ -f ${DST_BIN} ] || exit 0
[ -f ${DST_CONF} ] || exit 0

start()
{
  echo -n "Starting ${TARGET}: "
  ${DST_BIN} -f ${DST_CONF}
  echo
}

stop()
{
  echo -n "Shutting down ${TARGET}: "
  kill `cat ${DST_PIDF}`
  echo
}

restart()
{
  stop
  start
}

case "$1" in
  start)
    start
    ;;

  stop)
    stop
    ;;

  restart)
    restart
    ;;

  *)
    echo "Usage: `basename $0` {start|stop|restart}" >&2
    exit 1
esac

exit 0

サービス登録

% sudo chkconfig --add slapd
% sudo chkconfig --list slapd
slapd  0:off  1:off  2:off  3:on  4:on  5:on  6:off