libnss-ldapのインストール

nssとはName service switchのことで、/etc/passwdとか/etc/hostsとかを覗くプログラムは、 /etc/nsswitch.confファイルを参照してその指示に従って 実際に/etc/passwdを見るのかそれともldapやnisなどの外部サービスを見るのか、 というのを設定できるようになっています。
# apt-get install libnss-ldap
LDAP server host address: 127.0.0.1
distinguished name of the search base: dc=hoehoe,dc=japan
LDAP version to use: 3
database requires login: No
make configuration readable/writeable by owner only: No
nsswitch.conf is not managed automatically.
上記の設定項目は/etc/libnss-ldap.confファイルに書かれます。 基本的にはlibnss-ldapはクライアントなので/etc/ldap/ldap.confの設定項目と 同じように設定します。

/etc/nsswitch.confを編集してlibnss-ldapを使うようにします。

# vi /etc/nsswitch.conf

# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap

hosts:          files dns
networks:       files
...

ユーザの追加

では実際にユーザmokeを追加して実験してみましょう。 次のようなファイルを作っておきます。
# vi moke.ldif
dn: cn=moke,ou=People,dc=hoehoe,dc=japan
objectClass: posixAccount
objectClass: posixGroup
cn: moke
uid: moke
userPassword: abcdef
uidNumber: 1111
gidNumber: 1111
loginShell: /bin/bash
homeDirectory: /home/moke
gecos: Sample User
ここで1つのdnでpasswdのエントリとgroupのエントリを兼ねさせています。 libnss-ldapがエントリを/etc/passwdとして使う時にはuidをユーザ名、uidNumberをユーザ番号として用い、 /etc/groupとして使う時にはcnをグループ名、gidNumberをグループ番号として用いるので、 このような共有エントリを1つでdebian流の「新ユーザ毎に新グループ名」に対応できます。 なお、dnの項目は一意になればいいので、
dn: gecos=Sample User,ou=People,dc=hoehoe,dc=japan
とかでもかまいません。
libnss-ldapがどの項目をどう使うかは/usr/doc/libnss-ldap/rfc2307.txt.gzを参照してください。

追加するにはldapaddを用います。 追加する権限はcn=admin,dc=hoehoe,dc=japanにしかないのでこれを指定します。

# ldapadd -x -W -D "cn=admin,dc=hoehoe,dc=japan" < moke.ldif
Enter LDAP Password: 12345678
adding new entry "cn=moke,ou=People,dc=hoehoe,dc=japan"
slapcatやldapsearchで追加されたか確認してみましょう。

追加されていたらユーザmokeが利用できると思います。

# cd /home
# mkdir moke
# chown moke moke …ユーザ名の解決
# chgrp moke moke …グループ名の解決
# ls -ln
drwxr-sr-x    2 1111     1111         4096 Jul 24 17:59 moke
# ls -l
drwxr-sr-x    2 moke     moke         4096 Jul 24 17:59 moke …番号の解決
できましたか?んじゃログイン。
login: moke
Password: abcdef
Login incorrect
あれ?できませんね?

ログインするためにはlibpam-ldapを導入する必要があります。 実際には下に示すように、特定の条件ではlibnss-ldapだけでログインも可能なんですが、

という理由のため、libpam-ldapの導入をします。

libnss-ldapによるログイン

参考までにlibnss-ldapだけでのログイン設定方法を説明します。

まずCRYPTされたパスワードを用意します。これはslappasswdというユーティリティを用います。

# slappasswd -h "{CRYPT}"
New password: abcdef
Re-enter new password: abcdef
{CRYPT}zZWMO5gSs3.G2
これを先ほどのmoke.ldifファイルのuserPassword:の項目と入れ替えます。
# vi moke.ldif
dn: cn=moke,ou=People,dc=hoehoe,dc=japan
objectClass: posixAccount
objectClass: posixGroup
cn: moke
uid: moke
userPassword: {CRYPT}zZWMO5gSs3.G2
uidNumber: 1111
gidNumber: 1111
loginShell: /bin/bash
homeDirectory: /home/moke
gecos: Sample User
ユーザを再作成します。ldapmodifyでもいいです。
# ldapdelete -x -W -D "cn=admin,dc=hoehoe,dc=japan" "cn=moke,ou=People,dc=hoehoe,dc=japan"
Enter LDAP Password: 12345678
# ldapadd ...
次に、/etc/libnss-ldap.confを編集します。 ログインを可能とするためにはuserPasswordフィールドを読めないといけませんが、 現在はanonymousの設定になっているためです。
# vi /etc/libnss-ldap.conf
...
# The distinguished name to bind to the server with
# if the effective user ID is root. Password is
# stored in /etc/ldap.secret (mode 600)
#rootbinddn cn=manager,dc=padl,dc=com
rootbinddn cn=admin,dc=hoehoe,dc=japan
# touch /etc/ldap.secret
# chmod 600 /etc/ldap.secret
# echo 12345678 > /etc/ldap.secret
これでログインできるようになります。実験終わったら元にもどしておきましょう。