そろそろLDAPにしてみないか?
第3回 もう一歩進んだUNIXアカウント
第1回から紹介してきたLDAPによるUNIXアカウント管理ですが,実際に運用する上ではまだまだ問題が残っています。
MigrationToolsによる既存ユーザのインポート
前回までは手動でLDIFファイルを作成し,そのデータをLDAPサーバへインポートしたわけですが,/etc/passwdや/etc/groupをLDAPに移行させるための便利なツールがあります。それがMigrationToolsです.
これらは/etc以下にあるパスワード,グループ,ホスト,サービス情報などをLDAPに移行させるためのLDIFを作成してくれるツールで,Perlスクリプトの集合体となっています。試しに既存の/etc/passwd,/etc/group,/etc/hostsの情報をLDIF形式にしてみましょう(図1)。事前に設定ファイルとなるmigrate_common.phを編集したり,適切な環境変数を定義することで作成されるLDIFのBASE_DNなどの値を変更することができます。
図1 MigrationToolsを使用したLDIFの作成
% tar zxfv MigrationTools.tgz % cd MigrationTools-47 # export LDAP_BASEDN="dc=example,dc=com" # ./migrate_passwd.pl /etc/passwd passwd.ldif # ./migrate_group.pl /etc/group group.ldif # ./migrate_hosts.pl /etc/hosts hosts.ldif
カレントディレクトリにpasswd.ldif,group.ldif,hosts.ldifが作成されましたので,それぞれのエントリを追加してみましょう。現在はグループ,ホスト情報用の親エントリがない状態ですので,リスト1のような親エントリを登録した後それぞれを登録します(図2)。
リスト1 base.ldif
dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
dc: example
o: example
dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=example,dc=com
objectClass: organizationalUnit
ou: Group
dn: ou=Hosts,dc=example,dc=com
objectClass: organizationalUnit
ou: Hosts
図2 LDIFファイルのインポート
% ldapadd -x -c -D "cn=manager,dc=example,dc=com" -w secret -f base.ldif % ldapadd -x -c -D "cn=manager,dc=example,dc=com" -w secret -f passwd.ldif % ldapadd -x -c -D "cn=manager,dc=example,dc=com" -w secret -f group.ldif % ldapadd -x -c -D "cn=manager,dc=example,dc=com" -w secret -f hosts.ldif
注意点として,migrate_passwd.plは/etc/shadow中の暗号化されたパスワードエントリの頭に{crypt}という文字をつけてuserPassword属性の値とします。したがって,/etc/shadow中にMD5形式のパスワードが定義されていた場合でも,
userPassword: {crypt}$1$YBwRQlei$Lm.vrBe8AUFoxjcka35wT/
のように,cryptと定義してあるのに実際の値はMD5,と,つじつまの合わない形で出力されてしまうため,必要に応じてuserPassword属性の値を平文,または暗号化された形式に修正すべきです。参考までに,エンコード後の文字列を作成するにはslappasswdコマンドを使用します(表1参照)。
表1 暗号方式によるコマンドの違い
| 形式 | コマンド例 |
|---|---|
| CRYPT形式 | slappasswd -h '{CRYPT}' -s パスワード文字 |
| MD5形式 | slappasswd -h '{MD5}' -s パスワード文字 |
| SMD5形式 | slappasswd -h '{SMD5}' -s パスワード文字 |
| SSHA形式 | slappasswd -h '{SSHA}' -s パスワード文字 |
| SHA形式 | slappasswd -h '{SHA}' -s パスワード文字 |
| 平文 | 特になし |
詳細はslappasswdコマンドのマニュアルを参照してみてください。
nscdによるキャッシング
少し話は変わりますが,idコマンドを使うと/etc/nsswitch.confに定義されたネームサービス情報を元にユーザ情報を表示させることができます。たとえば
リスト2 ユーザ情報を100回表示させるスクリプト(count.sh)
#!/bin/sh
i=1
while [ $i -le 100 ]; do
id ldapuser
i=`expr $i + 1`
done
実際にこのスクリプトを実行してみるとわかりますが,LDAP上のユーザ情報を取得するためには,思いの外時間がかかってしまうことに気がつくはずです(
図3 /etc/nsswitch.confにてLDAP検索が有効な場合
# time ./count.sh real 0m8.450s user 0m0.911s sys 0m6.531s
図4 /etc/nsswitch.confにてLDAP検索が無効な場合
# time ./count.sh real 0m3.586s user 0m0.382s sys 0m3.199s
この問題は,ユーザ情報をある程度メモリ上にキャッシュしておけば防止することができます。そのためのデーモンがnscd(Name Service Cache Daemon)です.nscdを使用すると,最初の情報取得時にはLDAPサーバから検索を行い,以降はキャッシュされた値を使用することができます(図5)。
図5 nscdを有効化した状態でcount.sh(リスト2)を実行
# /etc/init.d/nscd start # chkconfig nscd on # time ./count.sh real 0m3.191s user 0m0.361s sys 0m2.578s
このように,キャッシュによって速度的な問題がほぼ解消されたことがわかります.nscdの設定ファイルは/etc/nscd.confです。一般的な運用であればデフォルトの状態から編集する必要はないかもしれませんが,設定も可能であるということを頭の片隅に置いておきましょう。


