でびるまんのための えるだっぷ はうつー しょのにー $Id: ukai.txt,v 1.2 2001/07/02 03:26:03 ukai Exp $ なんかいいネタがおもいつかないので、昨年の「でびるまんのためのえるだっぷ はうつー」のつづきを書いてみることにしますかね。この前も「つづく(?)」でおわってたし。 前回では、単にクライアントサイドだけの話だけだったので今回はサーバサイドの話をつらつらと書いてみることにします。OpenLDAP 1.xとOpenLDAP 2.xではやや違うので両方を紹介してみましょう。 ■ OpenLDAP 1.x を使う場合 もうpotatoにしか残ってなさげですが、OpenLDAP 1.xの方がシンプルなのでまずこちらから説明しましょう。OpenLDAP 1.xでのLDAPサーバはopenldapdパッケージとなっています。これをapt-getしましょう。するとdebconfでいくつか質問してくるのでそれに答えます。以下はdebconfのpriorityをcriticalにした場合です。もっと低いpriorityにしておくといろいろ質問されるはずです。 # apt-get install openldapd OpenLDAP Server Configuration (slapd) ------------------------------------- Please enter a password for the admin account. It should be atleast 6 characters long and preferably different than any of the passwords for your login accounts (especially the root account). Admin's Password [rootdnむけぱすわーど] Please enter the password again. Enter again [rootdnむけぱすわーどもう一回] これで以下のentryが作成されているはず。defaultのデータディレクトリは/var/lib/openldap/です。ここにいくつかのファイルが作成されています。ldbmcatを使うことでその中身を簡単に見ることができます。 # ldbmcat /var/lib/openldap/id2entry.dbb 1 dn: dc=jp objectclass: top objectclass: domain dc: jp 2 dn: dc=or, dc=jp objectclass: top objectclass: domain dc: or 3 dn: dc=debian, dc=or, dc=jp objectclass: top objectclass: domain dc: debian 4 dn: ou=People, dc=debian, dc=or, dc=jp objectclass: top objectclass: organizationalUnit ou: People 5 dn: cn=admin, ou=People, dc=debian, dc=or, dc=jp # このヒトがrootdnに objectclass: top userpassword: {crypt}[ぱすわーどをくりぷとしたもの] cn: admin 6 dn: ou=Roaming, dc=debian, dc=or, dc=jp objectclass: top objectclass: organizationalUnit # /etc/openldap/slapd.confをいじってみましょう。とりあえずdefaultでもほぼ問題ないはず。 ---------------------------------------------------------------- # This is the main ldapd configuration file. # Schema and objectClass definitions include /etc/openldap/slapd.at.conf include /etc/openldap/slapd.oc.conf # Schema for supporting Netscape Roaming include /etc/openldap/netscape_roaming.at.conf include /etc/openldap/netscape_roaming.oc.conf # Schema for supporting Debian Package Directory entries #include /etc/openldap/debian.at.conf #include /etc/openldap/debian.oc.conf # Schema check allows for forcing entries to # match schemas for their objectClasses's # スキーマのチェックをするかどうか # とりあえずoffでいいはず schemacheck off # Where clients are refered to if no # match is found locally # みつかんなかった時にどこを参照しにいくか # 特に変更しなくてもいいはず referral ldap://ldap.four11.com # Where the pid file is put. The init.d script # will not stop the server if you change this. pidfile /var/run/slapd.pid # Read slapd.conf(5) for possible values loglevel 0 ####################################################################### # ldbm database definitions ####################################################################### # The backend type, ldbm, is the default standard database ldbm # The base of your directory # domainname からつくった basedn suffix "dc=debian,dc=or,dc=jp" # Where the database file are physically stored # ここにdataが格納されてる。rootのみrw directory "/var/lib/openldap" # Save the time that the entry gets modified # これつけておくとcreatorsnameとかmodifytimestampとかがつく lastmod on # By default, only read access is allowed defaultaccess read # For Netscape Roaming support, each user gets a roaming # profile for which they have write access to access to dn=".*,ou=Roaming,dc=jp,dc=hpl,dc=hp,dc=com" by dnattr=owner write # The userPassword by default can be changed # by the entry owning it if they are authenticated. # Others should not be able to see it, except the # admin entry below # この設定により、自分のぱすわーどは変更可能 # また cn=admin,ou=People,dc=debian,dc=or,dc=jp のヒト # も変更可能 access to attribute=userPassword by dn="cn=admin,ou=People,dc=debian,dc=or,dc=jp" write by self write by * none # The admin dn has full write access # この設定でcn=admin,ou=People,dc=debian,dc=or,dc=jpのヒトはなんでも書ける access to * by dn="cn=admin,ou=People,dc=debian,dc=or,dc=jp" write # End of ldapd configuration file ---------------------------------------------------------------- 以上の設定ではaclによりcn=admin,ou=People,dc=debian,dc=or,dc=jpのヒトがなんでもできるようにしてますが、かわりにrootdnを設定して rootdn "cn=admin,ou=People,dc=debian,dc=or,dc=jp" とか設定しておいてもおけ。rootdnの人は特権扱いされるのでなんでもできます。 もしrootdnのpasswordを忘れたらrootpwを一時的に設定すればいいです。 rootpw ぱすわーど を追加しておいてもいい。これが優先されます。{crypt}とかしないとplain扱いなので非常時だけがいいでしょう。 これで/etc/init.d/openldapd startでslapdが動いているはず。 ○ためしに、検索してみましょう。 % ldapsearch -h localhost -b 'dc=debian,dc=or,dc=jp' 'cn=admin' cn=admin, ou=People, dc=debian, dc=or, dc=jp objectclass=top cn=admin よさそうですね。 ○追加してみませう % echo 'dn: uid=ukai, ou=People, dc=debian, dc=or, dc=jp objectclass: top uid: ukai cn: Fumitoshi UKAI sn: ukai ' | ldapadd -h localhost -D 'cn=admin,ou=People,dc=debian,dc=or,dc=jp' -W Enter LDAP Password: [ぱすわーど] adding new entry uid=ukai, ou=People, dc=debian, dc=or, dc=jp 追加できたようです。 dn: の最初のcomponentをattributeに含めるのを忘れないように(この場合はdn: uid=ukai, ... なのでuid: ukaiをいれておく) ちなみにldapaddのオプションは -D でcn=adminとしてつなぐ -W でpasswordをきいてくる という意味です。 ○確認してみよう。 % ldapsearch -h localhost -b 'dc=debian,dc=or,dc=jp' uid=ukai uid=ukai, ou=People, dc=debian, dc=or, dc=jp sn=ukai creatorsname=cn=admin, ou=People, dc=debian, dc=or, dc=jp createtimestamp=20000712074032Z objectclass=top cn=Fumitoshi UKAI uid=ukai できてるね! あとはこれをババソとやればいいわけです。 追加するデータは ldif で適当に書いておけばいいでしょう。 ○修正しましょう 修正するにはldapmodifyを使います。 dn: uid=ukai,ou=People,dc=debian,dc=or,dc=jp objectclass: top uid: ukai sn: ukai cn: Fumitoshi UKAI mail: ukai@linux.or.jp を dn: uid=ukai,ou=People,dc=debian,dc=or,dc=jp objectclass: top uid: ukai sn: ukai cn: Fumitoshi UKAI mail: ukai@debian.or.jp に変更する場合、mailアトリビュートの変更なので次のようにします。 % echo 'dn: uid=ukai,ou=People,dc=debian,dc=or,dc=jp changetype: modify replace: mail mail: ukai@debian.or.jp ' | ldapmodify -D 'cn=admin,ou=People,dc=debian,dc=or,jp' -W これでpasswordを聞いてくるのでcn=admin,ou=People,dc=debian,dc=or,dc=jpのpasswordをいれれば変更されます。 changetype:で変更の仕方を指定してます。modifyというのが既存のentryを修正するという意味です。次の行はreplace: mailですが、mailアトリビュートをおきかえるという意味です。おきかえるのではなく追加する場合はadd: mailとします。削除する場合はdelete: mailです。次にどう変更するかを指定してます。replace: mailでmail: ukai@debian.or.jpなので前にあったmailアトリビュートをけしてかわりにmail: ukai@debian.or.jpにいれかえるという意味になるわけです。 ○削除するには 削除するにはldapdeleteを使います。 % ldapdelete -D 'cn=admin,ou=People,dc=debian,dc=or,dc=jp' -W '削除したいdn' で消せます。 ■ OpenLDAP 1.xでアカウントを管理する場合 では、OpenLDAP 1.xを使ってアカウントを管理する例を簡単に紹介します。 ○アカウント情報をLDAPにつっこむ アカウント情報をLDAPにつっこむ場合は/etc/openldap/nis.oc.confに書かれているobjectclass posixAccountおよびobjectclass shadowAccountなんかを使います。 これはそれぞれ objectclass posixAccount requires objectClass, cn, uid, uidNumber, gidNumber, homeDirectory allows userPassword, loginShell, gecos, description objectclass shadowAccount requires objectClass, uid allows userPassword, shadowLastChange, shadowMin, shadowMax, shadowWarning, shadowInactive, shadowExpire, shadowFlag, description なので、アカウント情報は以下のようなLDIFになります。 dn: uid=foo,ou=People,dc=debian,dc=or,dc=jp objectclass: posixAccount objectclass: shadowAccount cn: foo bar uid: foo uidNumber: 2000 gidNumber: 2000 homeDirectory: /home/foo loginShell: /usr/bin/zsh gecos: foo bar userPassword: {crypt}ぱすわーど shadowLastChange: 10126 shadowMin: 0 shadowMax: 99999 shadowWarning: 7 /etc/passwdファイルの :x::::: /etc/shadowファイルの :::::::: に対応してます。あとはこれをLDAPにババソとつっこんでおきます。 これを直接LDAPから使えるようにするにはlibnss-ldapを使います。 apt-get install libnss-ldapするとdebconfでLDAP server名、search baseのdn名などを聞いてくるでしょう。とにかくそれによって/etc/libnss-ldap.confが設定されます。 例えばこんなかんじになります。(コメントは省略) # Your LDAP server. Must be resolvable without using LDAP. host 127.0.0.1 # The distinguished name of the search base. base dc=debian,dc=or,dc=jp # The LDAP version to use (defaults to 3 if supported by client library) ldap_version 2 このように設定しておけば host 127.0.0.1で動いているLDAPサーバでbase dc=debian,dc=or,dc=jpで指定されている検索ベース以下でobjectclass posixAccountなエントリをアカウントとみなすようになります。これがちゃんとname service switchで使われるようにするためには/etc/nsswitch.confのpasswdやshadowを以下のように設定します。 passwd: compat ldap shadow: compat ldap compatとしておけば/etc/passwdや/etc/shadowにあるのを従来通りにみることになります。ldapを追加することで/etc/passwdや/etc/shadowにないものをlibnss-ldap経由でアカウント情報を見ることになります。例えばアカウントfooをLDAPにいれてちゃんと設定できていれば % id foo uid=2000(foo) guid=2000 groups=2000 のように表示されます。/etc/nsswitch.confの設定とかをちゃんとしていないと % id foo id: foo: No such user のようにちゃんと見つけることができません。 ○複数のホストで参照する ただ一台だけで動かすのならLDAPを使うありがたみはあまりありません。やはり複数のホストで統一したアカウント情報の管理ができるというのがLDAPのうれしいところといえるでしょう。そう、NISと同じですね。LDAPをうまく運用すればNISと同じような感じで使うことができるでしょう。 一番簡単な方法はクライアントな環境でlibnss-ldapをいれて/etc/libnss-ldap.confのhost:でLDAPサーバ名を指定しておいて、あとは上と同じようにnsswitch.confを設定しておくというものです。 getpw*()なんかをよぶたびにLDAP検索をおこなってしまうのであんまりはやくないです。nscd (GNU C Library: Name Service Cache Daemon)を使えばキャッシュされるので毎回LDAP検索をしなくなるので速くなることがみこめるでしょう。 注意しないといけないのはLDAP検索できるとするとネットワーク上で盗み見されてしまう可能性があるということです。それを防ぎたいのならOpenLDAP 2.xにしてSSL/TLSを有効にするなどをする必要があるでしょう。 ○ちなみに ちなみにdebian.orgなんかではlibnss-ldapは直接使わずにLDAPのデータからdbをつくってnsswitch.confではdbを参照するようにしてますね。これだとdbをscpでコピーすればそれなりのセキュリティをたもつことができます。またネットワークが不安定な時にもdbで格納されていれば大丈夫というメリットがあります。ただしLDAPが更新されてからdbに反映されるまでのタイムラグがどうしようもないというデメリットがあります。 ■レプリカ 一台のLDAPサーバに依存してしまうのは、そのサーバが落ちたりしたことを考えると危険です。また一台に負荷が集中してしまうと遅くなってしまってうれしくありません。 そういったことを考えてLDAPではレプリカといってデータの複製を作れるようになっています。レプリカを設定することで同じデータをもつ複数のLDAPサーバを動かすことができます。一台をマスターにして、変更はそのマスターサーバに対しておこない、変更が行なわれるとマスターからスレーブに通知がなげられて変更がスレーブに波及していくことになります。これによってレプリカはすべて同じデータを提供することができるようになるわけです。 まずマスターの方でslapd.confに次のような設定をします。 replica host=スレーブホスト binddn=スレーブのレプリカDN bindmethod=simple credentials=レプリカDNのパスワード replogfile replica.log このように設定しておくとマスターの方で更新されると以下のようにしてスレーブに更新が伝えられます。 * まずreplica.logに変更情報が書きこまれます。 このファイルの内容はldapmodifyで使ってるような書式になってます。 * slurpdがreplica.logをよみこんでslurpdがreplicaで指定したスレーブホストに LDAPで接続します。その時レプリカDNとそのパスワードでbindして replica.logに書かれたファイルを適用します。 適用できた内容はreplica.logから削除されます。 このようにしてレプリカに情報が伝えらるわけです。 以上のことからわかるようにスレーブでは「レプリカDN」と「レプリカDNのパスワード」でbindできるようにして、かつ「レプリカDN」はrootdnなみにその内容に書けるようになってる必要があります。 updatedn=レプリカDN access * by dn=レプリカDN write レプリカを動かす順番としては * マスターのslapdを停止 * マスターのデータベースをスレーブにうつす。 つまりマスターの/var/lib/openldap/以下のファイルをスレーブにコピー。 * マスターおよびスレーブのslapdを起動 Debianだとreplicaラインがあるとslurpdも起動されるのでこれでok 一旦、動きはじめればあとは特にすることはないですね。 ■とりあえず おわり ここに書いたままだとsecurity的にアレなのでsshでトンネルしてやるとかするといいかも。というあたりで締切ぎみなので、おわるっす。 つづく(かも? っていうか某U誌に書かないといけなかったような記憶?) 参考文献 * Linux Conference 2000/Fall: チュートリアル「LDAP概論と応用」 これを見なおして書いたね! (ワラ * `Understanding and Deploying LDAP directory services' - MacMillan Network Architecture and Development Series' by Timothy A. Howes, Ph.D., Mark C. Smith, and Gordon S. Good ISBN 1-57580-070-1 日本語版はどうなっているのでしょうか?