UEBA в кибербезе: как профилирование поведения пользователей на основе Autoencoder помогает выявлять угрозы и аномалии. autoencoder.. autoencoder. falco.. autoencoder. falco. lstm.. autoencoder. falco. lstm. ueba.. autoencoder. falco. lstm. ueba. газинформсервис.. autoencoder. falco. lstm. ueba. газинформсервис. Информационная безопасность.. autoencoder. falco. lstm. ueba. газинформсервис. Информационная безопасность. поведенческая аналитика.

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

Что же тогда остаётся специалистам BlueTeam?

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

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

Реализация UEBA на основе нейронной сети

Для обнаружения аномалий отлично подходит нейронная сеть на основе автокодировщика (Autoencoder, AE). Эта сеть состоит из двух симметричных компонентов: кодера и декодера. Кодер преобразует входные данные в представление меньшей размерности, а декодер восстанавливает их обратно. В процессе обучения модель AE стремится минимизировать ошибку реконструкции данных.

Когда данные подаются в модель нейронной сети AE, вычисляется ошибка реконструкции. Если ошибка превышает заданный порог, это сигнализирует о наличии аномалии в данных, указывая на то, что модель не была обучена на них. Следует отметить, что чем больше данные отличаются от тех, на которых была обучена модель, тем больше будет ошибка реконструкции. Таким образом, можно сказать, что при использовании этой нейронной сети и данных о поведении реализуется подход на основе сигнатур (если рассматривать данные как некую сигнатуру, а модель — как условие сравнения).

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

Для эффективного анализа поведения целесообразно расширить существующий автокодировщик, добавив слои нейронной сети, способные учитывать зависимости и контекст в последовательных данных. Яркими представителями таких нейронных сетей являются рекуррентные нейронные сети (Recurrent Neural Networks, RNN): управляемые рекуррентные блоки (Gated Recurrent Unit, GRU) и долгая краткосрочная память (Long short-term memory, LSTM).

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

Что же дальше?

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

К примеру, наша задача заключается в обнаружении аномальных последовательностей системных вызовов (syscalls) в операционных системах семейства Linux. Следует отметить, что в каждой ОС syscalls будут отличаться. Однако можно использовать Falco Security в качестве коллектора syscalls, поскольку он предлагает унифицированный список поддерживаемых syscalls, а гибкая система правил позволяет организовать сбор этих данных и осуществлять фильтрацию по имени пользователя. Используемое правило Falco Security для сбора syscalls представлено в листинге 1.

Листинг 1. Правило Falco Security

# falco rule
- rule: DescH
  desc: DescH
  condition: container.id = host and syscall.type != <NA>
  output: (user=%user.name process name=%proc.name process id=%proc.pid syscall=%syscall.type)
  priority: WARNING

Это правило позволяет собирать все syscalls, если объект, их сгенерировавший, является хостом (container.id = host).

Листинг 2. Данные, собранные с помощью Falco Security

09:13:06.983121125: Warning (user=root process name=mount process id=15192 syscall=access)
09:13:06.983126936: Warning (user=root process name=mount process id=15192 syscall=access)
09:13:06.983135592: Warning (user=root process name=mount process id=15192 syscall=mount)
09:13:06.983307873: Warning (user=root process name=mount process id=15192 syscall=mount)
09:13:06.983322449: Warning (user=root process name=mount process id=15192 syscall=ioctl)
09:13:06.983329802: Warning (user=root process name=mount process id=15192 syscall=ioctl)

В данном листинге отображена следующая информация: 09:13:06.983121125 (время), Warning (метка приоритета), user=root (имя пользователя), process name=mount (имя процесса), process id=15192 (идентификатор процесс) и syscall=access (syscall).

После того, как данные собраны, последовательность syscalls нужно разделить на последовательности с помощью так называемой техники скользящего окна со смещением на +1. Размер скользящего окна может быть произвольного размера, но следует отметить, что за один процесс выполняется в среднем от 60 до 80 syscalls. Таким образом, размер скользящего окна можно назначить в 300 syscalls, что будет равно от 4 до 5 процессов.

Листинг 3. Сгенерированные последовательности с помощью техники скользящего окна

Последовательность # 1
access
access
mount
mount
ioctl
ioctl

Последовательность # 2
access
mount
mount
ioctl
ioctl

Последовательность # 3
mount
mount
ioctl
ioctl

После чего нужно их преобразовать в числовые признаки. Для этого достаточно создать словарь c syscalls, где каждому syscall будет соответствовать идентификатор. Таким образом сформированные последовательности и будут эталонным профилем легитимного поведения конкретного пользователя.

Архитектура модели нейронной сети

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

В этом случае нейронная сеть состоит из входного слоя, нескольких скрытых слоев и выходного слоя. Размерность входного и выходного слоев равна количеству syscalls в последовательности (в данном случае 300 (len)). Первый и третий скрытый слой содержит вдвое меньше нейронов (len // 2), чем входной и выходной слои, второй скрытый слой содержит вчетверо меньше нейронов (len // 4), чем входной и выходной слои, как указано на рисунке 1.

Рис. 1. Модель AE-LSTM

Рис. 1. Модель AE-LSTM

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

Листинг 4. Функция создания модели нейронной сети

def create_ae_lstm_model(input_length):
    # Размерность входного и выходного слоев
    input_dim = input_length  # В данном случае 300
    output_dim = input_length  # В данном случае 300
    # Входной слой
    inputs = Input(shape=(None, input_dim))
    # Кодер
    encoded = LSTM(input_dim // 2, activation='relu', return_sequences=True)(inputs)
    encoded = LSTM(input_dim // 4, activation='relu')(encoded)
    # Повторение вектора для декодера
    decoded = RepeatVector(output_dim)(encoded)
    # Декодер
    decoded = LSTM(input_dim // 2, activation='relu', return_sequences=True)(decoded)
    decoded = LSTM(output_dim, activation='relu', return_sequences=True)(decoded)
    # Создание модели
    model = Model(inputs, decoded)
    # Компиляция модели с оптимизатором Adam и функцией потерь MSE
    model.compile(optimizer=Adam(), loss='mean_squared_error')
    return model

Обучение модели нейронной сети

Процесс обучения модели нейронной сети для удобства основан на автономном подборе параметров обучения, таких как batch size (количество обучающих примеров, используемых за одну итерацию обучения), который по умолчанию равен 1, и количество epochs (количество итераций обучения), которое определяется результатами обучения. Начальное количество epochs и batch size — 1. Таким образом, если уровень потерь при первой итерации обучения ниже 0.5 или превышает 1%, модель считается необученной, а количество epochs увеличивается. Процесс обучения длится до тех пор, пока уровень потерь не будет в диапазоне от 0.5 до 1% или количество эпох не достигнет 100. В случае, если процесс обучения не увенчался успехом, модель выбирает наилучший показатель потерь и переобучается с параметрами, соответствующими этому уровню потерь.

Ряд экспериментов показал, что совокупность такой архитектуры модели нейронной сети и уровня потерь в диапазоне от 0.5 до 1% позволяет достичь оптимального баланса точности и количества ложных срабатываний. Также установленный размер batch size в 1 позволяет достичь лучших показателей во время обучения (размер потерь в диапазоне от 0.5 до 1%), чем при ином размере batch size.

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

Обнаружение

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

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

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

Листинг 5. Расчёт ошибки реконструкции

mse = np.mean(np.square(sequences - reconstructions), axis=(0))
threshold = np.mean(mse) + 2 * np.std(mse)
anomaly_indices = np.where(mse > threshold)[0]

Посмотрим на результат обнаружения:

Листинг 6. Результат обнаружения аномалий

An anomalous example was found: [… access, access, mount, mount, ioctl, ioctl … ]

Заключение

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

Также следует отметить, что одной из ключевых проблем при обучении моделей нейронных сетей являются большие объёмы данных. Для решения этой проблемы необходимо использовать различные методы оптимизации обучающих наборов данных. К ним можно отнести метод главных компонент (PCA, Principal Component Analysis), фильтрацию, корреляцию и другие.

Автор: Renzauder

Источник

Рейтинг@Mail.ru
Rambler's Top100