RAFT: Optical Flow estimation using Deep Learning

RAFT: Optical Flow estimation using Deep Learning Мультикоптеры

Flownet (2023)

Взявшись за построение архитектуры нейронной сети для задачи вычисления оптического потока в далеком 2023, авторы (из Мюнхенского и Фрайбургского университетов) столкнулись с двумя проблемами: под данную задачу не было большого размеченного датасета, а его разметка вручную составляла бы определенные сложности (попробуй разметить куда двинулся каждый пиксель изображения на следующем кадре), во-первых.

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

В качестве первой итерации было решено в качестве входа просто стакнуть два RGB-кадра (получив, по-сути, 6-канальное изображение), между которыми мы хотим подсчитать оптический поток, а в качестве архитектуры взять U-net с рядом изменений. Такую сеть назвали FlowNetS (S значит Simple):

Как видно из схемы, энкодер ничем не примечателен, декодер же отличается от классических вариантов несколькими вещами:

  1. Предсказание оптического потока происходит не только с последнего уровня, но также и со всех остальных. Чтобы получить Ground Truth для i-го уровня декодера, исходный таргет (т.е. оптический поток) просто уменьшается (почти так же, как и изображение) до нужного разрешения, а сам предикт, получившийся на i-м уровне докидывается дальше, т. е. конкатенируется с выходящей из этого уровня картой признаков. Общая функция потерь при обучении будет являться взвешенной суммой лоссов со всех уровней декодера, сам вес будет при этом тем больше, чем ближе уровень к выходу сети. Авторы не дают объяснения почему так делается, но скорее всего причиной служит тот факт, что резкие движения лучше детектировать на ранних уровнях, тогда на оптическом потоке меньшего разрешения вектора не будут такими большими.
  2. На схеме видно, что входное разрешение изображений — 384х512, а у выхода в четыре раза меньше. Авторы заметили, что если увеличить такой выход до 384х512 простой билинейной интерполяцией, это даст такое же качество, как если прикрепить еще два уровня декодера. Также можно использовать вариационный подход [2], что докидывает еще качества ( v в таблице с качеством).
  3. Как и в U-net, карты признаков с энкодера прокидываются в декодер и конкатенируются как показано на схеме.
Смотрите про коптеры:  Радиоуправление краном | Заказать перевод крана на радиоуправление

Чтобы понять, как авторы попробовали улучшить свой бейзлайн, нужно знать, что такое корреляция между изображениями и почему она может быть полезна при подсчете оптического потока. Итак, имея два изображения и зная, что второе является следующим кадром в видео относительно первого, мы можем попытаться сопоставить область вокруг точки на первом кадре (для которой хотим найти сдвиг до второго кадра) с областями такого же размера на втором изображении.

Возьмем два соседних кадра видео, мы хотим определить куда сместилась определенная точка с первого кадра до второго. Предположим, что некоторая область вокруг этой точки сдвинулась точно также. Действительно, соседние пиксели на видео обычно смещаются вместе, т.к. скорее всего, визуально, являются частью одного объекта. Это предположение активно используется, например, в дифференциальных подходах, о чем можно подробней прочитать в [5], [6].

fig, ax = plt.subplots(1, 2, figsize=(20, 10))
ax[0].imshow(frame1)
ax[1].imshow(frame2);

Попробуем взять точку в центре лапки котенка и найти ее же на втором кадре. Возьмем некоторую область вокруг нее.

patch1 = frame1[90:190, 140:250]
plt.imshow(patch1);

Рассчитаем корреляцию между этой областью (в англоязычной литературе часто пишут template или patch с первого изображения) и вторым изображением. Шаблон будет просто «гулять» по второму изображению и рассчитывать следующую величину между собой и кусочками такого же размера на втором изображении:

Чем больше будет значение этой величины, тем больше шаблон похож на соответствующий кусок на втором изображении. С помощью OpenCV это можно сделать так:

corr = cv2.matchTemplate(frame2, patch1, cv2.TM_CCORR_NORMED)
plt.imshow(corr, cmap='gray');

Подробнее можно почитать в [7].

Результат выглядит следующим образом:

Мы видим явный пик, обозначенный белым цветом. Найдем его на втором кадре:

Flow-протоколы как инструмент мониторинга безопасности внутренней сети

Когда речь заходит о мониторинге безопасности внутренней корпоративной или ведомственной сети, то у многих возникает ассоциация с контролем утечек информации и внедрением DLP-решений. А если попробовать уточнить вопрос и спросить, как вы обнаруживаете атаки во внутренней сети, то ответом будет, как правило, упоминание систем обнаружения атак (intrusion detection systems, IDS). И то, что было единственным вариантом еще лет 10-20 назад, то сегодня становится анахронизмом. Существует более эффективный, а местами и единственно возможный вариант мониторинга внутренней сети — использовать flow-протоколов, изначально предназначенных для поиска сетевых проблем (troubleshooting), но со временем трансформировавшихся в очень интересный инструмент безопасности. Вот о том, какие flow-протоколы бывают и какие из них лучше помогают обнаруживать сетевые атаки, где лучше всего внедрять мониторинг flow, на что обратить внимание при развертывании такой схемы, и даже как это все “поднять” на отечественном оборудовании, мы и поговорим в рамках данной статьи.

Я не буду останавливаться на вопросе “Зачем нужен мониторинг безопасности внутренней инфраструктуры?” Ответ на него вроде и так понятен. Но если все-таки вы хотели бы еще раз убедиться, что сегодня без этого никуда, посмотрите небольшое видео с рассказом о том, как можно 17-тью способами проникнуть в корпоративную сеть, защищенную межсетевым экраном. Поэтому будем считать, что мы понимаем, что внутренний мониторинг — штука нужная и осталось только понять, как его можно организовать.

Я бы выделил три ключевых источника данных для мониторинга инфраструктуры на сетевом уровне:

Три источника данных для мониторинга сети

Захват сырого трафика — самый популярный у безопасников вариант, потому что он исторически появился и самым первым. Обычные сетевые системы обнаружения атак (самой первой коммерческой системой обнаружения атак была NetRanger от компании Wheel Group, купленная в 1998-м году Cisco) как раз и занимались захватом пакетов (а позже и сессий), в которых искались определенные сигнатуры (“решающие правила” в терминологии ФСТЭК), сигнализирующие об атаках. Разумеется, анализировать сырой трафик можно не только с помощью IDS, но и с помощью иных средств (например, Wireshark, tcpdum или функционал NBAR2 в Cisco IOS), но им обычно не хватает базы знаний, которая отличает средство ИБ от обычного ИТ-инструмента.

Итак, системы обнаружения атак. Самый старый и самый популярный метод обнаружения сетевых атак, который неплохо справляется со своей задачей на периметре (неважно каком — корпоративном, ЦОДа, сегмента и т.п.), но пасует в современных коммутируемых и программно-определяемых сетях. В случае с сетью, построенной на базе обычных коммутаторов, инфраструктура сенсоров обнаружения атак становится слишком большой — вам придется ставить по сенсору на каждый соединение с узлом, атаки на который вы хотите мониторить. Любой производитель, конечно, будет рад продать вам сотни и тысячи сенсоров, но думаю ваш бюджет не выдержить таких расходов. Могу сказать, что даже в Cisco (а мы являемся разработчиками NGIPS) мы не смогли это сделать, хотя, казалось бы, вопрос цены перед нами. стоять не должен — это же наше собственное решение. Кроме того, возникает вопрос, а как подключать сенсор в таком варианте? В разрыв? А если сам сенсор будет выведен из строя? Требовать наличия bypass-модуля в сенсоре? Использовать разветвители (tap)? Все это удорожает решение и делает его неподъемным для компании любого масштаба.

image

Можно попробовать “повесить” сенсор на SPAN/RSPAN/ERSPAN-порт и направить на него трафик с необходимых портов коммутатора. Этот вариант частично снимает проблему, описанную в предыдущем абзаце, но ставит другую — SPAN-порт не может принять абсолютно весь трафик, который в него будет направляться — ему не хватит пропускной способности. Приджется чем-то жертвовать. Или часть узлов оставить без мониторинга (тогда предварительно вам надо провести их приоритезацию), или направлять не весь трафик с узла, а только определенного типа. В любой случае мы можем пропустить какие-то атаки. Кроме того, SPAN-порт может быть занят под другие нужды. В итоге, нам придется пересмотреть существующую топологию сети и внести, возможно, в нее коррективы, чтобы охватить по максимуму вашу сеть имеющимся у вас числом сенсоров (и согласовать это с ИТ).

А если у вас сеть использует асимметричные маршруты? А если у вас внедрен или планируется к внедрению SDN? А если вам надо мониторить виртуализированные машины или контейнеры, трафик которых вообще не доходит до физического коммутатора? Эти вопросы не любят производители традиционных IDS, потому что не знают, как ответить на них. Возможно, они будут склонять вас к тому, что все эти модные технологии — хайп и вам он не нужен. Возможно, они будут говорить о необходимости начать с малого. А может быть быть они скажут, что вам надо поставить мощную молотилку в центр сети и направить весь трафик в нее с помощью балансировщиков. Какой бы вариант вам не предлагали, вам нужно самим четко понять, насколько он вам подходит. И только после этого принимать решение о выборе подхода к мониторингу ИБ сетевой инфраструктуры. Возвращаясь же к захвату пакетов, хочу сказать, что этот метод продолжает оставаться очень популярным и важным, но его основное предназначение — контроль границ; границ между вашей организацией и Интернет, границ между ЦОДом и остальной сетью, границ между АСУ ТП и корпоративным сегментом. В этих местах классические IDS/IPS по-прежнему имеют право на существование и неплохо справляются с поставленными задачами.

image

Перейдем ко второму варианту. Анализ событий, поступаемых с сетевых устройств, тоже может быть использован для целей обнаружения атак, но не как основной механизм, так как он позволяет детектировать только небольшой класс вторжений. К тому же ему присуща некоторая реактивность — атака сначала должна произойти, потом она должна быть зафиксирована сетевым устройством, которое тем или иным способом будет сигнализировать о проблеме с ИБ. Способов таких несколько. Это может быть syslog, RMON или SNMP. Последние два протокола для сетевого мониторинга в контексте ИБ применяются только если нам необходимо обнаружить DoS-атаку на само сетевое оборудование, так как с помощью RMON и SNMP можно, например, отслеживать загрузку центрального процессора устройства или его интерфейсов. Это один из самых “дешевых” (syslog или SNMP есть у всех), но и самый неэффективный из всех способов мониторинга ИБ внутренней инфраструктуры — многие атаки просто скрыты от него. Разумеется им не надо пренебрегать и тот же анализ syslog помогает вам своевременно идентифицировать изменения в конфигурации самого устройства, компрометацию именно его, но обнаруживать атаки на всю сеть он не очень подходит.

Третий вариант — это анализ информации о трафике, проходящем через устройство, поддерживающее один из нескольких flow-протоколов. В данном случае, независимо от протокола, инфраструктура работы с потоками обязательно состоит из трех компонентов:

  • Генерация или экспорт flow. Эта роль обычно возлагается на маршрутизатор, коммутатор или иное сетевое устройство, которое, пропуская через себя сетевой трафик, позволяет выделять из него ключевые параметры, которые затем передаются на модуль сбора. Например, у Cisco протокол Netflow поддерживается не только на маршрутизаторах и коммутаторах, включая и виртуальные и промышленные, но и на беспроводных контролерах, межсетевых экранах и даже серверах.
  • Сбор flow. Учитывая, что в современной сети обычно более одного сетевого устройства, возникает задача сбора и консолидации потоков, которая решается с помощью так называемых коллекторов, которые проводят обработку полученных потоков и затем передают их для анализа.
  • Анализ flow. Анализатор берет на себя основную интеллектуальную задачу и, применяя к потокам различные алгоритмы, делает те или иные выводы. Например, в рамках ИТ-функции такой анализатор может выявлять узкие места сети или анализировать профиль загрузки трафика для дальнейшей оптимизации сети. А для ИБ такой анализатор может выявлять утечки данных, распространение вредоносного кода или DoS-атаки.

Не стоит думать, что такая трехзвенная архитектура слишком сложна — все остальные варианты (исключая, быть может, системы сетевого мониторинга, работающие с SNMP и RMON) также работает согласно ней. У нас есть генератор данных для анализа, в качестве которого выступает сетевое устройство или отдельно стоящий сенсор. У нас есть система сбора сигналов тревоги и есть система управления всей инфраструктурой мониторинга. Последние два компонента могут быть объединены в рамках одного узла, но в более-менее крупных сетях они обычно разнесены по двум, как минимум, устройствам с целях обеспечения масштабирования и надежности.

image

В отличие от анализа пакетов, базирующемся на изучении заголовка и тела данных каждого пакета и состоящих из них сессий, анализ потоков опирается на сбор метаданных о сетевом трафике. Когда, сколько, откуда и куда, как… вот вопросы, на которые отвечает анализ сетевой телеметрии с помощью различных протоколов flow. Первоначально они использовались для анализа статистики и поиска ИТ-проблем в сети, но потом, по мере развития аналитических механизмов, их стало возможным применять к той же телеметрии и для целей безопасности. Здесь стоит еще раз отметить, что анализ потоков не заменяет и не отменяет захвата пакетов. Каждый из этих методов имеют свою область применения. Но в контексте данной статьи, именно анализ потоков лучше всего подходит для мониторинга внутренней инфраструктуры. У вас есть сетевые устройства (и не важно, работают они в программно-определяемой парадигме или согласно статическим правилам), которые атака миновать не может. Сенсор классической IDS она обойти может, а сетевое устройство, поддерживающее flow-протокол, нет. В этом преимущество этого метода.

С другой стороны, если вам нужна доказательная база для правоохранительных органов или собственной группы расследования инцидентов, без захвата пакетов вам не обойтись — сетевая телеметрия не является копией трафика, который можно использовать при сборе улик; она нужна для оперативного обнаружения и принятия решений в области ИБ. С другой стороны, используя анализ телеметрии, вы можете “писать” не весь сетевой трафик (если что, то Cisco и ЦОДами занимается :-), а только тот, который участвует в атаке. Средства анализа телеметрии в этом плане хорошо дополнят традиционные механизмы захвата пакетов, давая команду на выборочный захват и хранение. В противном случае вам придется иметь колоссальную инфраструктуру хранения.

Представим сеть, работающую на скорости 250 Мбит/сек. Если вы захотите сохранять весь этот объем, то вам понадобится хранилище на 31 Мб для одной секунды передачи трафика, 1,8 Гб — для одной минуты, 108 Гб — для одного часа, и 2,6 Тб — для одних суток. Для хранения суточных данных с сети с пропускной способностью в 10 Гбит/сек вам понадобится хранилище на 108 Тб. А ведь некоторые регуляторы требуют хранить данные по безопасности годами… Запись «по требованию», которую вам помогает реализовать анализ потоков, помогает сократить эти значения на порядки. Кстати, если говорить о соотношении объема записываемых данных сетевой телеметрии и полного захвата данных, то оно составляет примерно 1 к 500. Для тех же приведенных выше значений, хранение полной расшифровки всего дневного трафика составит 5 и 216 Гб соответственно (можно даже на обычную флешку записать).

Если у средств анализа сырых сетевых данных метод их захвата почти не отличается от вендора к вендору, то в случае с анализом потоков ситуация иная. Существует несколько вариантов flow-протоколов, об отличиях в которых необходимо знать именно в контексте безопасности. Самым популярным является протокол Netflow, разработанный компанией Cisco. Существует несколько версий этого протокола, отличающихся по своим возможностям и объему записываемой о трафике информации. Текущая версия — девятая (Netflow v9), на базе которой был разработан промышленный стандарт Netflow v10, также известный как IPFIX. Сегодня большинство сетевых вендоров поддерживает именно Netflow или IPFIX в своем оборудовании. Но есть и различные другие варианты flow-протоколов — sFlow, jFlow, cFlow, rFlow, NetStream и т.п., из которых более популярным является sFlow. Именно он чаще всего поддерживается отечественными производителями сетевого оборудования ввиду простоты реализации. В чем ключевые отличия между Netflow, как стандарта ставшим таковым де-факто, и тем же sFlow? Ключевых я бы выделил несколько. Во-первых, Netflow имеет настраиваемые пользователем поля в отличие от фиксированных полей в sFlow. А во-вторых, и это самое главное в нашем случае, sFlow собирает так называемую семплированную телеметрию; в отличие от несемплированной у Netflow и IPFIX. В чем же между ними разница?

image

Представьте, что вы решили ознакомиться с книгой “Security Operations Center: Building, Operating, and Maintaining your SOC” моих коллег — Гари Макинтайра, Джозефа Муница и Надема Альфардана (по ссылке вы можете скачать часть книги). У вас есть три варианта достичь поставленной цели — прочитать книгу целиком, пробежать ее глазами, останавливаясь на каждой 10-й или 20-й странице, или попробовать найти пересказ ключевых концепций в каком-либо блоге или сервисе типа SmartReading. Так вот несемплированная телеметрия — это чтение каждой “страницы” сетевого трафика, то есть анализ метаданных по каждому пакету. Семплированная телеметрия — это выборочное изучение трафика в надежде, что в избранных семплах окажется то, что вам нужно. В зависимости от скорости канала семплированная телеметрия будет отдавать для анализа каждый 64-й, 200-й, 500-й, 1000-й, 2000-й или даже 10000-й пакет.

image

В контексте мониторинга ИБ это означает, что семплированная телеметрия хорошо подходит для обнаружения DDoS-атак, сканирования, распространения вредоносного кода, но может пропустить атомарные или многопакетные атаки, не попавшие в семпл, отправленный для анализа. У несмеплированной телеметрии таких недостатков нет и с ее. помощью спектр обнаруживаемых атак гораздо шире. Вот небольшой перечень событий, которые можно обнаруживать с помощью средств анализа сетевой телеметрии.

Некоторые типы инцидентов, обнаруживаемые Stealthwatch Enterprise

Разумеется, какой-нибудь open source анализатор Netflow вам этого не позволит, так как его основная задача — собрать телеметрию и провести над ней базовый анализ с точки зрения ИТ. Для выявления на базе flow угроз ИБ необходимо оснастить анализатор различными движками и алгоритмами, которые и будут на базе стандартных или пользовательских полей Netflow выявлять проблемы кибербезопасности, обогащать стандартные данные внешними данными от различных источников Threat Intelligence и т.п.

Обнаружение вредоноса в зашифрованном трафике

Поэтому если у вас есть выбор, то останавливайте его на Netflow или IPFIX. Но даже если ваше оборудование работает только с sFlow, как у отечественных производителей, то даже в этом случае вы можете извлечь из него пользу в контексте безопасности.

Разница между семплированной и несемплированной телеметрией

Летом 2023-го года я проводил анализ возможностей, которые есть у российских производителей сетевого железа и все они, исключая NSG, Полигона и Крафтвея, заявляли о поддержке sFlow (как минимум, Зелакс, Натекс, Элтекс, QTech, Рустелетех).

Возможность российских сетевых вендоров в части мониторинга сетевой инфраструктуры

Следующий вопрос, который перед вами встанет, — где внедрять поддержку flow для целей безопасности? На самом деле, вопрос поставлен не совсем корректно. На современном оборудовании поддержка flow-протоколов есть почти всегда. Поэтому вопрос я бы переформулировал иначе — где эффективнее всего собирать телеметрию с точки зрения безопасности? Ответ будет достаточно очевидным — на уровне доступа, где вы увидите 100% всего трафика, где у вас будет детальная информация по хостам (MAC, VLAN, ID интерфейса), где вы сможете отслеживать даже P2P-трафик между хостами, что критично для обнаружения сканирования и и распространения вредоносного кода. На уровне ядра часть трафика вы можете просто не увидеть, а на уровне периметра вы увидите хорошо если четверть всего вашего сетевого трафика. Но если по каким-то причинам у вас в сети завелись посторонние устройства, позводляющие злоумышленникам “входить и выходить”, минуя периметр, то анализ телеметрии с него вам ничего не даст. Поэтому для максимального охвата рекомендуется включать сбор телеметрии именно на уровне доступа. При этом, стоит отметить, что даже если мы говорим о виртуализации или контейнерах, то в современных виртуальных коммутаторах также часто встречается поддержка flow, что позволяет контролировать трафик и там.

Но раз уж я поднял тему, то надо ответить на вопрос, а что если все-таки оборудование, физическое или виртуальное, не поддерживает flow-протоколы? Или его включение запрещено (например, в промышленных сегментах для обеспечения надежности)? Или его включение приводит к высокой загрузке центрального процессора (такое бывает на устаревшем оборудовании)? Для решения этой задачи существуют специализированные виртуальные сенсоры (flow sensor), которые по сути являются обычными разветвителями, пропускающими через себя трафик и транслирующие его в виде flow на модуль сбора. Правда, в этом случае мы получаем весь ворох проблем, о которых мы говорили выше применительно к средствам захвата пакетов. То есть надо понимать не только преимущества технологии анализа потоков, но и ее ограничения.

Еще один момент, который важно помнить, говоря о средствах анализа потоков. Если применительно к обычным средствам генерации событий безопасности мы применяем метрику EPS (event per second, событий в секунду), то к анализу телеметрии этот показатель неприменим; он заменяется на FPS (flow per second, поток в секунду). Как и в случае с EPS, вычислить заранее его нельзя, но можно оценить примерное количество потоков, которое генерит то или иное устройство в зависимости от его задачи. В Интернет вы можете найти таблицы с примерными значениями для разных типов корпоративных устройств и услов, что позволит вам прикинуть, какие лицензии вам нужны для средств анализа и какова будет их архитектура? Дело в том, что сенсор IDS ограничен определенной пропускной способностью, которую он “вытянет”, так и коллектор потоков имеет свои ограничения, которые надо понимать. Поэтому в крупных, территориально-распределенных сетях коллекторов обычно несколько. Когда я описывал, как мониторится сеть внутри Cisco, я уже приводил число наших коллекторов — их 21. И это на сеть, разбросанную по пяти материкам и насчитывающую около полумиллиона активных устройств).

Архитектура Stealthwatch Enterprise

В качестве системы мониторинга Netflow мы используем наше собственное решение Cisco Stealthwatch, которое специально ориентировано на решение задач безопасности. У него много встроенных движков обнаружения аномальной, подозрительной и явно вредоносной активности, позволяющей детектировать широкий спектр различных угроз — от криптомайнинга до утечек информации, от распространения вредоносного кода до мошенничества. Как и большинство анализаторов потоков Stealthwatch построен по трехуровневой схеме (генератор — коллектор — анализатор), но он дополнен рядом интересных особенностей, которые важны в контексте рассматриваемого материала. Во-первых, он интегрируется с решениями по захвату пакетов (например, Cisco Security Packet Analyzer), что позволяет записывать выбранные сетевые сессии для последующего глубокого расследования и анализа. Во-вторых, специально для расширения задач безопасности мы разработали специальный протокол nvzFlow, который позволяет “транслировать” активность приложений на оконечных узлах (серверах, рабочих станциях и т.п.) в телеметрию и передавать ее на коллектор для дальнейшего анализа. Если в своей исконном варианте Stealthwatch работает с любым flow-протоколом (sFlow, rFlow, Netflow, IPFIX, cFlow, jFlow, NetStream) на уровне сети, то поддержка nvzFlow позволяет проводить корреляцию данных еще и на уровне узла, тем самым. повышая эффективности всей системы и видя больше атак, чем обычные сетевые анализаторы потоков.

Понятно, что говоря о системах анализа Netflow с точки зрения безопасности, рынок не ограничен единственным решением от Cisco. Вы можете использовать как коммерческие, так и бесплатные или условно бесплатные решения. Достаточно странно, если я в блоге Cisco буду приводить в пример решения конкурентов, поэтому скажу пару слов о том, как сетевая телеметрия может быть проанализирована с помощью двух популярных, схожих по названию, но все-таки разных инструментов — SiLK и ELK.

SiLK — это набор инструментов (the System for Internet-Level Knowledge) для анализа трафика, разработанный американским CERT/CC и который поддерживает, в контексте сегодняшней статьи, Netflow (5-й и 9-й, самых популярных версий), IPFIX и sFlow и с помощью различных утилит (rwfilter, rwcount, rwflowpack и др.) производить различные операции над сетевой телеметрией с целью обнаружения в ней признаков несанкционированных действий. Но надо отметить пару важных моментов. SiLK — это инструмент командной строки и проводить оперативный анализ, все время ввода команды вида (обнаружение ICMP-пакетов размером более 200 байт):

rwfilter --flowtypes=all/all --proto=1 --bytes-per-packet=200- --pass=stdout | rwrwcut --fields=sIP,dIP,iType,iCode --num-recs=15

не очень удобно. Вы можете использовать графический интерфейс iSiLK, но он не сильно облегчит вашу жизнь, решая только функцию визуализации, а не замены аналитика. И это второй момент. В отличие от коммерческих решений, в которые уже заложена солидная аналитическая база, алгоритмы обнаружения аномалий, соответствующие workflow и т.п., в случае с SiLK вы все это должны будете проделать самостоятельно, что потребует от вас немного иных компетенций, чем от использования уже готового к работе инструментария. Это нехорошо и неплохо — это особенность почти любого бесплатного инструмента, который исходит из того, что вы знаете, что делать, а он вам только поможет в этом (коммерческий инструментарий менее зависим от компетенций его пользователей, хотя тоже предполагает, что аналитики понимают хотя бы основы проведения сетевых расследований и мониторинга). Но вернемся к SiLK. Цикл работы аналитика с ним выглядит следующим образом:

  • Формулирование гипотезы. Мы должны понимать, что мы будем искать внутри сетевой телеметрии, знать уникальные атрибуты, по которым будем выявлять те или иные аномалии или угрозы.
  • Построение модели. Сформулировав гипотезу, мы программируем ее с помощью того же Python, шелла или иных инструментов, не входящих в SiLK.
  • Тестирование. Наступает черед проверки правильности нашей гипотезы, которая подтверждается или опровергается с помощью утилит SiLK, начинающихся с ‘rw’, ‘set’, ‘bag’.
  • Анализ реальных данных. В промышленной эксплуатации SiLK нам помогает нам выявлять нечто и аналитик должен ответить на вопросы «Нашли ли мы то, что предполагали?», «Соответствует ли это нашей гипотезе?», «Как снизит число ложных срабатываний?», «Как улучшить уровень распознавания?» и т.п.
  • Улучшение. На финальном этапе мы улучшаем сделанное ранее — создаем шаблоны, улучшаем и оптимизируем код, переформулируем и уточняем гипотезу и др.

Этот цикл будет применим и к тому же Cisco Stealthwatch, только последний эти пять шагов автоматизирует по максимуму, снижая число ошибок аналитика и повышая оперативность обнаружения инцидентов. Например, в SiLK сетевую статистику вы можете обогатить внешними данными по вредоносным IP с помощью собственноручно написанных скриптов, а в Cisco Stealthwatch — это встроенная функция, которая сразу вам отображает сигнал тревоги, если в сетевом трафике встречается взаимодействие с IP-адресами из черного списка.

Если пойти выше по пирамиде «платности» ПО по анализу flow, то за абсолютно бесплатным SiLK будет идти условно бесплатный ELK, состоящий из трех ключевых компонентов — Elasticsearch (индексация, поиск и анализ данных), Logstash (ввод/вывод данных)и Kibana (визуализация). В отличие от SiLK, где все приходится писать самому, у ELK уже есть много готовых библиотек/модулей (часть платные, часть нет), которые автоматизируют анализ сетевой телеметрии. Например, фильтр GeoIP в Logstash позволяет привязать наблюдаемые IP-адреса к их географическому местоположению (у того же Stealthwatch это встроенная функция).

Геолокация в ELK

У ELK также достаточно большое комьюнити, которое дописывает недостающие компоненты для этого решения по мониторингу. Например, чтобы работать с Netflow, IPFIX и sFlow вы можете воспользоваться модулем elastiflow, если вас не устраивает Logstash Netflow Module, поддерживающий только Netflow.

Давая больше оперативности по сбору flow и поиску в нем, у ELK на текущий момент отсутствует богатая встроенная аналитика по обнаружению аномалий и угроз в сетевой телеметрии. То есть, следуя выше описанному жизненному циклу, вам придется самостоятельно описывать модели нарушений и потом уже пользоваться им в боевой системе (встроенных моделей там нет).

Logstash Netflow Module

Есть конечно и более навороченные расширения для ELK, в которых уже заложены некоторые модели выявления аномалий в сетевой телеметрии, но такие расширения стоят денег и тут уже вопрос, стоит ли овчинка выделки — писать аналогичную модель самому, покупать ее реализацию для своего средства мониторинга или купить готовое решение класса Network Traffic Analysis.

Платный модуль анализа flow для ELK (3rd party решение)

Вообще не хочу вдаваться в полемику, что лучше потратить деньги и купить готовое решение для мониторинга аномалий и угроз в сетевой телеметрии (например, Cisco Stealthwatch) или разобраться самостоятельно и докручивать под каждую новую угрозу тот же SiLK, ELK или nfdump или OSU Flow Tools (я про последние два из них рассказывал в прошлый раз)? Каждый выбирает для себя и у каждого есть свои мотивы выбрать любой из двух вариантов. Я же хотел просто показать, что сетевая телеметрия — это очень важный инструмент в обеспечении сетевой безопасности свой внутренней инфраструктуры и пренебрегать им не стоит, чтобы не пополнить список компания, чье имя упоминается в СМИ вместе с эпитетами «взломанная», «несоблюдавшая требования по ИБ», «недумающая о безопасности своих данных и данных клиентов».

Stealthwatch Enterprise

Подводя итоги, я бы хотел перечислить ключевые советы, которым стоит следовать при выстраивании мониторинга ИБ своей внутренней инфраструктуры:

  1. Не ограничивайтесь только периметром! Используйте (и выбирайте) сетевую инфраструктуру не только для передачи трафика из точки А в точку Б, но и для решения вопросов кибербезопасности.
  2. Изучите существущие механизмы мониторинга ИБ в вашем сетевом оборудовании и задействуйте их.
  3. Для внутреннего мониторинга отдавайте предпочтение анализу телеметрии — он позволяет обнаруживать до 80-90% всех сетевых инцидентов ИБ, делая при этом то, что невозможно при захвате сетевых пакетов и экономя пространство для хранения всех событий ИБ.
  4. Для мониторинга потоков используйте Netflow v9 или IPFIX – они дают больше информации в контексте безопасности и позволяют мониторить не только IPv4, но и IPv6, MPLS и т.д.
  5. Используйте несемплированный flow-протокол – он дает больше информации для обнаружения угроз. Например, Netflow или IPFIX.
  6. Проверьте загрузку вашего сетевого оборудования – возможно оно не справится с обработкой еще и flow-протокола. Тогда продумайте применение виртуальных сенсоров или Netflow Generation Appliance.
  7. Реализуйте контроль в первую очередь на уровне доступа – это даст вам возможность видеть 100% всего трафика.
  8. Если вы у вас не выбора и вы используете российское сетевое оборудование, то выбирайте то, которое поддерживает flow-протоколы или имеет SPAN/RSPAN-порты.
  9. Комбинируйте системы обнаружения/ предотвращения вторжения/атак на границах и системы анализа потоков во внутренней сети (в том числе и в облаках).

image

Что касается последнего совета, то я бы хотел привести иллюстрацию, которую уже приводил раньше. Вы видите, что если раньше служба ИБ Cisco почти целиком выстраивала свою систему мониторинга ИБ на базе систем обнаружения вторжений и сигнатурных методов, то сейчас на их долю приходится всего 20% инцидентов. Еще 20% приходится на системы анализа потоков, что говорит о том, что эти решения — не блажь, а реальный инструмент в деятельности служб ИБ современного предприятия. Тем более, что у вас для их внедрения есть самое главное — сетевая инфраструктура, инвестиции в которую можно дополнительно защитить, возложив на сеть еще и функции мониторинга ИБ.

image

Я специально не стал касаться темы реагирования на выявленные в сетевых потоках аномалии или угрозы, но думаю, что и так понятно, что мониторинг не должен завершаться только обнаружением угрозы. За ним должно следовать реагирование и желательно в автоматическом или автоматизированном режиме. Но это уже тема отдельного материала.

Дополнительная информация:

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

Implementation

Since the OpenCV Dense Optical Flow algorithms have the same usage pattern, we’ve created the wrapper function for convenience and code duplication avoiding.

At first, we need to read the first video frame and do image preprocessing if necessary:

Python:

C :

The main part of the demo is a loop, where we calculate Optical Flow for each new pair of consecutive images. After that, we encode the result into HSV format for visualization purposes:

Python:

while True:
    # Read the next frame
    ret, new_frame = cap.read()
    frame_copy = new_frame
    if not ret:
        break

    # Preprocessing for exact method
    if to_gray:
        new_frame = cv2.cvtColor(new_frame, cv2.COLOR_BGR2GRAY)

    # Calculate Optical Flow
    flow = method(old_frame, new_frame, None, *params)

    # Encoding: convert the algorithm's output into Polar coordinates
    mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])
    # Use Hue and Value to encode the Optical Flow
    hsv[..., 0] = ang * 180 / np.pi / 2
    hsv[..., 2] = cv2.normalize(mag, None, 0, 255, cv2.NORM_MINMAX)

    # Convert HSV image into BGR for demo
    bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
    cv2.imshow("frame", frame_copy)
    cv2.imshow("optical flow", bgr)
    k = cv2.waitKey(25) & 0xFF
    if k == 27:
        break

    # Update the previous frame
    old_frame = new_frame

C :

while (true) {
    // Read the next frame
    Mat frame2, next;
    capture >> frame2;
    if (frame2.empty())
        break;

    // Preprocessing for exact method
    if (to_gray)
        cvtColor(frame2, next, COLOR_BGR2GRAY);
    else
        next = frame2;

    // Calculate Optical Flow
    Mat flow(prvs.size(), CV_32FC2);
    method(prvs, next, flow, std::forward<Args>(args)...);

    // Visualization part
    Mat flow_parts[2];
    split(flow, flow_parts);

    // Convert the algorithm's output into Polar coordinates
    Mat magnitude, angle, magn_norm;
    cartToPolar(flow_parts[0], flow_parts[1], magnitude, angle, true);
    normalize(magnitude, magn_norm, 0.0f, 1.0f, NORM_MINMAX);
    angle *= ((1.f / 360.f) * (180.f / 255.f));

    // Build hsv image
    Mat _hsv[3], hsv, hsv8, bgr;
    _hsv[0] = angle;
    _hsv[1] = Mat::ones(angle.size(), CV_32F);
    _hsv[2] = magn_norm;
    merge(_hsv, 3, hsv);
    hsv.convertTo(hsv8, CV_8U, 255.0);
    
    // Display the results
    cvtColor(hsv8, bgr, COLOR_HSV2BGR);
    if (save) {
        string save_path = "./optical_flow_frames/frame_"   to_string(counter)   ".jpg";
        imwrite(save_path, bgr);
    }
    imshow("frame", frame2);
    imshow("flow", bgr);
    int keyboard = waitKey(30);
    if (keyboard == 'q' || keyboard == 27)
        break;

    // Update the previous frame
    prvs = next;
    counter  ;
}

Therefore, this function reads two consecutive frames as method input. In some cases, the image grayscaling is needed, so the to_gray parameter should be set as True. After we got the algorithm output, we encode it for proper visualization using HSV color format.

Lucas-kanade implementation with opencv

OpenCV has the implementation of Pyramid Lucas & Kanade with Shi-Tomasi algorithm improvement to calculate the Optical Flow. Let’s take a look at the OpenCV algorithm based on official documentation.

At first, we need to read our video and get the Shi-Tomasi algorithm’s features from the first frame. Also, some preprocessing things for algorithms and visualization are required here.

Python:

def lucas_kanade_method(video_path):
    # Read the video 
    cap = cv2.VideoCapture(video_path)

    # Parameters for ShiTomasi corner detection
    feature_params = dict(maxCorners=100, qualityLevel=0.3, minDistance=7, blockSize=7)

    # Parameters for Lucas Kanade optical flow
    lk_params = dict(
        winSize=(15, 15),
        maxLevel=2,
        criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03),
    )

    # Create random colors
    color = np.random.randint(0, 255, (100, 3))

    # Take first frame and find corners in it
    ret, old_frame = cap.read()
    old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)
    p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params)

    # Create a mask image for drawing purposes
    mask = np.zeros_like(old_frame)

C :

int lucas_kanade(const string& filename)
{
    // Read the video 
    VideoCapture capture(filename);
    if (!capture.isOpened()){
        //error in opening the video input
        cerr << "Unable to open file!" << endl;
        return 0;
    }

    // Create random colors
    vector<Scalar> colors;
    RNG rng;
    for(int i = 0; i < 100; i  )
    {
        int r = rng.uniform(0, 256);
        int g = rng.uniform(0, 256);
        int b = rng.uniform(0, 256);
        colors.push_back(Scalar(r,g,b));
    }

    Mat old_frame, old_gray;
    vector<Point2f> p0, p1;

    // Read first frame and find corners in it
    capture >> old_frame;
    cvtColor(old_frame, old_gray, COLOR_BGR2GRAY);
    goodFeaturesToTrack(old_gray, p0, 100, 0.3, 7, Mat(), 7, false, 0.04);

    // Create a mask image for drawing purposes
    Mat mask = Mat::zeros(old_frame.size(), old_frame.type());

After that, we can start our demo. This is a cycled process, where we read a new video frame and calculate Shi-Tomasi features and Optical Flow in a loop. The calculated Optical Flow is shown as colored curves.

Python:

while True:
    # Read new frame
    ret, frame = cap.read()
    if not ret:
        break
    frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Calculate Optical Flow
    p1, st, err = cv2.calcOpticalFlowPyrLK(
        old_gray, frame_gray, p0, None, **lk_params
    )
    # Select good points
    good_new = p1[st == 1]
    good_old = p0[st == 1]

    # Draw the tracks
    for i, (new, old) in enumerate(zip(good_new, good_old)):
        a, b = new.ravel()
        c, d = old.ravel()
        mask = cv2.line(mask, (a, b), (c, d), color[i].tolist(), 2)
        frame = cv2.circle(frame, (a, b), 5, color[i].tolist(), -1)

    # Display the demo
    img = cv2.add(frame, mask)
    cv2.imshow("frame", img)
    k = cv2.waitKey(25) & 0xFF
    if k == 27:
        break

    # Update the previous frame and previous points
    old_gray = frame_gray.copy()
    p0 = good_new.reshape(-1, 1, 2)

C :

while(true){
    // Read new frame
    Mat frame, frame_gray;
    capture >> frame;
    if (frame.empty())
        break;
    cvtColor(frame, frame_gray, COLOR_BGR2GRAY);

    // Calculate optical flow
    vector<uchar> status;
    vector<float> err;
    TermCriteria criteria = TermCriteria((TermCriteria::COUNT)   (TermCriteria::EPS), 10, 0.03);
    calcOpticalFlowPyrLK(old_gray, frame_gray, p0, p1, status, err, Size(15,15), 2, criteria);
    vector<Point2f> good_new;

    // Visualization part
    for(uint i = 0; i < p0.size(); i  )
    {
        // Select good points
        if(status[i] == 1) {
            good_new.push_back(p1[i]);
            // Draw the tracks
            line(mask,p1[i], p0[i], colors[i], 2);
            circle(frame, p1[i], 5, colors[i], -1);
        }
    }

    // Display the demo
    Mat img;
    add(frame, mask, img);
    if (save) {
        string save_path = "./optical_flow_frames/frame_"   to_string(counter)   ".jpg";
        imwrite(save_path, img);
    }
    imshow("flow", img);
    int keyboard = waitKey(25);
    if (keyboard == 'q' || keyboard == 27)
        break;

    // Update the previous frame and previous points
    old_gray = frame_gray.clone();
    p0 = good_new;
    counter  ;
}

In short, this script takes two consecutive frames and finds the corners on the first one with cv2.goodFeaturesToTrack function. After that, we compute the Optical Flow with the Lucas-Kanade algorithm using the information about the corner location. This is a cycled process which does the same for each pair of consecutive images.

To run the Lucas-Kanade demo you can use the following command:

Python:

C :

As a result, you will see the demo video with pixel displacement curves:

To quit from the demo you can press the Esc button.

Opencv: optical flow

import java.util.ArrayList;

import java.util.Random;

import org.opencv.core.*;

import org.opencv.highgui.HighGui;

import org.opencv.imgproc.Imgproc;

import org.opencv.video.Video;

import org.opencv.videoio.VideoCapture;

class OptFlow {

publicvoid run(String[] args) {

String filename = args[0];

VideoCapture capture = new VideoCapture(filename);

if (!capture.isOpened()) {

System.out.println(“Unable to open this file”);

System.exit(-1);

}

Random rng = new Random();

for (int i = 0 ; i < 100 ; i ) {

int r = rng.nextInt(256);

int g = rng.nextInt(256);

int b = rng.nextInt(256);

}

Mat old_frame = new Mat() , old_gray = new Mat();

MatOfPoint p0MatofPoint = new MatOfPoint();

capture.read(old_frame);

Imgproc.cvtColor(old_frame, old_gray, Imgproc.COLOR_BGR2GRAY);

Imgproc.goodFeaturesToTrack(old_gray, p0MatofPoint,100,0.3,7, new Mat(),7,false,0.04);

MatOfPoint2f p0 = new MatOfPoint2f(p0MatofPoint.toArray()) , p1 = new MatOfPoint2f();

while (true) {

Mat frame = new Mat(), frame_gray = new Mat();

capture.read(frame);

if (frame.empty()) {

break;

}

Imgproc.cvtColor(frame, frame_gray, Imgproc.COLOR_BGR2GRAY);

MatOfByte status = new MatOfByte();

MatOfFloat err = new MatOfFloat();

TermCriteria criteria = new TermCriteria(TermCriteria.COUNT TermCriteria.EPS,10,0.03);

Video.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, p1, status, err,

newSize

(15,15),2, criteria);

byte StatusArr[] = status.toArray();

ArrayList<Point> good_new = new ArrayList<>();

for (int i = 0; i<StatusArr.length ; i ) {

if (StatusArr[i] == 1) {

good_new.add(p1Arr[i]);

Imgproc.line(mask, p1Arr[i], p0Arr[i], colors[i],2);

Imgproc.circle(frame, p1Arr[i],5, colors[i],-1);

}

}

Mat img = new Mat();

Core.add(frame, mask, img);

HighGui.imshow(“Frame”, img);

int keyboard = HighGui.waitKey(30);

if (keyboard == ‘q’ || keyboard == 27) {

break;

}

good_new_arr = good_new.toArray(good_new_arr);

p0 = new MatOfPoint2f(good_new_arr);

}

System.exit(0);

}

}

publicclass OpticalFlowDemo {

publicstaticvoid main(String[] args) {

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

new OptFlow().run(args);

}

}

Spynet (2023)

Во многих последующих статьях, авторы пытались улучшить качество путем решения проблемы плохого распознавания резких движений. Интуитивно, движение не будет схвачено сетью, если его вектор значительно выходит за receptive field активации. Решить эту проблему предлагается засчет трех вещей: сверток большего размера, пирамид и «оборачивания» (warping) одного изображения из пары в оптический поток. Обо всем по-порядку.

Итак, если у нас есть пара изображений, на которых объект резко сместился (10 пикселей), то мы можем просто уменьшить изображение (в 6 или более раз). Абсолютное значение смещения значительно уменьшится, и сеть с большей вероятностью сможет его «поймать», особенно, если его свертки будут больше, чем само смещение (в данном случае используются свертки 7х7).

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

Это делается при помощи warping operator, который пересчитывает первое изображение согласно имеющемуся приближению оптического потока (полученного на предыдущем уровне). Улучшение в данном случае состоит в том, что первое изображение, которое «подвинули» согласно приближению оптического потока будет ближе ко второму, чем исходное, т. е. мы снова уменьшаем абсолютное значение оптического потока, которое нам надо предсказать (напомню, небольшие по значению движения детектируются намного лучше, т. к. полностью входят в одну свертку).

где

, т.е. определенная точка на изображении,

— само изображение,

— оптический поток,

— результирующее изображение, «обернутое» в оптический поток.

Как же применить это все в CNN-архитектуре? Зафиксируем количество уровней пирамиды $k$ и множитель, на который уменьшается каждое последующее изображение на уровне, начиная с последнего $n$. Обозначим за $d(*)$ и $u(*)$функции уменьшения (downsampling) и увеличения (upsampling) изображения или оптического потока на этот множитель.Заведем себе также набор CNN-ок {$G_0...G_k$}, по одной на каждый уровень пирамиды. Тогда $G_i$-я сеть будет принимать на вход пару изображений с $i$-го уровня пирамиды и оптический поток, подсчитанный на $G_{i-1}$-м уровне ($G_0$ будет просто принимать тензор из нулей вместо этого). При этом одно из изображений мы будем отправлять в warping layer, чтобы уменьшить разницу между ними, а предсказывать будем не сам оптический поток на этом уровне, а значение, которое нужно прибавить к увеличенному (upsampled) оптическому потоку с предыдущего уровня, чтобы получить оптический поток на этом уровне. В формуле это выглядит примерно так:


Чтобы получить сам оптический поток, мы просто сложим предикт сети и увеличенный поток с предыдущего уровня:

Для получения Ground Truth для сети на этом уровне нам нужно проделать обратную операцию — вычесть из таргета (уменьшенного до нужного уровня) предикт с предыдущего уровня пирамиды. Схематично, это выглядит так:

Преимущество такого подхода в том, что каждый уровень мы можем обучать независимо. Авторы начинали обучение с 0-го уровня, каждая последующая сеть при этом инициализировалась параметрами предыдущей. Так как каждая сеть $G_i$ решает задачу намного более простую, чем полное вычисление оптического потока на большом изображении, то и параметров можно сделать намного меньше. Настолько меньше, что теперь весь ансамбль целиком может поместиться на мобильные устройства:

Сам ансамбль выглядит следующим образом (пример пирамиды из 3х уровней):

Осталось поговорить непосредственно об архитектуре $G_i$-ой сети и подвести итоги. Каждая сеть $G_i$ состоит из 5-ти сверточных слоев, каждая из которых заканчивается ReLU-активацией, кроме последней (которая предсказывает оптический поток). Количество фильтров на каждом слое равно соответственно {$32, 64, 32, 16, 2$}. Входы нейронной сети (изображение, второе изображение «обернутое» в оптический поток и сам оптический поток) просто конкатенируются по размерности каналов, так что входной тензор их имеет 8. Результаты впечатляют:

Theoretical basics

Let’s assume that we have a gray-scale image – the matrix with pixel intensity. We define the function I(x,y,t)x,yx,ytI(x,y,t)I(x,y,t)tI(x,y,t) = I(x  Delta x, y  Delta y, t   Delta t)I(x,y,t) = I(x  Delta x, y  Delta y, t   Delta t)Delta t = 1(Delta x, Delta y)(Delta x, Delta y)I(x,y,t) - I_(x  Delta x, y  Delta y, t   Delta t) = 0u = frac{dx}{dt}, v = frac{dy}{dt},u = frac{dx}{dt}, v = frac{dy}{dt},I'_x, I'_yI_1I_1I_2I_1 - I_2 approx I'_x u   I'_y v   I'_tI_1 - I_2 approx I'_x u   I'_y v   I'_tu, v

Оцените статью
Радиокоптер.ру
Добавить комментарий