Форум проекта Pro-LDAP.ru

Администрирование OpenLDAP => Вопросы безопасности => Access Control List (ACL) => Тема начата: mister87 от 19 Апрель 2013, 17:18:43

Название: Доступ к данным LDAP
Отправлено: mister87 от 19 Апрель 2013, 17:18:43
Всем здравствуйте!

Прошу помощи в решении задачи, я новичок в освоении LDAP, но задача срочная.

Необходимо настроить доступ к данным LDAP так, чтобы у суперпользователя -- на редактирование всех записей, а у пользователей -- просмотр только своих данных и редактирование только пароля!

Заранее благодарен за ответы и советы!
Название: Re: Доступ к данным LDAP
Отправлено: egor от 20 Апрель 2013, 03:54:25
Здравствуйте! Если под суперпользователем подразумевается тот, DN которого определён в конфигурации как rootDN (olcRootDN), то для него не надо определять никаких прав -- он всегда имеет полные права на всё. В этом случае ACL будут выглядеть так:
access to attr=userPassword
        by self write
        by anonymous auth
        by * none

access to *
        by * read

Если у суперпользователя какая-то отдельная запись, тогда ACL будет выглядеть так:
access to attr=userPassword
        by self write
        by dn.base="cn=superuser,dc=mycompany,dc=ru" write
        by anonymous auth
        by * none

access to *
        by dn.base="cn=superuser,dc=mycompany,dc=ru" write
        by * read

Если у Вас динамическая конфигурация то второй случай будет выглядеть так (первый адаптируйте сами):
dn: olcDatabase={1}bdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attr=userPassword
        by self write
        by dn.base="cn=superuser,dc=mycompany,dc=ru" write
        by anonymous auth
        by * none
olcAccess: {1}to *
        by dn.base="cn=superuser,dc=mycompany,dc=ru" write
        by * read

Егор
Название: Re: Доступ к данным LDAP
Отправлено: mister87 от 20 Апрель 2013, 16:30:19
Егор, спасибо большое! По первому варианту удалось, все получилось! Получается авторизованные пользователи могут редактировать только свой пароль! Остальное на чтение!

А подскажите пожалуйста, как сделать, чтоб они видели только свою учетку, я пользуюсь phpldapadmin. После авторизации, они видят всю БД LDAP, а хочется чтоб только свою учетку!

Или может посоветуете еще более удобный клиет, желательно web-интерфейс.
Название: Re: Доступ к данным LDAP
Отправлено: egor от 22 Апрель 2013, 09:34:31
Здравствуйте! ACL чтобы можно было видеть только свою запись:
access to attr=userPassword
        by self write
        by anonymous auth
        by * none

access to *
        by self read
        by * search

Насчёт клиентов посмотрите здесь (http://pro-ldap.ru/sources/index.html#clients).

Егор
Название: Re: Доступ к данным LDAP
Отправлено: mister87 от 25 Апрель 2013, 13:31:31
А как реализовать, пользователь имел возможность все свои данные редактировать, а остальных не видел!

Что-то не получилось у меня!
Название: Re: Доступ к данным LDAP
Отправлено: egor от 25 Апрель 2013, 14:50:55
Очевидно, так:
access to attr=userPassword
        by self write
        by anonymous auth
        by * none

access to *
        by self write
        by * search

Можно даже короче:
access to *
        by self write
        by anonymous auth
        by * search

Егор
Название: Re: Доступ к данным LDAP
Отправлено: mister87 от 25 Апрель 2013, 21:08:42
Егор, спасибо огромное!
Название: Re: Доступ к данным LDAP
Отправлено: mister87 от 27 Апрель 2013, 02:00:45
Егор, разрешите еще раз потревожить!

Вот раз уж я уже разрешил пользователям редактировать пароль, далее тут подумал, а почему бы не попробовать подключить проверку формата измененного пароля, ну например, думаю формат такой: от 6-ти символов, и только большие и маленькие буквы?

Подскажите, пожалуйста, возможно ли такое реализовать? Если да, то как, как-то  включить проверку устанавливаемого пароля по регэкспу?
Название: Re: Доступ к данным LDAP
Отправлено: egor от 27 Апрель 2013, 04:19:32
Здравствуйте! Вам надо к свой базе данных прикрутить наложение ppolicy, тогда можно будет применять к паролям различные ограничения. Почитайте здесь (http://pro-ldap.ru/tr/zytrax/ch6/ppolicy.html), в конце страницы есть примеры. Не слишком просто, но разобраться можно, мы тут с одним товарищем настраивали историю паролей, можете посмотреть (http://pro-ldap.ru/forum/index.php?topic=27.0).

Егор
Название: Re: Доступ к данным LDAP
Отправлено: mister87 от 27 Апрель 2013, 11:19:35
Егор, спасибо! Буду разбираться. Если возникнут вопросы, буду задавать!

Еще раз спасибо Вам за помощь!
Название: Re: Доступ к данным LDAP
Отправлено: mister87 от 29 Апрель 2013, 23:15:58
Доброго времени суток!

В общем покопал и как я понял, то для реализации задуманного, чтоб пароль состоял из 6-ти символов и только буквы большие и маленькие, то используются след аттрибуты:
1) pwdMinLength - для определения длины
2) pwdCheckQuality и pwdCheckModule - для выставления нестандартного расширения политик, в моем случае это большие и маленькие буквы.

С первым вроде более менее понятно, а вот со вторым сложнее - не нашел никакого нормального описания.

Может что посоветуете?
Название: Re: Доступ к данным LDAP
Отправлено: egor от 30 Апрель 2013, 04:16:13
Здравствуйте! В pwdCheckModule должна быть указана библиотека проверки паролей. Из ныне поддерживаемых самая известная -- от проекта LTB (http://ltb-project.org/wiki/documentation/openldap-ppolicy-check-password), почитайте, там хорошее описание. Библиотеку можно либо скомпилировать из исходников, либо, если у Вас centos (или другая производная redhat) -- скачать готовый rpm-пакет. Исходники и rpm можно получить на этой странице (http://ltb-project.org/wiki/download/).

Егор
Название: Re: Доступ к данным LDAP
Отправлено: mister87 от 30 Апрель 2013, 13:25:47
Егор, не подскажешь, сейчас пытаюсь наложить политику, он мне выдает:
  ldapadd -x -W -D cn=config -f policyAdd.ldif
Enter LDAP Password:
adding new entry "olcOverlay=ppolicy,olcDatabase={1}bdb,cn=config"
ldap_add: Invalid syntax (21)
        additional info: objectClass: value #0 invalid per syntax

Наложение политики, взял из Вашего поста (http://pro-ldap.ru/forum/index.php?topic=27.msg66#msg66).
Название: Re: Доступ к данным LDAP
Отправлено: egor от 01 Май 2013, 07:15:54
Здравствуйте! Скорее всего Вы не загрузили динамический модуль или не добавили набор схемы данных, необходимые для этого наложения. Если у Вас динамическая конфигурация, то посмотрите здесь (http://pro-ldap.ru/books/diving/begin/overlay.html). Если статическая -- добавьте в начало slapd.conf (до определения баз данных):
include /etc/openldap/schema/ppolicy.schema
moduleload ppolicy.la

Егор
Название: Re: Доступ к данным LDAP
Отправлено: mister87 от 03 Май 2013, 02:53:00
Егор, доброго времени суток!

Вроде что-то начало получаться, но есть снова проблемы. Что сделал:
1) Проверил схему - применена
2) Подключение модуля ppolicy:
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib/openldap
olcModuleLoad: ppolicy.la
3) Установил библиотеку
check_password.so
Сразу же настроил ее
4) Наложение политики:
dn: olcOverlay=ppolicy,olcDatabase={2}bdb,cn=config
objectClass: olcPPolicyConfig
olcOverlay: ppolicy
olcPPolicyDefault: cn=PPolicy Default,ou=System,dc=mycompany,dc=ru
5) Политика:
dn: cn=PPolicy Default,ou=System,dc=mycompany,dc=ru
objectClass: applicationProcess
objectClass: pwdPolicy
cn: PPolicy Default
pwdAttribute: 2.5.4.35
pwdInHistory: 3
pwdCheckModule: check_password.so
pwdCheckQuality: 1
При добавлении в базу самой политики вот что:
# ldapadd -x -W -D cn=config -f ppolicyDefault.ldif
Enter LDAP Password:
adding new entry "cn=PPolicy Default,ou=System,dc=mycompany,dc=ru"
ldap_add: Object class violation (65)
        additional info: attribute 'pwdCheckModule' not allowed

В чем может быть причина? Из-за чего он не может найти атрибут pwdCheckModule?
Название: Re: Доступ к данным LDAP
Отправлено: egor от 04 Май 2013, 09:48:16
Здравствуйте! Попробуйте так:
dn: cn=PPolicy Default,ou=System,dc=mycompany,dc=ru
objectClass: applicationProcess
objectClass: pwdPolicy
objectClass: pwdPolicyChecker
cn: PPolicy Default
pwdAttribute: 2.5.4.35
pwdInHistory: 3
pwdCheckModule: check_password.so
pwdCheckQuality: 1

Егор
Название: Re: Доступ к данным LDAP
Отправлено: mister87 от 11 Май 2013, 22:23:10
Егор, доброго Вам времени суток!

Сначала с прошедшими Вас праздниками!!!

В общем возвращаюсь к вопросу, т.к. не было времени заниматься, появлялись другие приоритетные задачи!!!
По Вашей рекомендации, последней:
Цитировать
dn: cn=PPolicy Default,ou=System,dc=mycompany,dc=ru
objectClass: applicationProcess
objectClass: pwdPolicy
objectClass: pwdPolicyChecker
cn: PPolicy Default
pwdAttribute: 2.5.4.35
pwdInHistory: 3
pwdCheckModule: check_password.so
pwdCheckQuality: 1
Спасибо! Удалось добавить.
Пытаюсь поставить готовый пакет, но не получается, хочет openldap-ltb. Когда пытаюсь поставить open-ltb.ругается на openldap-servers :(
Что можете посоветовать?

Позже нашел, вот этот пакет (http://ftp://fr2.rpmfind.net/linux/mageia/distrib/cauldron/i586/media/core/release/openldap-check_password-1.1-2.mga3.i586.rpm), вроде тоже похоже. Но все сделал, но так и не работает! :(
Название: Re: Доступ к данным LDAP
Отправлено: egor от 14 Май 2013, 00:51:20
Здравствуйте! Честно говоря, судя по предыдущим постам, я думал что с установкой Вы уже справились. У меня нет под рукой centos, поэтому я скомпилировал LTB-библиотеку из исходников в Ubuntu 12.04, скопировал готовый файл check_password.so туда, где лежат все модули от slapd, создал файл /etc/ldap/check_password.conf :
minPoints 3
useCracklib 0
minUpper 2
minLower 4
minDigit 1
minPunct 0

Потом исправил политику по умолчанию в DIT чтобы было так:
dn: cn=PPolicy Default,ou=System,dc=mycompany,dc=ru
objectClass: applicationProcess
objectClass: pwdPolicy
objectClass: pwdPolicyChecker
cn: PPolicy Default
pwdAttribute: userPassword
pwdInHistory: 3
pwdCheckModule: check_password.so
pwdCheckQuality: 1

Собственно, после этого стало работать:
# ldappasswd -x -D 'uid=egor,ou=Users,dc=mycompany,dc=ru' -w 123 -s 1234
Result: Constraint violation (19)
# ldappasswd -x -D 'uid=egor,ou=Users,dc=mycompany,dc=ru' -w 123 -s 111aaa
Result: Constraint violation (19)
# ldappasswd -x -D 'uid=egor,ou=Users,dc=mycompany,dc=ru' -w 123 -s 111aaA
Result: Constraint violation (19)
# ldappasswd -x -D 'uid=egor,ou=Users,dc=mycompany,dc=ru' -w 123 -s 1aaaaAA
Последний пароль ldappasswd принял.

Вероятно, у Вас не совпала версия OpenLDAP с той, с которой товарищ собирал rpm. Соберите из исходников, должно заработать.

Егор
Название: Re: Доступ к данным LDAP
Отправлено: mister87 от 14 Май 2013, 15:17:01
Егор, подскажите, пожалуйста, с какими параметрами собирали?
Название: Re: Доступ к данным LDAP
Отправлено: egor от 16 Май 2013, 03:38:52
Здравствуйте! Последовательность действий в моём случае:
1. Сначала я убедился, что заголовочного файла cracklib у меня нет, установил стандартный пакет для Ubuntu и ещё раз проверил -- теперь файл на месте:
# whereis crack
crack:
# apt-get install libcrack2-dev (для rpm-систем тут будет другая команда)
...
# whereis crack
crack: /usr/include/crack.h
2. Далее я выяснил свою версию slapd, скачал и распаковал исходники OpenLDAP:
# slapd -V
...
# wget ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release/
...
# tar xzf ./openldap-2.4.28.tgz -C /tmp/
3. После этого я скомпилировал openldap:
# cd /tmp/openldap-2.4.28
# ./configure
...
# make
...
4. Дальше я скачал и распаковал ltb-библиотеку
# wget http://tools.ltb-project.org/attachments/download/51/ltb-project-openldap-ppolicy-check-password-1.1.tar.gz
...
#  tar xzf ./ltb-project-openldap-ppolicy-check-password-1.1.tar.gz -C /tmp/openldap-2.4.28/
5. Теперь, собственно, сборка:
# cd /tmp/openldap-2.4.28/ltb-project-openldap-ppolicy-check-password-1.1
# make CONFIG="/etc/ldap/check_password.conf" LDAP_INC="-I/tmp/openldap-2.4.28/include/ -I/tmp/openldap-2.4.28/servers/slapd"
...
Параметр CONFIG указывался, поскольку в Ubuntu стандартные настройки OpenLDAP лежат в /etc/ldap (а не в /etc/openldap). В параметре LDAP_INC указал пути на только что скомпилированные библиотеки OpenLDAP.

Дальше всё как я описал в предыдущем посте (http://pro-ldap.ru/forum/index.php?topic=54.msg218#msg218).
Егор
Название: Re: Доступ к данным LDAP
Отправлено: mister87 от 21 Май 2013, 06:42:56
Егор, добрый день!

Огромное спасибо, благодаря Вашему совету и подробному описанию, мне удалось победить в данном направлении LDAP!

Но теперь следующая проблема встала предо мной, в консоли все здорово работает, а вот если через клиент (сейчас я использую LDAP Account Manager) могу менять пароль на какой угодно, правила не работают. Подскажите, что можно сделать, чтоб правило работало и в клиенте?
Название: Re: Доступ к данным LDAP
Отправлено: egor от 21 Май 2013, 14:57:40
Здравствуйте! Есть мнение, что в LAM смена пароля выполняется с помощью обычной операции modify, когда значение атрибута заменяется на другое, а ldappasswd использует операцию LDAP Password Modify Extended Operation (RFC 3062 (http://tools.ietf.org/html/rfc3062)). Поэтому при  изменении пароля в LAM условия наложения ppolicy не применяются. Посмотрите, может быть в настройках LAM есть какая-нибудь опция типа "использовать RFC 3062 при смене пароля".

Егор
Название: Re: Доступ к данным LDAP
Отправлено: mister87 от 28 Май 2013, 10:44:45
Егор, доброго времени суток!

Наконец-то снова дошли руки до настройки.

Все успешно настроил, в LAM оказывается все это делается в настройках самого приложения, выставил нужные параметры = политикам установленным на сервере и все!!!

Еще раз спасибо!!!
Название: Re: Доступ к данным LDAP
Отправлено: mister87 от 28 Май 2013, 11:27:45
Егор, разрешите вопрос.

Для общего развития?

Немного отлучусь назад по нашему диалогу. По правам на просмотр ldap. Я по Вашим советам сделал следующее:
access to *
        by self write
        by anonymous auth
        by * search
т.е. доступ на чтение и изменение только к своих данных.

Сейчас задумался, в перспективе, сделать, чтоб у конкретного пользователя были права, на чтение всей БД, у остальных на чтение запись только своих. Подскажите, как это будет выглядеть?
Название: Re: Доступ к данным LDAP
Отправлено: egor от 28 Май 2013, 13:59:50
Здравствуйте! Если у конкретного пользователя должен быть доступ на чтение всей базы, включая парольные атрибуты, то можно так:
access to *
        by self write
        by dn.base="uid=someuser,ou=Users,dc=mycompany,dc=ru" read
        by anonymous auth
        by * search

Если доступ на чтение всего, кроме парольных атрибутов, то так:
access to attr=userPassword
        by self write
        by anonymous auth
        by * none

access to *
        by self write
        by dn.base="uid=someuser,ou=Users,dc=mycompany,dc=ru" read
        by * search
В принципе, эти ACL из категории простейших. Не хочу показаться бестактным, но может стоит почитать теорию ACL в OLAG (http://pro-ldap.ru/tr/admin24/access-control.html) или в LFRS (http://pro-ldap.ru/tr/zytrax/ch6/#access)?

Егор
Название: Re: Доступ к данным LDAP
Отправлено: mister87 от 29 Май 2013, 23:21:17
Егор, доброго времени суток!

Спасибо Вам огромное за помощь! Без Вас я бы еще долго разбирадся бы.
Название: Re: Доступ к данным LDAP
Отправлено: Solo от 11 Сентябрь 2013, 09:59:13
Егор, здравствуйте.

Помогите настроить ACL на следующую задачу:
LDAP будет использоваться только как адресаная книга, но для нескольких доменов. Необходимо чтобы у каждого домена был свой суперпользователь с полными правами, а другие пользователи каждого домена получали доступ к только к своей книге на чтение по паролю (мне видится просто единый отдельный пользователь с паролем только на чтение).

Текущий конфиг (пока заведен только один домен):

access to * by * write

database   bdb

cachesize   200
suffix      "dc=example,dc=ru"
rootdn      "cn=admin,dc=example,dc=ru"

rootpw {SSHA}H08zq1G+kmYoYDGjxEAzlUhUfgxv+qom

directory   /var/lib/ldap

index objectClass                       eq,pres
index cn,sn,uid                 eq,pres,sub
index uidNumber,gidNumber,loginShell    eq,pres
index memberUid                     eq,pres,sub
index nisMapName,nisMapEntry            eq,pres,sub
index pgpCertID,pgpKeyID,pgpKeyType,pgpUserID,pgpKeyCreateTime sub,eq
index pgpSignerID,pgpSubKeyID,pgpKeySize,pgpKeyExpireTime sub,eq
index pgpDisabled,pgpRevoked eq
index homePhone,mobile eq
index mail eq

access to attr=userPassword
            by self write
            by anonymous auth
            by dn.base="cn=admin,dc=example,dc=ru" write
            by * none

access to attrs=userPassword
        by self
        by anonymous auth
        by dn.regex="cn=(.+),ou=ab,dc=example,dc=ru" write

access to *
        by dn.regex="cn=(.+),ou=ab,dc=example,dc=ru" write
Название: Re: Доступ к данным LDAP
Отправлено: egor от 11 Сентябрь 2013, 10:32:46
Здравствуйте!
LDAP будет использоваться только как адресаная книга, но для нескольких доменов. Необходимо чтобы у каждого домена был свой суперпользователь с полными правами, а другие пользователи каждого домена получали доступ к только к своей книге на чтение по паролю (мне видится просто единый отдельный пользователь с паролем только на чтение).
Честно говоря, не совсем понятно, что Вы имеете ввиду под терминами "домен", "книга", "суперпользователь домена", "пользователи домена" и "единый отдельный пользователь". Если ACL строится под структуру дерева каталога (а это, если я правильно понял, как раз Ваш случай), что для грамотного составления ACL требуется знать эту самую структуру дерева. Короче говоря, если это не секрет, приведите свою структуру: те записи, которые должны получать доступ и те записи, к которым доступ нужен. Если секрет -- пишите в личку.

Егор
Название: Re: Доступ к данным LDAP
Отправлено: Solo от 11 Сентябрь 2013, 10:40:29
Не секрет.

Как я это себе представляю:
есть адресная книга LDAP для нескольких организаций с доменами example.ru и primer.ru.
Пользователи каждой из организаций должны иметь доступ только к своей адресной книге и только на чтение. Также у каждой организации должен быть свой пользователь с правами на изменение всех атрибутов и добавление новых записей (только в свою книгу).
Название: Re: Доступ к данным LDAP
Отправлено: Solo от 11 Сентябрь 2013, 11:14:26
Под доменом я понимаю базовые уровни дерева (dc=example,dc=ru; dc=primer,dc=com).
Название: Re: Доступ к данным LDAP
Отправлено: egor от 11 Сентябрь 2013, 13:47:59
Здравствуйте! Если Вы не хотите сознаваться, я рискну погадать на кофейной гуще =).

У Вас на сервере будут облуживаться два DIT (каталога) с корневыми записями dc=example,dc=ru и dc=primer,dc=com, они заведены в интересах двух разных организаций. Соответственно, у каждого DIT будет своя административная запись rootDN.

В каждом из них будет ветка под адресную книгу, где будут храниться сведения (почта, телефоны) клиентов каждой из организаций. В первом случае это будет ou=ab,dc=example,dc=ru для адресной книги и cn=client1,ou=ab,dc=example,dc=ru для записи клиента, во втором случае это будет ou=ab,dc=primer,dc=com для адресной книги и cn=client2,ou=ab,dc=primer,dc=com для записи клиента.

Вы хотите перепоручить кому-то в каждой организации вести эти адресные книги, но не хотите при этом давать ему права rootDN, поэтому заводите отдельную запись с правами за изменение каталога, например, сn=ab_maker,dc=example,dc=ru и сn=ab_maker,primer,dc=com.

Наконец, Вы не хотите предоставить к этим DIT анонимный доступ, чтобы люди из разных организаций не могли прочитать адресные книги друг друга, поэтому Вы запрещаете анонимный доступ и заводите пользователя с паролем и правами только на чтение адресной книги, например, сn=ab_reader,dc=example,dc=ru и сn=ab_reader,primer,dc=com, а затем раздаёте сведения об этих записях и их паролях людям в соответствующих организациях, которые будут читать эти книги.

Я Вас правильно понял?
Егор
Название: Re: Доступ к данным LDAP
Отправлено: Solo от 11 Сентябрь 2013, 14:00:34
Сам докопался до, наверное, банальнейшего правила:
access to *
        by self
        by anonymous auth
   by dn="uid=test,ou=addressbook,ou=services,dc=example,dc=ru" read

Где test - общий пользователь с паролем для доступа к книге на чтение. Вроде пока работает так как мне нужно.

Остался вопрос как реализовать несколько базовых уровней (для каждой органиазции). Т.е. чтобы в дереве присутствовали example.ru, primer.com и т.д.
Название: Re: Доступ к данным LDAP
Отправлено: Solo от 11 Сентябрь 2013, 14:01:57
Егор, Вы просто читаете мои мысли )))
Название: Re: Доступ к данным LDAP
Отправлено: egor от 11 Сентябрь 2013, 14:30:07
Здравствуйте!
Сам докопался до, наверное, банальнейшего правила:
access to *
        by self
        by anonymous auth
   by dn="uid=test,ou=addressbook,ou=services,dc=example,dc=ru" read

IMHO, так будет правильнее (исходя из тех предпосылок, что я привёл в прошлом посте):
access to dn.children="ou=ab,dc=example,dc=ru"
        by anonymous auth
        by dn="cn=ab_maker,dc=example,dc=ru" write
        by dn="cn=ab_reader,dc=example,dc=ru" read
        by * none
Для второго DIT, соответственно, по аналогии.
Остался вопрос как реализовать несколько базовых уровней (для каждой органиазции). Т.е. чтобы в дереве присутствовали example.ru, primer.com и т.д.
Поскольку корневые записи (а правильнее будет сказать, контексты именования) этих DIT разные, то нужно заводить два разных DIT в составе одного LDAP-сервера  и для каждого определять свои ACL. Как завести два DIT можно посмотреть в LFRS (http://pro-ldap.ru/tr/zytrax/ch11/multi-dit.html).

Егор
Название: Re: Доступ к данным LDAP
Отправлено: Solo от 11 Сентябрь 2013, 14:55:07
Егор, спасибо большое за помощь. Буду ковыряться дальше.
Название: Re: Доступ к данным LDAP
Отправлено: Solo от 12 Сентябрь 2013, 10:39:57
Егор, еще вопрос по ACL:

вот на такое правило:

access to dn.children="ou=addressbook,dc=example,dc=ru"
        by anonymous auth
        by dn="cn=ab_admin,dc=example,dc=ru" write
        by dn="cn=ab_read,dc=example,dc=ru" read
        by * none

slaptest ругается на первую строчку правила: "warning: no by clause(s) specified in access line"
Вроде все правильно указано, что ему не нравится ?
Название: Re: Доступ к данным LDAP
Отправлено: Solo от 12 Сентябрь 2013, 10:46:32
Заменил  на dn.base="dc=example,dc=ru" и зарабтало.

По логике этого должно хватить.

Для второго DIT просто укажу другой dn.base
Название: Re: Доступ к данным LDAP
Отправлено: egor от 12 Сентябрь 2013, 11:11:19
Здравствуйте!
Заменил  на dn.base="dc=example,dc=ru" и зарабтало.

По логике этого должно хватить.
Как раз по логике это неравноценная замена -- Вы ограничиваете доступ к разным частям дерева. Убедитесь, что у ab_admin есть право на запись, а у ab_reader его нет.

Егор
Название: Re: Доступ к данным LDAP
Отправлено: Solo от 12 Сентябрь 2013, 15:56:32
Цитировать
Как раз по логике это неравноценная замена -- Вы ограничиваете доступ к разным частям дерева. Убедитесь, что у ab_admin есть право на запись, а у ab_reader его нет.

Егор

Права проверил, работают корректно.
Егор, помогите пожалуйста разобраться - в Вашей редакции ACL
access to dn.children="ou=addressbook,dc=example,dc=ru"
        by anonymous auth
        by dn="cn=ab_admin,dc=example,dc=ru" write
        by dn="cn=ab_read,dc=example,dc=ru" read
        by * none

slaptest ругается на первую строчку правила: "warning: no by clause(s) specified in access line"

В чем уязвимость если я использую мой вариант (с учетом того, что для разных DIT разные rootdn и разные пароли для пользователей) ?
Название: Re: Доступ к данным LDAP
Отправлено: egor от 13 Сентябрь 2013, 04:50:36
Здравствуйте! Я тут поэкспериментировал немного с ACL, вышло что-то в таком духе (slapd.conf):
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/inetorgperson.schema

database mdb
suffix "dc=example,dc=ru"
directory ./mdb
rootdn    "cn=admin,dc=example,dc=ru"
rootpw    admin
maxsize   1073741824

# Разрешаем аутентификацию по userPassword
access to attrs=userPassword
  by anonymous auth
  by * none

# Разрешаем ab_admin ДОБАВЛЯТЬ записи в addressbook
# (но не саму запись addressbook)
access to dn.base="ou=addressbook,dc=example,dc=ru" attrs=children
  by dn="cn=ab_admin,dc=example,dc=ru" write
  by * none

# Разрешаем ab_admin ИЗМЕНЯТЬ записи в addressbook
# а ab_reader ЧИТАТЬ записи в addressbook
# (но не саму запись addressbook)
access to dn.children="ou=addressbook,dc=example,dc=ru"
  by dn="cn=ab_admin,dc=example,dc=ru" write
  by dn="cn=ab_reader,dc=example,dc=ru" read
  by * none

# Остальные записи просматривать запрещено
access to *
  by users search
  by * none

LDIF, с которого я инициализировал каталог (init.ldif):
dn: dc=example,dc=ru
objectClass: organization
objectClass: dcObject
dc: example
o: example

dn: cn=ab_admin,dc=example,dc=ru
objectClass: inetOrgPerson
cn: ab_admin
sn: ab_admin
userPassword: ab_admin

dn: cn=ab_reader,dc=example,dc=ru
objectClass: inetOrgPerson
cn: ab_reader
sn: ab_reader
userPassword: ab_reader

dn: ou=addressbook,dc=example,dc=ru
objectClass: organizationalUnit
ou: addressbook

dn: cn=client1,ou=addressbook,dc=example,dc=ru
objectClass: inetOrgPerson
cn: client1
sn: client1
mail: boss@some.org

Запускаю slapd, инициализирую каталог от имени rootDN:
# /usr/lib/openldap/slapd -h 'ldap://127.0.0.1:9000' -f ./slapd.conf
# ldapadd -H 'ldap://127.0.0.1:9000' -f ./init.ldif -x -D 'cn=admin,dc=example,dc=ru' -w admin
adding new entry "dc=example,dc=ru"

adding new entry "cn=ab_admin,dc=example,dc=ru"

adding new entry "cn=ab_reader,dc=example,dc=ru"

adding new entry "ou=addressbook,dc=example,dc=ru"

adding new entry "cn=client1,ou=addressbook,dc=example,dc=ru"

Поиск от анонима, ab_reader, ab_admin:
# ldapsearch -x -LLL -H 'ldap://127.0.0.1:9000' -b 'dc=example,dc=ru'
No such object (32)
# ldapsearch -x -LLL -H 'ldap://127.0.0.1:9000' -b 'dc=example,dc=ru' -D 'cn=ab_reader,dc=example,dc=ru' -w ab_reader
dn: cn=client1,ou=addressbook,dc=example,dc=ru
objectClass: inetOrgPerson
cn: client1
sn: client1
mail: boss@some.org

# ldapsearch -x -LLL -H 'ldap://127.0.0.1:9000' -b 'dc=example,dc=ru' -D 'cn=ab_admin,dc=example,dc=ru' -w ab_admin
dn: cn=client1,ou=addressbook,dc=example,dc=ru
objectClass: inetOrgPerson
cn: client1
sn: client1
mail: boss@some.org

Всё штатно. Попромуем добавить/изменить записи в адресной книге, для этого создадим modify.ldif:
dn: cn=client2,ou=addressbook,dc=example,dc=ru
changetype: add
objectClass: inetOrgPerson
cn: client2
sn: client2
mail: dima@some.org

dn: cn=client1,ou=addressbook,dc=example,dc=ru
changetype: modify
replace: mail
mail: manager@some.org

Попробуем применить его от анонима ab_reader, ab_admin:
# ldapmodify -x -H 'ldap://127.0.0.1:9000' -f ./modify.ldif
modifying entry "ou=addressbook,dc=example,dc=ru"
ldap_modify: Strong(er) authentication required (8)
additional info: modifications require authentication

# ldapmodify -x -H 'ldap://127.0.0.1:9000' -f ./modify.ldif -D 'cn=ab_reader,dc=example,dc=ru' -w ab_reader
adding new entry "cn=client2,ou=addressbook,dc=example,dc=ru"
ldap_add: Insufficient access (50)
additional info: no write access to parent

# ldapmodify -x -H 'ldap://127.0.0.1:9000' -f ./modify.ldif -D 'cn=ab_admin,dc=example,dc=ru' -w ab_admin
adding new entry "cn=client2,ou=addressbook,dc=example,dc=ru"

modifying entry "cn=client1,ou=addressbook,dc=example,dc=ru"

Всё как положено. Последний тест -- пробуем изменить саму запись addressbook. Создадим modify2.ldif:
dn: ou=addressbook,dc=example,dc=ru
changetype: modify
add: description
description: Address Book

Попробуем применить его от имени ab_admin:
# ldapmodify -x -H 'ldap://127.0.0.1:9000' -f ./modify2.ldif -D 'cn=ab_admin,dc=example,dc=ru' -w ab_admin
modifying entry "ou=addressbook,dc=example,dc=ru"
ldap_modify: Insufficient access (50)

Все тесты прошли успешно.

Егор
Название: Re: Доступ к данным LDAP
Отправлено: Solo от 13 Сентябрь 2013, 10:03:56
Егор, еще раз спасибо. Обязательно попробую Ваш вариант.