Подготовка
Предварительные требования (пререквизиты)
Требования настоящего раздела выполняются и проверяются до начала работ. Все последующие разделы предполагают, что пререквизиты выполнены в полном объёме.
Рабочая станция миграции и 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
-
Исполняемый файл
syncIMAPMailкопируется на воркер и устанавливается:scp syncIMAPMail migrator@worker01.example.com:/tmp/syncIMAPMail ssh migrator@worker01.example.com sudo install -m 755 /tmp/syncIMAPMail /usr/local/bin/syncIMAPMail -
Настраивается правило
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 -
Устанавливается stunnel из репозитория дистрибутива.
-
В GUI путь к утилите указывается в Connections → Migration utility runners → Edit → Remote CLI:
/usr/local/bin/syncIMAPMail. Для каждого воркера заводится отдельный SSH-раннер (host, SSH key, Use sudo). Раннеры включаются, локальный раннер при этом отключается автоматически — режимы взаимоисключающие.
Подготовка воркера для ivatool_ews2imail
-
В GUI отмечается Run migration on Linux worker, вводятся SSH host воркера, порт 22, имя пользователя migrator и путь к закрытому SSH-ключу.
-
При первом запуске отмечается Copy Linux worker to remote — исполняемый файл
ivatool_ews2imail_jumpзагружается на воркер автоматически. -
Нажимается 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. Права назначаются на вкладке Права администрирования в установках аккаунта:
-
Открывается панель администратора IVA Mail, выполняется переход в установки аккаунта migrator.
-
Выбирается вкладка Права администрирования.
-
Отмечаются права: «Администратор домена», «Можно читать все настройки домена», «Можно изменять все настройки домена». Данные права обеспечивают чтение списка объектов (ObjectsList), назначение прав доступа (MailboxUpdateACL, CalendarUpdateACL, AccountACL), управление составом групп (GroupAddAccount) и импорт данных от лица пользователей через CMD и JUMP.
Контрольная проверка готовности (preflight)
До начала продуктивной миграции на контрольном наборе из двух пользователей выполняется проверка штатными средствами утилит.
-
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 сам по себе ошибкой не считается. -
ivatool_ews2imail. В GUI нажимается Preflight checks; проверки выполняются на Linux-воркере. По первому аккаунту списка проверяются: CMD — подключение, аутентификация и наличие целевого аккаунта, JUMP --вход по HTTPS; EWS — доступность Exchange, аутентификация и совместимая версия сервера. Результат отображается по каждой проверке.
-
При любом отрицательном результате соответствующий доступ или учётная запись приводятся в требуемое состояние, проверка повторяется. Продуктивная миграция начинается только после успешного прохождения всех проверок.
Сбор исходных данных
Сбор выполняется из Microsoft Exchange и Active Directory сервисной учётной записью в указанном порядке. Результат раздела — заполненные входные файлы утилит (форматы — раздел Обработка ошибок, реестр исключений и входные файлы) и ведомость прав доступа.
Сведения о пользователях
-
На сервере управления Exchange открывается Exchange Management Shell.
-
Выполняется выгрузка пользовательских почтовых ящиков:
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 -
Файл
users.csvпередаётся в подготовку входных файлов (раздел Верификация и подготовка входных файлов). Состав выгрузки: основной адрес, дополнительные адреса, отображаемое имя, фамилия, имя, отчество (при наличии), должность, подразделение, телефон, имя и домен аутентификации.
Сведения об иных объектах
-
Выгружаются общие, ресурсные ящики, статические группы, контакты и почтовые пользователи:
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 -
Выгружаются динамические группы рассылки с условиями членства:
Get-DynamicDistributionGroup -ResultSize Unlimited | Select PrimarySmtpAddress,DisplayName,RecipientFilter, RecipientContainer | Export-Csv .\dynamic_groups.csv -NoTypeInformation -Encoding UTF8 -
Перенос условий динамических групп. В 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" -
Группы, собираемые по RecipientContainer. Если сбор членов выполняется по RecipientContainer без дополнительной фильтрации по типу объекта, в состав попадают также контакты. Для таких групп при переносе условия в фильтр справочника добавляется ограничение по типу объекта «аккаунт»; контакты, требующие получения рассылки, включаются в группу статически по адресу (GroupAddAccount с параметром true).
Сбор сведений о правах доступа и делегировании, деление на партии
Сведения о совместном доступе выгружаются до перевода пользователей и используются для двух целей: деления пользователей на партии и восстановления прав в IVA Mail (раздел Восстановление прав доступа и делегирования).
Выгрузка прав
-
Права 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 -
Права 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 -
Права на папки и календари (цикл по всем мигрируемым ящикам):
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 -
Из четырёх файлов формируется единая ведомость прав
acl_registry.csv(UTF-8, разделитель «запятая») с колонками: Владелец (объект доступа), Субъект, Тип права (FullAccess / SendAs / SendOnBehalf / Folder / Calendar), Папка, Уровень Exchange.
Деление пользователей на партии по связям доступа
-
Каждая строка ведомости acl_registry.csv рассматривается как связь «Владелец — Субъект».
-
Пользователи, соединённые связями (напрямую или через цепочку связей, включая общие и ресурсные ящики), объединяются в одну группу связности. Группа связности целиком включается в одну партию миграции: связки «руководитель — ассистент», пользователи одного общего ящика, пользователи с взаимным доступом к папкам и календарям не разделяются между партиями.
-
Общий почтовый ящик включается в ту же партию, что и все пользователи, имеющие права на него по ведомости. Ресурсный ящик включается в партию совместно со всеми пользователями, имеющими к нему доступ.
-
Группы связности, не связанные между собой, распределяются по партиям с учётом объёма ящиков, организационной структуры и допустимого окна работ (раздел Формирование очерёдности).
Верификация и подготовка входных файлов
-
По выгрузкам разделов Сведения о пользователях--Сбор сведений о правах доступа и делегировании, деление на партии заполняются входные файлы утилит: CSV для
syncIMAPMailи CSV дляivatool_ews2imail(форматы и примеры — раздел Обработка ошибок, реестр исключений и входные файлы), а также ведомость правacl_registry.csv. -
Перечни проверяются на полноту, отсутствие дублирующихся адресов, корректность атрибутов и соответствие правилам именования IVA Mail.
-
Проверка средствами утилит. В GUI
ivatool_ews2imailвыполняется Load / preview list: список разбирается и отображается в таблице Users Progress со статусом Pending, пустые и дублирующиеся записи подсвечиваются. В GUIsyncIMAPMailсписок импортируется на вкладке Users, строки с ошибками подсвечиваются в таблице. -
Выявленные расхождения устраняются в файлах, загрузка повторяется. К следующему разделу файлы принимаются без подсвеченных ошибок.