НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ «КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ ІМЕНІ ІГОРЯ СІКОРСЬКОГО» ІНСТИТУТ ПРИКЛАДНОГО СИСТЕМНОГО АНАЛІЗУ КАФЕДРА МАТЕМАТИЧНИХ МЕТОДІВ СИСТЕМНОГО АНАЛІЗУ На правах рукопису До захисту допущено УДК 519.688 В. о. завідувача кафедри ММСА О.Л.Тимощук «___» ____________ 2019 р. Магістерська дисертація на здобуття ступеня магістра за спеціальністю 124 Системний аналіз на тему: « Виявлення аномалiй роботи операційної системи Windows методами машинного навчання та лог-аналiтики» Виконав: студент ІІ курсу, групи КА-82 мп Чабанівський Артем Тарасович ____________ Керівник: доцент кафедри ММСА к.ф.-м.н., доц. Каніовська І.Ю. ____________ Рецензент: доцент кафедри математичного аналізу та теорії ймовірностей КПІ ім. І. Сікорського, к. ф.-м.н., доц. Буценко Ю. П. ______________
142
Embed
ela.kpi.ua · Web view2020. 3. 6. · Наступний інструмент - Event Log Explorer (рис 1.3). Цей переглядач журналу подій дозволяє
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ«КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ ІМЕНІ ІГОРЯ СІКОРСЬКОГО»
ІНСТИТУТ ПРИКЛАДНОГО СИСТЕМНОГО АНАЛІЗУКАФЕДРА МАТЕМАТИЧНИХ МЕТОДІВ СИСТЕМНОГО АНАЛІЗУ
На правах рукопису До захисту допущеноУДК 519.688 В. о. завідувача кафедри ММСА
О.Л.Тимощук«___» ____________ 2019 р.
Магістерська дисертаціяна здобуття ступеня магістра за спеціальністю 124 Системний аналіз
на тему: «Виявлення аномалiй роботи операційної системи Windows методами машинного навчання та лог-аналiтики»
Виконав: студент ІІ курсу, групи КА-82 мпЧабанівський Артем Тарасович ____________
Керівник: доцент кафедри ММСАк.ф.-м.н., доц. Каніовська І.Ю. ____________
Рецензент:доцент кафедри математичного аналізу та теорії ймовірностей КПІ ім. І. Сікорського,к. ф.-м.н., доц. Буценко Ю. П. ______________
Засвідчую, що у цій магістерській дисертаціїнемає запозичень з праць інших авторівбез відповідних посиланьСтудент ____________
Київ2019
2
НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ«КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ ІМЕНІ ІГОРЯ
СІКОРСЬКОГО»ІНСТИТУТ ПРИКЛАДНОГО СИСТЕМНОГО АНАЛІЗУ
КАФЕДРА МАТЕМАТИЧНИХ МЕТОДІВ СИСТЕМНОГО АНАЛІЗУ
Рівень вищої освіти — другий (магістерський)Спеціальність — 124 «Системний аналіз»
ЗАТВЕРДЖУЮВ. о. завідувача кафедри ММСА
О.Л.Тимощук«___» ____________ 2019 р.
ЗАВДАННЯна магістерську дисертацію студенту Чабанівському Артему Тарасовичу
1. Тема дисертації: «Виявлення аномалій роботи операційної системи Windows методами машинного навчання та лог-аналiтики», науковий керівник дисертації Каніовська Ірина Юріївна, к.ф.-м.н., доцент, затверджені наказом по університету від «___» _________ № ______
2. Термін подання студентом дисертації: 13 грудня 2019 р.3. Об’єкт дослідження: Аномалії роботи операційної системи Windows,
їх природа, методи виявлення.4. Предмет дослідження: Лог-дані операційної системи, методи
машинного навчання та лог-аналітика.5. Перелік завдань, які потрібно розробити:1) дослідити сучасний стан та особливості застосування лог-аналітики
та машинного навчання у вирішенні проблеми виявлення аномалій роботи операційної системи;
2) розробити математичну модель нейронної мережі для виявлення аномалій на основі самоорганізуючих карт Кохонена;
3) на основі нейронної мережі створити програмний продукт для виявлення аномалій робото операційної системи;
4) пошук даних для застосування в програмі;5) нормалізація та інтерпретація даних методами лог-аналітики;6) розробити стартап-проект виведення на ринок результатів
дослідження;7) розробити концептуальні висновки за результатами наукового
дослідження
3
6. Орієнтовний перелік графічного (ілюстративного) матеріалу:1). Огляд існуючих систем лог аналалізу операційної системи Windows (рис.1.2 – рис.1.4);2). Інтерфейс та робота створеного програмного продукту (рис.4.3, рис.4.4);3). Таблиці у розділі стартап-проекту
The object of the research is anomalies of the work of operating system. The
subject of the study is the operating systems’ logs.
The aim of the study:
1) develop the necessary tools by log analytics methods for converting
server logs into a data set for training neural network;
2) studying the types and methods of teaching neural networks to detect
anomalies of web servers;
3) develop software that implements a recurrent neural network
4) develop software that implements the detection of anomalies in the web
server’s work by the time window of the data log.
The theoretical and methodological basis of the research is the work of
foreign scientists in the field of data analysis, cybersecurity, mathematical
modeling and server administrating.
During the creation of the master thesis software product was created that
defines logs that are anomalous to others by the set of log data.
The software is implemented using C#, .NET Core framework, and
Microsoft Visual Studio 2019 IDE. Recommendations for further research are
given.
DATA ANALYSIS, OPERATING SYSTEM, LOGS, NEURAL
NETWORKS, WINE, LOG ANALYTICS.
6
ЗМІСТ
ВСТУП......................................................................................................................8ПЕРЕЛІК СКОРОЧЕНЬ..........................................................................................9ТЕОРЕТИЧНИ ПОНЯТТЯ...................................................................................10РОЗДІЛ 1 ЛОГ АНАЛІТИКА ТА ЇЇ ЗАСТОСУВАННЯ У ВИЯВЛЕННІ АНОМАЛІЙ...........................................................................................................11
1.1 Види логів......................................................................................................111.2 Складові лог-аналітики................................................................................12
1.2.1 Фільтрація та збір та лог-даних...........................................................121.2.2 Структурування даних...........................................................................131.2.3 Аналіз даних............................................................................................13
1.3 Огляд існуючих систем аналізу лог даних операційної системи Windows..............................................................................................................................131.4 Аномалії та методики їх виявлення............................................................17
1.4.1 Режими виявлення аномалій..................................................................191.4.2 Методи розпізнавання аномалій...........................................................20
1.5 Висновки до розділу.....................................................................................24РОЗДІЛ 2. ЖУРНАЛ ПОДІЙ WINDOWS..........................................................25
2.1. Означення.....................................................................................................252.2 Елементи журналу подій Windows.............................................................252.3 Події...............................................................................................................262.3 Журнал подій безпеки Windows.................................................................292.4 Висновки до розділу.....................................................................................31
РОЗДІЛ 3 ОПИС ОБРАНОЇ ТЕХНОЛОГІЇ........................................................323.1 Самоорганізація............................................................................................323.2 Діаграма вхідного простору........................................................................323.3 Модель Кохонена.........................................................................................33
3.3.1 Алгоритм навчання.................................................................................343.4 Особливості мережі......................................................................................363.5 Висновки за розділом...................................................................................37
РОЗДІЛ 4 РОЗРОБКА ПРОГРАМНОГО ПРОДУКТУ ДЛЯ ВИЯВЛЕННЯ АНОМАЛІЙ РОБОТИ ОС WINDOWS...............................................................38
7
4.1 Дані для роботи.............................................................................................384.2 Обробка даних..............................................................................................39
4.3 Опис програмного продукту.......................................................................424.3.1 Опис інтерфейсу користувача...............................................................44
4.4 Результати роботи програми.......................................................................454.5 Висновки за розділом...................................................................................45
РОЗДІЛ 5 РОЗРОБКА СТАРТАП-ПРОЕКТУ....................................................475.2 Технологічний аудит ідеї стартап-проекту................................................495.3 Аналіз ринкових можливостей запуску стартап-проекту.........................505.4 Розроблення ринкової стратегії проекту....................................................605.5 Розроблення маркетингової програми стартап-проекту...........................655.6 Висновки до розділу.....................................................................................70
ВИСНОВКИ ПО РОБОТІ ТА ПЕРСПЕКТИВИ ПОДАЛЬШИХ ДОСЛІДЖЕНЬ.......................................................................................................71ПЕРЕЛІК ПОСИЛАНЬ.........................................................................................73ДОДАТОК А ЛІСТИНГ ПРОГРАМИ.................................................................75
8
ВСТУП
На сьогоднішній день операційна система Windows є
найпопулярнішою операційною системою. Під неї розроблюються новітні
програми, комп’ютерні ігри, тощо. Майже кожен із нас мав досвід роботи із
нею.
Успішна робота всіх програм та застосунків на даній операційній
системі напряму залежить від її стабільної роботи. Також від цього залежить
і більш важлива річ – збереженість та цілісність персональних даних.
Своєчасне виявлення аномалій роботи операційної системи відіграє
непересічну роль у коректній роботі системи, збереженні її цілісності та
неушкодженості персональних даних. Також пошук аномалій у роботі
системи є дуже корисним під час розробки та тестуванні програмного
продукту, що розроблюється саме під цю операційну систему.
Інструментом для виявлення некоректної роботи системи можуть
слугувати лог-дані – дані, що зберігають інформацію (службову,
статистичну) про дії у операційній системі. На даний момент більшість
розробників та працівники команди підтримки, при виявленні некоректної
роботи програми, перевіряють записи системи вручну, що займає дуже
великий проміжок часу (так як системні логи можуть мати дуже великий
обсяг), а також дає шанс припустити помилку через «людський фактор».
Через це наразі стоїть питання, як уникнути людського втручання та
перевіряти операційну систему на аномальність програмно.
9
ПЕРЕЛІК СКОРОЧЕНЬ
ОС – Операційна система
RDP (англ. Remote Desktop Connection) – віддалене підключення до робочого
столу
VS (англ. Visual Studio) – середовище розробки програмного забезпечення,
що забезпечується компанією Microsoft
10
ТЕОРЕТИЧНИ ПОНЯТТЯ
Означення. Операційна система – це базовий комплекс програм, що
виконує управління апаратною складовою комп'ютера або віртуальної
машини; забезпечує керування обчислювальним процесом і організовує
взаємодію з користувачем. Зазвичай складається з ядра операційної системи
та базового набору прикладних програм..
Означення. Windows – узагальнююча назва операційних систем для
комп'ютерів, розроблених корпорацією Microsoft.
Означення. Логи (лог-файли) – це файли, які містять системну
інформацію роботи сервера чи комп’ютера, в котрі заносяться певні дії
користувача чи програми[5]. Іноді використовується українськомовний
аналог поняття – журнал.
Означення. Лог-аналітика (лог-аналіз) – розділ комп. науки, що вивчає
та аналізує записи, згенеровані сервером або системою серверів (логи).
Означення. Машинне навчання - це підгалузь штучного інтелекту в
галузі інформатики, яка часто застосовує статистичні прийоми для надання
комп'ютерам здатності «навчатися» (тобто, поступово покращувати
продуктивність у певній задачі) з даних, без того, щоби бути
програмованими явно.
11
РОЗДІЛ 1 ЛОГ АНАЛІТИКА ТА ЇЇ ЗАСТОСУВАННЯ У ВИЯВЛЕННІ АНОМАЛІЙ
1.1 Види логів
Формат лог файлу: таблиця або файл. Зазвичай у файлі логу, або у
відповідній таблиці, записи відсортовані за часом. Лог дані є унікальними
для більшості програмних забезпечень. Найвідоміші типи логів наведені у
табл. 1.1.
Таблиця 1.1 – Види лог даних [1]
Лог Програмне забезпечення
Транзаційний лог Система управління БД
Лог повідомлень IRC та IM
Системний лог Мережеві пристрої
Лог веб сервера Веб сервер
12
1.2 Складові лог-аналітики
1. Збір лог-даних
2. Фільтрація лог-даних
3. Структурування лог-даних
4. Аналіз лог-даних
Схематично дані складові проілюстровано на рис. 1.1.
Рисунок 1.1 –Лог-аналіз
1.2.1 Фільтрація та збір та лог-даних
Під час етапу №1 відбувається пошук даних (в даному випадку – лог
даних) з відповідних джерел. Велике значення має репрезентативність
інформації, оскільки на цих даних буде оснований результат. Зважаючи на
цей фактор велике значення має реальність та непошкодженість
інформації[2].
Зібранні дані мають бути поміщенні у деяке сховище (наприклад – база
даних) та відфільтровані за відповідними критеріями використовуючи
застосунки[6]. Фільтрація даних має велике значення так як це впливає на
репрезентативність даних.
13
1.2.2 Структурування даних
Дані логів можуть мати великий об'єм а також складну структуру. Для
полегшення розуміння їх слід структурувати у зручному для користувача
вигляді. Слід зважати на те, що логи можуть мати зв'язок з даними, що були
отримані з інших джерел.
1.2.3 Аналіз даних
Завершаючим етапом є аналіз оброблених даних. На цьому етапі
можуть бути залученні різні відомі методи аналізу даних[3, 4]. Вибір методу
напряму залежить від типу задачі а також навиків розробника.
1.3 Огляд існуючих систем аналізу лог даних операційної системи
Windows
Перший застосунок у цьому розділі - Windows Event Log Viewer (рис
1.2).
Багато користувачів Windows покладаються на цей вбудований
інструмент для перевірки подій, що відбуваються на їхніх комп’ютерах. Цей
інструмент має дві основні переваги: він уже встановлений на комп’ютері та
має дуже інтуїтивний інтерфейс. Ви можете запустити програму перегляду
журналу подій Windows, ввівши “event viewer” (англ. переглядач подій) на
панелі пошуку.
14
Екран інструменту розділений на три частини: категорії подій
розміщені на лівій бічній панелі, детальну інформацію про події журналу
можна знайти в середньому розділі вікна, а доступні дії вказані на правій
бічній панелі.
Windows Event Log Viewer пропонує звіти про п'ять подій:
«Події» програм (англ. Application events): звіти про перебіг
виконання програми;
«Події» безпеки (англ. Security events): звіти про результати дій
безпеки;
«Події» налаштування (англ. Setup events): в основному
стосуються контролерів домену;
Перенесені події (англ. Forwarded events:): це звіти, що
надсилаються іншими комп’ютерами.
Рисунок 1.2 - Windows Event Log Viewer
15
Наступний інструмент - Event Log Explorer (рис 1.3). Цей переглядач
журналу подій дозволяє користувачам переглядати, аналізувати та
контролювати події, записані в журналах подій Windows. - Event Log Explorer
є кращим, ніж власний переглядач журналів подій Майкрософт, так як
забезпечує більшу функціональінсть таблиці. Завдяки цьому інструменту
користувачі можуть аналізувати різні журнали подій: безпеку, додаток,
систему, налаштування, службу каталогів, DNS та інше. Інші функції
включають:
Миттєвий доступ до журналів подій - Провідник журналів подій
працює як з локальними, так і з віддаленими журналами подій, а
також з файлами журналу подій у форматі EVT та EVTX;
Ефективна фільтрація - фільтрація за описами подій за
допомогою регулярних виразів, фільтрація за параметрами події
безпеки, фільтрація за допомогою фільтрів користувача;
Експортувати події та генератор звітів - експортувати та
друкувати події;
Рисунок 1.3 – Event Log Explorer
16
Останній інструмент у цьому огляді – MyEventViewer. Цей інструмент
дозволяє переглядати кілька журналів подій в одному списку, а також
опис подій та дані. Для запуску цього програмного забезпечення не
потрібен процес установки або додаткові файли DLL. Все, що вам
потрібно зробити, це запустити виконуваний файл.
Інші функції:
Спрощений інтерфейс, дуже зручний для користувачів;
Можливість перегляду подій з віддаленого комп'ютера;
Певні події можна приховати від конкретних користувачів;
Події можна відфільтрувати, використовуючи низку критеріїв;
Рисунок 1.4 - MyEventViewer
17
1.4 Аномалії та методики їх виявлення
Виявлення аномалій відноситься до пошуку непередбачених значень
(патернів) в потоках даних [5].
Аномалія (викид, помилка, відхилення або виключення) - це
відхилення поведінки системи від стандартного (очікуваного) [7].
Аномалії поділяються на три наступні категорії :
1) Точкові аномалії (рис 1.5) - виникають в ситуації, коли окремий
екземпляр даних може розглядатися як аномальний по відношенню до решти
даних. Даний вид аномалій є найбільш легко розпізнаваним, більшість
існуючих методів створено для розпізнавання точкових аномалій [8];
Рисунок 1.5 – Приклад точкової аномалії
2) Контекстні аномалії (рис 1.6.) (також відомі як «умовні аномалії»
[3]) – спостерігаються, якщо екземпляр даних є аномальним лише в певному
контексті [8]. Аномальна поведінка визначається за допомогою значень
поведінкових атрибутів виходячи з конкретного контексту. Таким чином,
екземпляр даних може бути контекстуальної аномалією за даних умов, але
18
при таких же поведінкових атрибутах вважатися нормальним в іншому
контексті;
Рисунок 1.6 – Приклад контекстної аномалії
3) Колективні аномалії (рис 1.7.) – виникають, коли послідовність
пов'язаних примірників даних (наприклад, ділянка часового ряду) є
аномальною по відношенню до цілого набору даних [8]. Окремий екземпляр
даних в такій послідовності може не бути відхиленням, проте спільна поява
таких екземплярів є колективною аномалією.
19
Рисунок 1.7 – приклад колективної аномалії
1.4.1 Режими виявлення аномалій
Часто для вирішення завдання пошуку аномалій потребується набір
даних, що описують систему [9]. Кожен екземпляр в ньому описується
міткою, яка вказує, чи є він нормальним або аномальним. Таким чином,
безліч екземплярів з однаковими тегами формують відповідний клас.
Створення подібної промаркованної вибірки зазвичай проводиться
вручну і є трудомістким і дорогим процесом [9]. У деяких випадках отримати
екземпляри аномального класу неможливо в силу відсутності даних про
можливі відхилення в системі, в інших можуть бути відсутні мітки обох
класів. Залежно від того, які класи даних використовуються для реалізації
алгоритму, методи пошуку аномалій можуть виконуватися в одному з трьох
перерахованих нижче режимів:
1. Supervised anomaly detection (режим розпізнавання з учителем). Дана
методика вимагає наявності навчальної вибірки, що повноцінно
представляє систему і включає екземпляри даних нормального і
аномального класів. Робота алгоритму відбувається в два етапи:
навчання та розпізнавання. На першому етапі будується модель, з якою
будуть порівнюються екземпляри, які не мають мітки. У більшості
випадків покладається, що дані не змінюють свої статистичні
характеристики, інакше виникає необхідність змінювати класифікатор.
Основною складністю алгоритмів, що працюють в режимі
розпізнавання з учителем, є формування даних для навчання. Часто
аномальний клас представлений значно меншою кількістю
примірників, ніж нормальний, що може призводити до неточностей в
отриманій моделі. У таких випадках застосовується штучна генерація
аномалій [10];
20
2. Semi-Supervised anomaly detection (режим розпізнавання частково з
учителем). Вихідні дані при цьому підході представляють тільки
нормальний клас. Навчившись на одному класі, система може
визначати приналежність нових даних до нього, таким чином,
визначаючи протилежний. Алгоритми, що працюють в режимі
розпізнавання частково з учителем, не вимагають інформації про
аномальний клас примірників, внаслідок чого вони ширше
застосовуються й дозволяють розпізнавати відхилення за відсутності
заздалегідь певної інформації про них [10];
3. Unsupervised anomaly detection (режим розпізнавання без учителя).
Застосовується при відсутності апріорної інформації про дані.
Алгоритми розпізнавання в режимі без вчителя базуються на
припущенні про те, що аномальні екземпляри зустрічаються набагато
рідше нормальних. Дані обробляються, найбільш віддалені
визначаються як аномалії. Для застосування цієї методики має бути
доступний весь набір даних, тобто вона не може застосовуватися в
режимі реального часу [10].
1.4.2 Методи розпізнавання аномалій
Класифікація. Реалізація даного методу заснована на припущенні про
те, що нормальна поведінка системи може визначатися одним або декількома
класами [11]. Таким чином, екземпляр, що не належить до жодного з класів, є
відхиленням. Пошук аномалій відбувається в два етапи: навчання та
розпізнавання. Класифікатор навчається на масиві маркованих даних, далі
визначається приналежність до одного з відомих класів. В іншому випадку
екземпляр позначається, як аномалія. Найбільш широко вживаними
механізмами реалізації розпізнавання аномалій за допомогою класифікації є:
21
нейронні мережі, Байесови мережі, метод опорних векторів і метод на основі
правил.
Метод виявлення аномалій на основі нейронних мереж включає два
етапи. Перший: нейронна мережа навчається розпізнаванню класів
нормального поведінки на тренувальній вибірці. Другий: кожен
екземпляр надходить в якості вхідного сигналу нейронної мережі.
Система, заснована на нейронних мережах, може розпізнавати як один,
так і кілька класів нормального поведінки. Для знаходження аномалій
за допомогою розпізнавання тільки одного класу використовуються
Даний ключ містить підключі, звані файлами журналу. За
замовчуванням присутні:
файл журналу додатків — для застосунків і служб;
файл журналу безпеки — для подій системи аудиту;
файл системного журналу — для подій драйверів пристроїв.
28
Є можливість створювати додаткові журнали. Для кожного джерела
подій в журналі створюється окремий підключ. Події від кожного джерела
можуть включатися в окрему для кожного джерела категорію. Події повинні
належати до одного з п'яти визначених типів (табл. 2.1).
29
Таблиця 2.1 - Типи подій
Тип Опис
Інформація Події вказують на рідкісні і важливі успішні операції.
Попередження Події вказують на проблеми, які не вимагають негайного втручання, але можуть призвести до помилок у майбутньому. Прикладом такого роду подій може служити вичерпання ресурсів.
Помилка Події вказують на істотні проблеми, які зазвичай призводять до втрати функціональності або даних. Прикладом може служити неможливість запуску служби при завантаженні.
Успішний аудит
Події безпеки, які відбуваються при успішному зверненні до ресурсів, які проходять аудит. Прикладом може служити успішний вхід в систему.
Не успішний аудит
Події безпеки, які відбуваються при неуспішному зверненні до ресурсів, які проходять аудит. Прикладом може служити спроба відкрити файл, не маючи відповідних прав доступу.
30
Запис про подію включає в себе: ідентифікатор події, тип події,
категорію події, масив рядків і додаткові, специфічні для події, двійкові дані.
Кожне джерело подій повинне зареєструвати свій файл-повідомлення, в
якому зберігаються рядок опису ідентифікаторів повідомлень, категорій і
параметрів. Рядок опису може містити місце для вставки рядків з масиву,
зазначеного при запису події. Додаткові дані ніяк не інтерпретуються
програмою перегляду подій і відображаються в шістнадцятковому і
текстовому форматі.
2.3 Журнал подій безпеки Windows
У цьому розділі описано журнал подій безпеки Windows [18]. Для
кращого розуміння контексту спочатку описано доменні служби Active
Directory, які пропонують послуги адміністраторам зберігати та
налаштовувати користувачів та ресурси в домені Windows.
Комп'ютери в організації підписані на мережу, а облікові записи
користувачів надаються працівникам для входу на ці комп’ютери. У випадку
Windows, ця мережа називається доменом Windows. Active Directory (AD) -
служба каталогів, пропонована Microsoft, яка надає способи зберігання та
розповсюдження всіх даних, пов’язаних із управлінням доменом [19].
Контроль доступу на основі ролі реалізується через групи, які визначають
привілеї, надані обліковій частині цієї групи. В AD зберігається інформація
про аккаунти та групи (рис 2.1). У домені Windows існують два основні типи
облікових записів: облікові записи користувачів, що дозволяють людям
увійти в домен і комп'ютерні акаунти для управління ресурсами. Облікові
записи користувачів та комп'ютерні акаунти адмініструються однаково і є
частиною груп для управління їхніми привілеями. Контролер домену
знаходиться там же, де і Active Directory. Контролери домену - це сервери,
31
відповідальні за надання інформації про каталог у всьому домені, а отже,
також перевіряють облікові дані.
Рисунок 2.1 - Active Directory
Щоб відслідковувати використання привілеїв та дії, виконані
користувачами, операційна система Windows пропонує журнал подій, який
містить три стандартних типи журналів подій:
1) журнал програми;
2) системний журнал;
3) журнал безпеки.
Записи подій програми містять інформацію діагностичного журналу
про встановлені програми, а повідомлення та структура журналу залежать від
джерела програми. У системному журналі також реєструються діагностичні
події, однак ці записи подій пов'язані з машиною. Очікуються події, що
стосуються мережевих та інших протоколів зв’язку, а також ведення
журналів щодо машинної політики. І події програми, і система містять в
32
основному текстовий опис діагностичного запису подій.
Журнал подій безпеки Windows, збирає події, пов’язані з безпекою
щодо логінів облікових записів, створення та використання привілеїв,
реєстрації процесів, пов’язаних із безпекою, а також перезавантаження
системи [20]. Події, зафіксовані Windows, визначені в політиці аудиту, яку
можна застосувати глобально в межах доменної мережі Windows шляхом
визначення політики аудиту для різних груп машин. Ці події мають
передбачувані ознаки на основі типу події та залежно від активної політики
аудиту. Більше того, більшість атрибутів є категоричними мітками,
наприклад, що визначають конкретний тип входу або привілей, який
використовується процесом. У решті цього розділу розглядаються методи,
що використовують події безпеки Windows для виявлення загрози.
2.4 Висновки до розділу
У даному розділі було дано означення журналу подій операційної
системи Windows, детально розглянуто його елементи та події.
Детальну увагу було приділено журналу подій безпеки Windows, адже
саме цей тип журналу буде детально проаналізований у даній роботі.
33
РОЗДІЛ 3 ОПИС ОБРАНОЇ ТЕХНОЛОГІЇ
3.1 Самоорганізація
У цій главі ми розглянемо самоорганізуючі мережі. Основна
відмінність між ними та звичайними моделями полягає в тому, що
правильний вихід не можна визначити апріорі, і тому числову міру величини
помилки відображення не можна використовувати. Однак процес навчання
призводить, як і раніше, до визначення чітко визначених мережевих
параметрів для даної програми.
3.2 Діаграма вхідного простору
Мережі з одним шаром також є прикладом самоорганізуючої системи,
оскільки правильний вихід не визначений заздалегідь, а відображення
вагових векторів до кластерних центроїдів є автоматичним процесом [14].
Коли використовується самоорганізуюча мереж, на кожному кроці
подається вектор введення. Ці вектори становлять "середовище" мережі.
Кожен новий вхід виробляє адаптацію параметрів. Якщо такі модифікації
правильно керуються, мережа може побудувати своєрідне внутрішнє
представлення середовища. Оскільки в цих мережах фази навчання та
„виробничі” фази можуть перекриватися, представлення може постійно
оновлюватися. Найвідомішою та найпопулярнішою моделлю
самоорганізуючих мереж є карта збереження топології, запропонована Тево
Кохоненом [15]. Так звані мережі Кохонена є втіленням деяких ідей,
розроблених Розенблатом, фон дер Мальсбургом та іншими дослідниками.
Якщо вхідний простір повинен оброблятися нейронною мережею, перше
питання важливе значення має структура цього простору. Нейронна мережа з
34
реальними входами обчислює функцію f, визначену з вхідного простору A,
на вихідний простір B. Область, де визначено f, може бути охоплена
мережею Кохонена таким чином, що, наприклад, коли обраний вектор входу
з області a1 (рис 3.1), в мережі загоряється лише один блок. Таку плитку, в
якій вхідний простір класифіковано в субрегіони, також називають
діаграмою або картою вхідного простору. Мережі Кохонена навчаються
створювати карти вхідного простору самоорганізуючись.
Рисунок 3.1 - Функція f : A → B
3.3 Модель Кохонена
У цьому розділі ми розглянемо деякі приклади упорядкованих
структур, відомих як мережі Кохонена [16]. Сітка обчислювальних елементів
дозволяє нам ідентифікувати безпосередніх сусідів підрозділу. Це дуже
важливо, оскільки під час навчання ваги обчислювальних одиниць та їх
сусідів оновлюються. Мета такого підходу до навчання полягає в тому, щоб
сусідні підрозділи навчились реагувати на тісно пов'язані сигнали.
35
3.3.1 Алгоритм навчання
Розглянемо задачу побудови графіків n-мірного простору за допомогою
одновимірного ланцюга одиниць Кохона. Усі одиниці розташовані
послідовно і нумеруються від 1 до m (рис.3.1). Кожна одиниця стає помірним
входом x і обчислює відповідне збудження. N-вимірні вагові вектори w1, w2,.
. . , wm використовуються для обчислення. Мета процесу складання графіків
полягає в тому, щоб кожен підрозділ навчився спеціалізуватися на різних
областях вхідного простору. Коли вхід з такої області подається в мережу,
відповідний блок повинен обчислити максимальне збудження. Алгоритм
навчання Кохонена використовується для гарантування досягнення цього
ефекту.
Рисунок 3.2 - Одновимірна решітка обчислювальних одиниць
Одиниця Кохонена обчислює евклідову відстань між вхідним x та його
вектором ваги w. Це нове визначення збудження є більш підходящим для
певних застосувань, а також простіше для візуалізації. В одновимірній
мережі Кохонена сусідство радіуса 1 одиниці на k-му положенні складається
з одиниць у положеннях k - 1 і k + 1.
Агрегати на обох кінцях ланцюга мають асиметричні сусідства. Район
радіусу r одиниці k складається з усіх одиниць, розташованих до r позицій від
k ліворуч або праворуч ланцюга. У навчанні Кохона використовується
функція сусідства φ, значення φ (i, k) являє собою силу зв'язку між одиницею
36
i та одиницею k у процесі навчання. Простим вибором є визначення φ (i, k) =
1 для всіх одиниць i в районі радіуса r одиниці k і φ (i, k) = 0 для всіх інших
// Setting ComVisible to false makes the types in this assembly not visible// to COM components. If you need to access a type in this assembly from// COM, set the ComVisible attribute to true on that type.[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM[assembly: Guid("8a0984d3-86c7-420b-9676-5ae488e84f71")]
// Version information for an assembly consists of the following four values://// Major Version// Minor Version// Build Number// Revision//// You can specify all the values or you can default the Build and Revision Numbers// by using the '*' as shown below:// [assembly: AssemblyVersion("1.0.*")][assembly: AssemblyVersion("1.0.0.0")][assembly: AssemblyFileVersion("1.0.0.0")]
//Resources.Designer.cs//------------------------------------------------------------------------------// <auto-generated>// This code was generated by a tool.// Runtime Version:4.0.30319.42000//// Changes to this file may cause incorrect behavior and will be lost if// the code is regenerated.// </auto-generated>//------------------------------------------------------------------------------
namespace WindowsAnomalyDetector.Properties{
79
/// <summary> /// A strongly-typed resource class, for looking up localized strings, etc. /// </summary> // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources {
/// <summary> /// Returns the cached ResourceManager instance used by this class. /// </summary> [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { get { if ((resourceMan == null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WindowsAnomalyDetector.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } }
/// <summary> /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// </summary> [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set {
/// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); }
#region Windows Form Designer generated code
/// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { label1 = new System.Windows.Forms.Label(); SelectLogsFileButton = new System.Windows.Forms.Button(); selectLogsFileDialog = new System.Windows.Forms.OpenFileDialog(); label2 = new System.Windows.Forms.Label(); AnalyzeButton = new System.Windows.Forms.Button(); label3 = new System.Windows.Forms.Label(); invalidLogsCountLabel = new System.Windows.Forms.Label(); resultLabel = new System.Windows.Forms.Label(); dataGridView1 = new System.Windows.Forms.DataGridView(); Date = new System.Windows.Forms.DataGridViewTextBoxColumn();
public long Counter { get; set; } public int Id { get; set; } public AuditStatus Status { get; set; } public DateTime? TimeStamp { get; set; } public EventSource Source { get; set; } public string EventCode { get; set; } }
internal sealed class FormattedEventLog { public long Counter { get; set; } public double Id { get; set; } public int Status { get; set; } public double[] TimeStamp { get; set; } public int Source { get; set; } public int[] EventCode { get; set; } }
public class KohonenNeuralNetwork { public Neuron[] Outputs { get; private set; }
85
private int _iteration; private int _length; private int _dimensions; private double _nf;
private int _samples = 0; private int _classes = 1; private int _numberTotalOfNeurons = 0; private int[] _classStart = new int[] { 0 };
private readonly List<ulong> _timeLabbls = new List<ulong>(); private readonly List<byte[]> _patterns = new List<byte[]>(); private readonly Random _random = new Random();
private string _counberLog = @"counter.csv", _labelsLog = @"result.csv"; private string[] _burstLog = new string[] { @"WindowsLogs.csv" }; private int _inputSize = 500; private int _electrode = 64; private int _initSampleToLearn = 100000, _maxSampleCapacity = 200000, _sampleToLearn = 100000; private int _maxIteration; private int _numCPUs = 4; private int _neurons = 64; private int _neighborsDistance = 4; private bool _learnInRandomOrder = false; private bool _normalEuclideanDistances = false; private double[] _globalMaxError = new double[] { 0.0001 };
public KohonenNeuralNetwork() { Initialise();
string counberLogOrg = _counberLog.ToString();
for (int t = 0; t < _globalMaxError.Length; t++) { _iteration = 0; _counberLog = counberLogOrg + "_of_global_map_" + _globalMaxError[t].ToString();
var reader = File.OpenText(_burstLog[0]); var counterWriter = new StreamWriter(_counberLog + ".csv"); var labelsWriter = new StreamWriter(_labelsLog + ".csv");
var eof = _LoadData(ref reader, _initSampleToLearn);
Outputs = new Neuron[_numberTotalOfNeurons]; for (int neuronIndex = 0, xAxisIndex = 0, yAxisIndex = 0; neuronIndex < _numberTotalOfNeurons; neuronIndex++, xAxisIndex = neuronIndex / _length, yAxisIndex = neuronIndex % _length) { Outputs[neuronIndex] = new Neuron(xAxisIndex, yAxisIndex, neuronIndex) { Weights = new double[_dimensions], DoubleWeights = new double[_dimensions], WeightsBackup = new double[_dimensions] };
for (int dimensionIndex = 0; dimensionIndex < _dimensions; dimensionIndex++) { double r = _random.Next() / (int.MaxValue + 0.0); Outputs[neuronIndex].Weights[dimensionIndex] = r; Outputs[neuronIndex].DoubleWeights[dimensionIndex] = r * r; Outputs[neuronIndex].WeightsBackup[dimensionIndex] = r; }
// distance Outputs[neuronIndex].distance = new double[_length, _length]; for (int x = 0, id = 0; x < _length; x++) { for (int y = 0; y < _length; y++) { int tX = x - xAxisIndex; int tY = y - yAxisIndex; double temp = Math.Sqrt((tX * tX) + (tY * tY)); Outputs[neuronIndex].distance[x, y] = -(temp * temp); id++; } }
}
87
// Neighbors for each neuron foreach (var n in Outputs) { int num = 0; for (int x = 0; x < _length; x++) { for (int y = 0; y < _length; y++) { if (n.distance[x, y] >= -_neighborsDistance) { num++; } } }
n.neighbors = new Neuron[num];
int neighborIndex = 0, counter = 0; for (int x = 0; x < _length; x++) { for (int y = 0; y < _length; y++) { if (n.distance[x, y] >= -_neighborsDistance) { n.neighbors[neighborIndex] = Outputs[counter]; neighborIndex++; } counter++; } } } }
private bool _LoadData(ref StreamReader reader, int lines) { if (_classes == 1) { int count = 0; while (!reader.EndOfStream) { var line = reader.ReadLine().Split(','); var timeLable = ulong.Parse(line[0]); var inputs = new byte[_dimensions]; int e = -1;
for (int i = 1; i < line.Length; i++) { if (line[i].CompareTo("") == 0) { continue; }
var p = int.Parse(line[i]); if (p <= 0) { e = -p; } else { inputs[e * _inputSize + p] = 1; } } if (_maxSampleCapacity > 0 && _samples == _maxSampleCapacity)
} else { _classStart = new int[_classes]; int count = 0;
for (int f = 0; f < _classes; f++) { _classStart[f] = count; reader = new StreamReader(_burstLog[f]); while (!reader.EndOfStream) { var line = reader.ReadLine().Split(','); var timeLable = ulong.Parse(line[0]); var inputs = new byte[_dimensions]; int e = -1; for (int i = 1; i < line.Length; i++) { if (line[i].CompareTo("") == 0) { continue; }
var p = Int32.Parse(line[i]); if (p <= 0) { e = -p; } else { inputs[e * _inputSize + p] = 1; } } count++; _patterns.Add(inputs); _timeLabbls.Add(timeLable); } }
}
return (!reader.EndOfStream); }
private void Train(double maxError)
89
{ double currentError;
var options = new ParallelOptions { MaxDegreeOfParallelism = _numCPUs };
do { Debug.WriteLine(Environment.NewLine); currentError = 0.0;
if (_learnInRandomOrder) { var TrainingSet = new List<byte[]>(); foreach (var pattern in _patterns) { TrainingSet.Add(pattern); }
for (int i = 0; i < _patterns.Count; i++) {
if (i % 50 == 0) { Debug.Write("."); }
var place = _random.Next(TrainingSet.Count - 1); var pattern = TrainingSet[place];
currentError += TrainPattern(pattern, ref options); TrainingSet.RemoveAt(place); } } else { int c = 0; foreach (byte[] pattern in _patterns) { currentError += TrainPattern(pattern, ref options); if (c % 50 == 0) { Debug.Write("."); }
var e = winner.neighbors.Length; var error = new double[e];
Parallel.For(0, e, options, n => { var N = winner.neighbors[n]; var t = (learningRate * Math.Exp(N.distance[winnerX, winnerY] / strength)); error[n] = N.UpdateWeights(pattern, t); }); _iteration++;
var r = error[0]; for (int i = 1; i < e; i++) { r += error[i]; } return Math.Abs(r / e); }
var labbles = new List<ulong>[_length, _length]; for (int x = 0; x < _length; x++) { for (int y = 0; y < _length; y++) { labbles[x, y] = new List<ulong>(); } }
var globalCounter = new int[_length, _length]; var classCounters = new List<int[,]>(); for (int c = 0; c < _classes; c++) { classCounters.Add(new int[_length, _length]); }
for (int c = 0, i = 0; i < _patterns.Count; i++) { var neuron = (_normalEuclideanDistances) ? _WinnerNormalEuclidean(_patterns[i]) : Winner_Customize_Euclidean(_patterns[i]); labbles[neuron.X, neuron.Y].Add(_timeLabbls[i]); globalCounter[neuron.X, neuron.Y]++;
if (_classes > 1) { for (int c = 0; c < _classes; c++) { var wr = new StreamWriter(_counberLog + "_class_" + c.ToString() + ".csv", true); for (int i = 0; i < _length; i++) { for (int j = 0; j < _length; j++) { wr.Write(classCounters[c][i, j].ToString() + ","); }
wr.WriteLine(); } wr.Flush(); wr.Close(); } }
}
private Neuron Winner_Customize_Euclidean(byte[] pattern) { var winner = new Neuron[_numberTotalOfNeurons]; var min = new double[_numberTotalOfNeurons];
Parallel.ForEach(Outputs, new ParallelOptions { MaxDegreeOfParallelism = _numCPUs }, n => { var weights = n.Weights; double dd = 0; for (int i = 0; i < _inputSize; i++) { double t, d = 0; for (int w = i * _electrode, end = w + _electrode; w < end; w++) { if (pattern[w] == 0) { d += n.DoubleWeights[w]; }
92
else { t = pattern[w] - weights[w]; d += t * t; } } dd += Math.Sqrt(d); } // min[n.ID] = dd; winner[n.ID] = n; }); int idx = 0; for (int i = 0; i < _numberTotalOfNeurons; i++) { if (winner[i] != null) { idx = i; break; } }
for (int i = idx + 1; i < _numberTotalOfNeurons; i++) { if ((winner[i] != null) && (min[i] < min[idx])) { idx = i; } }
return winner[idx];
}
private Neuron _WinnerNormalEuclidean(byte[] pattern) { var winner = new Neuron[_numberTotalOfNeurons]; var min = new double[_numberTotalOfNeurons];
Parallel.ForEach(Outputs, new ParallelOptions { MaxDegreeOfParallelism = _numCPUs }, n => { // find the Euclidean distance double t, d = 0; double[] weights = n.Weights; for (int w = 0; w < weights.Length; w++) { t = (double)pattern[w] - weights[w]; d += t * t; } // min[n.ID] = Math.Sqrt(d); winner[n.ID] = n; }); int idx = 0; for (int i = 0; i < _numberTotalOfNeurons; i++) if (winner[i] != null) { idx = i; break; }
for (int i = idx + 1; i < _numberTotalOfNeurons; i++) if ((winner[i] != null) && (min[i] < min[idx]))
public class Neuron { public double[] Weights, DoubleWeights, WeightsBackup; public double[,] distance; public Neuron[] neighbors; public int X; public int Y; public int ID;
public Neuron(int x, int y, int id) { X = x; Y = y; ID = id; }
public void RestoreWeightsBackup() { for (int k = 0; k < Weights.Length; k++) { Weights[k] = WeightsBackup[k]; DoubleWeights[k] = WeightsBackup[k] * WeightsBackup[k]; } }
public void BackupWeights() { for (int k = 0; k < Weights.Length; k++) { WeightsBackup[k] = Weights[k]; } }
public double UpdateWeights(byte[] pattern, double LearningRate_Gauss) { double sum = 0;
94
for (int i = 0; i < Weights.Length; i++) { var delta = LearningRate_Gauss * (pattern[i] - Weights[i]); Weights[i] += delta; DoubleWeights[i] = Weights[i] * Weights[i]; sum += delta; }
public static readonly Dictionary<EventLog.AuditStatus, string> AuditEnumStringMap = new Dictionary<EventLog.AuditStatus, string> { { EventLog.AuditStatus.Failed, AuditFaiureStatusSrting }, { EventLog.AuditStatus.Successful, AuditSuccessStatusSrting }, };
public static readonly Dictionary<EventLog.EventSource, string> SourceEnumStringMap = new Dictionary<EventLog.EventSource, string> { { EventLog.EventSource.Eventlog, "Microsoft Windows Security Auditing" }, { EventLog.EventSource.MicrosoftWindowsSecurityAuditing, "Microsoft Windows Eventlog"}, };
public static List<double[]> ParseEventLogsFile(string filePath, out int failedLogsCounter, out List<string> existandEventCodes, out List<EventLog> nonFormattedEventLogs) { long counter = 0; nonFormattedEventLogs = new List<EventLog>();
using (var reader = new EventLogReader(filePath, PathType.FilePath)) { EventRecord record; while ((record = reader.ReadEvent()) != null) {
95
using (record) { var log = new EventLog { Id = record.Id, TimeStamp = record.TimeCreated, Source = GetEventSourceFromString(record.ProviderName), Status = GetAuditStatusFromString(record.KeywordsDisplayNames.SingleOrDefault()), EventCode = record.TaskDisplayName, };
public static List<EventLog> FormatBackResultedLogs(List<double[]> resultedEventLogs, List<EventLog> initialEventLogs) { var result = new List<EventLog>();
foreach(var resultedEventLog in resultedEventLogs) { var counter = Convert.ToInt32(resultedEventLog[0]); result.Add(initialEventLogs.ElementAt(counter)); }
return result; }
private static List<double[]> FormatLogsToArray(List<FormattedEventLog> formattedLogsList, int existantEventCodesCount) { var result = new List<double[]>();
foreach(var log in formattedLogsList) { var arraySize = LogVectorSize + existantEventCodesCount;
private static int[] GetEventSourceFormattedArray(List<string> existantEventCodes, string currentEventCode) { var result = new int[existantEventCodes.Count]; for (int i = 0; i < existantEventCodes.Count; ++i) { result[i] = 0; }
var currentEventCodeIndex = existantEventCodes.IndexOf(currentEventCode); result[currentEventCodeIndex] = 1;
namespace WindowsAnomalyDetector{ static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false);
namespace WindowsAnomalyDetector{ public partial class MainWindow : Form { private static readonly List<string> AllowedExtensions = new List<string> { ".evtx", };
public string FilePath { get; set; }
public MainWindow() { InitializeComponent(); }
private void SelectLogsFileButton_Click(object sender, EventArgs e) { var result = selectLogsFileDialog.ShowDialog();
if (result == DialogResult.OK || result == DialogResult.Yes) { FilePath = selectLogsFileDialog.FileName;
if (string.IsNullOrEmpty(FilePath)) { MessageBox.Show("File hadn't been selected. Please select file.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (!AllowedExtensions.Contains(Path.GetExtension(FilePath))) { MessageBox.Show("Invalid file", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; }