У нас есть сервер OpenLDAP (2.4.45), который содержит всех наших пользователей, группы, правила sudo и т. Д.
Мне нужно подключить новое приложение к этому серверу, однако это приложение требует, чтобы анонимный пользователь мог читать атрибуты (он будет знать точное DN, для которого ему нужно читать атрибуты).
Теперь предполагая структуру как:
o=Example(dc=example,dc=com)
ou=People
uid=user1
uid=user2
ou=Groups
cn=group1
cn=group2
Мне нужно ограничить то, что анонимные пользователи могут получить все атрибуты пользователя, если они знают точный dn (например, dn = "uid = user1, ou = People, dc = example, dc = com") и полностью не могут обнаружить другие записи ( если они не знают точный dn).
Читая документацию OpenLDAP, я предположил, что следующий ACL должен работать:
olcAccess: {0}to dn.children="ou=Groups,dc=example,dc=com"
by * read break
olcAccess: {1}to *
by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
by anonymous none stop
by * read
Однако кажется break
и stop
не дают ожидаемых результатов, поскольку запросы напрямую к "cn = test, ou = Groups, dc = example, dc = com" приводят к No such object (32)
Как правильно достичь вышеуказанного?
На самом деле ответ был довольно простым (указал на это в IRC):
ACL должен быть таким:
olcAccess: {0}to dn.children="ou=Groups,dc=example,dc=com"
by anonymous stop
by * read break
olcAccess: {1}to *
by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
by anonymous none stop
by * read
Обратите внимание stop
строка в {0}, в исходном ACL сначала предоставляется доступ для чтения, но затем удаляется из-за break
в новой версии анонимный пользователь явно предоставил доступ для чтения, а затем OpenLDAP приказал прекратить обработку ACL для этого запроса.