Перейти к содержимому
Калькуляторы

FastNetMon - программа для выявления входящих/исходящих атак

UAVpilot, а можно дамп трафика на pavel.odintsov@gmail.com?

Да, в понедельник или вторник организую.

 

Фича 2 - уже есть:

Это да. Но было-бы логичнее ещё и из fastnetmon.dat выкинуть показ того, что не считается. :)

 

Фича 3 - скажите, какие переменные нужны и я добавлю :)

Я думаю на первое время достаточно будет банальных число, месяц, год, номер дня недели, часы минуты секунды, ну и ip. :)

Например я для подобных случаев люблю задавать пути типа "/var/log/fastnetmon_attacks/%Y/%m/%d/%H:%M:%S-%i". В идеале конечно было-бы замечательно повторить формат команды date, %i - ip.

 

Но приоритет этого крайне низкий, т.к. несложно реализуется внутри скрипта notify_script_path

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Rolex, поправлено.

Все собралось. Спасибо ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Прекрасно!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

UAVpilot, приветствую! Сделал сокрытие полотна, если определенное направление отработки трафика отключено в конфиге - https://github.com/FastVPSEestiOu/fastnetmon/commit/7e55afe7ea14f284cb0c01bf2999528e7ef830cd

 

Просьба вытянуть изменения и пересобраться :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Фиксирую пожелания по взаимодействию с redis.

 

 

В конфиге:

redis_max_records_of_dump = 20000 # максимальное количество записей о пакетах в redis об одной атаке;

redis_max_records_of_flow = 20000 # максимальное количество записей o Flow в redis об одной атаке;

redis_time_of_store = 267840 # Время жизни записей об атаках в минутах (полгода);

redis_keyfield = ( date,ip,subnet, direction и тд...) # какое поле является ключевым для хранения данных. К примеру если указана date то ключи выглядят так "2012.11.34 22:15_attack" или если IP то как сейчас. Это требуется для точного отбора данных по атаке по запросу а не перебора всех ключей в попытке найти нужный.

 

Сами данные хранить в одном ключе на каждую атаку но в формате JSON.

{
  metadata: {    #  Тут то что есть сейчас в *_information но каждый элемент в виде json 
"Initial attack power": "261419",
    "Peak attack power": "261419",
...    
		# и так далее по всем параметрам.
},

 flow: {#Храним данные о ботах тоже в формате json:
{"ip_dst": "xxx.xxx.xxx.xxx", "port_dst":"23434",  "ip_src": "xxx.xxx.xxx.xxx","port_dst":"8798", "bytes": "4746", "packets":"27"}
{"ip_dst": "xxx.xxx.xxx.xxx", "port_dst":"23434",  "ip_src": "xxx.xxx.xxx.xxx","port_dst":"8798", "bytes": "4746", "packets":"27"}
{"ip_dst": "xxx.xxx.xxx.xxx", "port_dst":"23434",  "ip_src": "xxx.xxx.xxx.xxx","port_dst":"8798", "bytes": "4746", "packets":"27"}
{"ip_dst": "xxx.xxx.xxx.xxx", "port_dst":"23434",  "ip_src": "xxx.xxx.xxx.xxx","port_dst":"8798", "bytes": "4746", "packets":"27"}
    ...
  },
  attack: {  # То же самое и с атакой. Все в формате JSON.
  	{date: "2015-07-05 07:50:33.254087", "ip_dst": "xxx.xxx.xxx.xxx", "port_dst":"23434",  "ip_src": "xxx.xxx.xxx.xxx","port_dst":"8798",  "proto": "6", "packets": "1", "size":"64", "ttl":"0", "sample":"1"; }
  	{date: "2015-07-05 07:50:33.254087", "ip_dst": "xxx.xxx.xxx.xxx", "port_dst":"23434",  "ip_src": "xxx.xxx.xxx.xxx","port_dst":"8798",  "proto": "6", "packets": "1", "size":"64", "ttl":"0", "sample":"1"; }
  	{date: "2015-07-05 07:50:33.254087", "ip_dst": "xxx.xxx.xxx.xxx", "port_dst":"23434",  "ip_src": "xxx.xxx.xxx.xxx","port_dst":"8798",  "proto": "6", "packets": "1", "size":"64", "ttl":"0", "sample":"1"; }
  	{date: "2015-07-05 07:50:33.254087", "ip_dst": "xxx.xxx.xxx.xxx", "port_dst":"23434",  "ip_src": "xxx.xxx.xxx.xxx","port_dst":"8798",  "proto": "6", "packets": "1", "size":"64", "ttl":"0", "sample":"1"; }
  	...
  }
}

Вообще по идеологии хранения NO SQL имеет смысл сделать отдельный ключ для хранения ссылок на ключи где в свою очередь хранятся данные об атаках но раз у нас в redis есть такая душевная вещь как keys *, то можно и не делать. ;)

 

Помещать данные которые выводим на экран с помощью fastnetmon_client в redis в ключе fastnetmon_client в формате json

{
incoming : {pps: 108635, mbps:162, flows: 9722},
outgoing : {pps: 108635, mbps:162, flows: 9722},
   Internal: {pps: 1085, mbps:16},
   other:{ pps: 1085, mbps:16},
	incoming_ip: {
	xxx.xxx.xxx.xxx: {pps: 1086, mbps:12, flows: 97},
	xxx.xxx.xxx.xxx: {pps: 1086, mbps:12, flows: 97, banned:1},   # пример забаненного IP
	xxx.xxx.xxx.xxx: {pps: 1086, mbps:12, flows: 97},
	xxx.xxx.xxx.xxx: {pps: 1086, mbps:12, flows: 97},
	xxx.xxx.xxx.xxx: {pps: 1086, mbps:12, flows: 97},
	},
	outgoing_ip: {
	xxx.xxx.xxx.xxx:  {pps: 1086, mbps:12, flows: 97},
	xxx.xxx.xxx.xxx:  {pps: 1086, mbps:12, flows: 97},
	xxx.xxx.xxx.xxx:  {pps: 1086, mbps:12, flows: 97},
	xxx.xxx.xxx.xxx:  {pps: 1086, mbps:12, flows: 97},
	xxx.xxx.xxx.xxx:  {pps: 1086, mbps:12, flows: 97},
	},
datetime:  $now,   # дата и время последнего апдейта 
calculated: 993,
total amount: 3434343,
rcv: 187359781234987,
drop: {count:0,percent: 0}, 
subnet:
	{ 
	111.222.222.111/24:{pps_in:232, pps_out:322, bps_in:232323, bps_out:232323},
	222.111.111,222/24:{pps_in:232, pps_out:322, bps_in:232323, bps_out:232323},
	}
banned:
	{    # если есть забаненные...
	10.10.10.10/32 : {packets:100500, bytes:222323232323, flows: 12121212, type: udp_flood},
	10.10.20.30/32 : {packets:100500, bytes:222323232323, flows: 12121212, type: icmp_flood},
	}
}

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

По сути это позволит использовать эти данные по желанию в любых программах, выводить это в системы сбора статистики, в режиме реального времени (pooling) выводить в веб, в общем обкручивать fastnetmon внешними системами и обработчиками. Например натравить nagios на список забаненых, так чтобы он орал всегда когда обнаружена атака, отображать в cacti текущий поток обрабатываемых данных, уведомлять abuse админов сетей ботов, и т.д.

 

P/S Прошу извинить за сумбурность описания.

Изменено пользователем Rolex

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А у вас точно последняя версия? Просто в 1.1.2 уже везде используются усредненные графики и клиент отображает именно их, а не абсолютные значения. Они как раз должны обсчитываться корректно и не мотаться сильно (ибо они же берутся и для бана).

Неочень прозрачно (поправив версию branch c 1.1.2 на 1.1.3 в инсталляционном скрипте), но обновился до 1.1.3. Здесь действительно усреднение в клиенте работает. Не так как хотелось бы, но подозреваю, что с данными, которые получаем дискретно, лучше не получится :) Теперь не просто пик один раз в 60 сек и потом в течение 59 секунд счетчик по нулям, а действительно текущее среднее значение за 60 сек и плавное снижение до 50% :) Учитывая, что важны порядки значений, то вполне приемлемо. Подумаю на досуге над этой математической задачкой.

 

Павел, спасибо большое за Fastnetmon! Классный проект и уверен у него большое будущее! Будет очень классно, если научиться совместно с ExaBGP научится синхронизировать информацию о маршрутах. Иначе в случае падения Fastnetmon они просто "залипают" в exabgp и наоборот.

Изменено пользователем olegarhiy

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

UAVpilot, а можно дамп трафика на pavel.odintsov@gmail.com?

 

Отправил 30-секундный дамп, ~20MB. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Rolex, сложный вопрос, обдумываю!

 

UAVpilot, спасибо, постараюсь его разобрать поскорее. Пока почти точно видно, что он битый.

 

olegarhiy, про залипание маршрутов я обдумаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Павел, спасибо! Полезная фича, т.к. есть "особенные" хосты в сети :) Но у меня сходу не заработала. Добавил в группу "my_hosts" хост, который банить по глобальным критериям не надо, но все равно банит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А код актуальный точно из репо? Покажите конфиг :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А код актуальный точно из репо? Покажите конфиг :)

Код актуальный.

# We could create group of hosts with non standard thresholds
# You should create this groups before (in configuration file) specifying any limits
#hostgroup = my_hosts:10.10.10.221/32,10.10.10.222/32
hostgroup = my_hosts:10.11.12.13/32

# Configure this group
my_hosts_enable_ban = yes

my_hosts_ban_for_pps = yes
my_hosts_ban_for_bandwidth = yes
my_hosts_ban_for_flows = yes

my_hosts_threshold_pps = 50000
my_hosts_threshold_mbps = 1000
my_hosts_threshold_flows = 53500

Изменено пользователем olegarhiy

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А этот хост явно прописан в networks_list или же нет? Его там нужно указать явно :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А этот хост явно прописан в networks_list или же нет? Его там нужно указать явно :)

Павел, действительно! :) Прописал в networks_list и банить перестало по глобальным критериям. Но необходимость указания в networks_list исключает возможность анонсирования самой сети вместо хоста ;)

 

Опять наступил на грабельки с "on" - "yes", "off" - "no". Я пока до сих пор не могу уловить логику в каких параметрах какой указывать. Т.е. вышестоящий код не заработал в плане бана, т.е. вообще перестало банить, т.к. требовалось указать "on" вместо "yes". По-умолчанию все выставлено в "no" :)

Т.е. рабочий конфиг:

# We could create group of hosts with non standard thresholds
# You should create this groups before (in configuration file) specifying any limits
#hostgroup = my_hosts:10.10.10.221/32,10.10.10.222/32
hostgroup = my_hosts:10.11.12.13/32

# Configure this group
my_hosts_enable_ban = yes

my_hosts_ban_for_pps = on
my_hosts_ban_for_bandwidth = on
my_hosts_ban_for_flows = on

my_hosts_threshold_pps = 50000
my_hosts_threshold_mbps = 1000
my_hosts_threshold_flows = 53500

 

Лимит сообщений на сегодня у меня закончился. Найти ошибку в конфигурации между "on" и "no" тяжеловато ;) А учитывая, что ещё возможны варианты с off и yes, траблшутинг может затянуться надолго :) Фичи могут просто "потеряться", т.к. вводят в эксплуатацию одни специалисты, а непосредственно эксплуатацией могут заниматься уже другие.

Изменено пользователем olegarhiy

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да, увы эта фича теряется. Только on/no, иного не дано :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно сделать хитрый воркэраунд. Сделать флажок, который будет вынуждать анонсировать не конкретную сетку (/32 для /32), а сеть минимальной длины для глобального роутинга - /24.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно сделать хитрый воркэраунд. Сделать флажок, который будет вынуждать анонсировать не конкретную сетку (/32 для /32), а сеть минимальной длины для глобального роутинга - /24.

Ух, как сложно то все :) Еще бы неплохо научиться мониторить оба типа трафика (входящий/исходящий), но при этом оставлять возможность выбора по какому из них банить. Т.е. я не вижу практического смысла банить на основании показателей исходящего трафика, но для анализа каких-либо проблем знать их очень полезно.

 

Настроил graphite - я в восторге! Работать с данными по трафику так легко ещё не было никогда :) Спасибо большое! Хороших выходных :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рад что нравится=) Друзья, а что думаете про mongodb под хранение конфигов и инфы об атаках?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А чем обусловлена именно монга?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Павел, странный баг. Вместо того, чтобы "разбанить" нужную сеть после "атаки" вижу следующее в логах exabgp:

Thu, 16 Jul 2015 16:00:18 INFO 164775 processes Command from process service-dynamic : withdraw route 0.0.0.0/0

Thu, 16 Jul 2015 16:00:18 INFO 164775 supervisor Command could not parse route in : withdraw route 0.0.0.0/0

 

В логе fastnetmon увидел следующее:

2015-07-16 16:00:18,166 [iNFO] We will unban banned IP: 10.11.12.13 because it ban time 1900 seconds is ended

2015-07-16 16:00:18,166 [iNFO] Call script for unban client: 10.11.12.13

2015-07-16 16:00:18,166 [iNFO] Script for unban client is finished: 10.11.12.13

2015-07-16 16:00:18,167 [iNFO] Call ExaBGP for unban client started: 10.11.12.13

2015-07-16 16:00:18,167 [iNFO] Call to ExaBGP for unban client is finished: 10.11.12.13

2015-07-16 16:00:18,177 [iNFO] ExaBGP announce message: withdraw route 0.0.0.0/0

 

В бан fastnetmon передал exabgp маршрут правильный, а вот удалить его не смог корректно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А версия с Git?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А версия с Git?

Обновился до последней, т.к. исходники прежние удалил. Проблема осталась.

 

git show HEAD

commit 3bd8477c024f235e29324c4e109c667dada235b1

Author: Pavel Odintsov...

Date: Wed Jul 15 13:55:10 2015 +0200

Изменено пользователем olegarhiy

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Совсем беда:

2015-07-16 18:41:06,898 [iNFO] We will unban banned IP: 10.10.16.68 because it ban time 1900 seconds is ended

2015-07-16 18:41:06,898 [iNFO] Call script for unban client: 10.10.16.68

2015-07-16 18:41:06,898 [iNFO] Script for unban client is finished: 10.10.16.68

2015-07-16 18:41:06,898 [iNFO] Call ExaBGP for unban client started: 10.10.16.68

2015-07-16 18:41:06,900 [iNFO] Call to ExaBGP for unban client is finished: 10.10.16.68

2015-07-16 18:41:06,900 [iNFO] ExaBGP announce message: withdraw route 0.0.0.0/0

 

2015-07-16 18:42:06,900 [ERROR] Attack to IP 10.10.17.40 still going! We should not unblock this host

2015-07-16 18:43:06,900 [ERROR] Attack to IP 10.10.17.40 still going! We should not unblock this host

2015-07-16 18:44:06,900 [ERROR] Attack to IP 10.10.17.40 still going! We should not unblock this host

2015-07-16 18:45:06,901 [ERROR] Attack to IP 10.10.17.40 still going! We should not unblock this host

2015-07-16 18:46:06,901 [ERROR] Attack to IP 10.10.17.40 still going! We should not unblock this host

2015-07-16 18:47:06,901 [ERROR] Attack to IP 10.10.17.40 still going! We should not unblock this host

2015-07-16 18:48:06,901 [ERROR] Attack to IP 10.10.17.40 still going! We should not unblock this host

2015-07-16 18:49:06,901 [ERROR] Attack to IP 10.10.17.40 still going! We should not unblock this host

2015-07-16 18:50:06,902 [ERROR] Attack to IP 10.10.17.40 still going! We should not unblock this host

2015-07-16 18:51:06,902 [ERROR] Attack to IP 10.10.17.40 still going! We should not unblock this host

2015-07-16 18:52:06,902 [ERROR] Attack to IP 10.10.17.40 still going! We should not unblock this host

2015-07-16 18:53:06,902 [iNFO] We will unban banned IP: 10.10.18.14 because it ban time 1900 seconds is ended

2015-07-16 18:53:06,902 [iNFO] Call script for unban client: 10.10.18.14

2015-07-16 18:53:06,902 [iNFO] Script for unban client is finished: 10.10.18.14

2015-07-16 18:53:06,904 [iNFO] Call ExaBGP for unban client started: 10.10.18.14

2015-07-16 18:53:06,904 [iNFO] Call to ExaBGP for unban client is finished: 10.10.18.14

2015-07-16 18:53:06,904 [ERROR] Attack to IP 10.10.17.40 still going! We should not unblock this host

2015-07-16 18:53:06,904 [iNFO] ExaBGP announce message: withdraw route 10.10.17.0/24

 

В networks_list прописаны сети /24.

 

Еще важное замечание: fastnetmon передает неправильный "withdraw"! Т.е. без next-hop и community! Exabgp версии 2.0.7 ругается, т.к. ей до этого передали "announce" маршрут с next-hop и community! НЕ надо использовать exabgp из системных пакетов на Debian (устаревшая версия, которая требует next-hop и community). Правильно: pip install exabgp (версия 3.4.11 не требует next-hop и community для операции "withdraw").

Изменено пользователем olegarhiy

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Полностью переписал этот код, теперь его по крайне мере можно понимать что он делает, возможно, изначальный баг тоже починился :)

 

Rolex, я помню про Вас - JSON есть в родмэпе, но скорее всего будет засунут в MongoDB вместо Redis :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.