技術的雑談-OpenLDAPのError(80)
環境
- CentOS 5.2
- OpenLDAP 2.3.27 (CentOS 5.2標準)
現象
- LDAPにアカウントなどを追加しようとしたときに追加できない。
原因と解決
1. 親Objectが未登録状態
LDAPのDBを作ってそのままの状態だと、suffixのDNに対してObjectが作られていない。
例えば前述の例で言うと、dc=sample.dc=comがsuffixで、com-sampleは表示されているが、JXplorerなどで選択すると、
unable to list dc=sample,dc=com
とか、
Unable to perform Read entry operation.
とかが表示されるハズ。
これは何を意味するかというと、
「comの子のsampleなんてObjectは見つからないよ」
という意味である。
引っ掛かりやすいが、slapd.confでsuffixに書いたObject(ツリー)はJXplorerでは表示されるが、LDAP的にはまだObjectがない。
Objectが実在しないので当然dc=sample,dc=comの下に新しいObjectは作成できない。
まずは、slapd.confのsuffixに書いたObjectをldapaddで実際に追加してやる必要がある。
ちなみに、今回の例では、追加してやるObjectは「sample」だけでよい。
「com」に関してはsuffixが当てはまらなくなるので追加することはできない。
(ldapaddなどで無理やりdc=comなるObjectを追加しようとすると「no global superior knowledge」と怒られる。エラーコードは53。)
2. no structuralObjectClass operational attribute
で、これではいけないということでdc=sample,dc=comにObjectを追加しようと、以下のようなLDIFを書いてldapaddに食わせてみる。
dn:dc=sample,dc=com objectClass:dcObject objectClass:top dc:sample
しかし、これを実行すると以下のように怒られる。
# ldapadd -x -D "cn=Manager,dc=sample,dc=com" -w hogehoge -v -f init.ldif ldap_initialize( <DEFAULT> ) add objectClass: dcObject top add dc: sample adding new entry "dc=sample,dc=com" modify complete ldap_add: Internal (implementation specific) error (80) additional info: no structuralObjectClass operational attribute
これが何を意味するのかイマイチわからなかったが、どうも「StructuralなObject」をsuffixのObjectに対しては追加する必要があるらしい。
「StructuralなObject」とは、schemaで「STRUCTURAL」が指定されているObjectという事らしい。
例えば、core.schemaを見ると、
objectclass ( 2.5.6.2 NAME 'country' DESC 'RFC2256: a country' SUP top STRUCTURAL MUST c MAY ( searchGuide $ description ) )
なんて定義があって、要は「SUP」の行に「STRUCTURAL」が書いてあるobjectClassをsuffixのObjectには使えという事らしい。
よって、上記のLDIFは、
dn:dc=sample,dc=com objectClass:dcObject objectClass:top objectClass:organization dc:sample o:sample
と、するとちゃんと通るようになる。
ちなみに、CentOS5.2でOpenLDAPをインストール時に選択したときについてくるSchemaでSTRUCTURALなObjectは以下のものがある。
- core.schema
- country
- locality
- organization
- organizationalUnit
- person
- organizationalPerson
- organizationalRole
- groupOfNames
- residentialPerson
- applicationProcess
- applicationEntity
- dSA (RFC2256: a directory system agent (a server))
- device
- groupOfUniqueNames
- cRLDistributionPoint
- dmd
- cosine.schema
- pilotPerson 又は newPilotPerson
- account
- document
- room
- documentSeries
- domain
- RFC822localPart
- dNSDomain
- friendlyCountry
- pilotOrganization
- pilotDSA
- nis.schema
- posixGroup
- ipService
- ipProtocol
- oncRpc
- ipNetwork
- nisNetgroup
- nisMap
- nisObject
履歴
2009/04/13 -- 初版
技術的雑談へ戻る