Транспортный агент (Transport Agent) играет важнейшую роль в безопасности и чистоте регуляции сообщений в Exchange Server 2007. Его действия распространяются на уровне центральной и граничной транспортировки.
Транспортная архитектура Exchange Server 2007 сделана таким образом, что весь поток сообщений, проходящих через сервер, может быть обработан транспортными агентами(transport agents). Агенты используют Application Programming Interface (API, интерфейс программирования приложений, или другими словами набор готовых функций, который могут использовать разработчики), что интересно – точно такое же набор функций использован Microsoft, чтобы создать стандартизированного транспортного агента, который поставляется вместе с Exchange 2007.
SMTP события
SMTP Event(SMTP события), которые применялись в Exchange Server 2003, показали свою несостоятельность, поэтому Вы не найдете их в новой версии Exchange 2007, где используется совершенно новый протокол SMTP и способ транспортировки.
Как было сказано выше, теперь используются транспортные агенты. Как только сообщение приходит на сервер, его перенаправляют через транспортную сеть SMTP(рисунок 1), при этом каждое SMTP событие может иметь транспортных агентов, которые имеют доступ к сообщению и могут производить некоторые действия.
Рисунок 1: SMTP события. Процесс исполнения слева направо
Все SMTP события происходят лишь после того, как произойдет определенное действие. Ниже показана таблица, с помощью которой можно понять очередность и какой тип действия используется в каждом случае.
1 | OnConnectEvent | От удаленного хоста посылается сигнал на установление соединения |
2 | OnHeloCommand | Исходит команда HELO SMTP |
3 | OnEhloCommand | Исходит команда EHLO SMTP |
4 | OnAuthCommand | Исходит команда AUTH SMTP |
5 | OnEndOfAuthentication | Полная аутентификация завершена |
6 | OnMailCommand | Исходит команда MAIL FROM SMTP |
7 | OnRcptCommand | Исходит команда RCPT TO SMTP |
8 | OnDataCommand | Исходит команда DATA SMTP |
9 | OnEndOfHeaders | Заголовки сообщений были полностью утверждены |
10 | OnEndOfData | Удаленный сервер посылает <CRLF>.<CRLF>, что означает конец потока данных |
** | OnHelpCommand | Действие помощи может быть вызвано в любой момент после OnConnectEvent и до OnDisconnectEvent SMTP события |
** | OnNoopCommand | Команда пустого действия может быть вызвана в любой момент после OnConnectEvent и до OnDisconnectEvent SMTP события |
** | OnReject | Получающий хост посылает код уведомления на посылающий SMTP хост. Событие может быть вызвано в любой момент после OnConnectEvent и до OnDisconnectEvent SMTP события. |
** | OnRsetCommand | Событие включается в работу после посылки действия RSET SMTP активным(в данный момент производит отправку) SMTP хостом. Событие может быть вызвано в любой момент после OnConnectEvent и до OnDisconnectEvent SMTP события. |
11 | OnDisconnectEvent | Событие включается после отсоединения либо от посылающего, либо от принимающего хоста |
12 | OnSubmittedMessage | Событие включается сразу после попадания сообщения в очередь Submission. Все сообщения вызывают это событие назависимо от того пришли ли они через SMTP, MAPI или директорий Pickup(Replay). |
13 | OnRoutedMessage | После распределения всех сообщений по категориями, завершения записи листов распределения и получения ответа со стороны получателя |
Таблицу, находящуюся выше, можно найти в документации по Exchange 2007 или на сайте TechNet (http://technet.microsoft.com/en-us/library/aa996847.aspx).
Транспортные агенты и их роль в передаче
Транспортные агенты, которые встроены в сервис передачи, могут быть полезны лишь там, где этот сервис вообще доступен – крайней и центральной транспортных системах. Каждый транспортный агент будет сопоставлен с другими в соответствии с его ролью, приоритетом и SMTP событиями, которые его вызывают. Эти стандартные агенты были также разработаны с использованием API, который может свободно применяться любым программистом.
Роль центральной передачи(2 транспортных агента)
Transport Rule agent(агент, управляющий передачей) | 1 | OnRoutedMessage |
Journaling agent(агент, делающий заметки в журнале) | 2 | OnSubmittedMessage, OnRoutedMessage |
Важной особенностью центральной передачи является то, что стандартные транспортные агенты могут быть обнаружены на уровне категоризации(на нем происходит определение категории объекта) после их вызова событием(показано на рисунке 2).
Рисунок 2: Транспортные агенты, управляющие при центральной передаче
Роль системы крайней передачи(10 транспортных агентов):
Connection Filtering agent(фильтрация соединений) | 1 | OnConnectEvent, OnMailCommand, OnRcptComand, OnEndOfHeaders |
Address Rewriting Inbound agent(перезапись входящих адресов) | 2 | OnRcptCommand, OnEndOfHeaders |
Edge Rule agent(управляющий краевыми функциями) | 3 | OnEndOfData |
Content Filter agent(фильтрующий содержимое) | 4 | OnEndOfData |
Sender ID agent(посылающий идентификационный номер) | 5 | OnEndOfHeaders |
Sender Filter agent(фильтрующий отправляемое) | 6 | OnMailCommand, OnEndOfHeaders |
Recipient Filter agent(фильтрующий получаемое) | 7 | OnRcptCommand |
Protocol Analysis agent(анализатор протокола) | 8 | OnEndOfHeaders, OnEndOfData, OnReject, OnRsetCommand, OnDisconnectEvent |
Attachment Filtering agent(фильтрующий вложенное) | 9 | OnEndOfData |
Address Rewriting Outbound agent(перезаписывающий исходящие адреса) | 10 | OnRcptCommand, OnEndOfHeaders |
Вы видите правила краевой(граничной) передачи на рисунке 3. Каждый транспортный агент использует специальное SMTP событие.(рис 3)
Рисунок 3: Транспортные агенты и SMTP события на уровне граничной передачи
Замечание. Чтобы увидеть полную картину транспортной(как центральной, так и краевой) архитектуры, можно скачать pdf файлы в секции «дополнительная информация»(More Information)
Установка антиспам-агентов в центральной системе передачи
У нас есть прекрасный пример, который показывает всю пользу транспортных агентов – один компьютер, выполняющий сразу 3 действия(Почтовый ящик, центральная передача и допуск клиента к ресурсам). Эта машина ответственна за весь интернет трафик. В таком случае транспортные агенты будут ответственны за все процессы «чистки» (антиспам, фильтр содержимого и т.д.), здесь их польза бесспорна.
Несмотря на то, что изначально существует лишь 2 транспортных агента(в центральной передаче), использование скрипта Install-AntiSpamAgents.ps1 позволит создать дополнительных, таких как Connection Filtering, Content Filtering, Sender ID, Sender Filter, RecipientFilter и Protocol Analysis(о них было подробнее написано выше). Если не производить установку дополнительно, то их можно найти лишь в системе граничной передачи.(Edge Transport).
Для установки антиспам-агентов необходимо провести следующие операции:
- Подключиться к центральному транспортную серверу
- Открыть оболочку управления Exchange
- Запустить скрипт Install-AntispamAgents.ps1, который находится в папке Scripts(на диске с установочными файлами, рис 4)
Рисунок 4: Установка антиспам-агентов на уровне центральной транспортной передачи
После установки перезапускаем сервис Exchange Transport, чтобы новые транспортные агенты вступили в действие, появится новая вкладка в консоли управления(при раскрытии слева Organization Configuration, рис 5) Теперь новые агенты запускаются в качестве транспортных и работают на прием, а старые два продолжают работать на уровне категоризации(Categorizer).
Рисунок 5: Новая вкладка Анти-спам на уровне центральной транспортной передачи
Управление
Мы имеем возможность просматривать, включать, выключать и менять приоритет транспортных агентов.
Чтобы понять как вывести весь список используемых на сервере агентов достаточно взглянуть на рисунок 6.
Рисунок 6: Вывод на экран транспортных агентов
Можно увидеть больше информации о агентах, если после команды Get-TransportAgent использовать “| fl” (рисунок 7). Это позволит вывести такую информацию как TransportAgentFactory(«фабрика» агента) и DLL-файл, используемый агентом.
Рисунок 7: Дополнительная информация об установленных транспортных агентах
Чтобы отключить агента, достаточно использовать команду Disable-TransportAgent, как показано на рисунке 8. При отключении, само собой, придется подтвердить наше решение, написав букву Y в ответе на вопрос.
Рисунок 8: Отключение агента
Чтобы включить агента, пользуемся командой Enable-TransportAgent(рисунок 9). Обратите внимание на включенную колонну до и после команды.
Рисунок 9: Включение агента
Другой важной особенностью является приоритет агентов. Можно менять приоритет, используя команду Set-TransportAgent, как показано на рисунке 10. Обратите внимание на приоритет до и после изменения.
Рисунок 10: Изменение приоритета транспортных агентов
Можно установить приоритет как для уже существующих, так и для новых транспортных агентов, даже если они созданы другими приложениями. Приоритет показывает и используется для контроля за тем, какой из агентов будет действовать на сообщение первых. Чем ниже число приоритета, тем раньше его действие распространиться на сообщение(по сравнению с большим числом). Приоритеты используются в том случае, если несколько транспортных агентов используют одно и то же SMTP событие. Если эти события различны, то мы вынуждены следовать порядку следования SMTP событий, а не приоритету.
К примеру: если агент с 1 приоритетом использует SMTP событие под названием OnEndOfData, а агент с приоритетом 2 использует SMTP событие OnConnect, то агент, использующий событие OnConnect вступит в работу раньше другого только лишь потому, что в последовательности событий OnConnect идет раньше OnEndOfData.
И наконец, мы можем увидеть последовательность SMTP событий. Пишем команду Get-TransportPipeline(рисунок 11).
Рисунок 11: SMTP события и агенты, связанные с ними
Решение проблем с транспортными агентами.
Иногда нам нужно убедиться в том, что агенты выполняют свою работу, для этого мы можем использовать функцию отслеживания(трассировки) процесса (Pipeline tracing feature), чтобы получить точную картину того, что было до, и что стало после воздействия агента. Каждый шаг процесса находится в специальной директории, связанной с решением проблем.
Чтобы проверить полезность трассировки, мы создадим транспортное правило на крайнем уровне, которое добавляет текст в поле. Затем мы воспользуемся функцией трассировки, чтобы отследить отправителя xx@xx.com.br , таким образом мы сможем определить процессы транспортного агента в сообщениях, посланных от xx@xx.com.br.
Для начала трассировки используем следующую команду:
Set-TransportServer <server> -PipelineTracingEnabled:$true –PipelineTracingSenderAddress <smtp address or X500 address>
Где:
PipelineTracingEnabled: Включаем трассировку «трубы».
PipelinetracingSenderAddress: для пользователей схожего сайта используем либо x500 адрес, либо SMTP, а для внешних – SMTP адрес.
На рисунке 12 можем видеть исполнение команды «начать трассировку». По умолчанию файлы трассировки создаются в <Exchange Server directory installation>\TransportRoles\Logs\Pipeline Tracing\MessageSnapshots\<ID>\
Рисунок 12: Включаем трассировку для посылающего xx@xx.com.br
В упомянутой выше директории можно увидеть снимки одиночных сообщений с включенной трассировкой(рисунок 13). Каждый файл имеет информацию о транспортных агентах.
Рисунок 13: Директория, куда сохраняется трассировка
Если открыть любое сообщение в этой директории при помощи Блокнота, то в заголовке увидим то, что называется X-Message-Snapshot-source (действующий в данный момент источник изменения сообщения X), который показывает какое SMTP событие используется и какой агент будет действовать(или действует, это же «покадровый» просмотр) на сообщение.Рисунок 14:Можно увидеть, что сообщение отправлено внутреннему пользователю от xx@xx.com.br, при этом на уровне краевой передаче при событии OnEndOfData было воздействие со стороны транспортного агента(Edge Rule Agent, агент, устанавливающий правила при краевой передаче).
Рисунок 14: SMTP событие и агент показаны во время трассировки
После проверки агентов рекомендуется отключать трассировку, как показано на рисунке 15.
Рисунок 15: Отключение трассировки, используя команду Set-TransportServer
Замечания по поводу трассировки:
- Трассировка сохраняет все содержимое сообщений, поэтому в целях безопасности не забудьте установить защиту, выделить права доступа только авторизированным пользователям(имеется ввиду доступ к папке, куда сохраняется трассировка)
- Не включайте трассировку на очень продолжительное время, существует много крупных сообщений, в результате у вас могут начаться проблемы со свободным местом.
- Чтобы найти адрес x500 для внутреннего пользователя можно посмотреть лог файл, содержащий информацию о трассировке сообщений.
- Опять же в целях безопасности после отключения трассировки рекомендуется удалить всю информацию, собранную за этот период.
Можно ли создать своего транспортного агента?
Да, сделать это просто. Рекомендуем использовать Microsoft Visual Studio .NET 2005 для таких целей. На сайте MSDN можно найти образец http://msdn2.microsoft.com/en-us/library/aa579185.aspx.
Замечание: транспортные агенты имеют полный доступ к сообщениями, которые через них проходят. Это означает отсутствие ограничений на любые его действия. Поэтому если он ненадежен, нестабилен, то это может повлиять на безопасность всего сервера! Вы должны быть абсолютно уверены в безопасности, чтобы запускать его в бизнес среде.
Установка, удаление и включение вашего собственного агента
После создания агента нужно закомпилировать его в DLL (dynamic link-library). После создания DLL его необходимо установить на сервер, для которого он предназначался.Делаем таким образом:
- Набираем команду Install-TransportAgent
Install-TransportAgent –Name <Name> –TransportAgentFactory “MyAgents.MyAgentFactory” –AssemblyPath <path>
Замечание: Нельзя использовать путь UNC в строке AsseblyPath
- Запускаем агента:
Enable-TransportAgent –Name “SampleAgent”
- Для удаления ранее установленных агентов:
Uninstall-TransportAgent “SampleAgent”
Заключение
В этой статье было рассказано о управлении и решении проблем с транспортными агентами. В скором будущем они будут использоваться разными программами(антивирусы, программы создающие отчеты и другие), чтобы расширить функциональность Exchange Server 2007(Нововведения будут производиться сторонними разработчиками).