Добрый день.
Поднимаю LDAP первый раз. ОС ubuntu 16.04. Мякотка в том, что это мой первый раз и сразу для продакшена в крупной компании.
Прошёл по шагам
руководство убунты.
Затем мне показалось, что от ряда проблем меня избавит хранение дерева в mysql. Репликация, отказоустойчивость, резервное копирование могут быть реализованы привычными инструментами.
Поднял slapd заново с бекендом в виде mysql. С вашего позволения сразу покажу конфиг:
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/misc.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/openldap.schema
pidfile /var/run/slapd/slapd.pid
argsfile /var/run/slapd/slapd.args
moduleload back_sql
database sql
suffix "dc=example,dc=com"
rootdn "cn=admin,dc=example,dc=com"
rootpw ROOTPW
dbname ldap
dbuser ldap
dbhost 127.0.0.1
dbname ldap
dbpasswd EethooK6loogieph
has_ldapinfo_dn_ru no
subtree_cond "ldap_entries.dn LIKE CONCAT('%',?)"
children_cond "ldap_entries.dn LIKE CONCAT('%,',?)"
dn_match_cond "ldap_entries.dn=?"
oc_query "SELECT id,name,keytbl,keycol,create_proc,delete_proc,expect_return FROM ldap_oc_mappings"
at_query "SELECT name,sel_expr,from_tbls,join_where,add_proc,delete_proc,param_order,expect_return,sel_expr_u FROM ldap_attr_mappings WHERE oc_map_id=?"
insentry_stmt "INSERT INTO ldap_entries (dn,oc_map_id,parent,keyval) VALUES (?,?,?,?)"
delentry_stmt "DELETE FROM ldap_entries WHERE id=?"
renentry_stmt "UPDATE ldap_entries SET dn=?,parent=?,keyval=? WHERE id=?"
delobjclasses_stmt "DELETE FROM ldap_entry_objclasses WHERE entry_id=?"
concat_pattern "CONCAT(?,?);"
Смущает цитата из документации: "Основное назначение данного механизма манипуляции данными slapd(

- ПРЕДСТАВИТЬ информацию, хранящуюся в некоторой реляционной СУБД, в виде поддерева LDAP без какого-либо дополнительного программирования (не будем рассматривать в качестве программирования инструкции SQL и (возможно) хранимые процедуры)."
Верно ли я вообще понимаю, что могу понять LDAP с хранилищем в mysql и пользоваться им "как обычно"?
Дело в том, что пример с ldapadd из вышеупомянутого руководства завершается с ошибкой:
dn: ou=People,dc=example,dc=com
ou: People
dn: ou=Groups,dc=example,dc=com
objectClass: organizationalUnit
ou: Groups
dn: cn=miners,ou=Groups,dc=example,dc=com
objectClass: posixGroup
cn: sudo
gidNumber: 5000
dn: uid=test,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: test
sn: Test
givenName: Test
cn: Test Test
displayName: Test Test
uidNumber: 10000
gidNumber: 5000
userPassword: 123qwe
gecos: Test Test
loginShell: /bin/bash
homeDirectory: /home/test
~# ldapadd -x -D cn=admin,dc=example,dc=com -W -f add_content.ldif
Enter LDAP Password:
adding new entry "ou=People,dc=example,dc=com"
ldap_add: Server is unwilling to perform (53)
additional info: operation not permitted within namingContext
5ec3a143 slap_listener_activate(8):
5ec3a143 >>> slap_listener(ldap:///)
5ec3a143 connection_get(11)
5ec3a143 connection_get(11): got connid=1002
5ec3a143 connection_read(11): checking for input on id=1002
ber_get_next
ber_get_next: tag 0x30 len 50 contents:
5ec3a143 op tag 0x60, time 1589879107
ber_get_next
5ec3a143 conn=1002 op=0 do_bind
ber_scanf fmt ({imt) ber:
ber_scanf fmt (m}) ber:
5ec3a143 >>> dnPrettyNormal: <cn=admin,dc=example,dc=com>
=> ldap_bv2dn(cn=admin,dc=example,dc=com,0)
<= ldap_bv2dn(cn=admin,dc=example,dc=com)=0
=> ldap_dn2bv(272)
<= ldap_dn2bv(cn=admin,dc=example,dc=com)=0
=> ldap_dn2bv(272)
<= ldap_dn2bv(cn=admin,dc=example,dc=com)=0
5ec3a143 <<< dnPrettyNormal: <cn=admin,dc=example,dc=com>, <cn=admin,dc=example,dc=com>
5ec3a143 do_bind: version=3 dn="cn=admin,dc=example,dc=com" method=128
5ec3a143 ==>backsql_bind()
5ec3a143 conn=1002 op=0: rootdn="cn=admin,dc=example,dc=com" bind succeeded
5ec3a143 <==backsql_bind(0)
5ec3a143 do_bind: v3 bind: "cn=admin,dc=example,dc=com" to "cn=admin,dc=example,dc=com"
5ec3a143 send_ldap_result: conn=1002 op=0 p=3
5ec3a143 send_ldap_result: err=0 matched="" text=""
5ec3a143 send_ldap_response: msgid=1 tag=97 err=0
ber_flush2: 14 bytes to sd 11
5ec3a143 connection_get(11)
5ec3a143 connection_get(11): got connid=1002
5ec3a143 connection_read(11): checking for input on id=1002
ber_get_next
ber_get_next: tag 0x30 len 89 contents:
5ec3a143 op tag 0x68, time 1589879107
ber_get_next
5ec3a143 conn=1002 op=1 do_add
ber_scanf fmt ({m) ber:
5ec3a143 conn=1002 op=1 do_add: dn (ou=People,dc=example,dc=com)
ber_scanf fmt ({m{W}}) ber:
ber_scanf fmt ({m{W}}) ber:
ber_scanf fmt (}) ber:
5ec3a143 >>> dnPrettyNormal: <ou=People,dc=example,dc=com>
=> ldap_bv2dn(ou=People,dc=example,dc=com,0)
<= ldap_bv2dn(ou=People,dc=example,dc=com)=0
=> ldap_dn2bv(272)
<= ldap_dn2bv(ou=People,dc=example,dc=com)=0
=> ldap_dn2bv(272)
<= ldap_dn2bv(ou=people,dc=example,dc=com)=0
5ec3a143 <<< dnPrettyNormal: <ou=People,dc=example,dc=com>, <ou=people,dc=example,dc=com>
5ec3a143 ==>backsql_add("ou=People,dc=example,dc=com")
5ec3a143 oc_check_required entry (ou=People,dc=example,dc=com), objectClass "organizationalUnit"
5ec3a143 oc_check_allowed type "objectClass"
5ec3a143 oc_check_allowed type "ou"
5ec3a143 oc_check_allowed type "structuralObjectClass"
5ec3a143 backsql_add("ou=People,dc=example,dc=com"): cannot map structuralObjectClass "organizationalUnit" -- aborting
5ec3a143 send_ldap_result: conn=1002 op=1 p=3
5ec3a143 send_ldap_result: err=53 matched="" text="operation not permitted within namingContext"
5ec3a143 send_ldap_response: msgid=2 tag=105 err=53
ber_flush2: 58 bytes to sd 11
5ec3a143 <==backsql_add("ou=People,dc=example,dc=com"): 53 "operation not permitted within namingContext"
5ec3a143 connection_get(11)
5ec3a143 connection_get(11): got connid=1002
5ec3a143 connection_read(11): checking for input on id=1002
ber_get_next
ber_get_next: tag 0x30 len 5 contents:
5ec3a143 op tag 0x42, time 1589879107
ber_get_next
5ec3a143 conn=1002 op=2 do_unbind
5ec3a143 connection_close: conn=1002 sd=11
Ну а phpldapadmin говорит: "This base cannot be created with PLA."