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 использует URL для настройки соединения с сервером каталогов. Для создания URL-адреса подключения 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)))
Атрибуты (примеры):
Теперь пользователи INOUT Проект должны иметь возможность аутентифицироваться, используя свое имя пользователя и пароль LDAP, если их учетные записи настроены на использование LDAP для аутентификации (проверьте настройку «Режим аутентификации» при редактировании профиля пользователя).
Чтобы проверить это, создайте пользователя INOUT Проект с логином, соответствующим его учетной записи LDAP (обычно INOUT Проект подсказывает вам, просматривая данные LDAP), выберите вновь созданный LDAP в выпадающем списке Режим аутентификации (это поле видно на экране учетной записи, только если объявлен LDAP) и оставьте его пароль пустым. Попробуйте войти в INOUT Проект, используя имя пользователя и пароль 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
Хотя вполне возможно, что приведенный выше Base DN является стандартным для Active Directory, Active Directory на сайте моего работодателя не использует контейнер Пользователей для стандартных пользователей, поэтому эти инструкции направили меня по длинному и мучительному пути. Рекомендуем также попробовать просто "DC=host,DC=domain,DC=org", если вход не удастся, поменяйте настройки.
Если вы хотите просто разрешить вход пользователям, которые принадлежат к определенной группе LDAP, вам нужно следовать следующим инструкциям. Они основаны на LDAP сервере OpenLDAP и INOUT Проект.
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))'
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
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 Проект.
Имя пользователя для мандата 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 происходит медленно и у вас есть кластер AD, попробуйте указать в поле «Host» один из физических серверов AD. Это может помочь.
Если вы используете сервер 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 без действующего сертификата. В 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).