Форум проекта Pro-LDAP.ru
Администрирование OpenLDAP => Вопросы безопасности => Access Control List (ACL) => Тема начата: Internetchik от 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?
-
Здравствуйте!
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 (http://pro-ldap.ru/tr/admin24/access-control.html) и LFRS (http://pro-ldap.ru/tr/zytrax/ch6/#access), а не делать наугад.
Егор
-
Прошу прощения, что не отвечал столь долго (признаться ждал уведомление на мыло).
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"...
-
Всем привет! Я собрал 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=
Может подскажите в чем причина данного провала?
-
Здравствуйте!
Я тут поэкспериментировал с ACL на back_ldap, но, при указании в ACL фильтра, записи перестают возвращаться, даже при простейшем (objectClass=*) =(. Возможно, так и должно быть, ведь в man-странице slapd-ldap (http://www.manpagez.com/man/5/slapd-ldap/) честно написано, что поддержка ACL урезанная. Я на всякий случай спросил у знающих людей, если посоветуют что-то, напишу.
Есть такая идея. Насколько я знаю, в AD записи пользователей и компьютеров лежат в разных ветках. Тогда можно указать в ACL просмотр только пользовательской ветки примерно так:
access to dn.subtree="cn=Users,dc=my-domain,dc=local" by * read
Остальные ветки должны при поиске пропускаться, так что клиент будет видеть только пользователей и группы, но не компьютеры.
Егор
-
Эх... Не хотелось изначально так поступать, ибо это немного неудобно по ряду причин. Но я сделаю по Вашему совету. А нельзя ли как - то добавить samaccounttype в ldap? Например если подключить его схемой? http://msdn.microsoft.com/ru-RU/library/windows/desktop/ms679637(v=vs.85).aspx здесь я описание данного атрибута. К сожалению мне не хватает понимания всей системы чтоб реализовать это самому.
-
Здравствуйте!
Добавить такой атрибут, в принципе, можно, но зачем? Вам ведь, как я понял, нужен анонимный доступ на чтение к AD для реализации адресной книги в почтовом клиенте (иначе можно было бы подключаться к AD напрямую без всяких прокси). Так вот, back_ldap просто выдаёт результаты поискового запроса со ВСЕМИ объектными классами и атрибутами, которые ему вернул целевой сервер (AD в Вашем случае), так что такой атрибут там будет -- в конце концов, Вы же сами указывали его в фильтре в почтовом клиенте и фильтр работал. Так что в данном случае делать ничего не надо. Или я неправильно понял Вашу задачу?
Егор.
-
Вы правильно поняли. Но этот фильтр так же необходим для ограничения доступа пользователей. Так если не выставлять никаких правил, то обычный менеджер может просмотреть информацию по компьютерам и принтерам ( что не так страшно), а так же просмотреть имеющиеся группы безопасности и политики (чего уже точно не хотелось бы). Вариант предложенный Вами конечно работает, но очень не гибкий и не очень удобен при использовании в компании с кучей организационных юнитов в домене. Приходится создавать кучу правил и неустанно следить чтобы в разрешенные папки не попало ничего лишнего, а ведь человеческий фактор он такооой...!
-
Еще вопрос относительно самого анонимного запроса. Получается так, что ldap поддерживает анонимные запросы, в то время как AD их отклоняет. Получается самым лучшим вариантом такая схема: Анонимный запрос => Ldap => Авторизованный запрос => AD. Какой функцией заставить ldap подменять bind dn запроса? я видел функции authzfrom и athzto и authregex, но у меня сложилось впечатление что это не то. Так же видел authid-rewrite, но вот с ней мне не совсем понятно как работать.
-
Здравствуйте!
Тут мудрить не надо -- вся аутентификация/авторизация 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=Администратор)'
Егор
-
Егор! Спасибо Вам огромное за помощь и поддержку! Все работает как надо! Чуть позже выложу HowTo, по проделанной работе, ибо в инете (как не странно) ничего подобного нет! А еще по позже все же постараюсь добавить атрибут. Еще раз огромное спасибо Вам и Вашему Проекту!