第1回から紹介してきたLDAPによるUNIXアカウント管理ですが、
MigrationToolsによる既存ユーザのインポート
前回までは手動でLDIFファイルを作成し、
これらは/etc以下にあるパスワード、
% 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.
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
% 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
注意点として、
userPassword: {crypt}$1$YBwRQlei$Lm.vrBe8AUFoxjcka35wT/
のように、
形式 | コマンド例 |
---|---|
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によるキャッシング
少し話は変わりますが、
#!/bin/sh
i=1
while [ $i -le 100 ]; do
id ldapuser
i=`expr $i + 1`
done
実際にこのスクリプトを実行してみるとわかりますが、
# time ./count.sh real 0m8.450s user 0m0.911s sys 0m6.531s
# time ./count.sh real 0m3.586s user 0m0.382s sys 0m3.199s
この問題は、
# /etc/init.d/nscd start # chkconfig nscd on # time ./count.sh real 0m3.191s user 0m0.361s sys 0m2.578s
このように、
インデックス設定
ディレクトリエントリ数が少ない場合にはとくに問題ないのですが、
#!/bin/sh
i=1
while [ $i -le 5000 ]; do
echo "dn: uid=ldapuser$i,ou=People,dc=example,dc=com"
echo "objectClass: account"
echo "objectClass: posixAccount"
echo "uid: ldapuser$i"
echo "cn: ldapuser"
echo "userPassword: ldapuser$i"
echo "loginShell: /bin/bash"
echo "uidNumber: 10$i"
echo "gidNumber: 10$i"
echo "homeDirectory: /home/ldapuser$i"
echo ""
i=`expr $i + 1`
done
% ./add.sh | ldapadd -x -c -D "cn=manager,dc=example,dc=com" -w secret
この状態で再びidコマンドを使って適当なエントリの情報を取得してみます(図7)。
% time id ldapuser996 uid=10996(ldapuser996) gid=10996 groups=10996 real 0m10.339s user 0m0.002s sys 0m0.055s
なんと、
LDAP、
ということで、
今回問題となっているのは、
さて、
local4.* /var/log/ldap.log
# touch /var/log/ldap.log # chmod 600 /var/log/ldap.log # /etc/init.d/syslog restart
syslog.
それではidコマンドを実行しつつ、
% id ldapuser /euid=1000(ldapuser) gid=1000 groups=1000
Jul 15 17:19:31 localhost slapd[11014]:
このように、
設定値 | 意味 | 検索例 |
---|---|---|
pres | 存在 | uid=* |
eq | 等価 | uid=ldapuser |
approx | 近似 | uid=ldapusr |
sub | 部分一致 | uid=ldap* |
none | 無し | - |
ldap.
filter="(&(objectClass=posixAccount)(uid=ldapuser))"
filter="(&(objectClass=posixAccount)(uidNumber=1000))"
filter="(&(objectClass=posixGroup)(gidNumber=1000))"
filter="(&(objectClass=posixGroup)(|(memberUid=ldapuser)(uniqueMember=uid=ldapuser,ou=people,dc=example,dc=com)))"
これにより、
index objectClass,uid,uidNumber,gidNumber,memberUid,uniqueMember eq
このように、
equality index of attribute "uniqueMember" disallowed
というエラーが表示され、
index objectClass,uid,uidNumber,gidNumber,memberUid eq
というインデックスのみを設定してみました。ちなみに最近の新しいバージョンのOpenLDAPではこのエラーは出ないことを確認しています(図10、
# /etc/init.d/ldap stop # slapindex # chown -R ldap:ldap /var/lib/ldap # /etc/init.d/ldap start
# time id ldapuser3008 uid=103008(ldapuser3008) gid=103008 groups=103008 real 0m0.141s user 0m0.021s sys 0m0.102s
最終的には、
パスワードの暗号化
今までは便宜的にslapd.
rootpw {SSHA}te0mm46b0qnQr7C/K8cWD56qi/8KhKSK
access to attrs=userPassword
by anonymous auth
by self write
by * none
access to *
by * read
accessからはじまる部分はACL設定です。1行では長くなってしまいわかりにくいので、
チェック項目
LDAPサーバでUNIXアカウントを管理するための簡単なまとめです。これ以外でも冗長化対策や細かい点で改善すべき箇所はあるでしょうが、
- サーバ側で適切なACLは設定されているか
- サーバ側でパスワードは暗号化されているか
- クライアント側でnscdは動いているか
- LDAP上のユーザ名を用いてsshなどによるログインが可能か
- suで他ユーザにスイッチできるか
- passwdコマンドでLDAP上のパスワードを変更可能か
それでは次回をお楽しみに。