Автор Тема: Доступ к данным LDAP  (Прочитано 103149 раз)

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Доступ к данным LDAP
« Ответ #30 : 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, а затем раздаёте сведения об этих записях и их паролях людям в соответствующих организациях, которые будут читать эти книги.

Я Вас правильно понял?
Егор

Solo

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Доступ к данным LDAP
« Ответ #31 : 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 и т.д.

Solo

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Доступ к данным LDAP
« Ответ #32 : 11 Сентябрь 2013, 14:01:57 »
Егор, Вы просто читаете мои мысли )))

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Доступ к данным LDAP
« Ответ #33 : 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.

Егор

Solo

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Доступ к данным LDAP
« Ответ #34 : 11 Сентябрь 2013, 14:55:07 »
Егор, спасибо большое за помощь. Буду ковыряться дальше.

Solo

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Доступ к данным LDAP
« Ответ #35 : 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"
Вроде все правильно указано, что ему не нравится ?

Solo

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Доступ к данным LDAP
« Ответ #36 : 12 Сентябрь 2013, 10:46:32 »
Заменил  на dn.base="dc=example,dc=ru" и зарабтало.

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

Для второго DIT просто укажу другой dn.base

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Доступ к данным LDAP
« Ответ #37 : 12 Сентябрь 2013, 11:11:19 »
Здравствуйте!
Заменил  на dn.base="dc=example,dc=ru" и зарабтало.

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

Егор

Solo

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Доступ к данным LDAP
« Ответ #38 : 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 и разные пароли для пользователей) ?

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Доступ к данным LDAP
« Ответ #39 : 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)

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

Егор

Solo

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Доступ к данным LDAP
« Ответ #40 : 13 Сентябрь 2013, 10:03:56 »
Егор, еще раз спасибо. Обязательно попробую Ваш вариант.