Методы встраивания подсистемы VPN в операционные системы Windows NT / 2000

© Дмитрий Богдель, Сергей Панасенко, 2002.

Модная и активно используемая в настоящее время технология VPN (Virtual Private Network – виртуальная частная (защищенная) сеть) предназначена для обеспечения безопасности, т.е. целостности и конфиденциальности данных, передаваемых по компьютерным сетям. Предлагаемая статья описывает методы встраивания подсистемы, реализующей функции VPN, в операционные системы Windows NT / 2000.

Виртуальные частные сети

Поскольку технология VPN является в настоящее время одной из наиболее перспективной в данной области и многократно освещалась в специализированных изданиях по информационной безопасности, позволим себе очень коротко описать суть данной технологии. Средства VPN производят следующие действия:

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

Сетевая архитектура Windows NT / 2000

Прежде, чем перейти к основной теме статьи, опишем сетевую архитектуру Windows NT. Как можно видеть из схемы (рис. 1), программное обеспечение сетевых компонент может быть двух видов:

Необходимо отметить, что в Windows NT используется несколько обобщенное понятие «драйвера», отличающееся от обычного, когда под драйвером подразумевается программа, управляющая конкретной моделью внешнего устройства и имеющая удобный для прикладного программиста программный интерфейс управления этим устройством. Имеется в виду тот факт, что драйверы в Windows NT могут как управлять конкретным устройством, так и выполнять функции, не требующие работы с аппаратурой. Такие драйверы соответственно называют низкоуровневыми (аппаратными) и высокоуровневыми. При этом они имеют однотипную программную структуру и одинаковый формат исполняемого файла.

Классификация драйверов

Сетевые драйверы в Windows NT 4.0 имеют следующую классификацию:

Информация, необходимая для корректного связывания (binding) сетевых драйверов, хранится в системном реестре.
В Windows 2000 появились новые типы сетевых драйверов, но в данной статье мы их рассматривать не будем, поскольку их наличие не влияет на рассматриваемые методы.

Обработка данных

Все сетевые драйверы Windows NT при загрузке регистрируют заранее определённый набор функций, которые являются точками входа в драйвер и будут затем при определённых условиях вызваны службой NDIS. Например, драйверы протоколов таким образом получают извещения о приходе пакетов из сети, а драйверы минипорта – о том, что пакет надо отправить в сеть. В наборе таких функций обратного вызова могут быть и некоторые специфичные функции. Например, минипорт может зарегистрировать специальную функцию, которую служба NDIS будет вызывать каждые 2 секунды с целью проверки, не «завис» ли драйвер сетевой карты. Такой обработчик, согласно [2], должен проверить состояние драйвера и платы, и, если он завис или обнаружена устранимая ошибка в работе платы, вернуть некоторое значение. Служба NDIS немедленно после этого вызовет функцию сброса сетевой карты, которую также должен зарегистрировать драйвер минипорта.
Вся обработка данных в сетевых драйверах ведется асинхронно, ее можно условно разделить на три этапа. Рассмотрим ее на примере посылки пакета драйвером протокола драйверу сетевой карты.

Такая обработка данных значительно повышает скорость работы сетевых компонентов, позволяя ликвидировать пустые циклы занятого ожидания в алгоритмах работы сетевого ПО.

Увидеть взаимосвязь сетевых компонентов в Windows NT можно нажатием правой кнопки мыши на значке «Сетевое окружение», последующим выбором в контекстном меню пункта «Свойства» и выбором закладки «Привязки» (см. рис. 2). Можно заметить некоторое соответствие данной архитектуры семиуровневой сетевой модели OSI. Причем драйверы соответствуют более нижним уровням – транспортному, сетевому и канальному. Именно на этих уровнях удобнее и надежнее всего перехватывать пакеты для шифрования, сжатия, фрагментации, дефрагментации и других манипуляций с данными.
Рассмотрим способы перехвата IP-пакетов для их зашифрования и защиты целостности. Внедрение программного модуля, осуществляющего перехват и обработку пакетов, является краеугольным камнем встраивания VPN-агента в ОС.

Основные способы перехвата сетевого трафика в Windows NT / 2000

Описанные ниже способы позволяют бесперебойно работать обычным сетевым приложениям, однако, для открытия защищенной сетевой подсистемы только собственным специализированным приложениям достаточно дополнительно разработать драйвер протокола.
Итак, основные способы перехвата сетевого трафика:

Операционные системы на базе технологии Windows NT не предоставляют простых, понятных и хорошо документированных способов перехвата сетевого трафика. В любом случае небходимо дополнять операцонную систему новыми модулями или даже заменять существующие. Такое вмешательство всегда несколько снижает надежность самой операционной системы, поэтому к вопросу о выборе способа работы с трафиком следует подойти весьма осторожно.
Самым логичным способом кажется написание NDIS Intermediate драйвера для перехвата трафика и его шифрования. Пойдя этим путем, мы получаем ряд преимуществ:

Переписывание заново драйвера сетевой карты для внедрения в него шифрования является весьма трудоемкой операцией, в том числе из-за отсутствия исходного кода большинства драйверов. Не менее трудной будет отладка драйвера. Дело в том, что Windows NT не является операцонной системой реального времени, т.е. не гарантируется со 100% точностью выполнение какой-либо функции за фиксированное время. В то время как в высокоскоростной сети, например в Fast Ethernet, скорость трафика может быть весьма значительной. Внесение задержек, связанных с обработкой данных, может нарушить достаточно тонкие временные соотношения в алгоритме обработки приходящих пакетов драйвера сетевой карты, что приведет, в свою очередь, к нарушениям в работе сетевых служб.
Кроме того, позволим себе утверждать, что ориентация VPN-агентов на конкретные типы сетевых карт влечет за собой их недолговечность и проблемы с совместимостью.
При реализации перехвата пакетов путем внедрения своего кода в системные сервисы (например, в службу Microsoft NDIS, см. рис. 3) можно столкнуться с целым рядом проблем, решение котрых под силу только весьма серьезным разработчикам. Например, полное отсутствие документации, описывающей алгоритмы работы системных сервисов, вынудит производить декомпиляцию и дизассемблирование их кода. Авторам приходилось сталкиваться с VPN-агентами, разработанными данным способом. Кроме того, такие действия, как модификация кода операционной системы и его дизассемблирование, могут быть небезупречны с точки зрения лицензионных соглашений Microsoft.
Как известно, большинство сетевых приложений, работающих по протоколам TCP и UDP, используют библиотеку WinSock. Для получения полного контроля над трафиком таких приложений следует либо заменить эту библиотеку своей, либо перехватить ее вызовы. Перехват вызовов DLL, не являясь сложной задачей, может осуществляться несколькими способами. Примеры можно найти в широко известной книге [4]. Такой метод перехвата трафика довольно эффективен, поскольку не требует написания драйверов и их установки в системе. Кроме того, этот способ значительно надежнее выше описанных, так как весь код работает в пользовательском режиме. Поэтому при ошибке в DLL (например, выход за границы массива), приложение, загрузившее эту DLL в свое адресное пространство, будет просто аварийно завершено без особого вреда для всей системы в целом. Если же точно такая ошибка происходит в драйвере, который по сути является частью операционной системы и поэтому работает в режиме ядра, то происходит аварийная остановка всей системы (наверное, каждый хоть раз видел «синий экран»), что влечет за собой процедуру перезагрузки и проверку файловой системы. Такая аварийная остановка может, в числе прочих неприятностей, привести к порче файловой системы на компьютере пользователя.

Это отнюдь не полный список всех возможных спосбов перехвата сетевого трафика. Мы привели только несколько таких способов, каждый из которых нашел свое применение в реальных продуктах.

 

Литература:

  1. Kent S., Atkinson R. RFC 2401: Security Architecture for IP. November 1998.
  2. Документация Microsoft Windows NT 4.0 / 2000 Driver Development Kit.
  3. Олифер В., Олифер Н. “Сетевые операционные системы”.
  4. Рихтер Дж. “Windows для профессионалов”.

Рисунки:

  1. Сетевая архитектура Windows NT.
  2. Сетевые привязки в Windows NT.
  3. Список установленных устройств.
Алгоритмы шифрования...

Rambler's Top100

Перейти на главную страницу

Карта сайта

Список статей