Смекни!
smekni.com

Разработка и анализ эффективности средств отражения распределенных атак (стр. 11 из 13)

В настоящее время существуют различные механизмы обнаружения и противодействия TCPSYN атаке. Наиболее эффективным из них является метод SYNCookies, однако он, как и все другие, имеет недостатки, такие как необходимость внесения соответствующих изменений в реализацию стека протоколов TCP/IP на защищаемом сервере, недостаточная эффективность обнаружения атаки из-за отсутствия методики выбора конкретных значений для параметров защиты. В связи с этим, проблема TCPSYN атак требует новых эффективных решений.

В результате проделанной работы была разработана методика обнаружения TCP SYN атаки, позволяющая обнаруживать атаку на ранних стадиях. В основе предложенной методики лежит математическая модель, описывающая обслуживание сервером потока заявок на установление TCP соединения. С помощью математического аппарата теории систем массового обслуживания находятся допустимые интервалы значений для количества полуоткрытых TCP соединений на сервере, работающем в нормальном режиме (при условии отсутствия атаки). В соответствии с этим методом, решение о начале атаки принимается в том случае, когда реальное количество полуоткрытых на сервере соединений выходит за пределы допустимого интервала. Для определения границ этого интервала необходимо получить значения таких параметров как: интенсивность входного потока заявок, время, в течение которого с заданной вероятностью заявка будет обслужена (время прихода ACK пакета), вероятность потери IP пакетов при передаче по сети, количество попыток повторного отправления сервером SYN + ACK пакетов, таймаут отведенный на сервере на установку TCP соединения и вероятность верного обнаружения атаки. Часть параметров можно определить, используя предложенные методики сбора данных, часть определяется настройками стека протоколов TCP/IP на защищаемом сервере.

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

Недостатком данной методики является то, что неисправности сетевого оборудования, в результате которых повышается вероятность потери пакета в сети, будут интерпретированы как TCPSYN атака.

Предложенная методика реализована в виде программно-аппаратного комплекса, состоящего из маршрутизатора на базе Linux системы и системы предотвращения вторжений Snort_inlinec модулем расширения функциональности, которые представлен в виде двух подмодулей отвечающих за обнаружение и предотвращение атаки соответственно.

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

Разработанное решение направлено на защиту критических ресурсов корпоративной сети, таких как сервера прикладных сервисов (Web, электронная почта, службы аутентификации и т.д) от TCPSYN атак.

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


ПЕРЕЧЕНЬ ССЫЛОК

1. Постанова Кабінету Міністрів України від 28.10.2004 р. №1452 "Про затвердження Порядку застосування електронного цифрового підпису органами державної влади, органами місцевого самоврядування, підприємствами, установами та організаціями державної форми власності"

2. Закон України "Про електронні документи та електронний документообіг" від 22.05.2003 р.

3. НД ТЗІ 1.1-003-99. ТЕРМІНОЛОГІЯ В ГАЛУЗІ ЗАХИСТУ ІНФОРМАЦІЇ В КОМП’ЮТЕРНИХ СИСТЕМАХ ВІД НЕСАНКЦІОНОВАНОГО ДОСТУПУ

4. http://bezpeka.com

5. http://www.virulist.com

6. http://www.void.ru

7. http://www.webinform.ru

8. http://bugtraq.ru

9. Приказ ДСТСЗИ СБУ 30.04.2004 N 31

10. BSI.IT Baseline Protection Manual. Standard Security Measures. Version: October 2000

11. RFC793 Transmission Control Protocol

12. http://www.securityfocus.com/infocus/1729

13. http://www.protocols.ru

14. http://www.preferredtechnology.com

15. http://www.iss.net

16. Г.И. Ивченко. Теория массового обслуживания, М:Высшая Школа, 1982.

17. RFC2616. HypertextTransferProtocol – HTTP/1.1.

18. Д. Камер. Сети TCP/IP том 1, изд. дом "Вильямс" М-Санкт-Петербург-Киев 2003

19. http://www.internettrafficreport.com/main.htm

20. http://securitylab.ru

21. Г.Корн, Т.Корн Справочник по математике для научных работников и инженеров М: "НАУКА",1968.

22. Д.Л. Ясницкий. "Разработка методики раннего обнаружения и отражения распределённыхатак типа "отказ в обслуживании"". Магистерская аттестационная работа. Харьков: ХНУРЭ, 2006

23. Джей Бил и др. Snort 2.1. Обнаружение вторжений. 2-е изд. Пер. с англ. - М.: ООО "Бином-Пресс", 2006;

24. Медведовский И.Д., Семьянов П.В., Платонов В.В. Атака через Internet.

25. http://www.securityfocus.com

26. Д.Л. Ясницкий, В.Д. Литовский, Р.В. Олейников. Методика раннего обнаружения TCPSYN атаки. Прикладная радиоэлектроника. Т.5, Харьков: ХНУРЭ, 2006.

27. Snort-2.4.3 source code.

28. http://kiev-security.org.ua

29. http://www.sophist.demon.co.uk/ping

30. http://www.citforum.ru

31. www.computer.org/

32. http://wiki.hping.org/172

33. http://www.snort.org

34. http://www.bsi.de/

35. http://www.linuxsecurity.com


Приложение А

Исходный код модуля расширение функциональности для IPSSnort_inline

// Файл tcp_syn_flood.h

#ifndef __SP_TCP_SYN_FLOOD_H__

#define __SP_TCP_SYN_FLOOD_H__

// TcpSynFloodDefinitions

#define TcpSynFloodPreventionModulePtr void*

/*** Pluging working modes ***/

#define TCP_SYN_FLOOD_DETECTION1

#define TCP_SYN_FLOOD_PREVENTION2

/*** TcpSynFlood atack states ***/

#define SYN_ATACK_IS_NOT_PRESENT 1

#define SYN_ATACK_IS_PRESENT 2

/*** Supported packet types ***/

#define PACKET_TYPE_UNSUPPORTED 0

#define PACKET_TYPE_SYN_ACK 1

#define PACKET_TYPE_ACK 2

#define PACKET_TYPE_RST_FROM_SERVER 3

#define PACKET_TYPE_RST_FROM_CLIENT 4

#define PACKET_TYPE_SYN 5

/*** Prevention module checking packet results ***/

#define PREVENTION_PACKET_IS_OK 1

#define PREVENTION_PACKET_IS_BAD 2

void SetupTcpSynFlood();

#endif /* __SP_TCP_SYN_FLOOD_H__ */

// Файл tcp_syn_flood.с

#include <sys/types.h>

#include <stdlib.h>

#include <ctype.h>

#include "rules.h"

#include "decode.h"

#include "plugbase.h"

#include "parser.h"

#include "debug.h"

#include "util.h"

#include "plugin_enum.h"

#include "generators.h"

#include "event_wrapper.h"

#ifdef HAVE_STRINGS_H

#include "mstring.h"

#endif

#include "sp_tcp_syn_flood.h"

#include "tcp_conn_est_time_checker.h"

#include "tcp_syn_flood_prevention_stat.h"

/*

* setup any data structs here

*/

typedef struct _TcpSynFloodData

{

// the current mode of the plugin

int workingMode;

// the IP address of the server being protected

struct in_addr serverIP;

// tcp connection estimate time checker

TcpConnEstTimeChecker* timeChecker;

// prevention module

TcpSynFloodPreventionModulePtr preventionModule;

} TcpSynFloodData;

/* function prototypes go here */

static void TcpSynFloodInit(char *, OptTreeNode *, int);

static void TcpSynFloodRuleParseFunction(char *, OptTreeNode *);

static int TcpSynFloodCheckFunction(Packet *, struct _OptTreeNode *, OptFpList *);

/* internal functions prototypes */

int ParseIntElement(char* token, char *name);

void SetupTcpSynFlood()

{

/* map the keyword to an initialization/processing function */

RegisterPlugin("tcp_syn_flood", TcpSynFloodInit);

DEBUG_WRAP(DebugMessage(DEBUG_PLUGIN,"Plugin: TcpSynFlood Setup&bsol;n"););

}

static void TcpSynFloodInit(char *data, OptTreeNode *otn, int protocol)

{

// multiple declaration check

if(otn->ds_list[PLUGIN_TCP_SYN_FLOOD])

{

FatalError("%s(%d): Multiple tcpsynflood options in rule&bsol;n", file_name,

file_line);

}

// allocate the data structure and attach it to the

// rule's data struct list

TcpSynFloodData* tcpSynFloodData = (TcpSynFloodData*) SnortAlloc(sizeof(TcpSynFloodData));tcpSynFloodData->workingMode = TCP_SYN_FLOOD_DETECTION;

tcpSynFloodData->preventionModule = TcpSynFloodPreventionCreateModule();

otn->ds_list[PLUGIN_TCP_SYN_FLOOD] = tcpSynFloodData;

TcpSynFloodRuleParseFunction(data, otn);

// finally, attach the option's detection function to the rule's

// detect function pointer list

AddOptFuncToList(TcpSynFloodCheckFunction, otn);

}

/** Expected Rule Structure

# tcp_syn_flood:

# [0] - ip_server

# [1] - server_timeout_sec

# [2] - max_overdue_count

# [3] - max_overdue_count_diviation

# [4] - overdue_time_sec

# [5] - check_period_sec

*/

static void TcpSynFloodRuleParseFunction(

char *data,

OptTreeNode *otn)

{

int server_timeout_sec = 0;

int max_overdue_count = 0;

int max_overdue_count_diviation = 0;

int overdue_time_sec = 0;

int check_period_sec = 0;

TcpSynFloodData *tcpSynFloodData;

tcpSynFloodData = otn->ds_list[PLUGIN_TCP_SYN_FLOOD];

while(isspace((int)*data))

data++;

int numTokens;

const int TokensCount = 6;

char **tokens = mSplit(data, ",", TokensCount, &numTokens, 0);

printf("numtokens %d&bsol;n", numTokens );

if(numTokens != TokensCount)

{

FatalError("in TcpSynFlood rule: invalid number of init parameters&bsol;n");

}

if(inet_aton(tokens[0], &tcpSynFloodData->serverIP) == 0)

{

FatalError("in TcpSynFlood rule: %s is invalid ip address&bsol;n", tokens[0]);

}

server_timeout_sec = ParseIntElement(tokens[1], "server timeout");

max_overdue_count = ParseIntElement(tokens[2], "overdue count");

max_overdue_count_diviation = ParseIntElement(tokens[3], "overdue count diviation");

overdue_time_sec = ParseIntElement(tokens[4], "overdue time (in seconds)");

check_period_sec = ParseIntElement(tokens[5], "check period (in seconds)");

// init checker

TcpConnEstTimeChecker* checker = (TcpConnEstTimeChecker*)SnortAlloc(sizeof(TcpConnEstTimeChecker));

InitTcpConnEstTimeChecker(checker,

overdue_time_sec, // overdueTime

check_period_sec, // int _checkPeriod

max_overdue_count, // overdueUpperBound

max_overdue_count_diviation, // overdueUpperBoundDiviation

server_timeout_sec// serverTimeout

);

tcpSynFloodData->timeChecker = checker;

printf("TcpSynFlood module initialized with the following parameters:&bsol;n");

printf("&bsol;tserver timeout %d&bsol;n", server_timeout_sec);

printf("&bsol;tmax overdue count %d&bsol;n", max_overdue_count);

printf("&bsol;tmax overdue count diviation %d&bsol;n", max_overdue_count_diviation);

printf("&bsol;toverdue time %d&bsol;n", overdue_time_sec);

printf("&bsol;theck period %d&bsol;n", check_period_sec);

// free tokens memory

mSplitFree(&tokens, numTokens);

}

static int TcpSynFloodCheckFunction(

Packet *p,

struct _OptTreeNode *otn,

OptFpList *fp_list)

{

// Get Rule Data

TcpSynFloodData *tcpSynFloodData;

tcpSynFloodData = otn->ds_list[PLUGIN_TCP_SYN_FLOOD];

int packetType = GetPacketType(tcpSynFloodData->timeChecker, p, tcpSynFloodData->serverIP);

if(packetType != PACKET_TYPE_UNSUPPORTED)

{

// process ACK packets with prevention module

if(packetType == PACKET_TYPE_ACK)

{

printf("Processing ACK&bsol;n");

// check if atack is absent

int changeStat = (tcpSynFloodData->workingMode == TCP_SYN_FLOOD_DETECTION) ? CHANGE_STAT_YES : CHANGE_STAT_NO;

if(changeStat == CHANGE_STAT_YES)

{

// update statistics for "good" client