Разное

Intraservice ldap авторизация: IntraService — Универсальная Service Desk система

Содержание

IntraService — Универсальная Service Desk система


IntraService используется для учета заявок в IT-отделе и как bug tracker для собственных разработок.

Внедрение ПО IntraService в группе компаний IEK преследовало цель-дать сотрудникам организации удобный инструмент для взаимодействия с ИТ, реализовать сервисную модель ИТ-услуг, повысить качество работы ИТ- департамента в части клиент-ориентированности, сроков реализации ИТ-задач, автоматизировать и интегрировать ИТ-процессы с другими сервисами компании.

В процессе внедрения было протестировано и получен опыт работы с несколькими системами, в том числе с ПО собственной разработки. Выбор в пользу Интрасервиса был сделан по следующим критериям.

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

При реализации проекта была создана иерархическая структура ИТ-сервисов, определены типы заявок по стандартам ITIL, роли пользователей на сервисах, определены группы исполнителей для разных территорий, скорректированы шаблоны уведомлений, настроены бизнес-процессы.

В процессе эксплуатации наращивался список используемого функционала системы с регулярным информированием и вовлечением всего персонала организации, корректировались бизнес-процессы. Проводилось нормирование ИТ-услуг по сервисам и типам заявок (время реакции, исполнения). Для повышения исполнительской дисциплины были внедрены предупреждающие сервисные уведомления, регламентные отчеты по расписанию о состоянии работ. Также были настроены регламентные процедуры по автоматическому закрытию и отмене заявок.

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

Кроме Web-интерфейса, система настроена на импорт заявок из нескольких почтовых ящиков с их автоматической обработкой, распределением по сервисам и назначением исполнителей, в том числе для внешних партнеров компании.

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

В планах стоит более активное использование мобильного клиента IntraService и СМС-информирования для ряда сервисов. Поэтапно происходит развитие интеграции программы с другим ПО, использование данных в аналитической отчетности.

Отзыв клиента (PDF, 590kb)>

LDAP аутентификация, авторизация и синхронизация (FreeIPA, AD) / Хабр

OTRS — система обработки заявок с открытым кодом (Open-source Ticket Request System), написанная на Perl.

Существует в двух вариантах:

Перечислю немного из того фукционала, который поддерживает эта система:

  • модуль ITSM (Service Level Management, Change Management, Configuration Management, CMDB)
  • адаптивный веб-интерфейс
  • API
  • SLA и сервисы
  • мультитенантность
  • эскалации
  • аутентификация: DB, LDAP, HTTPBasicAuth, Radius
  • поддержка MySQL, MariaDB, PostgreSQL, Oracle

И если искать в ней недостатки — так это непривычность интерфейса и сложность в настройке. Под катом — об основах авторизации (группы, RBAC, поддержка нескольких компаний-клиентов), аутентификации и синхронизации метаданных (ФИО, телефона и прочего), используя различные каталоги LDAP

Клиенты, очереди, агенты и группы

После установки OTRS у вас сразу будут доступны:

  • клиенты — могут создавать заявки, отправив письмо или используя веб-доступ
  • очереди — каждая заявка попадает в одну из очередей заявок
  • агенты — ИТ специалисты, работающие над выполнением заявок из доступных им очередей
  • группы — сущность, связывающая между собой очереди, клиентов и агентов, а также задающая права агентов — например, только чтение, изменение приоритета заявки и т. п.

Стандартные группы

После установки системы вы увидите три созданные группы:

  • admin — члены группы могут администрировать (настраивать) OTRS
  • stats — возможность настраивать и запускать отчеты
  • users — стандартная группа для клиентов, очередей и агентов

Права, связанные с группами

Основные права

Основные права, которые можно настроить в группе, ограничивающие действия агентов:

  • только чтение — права только на чтение заявки в данной группе/очереди
  • переместить — права на перемещение заявок в эту группу/очередь
  • создание — права на создание заявок в этой группе/очереди
  • заметка — права на добавление заметок в заявки в этой группе/очереди
  • владелец — права на смену владельца заявок в этой группе/очереди
  • приоритет — права на смену приоритета заявок в этой группе/очереди
  • чтение/запись — полные права на чтение и запись для заявок в данной группе/очереди

Дополнительные права

Также существуют и дополнительные права, отображение которых можно включить в настройках (System::Permission):

  • отчеты — предоставляет доступ к странице отчетов
  • перенаправить — право перенаправить/bounce почтовое сообщение (ссылка перенаправить/bounce в ticketZoom)
  • создать — право составления ответа на заявку
  • клиент — право изменить клиента для этой заявки
  • переслать — право пересылать сообщения (с помощью кнопки Переслать)
  • в ожидании — право перевести заявку в ожидание
  • телефон — право добавить содержание звонка клиента к заявке в виде сообщения/заметки
  • ответственный — Право изменить ответственного за заявку

Рассмотрим это более подробно:

  • каждый клиент может быть включен в одну или несколько групп, изначально все клиенты входят в группу users
  • каждая очередь заявок связывается с какой-либо одной из групп
  • через веб-интерфейс клиент может делать заявки в тех очередях, к которым имеют доступ группы, в которые он включен
  • при отправке клиентом заявки по электронной почте существует возможность на основании анализа атрибутов письма (например, адреса отправителя или заголовка письма) изменять характеристики заявки, в том числе и очередь, в которую попадет заявка
  • если клиент позвонил по телефону, агент может завести заявку вручную, выбрав любую из доступных агенту очередей
  • желательно, чтобы заявка клиента всегда была в очередях, доступных клиенту, иначе он не сможет получить доступ к ней через веб-интерфейс
  • агенты могут производить действия в заявками в соответствии с правами на очередь, в которой находится заявка

Аутентификация с использованием базы данных

Стандартный способ аутентификации и авторизации агентов и клиентов — это база данных.

Например, настройки аутентификации агентов, используя базу данных, выглядит так:

$Self->{'AuthModule'} = 'Kernel::System::Auth::DB';

Клиентов:

$Self->{'Customer::AuthModule'} = 'Kernel::System::CustomerAuth::DB';
$Self->{'Customer::AuthModule::DB::Table'} = 'customer_user';
$Self->{'Customer::AuthModule::DB::CustomerKey'} = 'login';
$Self->{'Customer::AuthModule::DB::CustomerPassword'} = 'pw';

Мы также оставим этот способ аутентификации и добавим в дополнение с нему аутентификацию через LDAP.

Роли и компании

Так же мы расширим возможности авторизации, добавив роли и компании:

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

Постановка задачи

Вы — администратор системы OTRS в компании my-it-company.com, предоставляющей сервисные услуги другим компаниям (или подразделениям внутри вашего холдинга).

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

И ваша компания также получит очевидные плюсы — единый пароль сотрудника во все системы, блокировка учетной записи в LDAP заблокирует доступ и во все остальные сервисы.

my-it-company.com работает на Linux и использует в качестве сервера каталогов Red Hat FreeIPA, а обслуживаемые вами подразделения — различные леса Microsoft Active Directory, с которыми у вас нет федерации, но есть возможность подключения к контроллерам домена.

Вам нужно разделить потоки заявок от различных клиентов, а также реализовать различные уровни доступа агентов к очередям — менеджеры должны иметь возможность менять приоритет задач в системе.

Сотрудники вашей компании так же могут ставить задачи в системе для внутренних нужд my-it-company.com, иногда являясь и агентами, и клиентами одновременно (а иногда и нет).

Подготовка

Учетные записи для просмотра LDAP

Если запрещен анонимный просмотр дерева каталогов, то создадим в доменах my-it-company.com, pear.com и macrohard.com учетные записи, прав которых нам хватит, чтобы делать запросы к LDAP (назовем их, например, ldap-bot)

Группы FreeIPA для синхронизации с ролями OTRS

Заведем на FreeIPA три группы пользователей, которые будут синхронизироваться с нашими ролями OTRS, например:

  • otrs-sa — члены этой группы получат доступ к администрированию OTRS, но доступ к очередям давать не будем, чтобы не было желания всегда работать под администратором),
  • otrs-admins — наши менеджеры, имеющие право изменения приоритета заявок) и
  • otrs-helpdesk — учетные записи наших специалистов

Атрибут, определяющий принадлежность к компании

Выберем атрибут, по которому будем определять принадлежность к компании. Пусть это будет атрибут «Организация». Например, у вас все получилось организационно и технически, и все пользователи во всех доменах всегда имеют значение в поле «Организация»:

  • my-it-company — для сотрудников my-it-company.com
  • pear-company — для сотрудников pear.com
  • macrohard-company — для сотрудников macrohard.com

Определим атрибуты пользователя, используемые FreeIPA

Изучим схему FreeIPA, выяснив названия атрибутов, которые нам понадобятся для синхронизации (ФИО, логин, телефон и т. п.).

kinit laptevs
ipa user-show --all --raw laptevs

Получим подобный вывод:

dn: uid=laptevs,cn=users,cn=accounts,dc=my-it-company,dc=com

uid: laptevs

givenname: Stanislav

sn: Laptev

cn: Laptev Stanislav

initials: SL

homedirectory: /home/laptevs

gecos: Laptev Stanislav

loginshell: /bin/sh

krbcanonicalname: [email protected]

krbprincipalname: [email protected]

mail: [email protected]

uidnumber: 1344600003

gidnumber: 1344600003

l: Moscow

telephonenumber: +7(863)999-99-99

mobile: +7(999)999-99-99

ou: My-it-company

title: SysAdm

sshpubkeyfp: SHA256:Yi8mKF+j28/r2cpxLgIbvZ/Oymt57rhliHKhqBuJxqE laptevs-putty (ssh-rsa)

nsaccountlock: FALSE

has_password: TRUE

has_keytab: TRUE

displayName: Laptev Stanislav

ipaSshPubKey: c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBQkpRQUFBZ0VBNjQ1RTJjSjIvWXVVYm9GNzdZY3hLNzBndm1jWlgrZjBZTVpsaXRQVXNCWFZ0cENtTEtwcjRwK2JEeUdhRzNLTWx1T08ydW9wS0pXRk9mWE83Zzl3OTYzdklQblN3MzVHSmI3VGhhbk1pTXpNUE82T1lQZEY0em14b2k4N 0RGYkdXV2V6aGwzcitsbmFGYTB0dEQ5TkFWRU1Fb3BMdmkzcHZ1UXpyVmNjVlMxamFxY1dNT2ZGUC9TRlVoY1dGeVpZd3Z6eW0wWnZObUZtdjVjVHJGNzJMSXZOdHlsNkZGK2ZaU3ZpS01mcXZ6NStkT2xZZGd5bVVSOG5iaVpkTXZKaTIvbzhjTy84ekpoMFhtSnVRSjJXNEVvYVEvajVTTm8ySjZ6NklXNk I3cFB4Y002a0tJcUp5N08zTkNOcGRrVmVQbEFHbThsOFZDREpVa1RLSjRGOS9mSTZFUkhxVUZwK3p1VENTR1R3ZWlKdXppenFSZWJTTkNiMXh4RldmUitvYzFLdWNZSU5QbTYxRi93YXhOcC9aSG9OK2w1dCtkYWI4cElZSGZzTnNUNWx2RWt4Ukh0bnNyeUxsbWk1ZVdzd3RBbDB3TUpWd1cvUWNJcjhOaVN Ybm96Q3dHWTZCaTQ2L0FGTGVidmFLV0tKRmpKZFgxOFlRVDRpVzZGaE83aW40TGlUamlNaENXbStvbjNQbERYeXZpdkJ1WkFXUldXNEdjbXREVW8rSVhZT2t3MWh4UldqdkJtcExHMVZpMFhPckltbmQybTVZdWk1bHo0b1ZlekFRN1NjYVlrdDBoVEdQU1Z2UHpmVlowYWJCQlpiRmViK1hUV2tpSnBPMHBO T3dodGNadHYrN3RMMnc1OFN3QnhVTUk4NzUzdG5Sc1h2blBXZERqcUsxSDA9IGxhcHRldnMtcHV0dHk=

ipaUniqueID: 68d46dac-1d3c-11e9-82fd-0242ac110002

krbExtraData: AAL4VkVcbGFwdGV2c0BPTUlLUk9OLlBSTwA=

krbLastFailedAuth: 20190123084142Z

krbLastPwdChange: 20190121052200Z

krbLoginFailedCount: 0

krbPasswordExpiration: 20190421052200Z

memberof: cn=otrs-admins,cn=groups,cn=accounts,dc=my-it-company,dc=com

memberof: cn=ipausers,cn=groups,cn=accounts,dc=my-it-company,dc=com

mepManagedEntry: cn=laptevs,cn=groups,cn=accounts,dc=my-it-company,dc=com

objectClass: top

objectClass: person

objectClass: organizationalperson

objectClass: inetorgperson

objectClass: inetuser

objectClass: posixaccount

objectClass: krbprincipalaux

objectClass: krbticketpolicyaux

objectClass: ipaobject

objectClass: ipasshuser

objectClass: ipaSshGroupOfPubKeys

objectClass: mepOriginEntry

dn: uid=laptevs,cn=users,cn=accounts,dc=my-it-company,dc=com
uid: laptevs
givenname: Stanislav
sn: Laptev
cn: Laptev Stanislav
mail: [email protected]
l: Moscow
telephonenumber: +7(863)999-99-99
mobile: +7(999)999-99-99
ou: My-it-company
title: SysAdm

Настройка конфигурации OTRS

Файлы конфигурации

  • /opt/otrs/ — как правило, здесь располагаются файлы системы OTRS
  • Kernel/Config.pm — файл конфигурации, который вы редактируете
  • Kernel/Config/Defaults.pm — файл со стандартными настройками, его не редактируете, но в нем можно посмотреть все существующие параметры и комментарии к ним

Настройка агентов

Аутентификация агентов
    # --------------------------------------------------- #
    # Agents authentication                               #
    # --------------------------------------------------- #
    # my-it-company.com LDAP backend
    $Self->{AuthModule} = 'Kernel::System::Auth::LDAP';
    # Адрес LDAP-сервера
    $Self->{'AuthModule::LDAP::Host'} = 'my-it-company.com';
    $Self->{'AuthModule::LDAP::BaseDN'} = 'dc=my-it-company,dc=com';
    $Self->{'AuthModule::LDAP::UID'} = 'uid';

    # Блок нужен, только если запрещен анонимный просмотр структуры каталогов
    $Self->{'AuthModule::LDAP::SearchUserDN'} = 'uid=ldap-bot,cn=users,cn=accounts,dc=my-it-company,dc=com';
    $Self->{'AuthModule::LDAP::SearchUserPw'} = 'bot-password!';

    # Фильтр запроса к LDAP. Пусть у нас будут только пользователи, имеющие заполненный атрибут "электронная почта"
    $Self->{'AuthModule::LDAP::AlwaysFilter'} = '(mail=*)';

    # Добавляем при проблемах с кодировкой
    $Self->{'AuthModule::LDAP::Charset'} = 'utf-8';

    $Self->{'AuthModule::UseSyncBackend'} = 'AuthSyncBackend';


    # my-it-company.com DB backend 
    $Self->{AuthModule2} = 'Kernel::System::Auth::DB';
    $Self->{'AuthModule::DB::CryptType2'} = 'sha2';
    # --------------------------------------------------- #
    # End Agents authentication                           #
    # --------------------------------------------------- #

Синхронизация агентов (групп LDAP с ролями OTRS)
    # --------------------------------------------------- #
    # Agent authentication sync                           #
    # (enable agent data sync. after succsessful          #
    # authentication)                                     #
    # --------------------------------------------------- #
    
    # my-it-company.com LDAP auth sync. backend.
    $Self->{AuthSyncModule} = 'Kernel::System::Auth::Sync::LDAP';
    $Self->{'AuthSyncModule::LDAP::Host'} = 'my-it-company.com';
    $Self->{'AuthSyncModule::LDAP::BaseDN'} = 'dc=my-it-company,dc=com';
    $Self->{'AuthSyncModule::LDAP::UID'} = 'uid';

    $Self->{'AuthSyncModule::LDAP::SearchUserDN'} = 'uid=ldap-bot,cn=users,cn=accounts,dc=my-it-company,dc=com';
    $Self->{'AuthSyncModule::LDAP::SearchUserPw'} = 'bot-password!';

    $Self->{'AuthSyncModule::LDAP::AlwaysFilter'} = '(mail=*)';

    $Self->{'AuthSyncModule::LDAP::UserSyncMap'} = {
        # DB -> LDAP
        UserFirstname => 'givenName',
        UserLastname  => 'sn',
        UserEmail     => 'mail',
    };

    $Self->{'AuthSyncModule::LDAP::AccessAttr'} = 'member';
    $Self->{'AuthSyncModule::LDAP::UserAttr'} = 'DN';

    $Self->{'AuthSyncModule::LDAP::UserSyncRolesDefinition'} = {
        # ldap group
        'cn=otrs-sa,cn=groups,cn=accounts,dc=my-it-company,dc=com' => {
            # otrs role
            'otrs-sa' => 1,
        },
        'cn=otrs-admins,cn=groups,cn=accounts,dc=my-it-company,dc=com' => {
            'otrs-admins' => 1,
        },
        'cn=otrs-helpdesk,cn=groups,cn=accounts,dc=my-it-company,dc=com' => {
            'helpdesk' => 1,
        }
    };
 
    $Self->{DatabaseUserTable}       = 'users';
    $Self->{DatabaseUserTableUserID} = 'id';
    $Self->{DatabaseUserTableUserPW} = 'pw';
    $Self->{DatabaseUserTableUser}   = 'login';

    # --------------------------------------------------- #
    # End Agents authentication sync                      #
    # --------------------------------------------------- #

Если вы решили, что роли вам не подходят, и вы хотите только группы, приведу два примера синхронизации групп LDAP с группами OTRS — упрощенный и с настройкой прав по каждой группе.Альтернативная синхронизация агентов (групп LDAP с группами OTRS, с указанием прав)

    # --------------------------------------------------- #
    # Agent authentication sync                           #
    # (enable agent data sync. after succsessful          #
    # authentication)                                     #
    # --------------------------------------------------- #
    
    # my-it-company.com LDAP auth sync. backend.
    $Self->{AuthSyncModule} = 'Kernel::System::Auth::Sync::LDAP';
    $Self->{'AuthSyncModule::LDAP::Host'} = 'my-it-company.com';
    $Self->{'AuthSyncModule::LDAP::BaseDN'} = 'dc=my-it-company,dc=com';
    $Self->{'AuthSyncModule::LDAP::UID'} = 'uid';

    $Self->{'AuthSyncModule::LDAP::SearchUserDN'} = 'uid=ldap-bot,cn=users,cn=accounts,dc=my-it-company,dc=com';
    $Self->{'AuthSyncModule::LDAP::SearchUserPw'} = 'bot-password!';

    $Self->{'AuthSyncModule::LDAP::AlwaysFilter'} = '(mail=*)';

    $Self->{'AuthSyncModule::LDAP::UserSyncMap'} = {
        # DB -> LDAP
        UserFirstname => 'givenName',
        UserLastname  => 'sn',
        UserEmail     => 'mail',
    };

    $Self->{'AuthSyncModule::LDAP::AccessAttr'} = 'member';
    $Self->{'AuthSyncModule::LDAP::UserAttr'} = 'DN';

    # AuthSyncModule::LDAP::UserSyncGroupsDefinition
    # (If "LDAP" was selected for AuthModule and you want to sync LDAP
    # groups to otrs groups, define the following.)
    $Self->{'AuthSyncModule::LDAP::UserSyncGroupsDefinition'} = {
        # ldap group
        'cn=otrs-admins,cn=groups,cn=accounts,dc=my-it-company,dc=com' => {
            # otrs group
            'admin' => {
                # permission
                rw => 1,
                move_into => 1,
                create => 1,
                note => 1,
                owner => 1,
                prioriry => 1,
                ro => 1,
            },
            'stats' => {
                rw => 1,
                move_into => 1,
                create => 1,
                note => 1,
                owner => 1,
                prioriry => 1,
                ro => 1,
            },
            'users' => {
                rw => 1,
                move_into => 1,
                create => 1,
                note => 1,
                owner => 1,
                prioriry => 1,
                ro => 1,
            },
            'pear-group' => {
                rw => 1,
                move_into => 1,
                create => 1,
                note => 1,
                owner => 1,
                prioriry => 1,
                ro => 1,
            },
            'macrohard-group' => {
                rw => 1,
                move_into => 1,
                create => 1,
                note => 1,
                owner => 1,
                prioriry => 1,
                ro => 1,
            },
        },
        'cn=otrs-helpdesk,cn=groups,cn=accounts,dc=my-it-company,dc=com' => {
            'stats' => {
                rw => 1,
                move_into => 1,
                create => 1,
                note => 1,
                owner => 1,
                prioriry => 1,
                ro => 1,
            },
            'users' => {
                rw => 1,
                move_into => 1,
                create => 1,
                note => 1,
                owner => 1,
                prioriry => 1,
                ro => 1,
            },
        }
    };


    $Self->{DatabaseUserTable}       = 'users';
    $Self->{DatabaseUserTableUserID} = 'id';
    $Self->{DatabaseUserTableUserPW} = 'pw';
    $Self->{DatabaseUserTableUser}   = 'login';

    # --------------------------------------------------- #
    # End Agents authentication sync                      #
    # --------------------------------------------------- #

Альтернативная упрощенная синхронизация агентов (групп LDAP с ролями OTRS с правами rw)

    # --------------------------------------------------- #
    # Agent authentication sync                           #
    # (enable agent data sync. after succsessful          #
    # authentication)                                     #
    # --------------------------------------------------- #
    
    # my-it-company.com LDAP auth sync. backend.
    $Self->{AuthSyncModule} = 'Kernel::System::Auth::Sync::LDAP';
    $Self->{'AuthSyncModule::LDAP::Host'} = 'my-it-company.com';
    $Self->{'AuthSyncModule::LDAP::BaseDN'} = 'dc=my-it-company,dc=com';
    $Self->{'AuthSyncModule::LDAP::UID'} = 'uid';

    $Self->{'AuthSyncModule::LDAP::SearchUserDN'} = 'uid=ldap-bot,cn=users,cn=accounts,dc=my-it-company,dc=com';
    $Self->{'AuthSyncModule::LDAP::SearchUserPw'} = 'bot-password!';

    $Self->{'AuthSyncModule::LDAP::AlwaysFilter'} = '(mail=*)';

    $Self->{'AuthSyncModule::LDAP::UserSyncMap'} = {
        # DB -> LDAP
        UserFirstname => 'givenName',
        UserLastname  => 'sn',
        UserEmail     => 'mail',
    };

    $Self->{'AuthSyncModule::LDAP::AccessAttr'} = 'member';
    $Self->{'AuthSyncModule::LDAP::UserAttr'} = 'DN';

    # Включать агента в какие-либо группы с доступом на чтение/запись
    # AuthSyncModule::LDAP::UserSyncInitialGroups
    # (sync following group with rw permission after initial create of first agent
    # login)
    $Self->{'AuthSyncModule::LDAP::UserSyncInitialGroups'} = [
        'users',
    ];

    $Self->{DatabaseUserTable}       = 'users';
    $Self->{DatabaseUserTableUserID} = 'id';
    $Self->{DatabaseUserTableUserPW} = 'pw';
    $Self->{DatabaseUserTableUser}   = 'login';

    # --------------------------------------------------- #
    # End Agents authentication sync                      #
    # --------------------------------------------------- #

Настройка клиентов

Аутентификация клиентов
    # --------------------------------------------------- #
    # Сustomer authentication                             #
    # --------------------------------------------------- #

    # Сustomer DB auth. backend
    $Self->{'Customer::AuthModule'}                       = 'Kernel::System::CustomerAuth::DB';
    $Self->{'Customer::AuthModule::DB::Table'}            = 'customer_user';
    $Self->{'Customer::AuthModule::DB::CustomerKey'}      = 'login';
    $Self->{'Customer::AuthModule::DB::CustomerPassword'} = 'pw';


    # my-it-company.com  (Сustomer) LDAP auth. backend
    $Self->{'Customer::AuthModule2'} = 'Kernel::System::CustomerAuth::LDAP';
    $Self->{'Customer::AuthModule::LDAP::Host2'} = 'my-it-company.com';
    $Self->{'Customer::AuthModule::LDAP::BaseDN2'} = 'dc=my-it-company,dc=com';
    $Self->{'Customer::AuthModule::LDAP::UID2'} = 'uid';

    $Self->{'Customer::AuthModule::LDAP::SearchUserDN2'} = 'uid=ldap-bot,cn=users,cn=accounts,dc=my-it-company,dc=com';
    $Self->{'Customer::AuthModule::LDAP::SearchUserPw2'} = 'bot-password!';

    $Self->{'Customer::AuthModule::LDAP::AlwaysFilter2'} = '(mail=*)';

    
    # pear LDAP auth. backend.
    $Self->{'Customer::AuthModule3'} = 'Kernel::System::CustomerAuth::LDAP';
    $Self->{'Customer::AuthModule::LDAP::Host3'} = 'pear.com';
    $Self->{'Customer::AuthModule::LDAP::BaseDN3'} = 'DC=pear,DC=com';
    $Self->{'Customer::AuthModule::LDAP::UID3'} = 'sAMAccountName';


    $Self->{'Customer::AuthModule::LDAP::SearchUserDN3'} = '[email protected]';
    $Self->{'Customer::AuthModule::LDAP::SearchUserPw3'} = 'bot-password?';

    # Отфильтруем: (mail=*) - у кого есть почта и (samAccountType=805306368) - учетная запись пользователя и (!(userAccountControl:1.2.840.113556.1.4.803:=2)) - не отключена
    $Self->{'Customer::AuthModule::LDAP::AlwaysFilter3'} = '(&(mail=*)(samAccountType=805306368)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))';

    
    # macrohard LDAP auth. backend.
    $Self->{'Customer::AuthModule4'} = 'Kernel::System::CustomerAuth::LDAP';
    $Self->{'Customer::AuthModule::LDAP::Host4'} = 'macrohard.com';
    $Self->{'Customer::AuthModule::LDAP::BaseDN4'} = 'dc=macrohard,dc=com';
    $Self->{'Customer::AuthModule::LDAP::UID4'} = 'sAMAccountName';

    $Self->{'Customer::AuthModule::LDAP::SearchUserDN4'} = '[email protected]';
    $Self->{'Customer::AuthModule::LDAP::SearchUserPw4'} = 'bot-password!?';

    $Self->{'Customer::AuthModule::LDAP::AlwaysFilter4'} = '(&(mail=*)(samAccountType=805306368)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))';
    # --------------------------------------------------- #
    # End customer authentication settings                #
    # --------------------------------------------------- #

Синхронизация клиентов (получение атрибутов клиента из LDAP, связь с компаниями OTRS)
    # --------------------------------------------------- #
    # Customer authentication sync                        #
    # --------------------------------------------------- #

    # Customer user DB backend and settings
    $Self->{CustomerUser} = {
        Name   => Translatable('Database Backend'),
        Module => 'Kernel::System::CustomerUser::DB',
        Params => {
            Table => 'customer_user',
            SearchCaseSensitive => 0,
        },

        # customer unique id
        CustomerKey => 'login',

        # customer #
        CustomerID    => 'customer_id',
        CustomerValid => 'valid_id',

        CustomerUserListFields => [ 'first_name', 'last_name', 'email' ],

        CustomerUserSearchFields           => [ 'login', 'first_name', 'last_name', 'customer_id' ],
        CustomerUserSearchPrefix           => '*',
        CustomerUserSearchSuffix           => '*',
        CustomerUserSearchListLimit        => 250,
        CustomerUserPostMasterSearchFields => ['email'],
        CustomerUserNameFields             => [ 'title', 'first_name', 'last_name' ],
        CustomerUserEmailUniqCheck         => 1,

        CustomerCompanySupport => 1,
        CacheTTL => 60 * 60 * 24,
        Map => [
            [ 'UserTitle', Translatable('Title or salutation'), 'title',          1, 0, 'var', '', 0, undef, undef ],
            [ 'UserFirstname', Translatable('Firstname'),  'first_name',     1, 1, 'var', '', 0, undef, undef ],
            [ 'UserLastname', Translatable('Lastname'),  'last_name',      1, 1, 'var', '', 0, undef, undef ],
            [ 'UserLogin', Translatable('Username'),  'login',          1, 1, 'var', '', 0, undef, undef ],
            [ 'UserPassword', Translatable('Password'),  'pw',             0, 0, 'var', '', 0, undef, undef ],
            [ 'UserEmail', Translatable('Email'),  'email',          1, 1, 'var', '', 0, undef, undef ],
            [ 'UserCustomerID', Translatable('CustomerID'),  'customer_id',    0, 1, 'var', '', 0, undef, undef ],
            [ 'UserPhone', Translatable('Phone'),  'phone',          1, 0, 'var', '', 0, undef, undef ],
            [ 'UserFax', Translatable('Fax'),  'fax',            1, 0, 'var', '', 0, undef, undef ],
            [ 'UserMobile', Translatable('Mobile'),  'mobile',         1, 0, 'var', '', 0, undef, undef ],
            [ 'UserStreet', Translatable('Street'),  'street',         1, 0, 'var', '', 0, undef, undef ],
            [ 'UserZip', Translatable('Zip'),  'zip',            1, 0, 'var', '', 0, undef, undef ],
            [ 'UserCity', Translatable('City'),  'city',           1, 0, 'var', '', 0, undef, undef ],
            [ 'UserCountry', Translatable('Country'),  'country',        1, 0, 'var', '', 0, undef, undef ],
            [ 'UserComment', Translatable('Comment'),  'comments',       1, 0, 'var', '', 0, undef, undef ],
            [ 'ValidID', Translatable('Valid'),  'valid_id',       0, 1, 'int', '', 0, undef, undef ],
        ],

        # default selections
        Selections => {
#            UserTitle => {
#                'Mr.' => Translatable('Mr.'),
#                'Mrs.' => Translatable('Mrs.'),
#            },
        },
    };



    # my-it-company.com customer user ldap backend and settings
    $Self->{CustomerUser2} = {
        Name => 'AD my-it-company.com',
        Module => 'Kernel::System::CustomerUser::LDAP',
        Params => {
            # ldap host
            Host => 'my-it-company.com',
            # ldap base dn
            BaseDN => 'dc=my-it-company,dc=com',
            # search scope (one|sub)
            SSCOPE => 'sub',
            UserDN => 'uid=ldap-bot,cn=users,cn=accounts,dc=my-it-company,dc=com',
            UserPw => 'bot-password!',
            # in case you want to add always one filter to each ldap query, use
            # this option. e. g. AlwaysFilter => '(mail=*)' or AlwaysFilter => '(objectclass=user)'
            AlwaysFilter => '(mail=*)',
            SourceCharset => 'utf-8',
            Die => 0,
        },
        # customer unique id
        CustomerKey => 'uid',
        # customer #
        CustomerID => 'ou',
        CustomerUserListFields => ['uid', 'cn', 'mail'],
        CustomerUserSearchFields => ['uid', 'cn', 'mail'],
        CustomerUserSearchPrefix => '',
        CustomerUserSearchSuffix => '*',
        CustomerUserSearchListLimit => 250,
        CustomerUserPostMasterSearchFields => ['mail'],
        CustomerUserNameFields => ['sn', 'givenname'],
        # Configures the character for joining customer user name parts. Join single space if it is not defined.
        CustomerUserNameFieldsJoin => ' ',
        # show customer user and customer tickets in customer interface
        CustomerUserExcludePrimaryCustomerID => 0,
        # add a ldap filter for valid users (expert setting)
        # CustomerUserValidFilter => '(!(description=gesperrt))',
        # admin can't change customer preferences
        AdminSetPreferences => 1,
        # cache time to live in sec. - cache any ldap queries
        CacheTTL => 0,
        Map => [
            [ 'UserTitle', Translatable('Title or salutation'), 'title',               1, 0, 'var', '', 1, undef, undef ],
            [ 'UserFirstname', Translatable('Firstname'),  'givenname',           1, 1, 'var', '', 1, undef, undef ],
            [ 'UserLastname', Translatable('Lastname'),  'sn',                  1, 1, 'var', '', 1, undef, undef ],
            [ 'UserLogin', Translatable('Username'),  'uid',      1, 1, 'var', '', 1, undef, undef ],
            [ 'UserEmail', Translatable('Email'),  'mail',                1, 1, 'var', '', 1, undef, undef ],
            [ 'UserCustomerID', Translatable('CustomerID'),  'ou',                0, 1, 'var', '', 1, undef, undef ],
            [ 'UserPhone', Translatable('Phone'),  'telephonenumber',     1, 0, 'var', '', 1, undef, undef ],
            [ 'UserMobile', Translatable('Mobile'),  'mobile',     1, 0, 'var', '', 1, undef, undef ],
        ],
    };


    # pear customer user ldap backend and settings
    $Self->{CustomerUser3} = {
        Name => 'AD pear',
        Module => 'Kernel::System::CustomerUser::LDAP',
        Params => {
            # ldap host
            Host => 'pear.com',
            BaseDN => 'DC=pear,DC=com',
            SSCOPE => 'sub',
            UserDN => '[email protected]',
            UserPw => 'bot-password?',
            AlwaysFilter => '(&(mail=*)(samAccountType=805306368)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))',
            SourceCharset => 'utf-8',
            Die => 0,
        },
        # customer unique id
        CustomerKey => 'sAMAccountName',
        # customer #
        CustomerID => 'company',
        CustomerUserListFields => ['sAMAccountName', 'cn', 'mail'],
        CustomerUserSearchFields => ['sAMAccountName', 'cn', 'mail'],
        CustomerUserSearchPrefix => '',
        CustomerUserSearchSuffix => '*',
        CustomerUserSearchListLimit => 250,
        CustomerUserPostMasterSearchFields => ['mail'],
        CustomerUserNameFields => ['sn', 'givenname'],
        # Configures the character for joining customer user name parts. Join single space if it is not defined.
        CustomerUserNameFieldsJoin => ' ',
        # show customer user and customer tickets in customer interface
        CustomerUserExcludePrimaryCustomerID => 0,
        AdminSetPreferences => 1,
        CacheTTL => 0,
        Map => [
            # note: Login, Email and CustomerID needed!
            # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly, http-link-target, link class(es)
            [ 'UserTitle', Translatable('Title or salutation'), 'title',               1, 0, 'var', '', 1, undef, undef ],
            [ 'UserFirstname', Translatable('Firstname'),  'givenname',           1, 1, 'var', '', 1, undef, undef ],
            [ 'UserLastname', Translatable('Lastname'),  'sn',                  1, 1, 'var', '', 1, undef, undef ],
            [ 'UserLogin', Translatable('Username'),  'sAMAccountName',      1, 1, 'var', '', 1, undef, undef ],
            [ 'UserFullLogin', Translatable('FullUsername'),  'userPrincipalName',      1, 1, 'var', '', 1, undef, undef ],
            [ 'UserEmail', Translatable('Email'),  'mail',                1, 1, 'var', '', 1, undef, undef ],
            [ 'UserCustomerID', Translatable('CustomerID'),  'company',                0, 1, 'var', '', 1, undef, undef ],
            [ 'UserPhone', Translatable('Phone'),  'telephoneNumber',     1, 0, 'var', '', 1, undef, undef ],
            [ 'UserMobile', Translatable('Mobile'),  'mobile',     1, 0, 'var', '', 1, undef, undef ],
            [ 'UserAddress', Translatable('Address'),  'postaladdress',       1, 0, 'var', '', 1, undef, undef ],
            [ 'UserOffice', Translatable('Office'),  'physicalDeliveryOfficeName',       1, 0, 'var', '', 1, undef, undef ],
            [ 'UserDepartment', Translatable('Department'),  'department',       1, 0, 'var', '', 1, undef, undef ],
            [ 'UserComment', Translatable('Comment'),  'description',         1, 0, 'var', '', 1, undef, undef ],
        ],
    };

    # macrohard customer user ldap backend and settings
    $Self->{CustomerUser4} = {
        Name => 'AD macrohard',
        Module => 'Kernel::System::CustomerUser::LDAP',
        Params => {
            # ldap host
            Host => 'macrohard.com',
            # ldap base dn
            BaseDN => 'dc=macrohard,dc=com',
            # search scope (one|sub)
            SSCOPE => 'sub',
            UserDN => '[email protected]',
            UserPw => 'bot-password!?',
            AlwaysFilter => '(&(mail=*)(samAccountType=805306368)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))',
            SourceCharset => 'utf-8',
            Die => 0,
        },
        # customer unique id
        CustomerKey => 'sAMAccountName',
        # customer #
        CustomerID => 'company',
        CustomerUserListFields => ['sAMAccountName', 'cn', 'mail'],
        CustomerUserSearchFields => ['sAMAccountName', 'cn', 'mail'],
        CustomerUserSearchPrefix => '',
        CustomerUserSearchSuffix => '*',
        CustomerUserSearchListLimit => 250,
        CustomerUserPostMasterSearchFields => ['mail'],
        CustomerUserNameFields => ['sn', 'givenname'],
        # Configures the character for joining customer user name parts. Join single space if it is not defined.
        CustomerUserNameFieldsJoin => ' ',
        # show customer user and customer tickets in customer interface
        CustomerUserExcludePrimaryCustomerID => 0,
        AdminSetPreferences => 1,
        CacheTTL => 0,
        Map => [
            [ 'UserTitle', Translatable('Title or salutation'), 'title',               1, 0, 'var', '', 1, undef, undef ],
            [ 'UserFirstname', Translatable('Firstname'),  'givenname',           1, 1, 'var', '', 1, undef, undef ],
            [ 'UserLastname', Translatable('Lastname'),  'sn',                  1, 1, 'var', '', 1, undef, undef ],
            [ 'UserLogin', Translatable('Username'),  'sAMAccountName',      1, 1, 'var', '', 1, undef, undef ],
            [ 'UserFullLogin', Translatable('FullUsername'),  'userPrincipalName',      1, 1, 'var', '', 1, undef, undef ],
            [ 'UserEmail', Translatable('Email'),  'mail',                1, 1, 'var', '', 1, undef, undef ],
            [ 'UserCustomerID', Translatable('CustomerID'),  'company',                0, 1, 'var', '', 1, undef, undef ],
            [ 'UserPhone', Translatable('Phone'),  'telephoneNumber',     1, 0, 'var', '', 1, undef, undef ],
            [ 'UserMobile', Translatable('Mobile'),  'mobile',     1, 0, 'var', '', 1, undef, undef ],
            [ 'UserAddress', Translatable('Address'),  'postaladdress',       1, 0, 'var', '', 1, undef, undef ],
            [ 'UserOffice', Translatable('Office'),  'physicalDeliveryOfficeName',       1, 0, 'var', '', 1, undef, undef ],
            [ 'UserDepartment', Translatable('Department'),  'department',       1, 0, 'var', '', 1, undef, undef ],
            [ 'UserComment', Translatable('Comment'),  'description',         1, 0, 'var', '', 1, undef, undef ],
        ],
    };

Заключение

Как вы увидели, настройка аутентификации и синхронизации аккаунтов в OTRS — это очень просто, но все же надеюсь, что эта статья поможет тем, кто только начинает знакомиться с этой системой.

Что осталось за бортом этой статьи?

  • Параллельно с LDAP можно также запустить SSO-авторизацию, что еще упростит жизнь клиентам
  • Если есть специалисты по Perl — можно написать собственные backend для подключения к другим информационным системам.
  • Сознательно упрощена конфигурация, например, нет блоков фильтрации по принадлежности к группам LDAP, нет доменных суффиксов, BASE DN, работы с дополнительными атрибутами, работы с LDAP на других портах и много другого

Советы и уточнения приветствуются комментариях, информация об опечатках — в ЛС.

Спасибо за внимание. Отдельное спасибо авторам, чьи материалы по OTRS я использовал много лет назад при знакомстве с этой системой: Turilion, supersuperoleg, wmlex

Настройка аутентификации на прокси через LDAP в службе каталогов¶

Импортирование сертификата центра сертификации Active Directory

Осуществите импорт сертификата в соответствии с инструкцией Использование сертификата центра сертификации Active Directory. Данный сертификат потребуется для работы LDAPS.

Настройка коннектора LDAP

Пройдите в раздел Система -> Доступ -> Серверы, в правом верхнем углу нажмите на кнопку Добавить сервер и задайте настройки, аналогичные приведенным ниже:

Описательное имя

LDAP connector

Тип

LDAP

Имя хоста или IP-адрес

controller.dom.loc

Значение порта

636

Транспортный протокол

SSL — зашифрованный

Центр сертификации пиров

dom.loc CA

Версия протокола

3

Привязать параметры доступа

User Principle Name для пользователя

Область поиска

Уровень: единичный; База поиска: DC=dom, DC=loc

Контейнеры для аутентификации

OU=Users,OU=UO — LAN,DC=dom,DC=loc

Атрибут присвоения имени пользователю

samAccountName

Поле Имя хоста или IP-адрес

При настройке LDAPS, в поле Имя хоста или IP-адрес важно указывать именно DNS-имя LDAP-сервера (контроллера домена), и именно то DNS-имя, которое содержится в поле Subject или в поле Subject Alternative Name сертификата, предъявляемого LDAP-сервером. В нашем примере, LDAP-сервер / контроллер домена имеет DNS-имя controller.dom.loc.

Поле Транспортный протокол

При использовании LDAP, LDAP-клиент аутентифицируется на LDAP-сервере с использованием доменного логина / пароля. При использовании нешифрованного LDAP, все данные (в том числе логин и пароль) передаются в открытом виде и могут быть перехвачены. Предпочтительнее использовать LDAPS (LDAP over SSL/TLS).

Поле Центр сертификации пиров

В доменной среде Active Directory удобно использовать сертификаты, изданные центром сертификации Active Directory. Выберите ранее импортированный сертификат издательства в поле Центр сертификации пиров. В нашем примере, импортированный сертификат издательства называется dom.loc CA. Импортированный сертификат издательства используется для верификации серверного сертификата, предъявляемого LDAP-сервером.

Поле Привязать параметры доступа

В качестве параметра доступа лучше всего указать пользователя в виде принципала Kerberos (т.е. указать User Principal Name). Например, если домен Windows у нас dom.loc, а имя пользователя danny, то UPN выгдядит следующим образом:

Поле Область поиска

Любой LDAP запрос предполагает указание ряда параметров, в соответствии с которыми осуществляется операция поиска в LDAP-каталоге. В нашем примере, домен называется dom.loc, поэтому базу поиска нужно указывать как DC=dom, DC=loc.

Поле Контейнеры для аутентификации

В нашем случае, пользователи находятся в нескольких организационных единицах (OU). Полностью путь до пользователей в LDAP-каталоге выглядит как OU=Users,OU=UO — LAN,DC=dom,DC=loc. В вашем случае, путь до пользователей будет выглядеть иначе.

Поле Атрибут присвоения имени пользователю

Поле должно содержать значение samAccountName для доменной среды Active Directory.

Включение LDAP аутентификации в веб-прокси

Проверьте, что в настройках веб-прокси используется метод авторизации LDAP. Для этого пройдите в Службы -> Веб-прокси -> Администрирование, вкладка Forward Proxy, пункт меню Authentication Settings.

В поле Метод аутентификации должен быть выбран ранее созданный LDAP-коннектор.

Аутентификация LDAP в Linux – Information Security Squad

Это руководство покажет вам, как держать своих пользователей в LDAP и аутентифицировать некоторых из них.

Я не буду показывать, как устанавливать определенные пакеты, поскольку это зависит от дистрибутива / системы.

Я сосредоточусь на «чистой» конфигурации всех компонентов, необходимых для аутентификации / хранения пользователей в LDAP.

Предполагается, что вы переходите от обычной аутентификации passwd / shadow, но она также подходит для людей, которые делают это с нуля.

Требования

Введение

Мы хотим добиться того, чтобы наши пользователи сохранялись в LDAP, аутентифицировались через LDAP (direct или pam) и чтобы вы имели некоторый инструмент для управления этими всем понятным для человека способом.

Таким образом, мы можем использовать все программное обеспечение, поддерживающее LDAP, или возвратимся к модулю LDAP PAM, который будет действовать как шлюз PAM-> LDAP.

Более подробную информацию о идее LDAP можно найти в Википедии: LDAP wikipedia

Настройка OpenLDAP

OpenLDAP состоит из slapd и slurpd-демона.

Этот способ охватывает один сервер LDAP без репликации, поэтому мы сосредоточимся только на slapd.

Я также предполагаю, что вы установили и инициализировали установку OpenLDAP (в зависимости от системы / распространения).

Если да, перейдем к части конфигурации.

В моей системе (Gentoo) конфигурация OpenLDAP хранится в /etc/openldap, нас интересует файл /etc/openldap/slapd.conf.

Но сначала мы должны сгенерировать пароль для администратора LDAP, чтобы поместить его в файл конфигурации:

slappasswd -h {md5}

Конфигурация выглядит так:

include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/nis.schema
allow bind_v2
pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args
modulepath      /usr/lib/openldap/openldap
access to attrs=userPassword
        by dn="uid=root,ou=People,dc=domain,dc=com" write
        by dn="cn=Manager,dc=domain,dc=com" write
        by anonymous auth
        by self write
        by * none

access to dn.base="" by * read
access to *
         by dn="cn=Manager,dc=domain,dc=com" write
         by * read


database        bdb
suffix          "dc=domain,dc=com"
rootdn          "cn=Manager,dc=domain,dc=com"
rootpw          {MD5}Tk1sMytv5ipjr+Vhcf03JQ==

directory       /var/lib/openldap-data
index   objectClass     eq

Не забудьте изменить суффикс и пути.

Это варианты с некоторыми базовыми ACL, необходимыми для изменения паролей пользователем.

Если вам нужна дополнительная функциональность, прочитайте руководство по OpenLDAP.

Теперь, когда у нас есть надлежащая конфигурация для slapd, мы можем запустить демон:

service slapd start

Пожалуйста, не забудьте сделать что-то подобное в файле конфигурации, отвечающем за аргументы, переданные slapd (путь должен указывать на slapd.sock):

OPTS="-h 'ldaps:// ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock'"

Теперь мы можем проверить, работает ли openldap и работает ли он правильно.

У нас еще нет данных в каталоге, но мы можем попытаться связать их как cn = Manager, dc = domain, dc = com.

Когда вас попросят ввести пароль, вы должны использовать тот, который вы создали (конечно, его текстовая версия :):

ldapsearch -D "cn=Manager,dc=domain,dc=com" -W

Миграция / добавление данных в каталог

Теперь, когда у нас есть работающий сервер LDAP, мы должны заполнить его данными, либо создать, либо перенести записи.

Я покажу вам, как переносить существующие записи из обычных /etc/ passwd, /etc/shadow, /etc/groups

Первый шаг – настроить mogrationtools.

Конфигурационный файл в Gentoo находится в /usr/share/migrationtools/migrate_common.ph.

Как правило, вам нужно изменить только эти моменты:

$DEFAULT_BASE = "dc=domain,dc=com";
$EXTENDED_SCHEMA = 1;

Теперь вы готовы перенести данные (на самом деле это работает даже без команды export):

export ETC_SHADOW=/etc/shadow
./migrate_base.pl > /tmp/base.ldif
./migrate_group.pl /etc/group /tmp/group.ldif
./migrate_hosts.pl /etc/hosts /tmp/hosts.ldif
./migrate_passwd.pl /etc/passwd /tmp/passwd.ldif

Теперь у нас есть данные в формате, понятном серверу LDAP.

Пожалуйста, откройте один из файлов с текстовым редактором, чтобы привыкнуть к синтаксису.

После этого мы можем добавить данные из ldifs.

ldapadd -D "cn=Manager,dc=domain,dc=com" -W -f /tmp/base.ldif
ldapadd -D "cn=Manager,dc=domain,dc=com" -W -f /tmp/group.ldif
ldapadd -D "cn=Manager,dc=domain,dc=com" -W -f /tmp/passwd.ldif
ldapadd -D "cn=Manager,dc=domain,dc=com" -W -f /tmp/hosts.ldif

Вы можете попробовать найти некоторые данные:

ldapsearch uid=foouser

Конфигурация клиента

Под клиентом я имею в виду машину, которая подключается к LDAP-серверу для получения пользователей и авторизации.

Это может быть и машина, на которой работает LDAP-сервер.

В обоих случаях мы должны отредактировать три файла: /etc/ldap.conf, /etc/nsswitch.conf и /etc/pam.d/system-auth

Начнем с ldap.conf, клиента ldap:

BASE    dc=domain, dc=com
scope sub
suffix          "dc=domain,dc=com"

## when you want to change user's password by root 
rootbinddn cn=Manager,dc=domain,dc=com

## there are needed when your ldap dies
timelimit 5
bind_timelimit 5

uri ldap://ldap.domain.com/
pam_password exop

ldap_version 3
pam_filter objectclass=posixAccount
pam_login_attribute uid
pam_member_attribute memberuid

nss_base_passwd ou=Computers,dc=cognifide,dc=pl
nss_base_passwd ou=People,dc=cognifide,dc=pl
nss_base_shadow ou=People,dc=cognifide,dc=pl
nss_base_group  ou=Group,dc=cognifide,dc=pl
nss_base_hosts  ou=Hosts,dc=cognifide,dc=pl

Теперь пришло время для nsswitch.conf и pam

Добавьте в nsswitch.conf:

passwd: files ldap
shadow: files ldap
group:  files ldap

И измените system-auth (или все, что у вас есть, например login, sshd и т. д.):

auth       required     pam_env.so
auth       sufficient   pam_unix.so likeauth nullok
auth       sufficient   pam_ldap.so use_first_pass
auth       required     pam_deny.so

account    sufficient   pam_unix.so
account    sufficient   pam_ldap.so
account    required     pam_ldap.so

password   required     pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 retry=3
password   sufficient   pam_unix.so nullok md5 shadow use_authtok
password   sufficient   pam_ldap.so use_first_pass
password   required     pam_deny.so

session    required     pam_limits.so
session    required     pam_unix.so
session    optional     pam_ldap.so

Время проверить его. Лучший инструмент для этого – хороший старый getent.

Выберите пользователя из вашей системы и введите:

getent passwd | grep foouser

Вы должны получить результат дважды, если nss_ldap работает нормально.

По часть pam , работоспособность может быть протестирована путем удаления пользователя из /etc/passwd и попытки входа в систему через ssh.

Apache mod_auth_ldap

Чтобы получить авторизацию LDAP в apache, вам необходимо загрузить модуль mod_auth_ldap

LoadModule mm_auth_ldap_module modules/mod_auth_ldap.so

Теперь достаточно изменить .htaccess:

AuthName "Restricted"
AuthType Basic
AuthLDAPURL ldap://ldap.domain.com:389/ou=People,dc=domain,dc=com?uid
AuthLDAPBindDN "cn=Manager,dc=domain,dc=com"
AuthLDAPBindPassword "your_secret_secret_password_to_ldap_admin"
require valid-user

Обратите внимание, что этот метод можно также использовать для авторизации Subversion WebDAV

Средства администрирования LDAP

Есть несколько инструментов, которые я рекомендую использовать для администрирования сервера OpenLDAP

Другие приложения, поддерживающие ldap

  • Postfix
  • Courier IMAP
  • jabberd
  • eGroupware

 

Аутентификация по SSH через клиент LDAP

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

Предварительная подготовка

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

# ldapmodify -D "cn=admin,dc=mydomain,dc=com" -W
Enter LDAP Password: 

dn: uid=jsmith,dc=mydomain,dc=com
changetype: add
uid: jsmith
uidNumber: 20000
gidNumber: 20000
cn: John
sn: Smith
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
loginShell: /bin/bash
homeDirectory: /home/jsmith
userPassword: {SSHA}2xAywmFEnDX8lKjv7Kjlx/yFw6eO3sZB

Обратите внимание: нужно задать классы объекта posixAccount и shadowAccount, а также поля uidNumber, gidNumber, loginShell и homeDirectory. Если этих полей нет, то система не знает, как обслуживать такого пользователя, и по SSH с этой учетной записью вы войти не сможете.

После создания или изменения существующей учетной записи можно переходить уже непосредственно к настройке клиента.

Установка пакетов

Установить пакеты можно командой:

apt-get install libnss-ldap libpam-ldap nscd

По зависимостям установится еще несколько пакетов.

Конфигурация

После установки автоматически запустится конфигурация пакетов и будут запрошены настройки. Сначала будет сконфигурирован пакет libnss-ldap.

Вводим адрес сервера LDAP, нажимаем ОК.

Вводим базовое имя для поиска. В нашем случае «dc=mydomain,dc=com». Нажимаем ОК.

Выбираем 3 версию протокола LDAP, нажимаем ОК.

Выбираем учетную запись, которая будет использоваться для запросов с привелегиями root. В нашем случае это «cn=admin,dc=mydomain,dc=com». Нажимаем ОК.

Теперь задаем пароль для указанной ранее учетной записи и нажимаем ОК.

Видим сообщение о том, что необходимо будет изменить файл /etc/nsswitch.conf. Нажимаем ОК. После этого запускается настройка пакета libpan-ldap.

 

На вопрос о разрешении учетной записи вести себя как root отвечаем «Нет».

И на последний вопрос отвечаем «Нет».

Теперь нужно отредактировать файл /etc/nsswitch.conf. В нем нужно строки

passwd:     compat
group:      compat
shadow:     compat
...
netgroup:   nis

изменить следующим образом:

passwd:     compat ldap
group:      compat ldap
shadow:     compat ldap
...
netgroup:   ldap

После этого перезапустить сервис nscd

service nscd restart

Теперь нужно в конец файла /etc/pam.d/common-session в самый конец добавить строчку:

session	 required	        pam_mkhomedir.so

И всё!

Вход в систему через клиент LDAP

Теперь можно входить по SSH:

jsmith@smith-laptop:/home/jsmith$ ssh [email protected]
[email protected]'s password: 
Creating directory '/home/jsmith'.
Linux debian-ldapclient 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt4-3 (2015-02-03) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Apr 5 12:17:30 2015 from 192.168.0.6
jsmith@debian-ldapclient:~$

Вот так будет выглядеть успешный вход в систему. Как вы видите, при входе создается домашняя директория пользователя. И теперь можно работать с системой.

  • Нажмите здесь, чтобы поделиться контентом на Facebook. (Открывается в новом окне)
  • Нажмите, чтобы поделиться на LinkedIn (Открывается в новом окне)
  • Нажмите, чтобы поделиться на Reddit (Открывается в новом окне)
  • Нажмите, чтобы поделиться на Twitter (Открывается в новом окне)
  • Нажмите, чтобы поделиться записями на Tumblr (Открывается в новом окне)
  • Нажмите, чтобы поделиться записями на Pinterest (Открывается в новом окне)
  • Нажмите, чтобы поделиться записями на Pocket (Открывается в новом окне)
  • Нажмите, чтобы поделиться в Telegram (Открывается в новом окне)
  • Нажмите, чтобы поделиться в WhatsApp (Открывается в новом окне)
  • Нажмите, чтобы поделиться в Skype (Открывается в новом окне)

Использование LDAP в качестве технологии единого входа (Active Directory) | Integrations | Сообщество поддержки

В дополнение к стандартным методам аутентификации вы можете использовать метод аутентификации пользователей через LDAP сервер в UseResponse (Microsoft Active Directory Server, OpenLDAP и пр.).


LDAP доступен только в Enterprise пакете


Основные настройки LDAP

Перейдите в Администрирование » Приложения и активируйте Единый вход. Затем нажмите Настройки и выберите LDAP в списке.

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

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

Другие базовые настройки по подключению к вашему LDAP серверу:

  • LDAP (Хост, Порт, Версия протокола) — укажите имя хоста или IP вашего LDAP сервера. Настройки по умолчанию — localhost, порт 389, версия протокола 3. Когда сервер обеспечивает безопасное соединение, добавьте к имени хоста ldaps://;
  • BaseDN (Base Distinguished Name) — базовое отличительное имя для Active Directory со значением по умолчанию dc=localhost;
  • Администратор и пароль LDAP — если ваш LDAP сервер требует авторизации для получения данных, для соединения введите учетные данные администратора.

Вы всегда можете проверить соединение с вашим LDAP сервером с сохраненными настройками. Нажмите кнопку «Протестировать» и введите Имя пользователя и пароль любого пользователя на вашем LDAP сервере.

Скрипт php

Чтобы использовать метод авторизации LDAP, вам нужно установить на свой сервер PHP расширение — «php_ldap».

Расширенные настройки LDAP

Если у вас определенная конфигурация вашего LDAP сервера, перейдите к Расширенным настройкам, где вы можете управлять следующим:

  • Привязка имени пользователя — поле/контейнер (cn, uid), чтобы связать пользователей LDAP-Useresponse между собой. Если вы используете авторизацию по любому полю в структуре LDAP, тогда потребуется указать администратора и пароль LDAP.

Внимание: значение по умолчанию uid, но для старых версий Windows с active directory значение должно быть sAMAccountName


  • Имя пользователя в DN-нотации — некоторые конфигурации могут требовать имя пользователя в DN-нотации;
  • Соответствие имени пользователя — поле/контейнер (cn, displayname, givenname). По умолчанию используйте «auto»;
  • Соответствие email — поле/контейнер (mail, email, userprincipalname). По умолчанию используйте «auto»;
  • Доменная зона для email — если email не определен, то он будет сформирован по принципу username@domainzone;
  • Дополнительный фильтр поиска — вы можете указать конкретный фильтр, чтобы только определенные пользователи вашего LDAP сервера могли входить в систему UseResponse. Значение по умолчанию (objectClass=*).

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

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

Во время тестирования соединения или обработки пользовательских данных при входе в систему, вы можете столкнуться с ошибками соединения, привязки имени пользователя и пр.

Можете использовать любой инструмент для тестирования LDAP, прежде чем сохранить любые из настроек в UseResponse. По коду ошибки можно определить, где возникает проблема. Распространенные причины ошибок LDAP имеются в публичном доступе.

Настройка аутентификации через LDAP.

www.lissyara.su
—> статьи
—> FreeBSD
—> программы
—> LDAP auth

Настройка аутентификации через LDAP.

Автор: fr33man.

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

Установка необходимого софта.

Идем в порты, чтобы посмотреть нужные нам программы, конечно же предворительно обновив дерево портов.

/root/> cd /usr/ports/
/usr/ports/> make search name='nss_ldap'
Port:   nss_ldap-1.251
Path:   /usr/ports/net/nss_ldap
Info:   RFC 2307 NSS module
Maint:  [email protected]
B-deps: gettext-0.14.5_2 gmake-3.81_1 libiconv-1.9.2_2 openldap-client-2.3.27
R-deps: openldap-client-2.3.27
WWW:    http://www.padl.com/OSS/nss_ldap.html

/usr/ports/> make search name='pam_ldap'
Port:   pam_ldap-1.8.2
Path:   /usr/ports/security/pam_ldap
Info:   A pam module for authenticating with LDAP
Maint:  [email protected]
B-deps: gettext-0.14.5_2 gmake-3.81_1 libiconv-1.9.2_2 openldap-client-2.3.27
R-deps: openldap-client-2.3.27
WWW:    http://www.padl.com/OSS/pam_ldap.html

/usr/ports/>

nss_ldap нужен, для того, чтобы система видела пользователей, хранящихся в LDAP, а pam_ldap нужен
непосредственно для аутентификации пользователей.

Ставим…

/usr/ports/> cd /usr/ports/net/nss_ldap
/usr/ports/net/nss_ldap/> make install clean
...
...
/usr/ports/net/nss_ldap/> rehash
/usr/ports/net/nss_ldap/> cd /usr/ports/security/pam_ldap/
/usr/ports/security/pam_ldap/> make install clean
/usr/ports/security/pam_ldap/> rehash
/usr/ports/security/pam_ldap/>

Все, установилось.

Настройка.

Для начала давайте добавим следующие записи в LDAP:

users.ldif:


dn: ou=users,dc=l1523,dc=ru
objectClass: top
objectClass: organizationalUnit
ou: users

fr33man.ldif


dn: cn=fr33man,ou=users,dc=l1523,dc=ru
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
cn: fr33man
sn: Vasiliy Ozerov
uid: fr33man
userPassword: {SSHA}WBsUosYPMQ1PPaJNp2728NL7P0/EXx5n
uidNumber: 5001
gidNumber: 0
gecos: Vasiliy Ozerov
homeDirectory: /home/fr33man
loginShell: /usr/local/bin/bash

Добавляем:

/root/> ldapadd -x -D "cn=root,dc=unix" -W \
? -H ldap://192.168.1.250 -f users.ldif
Enter LDAP Password:
adding new entry "ou=users,dc=l1523,dc=ru"

/root/> ldapadd -x -D "cn=root,dc=unix" -W \
? -H ldap://192.168.1.250 -f fr33man.ldif
Enter LDAP Password:
adding new entry "cn=fr33man,ou=users,dc=l1523,dc=ru"

/root/> 

Рихтуем /usr/local/etc/nss_ldap.conf:


# Корневой каталог LDAP сервера
base dc=l1523,dc=ru

# Если не удалось подключиться к LDAP,
# То не пытаться переподключиться
bind_policy soft

# Timeout подключения к LDAP серверу
bind_timelimit 10

# ip-адрес или hostname LDAP сервера
host 192.168.1.250

# nss_ldap закроет подключение, если сервер
# не ответит в указонное в idle_timelimit время
idle_timelimit 3600

# Версия протокола
ldap_version 3

# Описание каталогов, где хранятся группы, пользователи, пароли соответственно
nss_base_group  ou=groups,dc=l1523,dc=ru?one
nss_base_passwd ou=users,dc=l1523,dc=ru?one
nss_base_shadow ou=users,dc=l1523,dc=ru?one

# persist -- не отключаться от LDAP сервера
# oneshot -- отключаться после каждого запроса
nss_connect_policy persist

# Использовать страничный вывод
nss_paged_results yes


# Размер страницы
pagesize 1000

# Порт, на котором работает LDAP
port 389

# Область поиска
scope one

# Время ожидпния при поиске
timelimit 30

Теперь /etc/nsswitch.conf:


# Сначала ищем в файлах, потом в LDAP
group: files ldap

hosts: files dns
networks: files

# Сначала ищем в файлах, потом в LDAP
passwd: files ldap

# Сначала ищем в файлах, потом в LDAP
shadow: files ldap
shells: files

Проверяем, как все работает:

/usr/local/etc/> id fr33man
uid=5001(fr33man) gid=0(wheel) groups=0(wheel), 5001(People)
/usr/local/etc/> grep fr33man /etc/passwd
/usr/local/etc/>

Пользователь fr33man есть, но его нет в локальных базах.

Теперь переходим к настройке pam_ldap. Для этого редактируем /usr/local/etc/ldap.conf до такого состояния:


# host, где находится LDAP сервер
host 192.168.1.250

# URL LDAP сервера
uri ldap://192.168.1.250/

# Версия протокола
ldap_version 3

# Порт LDAP сервера
port 389

bind_timelimit 30
bind_policy soft
idle_timelimit 3600

# Фильтр поиска
pam_filter objectclass=posixAccount

# UID пользователя соответствует аттрибуту uid
pam_login_attribute uid

# Минимальный uid
pam_min_uid 1000

# Максимальный uid
pam_max_uid 65530

# Алгоритм хэша паролей
pam_password SSHA

nss_base_passwd ou=users,dc=l1523,dc=ru?one
nss_base_shadow ou=users,dc=l1523,dc=ru?one
nss_base_group          ou=groups,dc=l1523,dc=ru?one

Осталось указать сервисам login, sshd и тд. использовать модуль pam_ldap для аутентификации, для этого редактируем
/etc/pam.d/sshd и /etc/pam.d/ до такого состояния:

/etc/pam.d/sshd:


auth            required        pam_nologin.so          no_warn
auth            sufficient      pam_opie.so             no_warn no_fake_prompts
auth            requisite       pam_opieaccess.so       no_warn allow_local

auth            sufficient        /usr/local/lib/pam_ldap.so    no_warn
auth            required        pam_unix.so             no_warn try_first_pass

account         required        pam_login_access.so
account         sufficient        /usr/local/lib/pam_ldap.so
account         required        pam_unix.so

session         required        pam_permit.so

password        sufficient        /usr/local/lib/pam_ldap.so              no_warn
password        required        pam_unix.so             no_warn try_first_pass

/etc/pam.d/system:


auth            sufficient      pam_opie.so             no_warn no_fake_prompts
auth            requisite       pam_opieaccess.so       no_warn allow_local
auth            sufficient      /usr/local/lib/pam_ldap.so
auth            required        pam_unix.so             no_warn try_first_pass nullok

account         required        pam_login_access.so
account         sufficient      /usr/local/lib/pam_ldap.so
account         required        pam_unix.so

session         required        pam_lastlog.so          no_fail

password        sufficient      /usr/local/lib/pam_ldap.so
password        required        pam_unix.so             no_warn try_first_pass

Теперь можно проверять, как это все работает. Попробуем зайти по ssh:


//> ssh localhost -l fr33man
Password:
Last login: Fri Sep 29 06:08:09 2006 from 127.0.0.1
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
        The Regents of the University of California.  All rights reserved.

[fr33man@backup ~]$ exit
logout
Connection to localhost closed.
//>

Пользователя fr33man мы не создавали локально, следовательно домашней директории для него нет. Поэтому можете содать домашнюю директорию, а
можете воспользоваться демоном amd(8).

размещено: 2006-11-08,
последнее обновление: 2006-11-08,
автор: fr33man

2014-07-27, lissyara
gmirror

Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.


2013-08-20, zentarim
Scan+Print server FreeBSD 9

Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540


2011-11-20, BlackCat
Разъём на WiFi-карту

Делаем съёмной несъёмную антену на WiFi-карте путём установки ВЧ-разъёма


2011-09-14, manefesto
Настройка git+gitosis

Настройка системы контроля версия исходного кода в связке git+gitosis+ssh


Статистика сайта
Сейчас на сайте находится: 23 чел.
За последние 30 мин было: 62 человек
За сегодня было
340 показов,
58 уникальных IP
 

  Этот информационный блок появился по той простой причине,
что многие считают нормальным, брать чужую информацию не уведомляя автора
(что не так страшно), и не оставляя линк на оригинал и автора — что более существенно.
Я не против распространения информации — только за. Только условие простое — извольте
подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой,
незакрытой от индексирования, и не запрещенной для следования роботов ссылки.

  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

LDAP аутентификация, авторизация и синхронизация (FreeIPA, AD) / Хабр

OTRS — система обработки заявок с открытым кодом (Open-source Ticket Request System), написанная на Perl.

Существует в двух вариантах:

Перечислю немного из того фукционала, который поддерживает эту систему:

  • модуль ITSM (Управление уровнем обслуживания, Управление изменениями, Управление конфигурацией, CMDB)
  • адаптивный веб-интерфейс
  • API
  • SLA и сервисы
  • мультитенантность
  • эскалации
  • аутентификация: DB, LDAP, HTTPBasicAuth, Radius
  • поддержка MySQL, MariaDB, PostgreSQL, Oracle

И если искать в ней недостатки — так это непривычность интерфейса и сложность в настройке.Под катом — об основах авторизации (группы, RBAC, поддержка нескольких компаний-клиентов), аутентификации и синхронизации метаданных (ФИО, телефона и прочего), используя различные каталоги LDAP

Клиенты, очереди, агенты и группы

После установки OTRS у вас сразу будут доступны:

  • клиенты — создавать заявки, отправив письмо или используя веб-доступ
  • очереди — каждая заявка попадает в одну из очередей заявок
  • агенты — ИТ-специалисты, работающие над выполнением заявок из доступных им очередей
  • группы — сущность, связывающая между собой очереди, клиентов и агентов, а также задающая права агентов — например, только чтение, изменение приоритета заявки и т.п.

Стандартные группы

После установки системы вы три созданных группы:

  • admin — члены группы могут администрировать (настраивать) OTRS
  • stats — возможность настраивать и запускать отчеты
  • пользователя — стандартная группа для клиентов, очередей и агентов

Права, связанные с группой

Основные права

Основные права, которые можно настроить в группе, ограничивающие действия агентов:

  • только чтение — права только на чтение в данной группе / очереди
  • переместить — права на перемещение заявок в эту группу / очередь
  • создание — права на создание заявок в этой группе / очереди
  • заметка — права на добавление заметок в заявки в этой группе / очереди
  • владелец — права на смену владельца заявок в этой группе / очереди
  • приоритет — права на смену приоритета заявок в этой группе / очереди
  • чтение / запись — полные права на чтение и запись для заявок в данной группе / очереди

Дополнительные права

Также доступны и дополнительные права, которые можно включить в настройках (Система :: Разрешение):

  • отчеты — доступ к отчетам
  • перенаправить — право перенаправить / отклонить почтовое сообщение (ссылка перенаправить / отклонить в ticketZoom)
  • создать — право составления ответа на заявку
  • клиент — право изменить клиента для этой заявки
  • переслать — право пересылать сообщения (с помощью кнопки Переслать)
  • в ожидании — перевести заявку в ожидание
  • телефон — добавить содержание звонка клиента к заявке в виде сообщения / заметки
  • ответственный — Право изменить ответственного за заявку

Рассмотрим это более подробно:

  • каждый клиент может быть включен в одну или несколько групп, изначально все клиенты входят в группу users
  • каждая очередь заказов связывается с какой-либо одной из групп
  • через веб-интерфейс клиент может делать заявки в тех очередях, к которым имеют доступ группы, в которых он включен
  • при отправке клиентом приложения по электронной почте существует возможность на основании этого атрибута сообщения (например, адрес отправителя или заголовка письма) тесты характеристики заявки, в том числе и очередь, попадет заявка
  • если клиент позвонил по телефону, агент может завести заявку вручную, выбрав любую из доступных агенту очередей
  • желательно, чтобы заявка клиента всегда была в очередях, доступных клиенту, иначе он не сможет получить доступ к ней через веб-интерфейс
  • агенты могут действовать в соответствии с правами на очередь, в которой находится заявка

Аутентификация с использованием базы данных

Стандартный способ аутентификации и авторизации агентов и клиентов — это база данных.

Например, настройка аутентификации агентов, используя данные, выглядит так:

  $ Self -> {'AuthModule'} = 'Kernel :: System :: Auth :: DB';  

Клиентов:

  $ Self -> {'Customer :: AuthModule'} = 'Kernel :: System :: CustomerAuth :: DB';
$ Self -> {'Клиент :: AuthModule :: DB :: Table'} = 'customer_user';
$ Self -> {'Customer :: AuthModule :: DB :: CustomerKey'} = 'логин';
$ Self -> {'Клиент :: AuthModule :: DB :: CustomerPassword'} = 'pw';  

Мы оставим этот способ аутентификации и добавим в дополнение к нему аутентификацию через LDAP.

Роли и компании

Так же мы расширим возможности авторизации, добавив роли и компании:

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

Постановка задачи

Вы — администратор системы OTRS в компании my-it-company.com, предоставляющий сервисные услуги другим компаниям.

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

И ваша компания также получит очевидные плюсы — единый пароль сотрудника во все системы, блокировка учетных записей в LDAP заблокирует доступ и во все остальные сервисы.

my-it-company.com использует работает на Linux и в качестве сервера каталогов Red Hat FreeIPA, обслуживаемые вами подразделения — различные леса Microsoft Active Directory, с которыми у вас нет федерации, но есть возможность подключения к контроллеру домена.

Вам нужно разделить потоки заявок от различных клиентов, а также реализовать различные уровни доступа агентов к очередям — менеджеры должны иметь возможность менять приоритет задач в системе.

Сотрудники вашей компании так же могут ставить задачи в системе для внутренних нужд my-it-company.com , иногда являясь и агентами, и клиентами одновременно (а иногда и нет).

Подготовка

Учетные записи для просмотра LDAP

Если запрещен анонимный просмотр дерева каталогов, то создадим в доменах my-it-company.com , pear.com и macrohard.com учетные записи, прав которых нам хватит, чтобы делать запросы к LDAP (назовем их, например, ldap-bot)

Группы FreeIPA для связи с ролями OTRS

Заведем на FreeIPA три группы пользователей, которые будут синхронизироваться с нашими ролями OTRS, например:

  • otrs-sa — члены группы получат доступ к администрированию OTRS, но доступ к очередям давать не будем, чтобы не было желания всегда работать под администратором ),
  • otrs-admins — наши менеджеры, имеющие право изменения приоритета заявок) и
  • otrs-helpdesk — учетные записи наших специалистов

Атрибут, определяющий принадлежность к компании

Выберем атрибут, по которому будем определять принадлежность к компании.Пусть это будет атрибут «Организация». Например, у вас все получилось организационно и технически, и все пользователи во всех доменах всегда имеют значение в поле «Организация»:

  • my-it-company — для сотрудников my-it-company.com
  • pear-company — для сотрудников pear.com
  • macrohard-company — для сотрудников macrohard.com

Определим атрибуты пользователя, используемый БесплатноIPA

Изучим схему FreeIPA, новые названия атрибутов, которые нам понадобятся для синхронизации (ФИО, логин, телефон и т.п.).

  кинит лаптев
ipa user-show --all --raw laptevs  

Получим подобный вывод:

dn: uid = laptevs, cn = users, cn = accounts, dc = my-it-company, dc = com
uid: лаптевс
имя: Станислав
сн: Лаптев
сп: Лаптев Станислав
инициалы: SL
домашний каталог: / home / Laptevs
gecos: Лаптев Станислав
логиншелл: / bin / sh
krbcanonicalname: laptevs @ МОЯ-IT-КОМПАНИЯ.COM
krbпринципальное имя: [email protected]
почта: [email protected]
uidnumber: 1344600003
номер: 1344600003
л: Москва
телефон: +7 (863) 999-99-99
мобильный: +7 (999) 999-99-99
ou: My-it-company
название: SysAdm
sshpubkeyfp: SHA256: Yi8mKF + j28 / r2cpxLgIbvZ / Oymt57rhliHKhqBuJxqE laptevs-putty (ssh-rsa)
nsaccountlock: ЛОЖЬ
has_password: ИСТИНА
has_keytab: ИСТИНА
displayName: Лаптев Станислав
ipaSshPubKey: c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBQkpRQUFBZ0VBNjQ1RTJjSjIvWXVVYm9GNzdZY3hLNzBndm1jWlgrZjBZTVpsaXRQVXNCWFZ0cENtTEtwcjRwK2JEeUdhRzNLTWx1T08ydW9wS0pXRk9mWE83Zzl3OTYzdklQblN3MzVHSmI3VGhhbk1pTXpNUE82T1lQZEY0em14b2k4N 0RGYkdXV2V6aGwzcitsbmFGYTB0dEQ5TkFWRU1Fb3BMdmkzcHZ1UXpyVmNjVlMxamFxY1dNT2ZGUC9TRlVoY1dGeVpZd3Z6eW0wWnZObUZtdjVjVHJGNzJMSXZOdHlsNkZGK2ZaU3ZpS01mcXZ6NStkT2xZZGd5bVVSOG5iaVpkTXZKaTIvbzhjTy84ekpoMFhtSnVRSjJXNEVvYVEvajVTTm8ySjZ6NklXNk I3cFB4Y002a0tJcUp5N08zTkNOcGRrVmVQbEFHbThsOFZDREpVa1RLSjRGOS9mSTZFUkhxVUZwK3p1VENTR1R3ZWlKdXppenFSZWJTTkNiMXh4RldmUitvYzFLdWNZSU5QbTYxRi93YXhOcC9aSG9OK2w1dCtkYWI4cElZSGZzTnNUNWx2RWt4Ukh0bnNyeUxsbWk1ZVdzd3RBbDB3TUpWd1cvUWNJcjhOaVN Ybm96Q3dHWTZCaTQ2L0FGTGVidmFLV0tKRmpKZFgxOFlRVDRpVzZGaE83aW40TGlUamlNaENXbStvbjNQbERYeXZpdkJ1WkFXUldXNEdjbXREVW8rSVhZT2t3MWh4UldqdkJtcExHMVZpMFhPckltbmQybTVZdWk1bHo0b1ZlekFRN1NjYVlrdDBoVEdQU1Z2UHpmVlowYWJCQlpiRmViK1hUV2tpSnBPMHBO T3dodGNadHYrN3RMMnc1OFN3QnhVTUk4NzUzdG5Sc1h2blBXZERqcUsxSDA9IGxhcHRldnMtcHV0dHk = 9 0006
ipaUniqueID: 68d46dac-1d3c-11e9-82fd-0242ac110002
krbExtraData: AAL4VkVcbGFwdGV2c0BPTUlLUk9OLlBSTwA =
krbLastFailedAuth: 201084142Z
krbLastPwdChange: 201

  • 052200Z
    krbLoginFailedCount: 0
    krbPassword Срок действия: 201

  • 052200Z
    memberof: cn = otrs-admins, cn = groups, cn = accounts, dc = my-it-company, dc = com
    memberof: cn = ipausers, cn = groups, cn = accounts, dc = my-it-company, dc = com
    mepManagedEntry: cn = laptevs, cn = groups, cn = accounts, dc = my-it-company, dc = com
    objectClass: верхний
    objectClass: человек
    objectClass: организационное лицо
    objectClass: inetorgperson
    objectClass: inetuser
    objectClass: posixaccount
    objectClass: krbprincipalaux
    objectClass: krbticketpolicyaux
    objectClass: ipaobject
    objectClass: ipasshuser
    objectClass: ipaSshGroupOfPubKeys
    objectClass: mepOriginEntry

    dn : uid = laptevs, cn = users, cn = accounts, dc = my-it-company, dc = com
    uid : laptevs
    givenname : Stanislav
    sn : Laptev
    сп : Лаптев Станислав
    mail : Laptevs @ MY-IT-COMPANY.COM
    l : Москва
    телефонный номер : +7 (863) 999-99-99
    мобильный : +7 (999) 999-99-99
    ou : My-it-company
    title : SysAdm

    Настройка конфигурации OTRS

    Файлы конфигурации

    • / opt / otrs / — как правило, здесь располагаются файлы системы OTRS
    • Kernel / Config.pm — файл конфигурации, который вы редактируете
    • Ядро / Конфигурация / По умолчанию.pm — файл со стандартными настройками, его не редактируете, но в нем можно посмотреть все необходимые параметры и комментарии к ним

    Настройка агентов

    Аутентификация агентов
      # ------------------------------------ --------------- #
        # Аутентификация агентов #
        # ------------------------------------------------- - #
        # my-it-company.com Серверная часть LDAP
        $ Self -> {AuthModule} = 'Ядро :: System :: Auth :: LDAP';
        # Адрес LDAP-сервера
        $ Self -> {'AuthModule :: LDAP :: Host'} = 'моя-это-компания.com ';
        $ Self -> {'AuthModule :: LDAP :: BaseDN'} = 'dc = my-it-company, dc = com';
        $ Self -> {'AuthModule :: LDAP :: UID'} = 'uid';
    
        # Блок нужен, только если запрещен анонимный просмотр структуры каталогов
        $ Self -> {'AuthModule :: LDAP :: SearchUserDN'} = 'uid = ldap-bot, cn = users, cn = accounts, dc = my-it-company, dc = com';
        $ Self -> {'AuthModule :: LDAP :: SearchUserPw'} = 'пароль-бот!';
    
        # Фильтр запроса к LDAP. Пусть у нас будут только пользователи, имеющие заполненный атрибут "электронная почта"
        $ Self -> {'AuthModule :: LDAP :: AlwaysFilter'} = '(mail = *)';
    
        # Добавляем при проблемах с кодировкой
        $ Self -> {'AuthModule :: LDAP :: Charset'} = 'utf-8';
    
        $ Self -> {'AuthModule :: UseSyncBackend'} = 'AuthSyncBackend';
    
    
        # моя-это-компания.com Бэкэнд БД
        $ Self -> {AuthModule2} = 'Ядро :: System :: Auth :: DB';
        $ Self -> {'AuthModule :: DB :: CryptType2'} = 'sha2';
        # ------------------------------------------------- - #
        # Аутентификация конечных агентов #
        # ------------------------------------------------- - #  

    Синхронизация агентов (групп LDAP с ролями OTRS)
      # ------------------------------ --------------------- #
        # Синхронизация аутентификации агента #
        # (включить синхронизацию данных агента.после успешного #
        # аутентификация)                                     #
        # ------------------------------------------------- - #
        
        # my-it-company.com Синхронизация аутентификации LDAP. бэкэнд.
        $ Self -> {AuthSyncModule} = 'Ядро :: System :: Auth :: Sync :: LDAP';
        $ Self -> {'AuthSyncModule :: LDAP :: Host'} = 'my-it-company.com';
        $ Self -> {'AuthSyncModule :: LDAP :: BaseDN'} = 'dc = my-it-company, dc = com';
        $ Self -> {'AuthSyncModule :: LDAP :: UID'} = 'uid';
    
        $ Self -> {'AuthSyncModule :: LDAP :: SearchUserDN'} = 'uid = ldap-bot, cn = users, cn = accounts, dc = my-it-company, dc = com';
        $ Self -> {'AuthSyncModule :: LDAP :: SearchUserPw'} = 'пароль-бот!';
    
        $ Self -> {'AuthSyncModule :: LDAP :: AlwaysFilter'} = '(mail = *)';
    
        $ Self -> {'AuthSyncModule :: LDAP :: UserSyncMap'} = {
            # БД -> LDAP
            UserFirstname => 'givenName',
            UserLastname => 'sn',
            UserEmail => 'почта',
        };
    
        $ Self -> {'AuthSyncModule :: LDAP :: AccessAttr'} = 'член';
        $ Self -> {'AuthSyncModule :: LDAP :: UserAttr'} = 'DN';
    
        $ Self -> {'AuthSyncModule :: LDAP :: UserSyncRolesDefinition'} = {
            # ldap группа
            'cn = otrs-sa, cn = groups, cn = accounts, dc = my-it-company, dc = com' => {
                # otrs роль
                'otrs-sa' => 1,
            },
            'cn = otrs-admins, cn = groups, cn = accounts, dc = my-it-company, dc = com' => {
                'otrs-admins' => 1,
            },
            'cn = otrs-helpdesk, cn = groups, cn = accounts, dc = my-it-company, dc = com' => {
                'helpdesk' => 1,
            }
        };
     
        $ Self -> {DatabaseUserTable} = 'пользователи';
        $ Self -> {DatabaseUserTableUserID} = 'идентификатор';
        $ Self -> {DatabaseUserTableUserPW} = 'pw';
        $ Self -> {DatabaseUserTableUser} = 'войти';
    
        # ------------------------------------------------- - #
        # Синхронизация аутентификации конечных агентов #
        # ------------------------------------------------- - #
      

    Если вы решили, какие роли вам не подходят, приведите два примера синхронизации групп LDAP с группой OTRS — упрощенный и с настройкой прав по каждой группе. Альтернативная синхронизация агентов (групп LDAP с указанием OTRS, с помощью прав)

      # ------------------------------- -------------------- #
        # Синхронизация аутентификации агента #
        # (включить синхронизацию данных агента после успешного #
        # аутентификация)                                     #
        # ------------------------------------------------- - #
        
        # my-it-company.com Синхронизация аутентификации LDAP. бэкэнд.
        $ Self -> {AuthSyncModule} = 'Ядро :: System :: Auth :: Sync :: LDAP';
        $ Self -> {'AuthSyncModule :: LDAP :: Host'} = 'моя-это-компания.com ';
        $ Self -> {'AuthSyncModule :: LDAP :: BaseDN'} = 'dc = my-it-company, dc = com';
        $ Self -> {'AuthSyncModule :: LDAP :: UID'} = 'uid';
    
        $ Self -> {'AuthSyncModule :: LDAP :: SearchUserDN'} = 'uid = ldap-bot, cn = users, cn = accounts, dc = my-it-company, dc = com';
        $ Self -> {'AuthSyncModule :: LDAP :: SearchUserPw'} = 'пароль-бот!';
    
        $ Self -> {'AuthSyncModule :: LDAP :: AlwaysFilter'} = '(mail = *)';
    
        $ Self -> {'AuthSyncModule :: LDAP :: UserSyncMap'} = {
            # БД -> LDAP
            UserFirstname => 'givenName',
            UserLastname => 'sn',
            UserEmail => 'почта',
        };
    
        $ Self -> {'AuthSyncModule :: LDAP :: AccessAttr'} = 'член';
        $ Self -> {'AuthSyncModule :: LDAP :: UserAttr'} = 'DN';
    
        # AuthSyncModule :: LDAP :: UserSyncGroupsDefinition
        # (Если для AuthModule выбран "LDAP" и вы хотите синхронизировать LDAP
        # групп в другие группы определите следующее.)
        $ Self -> {'AuthSyncModule :: LDAP :: UserSyncGroupsDefinition'} = {
            # ldap группа
            'cn = otrs-admins, cn = groups, cn = accounts, dc = my-it-company, dc = com' => {
                # ОТРС группа
                'admin' => {
                    # разрешение
                    rw => 1,
                    move_into => 1,
                    создать => 1,
                    примечание => 1,
                    owner => 1,
                    Prioriry => 1,
                    ro => 1,
                },
                'stats' => {
                    rw => 1,
                    move_into => 1,
                    создать => 1,
                    примечание => 1,
                    owner => 1,
                    Prioriry => 1,
                    ro => 1,
                },
                'users' => {
                    rw => 1,
                    move_into => 1,
                    создать => 1,
                    примечание => 1,
                    owner => 1,
                    Prioriry => 1,
                    ro => 1,
                },
                'pear-group' => {
                    rw => 1,
                    move_into => 1,
                    создать => 1,
                    примечание => 1,
                    owner => 1,
                    Prioriry => 1,
                    ro => 1,
                },
                'macrohard-group' => {
                    rw => 1,
                    move_into => 1,
                    создать => 1,
                    примечание => 1,
                    owner => 1,
                    Prioriry => 1,
                    ro => 1,
                },
            },
            'cn = otrs-helpdesk, cn = groups, cn = accounts, dc = my-it-company, dc = com' => {
                'stats' => {
                    rw => 1,
                    move_into => 1,
                    создать => 1,
                    примечание => 1,
                    owner => 1,
                    Prioriry => 1,
                    ro => 1,
                },
                'users' => {
                    rw => 1,
                    move_into => 1,
                    создать => 1,
                    примечание => 1,
                    owner => 1,
                    Prioriry => 1,
                    ro => 1,
                },
            }
        };
    
    
        $ Self -> {DatabaseUserTable} = 'пользователи';
        $ Self -> {DatabaseUserTableUserID} = 'идентификатор';
        $ Self -> {DatabaseUserTableUserPW} = 'pw';
        $ Self -> {DatabaseUserTableUser} = 'войти';
    
        # ------------------------------------------------- - #
        # Синхронизация аутентификации конечных агентов #
        # ------------------------------------------------- - #  

    Альтернативная упрощенная синхронизация агентов (групповая упрощенная синхронизация агентов (LDAP с ролями OTRS с правами rw)

      # ------------------------- -------------------------- #
        # Синхронизация аутентификации агента #
        # (включить синхронизацию данных агента.после успешного #
        # аутентификация)                                     #
        # ------------------------------------------------- - #
        
        # my-it-company.com Синхронизация аутентификации LDAP. бэкэнд.
        $ Self -> {AuthSyncModule} = 'Ядро :: System :: Auth :: Sync :: LDAP';
        $ Self -> {'AuthSyncModule :: LDAP :: Host'} = 'my-it-company.com';
        $ Self -> {'AuthSyncModule :: LDAP :: BaseDN'} = 'dc = my-it-company, dc = com';
        $ Self -> {'AuthSyncModule :: LDAP :: UID'} = 'uid';
    
        $ Self -> {'AuthSyncModule :: LDAP :: SearchUserDN'} = 'uid = ldap-bot, cn = users, cn = accounts, dc = my-it-company, dc = com';
        $ Self -> {'AuthSyncModule :: LDAP :: SearchUserPw'} = 'пароль-бот!';
    
        $ Self -> {'AuthSyncModule :: LDAP :: AlwaysFilter'} = '(mail = *)';
    
        $ Self -> {'AuthSyncModule :: LDAP :: UserSyncMap'} = {
            # БД -> LDAP
            UserFirstname => 'givenName',
            UserLastname => 'sn',
            UserEmail => 'почта',
        };
    
        $ Self -> {'AuthSyncModule :: LDAP :: AccessAttr'} = 'член';
        $ Self -> {'AuthSyncModule :: LDAP :: UserAttr'} = 'DN';
    
        # Включать агента в какие-либо группы с доступом на чтение / запись
        # AuthSyncModule :: LDAP :: UserSyncInitialGroups
        # (синхронизировать следующую группу с разрешением rw после первоначального создания первого агента
        # авторизоваться)
        $ Self -> {'AuthSyncModule :: LDAP :: UserSyncInitialGroups'} = [
            "пользователи",
        ];
    
        $ Self -> {DatabaseUserTable} = 'пользователи';
        $ Self -> {DatabaseUserTableUserID} = 'идентификатор';
        $ Self -> {DatabaseUserTableUserPW} = 'pw';
        $ Self -> {DatabaseUserTableUser} = 'войти';
    
        # ------------------------------------------------- - #
        # Синхронизация аутентификации конечных агентов #
        # ------------------------------------------------- - #  

    Настройка клиентов

    Аутентификация клиентов
      # -------------------------------- ------------------- #
        # Аутентификация клиента #
        # ------------------------------------------------- - #
    
        # Клиентская БД auth.бэкэнд
        $ Self -> {'Customer :: AuthModule'} = 'Ядро :: System :: CustomerAuth :: DB';
        $ Self -> {'Клиент :: AuthModule :: DB :: Table'} = 'customer_user';
        $ Self -> {'Customer :: AuthModule :: DB :: CustomerKey'} = 'логин';
        $ Self -> {'Клиент :: AuthModule :: DB :: CustomerPassword'} = 'pw';
    
    
        # my-it-company.com (Заказчик) LDAP auth. бэкэнд
        $ Self -> {'Customer :: AuthModule2'} = 'Ядро :: System :: CustomerAuth :: LDAP';
        $ Self -> {'Customer :: AuthModule :: LDAP :: Host2'} = 'моя-это-компания.com ';
        $ Self -> {'Клиент :: AuthModule :: LDAP :: BaseDN2'} = 'dc = my-it-company, dc = com';
        $ Self -> {'Клиент :: AuthModule :: LDAP :: UID2'} = 'uid';
    
        $ Self -> {'Customer :: AuthModule :: LDAP :: SearchUserDN2'} = 'uid = ldap-bot, cn = users, cn = accounts, dc = my-it-company, dc = com';
        $ Self -> {'Customer :: AuthModule :: LDAP :: SearchUserPw2'} = 'пароль-бот!';
    
        $ Self -> {'Клиент :: AuthModule :: LDAP :: AlwaysFilter2'} = '(mail = *)';
    
        
        # груша LDAP auth. бэкэнд.
        $ Self -> {'Customer :: AuthModule3'} = 'Ядро :: System :: CustomerAuth :: LDAP';
        $ Self -> {'Customer :: AuthModule :: LDAP :: Host3'} = 'груша.com ';
        $ Self -> {'Customer :: AuthModule :: LDAP :: BaseDN3'} = 'DC = груша, DC = com';
        $ Self -> {'Клиент :: AuthModule :: LDAP :: UID3'} = 'sAMAccountName';
    
    
        $ Self -> {'Клиент :: AuthModule :: LDAP :: SearchUserDN3'} = '[email protected]';
        $ Self -> {'Customer :: AuthModule :: LDAP :: SearchUserPw3'} = 'пароль-бот?';
    
        # Отфильтруем: (mail = *) - у кого есть почта и (samAccountType = 805306368) - учетная запись пользователя и (! (UserAccountControl: 1.2.840.113556.1.4.803: = 2)) - не отключена
        $ Self -> {'Customer :: AuthModule :: LDAP :: AlwaysFilter3'} = '(& (mail = *) (samAccountType = 805306368) (! (UserAccountControl: 1.2.840.113556.1.4.803: = 2))) ';
    
        
        # macrohard аутентификация LDAP. бэкэнд.
        $ Self -> {'Customer :: AuthModule4'} = 'Ядро :: System :: CustomerAuth :: LDAP';
        $ Self -> {'Клиент :: AuthModule :: LDAP :: Host4'} = 'macrohard.com';
        $ Self -> {'Клиент :: AuthModule :: LDAP :: BaseDN4'} = 'dc = macrohard, dc = com';
        $ Self -> {'Клиент :: AuthModule :: LDAP :: UID4'} = 'sAMAccountName';
    
        $ Self -> {'Клиент :: AuthModule :: LDAP :: SearchUserDN4'} = '[email protected]';
        $ Self -> {'Customer :: AuthModule :: LDAP :: SearchUserPw4'} = 'бот-пароль !?';
    
        $ Self -> {'Customer :: AuthModule :: LDAP :: AlwaysFilter4'} = '(& (mail = *) (samAccountType = 805306368) (! (UserAccountControl: 1.2.840.113556.1.4.803: = 2))) ';
        # ------------------------------------------------- - #
        # Настройки аутентификации конечного клиента #
        # ------------------------------------------------- - #  

    Синхронизация клиентов (получение атрибутов клиента из LDAP, связь с компанией OTRS)
      # ------------------------- -------------------------- #
        # Синхронизация аутентификации клиента #
        # ------------------------------------------------- - #
    
        # Клиентская база данных и настройки БД
        $ Self -> {CustomerUser} = {
            Name => Translatable ('База данных Backend'),
            Модуль => 'Ядро :: System :: CustomerUser :: DB',
            Params => {
                Таблица => 'customer_user',
                SearchCaseSensitive => 0,
            },
    
            # уникальный идентификатор клиента
            CustomerKey => 'логин',
    
            # клиент #
            CustomerID => 'customer_id',
            CustomerValid => 'valid_id',
    
            CustomerUserListFields => ['first_name', 'last_name', 'email'],
    
            CustomerUserSearchFields => ['логин', 'first_name', 'last_name', 'customer_id'],
            CustomerUserSearchPrefix => '*',
            CustomerUserSearchSuffix => '*',
            CustomerUserSearchListLimit => 250,
            CustomerUserPostMasterSearchFields => ['электронная почта'],
            CustomerUserNameFields => ['title', 'first_name', 'last_name'],
            CustomerUserEmailUniqCheck => 1,
    
            CustomerCompanySupport => 1,
            CacheTTL => 60 * 60 * 24,
            Карта => [
                ['UserTitle', Translatable ('Заголовок или приветствие'), 'title', 1, 0, 'var', '', 0, undef, undef],
                ['UserFirstname', Translatable ('Firstname'), 'first_name', 1, 1, 'var', '', 0, undef, undef],
                ['UserLastname', Translatable ('Lastname'), 'last_name', 1, 1, 'var', '', 0, undef, undef],
                ['UserLogin', Translatable ('Username'), 'login', 1, 1, 'var', '', 0, undef, undef],
                ['UserPassword', Translatable ('Пароль'), 'pw', 0, 0, 'var', '', 0, undef, undef],
                ['UserEmail', Translatable ('Электронная почта'), 'электронная почта', 1, 1, 'var', '', 0, undef, undef],
                ['UserCustomerID', Translatable ('CustomerID'), 'customer_id', 0, 1, 'var', '', 0, undef, undef],
                ['UserPhone', Translatable ('Phone'), 'phone', 1, 0, 'var', '', 0, undef, undef],
                ['UserFax', Translatable ('Fax'), 'fax', 1, 0, 'var', '', 0, undef, undef],
                ['UserMobile', Translatable ('Mobile'), 'mobile', 1, 0, 'var', '', 0, undef, undef],
                ['UserStreet', Translatable ('Street'), 'street', 1, 0, 'var', '', 0, undef, undef],
                ['UserZip', Translatable ('Zip'), 'zip', 1, 0, 'var', '', 0, undef, undef],
                ['UserCity', Translatable ('City'), 'city', 1, 0, 'var', '', 0, undef, undef],
                ['UserCountry', Translatable ('Country'), 'country', 1, 0, 'var', '', 0, undef, undef],
                ['UserComment', Translatable ('Комментарий'), 'comments', 1, 0, 'var', '', 0, undef, undef],
                ['ValidID', Translatable ('Valid'), 'valid_id', 0, 1, 'int', '', 0, undef, undef],
            ],
    
            # выбор по умолчанию
            Выбор => {
    # UserTitle => {
    #                'Г-н.'=> Переводимый (' Мистер '),
    #                'Г-жа.' => Переводимый ('Миссис'),
    #},
            },
        };
    
    
    
        # my-it-company.com клиент-пользователь серверная часть и настройки ldap
        $ Self -> {CustomerUser2} = {
            Name => 'AD my-it-company.com',
            Модуль => 'Ядро :: System :: CustomerUser :: LDAP',
            Params => {
                # ldap host
                Хост => 'my-it-company.com',
                # ldap base dn
                BaseDN => 'dc = my-it-company, dc = com',
                # область поиска (одна | дополнительная)
                SSCOPE => 'sub',
                UserDN => 'uid = ldap-bot, cn = users, cn = accounts, dc = my-it-company, dc = com',
                UserPw => 'бот-пароль!',
                # если вы хотите всегда добавлять один фильтр к каждому запросу ldap, используйте
                # этот вариант.е. г. AlwaysFilter => '(mail = *)' или AlwaysFilter => '(objectclass = user)'
                AlwaysFilter => '(mail = *)',
                SourceCharset => 'utf-8',
                Die => 0,
            },
            # уникальный идентификатор клиента
            CustomerKey => 'uid',
            # клиент #
            CustomerID => 'ou',
            CustomerUserListFields => ['uid', 'cn', 'mail'],
            CustomerUserSearchFields => ['uid', 'cn', 'mail'],
            CustomerUserSearchPrefix => '',
            CustomerUserSearchSuffix => '*',
            CustomerUserSearchListLimit => 250,
            CustomerUserPostMasterSearchFields => ['mail'],
            CustomerUserNameFields => ['sn', 'givenname'],
            # Настраивает символ для объединения частей имени пользователя клиента.Присоединитесь к единому пространству, если оно не определено.
            CustomerUserNameFieldsJoin => '',
            # показать клиенту пользователя и клиентские тикеты в клиентском интерфейсе
            CustomerUserExcludePrimaryCustomerID => 0,
            # добавить фильтр ldap для допустимых пользователей (экспертная настройка)
            # CustomerUserValidFilter => '(! (Description = gesperrt))',
            # администратор не может изменить настройки клиента
            AdminSetPreferences => 1,
            # время жизни в кэше в секундах. - кешировать любые запросы ldap
            CacheTTL => 0,
            Карта => [
                ['UserTitle', Translatable ('Заголовок или приветствие'), 'title', 1, 0, 'var', '', 1, undef, undef],
                ['UserFirstname', Translatable ('Firstname'), 'givenname', 1, 1, 'var', '', 1, undef, undef],
                ['UserLastname', Translatable ('Lastname'), 'sn', 1, 1, 'var', '', 1, undef, undef],
                ['UserLogin', Translatable ('Имя пользователя'), 'uid', 1, 1, 'var', '', 1, undef, undef],
                ['UserEmail', Translatable ('Электронная почта'), 'mail', 1, 1, 'var', '', 1, undef, undef],
                ['UserCustomerID', Translatable ('CustomerID'), 'ou', 0, 1, 'var', '', 1, undef, undef],
                ['UserPhone', Translatable ('Phone'), 'telephonenumber', 1, 0, 'var', '', 1, undef, undef],
                ['UserMobile', Translatable ('Mobile'), 'mobile', 1, 0, 'var', '', 1, undef, undef],
            ],
        };
    
    
        # pear customer user ldap backend and settings
        $ Self -> {CustomerUser3} = {
            Name => 'AD pear',
            Модуль => 'Ядро :: System :: CustomerUser :: LDAP',
            Params => {
                # ldap host
                Host => 'груша.com ',
                BaseDN => 'DC = груша, DC = com',
                SSCOPE => 'sub',
                UserDN => '[email protected]',
                UserPw => 'бот-пароль?',
                AlwaysFilter => '(& (mail = *) (samAccountType = 805306368) (! (UserAccountControl: 1.2.840.113556.1.4.803: = 2)))',
                SourceCharset => 'utf-8',
                Die => 0,
            },
            # уникальный идентификатор клиента
            CustomerKey => 'sAMAccountName',
            # клиент #
            CustomerID => 'компания',
            CustomerUserListFields => ['sAMAccountName', 'cn', 'mail'],
            CustomerUserSearchFields => ['sAMAccountName', 'cn', 'mail'],
            CustomerUserSearchPrefix => '',
            CustomerUserSearchSuffix => '*',
            CustomerUserSearchListLimit => 250,
            CustomerUserPostMasterSearchFields => ['mail'],
            CustomerUserNameFields => ['sn', 'givenname'],
            # Настраивает символ для объединения частей имени пользователя клиента.Присоединитесь к единому пространству, если оно не определено.
            CustomerUserNameFieldsJoin => '',
            # показать клиенту пользователя и клиентские тикеты в клиентском интерфейсе
            CustomerUserExcludePrimaryCustomerID => 0,
            AdminSetPreferences => 1,
            CacheTTL => 0,
            Карта => [
                # примечание: необходимы логин, электронная почта и идентификатор клиента!
                # var, frontend, storage, показано (1 = всегда, 2 = lite), required, storage-type, http-link, readonly, http-link-target, link class (es)
                ['UserTitle', Translatable ('Заголовок или приветствие'), 'title', 1, 0, 'var', '', 1, undef, undef],
                ['UserFirstname', Translatable ('Firstname'), 'givenname', 1, 1, 'var', '', 1, undef, undef],
                ['UserLastname', Translatable ('Lastname'), 'sn', 1, 1, 'var', '', 1, undef, undef],
                ['UserLogin', Translatable ('Имя пользователя'), 'sAMAccountName', 1, 1, 'var', '', 1, undef, undef],
                ['UserFullLogin', Translatable ('FullUsername'), 'userPrincipalName', 1, 1, 'var', '', 1, undef, undef],
                ['UserEmail', Translatable ('Электронная почта'), 'mail', 1, 1, 'var', '', 1, undef, undef],
                ['UserCustomerID', Translatable ('CustomerID'), 'company', 0, 1, 'var', '', 1, undef, undef],
                ['UserPhone', Translatable ('Phone'), 'phoneNumber', 1, 0, 'var', '', 1, undef, undef],
                ['UserMobile', Translatable ('Mobile'), 'mobile', 1, 0, 'var', '', 1, undef, undef],
                ['UserAddress', Translatable ('Address'), 'postaladdress', 1, 0, 'var', '', 1, undef, undef],
                ['UserOffice', Translatable ('Office'), 'PhysicalDeliveryOfficeName', 1, 0, 'var', '', 1, undef, undef],
                ['UserDepartment', Translatable ('Department'), 'Department', 1, 0, 'var', '', 1, undef, undef],
                ['UserComment', Translatable ('Комментарий'), 'description', 1, 0, 'var', '', 1, undef, undef],
            ],
        };
    
        # macrohard клиент пользователь ldap серверная часть и настройки
        $ Self -> {CustomerUser4} = {
            Name => 'AD macrohard',
            Модуль => 'Ядро :: System :: CustomerUser :: LDAP',
            Params => {
                # ldap host
                Хост => 'macrohard.com ',
                # ldap base dn
                BaseDN => 'dc = macrohard, dc = com',
                # область поиска (одна | дополнительная)
                SSCOPE => 'sub',
                UserDN => '[email protected]',
                UserPw => 'бот-пароль !?',
                AlwaysFilter => '(& (mail = *) (samAccountType = 805306368) (! (UserAccountControl: 1.2.840.113556.1.4.803: = 2)))',
                SourceCharset => 'utf-8',
                Die => 0,
            },
            # уникальный идентификатор клиента
            CustomerKey => 'sAMAccountName',
            # клиент #
            CustomerID => 'компания',
            CustomerUserListFields => ['sAMAccountName', 'cn', 'mail'],
            CustomerUserSearchFields => ['sAMAccountName', 'cn', 'mail'],
            CustomerUserSearchPrefix => '',
            CustomerUserSearchSuffix => '*',
            CustomerUserSearchListLimit => 250,
            CustomerUserPostMasterSearchFields => ['mail'],
            CustomerUserNameFields => ['sn', 'givenname'],
            # Настраивает символ для объединения частей имени пользователя клиента.Присоединитесь к единому пространству, если оно не определено.
            CustomerUserNameFieldsJoin => '',
            # показать клиенту пользователя и клиентские тикеты в клиентском интерфейсе
            CustomerUserExcludePrimaryCustomerID => 0,
            AdminSetPreferences => 1,
            CacheTTL => 0,
            Карта => [
                ['UserTitle', Translatable ('Заголовок или приветствие'), 'title', 1, 0, 'var', '', 1, undef, undef],
                ['UserFirstname', Translatable ('Firstname'), 'givenname', 1, 1, 'var', '', 1, undef, undef],
                ['UserLastname', Translatable ('Lastname'), 'sn', 1, 1, 'var', '', 1, undef, undef],
                ['UserLogin', Translatable ('Имя пользователя'), 'sAMAccountName', 1, 1, 'var', '', 1, undef, undef],
                ['UserFullLogin', Translatable ('FullUsername'), 'userPrincipalName', 1, 1, 'var', '', 1, undef, undef],
                ['UserEmail', Translatable ('Электронная почта'), 'mail', 1, 1, 'var', '', 1, undef, undef],
                ['UserCustomerID', Translatable ('CustomerID'), 'company', 0, 1, 'var', '', 1, undef, undef],
                ['UserPhone', Translatable ('Phone'), 'phoneNumber', 1, 0, 'var', '', 1, undef, undef],
                ['UserMobile', Translatable ('Mobile'), 'mobile', 1, 0, 'var', '', 1, undef, undef],
                ['UserAddress', Translatable ('Address'), 'postaladdress', 1, 0, 'var', '', 1, undef, undef],
                ['UserOffice', Translatable ('Office'), 'PhysicalDeliveryOfficeName', 1, 0, 'var', '', 1, undef, undef],
                ['UserDepartment', Translatable ('Department'), 'Department', 1, 0, 'var', '', 1, undef, undef],
                ['UserComment', Translatable ('Комментарий'), 'description', 1, 0, 'var', '', 1, undef, undef],
            ],
        };  

    Заключение

    Как вы увидели, настройка аутентификации и синхронизации аккаунтов в OTRS — это очень просто, но все же надеюсь, что эта статья тем, кто только начинает знакомиться с этой системой.

    Что осталось за бортом этой статьи?

    • Параллельно с LDAP можно также запустить SSO-авторизацию, что еще упростит жизнь клиентам
    • Если есть специалисты по Perl — можно написать собственный backend для подключения к другим информационным системам.
    • Сознательно упрощенная конфигурация, например, нет блоков фильтрации по группам LDAP, нет доменных суффиксов, BASE DN, работы с дополнительными атрибутами, работы с LDAP на других портах и ​​много другого

    Советы и уточнения приветствуются комментарии, информация об опечатках — в ЛС.

    Спасибо за внимание. Отдельное спасибо авторам, чьи материалы по OTRS я использовал много лет назад при знакомстве с этой системой: Turilion, supersuperoleg, wmlex

    .

    ASA. Настройка перехватывающей аутентификации через AD и LDAP / Хабр

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

    А я расскажу, используя здесь ASA, аутентифицироваться напрямую в

    AD

    . Часто возникает задача проверить пользователя до предоставления ему доступа к определенным ресурсам.На ASA такая проверка называется «перехватывающая аутентификация» (сквозной прокси).

    Этот сервис использует инфраструктуру ААА (Аутентификация, Авторизация, Учет).

    Примечание: в английском слове аутентификация нет слога «фи», который появился в английском «аутентификация» скорее всего из-за созвучия слова «идентификация». Причем, в нашем могучем языке есть и «аутентичность». Без всякого «фи» 🙂 Не попадитесь!

    Аутентификация.
    Отвечает на вопрос «есть ли такой пользователь». Поиск этого пользователя может производиться как в локальной (ЛОКАЛЬНОЙ) базе данных, так и во внешних (TACACS +, RADIUS, AD по протоколу LDAP).

    Настройка сервера LDAP подразумевает указание ввода записи пользователя из AD с помощью которой ASA будет входить в LDAP, тип сервера, «корень» поиска и т.д.

    aaa-server {SERVERNAME} протокол ldap
    aaa-server {SERVERNAME} ({interface}) хост {IP_SERVER}
    ldap-base-dn {основной уровень}
    ldap-scope {subtree | onelevel}
    ldap-naming-attribute {передаваемый атрибут}
    ldap-login-dn {имя пользователя ASA}
    ldap-логин-пароль {пароль пользователя ASA}
    тип сервера {Microsoft | Novell | OpenLDAP | sun | auto}

    Пример:
    aaa-server AD (dmz) host 172.16.1.100
    ldap-base-dn ou = Работодатели, dc = anticisco, dc = ru
    Поддерево ldap-scope
    Атрибут именования ldap sAMAccountName
    ldap-login-dn cn = ASA, cn = пользователи, dc = anticisco, dc = ru
    ldap-логин-пароль ASALDAPPASS
    серверного типа microsoft

    После того, как настроены сервера, самое время определить, какой трафик нам интересно проверить и не пропускать без аутентификации. На ASA за это отвечает… конечно список доступа, где строчками разрешено указывается такой трафик.Список аутентификационных групп

    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, {AUTHACL} {interface} {SERVERNAME}

    При этом будут проверяться пакеты, поступающие на вход интерфейса.

    Например, хотим проверить весь трафик из локальной сети 10.1.1.0/24 (за интерфейс внутри), идущий во все сети, кроме 172.16.1.0/24:
    список доступа AUTH deny ip 10.1.1.0 255.255.255.0 172.16. 1.0 255.255.255.0
    список доступа AUTH разрешение ip 10.1.1.0 255.255.255.0 любой
    совпадение аутентификации aaa AUTH внутри RAD

    А как же спросить у пользователя его логин / пароль? Ведь не может же какой-нибудь пинг инициировать запрос?
    Перехватить сессию и спросить логин и пароль ASA может по протоколам http / https, ftp, telnet. Если же необходимо аутентифицировать другой трафик, то нужно сделать 2 телодвижения: пойти куда-нибудь за ASA по одному из указанных протоколов, осуществить свои логин / пароль либо в telnet либо в ftp окошке.Надо учитывать, что такой трафик обязательно должен быть указан в списке доступа для интересного трафика.

    Например, мы хотим, чтобы пользователь мог пойти по telnet или http на хосте 1.1.1.1 и его бы спросили логин и пароль. Тогда этот трафик обязательно должен попасть в список доступа. Вот такой не подойдет, т.к. по telnet работать не будет:
    список доступа AUTH разрешить tcp любой любой eq 80
    список доступа AUTH разрешение udp любое любое

    Если данные верны, ASA пропустит ваш трафик.Но только на указанное время. По умолчанию таймауты, скажем так, странные: 5 минут абсолютного времени, таймаут неактивности не отслеживается. Поменять их не только можно, но и нужно:

    timeout uauth {HH: MM: SS} {absolute | inactivity}

    Пример:
    timeout uauth 0: 15: 0 бездействие
    тайм-аут uauth 20:00:00 абсолютный

    Таким образом, с аутентификацией все просто: если более ничего не указывать, то пользователю, а вернее, ip-адресу его компьютер, будет можно все.

    Гораздо более интересный момент — авторизация , то есть ограничение прав пользователя.

    Для авторизации по LDAP нам нужен «костыль» — специальная конструкция, которая сопоставит атрибуту LDAP-атрибут RADIUS, который поймет ASA. Такая конструкция называется

    ldap attribute-map {MAPNAME}
    имя-карты {LDAPATTRIBUTE} {RADUISATTRIBUTE}
    значение карты {LDAPATTRIBUTE} {SENDNAME} {TRANSLATENAME}

    Пример.Сопоставим атрибуту ipPhone базы AD атрибут IETF-Radius-Filter-Id (список доступа). И опишем, что если в указанном атрибуте мы получим слово «BUHG», то на пользовательской применимости список доступа BUH, который уже написан на ASA:
    ldap attribute-map AD
    имя-карты ipPhone IETF-Radius-Filter-Id
    map-value ipPhone BUHG BUH

    Важно: если в указанном атрибуте мы ничего не получили, мы его игнорируем, а если получили слово, не описанное в значениях для данного атрибута, то доступ будет запрещен.Таким образом, администратор AD может влиять на права доступа. Например, может перекрыть интернет неугодному пользователю, не прикасаясь к ASA 🙂

    Осталось применить этот список атрибутов в конкретном сервере LDAP

    aaa-server {SERVERNAME} ({interface}) host {IP_SERVER}
    ldap-attribute-map {MAPNAME}

    Пример:
    aaa-server AD (dmz) host 172.16.1.100
    ldap-attribute-map AD

    Приятного авторизования, дорогие хабрачитатели-цисколюбы 🙂

    ЗЫ Я сам: «На нормальных ОС это делается половиной команды» 🙂 Так что поможем админам «ненормальных» 🙂

    .

    LDAP-сервер с PAM авторизацией клиентов

    Как настроить LDAP с поддержкой PAM авторизации?

    Итак!

    1.Запуск LDAP.

    Чтобы LDAP сервер заработал, для начала установим несколько пакетов

    # apt-get install slapd ldap-utils migrationtools

    Ответим на все заданные при их установке вопросы и затем переконфигурируем slapd, чтобы заставить dpkg задать нам больше вопросов.

    Проверим:

    #ldapsearch -x -b dc = deb2, dc = test, dc = local

    # расширенный LDIF

    #

    # LDAPv3

    # base с поддеревом области

    # фильтр: (objectclass = *)

    # запрос: ВСЕ

    #

    # server.test.local

    dn: dc = сервер, dc = test, dc = local

    objectClass: верхний

    объектный класс: dcObject

    objectClass: организация

    о: MyTestOrg

    постоянного тока: сервер

    # админ, сервер.test.local

    dn: cn = admin, dc = server, dc = test, dc = local

    objectClass: simpleSecurityObject

    objectClass: организационная роль

    сп: админ

    описание: администратор LDAP

    # результат поиска

    поиск: 2

    результат: 0 Успех

    # numResponses: 3

    # numEntries: 2

    Всё работает? Да? Если нет ищем где напутали

    2.Заполнение базы

    быстро импортировать всех пользователей и групп сервера (локальных пользователей и групп) в LDAP, чтобы быстро использовать утилиту миграции.

    # сd / usr / share / migrationtools /

    Отредактировать конфиг по умолчанию, он называется migrate_common.ph и заменим следующие параметры:

    #vi migrate_common.ph

    $ DEFAULT_MAIL_DOMAIN = «server.test.local»;

    $ DEFAULT_BASE = «dc = сервер, dc = test, dc = local»;

    Затем экспортируем данные:

    #. / Migrate_group.pl / etc / group /home/my_home/group.ldif

    #. / Migrate_passwd.pl / etc / passwd /home/my_home/passwd.ldif

    Этот скрипт не создает ldap-узлы Group и People, поэтому нужно самим создать их.Для этого создадим файл ldif в домашнем каталоге с именем people_group.ldif и заполним его данные:

    people_group.ldif (не забываем про пустую установку перед каждым dn (читай LDAP мануал) !!!)

    dn: ou = люди, dc = server, dc = test, dc = local

    оу: Люди

    объектный класс: организационная единица

    dn: ou = группа, dc = сервер, dc = test, dc = local

    оу: Группа

    объектный класс: организационная единица

    Теперь у нас есть списки наших пользователей и групп, сконвертированные в формате LDAP ldif.Импортируем их в нашу LDAP базу.

    #ldapadd -x -W -D «cn = admin, dc = server, dc = test, dc = local» -f /home/skuleshov/people_group.ldif

    #ldapadd -x -W -D «cn = admin, dc = server, dc = test, dc = local» -f /home/skuleshov/group.ldif

    #ldapadd -x -W -D «cn = admin, dc = server, dc = test, dc = local» -f /home/skuleshov/passwd.ldif

    где:

    -x означает, что не использовать sasl

    -W будет запрошен пароль администратора LDAP

    -D используется для идентификации администратора

    -f указывает файл, где ldapadd будет брать данные для добавления

    3.Настройка клиентов

    Установим следующие пакеты:

    # apt-get install libnss-ldap libpam-ldap nscd libnss-ldapd

    libnss-ldap позволит использовать ldap как сервер имен, lippam-ldap pam аутентифицировать пользователей через LDAP и, наконец, nscd — это поиск-демон паролей, групп и хостов, который кеширует результаты, чтобы не запрашивать повторно LDAP каждый раз, когда аутентификация будет пройдена.

    Теперь отредактируем конфигурационные файлы и убедимся, что у нас установлены следующие настройки:

    #vi /etc/libnss-ldap.conf

    хост-сервер

    base dc = server, dc = test, dc = local

    rootbinddn cn = admin, dc = server, dc = test, dc = local

    #vi /etc/libnss-ldap.secret

    пароль

    #vi / etc / pam_ldap.conf

    хост-сервер

    base dc = server, dc = test, dc = local

    rootbinddn cn = admin, dc = server, dc = test, dc = local

    #vi /etc/pam_ldap.secret

    пароль

    #vi /etc/pam.d/common-account

    достаточно аккаунта pam_ldap.so

    необходим аккаунт pam_unix.so

    # если вы хотите, чтобы домашний каталог пользователя создавался при первом логине

    # требуется сессия пам_мхомедир.поэтому umask = 0022 skel = / etc / skel / silent

    #vi /etc/pam.d/common-auth

    auth достаточный pam_ldap.so

    требуется авторизация pam_unix.so nullok_secure use_first_pass

    #vi /etc/pam.d/common-password

    пароль достаточный pam_ldap.so

    требуется пароль pam_unix.so nullok obscure min = 4 max = 8 md5

    #vi /etc/pam.d/common-session

    сеанса достаточно pam_ldap.так

    Требуется сеанс

    pam_unix.so

    сеанс опционально pam_foreground.so

    Но на сайте вики есть такое

    Создание домашнего каталога при входе в систему

    Включите это в /etc/pam.d/common-session, если вы хотите автоматически создавать домашние каталоги при первом входе пользователя в систему:

    Требуется сеанс

    pam_mkhomedir.so skel = / etc / skel umask = 0022

    Не сработало. Сработало в /etc/pam.d/common-account (((

    Затем nsswitch, чтобы система использовала возможность переключения настройки аутентификации ldap.

    #vim /etc/nsswitch.conf

    # /etc/nsswitch.conf

    #

    # Пример конфигурации функциональности переключателя службы имен GNU.

    # Если у вас установлены пакеты `glibc-doc-reference ‘и ʻinfo’, попробуйте:

    # ʻinfo libc «Name Service Switch» ‘для получения информации об этом файле.

    пароль: совместимость ldap

    группа: compat ldap

    тень: compat ldap

    хостов: файлы dns

    Сети

    : файлы

    протоколы: файлы db

    услуги: файлы db

    эфиров: файлы базы данных

    rpc: файлы базы данных

    сетевая группа:

    шек.

    Не забыть перезапустить nscd для обновления кеша !!!

    С этими настройками при логине юзер сначала необходимо залогиниться как локальный пользователь.Если совпадение имен не найдено, запуск аутентификации с ldap сервера.

    Полезные статьи:

    https://wiki.debian.org/LDAP/PAM

    https://wiki.debian.org/LDAP/NSS

    .

    ASA 8.0: Настройка проверки подлинности LDAP для пользователей WebVPN

    Содержание

    Введение

    Предварительные условия

    Общие сведения

    Настройка аутентификации LDAP

    ASDM

    Интерфейс командной строки

    Мультидоменный поиск (дополнительно)

    Проверка

    Проверка с помощью ASDM

    Проверка в интерфейсе командной строки

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

    Дополнительные сведения


    Этот документ иллюстрирует порядок настройки устройств адаптивной защиты Cisco (ASA) для использования сервера LDAP при аутентификации пользователей WebVPN.Сервер LDAP в этом примере — Microsoft Active Directory. Настройка выполняется посредством Менеджера устройств адаптивной защиты (ASDM) 6.0 (2) на устройстве ASA, работающем под управлением версии ПО 8.0 (2).

    Примечание. В этом примере аутентификации по протоколу LDAP настраивается для пользователей WebVPN, но эта конфигурация может сообщить и для других видов удаленного доступа. Достаточно назначить группу сервера AAA желаемому профилю подключения (группенелей), как это будет туннелировать.

    Требуется базовая конфигурация VPN. В данном примере используется WebVPN.

    В этом примере ASA обращается к серверу LDAP для проверки идентификационных данных пользователей, аутентификация которых производится. Это работает иным образом, как протокол аутентификации RADIUS TACACS +. Приведенная последовательность действий показывает общий порядок использования сервера LDAP включает ASA для проверки реквизитов учетной записи пользователя.

    1. Пользователь запускает подключение к устройству ASA.

    2. Устройство ASA настроено для аутентификации пользователя посредством сервера Microsoft Active Directory (AD) / LDAP.

    3. ASA связывается с сервером LDAP с учетными данными (в данном случае admin), настроенными на ASA, и ищет предоставленное имя пользователя. Пользователь admin также получает соответствующие реквизиты для просмотра содержимого Active Directory.Дополнительные сведения о предоставлении привилегий для запросов см. в документе http://support.microsoft.com/?id=320528.

      Примечание. Веб-сайт Microsoft по адресу http://support.microsoft.com/?id=320528 находится в ведении стороннего поставщика услуг. Компания Cisco не несет ответственности за его содержимое.

    4. Если имя пользователя найдено, ASA пытается связаться с сервером LDAP с использованием пользовательского интерфейса при входе.

    5. При успешной выполнении второй привязки аутентификация считается пройденной, и ASA обрабатывает атрибуты пользователя.

      Примечание. В этом примере атрибуты не используются для каких бы то ни было целей. В документе ASA / PIX: пример конфигурации для назначения клиентов VPN групповой политикой VPN посредством LDAP подробно описана обработка атрибутов LDAP через ASA.

    В этом разделе приведены сведения, позволяющие настроить устройство ASA для использования сервера LDAP при аутентификации клиентов WebVPN.

    ASDM

    Чтобы настроить устройство ASA для взаимодействия с сервером LDAP и выполнения аутентификации клиентов WebVPN, выполните следующие шаги в ASDM:

    1. Выберите Конфигурация> VPN для удаленного доступа> Настройка AAA> Группы серверов AAA (Конфигурация> VPN для удаленного доступа> Настройка AAA> Группы серверов AAA).

    2. Рядом со списком Группы серверов AAA (Группы серверов AAA) выбрать Добавить (Добавить).

    3. Укажите имя новой группы серверов AAA и в качестве протокола LDAP .

    4. Убедитесь, что новая группа выбрана в верхней области, и нажмите кнопку Добавьте (Добавить) рядом с областью Серверов в Выбранной группе (Серверы в выбранной группе).

    5. Укажите сведения о конфигурации сервера LDAP. Последующий снимок экрана показывает пример конфигурации.Ниже поясня многие параметры конфигурации.

      • Имя интерфейса (Имя интерфейса) — интерфейс, который устройство ASA должно использовать для обращения к серверу LDAP.

      • Имя сервера или IP-адрес (Имя или IP-адрес сервера) — адрес, которое устройство ASA должно использовать для обращения к серверу LDAP.

      • Server Type (Тип сервера) — тип сервера LDAP, например Microsoft.

      • Base DN (Базовое отличительное имя) — местоположение в иерархии LDAP, с которого должен начинать поисковый сервер.

      • Scope (Рамки) — рамки поиска в иерархии LDAP, подлежащего сервером.

      • Атрибут именования (Атрибут именования) — атрибут (или атрибуты) относительного отличительного имени, однозначно определяющий запись на сервере LDAP. Атрибут по умолчанию в Microsoft Active Directory — sAMAccountName .Другие часто используемые атрибуты: CN, UID и userPrincipalName.

      • Login DN (Отличительное имя входа) — отличительное имя с достаточными полномочиями для поиска, чтения и указания пользователей на сервере LDAP.

      • Пароль для входа (Пароль для входа) — пароль учетной записи отличительного имени.

      • Карта атрибутов LDAP (Карта атрибутов LDAP) — карта, используемая для ответов от этого сервера.В документе ASA / PIX: пример конфигурации для назначения клиентов VPN групповая политика VPN посредством LDAP более подробно описана настройка карт атрибутов LDAP.

    6. После настройки группы серверов AAA и добавления в нее сервера необходимо настроить профиль подключения (группу туннелирования) для использования новой конфигурации AAA. Выберите Конфигурация> VPN для удаленного доступа> Бесклиентный доступ к VPN через SSL> Профили подключения (Конфигурация> VPN для удаленного доступа> Доступ по бесклиентской сети VPN на основе SSL> Профили подключений).

    7. Выберите профиль подключения (группу туннелирования), для которого необходимо настроить AAA, нажмите Edit (Изменить).

    8. В разделе Аутентификация (Аутентификация) выберите группу серверов LDAP, созданную ранее.

    Интерфейс командной строки

    Чтобы настроить устройство ASA для взаимодействия с сервером LDAP и выполнения аутентификации клиентов WebVPN, выполните следующие шаги в интерфейсе командной строки:

     ciscoasa #  настроить терминал 
    
     
    ! --- Настройте группу серверов AAA.
    ciscoasa (config) # aaa-server LDAP_SRV_GRP протокол ldap
    
     
    ! --- Настройте сервер AAA.
     
    ciscoasa (config-aaa-server-group) # aaa-server LDAP_SRV_GRP (внутри)
       хост 192.168.1.2
    ciscoasa (config-aaa-server-host) # ldap-base-dn dc = ftwsecurity, dc = cisco, dc = com
    ciscoasa (config-aaa-server-host) # ldap-login-dn cn = admin, cn = users, dc = ftwsecurity, dc = cisco, dc = com
    ciscoasa (config-aaa-server-host) # ldap-login-password **********
    ciscoasa (config-aaa-server-host) # ldap-атрибут именования sAMAccountName
    ciscoasa (config-aaa-server-host) # поддерево ldap-scope
    ciscoasa (config-aaa-server-host) # тип сервера microsoft
    ciscoasa (config-aaa-server-host) # выход
    
     
    ! --- Настройте туннельную группу для использования новой настройки AAA.
    ciscoasa (config) # туннельная группа ExampleGroup2 general-att
    ciscoasa (config-tunnel-general) # группа-сервера-аутентификации LDAP_SRV_GRP 

    Мультидоменный поиск (дополнительно)

    Это необязательный этап. ASA в настоящее время не поддерживает механизм перенаправления LDAP для мультидоменного поиска (идентификатор ошибки Cisco CSCsj32153). Мультидоменный поиск в режиме сервера глобального каталога. Для выполнения мультидоменного поиска нужно настроить сервер AD в режиме сервера глобального каталога.Обычно при этом следующие следующие ключевые параметры записи сервера LDAP в ASA. Принципиально важно использовать значение ldap-name-attribute, уникальное в пределах дерева каталогов.

     порт сервера 3268
    поддерево ldap-scope
    ldap-атрибут именования userPrincipalName 

    Этот раздел служит для проверки работоспособности вашей конфигурации.

    Проверка в ASDM

    Проверьте конфигурацию LDAP кнопкой Test (Проверка) на настройках групп серверов AAA.Эта кнопка позволяет после указания пользователя и отправить пароль проверочный запрос аутентификации на сервере LDAP.

    1. Выберите Конфигурация> VPN для удаленного доступа> Настройка AAA> Группы серверов AAA (Конфигурация> VPN для удаленного доступа> Настройка AAA> Группы серверов AAA).

    2. Выберите необходимую группу серверов AAA в верхней области.

    3. В нижней области сервера AAA, необходимо проверить.

    4. Справа от нее Test (Проверить).

    5. В появившемся окне выберите переключатель Authentication (Аутентификация) и укажите реквизиты аутентификации, которые необходимо проверить. По окончании нажмите ОК .

    6. После того, как устройство ASA обратится к серверу LDAP, появится сообщение об успешном выполнении операции или ошибке.

    Проверка в интерфейсе командной строки

    Для проверки настроек AAA можно использовать команду test в интерфейсе командной строки.На сервере AAA устанавливается проверочный запрос, а результат появляется в внутренней строке.

     ciscoasa #  проверка аутентификации aaa-сервера LDAP_SRV_GRP хост 192.168.1.2
       имя пользователя kate пароль cisco123 
    ИНФОРМАЦИЯ: попытка проверки подлинности на IP-адрес <192.168.1.2>
       (тайм-аут: 12 секунд)
    ИНФОРМАЦИЯ: аутентификация прошла успешно 

    В случае сомнений относительно текущей строки отличительного имени (DN) можно проверить строку DN пользовательского объекта, введенную команду dsquery на сервере Windows Active Directory из командной строки.

     C: \ Documents and Settings \ Administrator>  пользователь dsquery -samid kate 
    
     
    ! --- Запрашивает в Active Directory идентификатор samid "kate"
     
    "CN = Кейт Остин, CN = Пользователи, DC = ftwsecurity, DC = cisco, DC = com" 

    Команда debug ldap 255 помогает диагностировать проблемы аутентификации в этой сценарии. Эта команда позволяет выполнять отладку LDAP и контролировать процесс подключения ASA к серверу LDAP. В выходных данных показано подключение ASA к серверу LDAP в соответствии с общим описанием в разделе Общие сведения настоящего документа.

    Этот отладки показывает успешную аутентификацию журнала:

     ciscoasa #  отладка ldap 255 
    [7] Начало сеанса
    [7] Новый сеанс запроса, контекст 0xd4b11730, reqType = 1
    [7] Волокно запущено
    [7] Создание контекста LDAP с uri = ldap: //192.168.1.2: 389
    [7] Подключитесь к серверу LDAP: ldap: //192.168.1.2: 389, статус = Успешно
    [7] defaultNamingContext: value = DC = ftwsecurity, DC = cisco, DC = com
    [7] supportedLDAPVersion: value = 3
    [7] supportedLDAPVersion: value = 2
    [7] supportedSASLMechanisms: value = GSSAPI
    [7] supportedSASLMechanisms: value = GSS-SPNEGO
    [7] supportedSASLMechanisms: value = EXTERNAL
    [7] supportedSASLMechanisms: value = DIGEST-MD5
    
     
    ! --- ASA подключается к серверу LDAP как администратор для поиска kate.
      [7] Привязка от имени администратора
    [7] Выполнение простой аутентификации для администратора на 192.168.1.2
    [7] Поиск LDAP:
            Базовое DN = [dc = ftwsecurity, dc = cisco, dc = com]
            Фильтр = [sAMAccountName = kate]
            Область действия = [SUBTREE]
    [7] DN пользователя = [CN = Кейт Остин, CN = Пользователи, DC = ftwsecurity, DC = cisco, DC = com]
      [7] Обращение к серверу Active Directory 192.168.1.2
    [7] Чтение политики паролей для Кейт, DN: CN = Kate Austen, CN = Users,
           DC = ftwsecurity, DC = cisco, DC = com
    [7] Считывание неверного пароля, счетчик 1
    
     
    ! --- ASA связывается с сервером LDAP как kate для проверки пароля.
      [7] Привязка как пользователь
    [7] Выполнение простой аутентификации для kate на 192.168.1.2
    [7] Проверка политики паролей для пользователя kate
    [7] Связывание с правами администратора
    [7] Выполнение простой аутентификации для администратора на 192.168.1.2
    [7] Аутентификация для Кейт на 192.168.1.2 прошла успешно.
    [7] Получение атрибутов пользователя с сервера 192.168.1.2 
    [7] Полученные атрибуты:
    [7] objectClass: value = top
    [7] objectClass: значение = человек
    [7] objectClass: value = organizationPerson
    [7] objectClass: значение = пользователь
    [7] cn: value = Кейт Остин
    [7] sn: value = Остин
    [7] givenName: value = Кейт
    [7] visibleName: value = CN = Кейт Остин, CN = Пользователи, DC = ftwsecurity,
               DC = Cisco, DC = com
    [7] instanceType: value = 4
    [7] whenCreated: значение = 20070815155224.0Z
    [7] whenChanged: значение = 20070815195813.0Z
    [7] displayName: value = Кейт Остин
    [7] uSNCreated: значение = 16430
    [7] memberOf: value = CN = Castaways, CN = Users, DC = ftwsecurity, DC = cisco, DC = com
    [7] memberOf: value = CN = Сотрудники, CN = Пользователи, DC = ftwsecurity, DC = cisco, DC = com
    [7] uSNChanged: значение = 20500
    [7] name: value = Кейт Остин
    [7] objectGUID: значение = ..z ... yC.q0 .....
    [7] userAccountControl: значение = 66048
    [7] badPwdCount: значение = 1
    [7] codePage: value = 0
    [7] countryCode: value = 0
    [7] badPasswordTime: value = 128321799570937500
    [7] lastLogoff: значение = 0
    [7] lastLogon: значение = 128321798130468750
    [7] pwdLastSet: value = 128316667442656250
    [7] primaryGroupID: значение = 513
    [7] objectSid: value =............ Q..p .. *. P? E.Z ...
    [7] accountExpires: value = 9223372036854775807
    [7] logonCount: value = 0
    [7] sAMAccountName: value = kate
    [7] sAMAccountType: value = 805306368
    [7] userPrincipalName: value = [email protected]
    [7] objectCategory: значение = CN = Человек, CN = Схема, CN = Конфигурация,
               DC = ftwsecurity, DC = cisco, DC = com
    [7] dSCorePropagationData: значение = 20070815195237.0Z
    [7] dSCorePropagationData: значение = 20070815195237.0Z
    [7] dSCorePropagationData: значение = 20070815195237.0Z
    [7] dSCorePropagationData: значение = 16010108151056.0Z
    [7] Выход волокна Tx = 685 байт Rx = 2690 байт, статус = 1
    [7] Конец сеанса 

    Этот журнал отладки показывает ошибку аутентификации из-за неверного пароля:

     ciscoasa #  отладка ldap 255 
    [8] Начало сеанса
    [8] Новый сеанс запроса, контекст 0xd4b11730, reqType = 1
    [8] Волокно запущено
    [8] Создание контекста LDAP с uri = ldap: //192.168.1.2: 389
    [8] Подключитесь к серверу LDAP: ldap: //192.168.1.2: 389, статус = Успешно
    [8] defaultNamingContext: value = DC = ftwsecurity, DC = cisco, DC = com
    [8] supportedLDAPVersion: value = 3
    [8] supportedLDAPVersion: value = 2
    [8] supportedSASLMechanisms: value = GSSAPI
    [8] supportedSASLMechanisms: value = GSS-SPNEGO
    [8] supportedSASLMechanisms: value = EXTERNAL
    [8] supportedSASLMechanisms: value = DIGEST-MD5
    
     
    ! --- ASA подключается к серверу LDAP как администратор для поиска kate.
      [8] Привязка от имени администратора
    [8] Выполнение простой аутентификации для администратора на 192.168.1.2
    [8] Поиск LDAP:
            Базовое DN = [dc = ftwsecurity, dc = cisco, dc = com]
            Фильтр = [sAMAccountName = kate]
            Область действия = [SUBTREE]
    [8] DN пользователя = [CN = Кейт Остин, CN = Пользователи, DC = ftwsecurity, DC = cisco, DC = com] 
    [8] Обращение к серверу Active Directory 192.168.1.2
    [8] Чтение политики паролей для Кейт, DN: CN = Кейт Остин, CN = Пользователи,
           DC = ftwsecurity, DC = cisco, DC = com
    [8] Считывание неверного пароля, счетчик 1
    
     
    ! --- ASA пытается выполнить привязку от имени kate, но пароль неверен.
      [8] Привязка как пользователь
    [8] Выполнение простой аутентификации для kate на 192.168.1.2
    [8] Простая аутентификация для Кейт вернул код (49) Неверные учетные данные 
    [8] Связывание с правами администратора
    [8] Выполнение простой аутентификации для администратора на 192.168.1.2
    [8] Считывание неверного пароля для Кейт, DN: CN = Kate Austen, CN = Users,
           DC = ftwsecurity, DC = cisco, DC = com
    [8] Получено badPwdCount = 1 для пользователя kate.
    [8] badPwdCount = 1 до, badPwdCount = 1 после для Кейт
    [8] сейчас: Вт, 28 августа 2007 г. 15:33:05 GMT, последний сеанс: среда, 15 августа 2007 г. 15:52:24 GMT,
           дельта = 1122041, maxage = 3710851 сек
    [8] Неверный пароль для Кейт
    [8] Выход волокна Tx = 788 байтов Rx = 2904 байта, статус = -1
    [8] Конец сеанса 

    Этот журнал отладки показывает ошибку аутентификации из-за отсутствия пользователя на сервере LDAP:

     ciscoasa #  отладка ldap 255 
    [9] Начало сеанса
    [9] Новый сеанс запроса, контекст 0xd4b11730, reqType = 1
    [9] Волокно запущено
    [9] Создание контекста LDAP с uri = ldap: // 192.168.1.2: 389
    [9] Подключитесь к серверу LDAP: ldap: //192.168.1.2: 389, статус = Успешно
    [9] defaultNamingContext: value = DC = ftwsecurity, DC = cisco, DC = com
    [9] supportedLDAPVersion: value = 3
    [9] supportedLDAPVersion: value = 2
    [9] supportedSASLMechanisms: value = GSSAPI
    [9] supportedSASLMechanisms: value = GSS-SPNEGO
    [9] supportedSASLMechanisms: value = EXTERNAL
    [9] supportedSASLMechanisms: value = DIGEST-MD5
    
     
    ! --- Пользователь mikhail не найден.
     
      [9] Привязка от имени администратора
    [9] Выполнение простой аутентификации для администратора на 192.168.1.2
    [9] Поиск LDAP:
            Базовое DN = [dc = ftwsecurity, dc = cisco, dc = com]
            Фильтр = [sAMAccountName = mikhail]
            Область действия = [SUBTREE]
    [9] Запрошенные атрибуты не найдены 
    [9] Выход волокна Tx = 256 байтов Rx = 607 байтов, статус = -1
    [9] Конец сеанса 


    .

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

    Ваш адрес email не будет опубликован. Обязательные поля помечены *