●openldapでMSアドレス帳を作成

openldapが正常に動作するように
「UNIXしま専科 OpenLDAPのインストール」
のように構築を終わらせている状態にします。

【今回の構造】

/dc=testdom,dc=jp
|-- cn=Manager,dc=testdom,dc=jp
`-- ou=address,dc=testdom,dc=jp
    |--uid=yamada,ou=address,dc=testdom,dc=jp
    |--uid=xxxxx,ou=address,dc=testdom,dc=jp
    |--・・・

というツリー構造にします。
uid=yamada,ou=address,dc=testdom,dc=jp
がアドレス帳の個々のエントリーとなります。

MSアドレス帳にはopenldapでデフォルトで用意されている
スキーマでは対応しきれない属性があります

表1.MSアドレス特有の属性
部署:
ビジネスWebページ:
自宅Webページ:
メモ:
会議サーバー:
デジタルID:
IP電話:
department(OUで代用できる)
url
homeURL
comment
conferenceInformation
userCertificate
IPPhone

などです。これらのフィールドに値を入力して
アドレスブックに表示できるようにするには以下の作業をします。

1.スキーマファイルを作成
# vi /etc/openldap/schema/extension.schema
このスキーマでofficePersonオブジェクトクラスを定義する。
attributetype ( 1.3.6.1.4.1.4203.666.100.121
        NAME ( 'rdn' )
        SUP name )

attributetype ( 1.3.6.1.4.1.4203.666.100.122
        NAME ( 'otherFacsimiletelephoneNumber' )
        SUP telephoneNumber )

attributetype ( 1.3.6.1.4.1.4203.666.100.123
        NAME ( 'IPPhone' )
        SUP telephoneNumber )

# This attribute handles MS/Outlook and Netscape Communicator

attributetype ( 1.3.6.1.4.1.4203.666.100.124
        NAME ( 'URL' 'homeUrl' )
        SUP name )

attributetype ( 1.3.6.1.4.1.4203.666.100.125
        NAME ( 'comment' )
        SUP name )

attributetype ( 1.3.6.1.4.1.4203.666.100.126
        NAME ( 'conferenceInformation' )
        SUP name )

attributetype ( 1.3.6.1.4.1.4203.666.100.127
        NAME ( 'reports' )
        SUP manager )

objectclass     ( 1.3.6.1.4.1.4203.666.100.1
    NAME 'officePerson'
        DESC 'Office employee or computer user'
    SUP inetOrgPerson
    STRUCTURAL
        MAY  ( c $
               rdn $
               otherFacsimiletelephoneNumber $
               IPPhone $
               URL $
               comment $
               reports $
               conferenceInformation )
    )
2.slapd.confで作成した拡張スキーマをインクルード
# vi /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/extension.schema
allow bind_v2
schemacheck off
pidfile /var/run/slapd.pid
argsfile /var/run/slapd.args
access to * by * read
database bdb
suffix "dc=testdom,dc=jp"
rootdn "cn=Manager,dc=testdom,dc=jp"
rootpw secret
directory /var/lib/ldap
index objectClass eq,pres
index cn,sn,givenName,mail pres

インデックスの部分は
index objectClass                       eq,pres
index cn,sn,givenName,mail      eq,pres,sub
としておく。

indexの設定
 indexを設定は効率良くデータを検索できるようにするためです。
特に大規模でよく検索される部分などはインデックス化しておきましょう。
indexは、

pres:存在
eq:等価性
sub:部分文字列

から指定します
例えば、cn属性にindexを設定する場合は、
index cn pres,eq,sub  と指定します。
 indexの設定を変更したら、indexの再構築を行ってください。
slapindex -v -b o=example,c=JP -f slapd.conf





3.デーモンの再起動
# /etc/init.d/ldap restart
これでMSアドレス帳の設定は終了なので次からは
実際のエントリーを作成していきます。

まだトップツリーを作成していない場合は下記のように作成する。

●トップツリーの作成
# ldapadd -x -D "cn=Manager,dc=testdom,dc=jp" -w secret -f top.ldif

top.ldif
# Organization For Example Corporation
dn: dc=testdom,dc=jp
objectClass: dcObject
objectClass: organization
dc: testdom
o: testdom
description: testdom test

# Organizational Role for Directory Manager
dn: cn=Manager,dc=testdom,dc=jp
objectClass: organizationalRole
cn:Manager
description: Direcotry Manager
>●OUの作成
# ldapadd -x -D "cn=manager,dc=testdom,dc=jp" -w secret -f ou.ldif
ou.ldif
# Address Oganization Unit
dn: ou=Address,dc=testdom,dc=jp
ou: Address
objectclass: organizationalUnit
●エントリーの追加
# vi person000001.ldif
※2バイト文字を扱う場合はこのファイル自体はutf-8で書いておきましょう。
そうしないと文字化けの原因になります。
dn: uid=person000001,ou=address,dc=testdom,dc=jp
objectclass: inetorgPerson
objectclass: officePerson   
#MSの拡張部分を表示させる場合は必要
mail: tarou.yamada@test.com
uid: person000001
cn: Tarou Yamada
givenName: 太郎
sn: 山田
title:部長
o:松戸テクニカル 株式会社 システム開発部門 統合企画課
physicalDeliveryOfficeName: 松戸オフィス
URL: http://www.xyz.jp/  
(officePersonスキーマ必要)
comment: 2005年8月中途入社 
(officePersonスキーマ必要)
#conferenceInformation:
(officePersonスキーマ必要)
#userCertificate:
#manager:
(officePersonスキーマ必要)
#reports:
(officePersonスキーマ必要)
postalAddress: 1-2-3-4
l: 松戸市松戸
st: 千葉県
postalcode: 123-4567
c: Japan
#homePostalAddress:
telephoneNumber: 047-123-4567
facsimileTelephoneNumber: 047-123-9876
#homePhone:
#otherFacsimiletelephoneNumber:
(officePersonスキーマ必要)
mobile: 080-1234-5678
#pager:
IPPhone: 050-1234-5678
(officePersonスキーマ必要)
# ldapadd -xvD "cn=Manager,dc=testdom,dc=jp" -w secret -f person000001.ldif
実行結果
ldap_initialize( <DEFAULT> )
add objectclass:
inetorgPerson
officePerson
add mail:
tarou.yamada@test.com
add uid:
person000001
add cn:
NOT ASCII (13 bytes)
add givenName:
NOT ASCII (6 bytes)
add sn:
NOT ASCII (6 bytes)
add title:
NOT ASCII (6 bytes)
add o:
NOT ASCII (40 bytes)
add physicalDeliveryOfficeName:
NOT ASCII (18 bytes)
add URL:
http://www.xyz.jp/
add comment:
NOT ASCII (23 bytes)
add postalAddress:
1-2-3-4
add l:
NOT ASCII (15 bytes)
add st:
NOT ASCII (9 bytes)
add postalcode:
123-4567
add c:
Japan
add telephoneNumber:
047-123-4567
add facsimileTelephoneNumber:
047-123-9876
add mobile:
080-1234-5678
add IPPhone:
050-1234-5678
adding new entry "uid=person000001,ou=address,dc=testdom,dc=jp"
modify complete
【確認】
[root@AS4 schema]# ldapsearch -x -b "ou=address,dc=testdom,dc=jp" cn=*yamada*
実行結果
# extended LDIF
#
# LDAPv3
# base <ou=address,dc=testdom,dc=jp> with scope sub
# filter: cn=*yamada*
# requesting: ALL
#

# person000001, address, testdom.jp
dn: uid=person000001,ou=address,dc=testdom,dc=jp
objectClass: inetOrgPerson
objectClass: officePerson
mail: tarou.yamada@test.com
uid: person000001
title:: 6YOo6ZW3
o:: 44K344K544OG44Og6ZaL55m66YOo6ZaAIOe1seWQiOS8geeUu+iqsg==
physicalDeliveryOfficeName:: 5p2+5oi444Kq44OV44Kj44K5
URL: http://www.xyz.jp/
comment:: MjAwNeW5tDjmnIjkuK3pgJTlhaXnpL4=
postalAddress: 1-2-3-4
l:: 5p2+5oi45biC5p2+5oi4
st:: 5Y2D6JGJ55yM
postalCode: 123-4567
c: Japan
telephoneNumber: 047-123-4567
facsimileTelephoneNumber: 047-123-9876
mobile: 080-1234-5678
IPPhone: 050-1234-5678
givenName:: 5aSq6YOO
sn:: 5bGx55Sw
cn: Tarou Yamada


# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
黄色の部分のようにエントリーが表示されればOK。
しかしこれではいまいち何がなんだかよく分かりません。
実際にアドレス帳から検索してみます。


【アドレス帳から検索】
必要な情報 ldapserverのホスト名(or IPaddress)
リスンポート:389
検索するツリー:ou=address,dc=testdom,dc=jp


ぐらいが必要な情報です。

1.アドレス帳に設定
「ファイル名を指定して実行」→「wab」

2.ldapクライアントの設定

キャプチャー画面のとおり

図1.wab.exeが起動


図2.ディレクトリアカウントの追加


図3.作成したアカウントの詳細設定

3.検索

キャプチャー画面のとおり

図4.検索画面


図5.検索結果 概要


図6.検索結果 名前


図7.検索結果 自宅


図8.検索結果 勤務先


図9.検索結果 その他

各属性名がアドレス帳のどこに来るか確認してください。

OutlookなどからだけでなくThunderbirdからでもldapクライアントの
設定を行うことでアドレス帳は参照できます。

ThunderbirdなどからではMozilla用の属性もスキーマファイルを作成することで
勤務先の電話番号やニックネームなどを表示可能です。

ただ、こういった拡張はクライアントを統一した環境でないと
意味がなくなるのでデファクトな使用方法で特別に
スキーマを作ったりしない方がスマートだと考えます。

後このままだと登録が誰でもできるわけではなく管理者しか行うことができません。
企業としてオフィシャルな社員名簿のように使用することで
相当メリットは発揮されると思います。
そういった場合はスキルをもったシステム管理部門が登録更新作業を行うので
コマンドラインからの変更でも問題ないでしょう。


エントリーの登録はとりあえず最初は何万人もいる場合は
スクリプトで現状の名簿データをうまく
ldifファイルに変換して登録しましょう。

その後のメンテナンスはldapbrowserなどで行うことで
GUIベースでかなり簡単に行えます。


全てのMSアドレス帳とNSアドレス帳の属性については
http://www.linux.com/howtos/LDAP-Implementation-HOWTO/schemas.shtml
を参考にすると完璧に作りこむことができます。
スキーマファイルの作り方がわからない場合は
openldapのサイトに乗っているのでそちらを参考にしましょう。