OpenLDAP の設定

(2014.11)

メールサーバを立てる際, 組織メンバのメールアドレスや所属情報を共有したいことがよくある.

こういうときは, LDAPサーバを用意して, メールクライアントからアドレス帳として参照するようにするのがいい。メンバの異動があったときは, サーバ側で変更するだけでよくなる.

オープンソースのLDAPサーバとしてメジャーなのは, OpenLDAP と 389 Directory Server (旧名 Fedora Directory Server) ぐらい. ApacheDSもある。

今回は, OpenLDAPを設定してみる。

OpenLDAP のインストール

Fedora 19 / 20 では, OpenLDAP 2.4.39 がパッケージ化されている。yumコマンドでインストールすればOK. コマンドラインツールが必要になるので, クライアントのパッケージも同時に入れる。

# yum install openldap-servers openldap-clients

Zimbra 8.6.0 には, openldap 2.4.39 が含まれる。

設定ファイル

OpenLDAP のサーバ設定は, 現代は, /etc/openldap/slapd.d ディレクトリ以下でおこなう。

ネット上の古いドキュメントでは slapd.conf ファイルでサーバの設定をおこなっているものが多いが, Fedora のパッケージでは, どこにもインストールされない. その方法はもはや使えない。

しかも, 公式の Quick start guide も内容が古いままで, とても難儀した。

Zimbra 添付の openldap の場合は, /opt/zimbra/data/ldap/config/ 以下にある。

サーバ管理者 (Root DN) / パスワード

一番分かりづらいのは, 一番最初の, サーバの管理者パスワードを登録するところだと思う。

サーバが動いていないと登録できなくなっていて, でもそのサーバにアクセスするためのパスワードはどうするのか, という, 完全に金庫の鍵が金庫の中, 状態になってしまっている。

どうするのか。

管理者ユーザを表す RootDN は, /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2}hdb.ldif ファイルにある。

# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 ed01ff12
dn: olcDatabase={2}hdb
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=my-domain,dc=com
olcRootDN: cn=Manager,dc=my-domain,dc=com     これがRoot DN
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
structuralObjectClass: olcHdbConfig
entryUUID: 307e4d30-fa87-1033-8cd1-55accb9e5be7
creatorsName: cn=config
createTimestamp: 20141107050342Z
entryCSN: 20141107050342.835601Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20141107050342Z

このファイルを変更するが、先頭行のコメントのとおり, ldapmodify コマンドを使う。

Step 1. まず, 次のファイルを init.ldif という名前で作成する。

LDIFファイルは, LDAPのエントリをテキスト形式で表すファイル。"dn:"から空行までが1エントリ。

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: パスワード

dn: olcDatabase={2}hdb,cn=config   Fedora 22だと {2}mdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: パスワード
-
replace: olcRootDN
olcRootDN: cn=admin,dc=pineapple,dc=localdomain
-
replace: olcSuffix
olcSuffix: dc=pineapple,dc=localdomain

olcRootPW (2ヶ所), olcRootDN, olcSuffix の値は, 適宜変更してください。行頭の"-"も省略できません (行を詰めるのはOK)。

"dn:" 行に限らず, "="の前後, ","の前後に空白を入れてはいけません。

(2015.6.15) olcSuffixは変更しない (空白のままの) ほうが、複数ツリーを扱うために、適切。

Step 2. サーバが動いていなければ、起動する。

# systemctl start slapd

Step 3. 次のコマンドで投入。こんなの分からん!!!

$ ldapmodify -a -Y EXTERNAL -H ldapi:/// -f init.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"

modifying entry "olcDatabase={2}hdb,cn=config"

なお、パスワード設定後は、次のようにする。

$ ldapmodify -x -D cn=config -w パスワード -a -f init2.ldif

投入後, 例えば次のようにすれば, パスワード設定ができたか確認できる。-W オプションで対話的にパスワード入力する。

# ldapsearch -x -W -D "cn=admin,dc=pineapple,dc=localdomain"

Zimbra の場合

Zimbra のインストール時に、自動的に設定される。自動設定されたパスワードを確認する。

# su - zimbra
$ source ~/bin/zmshutil
$ zmsetvars

これで、環境変数に ldapuri, Root DN, パスワードが得られる。

$ ldapsearch -x -H $ldap_master_url -D $zimbra_ldap_userdn -w $zimbra_ldap_password
-H ldapuri LDAPサーバを表すURI
-D binddn Root DNを指定
-w passwd パスワード

ShanxT-LDAP-CheatSheet - Zimbra :: Wiki

スキーマの追加

LDAPは, 何でもデータが登録できるわけではなく, スキーマに合致したデータのみが登録できる。各種データを登録する前に, それぞれに適したスキーマを有効にしなければならない。

OpenLDAP でもっとも分かりにくいのは, スキーマの追加だろう。

slapd.conf 時代は, /etc/openldap/slapd.conf ファイルに, 次のようにスキーマを追加すれば十分だった。

include /etc/openldap/schema/samba.schema

現代では, 現在登録されているスキーマを一覧するには, ldapsearch コマンドで次のようにする。-D cn=config オプションがポイント。

-D cn=config の場合だけ, /etc/openldap/slapd.d 以下に保存される。そうでないときは /var/lib/ldap 以下に保存される。このオプションで切り替えている。

-D binddn
-b searchbase
$ ldapsearch -x -LLL -W -D cn=config -b cn=config "(objectClass=olcSchemaConfig)" dn
Enter LDAP Password:
dn: cn=schema,cn=config

dn: cn={0}core,cn=schema,cn=config

Zimbra添付の OpenLDAP の場合は, 次のようにする;

$ ldapsearch -x -LLL -H $ldap_master_url -w $zimbra_ldap_password -D cn=config -b cn=config "(objectClass=olcSchemaConfig)" dn

スキーマは, 最終的に, /etc/openldap/slapd.d/cn=config/cn=schema ディレクトリに cn={0}core.ldif などのファイルが作られれば OK.

公式ドキュメントには, 方法が書かれていないようだ。困る。

ネットを見ると, ダミーの slapd.conf 相当のファイルを作ったうえで, slaptest コマンドで変換する方法を紹介しているページもある。

正解は, *.ldifファイル形式のスキーマについては, 単に, 次のようにすればOK.

# ldapadd -x -W -D cn=config -f /etc/openldap/schema/cosine.ldif
Enter LDAP Password: 
adding new entry "cn=cosine,cn=schema,cn=config"

# ldapadd -x -W -D cn=config -f /etc/openldap/schema/inetorgperson.ldif
Enter LDAP Password: 
adding new entry "cn=inetorgperson,cn=schema,cn=config"
$ ldapadd -x -H $ldap_master_url -w $zimbra_ldap_password -D cn=config -f /usr/share/doc/samba-4.1.12/LDAP/samba.ldif
adding new entry "cn=samba,cn=schema,cn=config"

.schemaファイルを投入

.schema ファイルしかない場合は, slaptest コマンドで ldif ファイルに変換してから, ldapadd コマンドで投入する。

例えば, Samba 4 のスキーマは, 次の場所にある;

Samba 4 の場合は .ldif ファイルも提供されているので不要だが, 仮に .schema ファイルから変換するには、次のようにする; dummy.conf::

include "/opt/zimbra/openldap-2.4.39.2z/etc/openldap/schema/core.schema"
include "/opt/zimbra/openldap-2.4.39.2z/etc/openldap/schema/cosine.schema"
include "/opt/zimbra/openldap-2.4.39.2z/etc/openldap/schema/inetorgperson.schema"
include "/usr/share/doc/samba-4.1.12/LDAP/samba.schema"

slaptestコマンドに -f と -F の両方を与えると、ファイルを変換する。

$ make dummy.d
$ slaptest -f dummy.conf -F dummy.d/
config file testing succeeded
-f slapd.conf
-F confdir 出力先

dummy.d > cn=config > cn=schema ディレクトリに cn={3}samba.ldif ファイルが生成される。

さらに, 次のように書き換える;

変更前 変更後
dn: cn={3}samba
dn: cn=samba,cn=schema,cn=config
cn: {3}samba
cn: samba