ここでは OpenLDAP付属ツールによるデータの変更や削除のし方を紹介する。
実際の例。前ページで実験的に投入してみたエントリを修正してみる。 -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 オプションを加えると便利な場合もある。
パスワード (userPassword 属性) の変更は属性の中でも特殊なケースだ。userPassword は slapd.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 の変更は特別。 専用コマンド ldapmodrdn による方法と、 ldapmodify による方法がある。なお、ここで出てくる RDN とは Relative Distinguished Name つまり、上位階層に対する相対的な識別名を表す。
オプション -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
これは常に、 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 コマンドで行う方法がある。
-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
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
前ページでとりあえず起動させた時に、 "No DB_CONFIG file found ... Expect poor performance" (DB_CONFIGファイルが見つからない。高いパフォーマンスはとても見込めないぞ) という警告メッセージが出ただろう。 DB_CONFIG ファイルは、 OpenLDAPサーバがバークレイDB をドライブする際の、環境定義を書いておくファイルであり、 slapd.conf の directory ディレクティブで指定したディレクトリから探される (ここからの説明が煩雑になるのを避けるため、 directory には /var/lib/ldap/ を指定してあるものとして話を進める)。
より正確に言うと、 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 あたりが参考になるかもしれない。
ディレクティブ | 説明 | 参考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 |
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_stat を slapd_db_stat に読み替えていただきたい。
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%) . .
root# cd /var/lib/ldap root# db_stat -l
現在の設定値やステータスが表示される。ただしこちらに関しては、筆者のマシンの貧弱な実データ状態では変化が起こりにくく、クリティカルな状態を作り出すのが難しいため、どの値が参考になるのか勉強不足。よって、今のところ出力例や細かい説明は割愛させていただくしかない。
Java で書かれたアプリケーションで、当然、Javaランタイム環境さえあれば Linux 上でも Windows 上でも動作する。商業利用する場合には有料となるが非常に安価。開発ライセンスも有料となっているため、完全なオープンソースとは言えない。
「素直」な造りで、どちらかといえば LDAP のコマンドラインに慣れている人向け。属性セットのテンプレートを活用すれば新規エントリ登録は楽になる。検索は LDAP検索フィルタを文字入力するカタチなのであまり使い勝手がよくない。LDAPパスワード拡張手順は使用していないため LDAP サーバ側のデフォルトパスワードスキームではパスワード格納形式がコントロールできないが、入力文字列をアプリケーション側で LDAP-SHA フォーマットに変換してから (それを平文として) LDAP に送り込む能力はある。
Windows 版アプリケーション。GNU、フリー。
属性セットのテンプレート (.ltf ファイル) を使えばエントリの新規登録や編集が効率的に行える。検索機能では、プリセットの属性は cn と mail しかなく、それ以外の属性で検索したい時には LDAP検索フィルタを文字列で指定しなければならない。LDAPパスワード拡張手順は使用されていないが、アプリケーション側で指定の形式へとハッシュしてから送り込む機能はあり、OpenLDAP の備える大多数のハッシュ形式 (CRYPT, MD5, MD5-CRYPT, SHA1 など) の生成能力を備える。
HTTPサーバ上に置いて Webブラウザでアクセスするタイプの管理アプリケーションで、当然ながら、仕掛けてしまえばほとんどの OS からアクセスできる。GNU、フリー。Webサーバ側には php5 が必要だが、php4 用の旧バージョンも配布されている。属性テンプレートの利用の他、スクリプト言語だけあってかなりのカスタマイズが可能。
Linux, BSD などで動作するアプリケーション。GNU、フリー。rpm 及び ソースrpm も提供されている。