Разработка межсетевого экрана для компьютеров пользователей с использованием технологии 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>