- PR -

OpenLDAPのデータの追加・更新・削除について

投稿者投稿内容
be1300cc
ベテラン
会議室デビュー日: 2002/07/04
投稿数: 88
投稿日時: 2003-07-24 18:15
度々すみません。be1300ccと申します。
データの追加・更新・削除について、エントリの追加のみはできるのですが、
changetypeでaddを指定した場合の追加・更新・削除ができません。

根本的に分からない点があるのですが、slapd.conのsuffixには現在、"dc=tec,dc=jp"と
指定しているのですが、あるデータを追加したい場合は、ここのsuffixにDNを追加してあげ
ないといけないのでしょうか?

〜追加したかったデータ〜
dn: cn=MAN,ou=System Department,o=TEC.Corp.,c=JP
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: MAN

このDNをsuffixに指定して、LDIFファイルにそのまま上記のデータを記述しても
きちんと登録できませんでした。
(ldapadd -D "cn=MAN,ou=System Department,o=TEC.Corp.,c=JP" -w secret -f example.ldif)

書籍とOpenLDAPのサイトを頼りに行っているのですが、あまり詳しく書いていない為、
困っています。
LDIFファイルとslapd.confにどのように指定すれば、追加・更新・削除ができるので
しょうか?

ご享受お願いします。

〜現在の設定〜
【LDIFファイル(example.ldif)】
dn: dc=tec,dc=jp
objectclass: dcObject
objectclass: organization
o: Example Company
dc: tec

dn: cn=Manager,dc=tec,dc=jp
objectclass: organizationalRole
cn :Manager

dn: cn=MAN,ou=System Department,o=TEC.Corp.,c=JP
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: MAN

【slapd.conf】
# $OpenLDAP: pkg/ldap/servers/slapd/slapd.conf,v 1.23.2.8 2003/05/24 23:19:14 kurt Exp $
#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include /usr/local/etc/openldap/schema/core.schema

# Define global ACLs to disable default read access.

# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral ldap://root.openldap.org

pidfile /usr/local/var/slapd.pid
argsfile /usr/local/var/slapd.args

# Load dynamic backend modules:
# modulepath /usr/local/libexec/openldap
# moduleload back_bdb.la
# moduleload back_ldap.la
# moduleload back_ldbm.la
# moduleload back_passwd.la
# moduleload back_shell.la

# Sample security restrictions
# Require integrity protection (prevent hijacking)
# Require 112-bit (3DES or better) encryption for updates
# Require 63-bit encryption for simple bind
# security ssf=1 update_ssf=112 simple_bind=64

# Sample access control policy:
# Root DSE: allow anyone to read it
# Subschema (sub)entry DSE: allow anyone to read it
# Other DSEs:
# Allow self write access
# Allow authenticated users read access
# Allow anonymous users to authenticate
# Directives needed to implement policy:
# access to dn.base="" by * read
# access to dn.base="cn=Subschema" by * read
# access to *
# by self write
# by users read
# by anonymous auth
#
# if no access controls are present, the default policy is:
# Allow read by all
#
# rootdn can always write!

#######################################################################
# ldbm database definitions
#######################################################################

database bdb
suffix "dc=tec,dc=jp"
         "cn=MAN,ou=System Department,o=TEC.Corp.,c=JP"
rootdn "cn=Manager,dc=tec,dc=jp"
# Cleartext passwords, especially for the rootdn, should
# be avoid. See slappasswd( and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw secret
# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
directory /usr/local/var/openldap-data
# Indices to maintain
index objectClass
tanabo
常連さん
会議室デビュー日: 2003/04/24
投稿数: 34
投稿日時: 2003-07-25 11:31
be1300ccさん

suffixに登録するのはトップエントリなので、
この場合は"dc=tec,c=jp"のみになります。

また、ldapaddコマンドの-Dオプションは、LDAPサーバ内の
エントリに権限があるユーザを指定します。ユーザはLDAPサーバに
登録されている必要があります。

今回の場合,まだ権限のあるユーザは登録されていないようなので,slapd.confの
rootdnに指定したDNを使用します。
実行するコマンドは以下のようになると思います。

ldapadd -x -D "cn=Manager,dc=tec,dc=jp" -w secret -f example.ldif

-xオプションは,パスワード指定のみ(他の認証を使用しない)のオプションです。

また,"dn: cn=MAN,ou=System Department,o=TEC.Corp.,c=JP"についてですが、
inetOrgPersonの必須属性はcn,snが必要だと思うので,
属性snも追加して実行してみてください。

最近LDAPを使っていないのでうろ覚えですが・・・(^^;
be1300cc
ベテラン
会議室デビュー日: 2002/07/04
投稿数: 88
投稿日時: 2003-07-25 15:51
tanaboさん、ご回答ありがとうございます。
 
2件目まではエントリできているのですが、どうしても3件目のエントリができません。
また、-xのオプションが効かない状態です。

また、更新に関しても、上手く処理されているのかが分かりません。
〜2件目のデータ〜
dn: cn=Manager,dc=tec,dc=jp
changetype :modify
add: postaladdress
postaladdress: 1-2-3
objectclass: organizationalRole
cn :Manager

コマンド:
[root@wintel bin]# ldapadd -D "cn=Manager,dc=tec,dc=jp" -w secret -f /usr/local/etc/openldap/example.ldif
ldap_bind: Invalid credentials

どこがおかしいのでしょうか?
よろしくお願いします。



tanabo
常連さん
会議室デビュー日: 2003/04/24
投稿数: 34
投稿日時: 2003-07-25 16:48
be1300ccさん

>〜2件目のデータ〜
>dn: cn=Manager,dc=tec,dc=jp
>changetype :modify
>add: postaladdress
>postaladdress: 1-2-3
>objectclass: organizationalRole
>cn :Manager
Invalid credentialというエラーは,
これはrootdnに記述したDNと同じですよね?
このエントリを一旦削除した後に3件目のデータを追加してみてください。

それでもだめな場合は,slapdを
slapd -d 255 (デバッグモード)
と実行するとコンソール上にログが出ますので,
そのログで原因が検出できるかもしれません。

tanabo
常連さん
会議室デビュー日: 2003/04/24
投稿数: 34
投稿日時: 2003-07-25 17:29
be1300ccさん

LDAPにエントリを追加するには,以下の項目を守ってください。
1.必要なスキーマファイルがincludeされている。
2.suffixに記述するDNがトップエントリになる。
3.rootdnに記述するDNが管理者DNになる。
4.passwdに記述するものは管理者DNのパスワードである。
5.エントリの追加は,トップエントリを最初に入れ,
 その後は上の階層から順にエントリを追加する。
6.追加するDNの上位エントリが存在しなければならない。


もう一度be1300ccさんの最初の質問を読み返したところ,以下の点で
問題があります。
1."cn=MAN,ou=System Department,o=TEC.Corp.,c=JP"は,
 "dc=tec,c=jp"の配下エントリではない。
2.管理者DNの"cn=Manager,dc=tec,c=jp"が追加されている。
 (管理者DNは登録する必要はありません)

また,core.schemaにはオブジェクトクラスinetOrgPersonについて
記述されていないと思います。

実際に以下のslapd.confとLDIFファイルで試したところうまくいきました。
openldapのバージョンは2.1.4(古くてすみません),バックエンドはldbmです。

【slapd.conf】
# $OpenLDAP: pkg/ldap/servers/slapd/slapd.conf,v 1.23.2.2 2002/08/19
16:21:49 kurt Exp $
#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema

# Define global ACLs to disable default read access.

# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral ldap://root.openldap.org

pidfile /usr/local/var/slapd.pid
argsfile /usr/local/var/slapd.args

# Load dynamic backend modules:
# modulepath /usr/local/libexec/openldap
# moduleload back_bdb.la
# moduleload back_ldap.la
# moduleload back_ldbm.la
# moduleload back_passwd.la
# moduleload back_shell.la

#
# Sample access control policy:
# Allow read access of root DSE
# Allow self write access
# Allow authenticated users read access
# Allow anonymous users to authenticate
# Directives needed to implement policy:
#access to dn.base="" by * read
#access to *
# by self write
# by users read
# by anonymous auth
#
# if no access controls are present, the default policy is:
# Allow read by all
#
# rootdn can always write!

#####################################################################
##
# ldbm database definitions
#####################################################################
##

database ldbm
suffix "dc=tec,c=jp"
rootdn "cn=Manager,dc=tec,c=jp"
# Cleartext passwords, especially for the rootdn, should
# be avoid. See slappasswd( and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw secret
# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd/tools. Mode 700 recommended.
directory /usr/local/var/openldap-data
# Indices to maintain
index objectClass eq

【LDIFファイル】
dn: dc=tec,c=jp
objectclass: dcObject
objectclass: organization
o: Example Company
dc: tec

dn: ou=test1,dc=tec,c=jp
objectclass: organizationalUnit
ou: test1

dn: cn=MAN,ou=test1,dc=tec,c=JP
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: MAN
sn: man


be1300cc
ベテラン
会議室デビュー日: 2002/07/04
投稿数: 88
投稿日時: 2003-07-25 19:29
tanaboさん、非常に分かりやすいご回答、本当にありがとうございました。
非常に勉強になりました。
tanaboさんのアドバイスに注意しながら、作業を進めて行きたいと思います。

すみません、もう1点だけ質問させて頂きたいのですが、
現在slap.conf example.ldif を使用してデータ登録していますが、処理(更新・追加・削除)やデータによって複数のLDIFファイルを作成した場合、それぞれに合ったslap.confのsuffix
にてDNを登録しておけば良いかと思いますが、suffixの記述の仕方は以下のようにすれば良い
のでしょうか?

suffix "dc=tec,c=jp"
"cn=MAN,ou=System Department,o=TEC.Corp.,c=JP"

度々すみませんが、よろしくお願いします。
tanabo
常連さん
会議室デビュー日: 2003/04/24
投稿数: 34
投稿日時: 2003-07-25 20:50
be1300ccさん

複数のLDIFを使用してデータ操作する場合においても,
suffixはLDAPサーバの最も上位の階層を指定するだけですので
LDIFファイルによって変更する必要はありません。

suffixの指定方法として,openldapでは以下の2つの方法があります。
ここではbe1300ccさんの例で説明します。

1.共通する"c=jp"をトップエントリとする。
 この場合は"c=jp"という最上位エントリからのツリー構造ができる。
2."dc=tec,c=jp"と"o=TEC.Corp.,c=JP"のそれぞれをトップエントリとして
 登録し,それぞれ別のデータベースで管理する。
 この場合は"dc=tec,c=jp"と"o=TEC.Corp.,c=JP"の2つの最上位エントリができる。

通常は1の場合だと思いますが,openLDAPは1つのサーバで複数のデータベースを管理する
2の操作も行うことができます。私はやったことはありませんが・・・。
以下のURLを参考にされてはいかがでしょうか。

http://cvs.cacanet.org/fsc/ldap/0601/examples/two-db.html

LDAPの操作は初めのうちは戸惑うことが多いですが,
理解してしまうと簡単ですので頑張ってください!
be1300cc
ベテラン
会議室デビュー日: 2002/07/04
投稿数: 88
投稿日時: 2003-07-29 09:36
tanaboさん

ご返信が大変遅くなりまして、申し訳ありません。
tanaboさんのご説明で、複数データの登録のやり方やOpenLDAPについて、段々とですが
理解できてきました。
ありがとうございます。

今一度、調べてもどうしても分かりませんので、2点質問させて頂きます。

1.データの削除について
 ここ数日でLDIFファイルやSlapd.confをいじってしまい、LDIFファイルの中身は最近
 LDIFファイル上のみで設定したエントリーなのです。
 しかし、実際にエントリーされているのは、LDIFファイルを一番最初に作成した時に
 正常にエントリーされたエントリーでした。
 その為、
 /usr/local/bin/ldapdelete -D "cn=Manager,dc=tec,dc=jp" -w secret -v
 /usr/local/bin/ldapdelete -D "cn=Manager,dc=tec,dc=jp" -w secret
 と行ったのですが、結局データを削除できませんでした。
 コマンドが間違っているのでしょうか?

2.大元のデータの削除について
 上記のコマンドで削除出来なかった為、OpenLDAPとBerkleyDBをアンインストールし、
 インストールし直したのですが、データがまだ残ったままでした。
 その後、関連個所の
 /usr/local/var/openldap-dataの中身
/usr/local/etc/openldap/の中身
 を削除し更に、アンインストールしインストールし直したのですがデータが残ったままでした。
 データはどこのディレクトリの中を見て削除すればよいのでしょうか?

度々の質問で大変申し訳ございませんが、ご享受お願いします。
 



[ メッセージ編集済み 編集者: be1300cc 編集日時 2003-07-29 10:37 ]

スキルアップ/キャリアアップ(JOB@IT)