UNIXな生活
更新:2004/11/29  
Linuxな生活  FreeBSDな生活
 Solarisな生活
 JAVAな生活
 Practical use
 掲示版
OpenLDAPの使用方法とスキーマ

ここでは、OpenLDAPの利用方法やデータ定義ファイルのスキーマについての、一般的なことを解説します。

OpenLDAPの設定
OpenLDAPの設定は、slapd.confで行います。主な設定項目は以下の通りです。
設定値解    説
includeスキーマ定義情報を取りこみます。
LDAPのRFCで定義されている属性名やobjectClassが使用できるようになります
pidfilePIDファイルの保存場所
databeseバックエンドDBの設定、2.0.xはldbm、2.1.xはbdbです。
suffix該当DBで使用するDNサフィックスを指定します。
このサフィックスはLDAPサーバのネーミングコンテキストとして使用されます。
DIT設計に合わせて変更してください。
rootdn特権ユーザーでDBの全アクセス権を有します。このユーザは実際にDBに存在する必要ありません
rootpw特権ユーザーのパスワード(暗号化パスワードの利用推奨)
directoryLDBMまたはBDBの置き場所を指定します。
複数のdbを使用する場合は、別々のディレクトリを指定します
indexインデックスを指定します
(DBですから、index付けて検索性能を上げるんです。付けすぎには注意)
indexを編集したらコマンドでindexを再構築してください。
デフォルトは、objectClass eq

例)slapd.confの設定(rootdn = o=example,c=JP)
include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/inetorgperson.schema
pidfile         /var/run/slapd/slapd.pid
database        bdb
suffix          "o=exmaple,c=JP"
rootdn          "cn=Manager,o=example,c=JP"
rootpw          manager
directory       "/var/lib/ldap"
index           objectClass     eq

暗号化パスワードの求め方
 OpenLDAP付属のlsappasswdコマンドで、{CRYPT},{MD5},{SMD5},{SSHA},{SHA}の文字列が生成できます。
slappasswd -h {SSHA} -s パスワード文字列
*-h オプションでハッシュ形式をします。
標準出力にパスワード文字列のハッシュ化された物({SSHA}BhJllfHnfkedなど)が表示されますので、それをそのまま利用します。

indexの設定
 indexを設定し、効率良くデータを検索できるように設定します。
indexは、pres:存在、eq:等価性、sub:部分文字列、から指定します
例えば、mail属性にindexを設定する場合は、
index mail pres,eq,sub  と指定します。
 indexの設定を変更したら、indexの再構築を行ってください。
slapindex -v -b o=example,c=JP -f slapd.conf

OpenLDAPのツリー構造の設計
 OpenLDAPを利用する場合は、まずツリー構造の設計をする必要があります。今回はわかりやすく、組織階層を利用し作成した例を示します。
 この例は、exampleという日本にある会社を示しています。
 左側が組織の階層図で、右側がそれをOpenLDAPのツリー構造に置き換えた物です。また、このツリーのTOPが、slapd.confの"suffix"に当てはまります。
     組織の階層図
     -----------
     | example |
     -----------
     |        |
  --------  -------
  |総務部|  |営業部|
  --------  -------
     |         |
  --------  -------
  | 社員 |  | 社員 |
  --------  -------
                 OpenLDAPのツリーに置き換えた場合。
                       --------------------
                       |dn:o=example,c=JP |
                       --------------------
                          |              |
        ---------------------------     ----------------------------
        |dn:ou=somu,o=example,c=JP|     |dn:ou=eigyo,o=example,c=JP|
        ---------------------------     ----------------------------
                    |                           |
--------------------------------------  --------------------------------------
|dn:uid=社員ID,ou=somu,o=example,c=JP|  |dn:uid=社員ID,ou=eigyo,o=example,c=JP|
--------------------------------------  --------------------------------------
*もし組織がドメインを保有しているなら、dc(ドメイン)を利用し、表現した方が良いかもしれません。 例えば、example.jpドメインを保有しているなら、rootdnは、dc=example,dc=jpになります。

ここで利用されている、'c'や'o','uid'などの説明をしておきます。
これは、OpenLDAPのスキーマにより定義された要素を示しています。今回説明するものや代表的な物を以下の示します。
dn = ツリーの識別名
o  = organization。会社(組織)名を意味する
ou = organization unit。会社(組織)の一部署(部局)を意味する。
c  = country。国を表す。
cn = ラストネーム
sn = ファーストネーム
uid= ユーザID
userPassword = uidに対するパスワード

これは簡単なツリー構造です。イメージをつかんでください。(ツリー構造は自由に作成してかまいません。)
今度は、このツリー構造を利用し、実際にデータを登録してみます。

OpenLDAPへの登録データ作成
 OpenLDAPにデータ登録する場合は、ldifファイルを作成ます。ldifファイルはutf-8エンコードで作成してください。
 では、実際に、上記のツリー構造に合わせた'example.ldif'ファイルを作成してみましょう。
#TOPツリー用
dn: o=example,c=JP
objectClass: organization
o: example


#部署ツリー用
dn: ou=somu,o=example,c=JP
objectClass: organizationalUnit
ou: somu

dn: ou=eigyo,o=example,c=JP
objectClass: organizationalUnit
ou: eigyo


#社員ツリー用
dn: uid=u001,ou=somu,o=example,c=JP
objectClass:inetOrgPerson
cn: takesi
sn: yamada
uid: u001
userPassword: p-yamada

dn: uid=u002,ou=eigyo,o=example,c=JP
objectClass:inetOrgPerson
cn: taro
sn: maeda
uid: u002
userPassword: p-maeda

dn: uid=u003,ou=eigyo,o=example,c=JP
objectClass:inetOrgPerson
cn: dai
sn: ito
uid: u003
userPassword: p-ito
TOPツリーは、slapd.confのsuffixに該当します。
 o=組織(会社)要素は、オブジェクトクラス'organization'で定義されていますので、 オブジェクトクラスを指定します。
 'organization'では、'o'は必項属性ですので、'o: example'指定しています。

部署用ツリーです。
 ou=部署(部局)は、'organizationalUnit'で定義されています。
 'organizationalUnit'では、'ou:'が必項属性です。
 ここでは、総務部と営業部をそれぞれ作成しています。






社員用ツリーです。
 uid=ユーザIDは、'inetOrgPerson'で定義されています。
 'uid''sn''cn'は、'inetOrgPerson'の必項属性です。
 uidには、重複しないよう社員IDなどを利用するのがいいでしょう。
 ここでは、総務部の山田さんと、営業部の前田さん、伊藤さんのデータを作成してあります。
 また、userPasswordは、slapd.confのrootpw同様、暗号化パスワードを利用できます。

以上がこのツリーのデータ登録に利用する'example.ldif'ファイルです。このファイルを利用しコマンドで登録します。

OpenLDAPのデータ登録や検索、削除
データ操作には、いくつか利用できるコマンドがありますが、今回はldap***というコマンドを紹介します。
このコマンドは、OpenLDAPを起動した状態で利用でします。
なお、環境は、suffix='o=example,c=JP'、rootdn='cn=Manager,o=example,c=JP'、rootpw='manager'とします。

1.データの追加
  先程作成した、example.ldifファイルを利用し登録します。
ldapadd -x -h localhost -D "cn=Manager,o=example,c=JP" -w manager -f example.ldif

2.データの検索
  uidの末尾が'01'のデータを検索します。
ldapsearch -x -h localhost -b "o=example,c=JP" -s sub "(uid=*01)"

3.データの削除
 'dn : uid=u003,ou=eigyo,o=example,c=JP'のデータを削除します
ldapdelete -x -h localhost -D "cn=Manager,o=example,c=JP" -w manager "uid=u003,ou=eigyo,o=example,c=JP"

4.データの更新
更新は更新用ldifファイルを作成し行います。
ldapmodify -x -h localhost -D "cn=Manager,o=example,c=JP" -w manager < modify.ldif
  modify.ldifの書式
  1.dn:を指定します。
  2.ldifのタイプをmodifyで指定します。
  3.属性値を置き換える場合は"replace"、追加する場合は"add"、を指定し、属性と値を記入します。
  4.削除する場合は"delete"で削除する属性を指定します。
dn: uid=u001,ou=somu,o=example,c=JP
changetype: modifty
replace: sn
sn: shimizu
-
add: homeDirectory
homeDirectory: /home/shimizu
-
delete: telephoneNumber

5.GUIアプリケーション
javaで作成されたGUIのアプリケーション、LDAP Browser/Editerは便利です。
http://www.iit.edu/~gawojar/ldap/で配布されています。

OpenLDAPのスキーマファイル
スキーマファイルは、/etc/ldap/schema/内に、"***.schema"ファイルで定義されており、 この中で定義されたオブジェクトと要素に沿ってツリー構造を作成して行きます。また、目的にあった要素が見つからない場合は、 ユーザ自らが独自のスキーマファイルを作成し利用することもできます。

OpenLDAPで用意されているスキーマ
core.schemaOpenLDAPのコアスキーマ(必項)
cosine.schemaCosine and Internet X.500スキーマ(RFC 1274)
inetorgperson.schemaInetOrgPersonスキーマ(RFC 2798)
nis.schemaNetwork Infomation Servicesスキーマ(RFC 2307)
java.schemaJavaスキーマ(RFC 2713)
corba.schemaCORBAスキーマ(RFC 2714)
openldap.schemaOpenLDAP Projectの実験用スキーマ
misc.schemaその他実験用スキーマ


schemaファイルの書式
*データ属性の定義
attributetype (オブジェクト識別子 NAME '属性名'
			DESC '説明'
			EQUALITY 照合規則
			SYNTAX データ型 キーワード)

オブジェクト識別子ローカルで利用する場合は、1.1台が利用できます。
属性名属性の名称です。
説明属性の説明です。
照合規則照合規則を設定します
データ型データ型を設定します。
キーワードデータに関するOption

*オブジェクトクラス定義
objectClass (オブジェクト識別子 NAME 'オブジェクト名'
				DESC '説明'
				SUP 基底オブジェクトクラス
				MUST ( 必項属性 )
				MAY  ( オプション属性 ))

オブジェクト識別子ローカルで利用する場合は、1.1台が利用できます。
オブジェクト名オブジェクトの名称です。
説明 オブジェクトクラスの説明です。
基底オブジェクトクラスここに指定したオブジェクトクラスの属性を利用できます。(継承)
必項属性必ず利用しなければ行けない属性を指定(複数指定する場合は、$ で区切ります)
オプション属性利用できる(しなくても良い)属性を指定(複数指定する場合は、$ で区切ります)


以下の表は、スキーマで利用するデータ定義です。

OIDの割り当て(1.1台)
OID割り当て
1.1組織に割り当てられるOID
1.1.1SNMP要素
1.1.2LDAP要素
1.1.2.1属性型群
1.1.2.1.1単一の属性
1.1.2.2オブジェクトクラス群
1.1.2.2.1単一のオブジェクトクラス


照合規則(EQUALITY)

等価照合規則
OID名前説明
2.5.13.0objectLdentiferMatchOID
2.5.13.1distinguishedNameMatchDN
2.5.13.2caseIgnoreMatch英大小文字区別なし、スペース無視
2.5.13.5caseExactMatch英大小文字区別あり、スペース無視
2.5.13.8numericStringMatch数値文字列
2.5.13.13booleanMatch真偽値(TRUE/FALSE)
2.5.13.17octetStringMatch任意のオクテット文字列
2.5.13.23uniqueMemberMatchオプションでUIDの付いた名前
1.3.6.1.4.1.1466.109.114.1caseExactIA5MatchASCII文字列の英大小文字区別あり、スペース無視
1.3.6.1.4.1.1466.109.114.1caseIgnoreIA5MatchASCII文字列の英大小文字区別あり、スペース無視

順序照合規則
OID名前説明
2.5.13.3caseIgnoreOrderingMatch英大小文字区別なし、スペース無視
2.5.14.6caseExactOrderingMatch英大小文字区別あり、スペース無視
2.5.13.15numericStringOrderingMatch数値文字列

部分文字列照合規則
OID名前説明
2.5.13.4caseIgnoreSubstringsMatch英大小文字区別なし、スペース無視
2.5.13.7caseExactSubstringsMatch英大小文字区別あり、スペース無視
2.5.13.10numericStringSubstringsMatch数値文字列


データ型(SYNTAX)
OID説明
1.3.6.1.4.1.1466.115.121.1.7TRUE or FALSE
1.3.6.1.4.1.1466.115.121.1.12Dn形式の文字列
1.3.6.1.4.1.1466.115.121.1.15UTF-8文字列
1.3.6.1.4.1.1466.115.121.1.26ASCII文字列
1.3.6.1.4.1.1466.115.121.1.27整数値
1.3.6.1.4.1.1466.115.121.1.28JFIFエンコードされたJPEG画像
1.3.6.1.4.1.1466.115.121.1.34DnおよびUID
1.3.6.1.4.1.1466.115.121.1.36数値文字列
1.3.6.1.4.1.1466.115.121.1.38 OID形式の文字列
1.3.6.1.4.1.1466.115.121.1.40任意のオクテット文字列
1.3.6.1.4.1.1466.115.121.1.41 住所([$]で区切ったUTF-8文字列)
1.3.6.1.4.1.1466.115.121.1.44表示可能な文字列
1.3.6.1.4.1.1466.115.121.1.50電話番号

キーワード
説明
SINGLE-VALUE単一値のみ持てる
NO-USER-MODIFICATIONサービス利用者が値を更新することを禁止



Producted by Tomoya Sakurai