Интеграция OTRS и Active Directory

Введение

При развертывании OTRS в корпоративном ИТ-ландшафте использование Active Directory (далее - AD) в качестве средства аутентификации и хранилища учетных записей безусловно, является лучшей практикой.

Active Directory может быть задействован для:

  • Хранения учетных записей и аутентификации агентов
  • Хранения учетных записей и аутентификации клиентов
  • Маппинга групп безопасности
OTRS Active Directory
В Таблице 1 приведены сценарии использования внешних хранилищ учетных записей клиентов и агентов в зависимости от направлений предоставления ИТ-услуг.

Таблица 1. Сценарии использования хранилищ учетных записей
ИТ услуги предоставляются: Хранилище агентов Хранилище клиентов
Внешним потребителям (CRM-система отсутствует)Внешнее (AD)Внутреннее (база OTRS)
Внешним потребителям (клиенты ведутся в CRM-системе)Внешнее (AD)Внешняя база данных
Внутренним потребителям (подразделениям компании)Внешнее (AD)Внешнее (AD)
  • Нюансы ведения клиентов (customers) во внешней базе выходят за рамки настоящей статьи, этот вопрос достаточно хорошо освещен в официальной документации, раздел Using External backends.
  • Конфигурационные параметры задаются в файле Kernel/Config.pm.
  • Для получения дополнительной информации по синтаксису и настройкам необходимо обратить внимание на конфигурационный файл Kernel/Config/Defaults.pm.
  • Перед выполнением настроек необходимо получить нужные атрибуты LDAP. В Microsoft Windows Server используется утилита ldifde, например:
    ldifde –f ldap.txt
    
    Либо использовать инструментарий наподобие LDAP Explorer Tool или Apache Directory Studio.
  • Доступ OTRS к дереву LDAP осуществляется в режиме только чтения. Вы не сможете редактировать данные, извлеченные из Active Directory посредством OTRS.

Аутентификация пользователей (агентов)

Аутентификация агентов - модуль Kernel::System::Auth::LDAP.

$Self->{'AuthModule'} = 'Kernel::System::Auth::LDAP';
$Self->{'AuthModule::LDAP::Host'} = 'contoso.com';
$Self->{'AuthModule::LDAP::BaseDN'} = 'dc=contoso,dc=com';
$Self->{'AuthModule::LDAP::UID'} = 'sAMAccountName';
$Self->{'AuthModule::LDAP::GroupDN'} = 'cn=otrs_agents,ou=OTRS,ou=Groups,dc=contoso,dc=com';
$Self->{'AuthModule::LDAP::AccessAttr'} = 'member';
$Self->{'AuthModule::LDAP::UserAttr'} = 'DN';
$Self->{'AuthModule::LDAP::SearchUserDN'} = 'CN=otrs_user,ou=Other,OU=Services,dc=contoso,dc=com';
$Self->{'AuthModule::LDAP::SearchUserPw'} = 'otrs_password';
$Self->{'AuthModule::LDAP::AlwaysFilter'} = '';
$Self->{'AuthModule::LDAP::Params'} = {
    port => 389,
    timeout => 120,
    async => 0,
    version => 3,
};
Синхронизация агентов - модуль Kernel::System::Auth::Sync::LDAP. Применение данных настроек позволяет сократить число запросов к Active Directory и увеличивает скорость аутентификации агентов. Синхронизация данных выполнятся при первом входе агента в OTRS.

$Self->{'AuthSyncModule'} = 'Kernel::System::Auth::Sync::LDAP';
$Self->{'AuthSyncModule::LDAP::Host'} = 'contoso.com';
$Self->{'AuthSyncModule::LDAP::BaseDN'} = 'dc=contoso, dc=com';
$Self->{'AuthSyncModule::LDAP::UID'} = 'sAMAccountName';
$Self->{'AuthSyncModule::LDAP::SearchUserDN'} = 'cn=otrs_user,ou=Other,ou=Services,dc=contoso,dc=com';
$Self->{'AuthSyncModule::LDAP::SearchUserPw'} = 'otrs_password';
$Self->{'AuthSyncModule::LDAP::UserSyncMap'} = {
# DB -> LDAP
UserFirstname => 'givenName',
UserLastname => 'sn',
UserEmail => 'mail',
UserPhone => 'telephoneNumber',
UserTitle => 'title',
};
$Self->{'AuthSyncModule::LDAP::AccessAttr'} = 'member';
$Self->{'AuthSyncModule::LDAP::UserSyncInitialGroups'} = [
'users',
];
  • SearchUserDN - Указать DN (Distinguished Name) учетной записи, под которой будет осуществляться обзор каталога LDAP.
  • SearchUserPw - Пароль к учетной записи.
  • AlwaysFilter - отбор агентов по фильтру, например: (&(objectclass=user)(mail=*)(!(userAccountControl:1.2.840.113556.1.4.803:=2))), имеют заполненный атрибут mail и не включены в отпределенную группу.
  • UserSyncInitialGroups - Группа пользователей по-умолчанию

Маппинг групп пользователей (агентов)

Вы можете использовать группы пользователей Active Directory для включения агентов в соответствующие группы OTRS. Модуль - AuthSyncModule::LDAP::UserSyncGroupsDefinition

Пример 1. Пользователям (агентам), входящим в группу otrs_agents Active Directory, назначается группа users в OTRS.

$Self->{'AuthSyncModule::LDAP::UserSyncGroupsDefinition'} = {
    'cn=otrs_agents,ou=OTRS,ou=Groups,dc=contoso,dc=com' => {
        # otrs group
        'users' => {
        # permission
            rw => 1,
            move_into => 1,
            create => 1,
            note => 1,
            owner => 1,
            priority => 1,
            ro => 1,
        },
    },
};
Пример 2. Пользователям, входящим в группу otrs_admins, назначаются сразу две группы OTRS: users и admins (блок указывается внутри блока UserSyncGroupsDefinition)
       'cn=otrs_admins,ou=OTRS,ou=Groups,dc=contoso,dc=com' => {
        # otrs group
        'admin' => {
        # permission
            rw => 1,
            ro => 1,
        },
        'users' => {
        # permission
            rw => 1,
            move_into => 1,
            create => 1,
            note => 1,
            owner => 1,
            priority => 1,
            ro => 1,
        },
    },
Пример 3. Пользователям, входящим в группу otrs_ro, назначается группа users с правами note и read only (блок указывается внутри блока UserSyncGroupsDefinition)
    'cn=otrs_ro,ou=OTRS,ou=Groups,dc=contoso,dc=com' => {
        'users' => {
        # permission
            rw => 0,
            move_into => 0,
            create => 0,
            note => 1,
            owner => 0,
            priority => 0,
            ro => 1,
        },
    }

Аутентификация и маппинг клиентов (customers)

$Self->{'Customer::AuthModule'} = 'Kernel::System::CustomerAuth::LDAP';
$Self->{'Customer::AuthModule::LDAP::Host'} = 'contoso.com';
$Self->{'Customer::AuthModule::LDAP::BaseDN'} = 'dc=contoso,dc=com';
$Self->{'Customer::AuthModule::LDAP::UID'} = 'sAMAccountName';
$Self->{'Customer::AuthModule::LDAP::SearchUserDN'} = 'cn=otrs_user,ou=Other,ou=Services,dc=contoso,dc=com';
$Self->{'Customer::AuthModule::LDAP::SearchUserPw'} = 'otrs_password';
$Self->{'CustomerUser'} = {
    Module => 'Kernel::System::CustomerUser::LDAP',
    Params => {
        Host => 'contoso.com',
        BaseDN => 'DC=contoso,DC=com',
        SSCOPE => 'sub',
        UserDN =>'cn=otrs_user,ou=Other,ou=Services,dc=contoso,dc=com',
        UserPw => 'otrs_password',
        AlwaysFilter => '(&(samAccountType=805306368)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))',
        SourceCharset => 'utf-8',
        DestCharset => 'utf-8',
    },
    CustomerKey => 'sAMAccountName',
    CustomerID => 'mail',
    CustomerUserListFields => ['sAMAccountName', 'cn', 'mail'],
    CustomerUserSearchFields => ['sAMAccountName', 'cn', 'mail'],
    CustomerUserSearchPrefix => '',
    CustomerUserSearchSuffix => '*',
    CustomerUserSearchListLimit => 10000,
    CustomerUserPostMasterSearchFields => ['mail'],
    CustomerUserNameFields => ['givenname', 'sn'],
    Map => [
        # note: Login, Email and CustomerID needed!
        [ 'UserFirstname', 'Firstname', 'givenname', 1, 1, 'var' ],
        [ 'UserLastname', 'Lastname', 'sn', 1, 1, 'var' ],
        [ 'UserLogin', 'Login', 'sAMAccountName', 1, 1, 'var' ],
        [ 'UserEmail', 'Email', 'mail', 1, 1, 'var' ],
        [ 'UserCustomerID', 'CustomerID', 'mail', 0, 1, 'var' ],
        [ 'UserPhone', 'Phone', 'telephoneNumber', 1, 0, 'var' ],
    ],
};
 

Распространенные ошибки

Некорректно указана учетная запись псевдопользователя для обзора дерева AD (SearchUserDN/SearchUserPw):

[Error][Kernel::System::Auth::LDAP::Auth][Line:192]:: 
First bind failed! 80090308: LdapErr: DSID-0C09042F, comment: AcceptSecurityContext error, data 52e, v2580