Автор Тема: Вопрос новичка. Является ли SLAPD-SQL заменой прочих хранилищ?  (Прочитано 4544 раз)

uscr

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Добрый день.
Поднимаю 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(8)- ПРЕДСТАВИТЬ информацию, хранящуюся в некоторой реляционной СУБД, в виде поддерева 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."

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Здравствуйте! Сразу скажу, что я настоятельно не рекомендую даже браться за slapd-sql, особенно новичкам. Причины следующие:
- это экспериментальный бэкенд, активная поддержка которого завершилась в версии OpenLDAP 2.1 (то есть больше 15 лет назад);
- изначально это была довольно неуклюжая попытка впихнуть NoSQL-данные в реляционную структуру, причём довольно костыльными методами;
- без знания концепции представления информации в каталоге (если вы новичок), вы просто запутаетесь в каше из данных, потому что там действительно каша (даже и не для новичков);
- более-менее приличные попытки описать свои эксперименты с этим бэкендом датируются 2004-2005 годами, то есть желавшие поэкспериментировать, скорее всего, давно отошли от дел и помогать не станут;
- наконец, лично я не хочу даже вникать в настройки и запуск slapd-sql, поскольку практической пользы от него никакой, а в качестве "чистого эксперимента" это рискует поглотить очень много времени, которого итак ни на что не хватает. А больше вам на этом форуме вряд ли кто-то поможет.

LDAP-каталог разворачивают из-за простоты его использования, а не чтобы усложнить себе жизнь. Поэтому предлагаю вам сразу взяться за изучение основ, а эксперименты проводить на флагманском OpenLDAP-бэкенде slapd-mdb.

Чисто из любопытства:  где вы взяли настройки для database sql в slapd.conf? Где взяли структуру таблиц для БД?

Егор

uscr

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля

LDAP-каталог разворачивают из-за простоты его использования, а не чтобы усложнить себе жизнь. Поэтому предлагаю вам сразу взяться за изучение основ, а эксперименты проводить на флагманском OpenLDAP-бэкенде slapd-mdb.
Любопытно. А выглядело всё так хорошо. Жаль потраченного времени, но поделать нечего.

Чисто из любопытства:  где вы взяли настройки для database sql в slapd.conf? Где взяли структуру таблиц для БД?

Хорошо погуглил: https://gist.github.com/mahirrudin/9b7754e54f1e8e532049484864beba42 (инструкция не полная, нужны правила pparmor или отключение apparmor)
А маппинг запросов пишет сам бекенд при запуске демона. Внёс их в конфиг чтоб убрать варнинги.
« Последнее редактирование: 19 Май 2020, 13:35:39 от uscr »