Автор Тема: LDAP proxy to AD. Как ограничить чтение объектов и авторизацию пользователей?  (Прочитано 6377 раз)

NBA

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Имеется разветвленное дерево 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, которые содержать объекты (прошедшие фильтр)?

Заранее спасибо.

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Здравствуйте! Покажите, пожалуйста, полные настройки ACL (все правила).

Егор

NBA

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Добрый день!
В данный момент все просто:
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. А значит не может получить информацию о том пользователе, который хочет биндится.

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Здравствуйте! Использовать фильтр с 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.

Егор


NBA

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Добрый день!
Попробовал следующий фильтр:
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.

Спасибо за Вашу помощь.

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Простите, не совсем понятно, Вы пробовали предлагаемые мной варианты? Получили то, что хотели?

Егор