ふたつの川うるおう日記
2008-06-03 (Tue)
_ [Server][Admin][Java][Seasar] OpenLDAPのスキーマをOpenDSに追加する時の7つのポイント
OpenDSはSunが中心にオープンソースで開発しているJavaで書かれたディレクトリサーバです。詳細についてはOpenDSのサイトを見てもらえば判りますが、個人的に興味を引かれた特徴は次の点です。
- Javaで書かれているので組み込みで動かせる
- テストも兼ねて実際にコード書いてみましたが良い感じ
- Java 5以上必要
- マルチマスタ構成が可能
- もちろんschmeaやconfig系も込みで
- 将来的にSun Java System Directory Server Enterprise Editionの中身はOpenDSになるらしい
さて、では実際に使おうとするといろいろスキーマを追加したくなります。早速、広く使われているOpenLDAP用のスキーマを追加しようとしたところいくつか変更する必要がありました。
先に良く使うスキーマの変更済みスキーマを提示しておきます。動作確認はちょっとバージョンが古いですが、Mavenで手に入るOpenDS 1.0.0 build 005でしました。
- OpenSSH LPK (OpenSSH LDAP Public Key Patch 4.6p1-0.3.9 ベース)
- qmail-ldap (qmail-ldap 1.0.3 20060201 ベース)
- Samba (Samba 3.0.30 ベース)
これらを作るにあたって判ったスキーマファイルの変更ポイントは次の7つです。
- 1. スキーマファイルは $OPENDS_HOME/config/schema 以下に XX-hoge.ldif というファイル名で配置
XXの部分には任意の数字を入れます。数字が若い順に読み込まれるので標準で入っているスキーマより大きい数字を指定します。上で挙げたスキーマでは、適当に10としています。
- 2. 定義を開始する部分に次を追加
dn: cn=schema objectClass: top objectClass: ldapSubentry objectClass: subschema
ファイルの先頭のコメント部分はそのままで構いません。
- 3. attributetype ( ... ) を attributeTypes: ( ... ) に置換
変更前: openssh-lpk.schemaより
attributetype ( 1.3.6.1.4.1.22054.500.1.1.1.13 NAME 'sshPublicKey'
DESC 'MANDATORY: OpenSSH Public key'
EQUALITY octetStringMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
変更後: openssh-lpk.schemaより
attributeTypes: ( 1.3.6.1.4.1.22054.500.1.1.1.13 NAME 'sshPublicKey'
DESC 'MANDATORY: OpenSSH Public key'
EQUALITY octetStringMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
- 4. objectclass ( ... ) を objectClasses: ( ... ) に置換
変更前: openssh-lpk.schemaより
objectclass ( 1.3.6.1.4.1.22054.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY
DESC 'MANDATORY: OpenSSH LPK objectclass'
MUST ( sshPublicKey $ uid )
)
変更後: openssh-lpk.schemaより
objectClasses: ( 1.3.6.1.4.1.22054.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY
DESC 'MANDATORY: OpenSSH LPK objectclass'
MUST ( sshPublicKey $ uid )
)
- 5. attributeTypes ( ... ) の ) 前には必ずスペースが1つ必要
NG: qmail-ldap.schemaより
attributeTypes: ( 1.3.6.1.4.1.7914.1.2.1.6 NAME 'mailHost'
... 省略 ...
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} SINGLE-VALUE)
OK: qmail-ldap.schemaより
attributeTypes: ( 1.3.6.1.4.1.7914.1.2.1.6 NAME 'mailHost'
... 省略 ...
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} SINGLE-VALUE )
objectClassesはスペースが無くても大丈夫です。
- 6. 定義途中で改行した場合、先頭にスペースを2つ以上入れてから続きを記述する
NG: openssh-lpk.schemaより
attributetype ( 1.3.6.1.4.1.22054.500.1.1.1.13 NAME 'sshPublicKey' DESC 'MANDATORY: OpenSSH Public key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
OK: openssh-lpk.schemaより
attributetype ( 1.3.6.1.4.1.22054.500.1.1.1.13 NAME 'sshPublicKey' DESC 'MANDATORY: OpenSSH Public key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
TabもNGです。
- 7. 定義と定義の間に空行を作ってはいけない、コメントアウト行を入れるのはOK
NG: openssh-lpk.schemaより
dn: cn=schema objectClass: top objectClass: ldapSubentry objectClass: subschema # octetString SYNTAX attributeTypes: ( 1.3.6.1.4.1.22054.500.1.1.1.13 NAME 'sshPublicKey' DESC 'MANDATORY: OpenSSH Public key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 ) # printableString SYNTAX yes|no objectClasses: ( 1.3.6.1.4.1.22054.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY DESC 'MANDATORY: OpenSSH LPK objectclass' MUST ( sshPublicKey $ uid ) )
OK: openssh-lpk.schemaより
dn: cn=schema objectClass: top objectClass: ldapSubentry objectClass: subschema # octetString SYNTAX attributeTypes: ( 1.3.6.1.4.1.22054.500.1.1.1.13 NAME 'sshPublicKey' DESC 'MANDATORY: OpenSSH Public key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 ) # printableString SYNTAX yes|no objectClasses: ( 1.3.6.1.4.1.22054.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY DESC 'MANDATORY: OpenSSH LPK objectclass' MUST ( sshPublicKey $ uid ) )
以上の7つに注意すればOpenLDAPのスキーマをOpenDSでも使うことができます。 OpenLDAPとOpenDSの標準で提供されているスキーマのいくつかは、オブジェクトクラスの構造クラスと補助クラス定義が異なるのがありますが、基本的にはほぼ同じようなのでそれほど戸惑うこともないと思います。
そして最後に、S2Directoryで問題無くOpenDSのエントリを扱えることも確認済みです。
[18:50追記] S2DirectoryでSMD5, SSHAを使用してパスワードを保存した時に保存したパスワードでOpenDSのSASL認証が上手くいきませんでした。原因はsaltの長さがS2Directoryは4バイトを、OpenDSは8バイトを想定しているためでした。とりあえずDIRECTORY-25で対応して、S2Directory 0.7-SNAPSHOTをデプロイしときました。


