IVA ДОКУМЕНТАЦИЯ ОБНОВЛЕНИЯ

Подготовка

Предварительные требования (пререквизиты)

Требования настоящего раздела выполняются и проверяются до начала работ. Все последующие разделы предполагают, что пререквизиты выполнены в полном объёме.

Рабочая станция миграции и Linux-воркеры

Для миграции выделяются рабочая станция под управлением Windows и Linux-воркеры. На рабочей станции запускаются графические оболочки утилит миграции (SyncIMAPMailGui.exe и GUI ivatool_ews2imail), консольные версии утилит выполняются на Linux-воркерах, размещённых в сетевой близости к серверам Exchange и IVA Mail. Запуск, очередь, параллелизм и журналы воркеров контролируются из GUI на рабочей станции. Количество воркеров определяет уровень параллелизма IMAP-переноса: один SSH-раннер выполняет одну миграцию за раз (раздел Перенос содержимого почтового ящика (syncIMAPMail, IMAP)).

Рабочая станция миграции (Windows):

Ресурс Требование

ОС

Windows 10/11 x64, Windows Server 2013 / 2016 / 2019

vCPU / RAM / Диск

4 vCPU, 8 ГБ, SSD 50 ГБ (state.json, журналы, отчёты в папке output рядом с exe)

ПО

SyncIMAPMailGui.exe; GUI ivatool_ews2imail; клиенты OpenSSH ssh/scp в PATH (аутентификация по ключу, BatchMode=yes)

Доступ

Закрытый SSH-ключ для подключения к воркерам

Linux-воркеры (количество равно требуемому уровню параллелизма, для проекта — 3):

Ресурс Требование

ОС

Linux (Astra Linux / РЕД ОС / Ubuntu LTS)

vCPU / RAM / Диск

4 vCPU, 8 ГБ, SSD 100 ГБ (журналы, XML-выгрузки EWS, временные результаты)

ПО

syncIMAPMail в /usr/local/bin; stunnel из репозитория дистрибутива; sshd с аутентификацией по ключу

Учётная запись

Пользователь migrator с правилом NOPASSWD sudo (см. ниже)

Подготовка воркера для syncIMAPMail

  1. Исполняемый файл syncIMAPMail копируется на воркер и устанавливается:

    scp syncIMAPMail migrator@worker01.example.com:/tmp/syncIMAPMail
    ssh migrator@worker01.example.com
    sudo install -m 755 /tmp/syncIMAPMail /usr/local/bin/syncIMAPMail
  2. Настраивается правило NOPASSWD sudo (иначе preflight завершается ошибкой на запросе пароля sudo):

    sudo visudo -f /etc/sudoers.d/syncimapmail-gui
    # содержимое файла:
    migrator ALL=(root) NOPASSWD: /usr/local/bin/syncIMAPMail, /usr/bin/test, /usr/bin/stunnel
  3. Устанавливается stunnel из репозитория дистрибутива.

  4. В GUI путь к утилите указывается в Connections → Migration utility runners → Edit → Remote CLI: /usr/local/bin/syncIMAPMail. Для каждого воркера заводится отдельный SSH-раннер (host, SSH key, Use sudo). Раннеры включаются, локальный раннер при этом отключается автоматически — режимы взаимоисключающие.

Подготовка воркера для ivatool_ews2imail

  1. В GUI отмечается Run migration on Linux worker, вводятся SSH host воркера, порт 22, имя пользователя migrator и путь к закрытому SSH-ключу.

  2. При первом запуске отмечается Copy Linux worker to remote — исполняемый файл ivatool_ews2imail_jump загружается на воркер автоматически.

  3. Нажимается Test remote, подключение подтверждается до запуска миграции. GUI транслирует журналы воркера в интерфейс, Stop завершает воркер по PID.

Сетевые доступы

Обеспечивается сетевой доступ в объёме таблицы. Таблица является пререквизитом и согласуется до начала работ.

Источник → Назначение Порт Протокол Назначение

Рабочая станция → воркеры

22

SSH

Управление раннерами и воркером, копирование файлов и журналов

Рабочая станция → IVA Mail

106

CMD

Проверка наличия целевых объектов (Check existing)

Воркеры → Exchange

993

IMAPS

Чтение содержимого ПЯ через stunnel

Воркеры → Exchange

143

IMAP

Чтение содержимого ПЯ (резервный вариант без TLS)

Воркеры → IVA Mail

143

IMAP

Запись содержимого ПЯ в целевую систему

Воркеры → Exchange

443

HTTPS/EWS

Выгрузка календарей и контактов

Воркеры → IVA Mail

106 / 8106

CMD / CMD TLS

Preflight, импорт контактов, назначение прав

Воркеры → IVA Mail

443

JUMP HTTPS

Импорт календарных объектов

Сервисные учётные записи

Подготавливаются две сервисные учётные записи: одна в Microsoft Exchange и одна в IVA Mail. Каждая из них используется обеими утилитами — и для IMAP-переноса содержимого, и для EWS-переноса календарей и контактов.

Сервисная учётная запись Microsoft Exchange

Учётной записи migrator@exchange.example.com назначаются:

  • роль Full Access на почтовые ящики пользователей, подлежащих миграции, — для чтения содержимого по IMAP;

  • роль RBAC ApplicationImpersonation — для доступа к календарям и контактам мигрируемых пользователей через Exchange Impersonation по EWS.

Назначение выполняется в Exchange Management Shell:

# Full Access на ящики мигрируемых пользователей (по списку users.csv)
Import-Csv .\users.csv | ForEach-Object {
  Add-MailboxPermission -Identity $_.PrimarySmtpAddress `
    -User migrator@exchange.example.com -AccessRights FullAccess `
    -InheritanceType All -AutoMapping $false }

# ApplicationImpersonation
New-ManagementRoleAssignment -Name "IVA-Migration-Impersonation" `
  -Role ApplicationImpersonation -User migrator@exchange.example.com

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

Сервисный аккаунт IVA Mail

Аккаунт migrator создаётся в панели администратора IVA Mail. Права назначаются на вкладке Права администрирования в установках аккаунта:

  1. Открывается панель администратора IVA Mail, выполняется переход в установки аккаунта migrator.

  2. Выбирается вкладка Права администрирования.

  3. Отмечаются права: «Администратор домена», «Можно читать все настройки домена», «Можно изменять все настройки домена». Данные права обеспечивают чтение списка объектов (ObjectsList), назначение прав доступа (MailboxUpdateACL, CalendarUpdateACL, AccountACL), управление составом групп (GroupAddAccount) и импорт данных от лица пользователей через CMD и JUMP.

Контрольная проверка готовности (preflight)

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

  1. syncIMAPMail. В GUI выполняется Connections → Test selected для каждого SSH-раннера, затем общий Run preflight на Dashboard. Проверка выполняет sudo -n true и sudo -n test -x /usr/local/bin/syncIMAPMail, затем реальный запуск remote stunnel: на воркере создаётся временная конфигурация, выполняется подключение к 127.0.0.1:<remote port> и ожидается IMAP greeting через TLS-туннель. Успешная проверка выводит syncimap-stunnel-ok и syncimap-runner-ok, диагностический журнал stunnel сам по себе ошибкой не считается.

  2. ivatool_ews2imail. В GUI нажимается Preflight checks; проверки выполняются на Linux-воркере. По первому аккаунту списка проверяются: CMD — подключение, аутентификация и наличие целевого аккаунта, JUMP --вход по HTTPS; EWS — доступность Exchange, аутентификация и совместимая версия сервера. Результат отображается по каждой проверке.

  3. При любом отрицательном результате соответствующий доступ или учётная запись приводятся в требуемое состояние, проверка повторяется. Продуктивная миграция начинается только после успешного прохождения всех проверок.

Сбор исходных данных

Сбор выполняется из Microsoft Exchange и Active Directory сервисной учётной записью в указанном порядке. Результат раздела — заполненные входные файлы утилит (форматы — раздел Обработка ошибок, реестр исключений и входные файлы) и ведомость прав доступа.

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

  1. На сервере управления Exchange открывается Exchange Management Shell.

  2. Выполняется выгрузка пользовательских почтовых ящиков:

    Get-Mailbox -ResultSize Unlimited -RecipientTypeDetails UserMailbox |
      Select-Object PrimarySmtpAddress,
        @{n='Aliases';e={($_.EmailAddresses |
          Where-Object {$_.PrefixString -ceq 'smtp'} |
          ForEach-Object {$_.SmtpAddress}) -join ';'}},
        DisplayName, LastName, FirstName, Title, Department, Phone,
        SamAccountName,
        @{n='Domain';e={$_.UserPrincipalName.Split('@')[1]}} |
      Export-Csv .\users.csv -NoTypeInformation -Encoding UTF8
  3. Файл users.csv передаётся в подготовку входных файлов (раздел Верификация и подготовка входных файлов). Состав выгрузки: основной адрес, дополнительные адреса, отображаемое имя, фамилия, имя, отчество (при наличии), должность, подразделение, телефон, имя и домен аутентификации.

Сведения об иных объектах

  1. Выгружаются общие, ресурсные ящики, статические группы, контакты и почтовые пользователи:

    Get-Mailbox -ResultSize Unlimited -RecipientTypeDetails `
      SharedMailbox,RoomMailbox,EquipmentMailbox |
      Select PrimarySmtpAddress,DisplayName,RecipientTypeDetails |
      Export-Csv .\objects.csv -NoTypeInformation -Encoding UTF8
    
    Get-DistributionGroup -ResultSize Unlimited |
      Select PrimarySmtpAddress,DisplayName,RecipientTypeDetails |
      Export-Csv .\groups.csv -NoTypeInformation -Encoding UTF8
    
    Get-DistributionGroup -ResultSize Unlimited | ForEach-Object {
      $g=$_; Get-DistributionGroupMember $g -ResultSize Unlimited |
      Select @{n='Group';e={$g.PrimarySmtpAddress}},PrimarySmtpAddress } |
      Export-Csv .\group_members.csv -NoTypeInformation -Encoding UTF8
    
    Get-Recipient -ResultSize Unlimited -RecipientTypeDetails `
      MailUser,MailContact |
      Select PrimarySmtpAddress,ExternalEmailAddress,DisplayName |
      Export-Csv .\contacts.csv -NoTypeInformation -Encoding UTF8
  2. Выгружаются динамические группы рассылки с условиями членства:

    Get-DynamicDistributionGroup -ResultSize Unlimited |
      Select PrimarySmtpAddress,DisplayName,RecipientFilter,
        RecipientContainer |
      Export-Csv .\dynamic_groups.csv -NoTypeInformation -Encoding UTF8
  3. Перенос условий динамических групп. В IVA Mail динамический состав группы задаётся настройкой DynamicMembersUri: при получении списка участников к статическим членам добавляется результат запроса к справочнику. Для каждой динамической группы условие RecipientFilter преобразуется в фильтр справочника, и после заведения группы через IVA ID её настройка задаётся командой CMD:

    ObjectSetSetting "domain.ru" "dg-sales" "DynamicMembersUri"
      "directory://?base_dn=$domaindn&scope=sub&mail_field=mail
       &filter=(department=Sales)"
    ObjectSetSetting "domain.ru" "dg-sales" "DynamicMembersCacheTime" "/D 1h"
  4. Группы, собираемые по RecipientContainer. Если сбор членов выполняется по RecipientContainer без дополнительной фильтрации по типу объекта, в состав попадают также контакты. Для таких групп при переносе условия в фильтр справочника добавляется ограничение по типу объекта «аккаунт»; контакты, требующие получения рассылки, включаются в группу статически по адресу (GroupAddAccount с параметром true).

Сбор сведений о правах доступа и делегировании, деление на партии

Сведения о совместном доступе выгружаются до перевода пользователей и используются для двух целей: деления пользователей на партии и восстановления прав в IVA Mail (раздел Восстановление прав доступа и делегирования).

Выгрузка прав

  1. Права Full Access:

    Get-Mailbox -ResultSize Unlimited | Get-MailboxPermission |
      Where-Object { $_.IsInherited -eq $false -and
        $_.User -notlike 'NT AUTHORITY\*' -and
        $_.AccessRights -contains 'FullAccess' } |
      Select Identity,User,AccessRights |
      Export-Csv .\acl_fullaccess.csv -NoTypeInformation -Encoding UTF8
  2. Права Send As и Send on Behalf:

    Get-Mailbox -ResultSize Unlimited | Get-RecipientPermission |
      Where-Object { $_.Trustee -notlike 'NT AUTHORITY\*' } |
      Select Identity,Trustee,AccessRights |
      Export-Csv .\acl_sendas.csv -NoTypeInformation -Encoding UTF8
    
    Get-Mailbox -ResultSize Unlimited |
      Where-Object { $_.GrantSendOnBehalfTo } |
      Select PrimarySmtpAddress,
        @{n='OnBehalf';e={$_.GrantSendOnBehalfTo -join ';'}} |
      Export-Csv .\acl_onbehalf.csv -NoTypeInformation -Encoding UTF8
  3. Права на папки и календари (цикл по всем мигрируемым ящикам):

    Import-Csv .\users.csv | ForEach-Object {
      $mbx = $_.PrimarySmtpAddress
      foreach ($folder in @(':\Inbox', ':\Calendar')) {
        Get-MailboxFolderPermission -Identity ($mbx + $folder) `
          -ErrorAction SilentlyContinue |
        Where-Object { $_.User.DisplayName -notin 'Default','Anonymous' } |
        Select @{n='Mailbox';e={$mbx}},@{n='Folder';e={$folder}},
          User,AccessRights } } |
      Export-Csv .\acl_folders.csv -NoTypeInformation -Encoding UTF8
  4. Из четырёх файлов формируется единая ведомость прав acl_registry.csv (UTF-8, разделитель «запятая») с колонками: Владелец (объект доступа), Субъект, Тип права (FullAccess / SendAs / SendOnBehalf / Folder / Calendar), Папка, Уровень Exchange.

Деление пользователей на партии по связям доступа

  1. Каждая строка ведомости acl_registry.csv рассматривается как связь «Владелец — Субъект».

  2. Пользователи, соединённые связями (напрямую или через цепочку связей, включая общие и ресурсные ящики), объединяются в одну группу связности. Группа связности целиком включается в одну партию миграции: связки «руководитель — ассистент», пользователи одного общего ящика, пользователи с взаимным доступом к папкам и календарям не разделяются между партиями.

  3. Общий почтовый ящик включается в ту же партию, что и все пользователи, имеющие права на него по ведомости. Ресурсный ящик включается в партию совместно со всеми пользователями, имеющими к нему доступ.

  4. Группы связности, не связанные между собой, распределяются по партиям с учётом объёма ящиков, организационной структуры и допустимого окна работ (раздел Формирование очерёдности).

Верификация и подготовка входных файлов

  1. По выгрузкам разделов Сведения о пользователях--Сбор сведений о правах доступа и делегировании, деление на партии заполняются входные файлы утилит: CSV для syncIMAPMail и CSV для ivatool_ews2imail (форматы и примеры — раздел Обработка ошибок, реестр исключений и входные файлы), а также ведомость прав acl_registry.csv.

  2. Перечни проверяются на полноту, отсутствие дублирующихся адресов, корректность атрибутов и соответствие правилам именования IVA Mail.

  3. Проверка средствами утилит. В GUI ivatool_ews2imail выполняется Load / preview list: список разбирается и отображается в таблице Users Progress со статусом Pending, пустые и дублирующиеся записи подсвечиваются. В GUI syncIMAPMail список импортируется на вкладке Users, строки с ошибками подсвечиваются в таблице.

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