Начнем издалека, а именно разберем, что такое active directory и как он работает.
Итак, Active Directory (AD) — это реализация службы каталогов, представленная централизованной базой данных, которая хранит информацию о пользователях, группах, компьютерах и других ресурсах в сети и используется в операционных системах компании Microsoft. Служба каталогов позволяет значительно облегчить управление сетевыми ресурсами и увеличить защиту корпоративной сети.
В основе работы Active Directory (AD) лежит протокол LDAP. LDAP — это аббревиатура от Lightweight Directory Access Protocol, то есть протокол легкого доступа к каталогам. LDAP также позволяет пользователям получить доступ к ресурсам в зависимости от прав, настроенных администратором службы каталогов.
Каждый из них относится к определённому классу (objectClass) (пользователи, компьютеры, домены и т.д.). В свою очередь все объекты каждого класса имеют одинаковый набор атрибутов.
Пользователь в AD и его атрибуты выглядят следующим образом:
При работе информационной базы на сервере под управлением windows доступ к AD осуществляется по средством COM-соединения. Например в статье Ильина Михаила описан пример такой интеграции: //infostart.ru/1c/articles/275916/
Полного аналога AD найти на данный момент невозможно. Есть ряд технологий, которые претендуют на конкуренцию с AD: Avanpost Directory Service, Samba DC, ALD Pro, OpenLDAP и другие.
При работе сервера приложений по linux отсутствует возможность создавать COM-объекты, и традиционный поход в интеграции с AD тут не применим. На помощь приходит ldapsearch — утилита для поиска информации в службе каталога, доступной по протоколу LDAP. Далее будут рассмотрены основные возможности этой утилиты и приведен пример загрузки основной информации из AD.
Поскольку ldapsearch — это консольная утилита, необходимо проверить ее наличие в linux и при отсутствии установить командой: sudo apt install ldap-utils
Для поиска информации в AD необходимо воспользоваться командой:
ldapsearch -H ldaps://dc.example.com -D "user@example.com" -w "password" -b "dc=example,dc=com" "(filter)" "attr1" "attr2", где:
-H: адрес запрашиваемого сервера каталогов;
-W: DN пользователя, по которым будет проходить аутентификация. Это будет имя пользователя в AD@ домен;
-b: В какой директории начать поиск. Если известно, в каком подразделении (Organizational Unit ) находятся записи, которые нужно найти, его можно добавить в поиск. Например, если мы знаем, что записи которые мы ищем находятся в OU под названием "stuff", то строка запроса будет "ou=stuff,dc=example,dc=com". Если неизвестно, в каком OU находятся записи, можно указать просто домен "dc=example,dc=com";
-(filter): фильтр, который будет использоваться для поиска. Например, если хотим найти пользователя с именем IvanovII, то фильтр будет: (sAMAccountName=IvanovII). Если нужно найти всех членов группы cn=usets,ou=stuff,dc=example,dc=com, то необходимо использовать фильтр: (memberOf=cn=usets,ou=stuff,dc=example,dc=com)"
-"attr1": Атрибуты, которые вы хотите отобразить. Каждый атрибут должен быть разделен пробелом. Некоторые распространенные из них — name mail sAMAccountName telephoneNumber.
Основные атрибуты AD, которые часто требуется получать из AD в 1С:
Атрибут | Русскоязычное название | Пример |
name | Полное имя | Иванов Иван Викторович |
sn | Фамилия | Иванов |
displayName | Выводимое имя | Иванов Иван Викторович |
givenName | Имя | Иван Викторович |
Электронная почта пользователя | mail@domain.com | |
sAMAccountName | Доменное имя | IvanovIV |
userPrincipalName | Имя входа пользователя | IvanovIV@domain.com |
memberOf | Член групп (в какую группу входит данный пользователь) | CN=Группа,OU=Компания,DC=domain,DC=com |
telephoneNumber | Рабочий номер телефона | 1234 |
manager | Руководитель | ??? |
Поскольку запрашивать информацию будем на сервере, то пользователь, под которым запущена служба 1С, должен иметь права на чтение в каталоге LDAP.
Далее рассмотрим несколько примеров запросов. Для получения информации будем использовать команды в терминале с выводом в файл и дальнейшим парсингом файла для получения структурированных данных.
- Получить всех пользователей с полным именем, адресом электронной почты, рабочим телефоном и доменным именем: ldapsearch -H ldap://dc.example.com -D user@example.com -w 'password' -b "dc=example,dc=com" "(objectClass=user)" name mail telephoneNumber sAMAccountName
Тут мы наложили фильтр на objectClass=user, чтобы получить результат только по пользователям. Если фильтр не указан, используется фильтр по умолчанию (objectClass=*). В итоге получим следующий результат:
dn:: Q0490JjQstCw0L3QvtCyINCY0LLQsNC9INCS0LjQutGC0L7RgNC+0LLQuNGHLE9V
PdCcLE9VPXN0dWZmLERDPWV4YW1wbGUsREM9Y29t
telephoneNumber: 1234
name:: 0JjQstCw0L3QvtCyINCY0LLQsNC9INCS0LjQutGC0L7RgNC+0LLQuNGH
sAMAccountName: IvanovIV
mail: IvanovIV@example.com
Часть атрибутов возвращается в base64 и требует обратной перекодировки на стороне 1С.
dn — это уникальное имя (Distinguished Name, DN), которое однозначно идентифицирует запись в пределах леса и представляет собой полный путь от корневой записи AD до рассматриваемого объекта.
После перекодировки из base64 получаем:
dn:: CN=Иванов Иван Викторович,OU=М,OU=stuff,DC=example,DC=com
telephoneNumber: 1234
name:: Иванов Иван Викторович
sAMAccountName: IvanovIV
mail: IvanovIV@example.com
Значение атрибута записывается в 7-битной кодировке ASCII и отделяется от его имени символом «:». Значения, не подходящие под эту кодировку, записываются в кодировке base64 и отделяются от имени атрибута символами «::»:
атрибут:: base64_значение_атрибута
Следующий пример, который мы рассмотрим, — это отбор записей по нескольким отборам. Например требуется получить атрибуты только по записи, где name=Иванов Иван Викторович, строка запроса будет такой: ldapsearch -H ldap://dc.example.com -D user@example.com -w 'password' -b "dc=example,dc=com" "(&(objectClass=user)(name=Иванов Иван Викторович))" name
Если в фильтре указать "(&(objectClass=user)(sn=И*))" — то будут отобраны все пользователи, фамилия которых начинается с "И".
Также распространенной задачей является, например, блокировка учетных записей пользователей в информационной базе 1С, если этот пользователь заблокирован в AD. Такую информацию можно получить запросом: ldapsearch -H ldap://dc.example.com -D user@example.com -w 'password' -b "dc=example,dc=com" "(&(objectClass=user)(useraccountcontrol:66050))".
userAccountControl — является суммой нескольких свойств атрибутов. При этом значение 512 является значением по умолчанию при всех снятых флагах на вкладке "Учетная запись", и каждый дополнительный параметр прибавляется к нему. Ниже представлены примеры комбинаций этих свойств:
512 - Включена (Enabled)
514 (512+2) - Отключена (Disabled)
66048 (512+65536) - Включена, срок действия пароля не ограничен.
66050 (512+65536+2) - Отключена, срок действия пароля не ограничен.
Ниже приведен список основных значений атрибута userAccountControl:
Значение | Описание |
2 | Учетная запись отключена |
16 | Учетная запись заблокирована |
32 | Пароль не требуется |
64 | Запретить смену пароля пользователем |
512 | Учетная запись по умолчанию. Значение указано у обычного пользователя |
65536 | Срок действия пароля не ограничен |
8388608 | Пароль пользователя истек |
К статье добавлена обработка, где реализована загрузка нескольких атрибутов из AD в качестве примера.
В обработке также реализован пример отбора.
Список использованных источников:
https://www.ispsystem.ru/news/active-directory-ldap
https://mivocloud.com/ru/blog/OpenLDAP-cto-eto-takoe-i-zacem-eto-nujno
https://www.openldap.org/
https://notessysadmin.com/main-attributes-active-directory
https://docs.altlinux.org/ru-RU/domain/10.2/html/samba/ldapsearch.html
Проверено на следующих конфигурациях и релизах:
- Зарплата и управление персоналом, редакция 3.1, релизы 3.1.31.32