計算機が新しく何台も導入された時など、いちいち新しいユーザーを作るのは面倒なので、ディレクトリ・サービスというものを利用する(2005.1.14)。
Vine Linux にインストールした時の記録です。
- 基本的な事
LDAP で用いられる識別名(dn, distinguish name)の例
属性名 | 意味 |
cn | common name |
objectclass | オブジェクトクラス |
dc | domain component |
uid | user id |
|
もっといっぱいあるらしい。
- インストール
ソースファイルからコンパイルするのが王道だと思うが、何故かうまくいかなくて、apt-get で簡単にバイナルをインストールした。
ここに、ldap コマンド群でよく出てくるオプションの意味をいくつか...
-x | 認証の際に SASL を使用しない指定 |
-D | LDAP サーバを操作するユーザの指定 |
-W | パスワードを入力するためのもの。「-D」で指定した識別名のパスワードを用いる。「cn=Manager,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp」のパスワードは、slapd.conf で指定する「rootpw」になる。 |
- 初期設定
まずは、/etc/openldap/slapd.conf を編集する。
いくつかの行のコメントアウトを外して、LDAPの走るホストの設定に合わせて書き換えればいい。
書き換える所は、おそらく、pidfile, argsfile, database, suffix, rootdn, rootpw, directory の行だと思う。
suffix行は、例えばホスト名が oolong.s.chiba-u.ac.jp なら、
suffix "dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp"
のようになるハズ。
database に関しては、ldbm(GNU DBM) では何故か上手く起動しなかったから、bdb(BerkeleyDB) を使用した。
ちなみに、/etc/openldap/slapd.conf の属性は、owner も group も ldap にしておいて、アクセス権限を 700 に設定しておくのがいいらしい(owner,group が root だと、サービスが起動しなかった。)。
また、ユーザー認証に利用したい場合は、nis.schema をインクルードしていなければならにから、include行も調べておく必要はある。
- 起動 etc.
# service ldap restart
で、起動させる。動作確認は次のように ldapsearch を利用して namingContexts っていうのを表示させるといいらしい。
> ldapsearch -h localhost -x -b '' -s base '(objectclass=*)' namingContexts
正常に起動したら、システム起動時に起ち上がるように設定する。
# chkconfig ldap on
- ユーザー認証への利用(サーバの設定)
ユーザー認証には posixAccount という objectclass を用いる。
Unix の場合にはパスワードを暗号化して、別ファイルに格納しているらしく(/etc/shadow)、それを利用するには objectclass に shadowAccount も加える必要がある。
とりあえず、ユーザを登録するには...
objectclass に posixAccount と shadowAccount を利用した場合の LDIF ファイルは次のようになる。
> cat foo.ldif
dn: uid=foo,ou=People,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp
uid: foo
cn: foo bar
objectclass: posixAccount
objectclass: shadowAccount
objectclass: account
uidNumber: 1001
gidNumber: 1001
gecos: ,,,
userPassword: {CRYPT}暗号化された文字列
shadowLastChange: 12772
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
homeDirectory: /home/foo
暗号化されたパスワードを得るには、slappasswd というコマンドを使用して、
> /usr/sbin/slappasswd -h '{CRYPT}' -s password -c "%s"
とすればよい。
これを LDAP サーバに登録するには、
> ldapadd -x -D 'cn=Manager,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp' -W -f foo.ldif
とする。
登録したユーザのパスワードを設定するには、
> ldappasswd -x -D 'cn=Manager,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp' -W 'uid=foo,ou=People,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp' -S
New passwd: <--- 新規パスワードを入力
Re-enter new passwd:
Enter bind passwd: <--- LDAP のパスワード(つまり、ここでは、Managerの)
Result: Success(0)
とすることで、パスワードの設定をすることができる。passwd コマンドを使用できる様に既に設定してある場合は、passwd コマンドで同様のことが可能だが、そのときも Manager のパスワードは必要と思われる。
LDIF ファイルで何かしらユーザ(今の場合 foo というユーザ)を登録したら、とうとう登録したアカウント情報をシステムで参照できるようにする。
まだ、システムは foo というユーザの登録を認識できないから、
> id foo
としても、ユーザの情報は得られない。
そこで、nsswitch.conf と ldap.conf ファイルを変更する必要がある。
まず、ldap.conf ファイル内に、
host 127.0.0.1
base dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp
のように、ホストの場所、検索ベースを書き込んでやる。
そして、nsswitch.conf には、
passwd: compat ldap
group: compat ldap
shadow: compat ldap
としてやれば、id コマンドで foo の情報が得られるようになる。
実際にユーザを登録していく時には、各ユーザがどのグループに属しているかを考えなければならないので、まず、グループを登録することから始めた方がいいかもしれない。
グループは posixGroup という objectclass で登録することができ、そのグループIDを各ユーザに付けてやればよいだろう。
また、既に登録されているユーザを調べたいときは、ldapsearch を使って、
> ldapsearch -h localhost -x -b 'dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp' '(objectclass=*)' '*' '+'
とするか、もしくは slapcat を使って、
# slapcat
とすれば登録されているユーザは全て見ることができる。
登録されているユーザを削除するには ldapdelete コマンドを用いて、
> ldapdelete -x -D 'cn=Manager,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp' -W 'uid=username,ou=People,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp'
の様にすればいいらしい。これで、LDAP のユーザ情報は消えるが、各マシンに存在しているディレクトリなどは削除されないで残っている。
- ユーザー認証への利用(クライアントの設定)
クライアント側は、ユーザがログインしようとして認証を行なうときに、そのホストの passwd ファイルなどよりも先に LDAP サーバを参照するように設定してやればよい。
そのためには、クライアント側に nss_ldap と pam_ldap というLDAP用のモジュールが必要で、ないならインストールする必要がある。
あったら、それら用のコンフィグ・ファイル(/etc/libnss_ldap.conf と /etc/libpam_ldap.conf)を次の様に作る。
> cat /etc/libnss_ldap.conf
# Your LDAP server.
host 192.168.1.99
# The distinguished name of the search base.
base dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp
rootbinddn cn=Manager,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp
> cat /etc/libpam_ldap.conf
# Your LDAP server.
host 192.168.1.99
# The distinguished name of the search base.
base dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp
rootbinddn cn=Manager,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp
pam_crypt local
そしたら、rootbinddn に指定した識別名のパスワードを /etc/ldap.secret に書いておき、当然パーミッションを 600 にしておく。
さらに、passwd や group で LDAP を使用するように、/etc/nsswitch.conf を下記のように修正する。
passwd: compat ldap
group: compat ldap
shadow: compat ldap
これは、クライアント側だけでなくて、サーバ側でも LDAP を使用するなら同じこと。
さらに、/etc/pam.d/ ディレクトリの中の login と sshd に下記の行を加える。
session required /lib/security/pam_mkhomedir.so skel=/etc/skel/ umask=0022
これは、ログインした時にホームディレクトリがなかったら /etc/skel/ から必要なものをコピーしてきて、新しくホームディレクトリを作成するようにしている。
また、passwd コマンドでパスワードを変更できるようにするには、/etc/pam.d/passwd を修正する必要がある。
password required pam_unix.so nullok obscure min=4 max=8
のところを、
password sufficient pam_ldap.so
password required pam_unix.so nullok obscure min=4 max=8
のように修正してやればよい。
もしかしたら、/etc/pam.d/system-auth を修正するのかもしれないけど...
authconfig というツールがあったらそれを利用するとこれらの修正が簡単になる。
- トラブル・シューティング
- Object class violation (65)
下記のような LDIF ファイルを登録しようとしたら、エラーが出て登録が出来ない。
> cat kobayash.ldif
dn: uid=kobayash,ou=nakayamal,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp
uid: kobayash
objectclass: posixAccount
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/kobayash
loginShell: /bin/tcsh
cn: Ryo Kobayashi
> ldapadd -x -D 'cn=Manager,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp' -W -f kobayash.ldif
Enter LDAP Password:
adding new entry "uid=kobayash,ou=nakayamal,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp"
ldapadd: update failed: uid=kobayash,ou=nakayamal,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp
ldap_add: Object class violation (65)
additional info: no structural object class provided
何故だろう?
ANSWER
nis.schema で posixAccount を見てみると、
objectclass ( 1.3.6.1.1.1.2.0 NAME 'posixAccount' SUP top AUXILIARY
となっており、STRUCTURAL でなく、AUXILIARY なんで、構造オブジェクトをもっていないらしくエラーがでるらしい。
なんで、解決策は、
objectclass: account
を加える。これの宣言は cosine.schema にある。こうすると問題なく通る。
参考文献内では、これは載っていないところをみると、バージョンによって異なるのかもしれない。
- ssh の場合にホームディレクトリが作成されない
初めユーザがホストにログインする場合には、そのユーザのホームディレクトリを作成する必要があるが、コンソールからログインした場合にはホームディレクトリが作成されるが、ssh でログインした場合にはホームディレクトリが作成されない。
ANSWER
どうも OpenSHH の権限分離(Privilege Seperation)に関係しているらしいので、sshd_config の UsePrivilegeSeperation を no に設定しておくことが必要らしい。ここのことは詳しくは知らない...
- 一度登録したはずのものがシステムの再起動後になくなる
既に登録したはずのユーザがLDAPディレクトリからなくなっていることがあった。
なぜ?
- 参考文献
UNIX USER 2002.1 「認証はLDAPで」
Linux magazine 2005.2 「LDAPのすすめ」
The SLAPD and SLURPD Administration Guide
|