Методика миграции корпоративной почтовой системы
Общие положения
Настоящий документ определяет порядок подготовки, выполнения и контроля миграции пользователей, почтовых данных, календарных объектов, личных контактов и связанных объектов адресации из Microsoft Exchange Server и Microsoft Active Directory в систему IVA Mail (IVA One).
Документ является методикой с фиксированным алгоритмом действий. Каждый этап выполняется в указанном порядке. Приведённые имена серверов, доменов и учётных записей являются условными значениями и заменяются на фактические значения проекта без изменения последовательности действий.*
Порядок заведения объектов в целевой системе
Учётные записи, ресурсные аккаунты, группы и переадресаторы в IVA Mail создаются компонентом MailConnector на основании записей IVA ID. В рамках настоящей методики объекты в IVA Mail не создаются: перед запусками миграции выполняется проверка их наличия (Проверка наличия целевых объектов в IVA Mail). Выявленные отсутствующие объекты заводятся записями в IVA ID, после чего проверка повторяется.
Миграция охватывает перевод корпоративной почтовой системы в целом, включая переключение маршрутизации почты, настройку коннекторов приёма и отправки, изменение внутренних и внешних DNS-записей, а также настройку промежуточных SMTP-доменов в объёме, необходимом для переходного периода (Переключение маршрутизации и сосуществование систем).
Сопоставление объектов Exchange и IVA Mail
Объекты домена IVA Mail: аккаунт (LocalAccount), ресурсный аккаунт (Resource), группа (LocalGroup), переадресатор (LocalForwarder). Каждый объект имеет уникальный идентификатор UID, основное имя и дополнительные имена (псевдонимы).
Категории объектов Exchange сопоставляются объектам IVA Mail следующим образом:
| Объект Exchange | Объект IVA Mail |
|---|---|
UserMailbox |
Аккаунт (LocalAccount) |
SharedMailbox |
Аккаунт (LocalAccount) с совместным доступом через ACL |
RoomMailbox |
Ресурсный аккаунт (Resource) с настройкой ResourceType = Room |
EquipmentMailbox |
Ресурсный аккаунт (Resource) с настройкой ResourceType = Mailbox |
DistributionGroup, MailUniversalSecurityGroup (используемая как группа рассылки) |
Группа (LocalGroup) со статическим списком членов |
DynamicDistributionGroup |
Группа (LocalGroup) с настройкой DynamicMembersUri (динамический состав по запросу к справочнику) |
RoomList |
Группа (LocalGroup), объединяющая ресурсные аккаунты |
MailUser, Contact |
Переадресатор (LocalForwarder) на внешний адрес |
Дополнительные (proxy) адреса |
Дополнительное имя объекта (псевдоним), либо переадресатор — по правилу раздела Обработка дополнительных адресов |
Обработка дополнительных адресов
В Microsoft Exchange основной адрес ответа и дополнительные (proxy) адреса принадлежат одной сущности — почтовому ящику. В IVA Mail каждый дополнительный адрес обрабатывается по доменному признаку:
-
Совпадение домена. Если доменная часть дополнительного адреса совпадает с доменной частью основного адреса, дополнительный адрес заводится как дополнительное имя (псевдоним) аккаунта.
-
Отличие домена. Если доменная часть отличается, в соответствующем домене заводится переадресатор, указывающий на основной адрес аккаунта.
Переадресатор — объект домена, привязанный к имени и содержащий адрес электронной почты: все сообщения, направленные на имя переадресатора, перенаправляются на этот адрес. Пример: в домене anotherdom.com заводится переадресатор useralias → user@dom.com. При маршрутизации адреса useralias@anotherdom.com система находит локальный аккаунт user@dom.com и далее работает с ним, включая все настройки и политики. Аккаунт user использует адрес useralias@anotherdom.com в качестве адреса «от кого» согласно политике. Фактически это «алиас в другом домене».
Пример. Основной адрес user@dom.com, дополнительные — useralias@dom.com и user@anotherdom.com. Аккаунту user заводится псевдоним useralias, а в домене anotherdom.com — переадресатор user, ведущий на user@dom.com.
Используемые средства миграции
Перенос данных выполняется двумя утилитами по типу данных: содержимое почтовых ящиков переносится по IMAP, календари и личные контакты — по EWS. Обе утилиты управляются из графических оболочек на рабочей станции миграции; перенос выполняется на удалённых Linux-воркерах (раздел Рабочая станция миграции и Linux-воркеры).
| Утилита | Назначение и протокол |
|---|---|
|
Перенос содержимого почтовых ящиков (письма, папки) по протоколу IMAP/IMAPS. Управляется из GUI |
|
Перенос календарных объектов и личных книг контактов по протоколу EWS с импортом в IVA Mail через HTTP API JUMP (календари) и IVA CMD (контакты и структура папок). Управляется из GUI, исполняемый файл |
CMD API IVA Mail и HTTP API JUMP — встроенные интерфейсы продукта IVA Mail, установка отдельных пакетов не требуется. CMD используется для проверки объектов, импорта контактов и назначения прав (порт 106, при включённом TLS — 8106). Календари импортируются через JUMP, поскольку у CMD действует практический лимит около 2 МБ на команду, и события с крупными вложениями через CMD не проходят.
stunnel — компонент, применяемый утилитой syncIMAPMail для организации TLS-туннеля при доступе к исходной системе по IMAPS (порт 993): syncIMAPMail не поддерживает TLS/STARTTLS напрямую. stunnel устанавливается на Linux-воркеры из штатного репозитория используемого дистрибутива. Для ivatool_ews2imail stunnel не требуется: шифрование EWS (HTTPS) и JUMP (HTTPS) задаётся параметрами утилиты.
Предварительные требования (пререквизиты)
Требования настоящего раздела выполняются и проверяются до начала работ. Все последующие разделы предполагают, что пререквизиты выполнены в полном объёме.
Рабочая станция миграции и 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, строки с ошибками подсвечиваются в таблице. -
Выявленные расхождения устраняются в файлах, загрузка повторяется. К следующему разделу файлы принимаются без подсвеченных ошибок.
Проверка наличия целевых объектов в IVA Mail
Объекты IVA Mail (аккаунты, ресурсные аккаунты, группы, переадресаторы) создаются компонентом MailConnector на основании записей IVA ID. Перед запусками миграции выполняется проверка наличия целевых объектов, создание объектов средствами миграции не выполняется.
-
Проверка списком. В GUI syncIMAPMail на вкладке IVAMail setup для выбранной партии нажимается Check existing: по каждому объекту входного списка проверяется наличие в IVA Mail через CMD.
-
Проверка по CMD. Полный перечень объектов домена с типами, именами и псевдонимами выгружается командой ObjectsList; дополнительные имена конкретного объекта проверяются командой ObjectListNames:
ObjectsList "domain.ru" false ObjectListNames "domain.ru" "user01" -
Проверка перед EWS-переносом. Preflight checks утилиты ivatool_ews2imail проверяет наличие целевого аккаунта через IVA CMD по первому аккаунту списка; по остальным аккаунтам наличие проверяется автоматически при запуске миграции (этап Preflight по каждому аккаунту).
-
Обработка отсутствующих объектов. Перечень объектов, отсутствующих в IVA Mail, а также объектов с недостающими псевдонимами передаётся администратору IVA ID для заведения записей. После создания объектов компонентом MailConnector проверка повторяется. Миграция партии начинается только при полном наличии целевых объектов партии.
Переключение маршрутизации и сосуществование систем
Для совместной работы Microsoft Exchange и IVA Mail в переходный период настраиваются два механизма маршрутизации. Exchange остаётся первым в каскаде серверов и взаимодействует с внешней средой через внешний шлюз (KSMG/Sandbox) до завершающего этапа.
Настройка механизмов маршрутизации
Механизм 1 — внешний контакт в Exchange для каждого переводимого пользователя. Для маршрутизации используется промежуточный SMTP-домен ivamail-relay.domain.ru, обслуживаемый IVA Mail. Настройка выполняется один раз для домена и далее по партии пользователей:
-
В IVA Mail домену domain.ru добавляется дополнительное имя ivamail-relay.domain.ru: в панели администратора на странице Объекты домена в поле «Добавить имя домена» вводится имя, нажимается «Добавить имя домена».
-
В Exchange создаётся Send-коннектор для промежуточного домена с доставкой на IVA Mail:
New-SendConnector -Name "To-IVAMail" ` -AddressSpaces "ivamail-relay.domain.ru" ` -SmartHosts "iva.domain.ru" -DNSRoutingEnabled $false ` -SourceTransportServers "EXCH01" -
Для каждого пользователя партии на шаге завершения перевода (раздел Завершение перевода пользователя) создаётся внешний контакт, указывающий на адрес доставки в промежуточном домене:
New-MailContact -Name "User 01 (IVA)" `
-ExternalEmailAddress user01@ivamail-relay.domain.ru
Set-MailContact "User 01 (IVA)" -EmailAddresses `
@{add="smtp:user01@domain.ru"} -EmailAddressPolicyEnabled $false
Механизм 2 — доменное правило IVA Mail для обработки неизвестных адресов с явной переадресацией на Exchange. Настройка RerouteUnknownMail задаёт адрес назначения для почты на адреса, не найденные в домене; макрос \U заменяется на ненайденное имя. Правило задаётся командой CMD:
DomainSetSetting "domain.ru" "RerouteUnknownMail"
"\U@exchange.domain.ru"
В результате почта пользователей IVA Mail в адрес ещё не переведённых получателей доставляется в Exchange, а почта в адрес переведённых пользователей доставляется в IVA Mail напрямую (адрес найден в домене). Имя exchange.domain.ru заводится как SMTP-домен доставки на стороне Exchange (accepted domain, internal relay).
Коннекторы, внешние системы и DNS
Переключение выполняется в следующем порядке:
-
Коннектор приёма Exchange. На серверах Exchange создаётся Receive-коннектор, разрешающий приём с IP-адресов кластера IVA Mail (тип Internet, RemoteIPRanges = адреса IVA Mail), — для доставки почты из IVA Mail в Exchange по правилу RerouteUnknownMail и через переадресаторы.
-
Приём в IVA Mail. На стороне IVA Mail в настройках модуля SMTP разрешается приём соединений с IP-адресов серверов Exchange для промежуточного домена
ivamail-relay.domain.ru. -
Внешние системы и устройства. По перечню, полученному на обследовании, прикладные системы, МФУ и устройства, отправляющие почту через Exchange, переключаются на IVA Mail: в каждой системе адрес SMTP-сервера заменяется на iva.domain.ru (порт 25, при поддержке — 465 с аутентификацией), для систем с аутентификацией заводятся служебные аккаунты в IVA Mail.
-
Внешняя почта (KSMG). После завершения миграции всех партий маршрут доставки внешней входящей почты на внешнем шлюзе KSMG переключается с Exchange на IVA Mail; исходящая почта IVA Mail направляется через KSMG. До этого шага внешняя почта продолжает поступать в Exchange и доставляется переведённым пользователям по механизму контактов.
-
DNS. На завершающем этапе изменяются DNS-записи: MX почтовых доменов переводятся на KSMG/IVA Mail согласно целевой схеме; записи autodiscover заменяются записями автоконфигурации клиентов IVA Mail; SPF дополняется адресами IVA Mail до первого переключения исходящей почты; DKIM-подписание переносится на IVA Mail/KSMG одновременно с переключением исходящего потока; внутренние A-записи серверов Exchange сохраняются до вывода Exchange из эксплуатации.
Миграция партии пользователей
Формирование очередности
-
За основу деления принимаются группы связности, построенные по ведомости прав
acl_registry.csv(раздел Деление пользователей на партии по связям доступа). Группа связности не разделяется между партиями. -
Группы связности распределяются по партиям до достижения целевого размера партии. Размер партии для проекта — до 500 пользователей при трёх воркерах и согласованном окне работ.
-
В план включаются: пилотная партия (10–20 пользователей из числа сотрудников ИТ-подразделения), приоритетные партии, основные партии. Пилотная партия проходит полный цикл разделов Алгоритм обработки партии–Проверка целостности и консистентности данных первой; результаты пилота подтверждаются до запуска основных партий.
Алгоритм обработки партии
-
Сохраняется перечень групп рассылки, в которые включены пользователи партии (из выгрузки group_members.csv раздела Сведения об иных объектах).
-
Выполняется проверка наличия целевых объектов партии (раздел Проверка наличия целевых объектов в IVA Mail).
-
Для каждого пользователя партии выполняется процедура миграции почтового ящика (раздел Миграция почтового ящика).
-
После переноса всех ящиков партии заполняется состав групп рассылки IVA Mail, относящихся к партии: члены добавляются командой GroupAddAccount по выгрузке group_members.csv; для динамических групп задаются настройки DynamicMembersUri (раздел Сведения об иных объектах).
-
Восстанавливаются права доступа и делегирования по партии (раздел Восстановление прав доступа и делегирования).
-
Выполняется проверка результатов по партии (раздел Проверка целостности и консистентности данных).
-
Выполняется информирование пользователей партии о завершении перевода (раздел Информирование пользователей).
Миграция почтового ящика
Процедура выполняется для каждого пользователя партии. Основной объём данных копируется до отключения исходного ящика; после отключения досылаются изменения. Порядок действий фиксирован.
Проверка целевого аккаунта и первичное копирование
-
Подтверждается наличие целевого аккаунта, его псевдонимов и переадресаторов в IVA Mail (раздел Проверка наличия целевых объектов в IVA Mail). Аккаунт создан компонентом MailConnector по записи IVA ID.
-
Утилитой syncIMAPMail выполняется первичное копирование содержимого почтового ящика при активном исходном ящике Exchange (раздел Перенос содержимого почтового ящика (syncIMAPMail, IMAP)).
Перенос содержимого почтового ящика (syncIMAPMail, IMAP)
-
На вкладке Users импортируется входной файл партии (формат — раздел Формат входного файла syncIMAPMail (IMAP)). Режим аутентификации — ServiceAccounts: используются сервисные аккаунты из Connections, source и target выбираются через impersonation и --target ~user/.
-
На вкладке Connections для Source Microsoft Exchange IMAP указывается сервер exchange.domain.ru без порта: подключение выполняется на порт 993 через remote stunnel (сервер без явного порта или с :993 идёт через TLS-туннель). Для Destination указывается iva.domain.ru:143.
-
Устанавливается Parallelism = 3 — по количеству включённых SSH-раннеров. Один SSH-раннер выполняет обработку одного пользователя за раз; очередь пользователей одна, каждый раннер берёт следующего пользователя из общей очереди.
-
На вкладке Mail migration queue проверяется preview команды, нажимается Start. Контроль выполнения ведётся на вкладке Migration log (live stdout/stderr и строки per-user журналов) и на вкладке Logs and failures.
Журналирование и порог ошибок
Для каждого пользователя в журнале фиксируются дата и время запуска, идентификатор пользователя, результат, количество перенесённых объектов и сведения об ошибках. Для проекта устанавливается порог допустимого числа непереносимых элементов: 10 на ящик. При ошибке в пределах порога обработка пользователя завершается с фиксацией элементов в журнале; при превышении порога либо при сбое подключения пользователь помечается как проблемный, вносится в реестр исключений (раздел Реестр исключений), обработка очереди продолжается со следующего пользователя.
Завершение перевода пользователя
-
В Microsoft Exchange создаётся внешний контакт пользователя, указывающий на адрес доставки в промежуточном домене (команды — раздел Настройка механизмов маршрутизации).
-
Проверяется маршрутизация: с действующего ящика Exchange отправляется контрольное письмо на адрес контакта; доставка в ящик IVA Mail подтверждается входом в веб-интерфейс IVA Mail под целевым аккаунтом.
-
Почтовый ящик пользователя в Microsoft Exchange отключается:
Disable-Mailbox -Identity user01@domain.ru -Confirm:$false -
Утилитой
syncIMAPMailповторным запуском по данному пользователю досылаются изменения, накопившиеся в исходном ящике с момента первичного копирования: утилита переносит только отсутствующие в целевом ящике сообщения. -
Внешний контакт включается в группы рассылки, членом которых являлся пользователь (по перечню шага 1 раздела Алгоритм обработки партии):
Add-DistributionGroupMember -Identity "sales-team" ` -Member "User 01 (IVA)" -
Клиентское приложение IVA Mail разворачивается пользователю групповой политикой; параметры подключения включаются в уведомление о переводе (раздел Информирование пользователей).
При невыполнении шага 5 пользователь после перевода не получает сообщения, направляемые на адреса групп рассылки Exchange, членом которых он являлся: при отключении ящика пользовательский объект удаляется из состава групп.
Перенос календарей и контактов (ivatool_ews2imail, EWS)
Выполняется после завершения переноса содержимого ящиков партии, единым запуском по списку партии.
-
В GUI задаются Tool (путь к исполняемому файлу CLI) и Mode = migrate.
-
Заполняется Connections → Servers and admin accounts: Exchange Server = exchange.domain.ru (утилита обращается к https://exchange.domain.ru/EWS/Exchange.asmx); Exchange version = Auto; Admin = migrator@exchange.example.com с паролем; IVA Server = iva.domain.ru, Admin = migrator, Port = 8106, Use TLS включён; Use HTTPS for JUMP включён, JUMP port = 443.
-
Включается Use EWS impersonation — доступ к календарям и контактам пользователей выполняется под сервисной учётной записью с правом ApplicationImpersonation.
-
Задаются параметры миграции: Migrate calendars и Migrate contacts включены; устанавливается All dates — переносятся все элементы календаря независимо от даты; Calendar Bulk Size = 50; Calendar Max Bulk Bytes = 4194304; Contacts Bulk Size = 200. Include empty folders выключен: целевые папки для пустых исходных папок не создаются.
-
В режиме Accounts file (list) указывается CSV партии (формат — раздел Формат входного файла ivatool_ews2imail (EWS)), выполняется Load / preview list, затем Preflight checks.
-
Нажимается Start. Контроль ведётся на вкладке Users Progress: статус каждого ящика в реальном времени, сводка Total / Done / Failed / In progress / Pending над таблицей.
Параллелизм. Утилита обрабатывает пользователей списка в 5 потоков (значение по умолчанию). Журнал по каждому пользователю фиксирует дату и время запуска, идентификатор, результат, количество перенесённых объектов и сведения об ошибках; при ошибке на отдельном пользователе обработка продолжается со следующего.
Восстановление прав доступа и делегирования
Восстановление выполняется по ведомости acl_registry.csv (раздел Выгрузка прав) через CMD-интерфейс IVA Mail под сервисной учётной записью после переноса данных партии. Обе стороны каждого права принадлежат одной партии (раздел Деление пользователей на партии по связям доступа), поэтому на момент восстановления объект и субъект доступа существуют в IVA Mail.
Соответствие прав Exchange правам IVA Mail
Права IVA Mail: права аккаунта (i — отправка от имени, s — отправка по поручению с указанием отправителя в Sender, r — чтение, w — администрирование, даёт все права на все папки), права папки (строка из символов l, r, s, w, i, p, k, x, t, e, a по стандарту IMAP ACL), права календаря (уровни чтения r0–r3, чтения приватных p0–p3, записи w0–w3).
| Право Exchange | Право IVA Mail | Команда назначения |
|---|---|---|
FullAccess |
ACL аккаунта: w |
ObjectSetSetting … AccountACL |
SendAs |
ACL аккаунта: i |
ObjectSetSetting … AccountACL |
SendOnBehalf |
ACL аккаунта: s |
ObjectSetSetting … AccountACL |
Делегат (Editor календаря + SendOnBehalf) |
ACL аккаунта: iw |
ObjectSetSetting … AccountACL |
Папка: Reviewer |
ACL папки: lr |
MailboxUpdateACL |
Папка: Author |
ACL папки: lrswi |
MailboxUpdateACL |
Папка: Editor |
ACL папки: lrswipkxte |
MailboxUpdateACL |
Папка: Owner |
ACL папки: все права (*) |
MailboxUpdateACL |
Календарь: AvailabilityOnly |
Календарный ACL: r1 |
CalendarUpdateACL |
Календарь: LimitedDetails |
Календарный ACL: r2 |
CalendarUpdateACL |
Календарь: Reviewer |
Календарный ACL: r3 |
CalendarUpdateACL |
Календарь: Editor |
Календарный ACL: r3w3 + ACL папки lrswite |
CalendarUpdateACL, MailboxUpdateACL |
Порядок восстановления
-
Выполняется подключение к CMD-интерфейсу IVA Mail (iva.domain.ru:8106, TLS) под сервисной учётной записью.
-
Ведомость acl_registry.csv фильтруется по пользователям текущей партии.
-
Права уровня аккаунта (FullAccess, SendAs, SendOnBehalf) назначаются записью ключа AccountACL владельца. Словарь формируется по всем субъектам данного владельца из ведомости и записывается одной командой:
# ассистент assistant: FullAccess + SendOnBehalf к ящику user01 ObjectSetSetting "domain.ru" "user01" "AccountACL" {"assistant": "sw"} -
Права на папки назначаются по каждой строке типа Folder; идентификатор без доменной части относится к домену владельца ресурса:
# colleague: Reviewer на папку Inbox ящика user01 MailboxUpdateACL "domain.ru" "user01" "Inbox" "colleague" "+lr" -
Права на календари назначаются по каждой строке типа Calendar:
# secretary: Editor календаря user01 CalendarUpdateACL "domain.ru" "user01" "Calendar" "secretary" "r3w3" MailboxUpdateACL "domain.ru" "user01" "Calendar" "secretary" "+lrswite" -
Назначение проверяется контрольным чтением по каждому владельцу партии:
MailboxGetACL "domain.ru" "user01" "Inbox" CalendarGetACL "domain.ru" "user01" "Calendar" ObjectGetSetting "domain.ru" "user01" "AccountACL" -
Строки ведомости, назначение которых завершилось ошибкой, вносятся в реестр исключений с текстом ошибки CMD и обрабатываются до завершения партии.
Проверка целостности и консистентности данных
Проверка выполняется по завершении обработки каждого пользователя и каждой партии штатными отчётами утилит. Контрольные суммы и размеры сообщений не сопоставляются: форматы хранения Exchange и IVA Mail различаются, и эти значения закономерно изменяются при переносе. Сверка ведётся по количеству элементов и выборочным подключением.
Порядок проверки
-
IMAP-перенос. По завершении партии на вкладке Logs and failures GUI
syncIMAPMailпроверяется отсутствие пользователей со статусом ошибки; по журналам per-user сверяется количество перенесённых сообщений и папок с исходным ящиком. Пользователи с ошибками и расхождениями вносятся в реестр исключений. -
EWS-перенос. На вкладке Users Progress GUI
ivatool_ews2imailпроверяется сводка Total / Done / Failed: значение Failed равно нулю. Нажимается Export to CSV — итоговый отчёт содержит по каждому пользователю количество объектов Objects (импортировано/получено) и размер Size (импортировано/получено); отчёт сохраняется в состав документации партии. Расхождение «импортировано меньше получено» по пользователю означает частичный перенос: пользователь вносится в реестр исключений. -
Повтор проваленных. Для пользователей со статусом Failed в GUI
ivatool_ews2imailсписок предварительно загружается через Load / preview list, затем нажимается Retry failed: утилита формирует временный список только из проваленных аккаунтов и перезапускает миграцию для них. В GUIsyncIMAPMailпроблемные пользователи перезапускаются повторной постановкой в очередь на вкладке Mail migration queue. -
Выборочная проверка подключением. Для 5% пользователей партии (не менее трёх) выполняется вход в веб-интерфейс IVA Mail: подтверждается наличие основных папок, писем в них, календарных событий и личных контактов.
-
Критерий завершения партии. Партия считается завершённой при статусе Done по всем пользователям в обоих отчётах, нулевом количестве неразобранных записей реестра исключений и успешной выборочной проверке.
Обработка ошибок, реестр исключений и входные файлы
Реестр исключений
Все ошибки переноса подлежат журналированию. Для учётных записей,
перенос которых завершился с ошибками либо выявил отклонения по
результатам сверки, ведётся ведомость (реестр исключений). В реестре фиксируются: идентификатор пользователя, краткое описание проблемы, источник ошибки (журнал syncIMAPMail, отчёт ivatool_ews2imail, ошибка CMD), текущее состояние разбора, принятое решение. При ошибке на отдельном пользователе обработка очереди продолжается со следующего пользователя; записи реестра разбираются до критерия завершения партии (раздел Порядок проверки).
Формат входного файла syncIMAPMail (IMAP)
Формат — CSV в кодировке UTF-8, разделитель «запятая», значения с разделителями заключаются в кавычки, первая строка — заголовок. Состав колонок:
| Колонка | Назначение |
|---|---|
Source mailbox / Target mailbox |
Адрес исходного и целевого почтового ящика |
Source login / Source password |
Учётные данные исходного ящика; в режиме ServiceAccounts не используются — доступ выполняется сервисной учётной записью |
Target login / Target password |
Учётные данные целевого ящика; в режиме ServiceAccounts не используются |
Object type |
Тип объекта: user, shared, resource, group, forwarder |
Primary address / Aliases |
Основной адрес и список псевдонимов (разделитель «;») |
Owner / Group |
Владелец объекта и имя партии (batch) |
Settings / ACL entries |
Настройки объекта и записи прав доступа |
Пример строки (пользователь):
user01@exchange.example.com,user01@ivamail.example.com,
user01@exchange.example.com,sourcePassword01,
user01@ivamail.example.com,targetPassword01,user,
user01@ivamail.example.com,
"user01.alias@ivamail.example.com;user01.old@example.net",
,Batch-A,Sample user mailbox 01,"RealName=User 01",
Формат входного файла ivatool_ews2imail (EWS)
Формат — CSV в кодировке UTF-8, разделитель «запятая» или «точка с запятой», либо JSON. Колонки сопоставляются по имени заголовка. Обязательны exchange_email и iva_user; iva_user задаётся в виде user@domain либо в паре с iva_domain.
| Колонка | Назначение |
|---|---|
exchange_email |
Адрес почтового ящика Exchange (обязательно) |
exchange_user |
Учётная запись доступа — сервисная запись с ApplicationImpersonation |
exchange_password |
Пароль учётной записи доступа; при пустом значении используется пароль из Connections |
iva_user |
Целевой пользователь IVA Mail (обязательно) |
iva_domain |
Домен целевого пользователя IVA Mail |
Пример строки:
exchange_email,exchange_user,exchange_password,iva_user,iva_domain
user01@exchange.example.com,user01@exchange.example.com,,user01,ivamail.example.com
Ограничения переходного периода и информирование
В период, когда часть пользователей переведена в IVA Mail, а часть продолжает работу в Microsoft Exchange, действуют ограничения кроссплатформенного взаимодействия. Ограничения учитываются при делении на партии (раздел Деление пользователей на партии по связям доступа) и доводятся до пользователей в уведомлениях.
Совместный доступ и делегирование
Права делегированного доступа (полный доступ, отправка от имени владельца, отправка по поручению), а также совместная работа с чужими папками и календарями поддерживаются только в пределах одной почтовой платформы. Пользователь IVA Mail не имеет доступа к папкам, календарям и делегированию объектов пользователя, продолжающего работу в Exchange; обратное ограничение действует аналогично. По этой причине группы связности по ведомости прав переводятся в составе одной партии.
Списки рассылки
В Microsoft Exchange членство в группах рассылки привязано к объекту почтового ящика: при отключении исходного ящика пользовательский объект удаляется из групп рассылки Exchange. Обязательные действия — сохранение перечня групп до отключения ящика и повторное включение внешнего контакта в эти группы — входят в процедуру раздела Завершение перевода пользователя.
Ресурсные почтовые ящики и переговорные
Пользователи IVA Mail не имеют прямого доступа к календарям ресурсных ящиков Exchange, ещё не мигрированных, включая переговорные комнаты. Бронирование немигрированного ресурса в переходный период выполняется отправкой приглашения на SMTP-адрес ресурса; для этого в Exchange включается обработка приглашений от внешних отправителей для соответствующих ресурсных ящиков:
Set-CalendarProcessing -Identity room101@domain.ru `
-ProcessExternalMeetingMessages $true
Информирование пользователей
До начала миграции партии и после её завершения выполняется централизованное оповещение пользователей партии. Информационные материалы содержат: дату и время перевода, адрес веб-интерфейса IVA Mail, параметры настройки клиентских приложений, перечень ограничений переходного периода (разделы Совместный доступ и делегирование–Информирование пользователей), контактные данные службы поддержки. Информирование включает предварительное уведомление (не позднее чем за три рабочих дня) и уведомление о завершении перевода.