(2014.11)
メイルサーバを立てる際, 組織メンバのメイルアドレスや所属情報を共有したいことがよくある.
こういうときは, LDAPサーバを用意して, メイルクライアントからアドレス帳として参照するようにするのがいい。メンバの異動があったときは, サーバ側で変更するだけでよくなる.
オープンソースのLDAPサーバとしてメジャーなのは, OpenLDAP と 389 Directory Server (旧名 Fedora Directory Server) ぐらい. ApacheDSもある。
Fedora 33 では, OpenLDAP がデフォルトでインストールされている。他方, Red Hat Enterprise Linux では, RHEL 7.4 で OpenLDAP のうちサーバパッケージが非推奨, RHEL8 で削除されている。推奨は 389 Directory Server.
今回は, 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/
以下にある。
一番分かりづらいのは, 一番最初の, サーバの管理者パスワードを登録するところだと思う。
サーバが動いていないと登録できなくなっていて, でもそのサーバにアクセスするためのパスワードはどうするのか, という, 完全に金庫の鍵が金庫の中, 状態になってしまっている。
どうするのか。
管理者ユーザを表す 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 コマンドを使う。
LDIFファイルは, LDAPのエントリをテキスト形式で表すファイル。" " Step 2. サーバが動いていなければ、起動する。
Step 3. 次のコマンドで投入。こんなの分からん!!!
なお、パスワード設定後は、次のようにする。
投入後, 例えば次のようにすれば, パスワード設定ができたか確認できる。 まだ表示されるオブジェクトはない。
Step 1. まず, 次の内容のファイルをテキストエディタで作り,
init.ldif
という名前で保存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:
" 行に限らず, "="の前後, ","の前後に空白を入れてはいけません。
# systemctl start slapd
$ 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"
-H
ldapuri LDAPサーバを表すURI
-D
binddn Root DNを指定
-w
passwd パスワード
-b
searchbase
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 ファイルしかない場合は, ダミーの 例えば, Samba 4 のスキーマは, 次の場所にある;
ldif 形式のほうで取り込む方法:
下はZimbra添付の場合。Fedora 33 だと Samba 4 の場合は .ldif ファイルも提供されているので不要だが, 仮に .schema ファイルから変換するには、次のようにする;
dummy.conf ファイルを作る;
slaptestコマンドに dummy.d > cn=config > cn=schema ディレクトリに さらに, 次のように書き換える;
slapd.conf
相当のファイルを作ったうえで, slaptest コマンドで ldif ファイルに変換してから, ldapadd コマンドで投入する。
Samba 4スキーマ
/usr/share/doc/samba/LDAP/samba.schema
, /etc/openldap/schema/samba.schema
(同じもの)
# 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"
/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"
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"
-f
と -F
の両方を与えると、ファイルを変換する。
$ make dummy.d
$ slaptest -f dummy.conf -F dummy.d/
config file testing succeeded
-f
slapd.conf
-F
confdir 出力先
cn={3}samba.ldif
ファイルが生成される。
変更前 変更後
dn: cn={3}samba
dn: cn=samba,cn=schema,cn=config
cn: {3}samba
cn: samba