Аутентификация LDAP

Обзор

LDAP (Lightweight Directory Access Protocol) — это программный протокол, позволяющий любому человеку находить организации, отдельных людей и другие ресурсы, такие как файлы и устройства в сети, будь то публичный Интернет или корпоративная интрасеть. LDAP — это облегченная (с меньшим объемом кода) версия протокола Directory Access Protocol (DAP), который является частью X.500, стандарта для служб каталогов в сети. LDAP является облегченной версией, потому что в своей первоначальной версии он не включал функции безопасности. INOUT Проект изначально поддерживает аутентификацию LDAP с использованием одного или нескольких каталогов LDAP. Поддерживаемые типы служб каталогов включают Active Directory, OpenLDAP, eDirectory, Sun Java System Directory Server, а также другие совместимые службы каталогов.

Каталог LDAP организован в виде простой древовидной иерархии, состоящей из следующих уровней:

  • Корневой каталог (начальное место или источник дерева), который разветвляется до
  • Страны, каждая из которых разветвляется на:
  • Организации, которые разветвляются на:
  • Организационные единицы (отделы, департаменты и т.д.), которые разветвляются на (включают запись для):
  • Отдельные лица (которые включают людей, файлы и общие ресурсы, такие как принтеры).

Объявление режима аутентификации LDAP

Перейдите в раздел Админ и нажмите «Аутентификация LDAP » в меню. Здесь вы найдете список всех существующих режимов аутентификации LDAP, включая возможность проверить или удалить любой из них. Чтобы создать новый, нажмите на кнопку «Новый режим аутентификации» в правом верхнем углу.

LDAP

Поставщик услуг LDAP использует URL для настройки соединения с сервером каталогов. Для создания URL-адреса подключения LDAP необходимо указать следующие поля:

  • Имя: Произвольное имя для каталога.
  • Хост: Имя хоста LDAP (тестовый сервер).
  • Порт: Порт LDAP (по умолчанию 389).
  • LDAPS: Установите этот чекбокс, если вы хотите или должны использовать LDAPS для доступа к каталогу.
  • Учетная запись: Введите имя пользователя, имеющего доступ на чтение к LDAP, иначе оставьте это поле пустым, если ваш LDAP можно читать анонимно (серверы Active Directory обычно не разрешают анонимный доступ).
  • Пароль: Пароль для учетной записи.
  • Base DN: DN верхнего уровня вашего дерева каталогов LDAP (пример: dc=example,dc=com).
  • Фильтр LDAP: Фильтры могут использоваться для ограничения числа пользователей или групп, которым разрешен доступ к приложению. По сути, фильтр ограничивает, из какой части дерева LDAP синхронизируется приложение. Фильтр может и должен быть написан как для пользователей, так и для групп. Это гарантирует, что вы не переполните ваше приложение пользователями и группами, которым не нужен доступ.

Примеры фильтров

Эти фильтры написаны для Active Directory. Чтобы использовать их для чего-то вроде OpenLDAP, необходимо изменить атрибуты.

Это синхронизирует только пользователей из группы 'CaptainPlanet' — это должно быть применено к фильтру объектов пользователя:

(&(objectCategory=Person)(sAMAccountName=*)(memberOf=cn=CaptainPlanet,ou=users,dc=company,dc=com))

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

(&(objectCategory=Person)(sAMAccountName=*)(memberOf:1.2.840.113556.1.4.1941:=cn=CaptainPlanet,ou=users,dc=company,dc=com))

Важно для Active Directory иметь memberOf:1.2.840.113556.1.4.1941, если вы хотите найти вложенные группы (не заменяйте числовую строку) внутри группы CaptainPlanet.

Это позволит найти пользователей, которые являются членами любой или всех 4 групп (огонь, ветер, вода, сердце)

(&(objectCategory=Person)(sAMAccountName=*)(|(memberOf=cn=fire,ou=users,dc=company,dc=com)(memberOf=cn=wind,ou=users,dc=company,dc=com)(memberOf=cn=water,ou=users,dc=company,dc=com)(memberOf=cn=heart,ou=users,dc=company,dc=com)))

  • Таймаут (в секундах): Если провайдер LDAP не получает ответа LDAP в течение указанного периода, он прерывает попытку чтения. Целое число должно быть больше нуля. Целое число меньше или равно нулю означает, что тайм-аут чтения не указан, что эквивалентно бесконечному ожиданию ответа до его получения, что по умолчанию соответствует исходному поведению. Если это свойство не указано, то по умолчанию ответ будет ожидаться до тех пор, пока он не будет получен.
  • Создание пользователя «на лету»: если отметить это свойство, то для любого пользователя LDAP будет автоматически создана учетная запись INOUT Проект при первом входе в INOUT Проект. В противном случае, вам придется вручную создавать пользователя в INOUT Проект для каждого пользователя LDAP, который хочет войти в систему.

Атрибуты (примеры):

  • Атрибут Login: Имя пользователя, под которым он входит в систему и проходит аутентификацию.
  • Атрибут Firstname: Атрибут для первого имени.
  • Атрибут Lastname: Атрибут для фамилии.
  • Атрибут Email: Атрибут для адреса электронной почты.
LDAP

Теперь пользователи INOUT Проект должны иметь возможность аутентифицироваться, используя свое имя пользователя и пароль LDAP, если их учетные записи настроены на использование LDAP для аутентификации (проверьте настройку «Режим аутентификации» при редактировании профиля пользователя).

Чтобы проверить это, создайте пользователя INOUT Проект с логином, соответствующим его учетной записи LDAP (обычно INOUT Проект подсказывает вам, просматривая данные LDAP), выберите вновь созданный LDAP в выпадающем списке Режим аутентификации (это поле видно на экране учетной записи, только если объявлен LDAP) и оставьте его пароль пустым. Попробуйте войти в INOUT Проект, используя имя пользователя и пароль LDAP.

LDAP

Создание пользователей «на лету»

Если отметить опцию создания пользователя «на лету», то для любого пользователя LDAP будет автоматически создана учетная запись INOUT Проект при первом входе в INOUT Проект.

Для этого необходимо указать имя атрибутов LDAP (имя, фамилия, email), которые будут использоваться для создания учетных записей INOUT Проект.

Вот типичный пример с использованием Active Directory:

Имя = My Directory

Хост = host.domain.org

Порт = 389

LDAPS = нет

Учетная запись = MyDomain\UserName (или UserName@MyDomain в зависимости от сервера AD)

Пароль = <пароль>

Базовый DN = CN=users,DC=host,DC=domain,DC=org

Создание пользователей «на лету» = да

Атрибуты

Логин = sAMAccountName

Имя = givenName

Фамилия = sN

Электронная почта = mail

Вот еще один пример для Active Directory с разделенной интрасетью:

Имя = Просто описание для страницы режимов аутентификации

Хост = DepartmentName.OrganizationName.local

Порт = 389

LDAPS = нет

Учетная запись = DepartmentName\UserName (или UserName@MyDomain в зависимости от сервера AD или привязки DN uid=Manager,cn=users,dc=MyDomain,dc=com)

Пароль = <пароль>

Базовая DN = DC=DepartmentName,DC=OrganizationName,DC=local

Создание пользователей «на лету» = да

Атрибуты

Логин = sAMAccountName

Имя = givenName

Фамилия = sN

Электронная почта = mail

Обратите внимание, что имена атрибутов LDAP чувствительны к регистру.

Учетная запись динамической привязки

Приведенная выше настройка требует наличия специальной учетной записи на сервере каталогов, которую INOUT Проект использует для предварительной аутентификации. Можно использовать ключевое слово $login в поле учетной записи, которое затем будет заменено текущим логином. Пароль в этом случае можно оставить пустым, например:

Учетная запись: $login@COMPANY.DOMAIN.NAME

или

Аккаунт: company\$login

Варианты базового DN

Хотя вполне возможно, что приведенный выше Base DN является стандартным для Active Directory, Active Directory на сайте моего работодателя не использует контейнер Пользователей для стандартных пользователей, поэтому эти инструкции направили меня по длинному и мучительному пути. Рекомендуем также попробовать просто "DC=host,DC=domain,DC=org", если вход не удастся, поменяйте настройки.

Вход в LDAP на основе групп

Если вы хотите просто разрешить вход пользователям, которые принадлежат к определенной группе LDAP, вам нужно следовать следующим инструкциям. Они основаны на LDAP сервере OpenLDAP и INOUT Проект.

  1. (OpenLDAP сервер) Включить наложение memberof

1.1. Создайте файл:

vim ~/memberof_add.ldif

С приведенным ниже содержимым:

dn: cn=module,cn=config

objectClass: olcModuleList

cn: module

olcModulePath: /usr/lib/ldap

olcModuleLoad: memberof

1.2. Создайте файл:

vim ~/memberof_config.ldif

С приведенным ниже содержимым:

dn: olcOverlay=memberof,olcDatabase={1}hdb,cn=config

objectClass: olcMemberOf

objectClass: olcOverlayConfig

objectClass: olcConfig

objectClass: top

olcOverlay: memberof

olcMemberOfDangling: ignore

olcMemberOfRefInt: TRUE

olcMemberOfGroupOC: groupOfNames

olcMemberOfMemberAD: member

olcMemberOfMemberOfAD: memberOf

1.3. Загрузите их. Это будет зависеть от вашей конфигурации OpenLDAP, поэтому мы предложим несколько вариантов:

sudo ldapadd -c -Y EXTERNAL -H ldapi:/// -f memberof_add.ldif

sudo ldapadd -c -Y EXTERNAL -H ldapi:/// -f memberof_config.ldif

Или:

ldapadd -D cn=admin,cn=config -w "password" -H ldapi:/// -f memberof_add.ldif

ldapadd -D cn=admin,cn=config -w "password" -H ldapi:/// -f memberof_config.ldif

Перезапуск НЕ требуется, если вы используете механизм динамической конфигурации во время выполнения (slapd-config).

1.4. (Необязательно) Протестируйте его:

ldapsearch -D cn=admin,dc=example,dc=com -x -W -b 'dc=example,dc=com' -H 'ldap://127.0.0.1:389/' '(&(objectClass=posixAccount)(memberOf=cn=ldapeasyproject,ou=groups,dc=example,dc=com))'

  1. (Сервер OpenLDAP) Создайте группу. В этом примере пользователь — "ldap_user_1", а группа — "ldapeasyproject":

dn: cn=ldapeasyproject,ou=groups,dc=example,dc=com

cn: ldapeasyproject

description: Staff members allowed to login to INOUT Project ticketing system

member: cn=ldap_user_1,ou=people,dc=example,dc=com

objectclass: groupOfNames

objectclass: top

Настройте "dn" и "cn" в соответствии с вашей структурой DIT

  1. Отредактируйте режим аутентификации LDAP. В моем случае "ldap_user_1" является объектным классом "posixAccount":

Base DN: dc=example,dc=com

Filter: (&(objectClass=posixAccount)(memberOf=cn=ldapeasyproject,ou=groups,dc=example,dc=com))

Устранение неполадок

Если вы хотите использовать создание пользователя «на лету», убедитесь, что INOUT Проект может получить из вашего LDAP всю необходимую информацию для создания действительного пользователя.

Например, создание пользователя «на лету» не будет работать, если у вас нет действительных адресов электронной почты в вашем каталоге (вы получите сообщение об ошибке «Неправильное имя или пароль» при попытке входа в систему).

(Это не так в новых версиях INOUT Проект; диалог создания пользователя заполняется всем, что он может найти на сервере LDAP, и просит нового пользователя заполнить остальное).

Также убедитесь, что у вас нет пользовательских полей, отмеченных как обязательные для учетных записей пользователей. Такие пользовательские поля не позволят создавать учетные записи пользователей «на лету».

Об ошибках в системе входа в систему не сообщается никакой реальной информации в журналах INOUT Проект, что затрудняет поиск и устранение неисправностей. Однако, вы можете найти большую часть необходимой информации, используя Wireshark между узлом INOUT Проект и сервером LDAP. Обратите внимание, что это работает, только если у вас есть права на чтение сетевого трафика между этими двумя узлами.

Вы также можете использовать инструмент «ldapsearch» для проверки правильности ваших настроек. Войдите в Linux машину, на которой расположен ваш INOUT Проект (и, возможно, установите «ldaputils»), и выполните следующее:

ldapsearch -x -b "dc=example,dc=com" -H ldap://hostname/ -D "DOMAIN\USER" -w mypassword [searchterm].

В случае успеха вы получите список содержимого AD, соответствующего вашему поисковому запросу. После этого вы будете знать, как заполнить поля в конфигурации LDAP в INOUT Проект.

Альтернативные способы проверки работоспособности

  • Попробуйте удалить фильтры LDAP, которые, если они неправильно установлены, могут удалить пользователей, которых вы хотите найти.
  • Рядом с Атрибутом входа находится значок книги. Если вы нажмете на нее и LDAP настроен правильно, обычные атрибуты автоматически заполняются реальным LDAP-сервером. Вместо текстовых полей появляются поля выбора на случай, если пользователь захочет изменить настройки. В большинстве случаев пользователю вообще не нужно заполнять эти поля. Если это работает, то, скорее всего, будет работать и все остальное.
  • При проблемах с подключением можно воспользоваться кнопкой «Тест» в листинге сервера LDAP. Остерегайтесь, это служит только для проверки возможности подключения к LDAP. Распространенной проблемой является то, что администраторы не заполняют системного пользователя LDAP, даже если настройки LDAP все еще защищены. В этом случае тест пройдет нормально, поскольку соединение работает, но пользователей добавить не удастся, поскольку LDAP их не видит.
  • Чтобы проверить, действительно ли LDAP работает, можно также использовать число «Доступные пользователи», если его значение равно «0», LDAP не возвращает никаких данных и, вероятно, настроен неправильно. Если число есть, вы можете щелкнуть его, чтобы развернуть и посмотреть, что показывает LDAP (и соответствующим образом настроить фильтры).

Формат значения учетной записи

Имя пользователя для мандата bind может потребоваться указать как DN, а не как UPN(user@domain.com) или domain\user, на что указывает этот комментарий в source:trunk/vendor/plugins/ruby-net-ldap-0.0.4/lib/net/ldap.rb:

# Как описано в разделе #bind, большинство LDAP-серверов требуют, чтобы вы предоставили полный DN

# в качестве мандата привязки, вместе с аутентификатором, таким как пароль.

Поэтому пользователь с именем MyDomain\MyUserName или MyUserName@MyDomain.com может ввести только MyUserName в качестве имени входа в INOUT Проект.

Медленная аутентификация LDAP

Если аутентификация LDAP происходит медленно и у вас есть кластер AD, попробуйте указать в поле «Host» один из физических серверов AD. Это может помочь.

OpenDS

Если вы используете сервер OpenDS, у вас могут возникнуть проблемы с управлением запросом «Paged results», отправляемым при первоначальном запросе на поиск пользователя по указанному атрибуту логина. Этот элемент управления запросом 1.2.840.113556.1.4.319 по умолчанию не разрешен для анонимных пользователей, что не позволяет INOUT Проект найти пользователя в каталоге еще до того, как произойдет привязка.

Добавьте глобальный ACI следующим образом:

./dsconfig -h SERVER_IP -p 4444 -D cn="Directory Manager" -w PASSWORD -n set-access-control-handler-prop --trustAll 

--add global-aci:\(targetcontrol=\"1.2.840.113556.1.4.319\"\)\\\(version\ 3.0\;\ acl\ 

\"Anonymous\ control\ access\ to\ 1.2.840.113556.1.4.319\"\;\ allow\ \(read\)\ userdn=\"ldap:///anyone\"\;\)

Примечание: Введите команду в одну строку, используйте экранирование точно так, как указано (\ после "acl" должно быть "\ " для пробела).

Некоторые пользователи не могут войти в систему

Проблема: определенная группа пользователей не может войти в систему (недействительный пользователь или пароль), в то время как все остальные могут. Пользователи находятся на удаленном сайте, но пользователи в других OU на том же сайте не получают эту ошибку.

Решение: скорее всего, проблема связана не с неправильными настройками, а с проблемой Active Directory (AD). У пользователей, которые не могли подключиться, поле «Вход в систему» было установлено на определенный ПК в свойствах пользователя AD (администрирование AD). После изменения этого параметра на «Вход в систему отовсюду», все должно работать. Более конкретно, это поле должно быть установлено в: AD Пользователь > Свойства > Аккаунт > Вход в систему отовсюду.

Проблемы с входом в систему при использовании LDAPS без действующего сертификата

Вы можете столкнуться с проблемой входа в систему при использовании LDAPS без действующего сертификата. В INOUT Проект сертификат LDAPS всегда проверяется. При недействительном сертификате пользователи не смогут войти в систему. Конечно, правильным и долгосрочным решением является использование действительного сертификата. Но пока вы этого не сделали, временным решением будет перейти в Админ > LDAP аутентификация > Редактировать соответствующий режим аутентификации.

Измените настройку на LDAPS (без проверки сертификата).

В решении INOUT Project Server вы можете изменить его массово из консоли rails

rails r "AuthSource.update_all(verify_peer: false)" -e production

или через SQL

UPDATE auth_sources set verify_peer = 0;

Проблемные ситуации

При импорте/создании пользователей автоматически из LDAP, настройка типа пользователя по умолчанию, введенная в форме создания пользователя, предпочтительнее, чем настройка типа пользователя по умолчанию, введенная в LDAP. После создания пользователя эта настройка не может быть изменена (если только вы не создадите новый LDAP).