Форум проекта Pro-LDAP.ru
Администрирование OpenLDAP => Вопросы безопасности => Access Control List (ACL) => Тема начата: NBA от 22 Август 2019, 10:33:03
-
Имеется разветвленное дерево AD. Имеется ряд сервисов/серверов которым нужен доступ к AD по протоколу LDAP через LDAP proxy. Особого доверия к серверам нет. Все ограничения должны быть реализованы на LDAP proxy: Сервера должны видеть минимальное количество полей/атрибутов, и только в только в тех объектах, которые необходимы.
1. Ограничить возможность читать объекты:
1.1 Только пользователей, состоящих в определенной группе;
1.2 Если 1.1 реализовать не возможно, то только пользователей, находящихся в определенном месте дерева (в определенном OU);
1.3 Также возможность считывать все родительские объекты, в которых находятся объекты из пункта 1;
1.4 Если 1.3 реализовать не возможно, то: Все объекты типа DC и OU;
2. Ограничить возможность считывания атрибутов объекта;
3. Разрешить возможность проверки пароля пользователя (авторизация/бинд) только тем пользователям, которые соответствуют критериям пунктов 1.1 или 1.2;
Я развернул LDAP proxy - Debian, OpenLDAP:
uname -a
Linux ldap-proxy.example.com 4.9.0-9-amd64 #1 SMP Debian 4.9.168-1+deb9u3 (2019-06-16) x86_64 GNU/Linux
apt list slapd
slapd/oldstable,now 2.4.44+dfsg-5+deb9u2 amd64 [installed]
slapd -V
@(#) $OpenLDAP: slapd (May 23 2018 04:25:19) $
Debian OpenLDAP Maintainers <pkg-openldap-devel@lists.alioth.debian.org>
Удалось реализовать пункты 1.2, 1.4 и 2:
pidfile /var/run/slapd/slapd.pid
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/microsoftattributetype.schema
moduleload back_ldap.la
database ldap
uri "ldap://1.2.3.4"
readonly on
suffix "dc=example,dc=com"
rebind-as-user
access to dn.children="OU=Office,OU=Company,DC=example,DC=com"
filter=(objectClass=organizationalPerson)
attrs=entry,sAMAccountName,sn,givenName,mail
by users read
by * none
access to
filter=(objectClass=organizationalUnit)
by users read
by * none
Но никак не удается закрыть следующие вопросы:
1. К сожалению в выборку попадают не только объекты типа User, но и типа Computer. Пробовал добавить в начало следующее правило:
access to
filter=(objectClass=computer)
by * none
- не помогло. Подскажите пожалуйста, как удалить из выборки компьютеры?
2. Пытался ограничить по членству в группе. Использовал следующие фильтры:
access to
filter=(&(objectClass=organizationalPerson)(memberOf=cn=Role_N1,ou=Groups,ou=Office,ou=Company,dc=example,dc=com))
by users read
by * none
access to
filter=(objectClass=organizationalUnit)
by users read
by * none
и результат - только пустые OU. Причем если использовать фильтр в LDAP browser - все Ок. Подскажите, как можно построить отбор по членству в группе (полагаю, что если решить этот вопрос, то вопрос 1. станет не актуальным)?
3. К сожалению, никак не удается ограничить возможность проверки пароля. Например в LDAP Browser, в параметра подключения к LDAP proxy, я могу использовать пользователя, который находится вне "OU=Office,OU=Company,DC=example,DC=com", хотя для чтения, фильтр работает - я его в дереве не вижу. Подскажите, есть ли возможность ограничить возможность проверки паролей/авторизации?
4. Пока выводятся все объекты типа OU. Т.е. видно все дерево, хотя, благодаря фильтрам, большая часть веток пустая. Есть ли возможность выводить только те OU, которые содержать объекты (прошедшие фильтр)?
Заранее спасибо.
-
Здравствуйте! Покажите, пожалуйста, полные настройки ACL (все правила).
Егор
-
Добрый день!
В данный момент все просто:
access to dn.children="OU=Office,OU=Company,DC=example,DC=com"
filter=(objectClass=organizationalPerson)
attrs=entry,sAMAccountName,sn,givenName,mail
by users read
by * none
access to
filter=(objectClass=organizationalUnit)
by users read
by * none
Но я так же пробовал и варианты:
Убрать из выборки компьютеры:
access to
filter=(objectClass=computer)
by * none
access to
filter=(objectClass=COMPUTER)
by * none
access to dn.children="OU=Office,OU=Company,DC=example,DC=com"
filter=(objectClass=organizationalPerson)
attrs=entry,sAMAccountName,sn,givenName,mail
by users read
by * none
access to
filter=(objectClass=organizationalUnit)
by users read
by * none
- не помогло. Компьютеры в выборке присутствуют.
Отбирать пользователей, по членству в группе:
access to
filter=(|(objectClass=organizationalUnit)(&(objectClass=organizationalPerson)(memberOf=cn=Role_N1,ou=Groups,ou=Office,ou=Company,dc=example,dc=com)))
by users read
by * none
Вижу только пустые OU.
По вопросу ограничения логина/бинд - у меня вообще нет никаких идей. Возможно тут проблема в том, что пока пользователь не забиндился, LDAP proxy не может сделать rebind-as-user. А значит не может получить информацию о том пользователе, который хочет биндится.
-
Здравствуйте! Использовать фильтр с memberOf не получилось. Думаю, что memberOf в AD -- динамический атрибут, на момент проверки ACL его в каталоге нет и поэтому условие отбора всегда возвращает false. В обычном каталоге OpenLDAP такие фильтры в условии ACL работают, поскольку memberOf является статическим атрибутом.
Более-менее то, что Вы хотели в плане ограничений по конкретным ou и с выводом конкретных атрибутов:
access to dn.children="OU=Office,OU=Company,DC=example,DC=com"
filter="(&(objectClass=organizationalPerson)(!(objectClass=computer)))"
attrs=entry,sAMAccountName,sn,givenName,mail
by users read
by * none
access to * by * search
Так в запросе с аутентификацией выводятся только пользователи (не компьютеры) из определённой подветки и только с перечисленными атрибутами. При анонимном запросе не выводится ничего.
По ограничению аутентификации -- трудно сказать. Не думаю, что аутентификация в AD напрямую связана с атрибутами из каталога (как это происходит с simpleBind аутентификацией в OpenLDAP), поскольку даже при таких достаточно строгих ограничениях, которые я привёл выше, аутентификация всё равно происходит. Единственное, что приходит в голову:
access to dn.children="OU=Office,OU=Company,DC=example,DC=com"
filter="(&(objectClass=organizationalPerson)(!(objectClass=computer)))"
attrs=entry,sAMAccountName,sn,givenName,mail
by dn.children="OU=Office,OU=Company,DC=example,DC=com" read
by * none
access to * by * search
То есть только пользователи из этой подветки смогут прочитать свою подветку, остальные получат пустой ответ.
Наверное, это всё, что можно выжать из прокси к AD.
Егор
-
Добрый день!
Попробовал следующий фильтр:
access to dn.children="OU=Office,OU=Company,DC=example,DC=com"
filter="(&(objectClass=organizationalPerson)(!(objectClass=computer)))"
attrs=entry,sAMAccountName,sn,givenName,mail
by users read
by * none
access to
filter=(objectClass=organizationalUnit)
by users read
by * none
К сожалению данный фильтр прячет не только компьютеры, но и пользователей - т.е. видно только пустые OU.
Спасибо за Вашу помощь.
-
Простите, не совсем понятно, Вы пробовали предлагаемые мной варианты? Получили то, что хотели?
Егор