データの編集

ここでは OpenLDAP付属ツールによるデータの変更や削除のし方を紹介する。

属性値の変更 (ldapmodify)

実際の例。前ページで実験的に投入してみたエントリを修正してみる。 -x, -D, -W などについては ldapsearch での説明参照。

user$ ldapmodify -x -D "cn=Manager,dc=example-net,dc=com" -W
Enter LDAP Password: #スーパーユーザのパスワードをタイプ。上で"-w secret"として直接与えても良い
dn: uid=0001,ou=network,dc=example-net,dc=com
mail: nono@example-net.cxm #既にある属性を変更する場合
userPassword: himitu       #同じ種類の動作(この場合変更)なら続けて打てる
-                    #同一の dn に対する違うタイプの動作を行いたい時はハイフォンで区切る
delete: roomNumber         #roomNumber属性を削除している
-
add: homePhone             #homePhone属性を追加するよ
homePhone: 000-111-1111    #homePhone属性の値はこれだよ
                     #Enter をもう1回。Enterの後、続いて別の dn の変更を行うこともできる
modifying entry "uid=0001,ou=network,dc=example-net,dc=com"
[Ctrl + d]           #編集の終了を知らせるため EndOfFile を入力する
覚え書き

また、dn:以下をファイルに書いておき、 ldapmodify のコール時に -f でファイル名を指定してやることもできる。エラーが起こっても引き続き処理を続ける -c オプションを加えると便利な場合もある。

パスワードの変更 (ldappasswd)

パスワード (userPassword 属性) の変更は属性の中でも特殊なケースだ。userPasswordslapd.conf で指定してある LDAPへの格納形式に沿って変換されてから格納されなければならないからだ。そうした変換が行われるには、パスワードを投入/変更するフロントエンドアプリケーションが パスワード変更拡張手順 (LDAP Password Modify Extended Operation) に対応している必要がある。それをやってくれるのが、OpenLDAP の付属ユーティリティ ldappasswd だ。

user$ ldappasswd -x -S -D "cn=Manager,dc=example-net,dc=com" -w secret \
  "uid=0001,ou=network,dc=example-net,dc=com"

オプション -S を指定すると、新しいパスワードを対話式に訊いてくる。代わりに "-s secret" のようにコマンドラインでパスワードも一緒に渡すこともできる。

DNの変更

同じ変更でも、エントリの識別名そのものである DN の変更は特別。 専用コマンド ldapmodrdn による方法と、 ldapmodify による方法がある。なお、ここで出てくる RDN とは Relative Distinguished Name つまり、上位階層に対する相対的な識別名を表す。

ldapmodrdn による方法

オプション -r を忘れると旧RDN が残ってしまうので注意。

引数として与えるやり方

引数として "DN<スペース>RDN" を指定する。この方法では一度にワンペアしか指定できないようだ。

user$ ldapmodrdn -x -r -D "cn=Manager,dc=example-net,dc=com" -w secret \
  "uid=0001,ou=network,dc=example-net,dc=com" uid=0003
ターミナル内で与えるやり方

引数として与える場合と異なり、一度に何エントリでも変更できる。

user$ ldapmodrdn -x -r -D "cn=Manager,dc=example-net,dc=com" -W
Enter LDAP Password:
uid=0001,ou=network,dc=example-net,dc=com
uid=0003
 
uid=0002,ou=network,dc=example-net,dc=com
uid=0004
[Ctrl + d]

DN に使用する属性そのものをすげ替えることもできる。その場合は -r オプションを用いない方が、おそらく期待した結果になるだろう。下の例では uid によって定義されていた DN を、 sn による定義へと変更している;

user$ ldapmodrdn -x -D "cn=Manager,dc=example-net,dc=com" -W
Enter LDAP Password:
uid=0001,ou=network,dc=example-net,dc=com
sn=Nonogaki
[Ctrl + d]

結果こうなる;

user$ ldapsearch -x -LLL -s one -b "ou=network,dc=example-net,dc=com"
dn: sn=Nonogaki,ou=network,dc=example-net,dc=com
sn: Nonogaki
cn: Tatsuya
.
.
uid: 0001  # -r オプションを付けなかったので、旧DN に使用されていたこの属性は削除されていない
ファイルに書いておくやり方

modrdn.ldif の内容例:

uid=0001,ou=network,dc=example-net,dc=com
uid=0003
                # 元の DN と新RDN を交互に書き、別の DN の操作前には空行を入れる
uid=0002,ou=network,dc=example-net,dc=com
uid=0004

上記 LDIF を流し込むには;

ldapmodrdn -x -r -D "cd=Manager,dc=example-net,dc=com" -w secret \
 -f modrdn.ldif

ldapmodify による方法

これは常に、 ldapmodrdn-r オプション付きで実行したのと同じことになる。

user$ ldapmodify -x -D "cn=Manager,dc=example-net,dc=com" -W
Enter LDIF Password:
dn: uid=0001,ou=network,dc=example-net,dc=com
changetype: modrdn
newrdn: uid=0003
 
modifying rdn of entry "uid=0001,ou=network,dc=example-net,dc=com"
modrdn completed
[Ctrl + d]

エントリの削除

ldapdelete コマンドで行う方法と、 ldapmodify コマンドで行う方法がある。

ldapdelete による方法

-x, -D などのオプションの意味は ldapsearch と同様。ここでも、 -c (エラーコンティニュアスモード) も使用できる。いろいろな可能性を示すため、各々、エントリをいっぺんにふたつ削除する例を示す。

引数として与えるやり方
user$ ldapdelete -x -D "cn-Manager,dc=example-net,dc=com" -w secret \
 uid=0001,ou=network,dc=example-net,dc=com \    #"dn: " は要らない
 uid=0002,ou=network,dc=example-net,dc=com      #スペース区切りで幾つでも
ターミナル内で与えるやり方
user$ ldapdelete -x -D "cn=Manager,dc=example-net,dc=com" -W
Enter LDAP Password:
uid=0001,ou=network,dc=example-net,dc=com
uid=0002,ou=network,dc=example-net,dc=com
[Ctrl + d]
ファイルに書いておくやり方

delthem.ldif の内容:

uid=0001,ou=network,dc=example-net,dc=com
uid=0002,ou=network,dc=example-net,dc=com

流し込みコマンド;

ldapdelete -x -c -D "cn=Manager,dc=example-net,dc=com" -w secret \
 -f delthem.ldif

ldapmodify による方法

user$ ldapmodify -x -D "cn=Manager,dc=example-net,dc=com" -W
Enter LDAP Password:
dn: uid=0001,ou=network,dc=example-net,dc=com
changetype: delete
 
deleting entry "uid=0001,ou=network,dc=example-net,dc=com"

dn: uid=0002,ou=network,dc=example-net,dc=com"
changetype: delete
 
deleting entry "uid=0002,ou=network,dc=example-net,dc=com"
[Ctrl + d]

当然ながら、 LDIFファイルに書いておいて流し込む方法もある;

moddel.ldif の内容:

dn: uid=0001,ou=network,dc=example-net,dc=com
changetype: delete
            #dn指定と dn指定の間は空行で区切る
dn: uid=0002,ou=network,dc=example-net,dc=com"
changetype: delete

流し込みコマンド;

ldapmodify -x -c -D "cn=Manager,dc=example-net,dc=com" -w secret \
 -f moddel.ldif

Berkeley DB のパフォーマンス最適化

前ページでとりあえず起動させた時に、 "No DB_CONFIG file found ... Expect poor performance" (DB_CONFIGファイルが見つからない。高いパフォーマンスはとても見込めないぞ) という警告メッセージが出ただろう。 DB_CONFIG ファイルは、 OpenLDAPサーバがバークレイDB をドライブする際の、環境定義を書いておくファイルであり、 slapd.confdirectory ディレクティブで指定したディレクトリから探される (ここからの説明が煩雑になるのを避けるため、 directory には /var/lib/ldap/ を指定してあるものとして話を進める)。

DB_CONFIGファイル

より正確に言うと、 DB_CONFIG ファイルは OpenLDAP の設定ファイルというよりもバークレイDB の設定ファイルで、前述したエラーメッセージも、slapd から呼ばれた BDBライブラリが吐いているものだ。 DB_CONFIG ファイルの中に書くディレクティブの解説も、バークレイDB のマニュアルの範疇となる。

では実際の手順に入ろう。実は OpenLDAP パッケージには DB_CONFIG ファイルのサンプルが付属しているので、それを複製して叩き台とするのが楽だ。 /var/lib/ldap/ に置くのはシンボリックリンクでも問題なかった。

root# /etc/init.d/ldap stop
root# cd /etc/openldap
root# cp -p DB_CONFIG.example DB_CONFIG
root# cd /var/lib/ldap
root# ln -s /etc/openldap/DB_CONFIG

そして編集していく。全般的な解説は OpenLDAP Faq-O-Matic(英語) にある。あるいは Berkeley DB Reference Guide: Berkeley DB and logging あたりが参考になるかもしれない。

DB_CONFIG の主な設定パラメータ
ディレクティブ 説明 参考BDBマニュアル
set_cachesize 0 67108864 1 データベースを展開するために確保する共有メモリのチューニング。第1引数は GBite 単位、第2引数が Bite 単位で、実際のサイズはそれらの合計となる。第3引数はメモリセグメントの数で、例えば 2 にすると、2セグメントに分割して確保される。左の例は「64Mバイトを 1セグメントで確保する」の意味。 Getting Started with Data Storage
set_lg_regionmax 262144 WAL (PostgreSQLでの解説が参考になるだろう) メモリキャッシュのうち、データベースファイルのファイル名をキャッシュするために使われるメモリの最大サイズ (Bite)。左の例は 256Kバイト確保している。 Getting Started with Transaction Processing,
DB_ENV->set_lg_regionmax
set_lg_bsize 2097152 WALメモリキャッシュのうち、 WAL情報のバッファとして働くことのできるサイズ (Bite)。左記は 2Mバイトに設定している。バッファされたデータが 2Mバイトに達するか、それ以前にトランザクションがコミットされると、貯えられた情報がディスク上の WALファイルに書き込まれる。 DB_ENV->set_lg_bsize
set_lg_max 10485760 WALファイルひとつひとつの最大サイズ (Bite)。左記は 10Mバイト。これを超えると次のファイルへ分割される。 set_lg_bsize の 4倍以上でなければならない。 DB_ENV->set_lg_max,
Getting Started with Transaction Processing

最適値を調べるためのツール

実際にどの程度のメモリ量やファイルサイズに設定すればいいかだが、こればかりは運用によって千差万別で、BDB のマニュアルにも 「artである」(勘と経験で煮詰めていくしかない) と書かれている。ただし目安を知るためのツールはある。 db_stat がそれだ。

ここで注意点だが、 Fedora Core 5 の openldap-servers RPMパッケージは、システムに既にインストールされているバークレイDB (db4パッケージ) を使うのではなく、openldap-servers に同梱された BDB ライブラリを使用しているようだ。同梱版のバージョンは db4 パッケージのバージョンと同じとは限らないため、 db_stat コマンド (db4-utilsパッケージに含まれる) コマンドを使おうとすると、"DB_ENV->open: DB_VERSION_MISMATCH"(「データベースのバージョンが合わない」) と言われてテストができない。その場合は、代わりに /usr/sbin/slapd_db_stat という名前で同等のツールがインストールされているはずなので、以下の説明の db_statslapd_db_stat に読み替えていただきたい。

set_cachesize のための分析

LDAPサーバを起動して、ldapsearch か実際のフロントエンドアプリケーションで充分にデータ検索を行ってから、以下のようにして分析を行う;

root# cd /var/lib/ldap
root# db_stat -m
80M 740B    Total cache size
1    Number of caches
.
.
114  Requested pages found in the cache (96%)
.
.

set_lg_* のための分析

root# cd /var/lib/ldap
root# db_stat -l

現在の設定値やステータスが表示される。ただしこちらに関しては、筆者のマシンの貧弱な実データ状態では変化が起こりにくく、クリティカルな状態を作り出すのが難しいため、どの値が参考になるのか勉強不足。よって、今のところ出力例や細かい説明は割愛させていただくしかない。

LDAPのGUIツール

LDAP Browser/Editor

オフィシャルサイト: LDAP Browser/Editor

Java で書かれたアプリケーションで、当然、Javaランタイム環境さえあれば Linux 上でも Windows 上でも動作する。商業利用する場合には有料となるが非常に安価。開発ライセンスも有料となっているため、完全なオープンソースとは言えない。

「素直」な造りで、どちらかといえば LDAP のコマンドラインに慣れている人向け。属性セットのテンプレートを活用すれば新規エントリ登録は楽になる。検索は LDAP検索フィルタを文字入力するカタチなのであまり使い勝手がよくない。LDAPパスワード拡張手順は使用していないため LDAP サーバ側のデフォルトパスワードスキームではパスワード格納形式がコントロールできないが、入力文字列をアプリケーション側で LDAP-SHA フォーマットに変換してから (それを平文として) LDAP に送り込む能力はある。

LDAP Admin

オフィシャルサイト: LDAP Admin

Windows 版アプリケーション。GNU、フリー。

属性セットのテンプレート (.ltf ファイル) を使えばエントリの新規登録や編集が効率的に行える。検索機能では、プリセットの属性は cnmail しかなく、それ以外の属性で検索したい時には LDAP検索フィルタを文字列で指定しなければならない。LDAPパスワード拡張手順は使用されていないが、アプリケーション側で指定の形式へとハッシュしてから送り込む機能はあり、OpenLDAP の備える大多数のハッシュ形式 (CRYPT, MD5, MD5-CRYPT, SHA1 など) の生成能力を備える。

PLA (php LDAP Admin)

オフィシャルサイト: phpLDAPAdmin

HTTPサーバ上に置いて Webブラウザでアクセスするタイプの管理アプリケーションで、当然ながら、仕掛けてしまえばほとんどの OS からアクセスできる。GNU、フリー。Webサーバ側には php5 が必要だが、php4 用の旧バージョンも配布されている。属性テンプレートの利用の他、スクリプト言語だけあってかなりのカスタマイズが可能。

Directory Administrator

オフィシャルサイト: Directory Administrator

Linux, BSD などで動作するアプリケーション。GNU、フリー。rpm 及び ソースrpm も提供されている。