案外身近な? LDAP
古くから存在するのですが、使用する機会がないとなかなか概念を理解することができないプロトコル、そのひとつがLDAP(Lightweight Directory Access Protocol) ではないでしょうか?少なくとも数年前の筆者はそうでした。LDAPは「エルダップ」と発音します。
HTTPクライアント、HTTPサーバがあるよう、LDAPにもサーバ、クライアントという概念が存在します。LDAPサーバとは一言で言えばデータベースサーバ なのですが、同じようにデータベースに分類されるPostgreSQLやMySQL、OracleなどのRDBMS(Relational Data Base Management System)と比較すると、一長一短があるため、管理対象のデータによって両者の使い分けを行うのが賢い選択です。
たとえばLDAPとはデータ追加や削除よりも検索を重視したプロトコルであるため、顧客、商品情報管理のように頻繁に更新されるデータを扱うのは苦手です。一方アドレス帳のように、毎日検索は行われるが更新はまれである、という場合に効力を発揮します。
こんなところにLDAP
LDAPが有効な例を挙げてみましょう。大学の情報学習室など、生徒50人、端末50台でLinux端末を扱うことを考えてみましょう。当然一人一人にログインアカウントが必要ですので、サーバ管理者は生徒の入学時にすべての端末にそれぞれのアカウント、パスワード情報を作成しなければなりません。
テンプレートとなる端末で、従来通りuseraddコマンドなどを使い全員のアカウントを登録し、そのパスワードファイル(passwd, shadow, group)を全端末にコピーするのがシンプルな管理方法と言えます。
しかし、この方式では、ある生徒が端末A上でパスワードを変更した場合、次回の授業で同じ席に座るとは限りません。端末Bの席に座ってしまえば、パスワードは変更前のままとなっているはずです。このような場合にはパスワードやホームディレクトリを共有し、集中管理するのが一般的です。以前はこのための方法としてNISやNIS+が用いられてきましたが、近年ではこのような場合にLDAPを用いるのが一般的となっています。
ユーザ、パスワード情報をLDAPサーバで一元管理できれば、新規ユーザが増えた場合でも、サーバ1台にアカウントを作成するだけで全員が全ての端末にログインできるようになります。一時的に無効にしたいユーザもサーバ側でフラグをつけてしまえばすべての端末からログインできなくなります。
LDAPサーバで認証情報やさまざまな情報を管理することで、各種クライアントからすべてのデータを参照することができるようになります。「 LDAPサーバ?ああアドレス帳とアカウント管理に使うやつね」 、そう勘違いされる場合もあります。しかしLDAPサーバで管理可能なデータはなにもこれだけではありません。データ参照クライアントが数十、数百台あったとしてもさまざまなデータを集中管理できる、LDAPサーバを用いればそれが可能なのです(図1 ) 。
図1 LDAPを用いて各種データを集中管理する様子
何はともあれセットアップ
百聞は一見にしかず、まずは本当にデータを集中管理できるのか、実際にサーバをセットアップしてみましょう。各項目などの意味はトラブルシューティングも含め、次回以降に説明いたしますので、まずは言われるがままに設定を行ってみて、実際の動作を是非確認してみてください。なお、今回から検証に用いるオペレーティングシステムはCentOS-4.xとします。簡単な構成図は図2 の通りで、2台の端末を使用します(検証環境ではVMWareを使用しています) 。
図2 ネットワーク構成(CentOSを2台使用)
OpenLDAPとはオープンソースのLDAPサーバ、クライアントソフトウェアです。LinuxでLDAPと言えば、事実上OpenLDAPを用いることを意味します。インストールされていない場合は、次のようにインストールを行っておきましょう。
OpenLDAPのインストール
# yum install openldap-servers
# yum install openldap-clients
まずは設定ファイルを作成します。まだ意味は分からなくても良いので、リスト1 の内容で作成してみてください。CentOS以外のディストリビューションや別OSで検証する場合には、各ファイルのパスなどを適宜読み替えるようにしてください。( ※ )
※ パッケージではなくソースからconfigure && makeとしてインストールした場合のファイルパスは/usr/local/etc/openldap/schema/core.schemaのような形となるでしょう。
リスト1 /etc/openldap/slapd.conf
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
database bdb
suffix "dc=example,dc=com"
rootdn "cn=Manager,dc=example,dc=com"
rootpw secret
directory /var/lib/ldap
次にLDAPサーバを起動します(図3 ) 。実際のプロセス名はslapdです。念のため起動に成功しているかどうか、psコマンドで確認してください。
図3 LDAPサーバの起動
# /etc/init.d/ldap start
# ps -ef | grep slapd
ldap 3851 1 0 22:11 ? 00:00:00 /usr/sbin/slapd -u ldap -h ldap:///
LDAPサーバが無事動作していれば、データの追加を行うことが出来ます。今回はLDAPサーバにtestuserというユーザを登録します。ローカル端末の/etc/passwdにはtestuserが存在しない状態で、LDAPサーバ側のアカウントを用い、端末にtestuserとしてログインできるようにする、これでLDAPによるユーザ管理を体感してみましょう。
まずはユーザ情報を登録します。passwd.ldifというテキストファイルをリスト2 の内容で作成してみてください。追加に使用するldapaddコマンドはLDAPサーバの標準ポートとなる389/tcpに対して接続を行いデータを送信しますので、このコマンドはrootではない一般ユーザで使用することができます(図4 ) 。
リスト2 passwd.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: uid=ldapuser,ou=People,dc=example,dc=com
objectClass: account
objectClass: posixAccount
uid: ldapuser
cn: ldapuser
userPassword: ldapuser
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/ldapuser
図4 ldapaddコマンドによるユーザ情報の登録
% ldapadd -x -D "cn=Manager,dc=example,dc=com" -w secret -f passwd.ldif
adding new entry "dc=example,dc=com"
adding new entry "ou=People,dc=example,dc=com"
adding new entry "uid=ldapuser,ou=People,dc=example,dc=com"
以上でサーバ側にアカウントを用意することができましたので、あとはお使いのLinux端末の設定を行い、ログイン時や各種操作時に/etc/passwdや/etc/shadowの情報だけではなく、LDAPサーバを検索するよう設定を変更します。次のようにauthconfigコマンドを使ってLDAP認証を有効にしてください。「 Use LDAP」「 Use LDAP Authentication」を有効にし、次の画面でLDAPサーバのアドレスとBase DNを設定してください。
図5 authconfigコマンドの実行(1)
図6 authconfigコマンドの実行(2)
では設定が終わったら、クライアント側の端末にldapuserとしてログインを試みてみましょう。今回はSSHログインを試してみました(図7 ) 。
皆さんもログイン……できましたか?(※ )
図7 SSHログインの確認とidコマンドによるユーザの確認録
% ssh ldapuser@10.1.0.104
ldapuser@10.1.0.104's password: (ldapuserと入力)
Last login: Tue May 22 00:09:47 2007 from 192.168.0.4
Could not chdir to home directory /home/ldapuser: No such file or directory
-bash-3.00$ id ldapuser
uid=1000(ldapuser) gid=1000 groups=1000
さて、かなりおおざっぱでしたが、これでLDAPという得体の知れないものを使えば、ユーザ情報を/etc/passwdではなくデータベース上(?)で管理できることがわかりました。駆け足の説明できたため、設定ファイルやauthconfigの意味などまったく解説のない状態ですので、次回以降このあたりを解説していきたいと思います。