OpenLDAP 預設使用 BerkeleyDB 儲存,若需整合既有關聯式資料庫、支援第三方應用直接管理目錄物件,可採用 back-sql 模組搭配 MySQL + ODBC 橋接。本文基於 FreeBSD Ports 環境,詳細記錄從元件安裝、ODBC 設定、Schema 匯入到 slapd 配置的完整流程。
OpenLDAP (slapd) -- back-sql --> libiodbc --> MyODBC --> MySQL Server
(SQL backend) (ODBC Driver Manager) (MySQL ODBC Driver)
# MySQL 伺服器與客戶端
cd /usr/ports/databases/mysql56-server && make install clean
cd /usr/ports/databases/mysql56-client && make install clean
# ODBC 驅動管理器與 MySQL ODBC 驅動
cd /usr/ports/databases/libiodbc && make install clean
cd /usr/ports/databases/mysql-connector-odbc && make install clean
# OpenLDAP 啟用 ODBC 支援
cd /usr/ports/net/openldap24-server
make WITH_ODBC=YES install clean
mysqladmin -u root -p create ldap
mysql -u root -p -e "
GRANT ALL PRIVILEGES ON ldap.* TO 'ldap'@'localhost' IDENTIFIED BY 'ldap_password' WITH GRANT OPTION;
FLUSH PRIVILEGES;
"
/usr/local/etc/libiodbc/odbcinst.ini
[ODBC Drivers]
MySQL = Installed
[MySQL]
Description = ODBC for MySQL
Driver = /usr/local/lib/libmyodbc5w.so # 或 libmyodbc5a.so (ANSI)
Setup = /usr/local/lib/libmyodbc5w.so
FileUsage = 1
/usr/local/etc/libiodbc/odbc.ini
[ODBC Data Sources]
ldap = MySQL LDAP DSN
[ldap]
Driver = /usr/local/lib/libmyodbc5w.so
Description = OpenLDAP Database
Server = localhost
Port = 3306
Database = ldap
User = ldap
Password = ldap_password
Socket = /tmp/mysql.sock
Option = 3
ReadOnly = No
# 安裝測試工具 (若未自動安裝)
cd /usr/ports/databases/libiodbc/work/libiodbc-*/samples && make install
# 測試
iodbctest
# 輸入 DSN=ldap 應成功列出資料表
# 找到 Ports 建置目錄下的 Schema 檔案
cd /usr/ports/net/openldap24-server/work/openldap-*/servers/slapd/back-sql/rdbms_depend/mysql
# 複製 slapd.conf 範本
cp slapd.conf /usr/local/etc/openldap/
# 匯入建表腳本
mysql -u ldap -p ldap < backsql_create.sql
mysql -u ldap -p ldap < testdb_create.sql
# 選擇性匯入測試資料
mysql -u ldap -p ldap < testdb_data.sql
mysql -u ldap -p ldap < testdb_metadata.sql
# 載入 back-sql 模組
moduleload back_sql.la
# 資料庫定義區段
database sql
suffix "o=myorg,c=US"
rootdn "cn=admin,o=myorg,c=US"
rootpw {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx
# ODBC 連線設定
dbname ldap
dbuser ldap
dbpasswd ldap_password
subtree_cond "ldap_entries.dn LIKE CONCAT('%',?)"
insentry_query "INSERT INTO ldap_entries (dn,oc_map_id,parent,keyval) VALUES (?,?,?,?)"
# 其他 mapping 查詢保持預設或依 schema 調整
# 註解掉其他範例資料庫 (bdb, hdb, mdb 等)
/etc/rc.conf
slapd_enable="YES"
slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/"'
slapd_sockets="/var/run/openldap/ldapi"
/etc/rc.d/slapd 啟動腳本中加入 ODBC 環境變數:
export ODBCINI=/usr/local/etc/libiodbc/odbc.ini
# 偵錯模式啟動觀察
/usr/local/libexec/slapd -d 1
# 關鍵成功訊息:
# backsql_db_open(): test succeeded, schema map loaded
# slapd starting
# 正式啟動
service slapd start
# 驗證監聽埠
sockstat | grep slapd
# ldap slapd 12345 9 tcp4 *:389 *:*
# 使用 ldapsearch 測試
ldapsearch -x -H ldap://localhost -b "o=myorg,c=US" -D "cn=admin,o=myorg,c=US" -W
slapadd 匯入 back-sql(需對應 mapping 表)。ldap 資料庫,比 BerkeleyDB 更易備份、複寫、稽核。ldap_entries.dn, ldap_attr_mappings.oc_name)建立索引。