Автор Тема: filter=(objectcategory=person)  (Прочитано 39289 раз)

Internetchik

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
filter=(objectcategory=person)
« : 11 Апрель 2013, 10:19:57 »
Всем привет! Парни подсобите. Настроил ldap проксёй к AD. Все ищется все получается, в общем полное счастье. Только при поиске он ищет и выдает также и компьютеры и принтеры, чего не хотелось бы. Не могли бы вы подсказать мне правильный фильтр? Версия Centos 5.9, Openldap 2.3.43-25.

slapd.conf :

database        ldap
readonly        on
suffix         "dc=mydomain,dc=local"
rebind-as-user
uri             "ldap://10.110.5.241/"  #domain controller AD
chase-referrals yes
rootdn          "cn=user1,cn=users,dc=mydomain,dc=local"
rootpw  {SSHA}secret
directory /var/lib/ldap

index objectClass,objectCategory        eq,pres
index ou,cn,mail,surname,givenname eq,pres,sub
index uidNumber,gidNumber,loginShell    eq,pres
index uid,memberUid                     eq,pres,sub
index nisMapName,nisMapEntry            eq,pres,sub

access to dn.subtree="dc=mydomain,dc=local" filter="(&(objectCategory=person)(objectClass=user))"    # Сделал такое по руководству, потом еще и нагуглил такой же                       #вариант после серии неудач
        by * read

При запросе с другой машины:

ldapsearch -x -h 10.110.5.15 -b dc=mydomain,dc=local -D cn="Иван Иванов",ou="Domain Users",ou=OtdelA,dc=mydomain,dc=local -W '(&(Ob'ectCategory=person)(ObjectClass=user))' 'петров'
Enter LDAP Password:

Получаю:

# extended LDIF
#
# LDAPv3
# base <dc=mydomain,dc=local> with scope subtree
# filter: (&(ObjectCategory=person)(ObjectClass=user))
# requesting: петров
#

# search reference
ref: ldap://komfort.mydomain.local/DC=komfort,DC=mydomain,DC=local

# search reference
ref: ldap://ForestDnsZones.mydomain.local/DC=ForestDnsZones,DC=mydomain,DC=local

# search reference
ref: ldap://mydomain.local/CN=Configuration,DC=mydomain,DC=local

# search reference
ref: ldap://DomainDnsZones.mydomain.local/DC=DomainDnsZones,DC=mydomain,DC=local

# search reference
ref: ldap://mydomain.local/CN=Schema,CN=Configuration,DC=mydomain,DC=local

# search result
search: 2
result: 0 Success

Хотя если убрать фильтр из slapd.conf и запроса все покажет. Если фильтр не указать ругается на права доступа.

P.S. Несколько уточняющих вопросов. Я правильно понял, что :
1) При установке подобного фильтра, доступ к базе разрешается только при использовании этого фильтра и ни какого другого?
2) Если указать данный ldap-сервер в thunderbird, то в почтовике также необходимо указать фильтр запроса как в запросе из командной строки?
3) Если мне необходим будет анонимный доступ к базе, то в запросе мне не нужно будет указывать имя aka _"-D cn="Иван Иванов",ou="Domain Users",ou=OtdelA,dc=mydomain,dc=local ", но в самом фильтре также указать by anonymous auth?

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: filter=(objectcategory=person)
« Ответ #1 : 12 Апрель 2013, 06:40:20 »
Здравствуйте!
P.S. Несколько уточняющих вопросов. Я правильно понял, что :
1) При установке подобного фильтра, доступ к базе разрешается только при использовании этого фильтра и ни какого другого?
Нет, это не так. Директива access to состоит из нескольких частей/условий, примерно так:
access to <what> by <who> <level> <control>Вы пытаетесь задать фильтр в условии <what>, то есть указать, при обращении к каким объектам DIT будут срабатывать остальные проверки контроля доступа из этой директивы access to. В Вашем случае это будет звучать примерно так: при обращению к любой записи дерева  dc=mydomain,dc=local, соответствующей фильтру (&(objectCategory=person)(objectClass=user)) давать доступ на чтения любым (в том числе анонимным пользователям) (условие by <who> <level>). Поскольку других директив access to у Вас не предусмотрено, то после неё будет неявно применяться директива
access to * by * noneто есть доступ ко всем записям, которые не попадают под явно заданное Вами условие, будет запрещён.

В Вашем поисковом запросе
ldapsearch -x -h 10.110.5.15 -b dc=mydomain,dc=local -D cn="Иван Иванов",ou="Domain Users",ou=OtdelA,dc=mydomain,dc=local -W '(&(Ob'ectCategory=person)(ObjectClass=user))' 'петров'
Вы указываете, что поиск начинается с dc=mydomain,dc=local, скорее всего эта запись не попадёт под указанный Вами в access to поисковый фильтр, сработает неявная директива запрета доступа и поиск на этом будет прекращён, поэтому Ваш запрос и не дал результатов.

Предлагаю вообще убрать директивы access to из настоек базы данных в slapd.conf, тогда будет анонимный доступ на чтение, то есть применится неявная директива:
access to *
       by anonymous  read
       by *          none
и можно буде выполнять запросы типа:
ldapsearch -x -h 10.110.5.15 -b dc=mydomain,dc=local '(&(objectCategory=person)(objectClass=user))'

Кстати, зачем Вы указывали в своём запросе 'петров' ?

2) Если указать данный ldap-сервер в thunderbird, то в почтовике также необходимо указать фильтр запроса как в запросе из командной строки?
В поисковых запросах фильтры указываются, чтобы из всех записей DIT выделить только те, которые нужны. Если этот фильтр позволяет выделить необходимые Вам записи, используйте его, почему нет?

3) Если мне необходим будет анонимный доступ к базе, то в запросе мне не нужно будет указывать имя aka _"-D cn="Иван Иванов",ou="Domain Users",ou=OtdelA,dc=mydomain,dc=local ", но в самом фильтре также указать by anonymous auth?

Условие by anonymous auth указывается в директиве access to, а не в фильтре, обычно с её помощью анонимным пользователям предоставляют доступ к парольным атрибутам с целью прохождения аутентификации при подключении к каталогу. Если вы хотите выполнить анонимный поисковый запрос, просто не указывайте параметры -D и -W (-w) при вызове ldapsearch, при этом в настройках базы данных либо вообще не указывайте директив access to (см. выше), либо дайте доступ на чтение всем, если вы хотите часть запросов выполнять с аутентификацией:
access to * by * read

Вообще, неплохо бы сначала почитать теорию в OLAG и LFRS, а не делать наугад.

Егор

Internetchik

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: filter=(objectcategory=person)
« Ответ #2 : 18 Апрель 2013, 16:24:48 »
Прошу прощения, что не отвечал столь долго (признаться ждал уведомление на мыло).
OLAG прочел, только благодаря ей и дошел к тому, что получилось. LFRS сейчас начну.
Пересобрал Openldap из исходников, с Barkeley DB и по всем правилам. Теперь можно использовать (&(objectCategory=person)(objectClass=user)) в почтовике, и ldap передает запрос прозрачно.
Вы совершенно правы, в том, что мое правило не выполнялось при запросе. к примеру запрос из Thunderbird (я тоже пришел к такому решению, только через значительное количество времени :D):
conn=1000 op=1 SRCH base="dc=my-domen,dc=local" scope=2 deref=0 filter=(?objectClass=user)(?objectcategory=person))(|(mail=*kas*)(cn=*kas*)(givenName=*kas*)(sn=*kas*)))"Но у меня есть необходимость сделать так, чтобы при запросе с адресной книги, видны были только пользователи, без компьютеров и тд, и все это на уровне сервера. Что я и старался сделать с помощью директивы access. Зная какой запрос посылает почтовик, запросто можно подогнать под него и фильтр на сервере. В связи с этим Вы, случайно, не знаете природу "?", что образовались перед objectClass и objectcategory, ибо их в фильтре я не указывал, а ldap их в синтаксисе не приемлет? У меня сложилось впечатление, что openldap не знает, что такое "objectcategory"...
« Последнее редактирование: 19 Апрель 2013, 15:24:13 от Internetchik »

Internetchik

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: filter=(objectcategory=person)
« Ответ #3 : 22 Апрель 2013, 15:35:38 »
Всем привет! Я собрал openldap:

./configure --with-tls=openssl --enable-debug=yes --enable-syslog=yes --enable-modules=yes --enable-rewrite=yes --enable-slapd=yes --enable-backends=yes --enable-overlays=yes --enable-sql=no --enable-ndb=no

Сделал его как Proxy к AD:

slapd.conf

include         /usr/local/etc/openldap/schema/core.schema
include         /usr/local/etc/openldap/schema/cosine.schema
include         /usr/local/etc/openldap/schema/inetorgperson.schema
include         /usr/local/etc/openldap/schema/nis.schema

allow bind_v2

pidfile         /usr/local/var/run/slapd.pid
argsfile        /usr/local/var/run/slapd.args

moduleload    back_bdb.la
moduleload    back_ldap.la

database        ldap
readonly        on
suffix          "dc=my-domain,dc=local"
rebind-as-user
uri             ldap://10.110.5.241/
chase-referrals yes


Делаю запрос из адресной книги thunderbird c указанием фильтра (sAMAccountType=805306368) и пользователем из AD, получаю то, что ищу:

localhost slapd[27237]: conn=1000 fd=10 ACCEPT from IP=10.110.1.71:58915 (IP=0.0.0.0:389)
localhost slapd[27237]: conn=1000 op=0 BIND dn="cn=Иванов,ou=Domain Users,ou=Almaty,dc=my-domain,dc=local" method=128
localhost slapd[27237]: conn=1000 op=0 BIND dn="cn=Иванов,ou=Domain Users,ou=Almaty,dc=my-domain,dc=local" mech=SIMPLE ssf=0
localhost slapd[27237]: conn=1000 op=0 RESULT tag=97 err=0 text=
localhost slapd[27237]: conn=1000 op=1 SRCH base="dc=my-domain,dc=local" scope=2 deref=0 filter="(&(?sAMAccountType=805306368)(|(mail=*kas*)(cn=*kas*)(givenName=*kas*)(sn=*kas*)))"

localhost slapd[27237]: conn=1000 op=1 SRCH attr=description notes title sn surname mozillaHomeLocalityName givenName mozillaHomeState mail mozillaWorkUrl workurl labeledURI o company mozillaNickname xmozillanickname mobile cellphone carphone modifytimestamp nsAIMid nscpaimscreenname telephoneNumber birthyear c countryname mozillaHomeStreet cn commonname postalCode zip mozillaCustom1 custom1 mozillaHomeCountryName homePhone st region mozillaCustom2 custom2 mozillaSecondEmail xmozillasecondemail facsimiletelephonenumber fax mozillaCustom3 custom3 mozillaUseHtmlMail xmozillausehtmlmail mozillaHomeStreet2 birthday street streetaddress postOfficeBox mozillaCustom4 custom4 mozillaHomeUrl homeurl l locality pager pagerphone ou department departmentnumber orgunit birthmonth mozillaWorkStreet2 mozillaHomePostalCode objectClass

localhost slapd[27237]: conn=1000 op=1 SEARCH RESULT tag=101 err=0 nentries=15 text=

Проблема в том, что мне необходимо сделать фильтр к AD, так чтобы в адресной книге при поиске выдавались только пользователи без компьютеров, принтеров и тп, и при этом пользователи не могли этого изменить просто убрав фильтр из почтовика. Для этого добавляю в slapd.conf:

access to dn.subtree="dc=my-domain,dc=local" filter="(&(sAMAccountType=805306368)(|(mail=*)(cn=*)(givenName=*)(sn=*)))"
    by users read

Повторяю запрос с почтовика и ничего не получаю в ответ:
localhost slapd[9599]: conn=1001 fd=14 ACCEPT from IP=10.110.1.71:59725 (IP=0.0.0.0:389)
localhost slapd[9599]: conn=1001 op=0 BIND dn="cn=Иванов,ou=Domain Users,ou=Almaty,dc=my-domain,dc=local" method=128
localhost slapd[9599]: conn=1001 op=0 BIND dn="cn=Иванов,ou=Domain Users,ou=Almaty,dc=my-domain,dc=local" mech=SIMPLE ssf=0
localhost slapd[9599]: conn=1001 op=0 RESULT tag=97 err=0 text=
localhost slapd[9599]: conn=1001 op=1 SRCH base="dc=my-domain,dc=local" scope=2 deref=0 filter="(&(?sAMAccountType=805306368)(|(mail=*kas*)(cn=*kas*)(givenName=*kas*)(sn=*kas*)))"

localhost slapd[9599]: conn=1001 op=1 SRCH attr=description notes title sn surname mozillaHomeLocalityName givenName mozillaHomeState mail mozillaWorkUrl workurl labeledURI o company mozillaNickname xmozillanickname mobile cellphone carphone modifytimestamp nsAIMid nscpaimscreenname telephoneNumber birthyear c countryname mozillaHomeStreet cn commonname postalCode zip mozillaCustom1 custom1 mozillaHomeCountryName homePhone st region mozillaCustom2 custom2 mozillaSecondEmail xmozillasecondemail facsimiletelephonenumber fax mozillaCustom3 custom3 mozillaUseHtmlMail xmozillausehtmlmail mozillaHomeStreet2 birthday street streetaddress postOfficeBox mozillaCustom4 custom4 mozillaHomeUrl homeurl l locality pager pagerphone ou department departmentnumber orgunit birthmonth mozillaWorkStreet2 mozillaHomePostalCode objectClass

localhost slapd[9599]: conn=1001 op=1 SEARCH RESULT tag=101 err=0 nentries=0 text=

Может подскажите в чем причина данного провала?

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: filter=(objectcategory=person)
« Ответ #4 : 23 Апрель 2013, 09:39:12 »
Здравствуйте!
Я тут поэкспериментировал с ACL на back_ldap, но, при указании в ACL фильтра, записи перестают возвращаться, даже при простейшем (objectClass=*) =(. Возможно, так и должно быть, ведь в man-странице slapd-ldap честно написано, что поддержка ACL урезанная. Я на всякий случай спросил у знающих людей, если посоветуют что-то, напишу.

Есть такая идея. Насколько я знаю, в AD записи  пользователей и компьютеров лежат в разных ветках. Тогда можно указать в ACL просмотр только пользовательской ветки примерно так:

access to dn.subtree="cn=Users,dc=my-domain,dc=local" by * read

Остальные ветки должны при поиске пропускаться, так что клиент будет видеть только пользователей и группы, но не компьютеры.

Егор

Internetchik

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: filter=(objectcategory=person)
« Ответ #5 : 23 Апрель 2013, 14:39:47 »
Эх... Не хотелось изначально так поступать, ибо это немного неудобно по ряду причин. Но я сделаю по Вашему совету. А нельзя ли как - то добавить samaccounttype в ldap? Например если подключить его схемой? http://msdn.microsoft.com/ru-RU/library/windows/desktop/ms679637(v=vs.85).aspx здесь я описание данного атрибута. К сожалению мне не хватает понимания всей системы чтоб реализовать это самому.

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: filter=(objectcategory=person)
« Ответ #6 : 24 Апрель 2013, 06:04:05 »
Здравствуйте!
Добавить такой атрибут, в принципе, можно, но зачем? Вам ведь, как я понял, нужен анонимный доступ на чтение к AD для реализации адресной книги в почтовом клиенте (иначе можно было  бы подключаться к AD напрямую без всяких прокси). Так вот, back_ldap просто выдаёт результаты поискового запроса со ВСЕМИ объектными классами и атрибутами, которые ему вернул целевой сервер (AD в Вашем случае), так что такой атрибут там будет -- в конце концов, Вы же сами указывали его в фильтре в почтовом клиенте и фильтр работал. Так что в данном случае делать ничего не надо. Или я неправильно понял Вашу задачу?

Егор.

Internetchik

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: filter=(objectcategory=person)
« Ответ #7 : 24 Апрель 2013, 07:30:52 »
Вы правильно поняли. Но этот фильтр так же необходим для ограничения доступа пользователей. Так если не выставлять никаких правил, то обычный менеджер может просмотреть информацию по компьютерам и принтерам ( что не так страшно), а так же просмотреть имеющиеся группы безопасности и политики (чего уже точно не хотелось бы). Вариант предложенный Вами конечно работает, но очень не гибкий и не очень удобен при использовании в компании с кучей организационных юнитов в домене. Приходится создавать кучу правил и неустанно следить чтобы в разрешенные папки не попало ничего лишнего, а ведь человеческий фактор он такооой...!

Internetchik

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: filter=(objectcategory=person)
« Ответ #8 : 24 Апрель 2013, 12:43:49 »
Еще вопрос относительно самого анонимного запроса. Получается так, что ldap поддерживает анонимные запросы, в то время как AD их отклоняет.  Получается самым лучшим вариантом такая схема: Анонимный запрос => Ldap => Авторизованный запрос => AD.  Какой функцией заставить ldap подменять bind dn запроса? я видел функции authzfrom и athzto и authregex, но у меня сложилось впечатление что это не то.  Так же видел authid-rewrite, но вот с ней мне не совсем понятно как работать.

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: filter=(objectcategory=person)
« Ответ #9 : 25 Апрель 2013, 08:46:52 »
Здравствуйте!

Тут мудрить не надо -- вся аутентификация/авторизация ldap-прокси настраивается параметрами back_ldap, в частности, idassert-bind. Для AD пришлось добавить ещё idassert-authzFrom:
include /etc/ldap/schema/core.schema
moduleload back_ldap.la

database ldap
uri "ldap://x.x.x.x"
suffix "dc=mydom,dc=ru"
idassert-authzFrom "dn:*"
idassert-bind bindmethod=simple
  binddn="cn=SomeUser,cn=Users,dc=mydom,dc=ru"
  credentials="somePassword"
  mode=none

Тогда ldapsearch можно делать анонимно:
ldapsearch -x -b 'dc=mydom,dc=ru' '(cn=Администратор)'

Егор

Internetchik

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: filter=(objectcategory=person)
« Ответ #10 : 25 Апрель 2013, 12:02:07 »
Егор! Спасибо Вам огромное за помощь и поддержку! Все работает как надо! Чуть позже выложу HowTo, по проделанной работе, ибо в инете (как не странно) ничего подобного нет! А еще по позже все же постараюсь добавить атрибут. Еще раз огромное спасибо Вам и Вашему Проекту!