OpenLDAP の設定

(2014.11)

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

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

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

Fedora 33 では, OpenLDAP がデフォルトでインストールされている。他方, Red Hat Enterprise Linux では, RHEL 7.4 で OpenLDAP のうちサーバパッケージが非推奨, RHEL8 で削除されている。推奨は 389 Directory Server.

今回は, 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/ ディレクトリ以下でおこなう。

ls -l
合計 4
drwxr-x--- 3 ldap ldap 182  1月 17 15:02 'cn=config'
-rw------- 1 ldap ldap 366  1月 17 15:02 'cn=config.ldif'

ネット上の古いドキュメントでは 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 ファイルにある。

[2021-01] Fedora 33 では, /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}mdb.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    dcはドメイン名
-
replace: olcSuffix
olcSuffix: dc=pineapple,dc=localdomain   dcはドメイン名

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

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

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"

まだ表示されるオブジェクトはない。

ldapsearch コマンドのオプション
-H ldapuri LDAPサーバを表すURI
-D binddn Root DNを指定
-w passwd パスワード
-b searchbase

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

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 以下に保存される。このオプションで切り替えている。

$ 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 などのファイルとして保存される。

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

正解は, *.ldif 形式のスキーマファイルについては, 単に, ldapadd コマンドで投入できる。

.schema ファイルしかない場合は, ダミーの slapd.conf 相当のファイルを作ったうえで, slaptest コマンドで ldif ファイルに変換してから, ldapadd コマンドで投入する。

Samba 4スキーマ

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

  • Fedora 33 Linux ... /usr/share/doc/samba/LDAP/samba.schema, /etc/openldap/schema/samba.schema (同じもの)
  • CentOS 7 ... /usr/share/doc/samba-4.1.12/LDAP/

ldif 形式のほうで取り込む方法:

# 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"

下はZimbra添付の場合。Fedora 33 だと /usr/share/doc/samba/LDAP/ にスキーマファイルがある。

$ ldapadd -x -H $ldap_master_url -w $zimbra_ldap_password -D cn=config -f /usr/share/doc/samba/LDAP/samba.ldif
adding new entry "cn=samba,cn=schema,cn=config"

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/LDAP/samba.schema"

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

$ make dummy.d
$ slaptest -f dummy.conf -F dummy.d/
config file testing succeeded
slaptest コマンドのオプション
-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