そろそろLDAPにしてみないか?

第3回 もう一歩進んだUNIXアカウント

この記事を読むのに必要な時間:およそ 3 分

第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のようなシェルスクリプトを実行すると,LDAP上に登録されたldapuserの情報を100回表示します。

リスト2 ユーザ情報を100回表示させるスクリプト(count.sh)

#!/bin/sh
i=1
while [ $i -le 100 ]; do
  id ldapuser
  i=`expr $i + 1`
done

実際にこのスクリプトを実行してみるとわかりますが,LDAP上のユーザ情報を取得するためには,思いの外時間がかかってしまうことに気がつくはずです図3,4参照)。

図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です。一般的な運用であればデフォルトの状態から編集する必要はないかもしれませんが,設定も可能であるということを頭の片隅に置いておきましょう。

著者プロフィール

中満英生(なかみつひでお)

大学時代に出会ったSolarisがきっかけでUNIXの世界へ。その後ホスティングプロバイダ,データセンターで実務経験を積む傍ら,雑誌記事の執筆や技術セミナーの講師を務める。サーバ設定の他,セキュリティに関する著作や技術者エッセイも執筆経験あり。

コメント

コメントの記入