OpenLDAPのバックエンドにMySQLを使う (未完)
現在、とある理由でOpenLDAPの設計を行っており、その過程でOpenLDAPのバックエンドにMySQLが使えそうかどうかを試してみました。その設定と所感をメモとして残しておきます。
利用したOSはMIRACLE LINUX 4.0です。OpenLDAPのバージョンは2.2.13、MySQLのバージョンは4.1.20で、ともにMIRACLE LINUX 4.0のパッケージを使用し、執筆時点で最新版のものを使用しています。
関連パッケージをインストール
最低限必要なパッケージは以下のものです。
- openldap-servers
- openldap-servers-sql
- mysql-server
- unixODBC
- MyODBC
MySQLサーバの起動とテスト用データベースのインポート
MySQLはデフォルトの設定で起動させてOpenLDAP用のテストデータベースを作成します。
# service mysqld start
mysqladmin -uroot create ldaptest
続いてopenldap-servers-sqlパッケージに付属しているテスト用スキーマをインストールします。
$ mysql -uroot ldaptest < /usr/share/doc/openldap-servers-sql-2.2.13/rdbms_depend/mysql/backsql_create.sql
$ mysql -uroot ldaptest < /usr/share/doc/openldap-servers-sql-2.2.13/rdbms_depend/mysql/testdb_create.sql
$ mysql -uroot ldaptest < /usr/share/doc/openldap-servers-sql-2.2.13/rdbms_depend/mysql/testdb_data.sql
$ mysql -uroot ldaptest < /usr/share/doc/openldap-servers-sql-2.2.13/rdbms_depend/mysql/ testdb_metadata.sql
ODBCの設定と接続テスト
/etc/odbcinst.iniの以下の5行のコメントアウトを外します。
[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib/libmyodbc.so
Setup = /usr/lib/libodbcmyS.so
FileUsage = 1
/etc/odbc.iniに以下の設定を行います。
[ldaptest]
Description = ldaptest
Driver = MySQL
Server = localhost
Port =
User = root
Password =
Database = ldaptest
ODBC経由でMySQLに接続できることを確認します。
$ isql ldaptest
以下のような表示が出れば成功です
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>
OpenLDAPサーバの設定
/etc/openldap/slapd.confを以下のように編集します。
# Load dynamic backend modules:
modulepath /usr/sbin/openldap ← コメントを外す
# moduleload back_bdb.la
# moduleload back_ldap.la
# moduleload back_ldbm.la
# moduleload back_passwd.la
# moduleload back_shell.la
moduleload back_sql.la ← コメントを外す
~~以降の行を最後に追加~~
#######################################################################
# sql database definitions
#######################################################################
database sql
suffix "dc=ldaptest,dc=com"
rootdn "cn=root,dc=ldaptest,dc=com"
rootpw secret
dbname ldaptest
dbuser root
dbpasswd ""
subtree_cond "ldap_entries.dn LIKE CONCAT('%',?)"
insentry_query "INSERT INTO ldap_entries (dn,oc_map_id,parent,keyval) VALUES (?,?,?,?)"
has_ldapinfo_dn_ru no
OpenLDAPサーバの起動
OpenLDAPサーバをテストモードで起動します。
# slapd -d5
すると、以下のようなエラーが出て起動が成功しませんでした...
Return code: -1
Native error code: 1054
SQL engine state: S0022
Message: [unixODBC][TCX][MyODBC]Unknown column 'sel_expr_u' in 'field list'
==>backsql_free_db_conn()
どうもテスト用データベースが不完全で接続ができないようです。手動でsel_expr_uカラムを追加してみたのですが、それでも動作しませんでした。
と、ここまで実施してデータベースの構造まで確認する時間がないため作業を中断してしまいました。所感としては、
- データをRDBMSに保存できるので、データにアクセスするインターフェースを作成しやすい。
- すでにデータベースに保存されている情報をLDAPのインターフェースから利用できる。
という利点を狙っていたのですが、
- MySQLデータベース内に、LDAPのスキーマとMySQLのデータベース間の変換の定義を作成する必要があり、設定が煩雑。
- LDAPとMySQLの冗長化が難しく、システム自体が複雑になる。
というデメリットの方が大きいように感じたので、この組み合わせはリスキーかな...という印象です。
とはいえ途中まで設定しておいて動かないのは気持ち悪いので、いつかは動作させたいところです。




RDBMSとディレクトリツリーではデータ構造が全然違うため、なかなかスマートには動かせないみたいですね。
http://www.openldap.org/faq/data/cache/378.html
投稿: shiro3 | 2007年9月11日 (火) 18:00
OpenLDAP 2.2.13では古すぎて使えないと思いますよ。
投稿: | 2007年9月12日 (水) 21:41
shiro3>
スキーマの変換の定義を行なう必要があるとどうしても面倒ですね。(MySQLを使わない)通常のLDAPのスキーマでもそれほど単純ではないように感じているぐらいですので...
無名さん>
今ならばやはりopenldap-2.3系なのでしょうね。次に試すときは2.3系で試してみようと思います。
投稿: kodai | 2007年9月15日 (土) 01:08