SCROLL
Среднее время на прочтение: 5 мин.

Интеграция OTRS 6.0.5 (Open-source Ticket Request System) с Active Directory. Настройка прозрачной аутентификации SSO (Single Sign On).

Разберем как интегрировать OTRS с Active Directory. Рассмотрим два варианта аутентификации, обычная и прозрачная (SSO).

 

Исходные данные:

  • Развернутая система OTRS 6.0.5 (по этой статье)
  • Домен контроллер Windows Server 2012 R2 (JAKONDA.LOCAL)

 

Для интеграции OTRS с Active Directory, необходимо создать пользователя который будет выступать администратором OTRS и с помощью которого будет осуществляться чтение LDAP, для авторизации всех остальных пользователей системы OTRS.

 

Создание пользователя в Active Directory

Создаем пользователя (прим. admin.otrs), снимаем галочку «Требовать смены пароля при следующем входе в систему», выставляем галочки «Запретить смену пароля пользователем», «Срок действия пароля не ограничен». После создания пользователя, в свойствах его, указываем адрес электронной почты.

[stextbox id=’warning’]ВАЖНО: у всех пользователей должен существовать адрес электронной почты. Это обязательное условие для всех пользователей OTRS.[/stextbox]

 

Создаем группу (прим. OTRSagents) и добавляем в нее ранее созданную учетную запись администратора OTRS (admin.otrs).

[stextbox id=’info’]Данная группа будет служить фильтром доступа, на агентурный портал OTRS. Все входящие пользователи в состав этой группы будет иметь доступ, все остальные нет.[/stextbox]

 

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

Заходим на агентурный портал OTRS (http://OTRS_Server_IP/otrs/index.pl), авторизовываемся под учетной записью root@localhost.

 

Переходим в Администрирование — Агенты:

 

Редактируем пользователя root@localhost:

 

Изменяем Логин, Пароль, Email на аналогичные данные от ранее созданного пользователя в Active Directory (admin.otrs).

 

Редактируем конфигурационный файл /opt/otrs/Kernel/Config.pm. После строки (# insert your own config settings «here» #) вставляем:

# ----------------LDAP-Authenticated-------------- #

$Self->{'DefaultCharset'} = 'utf-8';

# Аутентификация LDAP в Агентурный портал
$Self->{'AuthModule'} = 'Kernel::System::Auth::LDAP';

# Можно задать страницу редиректа в случае авторизации и деавторизации
#$Self->{LoginURL} = 'http://helpdesk/index.pl';
#$Self->{LogoutURL} = 'http://helpdesk/otrs/index.pl?Action=Logout';

$Self->{'AuthModule::LDAP::Host'} = '192.168.1.2';
$Self->{'AuthModule::LDAP::BaseDN'} = 'dc=jakonda,dc=local';
$Self->{'AuthModule::LDAP::UID'} = 'sAMAccountName';

# Проверка наличия пользователя в группе OTRS_Agents, для доступа к Агентурному порталу
$Self->{'AuthModule::LDAP::GroupDN'} = 'cn=OTRS_Agents,ou=Users,dc=jakonda,dc=local';
$Self->{'AuthModule::LDAP::AccessAttr'} = 'member';
$Self->{'AuthModule::LDAP::UserAttr'} = 'DN';
$Self->{'AuthModule::LDAP::SearchUserDN'} = 'admin.otrs@jakonda.local';
$Self->{'AuthModule::LDAP::SearchUserPw'} = 'Aa1234567';
$Self->{'AuthModule::LDAP::Params'} = {
 port => 389,
 timeout => 120,
 async => 0,
 version => 3,
 },

# Синхронизация пользователей из каталога LDAP
$Self->{'AuthSyncModule'} = 'Kernel::System::Auth::Sync::LDAP';
$Self->{'AuthSyncModule::LDAP::Host'} = '192.168.1.2';
$Self->{'AuthSyncModule::LDAP::BaseDN'} = 'dc=jakonda,dc=local';
$Self->{'AuthSyncModule::LDAP::UID'} = 'sAMAccountName';
$Self->{'AuthSyncModule::LDAP::SearchUserDN'} = 'admin.otrs@jakonda.local';
$Self->{'AuthSyncModule::LDAP::SearchUserPw'} = 'Aa1234567';
$Self->{'AuthSyncModule::LDAP::UserSyncMap'} = {
 UserFirstname => 'givenName',
 UserLastname => 'sn',
 UserEmail => 'mail',
 };
# Синхронизировать пользователей из указанного каталога
$Self->{'AuthSyncModule::LDAP::UserSyncInitialGroups'} = [
 'ActiveUsers',
 ];

# Авторизация LDAP в клиентский портал
$Self->{'Customer::AuthModule'} = 'Kernel::System::CustomerAuth::LDAP';

# Можно задать страницу редиректа в случае авторизации и деавторизации
$Self->{CustomerPanelLoginURL1} = 'http://helpdesk/otrs/customer.pl';
$Self->{CustomerPanelLogoutURL1} = 'http://helpdesk/otrs/customer.pl';

$Self->{'Customer::AuthModule::LDAP::Host'} ='192.168.1.2';
$Self->{'Customer::AuthModule::LDAP::BaseDN'} = 'dc=jakonda,dc=local';
$Self->{'Customer::AuthModule::LDAP::UID'} = 'sAMAccountName';
$Self->{'Customer::AuthModule::LDAP::SearchUserDN'} = 'admin.otrs@jakonda.local';
$Self->{'Customer::AuthModule::LDAP::SearchUserPw'} = 'Aa1234567';
$Self->{CustomerUser} = {
 Module => 'Kernel::System::CustomerUser::LDAP',
 Params => {
 Host => '192.168.1.2',
 BaseDN => 'dc=jakonda,dc=local',
 SSCOPE => 'sub',
 UserDN => 'admin.otrs@jakonda.local',
 UserPw => 'Aa1234567',
 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 => [
 #[ 'UserSalutation', 'Title', 'title', 1, 0, 'var' ],
 [ 'UserFirstname', 'Firstname', 'displayname', 1, 1, 'var' ],
 [ 'UserLastname', 'Lastname', '', 1, 1, 'var' ],
 [ 'UserLogin', 'Login', 'sAMAccountName', 1, 1, 'var' ],
 [ 'UserEmail', 'Email', 'mail', 1, 1, 'var' ],
 [ 'UserCustomerID', 'CustomerID', 'mail', 0, 1, 'var' ],
 ],
 };
 # ---------------------------------------------------- #

 

Перезапускаем веб-сервер apache:

service apache2 restart

 

Проверяем аутентификацию доменных пользователей в агентурном портале (http://OTRS_Server_IP/otrs/index.pl) и пользовательском (http://OTRS_Server_IP/otrs/customer.pl). Для доступа в агентурный портал, пользователь должен состоять в группе OTRSagents.

 

Агенты создаются в базе OTRS, после первого входа. У созданного агента будут отсутствовать права администратора, для их выдачи нужно авторизоваться под начальным администратором (admin.otrs) и выдать права новому агенту.

 

Проверим подтянулись ли учетные записи пользователей из Active Directory. Переходим в Администрирование — Учетная запись клиента.

 

 

Прозрачная аутентификация SSO (Single Sign On)

Реализацию прозрачной/сквозной (SSO) аутентификации в OTRS, будем осуществлять посредством авторизации Apache в Active Directory.

 

Выполняем настройку авторизации SSO на Apache в Active Directory по этой статье. При создании KEYTAB-файла, используем созданную ранее учетную запись администратора (admin.otrs).

 

Редактируем конфигурационный файл /opt/otrs/Kernel/Config.pm. После строки (# insert your own config settings «here» #) вставляем:

# ----------------SSO-LDAP-Authenticated-------------- #

$Self->{'DefaultCharset'} = 'utf-8';
 
# Аутентификация SSO в Агентурный портал
$Self->{'AuthModule'} = 'Kernel::System::Auth::HTTPBasicAuth';
$Self->{'AuthModule::HTTPBasicAuth::ReplaceRegExp'} = '@JAKONDA.LOCAL';

# Можно задать страницу редиректа в случае авторизации и деавторизации
#$Self->{LoginURL} = 'http://helpdesk/index.pl';
#$Self->{LogoutURL} = 'http://helpdesk/otrs/index.pl?Action=Logout';

$Self->{'AuthModule::LDAP::Host'} = '192.168.1.2';
$Self->{'AuthModule::LDAP::BaseDN'} = 'dc=jakonda,dc=local';
$Self->{'AuthModule::LDAP::UID'} = 'sAMAccountName';

# Проверка наличия пользователя в группе OTRS_Agents, для доступа к Агентурному порталу
$Self->{'AuthModule::LDAP::GroupDN'} = 'cn=OTRS_Agents,ou=Users,dc=jakonda,dc=local';
$Self->{'AuthModule::LDAP::AccessAttr'} = 'member';
$Self->{'AuthModule::LDAP::UserAttr'} = 'DN';
$Self->{'AuthModule::LDAP::SearchUserDN'} = 'admin.otrs@jakonda.local';
$Self->{'AuthModule::LDAP::SearchUserPw'} = 'Aa1234567';
$Self->{'AuthModule::LDAP::Params'} = {
 port => 389,
 timeout => 120,
 async => 0,
 version => 3,
 sscope => 'sub'
 },

# Синхронизация пользователей из каталога LDAP
$Self->{'AuthSyncModule'} = 'Kernel::System::Auth::Sync::LDAP';
$Self->{'AuthSyncModule::LDAP::Host'} = '192.168.1.2';
$Self->{'AuthSyncModule::LDAP::BaseDN'} = 'dc=jakonda,dc=local';
$Self->{'AuthSyncModule::LDAP::UID'} = 'sAMAccountName';
$Self->{'AuthSyncModule::LDAP::SearchUserDN'} = 'admin.otrs@jakonda.local';
$Self->{'AuthSyncModule::LDAP::SearchUserPw'} = 'Aa1234567';
$Self->{'AuthSyncModule::LDAP::UserSyncMap'} = {
 UserFirstname => 'givenName',
 UserLastname => 'sn',
 UserEmail => 'mail',
 };
 # Синхронизировать пользователей из указанного каталога
$Self->{'AuthSyncModule::LDAP::UserSyncInitialGroups'} = [
 'ActiveUsers',
 ];

# Авторизация SSO в клиентский портал
$Self->{'Customer::AuthModule'} = 'Kernel::System::CustomerAuth::HTTPBasicAuth';
$Self->{'Customer::AuthModule::HTTPBasicAuth::ReplaceRegExp'} = '@JAKONDA.LOCAL';

# Можно задать страницу редиректа в случае авторизации и деавторизации
$Self->{CustomerPanelLoginURL1} = 'http://helpdesk/otrs/customer.pl';
$Self->{CustomerPanelLogoutURL1} = 'http://helpdesk/otrs/customer.pl';

$Self->{'Customer::AuthModule::LDAP::Host'} ='192.168.1.2';
$Self->{'Customer::AuthModule::LDAP::BaseDN'} = 'dc=jakonda,dc=local';
$Self->{'Customer::AuthModule::LDAP::UID'} = 'sAMAccountName';
$Self->{'Customer::AuthModule::LDAP::SearchUserDN'} = 'admin.otrs@jakonda.local';
$Self->{'Customer::AuthModule::LDAP::SearchUserPw'} = 'Aa1234567';
$Self->{CustomerUser} = {
 Module => 'Kernel::System::CustomerUser::LDAP',
 Params => {
 Host => '192.168.1.2',
 BaseDN => 'dc=jakonda,dc=local',
 SSCOPE => 'sub',
 UserDN => 'admin.otrs@jakonda.local',
 UserPw => 'Aa1234567',
 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 => [
 #[ 'UserSalutation', 'Title', 'title', 1, 0, 'var' ],
 [ 'UserFirstname', 'Firstname', 'displayname', 1, 1, 'var' ],
 [ 'UserLastname', 'Lastname', '', 1, 1, 'var' ],
 [ 'UserLogin', 'Login', 'sAMAccountName', 1, 1, 'var' ],
 [ 'UserEmail', 'Email', 'mail', 1, 1, 'var' ],
 [ 'UserCustomerID', 'CustomerID', 'mail', 0, 1, 'var' ],
 ],
 };
 # ---------------------------------------------------- #

 

Перезапускаем веб-сервер apache:

service apache2 restart

 

Проверяем аутентификацию доменных пользователей в агентурном портале (http://OTRS_Server_IP/otrs/index.pl) и пользовательском (http://OTRS_Server_IP/otrs/customer.pl). При входе на тот или иной портал, авторизация должна пройти автоматически.

Обсуждение

14 комментариев
  • Привет тебе из 2024! Спасибо за статью, она оказалось лучше, чем официальная документация в 2024 года. Наконец-то смог подтянуть клиентскую базу.

  • Здравствуйте. Попробовал настроить по вашей инструкции. Синхронизация клиентов по ldap работает, но по ссо без ввода логина пароля не заходят. Раньше с ссо дел не имел вообще и нужно ли дополнительно настраивать групповые политики на АД для браузеров или оно без этого должно работать?

    • Это ответ на комментарий Алексей

      Добрый день,
      Чтобы SSO аутентификации проходила корректно, необходимо добавить веб-сервер в зону местной интрасети. Можете через GPO распространить данную настройку.

  • Здравствуйте. Все отлично работает внутри домена. Появилась необходимость работать из внешки в системе. Но при попытке входа в отрс с телефона, говорит ошибка авторизации. Пытался и с префиксом домена и через @domain.name , везде ошибка авторизации

    • Это ответ на комментарий Дмитрий

      Добрый день! Попробуйте в настройках виртуального сервера добавить KrbLocalUserMapping On к остальным параметрам Kerberos авторизации.

      У меня вот так выглядит настройка Kerberos для виртуального сервера OTRS
      AuthType Kerberos
      AuthName «Kerberos authenticated intranet»
      KrbAuthRealms JAKONDA.LOCAL
      KrbServiceName HTTP/webserver.jakonda.local
      Krb5Keytab /etc/webserver.keytab
      KrbMethodNegotiate On
      KrbMethodK5Passwd On
      KrbSaveCredentials Off
      KrbLocalUserMapping On
      KrbVerifyKDC Off
      Require valid-user

      И авторизация успешно работает. Т.е. в локальной сети при входе на OTRS происходит SSO авторизация, а при внешнем подключении запрашивается логин\пароль и введя доменный логин (без указания домена) и пароль, меня успешно авторизовывает.

  • Всё делал по вашей инструкции, ошибок никаких не выдаёт, а просто не авторизуется не через index, не через customer. В чем может быть проблема?

    • Это ответ на комментарий Антон

      Нашёл ошибку в строке
      $Self->{‘AuthModule::LDAP::GroupDN’} = ‘cn=OTRS_Agents,ou=Users,dc=jakonda,dc=local’;

      Поменял ou=Users на cn=Users и всё заработало.

      Но SSO авторизация для клиентов не пашет, пока ковыряю

      • Это ответ на комментарий Антон

        Никакой ошибки нет, просто в моем случае указано cn=OTRS_Agents — это группа безопасности в которой указаны учетные записи пользователей, которая в свою очередь находится в ou=Users домена dc=jakonda,dc=local.

  • Добрый день.
    Настроена обычная интеграция с LDAP
    «Агенты создаются в базе OTRS, после первого входа.» можно ли как-то создавать агентов до их первого входа, что бы можно было заранее раздать им роли?

  • В access.log: 192.168.1.200 — user@DOMAIN.LOCAL [04/May/2018:16:57:12 +0300]
    «GET /otrs/index.pl HTTP/1.1» 500 1068 «-» «Mozilla/4.0
    (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; InfoPath.3)»

    • Это ответ на комментарий Дмитрий

      HTTP/1.1» 500 — проверяйте ошибку 500, вероятно все таки что то не так бы делаете, либо в конфигурационном файле прописываете..

  • Доброго времени суток.
    Подскажите, вот такая ошибочка в конце: [Fri May 04 11:43:57.269243 2018] [auth_kerb:error] [pid 21032] [client 192.168.1.200] gss_acquire_cred() failed: Unspecified GSS failure.
    Minor code may provide more information (, Key table file ‘/etc/kerberos.keytab’ not found)
    Или здесь ( Krb5Keytab /etc/kerberos.keytab
    )нужно прописать файл: который был в Вашем случаи: webserver.keytab

      • Это ответ на комментарий Жаконда

        Да, подставил он у меня называется otrs. Проверяю ошибка: [:error] [pid 1633] Attempt to reload Kernel/System/ObjectManager.pm aborted.\nCompilation failed in require at /opt/otrs/bin/cgi-bin/index.pl line 35.\nBEGIN failed—compilation aborted at /opt/otrs/bi$
        $trs/bin/cgi-bin/index.pl line 35.\n