Здравствуйте ещё раз. Чтобы внести ясность, придётся начать со структуры конфигурационного файла. Хоть это и не очевидно, но он разбит на разделы =) . Всё, что находится ПЕРЕД первой директивой database (или первой директивой backend) -- это глобальный раздел. То есть в Вашем случае к глобальному разделу относятся подключения файлов наборов схемы данных (include), местоположения фалов параметров (pidfile и argsfile), подгрузки динамических модулей (modulepath и moduleload) и настройки ACL (access). ПОСЛЕ директивы database (и до следующей директивы database или до конца файла) идут настройки конкретной БД, в Вашем случае это mdb с суффиксом dc=mycompany,dc=lan. Настройки глобального раздела либо относятся к самому slapd, либо распространяются на все базы данных (как в случае директив access). Именно об этом я писал в конце прошлого поста. Потому в приведённом мною примере slapd.conf итоговый набор ACL для БД будет выглядеть так:
access to dn.subtree="ou=adrbookusers,dc=mycompany,dc=lan" attrs=userPassword
by anonymous auth
by * none
access to dn.subtree="ou=addressbook,dc=mycompany,dc=lan"
by dn.base="cn=adrbook,ou=adrbookusers,dc=mycompany,dc=lan" write
by * none
access to dn.subtree="ou=adrbookprivate,dc=mycompany,dc=lan"
by dn.base="cn=userspriv,ou=adrbookusers,dc=mycompany,dc=lan" write
by * none
access to dn.subtree="dc=mycompany,dc=lan"
by * search
# это унаследовано из глобального раздела
access to dn.base=""
by * read
access to dn.base="cn=Subschema"
by * read
access to *
by * none
В Вашем же случае набор ACL выглядит так:
access to dn.base=""
by * read
access to dn.base="cn=Subschema"
by * read
access to * # <-- на этом этапе оценка ACL заканчивается
by * none
access to dn.subtree="ou=adrbookusers,dc=mycompany,dc=lan" attrs=userPassword
by anonymous auth
by * none
access to dn.subtree="ou=addressbook,dc=mycompany,dc=lan"
by dn.base="cn=adrbook,ou=adrbookusers,dc=mycompany,dc=lan" write
by * none
access to dn.subtree="ou=adrbookprivate,dc=mycompany,dc=lan"
by dn.base="cn=userspriv,ou=adrbookusers,dc=mycompany,dc=lan" write
by * none
access to dn.subtree="dc=mycompany,dc=lan"
by * search
access to * by * read
Как я опять же писал в предыдущем посте, ACL оцениваются один за другим до нахождения первого совпадения. 3-й ACL совпадает с любым объектом из БД и запрещает доступ всем, поэтому к Вашему каталогу доступа в принципе нет и быть не может. Если добавить в начало списка
access to * by * read
то у всех сразу появляется доступ на чтение и каталог становится виден. Всё просто, никакой мистики.
Теперь по Вашей задаче. Я бы на Вашем месте вообще не определял никаких глобальных ACL. Те ACL, которые я оставил в глобальном разделе в прошлый раз, не играют никакой роли -- так каталог будет работать и по умолчанию, я их оставил в качестве примера глобальных ACL (и, видимо, зря, только Вас запутал). Определите только НУЖНЫЕ Вам ACL в правильной последовательности (от более конкретных к более общим) в разделе БД:
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/openldap/slapd.pid
#argsfile /var/run/openldap/slapd.args
modulepath /usr/lib/ldap
moduleload back_mdb
database mdb
maxsize 1073741824
suffix "dc=mycompany,dc=lan"
rootdn "cn=root,dc=mycompany,dc=lan"
rootpw rootPassword
directory /data/openldap-experiments/2017-10-02-acl_concat/db/
index objectClass eq
access to dn.subtree="ou=adrbookusers,dc=mycompany,dc=lan" attrs=userPassword
by anonymous auth
by * none
access to dn.subtree="ou=addressbook,dc=mycompany,dc=lan"
by dn.base="cn=adrbook,ou=adrbookusers,dc=mycompany,dc=lan" write
by * read
access to dn.subtree="ou=adrbookprivate,dc=mycompany,dc=lan"
by dn.base="cn=userspriv,ou=adrbookusers,dc=mycompany,dc=lan" write
by * none
access to dn.subtree="dc=mycompany,dc=lan"
by * search
Во 2-м ACL я смягчил условие с by * none на by * read чтобы анонимные пользователи могли читать эту адресную книгу.
Егор