Разработка межсетевого экрана для компьютеров пользователей с использованием технологии WFP

Контрольная работа - Компьютеры, программирование

Другие контрольные работы по предмету Компьютеры, программирование

Оглавление

 

Введение

Теоретическая часть

Инструкция

Практическая часть

Заключение

Список используемых источников

Приложение

 

 

Введение

 

Начиная с версий Server 2008 и Vista в Windows был встроен механизм WFP (Windows Filtering Platform - платформа фильтрации Windows), представляющий собой набор API и системных сервисов. Данный набор позволяет запрещать и разрешать соединения, управлять отдельными пакетами. Эти нововведения были предназначены для упрощения жизни разработчиков различных защит. Внесенные в сетевую архитектуру изменения затронули как kernel-mode, так и user-mode части системы. В первом случае необходимые функции экспортируются fwpkclnt.sys, во втором - fwpuclnt.dll (буквы "k" и "u" в названиях библиотек означают kernel и user соответственно).

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

 

 

Теоретическая часть

 

Библиотеки, содержащие средства для работы с WFP, находятся в наборе для разработчиков WDK (Windows Driver Kit).

Первым делом необходимо создать экземпляр типа Handle - дескриптор, описывающий различные объекты. В нашем случае переменная этого типа будет предназначена для работы с фильтром. Инициализации этой переменной происходит при вызове функции FwpmEngineOpen0, которая открывает сессию для работы с фильтром.

Прототип этой функции выглядит следующим образом:

DWORD WINAPI FwpmEngineOpen0(

__in_optconstwchar_t *serverName,

__in UINT32authnService,

__in_optSEC_WINNT_AUTH_IDENTITY_W *authIdentity,

__in_optconst FWPM_SESSION0 *session,

__out HANDLE *engineHandle

);

где: Данное значение должно быть NULL

authnService Особенности аутентификации. Допустимые значения:RPC_C_AUTHN_WINNTи RPC_C_AUTHN_DEFAULT. Аутентификация и авторизация для доступа к фильтру. Для нашей задачи можно использовать NULL

session Специфические параметры открытия сессии. Для нашей задачи можно использовать NULL

engineHandle Уже описанная выше переменная для открытия работы с фильтром.

В случае успеха операции метод возвращает ERROR_SUCCESS.

Сетевой уровень можно разделить на три группы подуровней:

) Подуровни сетевого доступа - протоколы, занимающиеся интерфейсом сетей, такие как X.25

) Подуровни зависимого сетевого сближения - необходимо для приведения уровня транзитной сети до уровня сети на другой стороне

) Подуровни независимого сетевого сближения - для переноса через многочисленные сети

Следующим шагом необходимо добавить подуровень, в который, в дальнейшем, пропишем наш фильтр.

Для этого создадим переменную типа FWPM_SUBLAYER0

typedefstruct FWPM_SUBLAYER0_ {subLayerKey;_DISPLAY_DATA0displayData;flags;*providerKey;_BYTE_BLOB providerData;weight;

} FWPM_SUBLAYER0;

где: Уникальный идентификатор подуровня (GUID).

displayData Название и описание подуровня в понятной для пользователя форме.

Flags Флаг. Должен быть FWPM_SUBLAYER_FLAG_PERSISTENT Уникальный идентификатор провайдера, управляющего данным подуровнем.

providerData Специфические данные провайдера.

Weight Вес подуровня. Подуровни с большим весом вызываются раньше.

Добавим созданный подуровень в систему при помощи метода FwpmSubLayerAdd0

DWORD WINAPI FwpmSubLayerAdd0(

__in HANDLE engineHandle,

__in const FWPM_SUBLAYER0 *subLayer,

__in_opt PSECURITY_DESCRIPTOR sd

);

где:

engineHandle переменная для открытия работы с фильтром.

subLayer добавляемый подуровень

sd информация о безопасности для данного подуровня

В случае успеха операции метод возвращает ERROR_SUCCESS.

Теперь создадим уже непосредственно фильтр. Для этого объявим и проинициализируем переменную типа FWPM_FILTER0:

typedefstruct FWPM_FILTER0_ {;_DISPLAY_DATA0displayData;flags;*providerKey;_BYTE_BLOB providerData;;;_VALUE0 weight;numFilterConditions;_FILTER_CONDITION0 *filterCondition;_ACTION0 action;{rawContext;providerContextKey;

};*reserved;filterId;_VALUE0effectiveWeight;

} FWPM_FILTER0;

где: Уникальный идентификатор фильтра (GUID).

displayData Название и описание фильтра в понятной для пользователя форме.

FlagsКомбинация значений. Для нашей задачи берется значение по умолчанию - FWPM_FILTER_FLAG_NONE

providerKey Уникальный идентификатор провайдера, управляющего данным подуровнем.

providerData Специфические данные провайдера.

layerKeyУникальный идентификатор уровня, на который нужно добавить фильтр.

-.">FilteringLayerIdentifiers - список доступных значений.

subLayerKey Уникальный идентификатор подуровня, на который нужно добавить фильтр.

-..">Filtering Sub-Layer Identifiers - список встроенных подуровней. Так же можно добавить идентификатор созданного вручную подуровня.

weightвесфильтра. Для нашей задачи будем использоватьFWP_EMPTY - автоматически принимаемое значение веса, основанное на условиях фильтра.

-.">FilterWeightIdentifiers - список встроенных констант данного параметра.

numFilterConditions количество условий фильтра.

filterCondition массив условий фильтра. Содержат информацию о типе блокировки (по IP адресу, по порту, по идентификатору приложения, либо что-то другое), а так же значение, которое нужно блокировать.

actionструктура, описы?/p>