Назад | Перейти на главную страницу

ACL OpenLDAP с использованием наборов

Итак, я пытаюсь написать некоторые правила LDAP, которые позволят определенным людям писать некоторые поддеревья.

Допустим, у нас есть этот пользователь:

dn: uid=minion1,o=mycompany,ou=cust,dc=some,dc=domain
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
isAdmin: TRUE

И этот пользователь:

dn: uid=minion2,o=mycompany,ou=cust,dc=some,dc=domain
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
isAdmin: FALSE

Да, и этот пользователь:

dn: uid=minion3,o=notmycompany,ou=cust,dc=some,dc=domain
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
isAdmin: FALSE

Я пытаюсь установить разрешения для minion1 на изменение учетной записи minion2, но не minion3 (если вы посмотрите, minion3 находится в другой организации «notmycompany», а два других находятся в «mycompany»).

Основное правило заключается в том, что пользователь должен иметь возможность добавлять / изменять / удалять записи в своей организации на основе того, установлено ли для свойства isAdmin значение ИСТИНА, И если объект находится в той же организации, что и пользователь, которого он / она хочет изменить.

Мой частично рабочий ACL:

to dn.regex="^.+o=([^,]+),ou=cust,dc=some,dc=domain$" 
by set="user/isAdmin & [TRUE]" write 

Это, конечно же, позволит им изменить учетную запись minion3. Я бы хотел добавить

"[^.+,o=$1,ou=cust,dc=some,dc=domain$]"

на строчку выше, но до сих пор я с треском провалился. Есть ли у кого-нибудь хорошие идеи, которые я могу попробовать? (Я адекватно объяснил, что пытаюсь здесь сделать)?

Заранее спасибо;

Я потратил некоторое время на просмотр документация на наборы, и проблема в том, что операторы набора (например, &) действительно работают только с данными одного типа ... поэтому вы можете запросить пересечение DN и DN или значения атрибута и строки, но пересечение вещей разных типов не имеет смысла.

Итак, строим строку, используя isAdmin атрибут и чудеса конкатенации строк, например:

olcAccess: {1}to dn.regex="o=([^,]+),ou=cust,dc=some,dc=domain$" 
    by set.expand="([admin=] + user/isAdmin + [,] + user/-1) & ([admin=TRUE] + [,o=$1,ou=cust,dc=some,dc=domain])" write 
    by * break

Обратите внимание на пользователя set.expand, потому что мы хотим использовать $1 в определении множества и обратите внимание на использование [...] чтобы поместить буквальные значения в строки, которые мы оцениваем.

Для тех, кто вошел в систему как minion1, это запросит пересечение:

admin=TRUE,o=mycompany,ou=cust,dc=some,dc=domain

и буквальное значение:

admin=TRUE,o=mycompany,ou=cust,dc=some,dc=domain

Это непустой набор, поэтому он работает. Для кого-то с isAdmin=FALSE (или нет isAdmin атрибут), сравнение будет с admin=FALSE,... или admin=,.... Точно так же для кого-то не из той же организации o=... в качестве цели пересечение даст пустой набор.

Если тебе интересно, этот это то, что я фактически использовал для тестирования. я использую employeeType вместо того isAdmin потому что я не хотел возиться с добавлением нового атрибута в мою схему.

Также: slapd -dacl ... твой друг.