Синхронизация с ad


#1

Добрый день, подскажите советом, ребята.
Itop установлен на windows 2008 r2.
Насколько написано в документации, если я не ошибаюсь, пользователь в itop должен быть external, чтобы работала сквозная аутентификация. Это сделано.
Если создавать пользователя LDAP, то сквозная не работает, по крайней мере у меня ничего вышло.

Для синхронизации с AD используется скрипт ad_import_accounts.php, так вот этот скрипт создает только ldap пользователей.

Как быть в этой ситуации? Хотелось бы либо найти решение для сквозной аутентификации пользователей типа ldap или заставить скрипт сихронизировать пользователей external.


#2

нашел решение:
Поменял в ad_import_accounts.php:

	$sAction = 'created';
	echo "<h2>User $sLogin will be <em>created</em> in iTop</h2>";
	$oITopUser = new UserLDAP;
	$oITopUser->Set('login', $sLogin);
	$oITopUser->Set('contactid', $oPerson->GetKey());
	$oITopUser->Set('language', $aConfig['default_language']);
	// Update the profiles
	$oLinkSet = DBObjectSet::FromScratch('URP_UserProfile');
	foreach($aITopProfiles as $sProfile)
	{

Вместо UserLDAP прописал UserExternal

Правда все равно есть куча вопросов не решенных по синхронизации, например, как синхронизировать отдел пользователя, ведь это отдельная таблица (Команда), а также несколько других нюансов…


#3

К сожалению, с AD я помочь пока не могу.

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


#4

Кстати, спасибо, Владимир, за этот прекрасный сайт, нашел здесь много интересного!

В продолжение темы импорта из ad решил продолжить эксперименты.
Для начала добавил отчество для персоны, как тут уже описывалось в другой теме, дам полный код, если кому пригодится (правда, на 100% код не протестирован и серч позицианируется не там где надо):

<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
  <classes>
      <class id="Person">
      <properties>
          <naming _delta="redefine">
           <attributes>
           <attribute id="name"/>
           <attribute id="first_name"/>
           <attribute id="middle_name"/>
           </attributes>
          </naming>
        <reconciliation>
          <attributes>
            <attribute id="first_name"/>
            <attribute id="name"/>
            <attribute id="middle_name"/>
            <attribute id="org_id"/>
            <attribute id="org_name"/>
            <attribute id="email"/>
            <attribute id="employee_number"/>
          </attributes>
        </reconciliation>
      </properties>
      <fields>
        <field id="middle_name" xsi:type="AttributeString" _delta="define">
          <sql>middle_name</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
        </field>
        <field id="team_id" xsi:type="AttributeExternalKey" _delta="define">
          <filter><![CDATA[SELECT Team]]></filter>
          <dependencies>
            <attribute id="org_id"/>
          </dependencies>
          <sql>team_id</sql>
          <target_class>Team</target_class>
          <is_null_allowed>true</is_null_allowed>
          <on_target_delete>DEL_MANUAL</on_target_delete>
        </field>
        <field id="team_name" xsi:type="AttributeExternalField" _delta="define">
          <extkey_attcode>team_id</extkey_attcode>
          <target_attcode>name</target_attcode>
        </field>
      </fields>
      <presentation>
        <details _delta="redefine">
          <items>
            <item id="team_list">
              <rank>10</rank>
            </item>
            <item id="tickets_list">
              <rank>20</rank>
            </item>
            <item id="cis_list">
              <rank>30</rank>
            </item>
            <item id="col:col1">
              <rank>40</rank>
              <items>
                <item id="fieldset:Person:info">
                  <rank>10</rank>
                  <items>
                    <item id="name">
                      <rank>10</rank>
                    </item>
                    <item id="first_name">
                      <rank>20</rank>
                    </item>
                    <item id="middle_name">
                      <rank>30</rank>
                    </item>
                    <item id="org_id">
                      <rank>40</rank>
                    </item>
                    <item id="status">
                      <rank>50</rank>
                    </item>
                    <item id="location_id">
                      <rank>60</rank>
                    </item>
                     <item id="team_id">
                      <rank>70</rank>
                    </item>                                 
                    <item id="function">
                      <rank>80</rank>
                    </item>
                    <item id="manager_id">
                      <rank>90</rank>
                    </item>
                    <item id="employee_number">
                      <rank>100</rank>
                    </item>
                  </items>
                </item>
              </items>
            </item>
            <item id="col:col2">
              <rank>50</rank>
              <items>
                <item id="fieldset:Person:notifiy">
                  <rank>10</rank>
                  <items>
                    <item id="email">
                      <rank>10</rank>
                    </item>
                    <item id="notify">
                      <rank>20</rank>
                    </item>
                    <item id="phone">
                      <rank>30</rank>
                    </item>
                    <item id="mobile_phone">
                      <rank>40</rank>
                    </item>
                  </items>
                </item>
              </items>
            </item>
          </items>
        </details>
                <search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="first_name">
              <rank>20</rank>
            </item>
            <item id="middle_name">
              <rank>30</rank>
            </item>            
            <item id="org_id">
              <rank>40</rank>
            </item>
            <item id="status">
              <rank>50</rank>
            </item>
            <item id="location_id">
              <rank>60</rank>
            </item>
            <item id="email">
              <rank>70</rank>
            </item>
            <item id="phone">
              <rank>80</rank>
            </item>
            <item id="employee_number">
              <rank>90</rank>
            </item>
            <item id="manager_id">
              <rank>100</rank>
            </item>
            <item id="mobile_phone">
              <rank>110</rank>
            </item>
            <item id="notify">
              <rank>120</rank>
            </item>
          </items>
        </search>
      </presentation>
    </class>
  </classes>
</itop_design>

Также я выложил модуль, т.к. мне нужна помощь.
В модуль я впихнул еще поле team_id, кстати я использую “команды” для указания отдела персоны, а для чего на самом деле используются “команды” в itop?

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

Как видно на скрине:

В team id команда есть, а в team list сверху команды нет, т.е. нужно при назначении поля team_id, делать еще привязку в lnkPersonToTeam, а как это сделать, у кого-нибудь есть идеи?


#5

Этот функционал есть “из коробки”, не пойму, зачем поле? Делаем команду, добавляем участников в редактировании команды, готово!


#6

Как гласит документация, команды в iTop могут использоваться, чтобы связать группу лиц с конкретной конфигурационной единицей, создать “рабочую группу” для назначения тикетов или группу лиц для получения уведомлений.

Про отделы речи нет. Я бы предложит использовать команды для организации кроссфункционального взаимодействия. Например, в вашем IT департаменте есть два отдела: сети и ПО. В каждом отделе есть руководитель, ведущий инженер и специалист. Отделы создаем через иерархическую структуру Организации (что при необходимости позволит разграничить доступ к КЕ), а в командах создаем “1-ю линию”, “2-ю линию” и “Руководство”, куда помещаем соответственно специалистов, ведущих и руководителей отделов. В последствии можно будет легко посчитать, сколько тикетов решили специалисты, а сколько дошло до верхов. Процент тикетов, решенных специалистами той или иной квалификации, является одним из ключевых показателей работы сервисдеска.
Команды используются, когда разные клиенты обслуживаются разными специалистами одних и тех же отделов. Для каждого клиента в iTop определяется модель предоставления услуг, в которой перечисляются команды и персоны, задействованные в предоставлении услуг данному клиенту.


Не выбирается услуга при создании инцидента или запроса
#7

В общем это нужно, т.к. при синхронизации из АД я не могу синхронизировать team list, а подобное поле, как team id, могу.


#8

Ясно, спасибо за разъяснение, что-то не догадался там прочитать.

Вот тут не понял, что Вы имели ввиду…

Насколько я понял указания отдела для сотрудника, в функционале “из коробки”, все же нет.
Тогда, наверное, проще создать в модуле “персона” поле с выпадающим списком и назвать его “Отдел”, как считаете?


#9

Или имеете ввиду, что отдел создается в модуле “организация”? т.е. каждый отдел - это одна организация, а название компании могу отнести к вышестоящей организации. Я правильно понял? это так реализовано в itop?


#10

Я не говорил про отдел. Я говорил про команды. Наличие отдела “из коробки” зачисит от того, что вы понимаете по отделом и как собираетесь его использовать.
Если нужно разграничение доступа к объектам в системе (за сеть одни отвечают, за серверы другие и тд), отражение организационной структуры, создавайте отделы как организации. Это в меню Административных данных -> Организации. Делайте отделы доченими по отношению к головной организации и выбирайте их в персонах.
Если нужно одну услугу оказывать одним отделом, другую – другим, делайте отделами команды и распределяйте персоны по командам.
Полагаю, применительно к ad первый вариант предпочтительнее, он проще для синхронизации и логичнее, поскольку не специфические ad функции, связанные с оказанием услуг оставляет целиком внутри iTop.


#11

Ок, спасибо. Понимание теперь есть.


#12

5 сообщений перенесены в новую тему: Отделы в iTop: Команды или Организации?


Отделы в iTop: Команды или Организации?
#13

Добрый день.
Подскажите пожалуйста, мне необходимо добавить отчество для персоны.
Выше в теме я увидел код но куда его вставлять я так и не разобрался.
Я так понял надо делать новый модуль или же редактировать уже имеющийся?
Так же вопрос, в какой директории лежат уже готовые модули?.
С уважением.


#14

Добрый день, @dima_Golovanev. Вот тут есть пошаговая инструкция по добавлению нового поля к Серверу. С Персоной всё аналогично, за исключением типа поля: вместо AttributeText нужно использовать AttributeString. Про типы полей смотри тут: https://wiki.openitop.org/doku.php?id=2_1_0:customization:xml_reference#fields. Весь код пишется в собственном модуле, модуль кладется в папку itop/extensions и устанавливается в iTop через процедуру установки. Это всё рассмотрено в инструкции по первой ссылке.


#15

Да там есть одна засада, привожу кусок кода из config-itop.php в качестве пример как надо сделать.

    'authent-ldap' => array (
	'host' => '<полное имя домен-контроллера в виде name.domain.tld>',
	'port' => 389,
	'default_user' => '<domain\user>', \\ А вот тут - сокращенное имя домена!
	'default_pwd' => '<password>',
	'base_dn' => 'DC=domain,DC=tld',
	'user_query' => '(&(samaccountname=%1$s))', \\ Тут тоже надо убрать лишнее
	'options' => array (
	  17 => 3,
	  8 => 0,
	),
	'start_tls' => false,
	'debug' => false,
),

Вообщем ключевых момента два - использовать в качестве имени пользователя для доступа к LDAP нотацию domainname\username, а не просто username как можно подумать исходя из документации и два - убрать все лишнее из user_query, приведя ее к виду как выше, а не как в примерах.
Ну и указать два домен-контроллера у меня не получилось - если указывать как в документации. через пробел, то ничего не работает.


Отделы в iTop: Команды или Организации?
#16

@Irsi

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

'host' => 'domain.ru',

тогда DNS случайным образом будет возвращать один из контроллеров домена.

В user_query лучше добавить фильтр по пользователям

'user_query' => '(&(samaccountname=%1$s)(objectCategory=User))',

#17

Вот в таком виде почему-то не работает авторизация.


#18

У Вас пользователь внутри itop создан, как ldap пользователь или как external?

Сквозная то работает нормально, но пользователь у меня создан в itop как external, т.е. для itop пользователь в нашем ad - является внешним.
в default_user я прописал пользователя в виде user@domain

Можно было бы так и оставить, проблема только в том, что при использовании скрипта ad_import для синхронизации из ad, синхронизируются только пользователи, созданные в itop как ldap пользователи, а не как external.


#19

Для авторизации через AD пользователь в ITOP должен быть типа LDAP, тогда все работает отлично.


#20

У меня работает сквозная авторизация через AD только если пользователь external и в настройках соответсвенно стоит:

‘allowed_login_types’ => ‘external|basic|form’

'authent-ldap' => array (
	'host' => 'ad ip',
	'port' => 389,
	'default_user' => 'userxxx@xx.xxx.local',
	'default_pwd' => 'pw',
	'base_dn' => 'dc=xx,dc=xxx,dc=local',
	'user_query' => '(samaccountname=%1$s)',
	'options' => array (
	  17 => 3,
	  8 => 0,
	),
	'start_tls' => false,
	'debug' => true,

тип входа external

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

Если говорите, что оно должно работать для ldap пользователей, то как?