- 12.1. JDBC Realm/DataSource Realm
- 12.2. OpenLDAP
- 12.3. JNDI Realm
- 12.4. パスワードの暗号化
12.2. OpenLDAP
JNDI Realmを説明する前に、「OpenLDAP」について説明します。OpenLDAPは「ディレクトリサービス」を提供するフリーソフトウェアです。ディレクトリサービスとは、読み取りと検索に特化したデータベースで、ユーザやネットワーク上の資源を管理するために用いられます。DBMSとは異なり、トランザクションやロールバックの機能を持たず、軽量に動作することを目的としています。また複数のサーバが連携することにより、1つの大きなデータベースに見せかけることもできます。DNSはディレクトリサービスの一つと呼ぶことができます。
LDAP(Lightweight Directory Access Protocol)はディレクトリサービスを提供するためのプロトコルです。ディレクトリサービスは、下図のようなツリー形式でデータを管理しており、データの追加や削除・検索も、ツリーのノードを辿る形式で指定します。
ディレクトリサービスは、ツリーの各ノードに名前がついています。「dc=com」「dc=techscore」などがノードについている名前で、それらを「dc=com, dc=techscore, ou=developing」というように、ルートノードから辿っていけば各ノードを特定することができます。ルートノードから辿る形で指定した名前を、「DN(Distinguished Name)」と呼びます。
ツリーの各ノードは、オブジェクトでそれぞれ属性を持ちます。どのような属性を持つかはオブジェクトのクラスによって決まっており、例えば「inetOrgUser」クラスの場合は、「uid」「mail」といった属性を持ちます。属性には必須のものと、任意のものとがあり、必須のものを定義しなければツリーに追加することはできません。
まずOpenLDAPを動作させるためには、設定ファイル(/etc/openldap/slapd.conf)の編集が必要です。編集しなければならない値は、「suffix」「rootdn」「rootpw」の3つです。
suffix "dc=techscore,dc=com" rootdn "cn=Manager,dc=techscore,dc=com" rootpw secret
suffixは該当するOpenLDAPサーバで管理するツリーの、根幹となるノードを決定するものです。オブジェクトはsuffixで指定したノード以下にしか追加することができません。一般的にsuffixの値は、組織のドメイン名など、ツリーを唯一に特定できるものを使用します。これによって複数のツリーからなるディレクトリサービスでも、DNが重ならないようにすることができます。
rootdnは管理者を表すDNの値を指定します。この値も、suffixで指定したノード以下のものにしなければなりません。rootpwは管理者のパスワードです。例では平文パスワードですが、「ldappasswd」コマンドを使用することによって、暗号化パスワードを指定することも可能です。設定ファイルの編集が終了しましたら、サーバを起動させてください。
サーバ起動後、OpenLDAPでオブジェクトを追加するには「ldapadd」、検索するには「ldapsearch」、削除するには「ldapdelete」コマンドを使用します。オブジェクトを追加するには、まず追加するオブジェクトの内容を定義した以下のようなファイルを作成します。LDIF形式と呼ばれ、「:(コロン)」の左側に名前、右側に値を1行ごとに定義し、オブジェクト間の区切りには空行を挟みます。
dn: dc=techscore,dc=com objectclass: dcObject dc: techscore dn: ou=developing,dc=techscore,dc=com objectclass: organizationalUnit ou: developing
オブジェクト定義の先頭に現れる「dn」はDN(Distinguished Name)で、これと次の「objectclass」は必ず必要です。また単独で動作するディレクトリサービスの場合、設定ファイルのsuffixで定義したノード以下にしかオブジェクトを追加できません。またsuffixで定義したノードに1つオブジェクトを定義しなければ、それ以下のノードにオブジェクトを追加することもできません。
オブジェクト定義の2番目に現れる「objectclass」は追加するオブジェクトのクラスを表します。例では「dcObject」と「organizationalUnit」を指定しています。「objectclass」以降に現れるものは、属性の定義です。どのようなクラスがあり、各クラスがどのような属性を持つかについては、スキーマ(/etc/openldap/schema/)に定義されています。スキーマを修正することによって、独自のクラスを作成することもできます。
ファイルが作成できたら、以下のようにコマンドを実行します。「-D」は管理者のDNを、「-w」はパスワードを指定するオプションです。OpenLDAPの設定ファイルに定義されている値を指定してください。「-x」は簡易認証を用いる指定、「-f」はファイル名を指定するオプションです。ファイルに間違いが無ければ、正しくオブジェクトが追加できるはずです。
$ ldapadd -x -D 'cn=admin,dc=techscore,dc=com' -w secret -f (ファイル名)
オブジェクトが追加できたら検索をしましょう。検索には「ldapsearch」コマンドを使用します。「-x」オプションは「ldapadd」と同じですが、検索にはルートである必要は無いので、「-D」「-w」オプションは不要です。「-b」は検索を行うノードを指定するオプションです。例の場合は、「dc=techscore,dc=com」以下にあるオブジェクト全てが表示されます。
$ ldapsearch -x -b 'dc=techscore,dc=com'
特定の条件を満たすオブジェクトのみを検索したい場合には、引数に検索条件を指定します。
$ ldapsearch -x -b 'dc=techscore,dc=com' '(ou=developing)'
検索条件は括弧で囲み、名前と値を「=」とつないで指定します。名前はLDIFファイルで指定したものであれば、「dn」以外のものは全て指定できます。またワイルドカード「*」を用いることによって、
$ ldapsearch -x -b 'dc=techscore,dc=com' '(ou=d*)'
「ouがdではじまるオブジェクト」といった指定をすることも可能です。
最後にオブジェクトの削除について説明します。オブジェクトを削除するには、「ldapdelete」コマンドを使用します。使用法はほとんど「ldapadd」と同じです。ルートでなければオブジェクトの削除は行えないので、「-D」「-w」オプションを指定します。引数に削除したいオブジェクトのDNを指定することで、削除を行うことができます。
$ ldapdelete -x -D 'cn=admin,dc=techscore,dc=com' \ -w secret 'ou=developing,dc=4dd,dc=co,dc=jp'
(実習課題3)
OpenLDAPを使用し、以下を実行しなさい。
- 「organizationalUnit」以外のクラスのオブジェクトを追加する
- 追加したオブジェクトを検索する
- 追加したオブジェクトの下に、もう1つ別のオブジェクトを追加する
- 検索条件を指定し、オブジェクトを検索する
- 追加した2つのオブジェクトを削除する