Аналіз журналів за допомогою LogParser

  1. Швидкий пошук в журналах служби безпеки Управління безліччю журналів, що генеруються в середовищі...
  2. простий запит
  3. формулювання запитів
  4. FROM security
  5. Поля журналів подій
Швидкий пошук в журналах служби безпеки

Управління безліччю журналів, що генеруються в середовищі Windows, - необхідна, але віднімає багато часу завдання адміністраторів. На кожній робочій станції, автономному сервері і контролері (DC) домену є журнали Security, Application і System, і у всіх міститься цінна інформація про систему і засобах забезпечення її безпеки. Залежно від середовища і використовуваних компонентів Windows до них можуть додатися журнали, які генеруються Internet Authentication Service (IAS), Microsoft IIS, RRAS і URLScan, а також журнали таких серверів додатків, як Microsoft Exchange Server і Microsoft SQL Server. Всі ці журнали мають різні формати і структури і містять чимало зайвої інформації, яку доводиться видаляти, щоб відшукати важливі події. Тут потрібно інструмент, який може читати і виконувати схожі на SQL запити для журналів будь-яких типів. Такий інструмент - LogParser, утиліта командного рядка, сумісна з Windows 2000 і більш пізніми версіями операційної системи. Можливості функцій збору даних LogParser не поступаються такій базі даних SQL, як Microsoft Access. Інструмент автоматично обробляє мегабайти інформації, що записується в різні журнали мережі підприємства. Під час підготовки даної статті новітньою версією був LogParser 2.1. Продукт можна завантажити разом з пакетом IIS 6.0 Resource Kit Tools ( http://www.microsoft.com/downloads/details.aspx?familyid=56fc92ee-a71a-4c73-b628-ade629c89499&displaylang=en ).

Як працює LogParser

LogParser складається з трьох основних компонентів: вхідної процесора, механізму обробки даних і вихідного процесора. Вхідний процесор сумісний з форматами таких журналів, як IIS і Windows (.evt-файли). LogParser може читати файли з розділовими комами (.csv), бази даних ODBC і текстові файли, в яких як роздільник використовуються символи повернення каретки. Вхідний процесор перетворює дані журналів всіх типів в єдиний формат, а потім інформація обробляється в механізмі даних LogParser точно так же, як таблиці в базі даних.

Адміністраторам, знайомим з операторами SQL SELECT, не важко освоїти команди LogParser. У команді LogParser можна вказати поля журналу, які повинні увійти в генерований інструментом файл, корисні і непотрібні записи про події (за результатами порівняння полів, заданих користувачем) і метод сортування вихідних записів. Але в дійсності можливості LogParser набагато ширше. У механізмі даних реалізовані новітні функції запитів, зокрема підрахунку записів, середніх значень і визначення 10 найбільш частих подій. Працюючи з текстовими полями і виробляючи обчислення над датами і числами, можна налаштовувати вихідні дані і уточнювати критерії вибору.

Після того як механізм даних обробить інформацію і видасть набір результатів, в дію вступає вихідний процесор, який перетворює набір результатів в вихідну таблицю. Вихідний процесор, як і вхідний, сумісний з багатьма типами файлів, і вихідну таблицю можна уявити по-різному - від простих текстових файлів до бази даних SQL або XML-файлів.

простий запит

Щоб оцінити можливості LogParser, почнемо з прикладу команди і її вихідних даних. Наступна команда запитує журнал Security на локальній системі і генерує звіт про всі блокованих облікових записах:

logparser «SELECT DISTINCT SID FROM security WHERE EventID = 644

Вихідні дані наведені на екрані 1. Тут вказані лише SID блокованих облікових записів користувачів; в подальшому я поясню, як перетворити SID в імена користувачів. Як видно, LogParser - потужний інструмент з простим синтаксисом. Єдиний обов'язковий агрумент - оператор SELECT, який необхідно взяти в лапки. LogParser чутливий до регістру символів при читанні здебільшого вхідної інформації, тому, наприклад, «eventid» відрізняється від «EventID». Залежно від типу досліджуваного журналу іноді необхідно вказати параметри вхідних журналів або формат вихідних файлів.

Залежно від типу досліджуваного журналу іноді необхідно вказати параметри вхідних журналів або формат вихідних файлів

формулювання запитів

Щоб домогтися від LogParser максимальної віддачі, необхідно навчитися формулювати запити. LogParser спочатку сумісний з журналами подій Windows, тому складати запити до журналу Security просто. LogParser не потребує додаткових інструкціях по розбору журналу. Тому вчитися складати ефективні запити зручно на прикладі журналу Security. Отримані знання можна застосувати і в поводженні з журналами інших типів.

Оператор SELECT складається з двох обов'язкових (SELECT і FROM) та кількох необов'язкових операторів:

SELECT вираз FROM вираз [TO вираз] [WHERE вираз] [GROUP BY вираз] [HAVING вираз] [ORDER BY вираз]

Оператор SELECT вказує поля, які увійдуть до кожної запис набору результатів запиту. Оператор FROM вказує, який журнал або журнали слід використовувати в якості вхідних. Оператор TO задає місце призначення для вихідного файлу. Оператор WHERE визначає критерії фільтрації вхідних і вихідних записів запиту. Оператори GROUP BY і HAVING є потужні засоби аналізу груп аналогічних записів, загальних обчислень над цими групами і завдання критеріїв фільтрації груп на вході і виході запиту. Оператор ORDER BY сортує набір результатів по заданих полях. Розглянемо оператори FROM, SELECT і WHERE більш докладно.

FROM. Щоб направити запит до журналу Windows Security, слід використовувати оператор FROM.

FROM security

Щоб перейти до інших стандартних журналам подій Windows «security» слід замінити на «application» або «system». Щоб направити запит до журналів інших типів, необхідно вказати ім'я журналу в операторі FROM.

SELECT. Наступний крок після вибору опитуваного журналу при побудові команди LogParser - підготовка пропозиції SELECT. Даний оператор задає список полів вхідного журналу, розділених комами, які увійдуть в вихідний файл запиту. Завдяки вбудованим функціям для роботи з журналами подій Windows, LogParser автоматично розпізнає імена полів журналу (EventLog, RecordNumber, TimeGenerated, TimeWritten, Event-ID, EventType, EventTypeName, EventCategory, SourceName, Strings, ComputerName, SID і Message); в урізанні «Поля журналів подій» коротко описано кожне поле. LogParser розпізнає імена полів журналів IIS. Для вхідних файлів інших форматів LogParser може визначити імена полів з першого рядка журнального файлу, якщо вона являє собою заголовок. В іншому випадку LogParser зазначає кожне вхідне поле як Field1, Field2 і т. Д. У разі сумнівів щодо імен полів їх можна визначити за допомогою оператора SELECT * FROM filename LogParser видає все поля з вхідного файлу. Після того як LogParser видасть кілька записів, слід зупинити запит і переглянути записи, щоб визначити призначення кожного поля, а потім зіставити кожне поле імені, призначеного йому програмою LogParser.

Оператор SELECT дозволяє задавати вираження поряд з простими іменами полів. Користувач може маніпулювати рядками і виконувати арифметичні дії над числовими полями і датами при генерації вихідний таблиці. Наприклад, вихідну таблицю можна доповнити елементарним описом кожної події, без всіх рядків, наступних за таким описом. У журналі Security елементарне опис кожної події - перша інформація, яка відображається в полі Message записи про подію; опис закінчується двокрапкою (:). Таким чином, LogParser повинен досліджувати поле Message, відшукати першої двокрапки і видати текст, розташований перед ним:

logparser «SELECT SUBSTR (Message, 0, INDEX_OF (Message,?:?)) AS Description FROM security»

У цій команді використовуються дві функції маніпулювання рядками, реалізовані в LogParser: SUBSTR і INDEX_OF. Знайти початок поля Message (до першого двокрапки) можна за допомогою функції SUBSTR. Перший параметр цієї функції вказує вихідний рядок, яку належить розділити, - в даному випадку Message. Другий параметр вказує позицію всередині початкового рядка, з якої слід почати, наприклад перший символ (позиція 0). Третій параметр вказує кінцеву позицію всередині заданої стрічки - двокрапка. Але щоб отримати позицію двокрапки, необхідно використовувати функцію INDEX_OF, яка повертає першу позицію символу «двокрапка» в поле Message. LogParser має безліч функцій для маніпуляцій з рядками, числами і датами; більш детальну інформацію про ці функції можна знайти в файлі LogParser.doc в папці установки LogParser.

Щоб дати висловом в запиті ім'я, слід використовувати ключове слово AS з подальшим ім'ям поля, яке буде відображатися в вихідний таблиці, наприклад Description. Ключове слово AS може знадобитися для іменованих виразів в операторі SELECT або перейменування поля в операторі SELECT. Нижче, в оповіданні про підлеглих запитах, буде наведено приклад використання AS для перейменування полів.

Нерідко LogParser видає дубльовані записи, так як кілька записів у своєму розпорядженні однаковими значеннями в наборі полів, зазначених в операторі SELECT. Наприклад, команда

logparser «SELECT EventID FROM security»

багаторазово повідомляє про події ID 528 (успішна реєстрація), кожне з яких відповідає успішної реєстрації. Якщо потрібен просто список всіх ідентифікаторів ID зареєстрованих подій, то слід знайти спосіб виключити дублікати з набору результатів. У LogParser ця проблема вирішується за допомогою ключового слова DISTINCT. Щоб виключити дубльовані рядки з набору результатів, досить вставити це ключове слово після SELECT. Наприклад, команда

logparser «SELECT DISTINCT EventID FROM security»

видає список унікальних ідентифікаторів подій, що представляє перелік всіх подій з унікальними ID, що зустрічаються в журналі хоча б один раз. Ключове слово DISTINCT застосовується тільки до полів, зазначеним в операторі SELECT, але не до полів, зазначеним в інших операторах, таких як WHERE, ORDER BY, GROUP BY або HAVING.

WHERE. Після того як вказано журнал або журнали, до яких потрібно послати запити, і поля, звідки потрібно витягти інформацію, слід задати критерій фільтрації. Оператор WHERE задає вираз, що має значення TRUE або FALSE. Цей вислів може бути простим:

«EventID = 529» Або складним, наприклад: «EventID = 529 AND TimeGenerated> = TO_TIMESTAMP (? 2003-12- 21?,? Yyyy-MM-dd?) AND TimeGenerated
Цей вираз витягує всі екземпляри події з ID 529 (невдала спроба реєстрації: неправильне ім'я користувача або пароль), які відбулися між 21 грудня 2003 р і 24 грудня 2004 року (MM - місяць; mm - хвилини). Кілька простих виразів всередині складного вираження пов'язані оператором AND. Можна також використовувати оператори OR, NOT та дужки, як в SQL або іншою мовою програмування.
Стандартні оператори порівняння SQL (табл. 1) можна задіяти в операторі WHERE для порівняння полів зі значеннями і виразами. Зокрема, оператор LIKE дуже корисний для порівняння із застосуванням універсальних символів. Наприклад, команда logparser -i: EVT -resolveSIDs ON «SELECT SID FROM security WHERE SID LIKE?% Smith%?»
використовує оператор LIKE для генерації списку всіх подій, запущених користувачами, в іменах яких є символи «smith» (наприклад, Smith, Naismith, Smithe). Замінивши «% smith%» на «Wri *», можна отримати такі імена, як Wright і Wrigley; «% Son» повертає такі імена, як Johnson і Albertson. У цьому прикладі команди використаний ще один корисний параметр LogParser: -resolveSIDs. SID сам по собі досить незручний для сприйняття, тому за допомогою -resolveSIDs можна автоматично перетворити SID в імена відповідних облікових записів користувачів. Щоб задіяти цей параметр, досить вставити перед оператором SELECT наступний запис:
-i: EVT -resolveSIDs ON
Наприклад, команда
logparser -i: EVT -resolveSIDs
ON «SELECT DISTINCT SID FROM security»
може вивести результати, показані на екрані 2. Аналогічним чином можна використовувати функцію RESOLVE_SID () для перетворення SID в відповідне ім'я облікового запису. Наприклад, команда «EventID = 529» Або складним, наприклад: «EventID = 529 AND TimeGenerated> = TO_TIMESTAMP ( logparser «SELECT DISTINCT SID, RESOLVE_SID (SID) AS username FROM security»
повертає кожен унікальний SID і відповідне ім'я користувача (екран 3).
Зазвичай вихідні дані фільтруються за значенням поля щодо іншого значення. Так, можна з'ясувати, чи співпадає ID події поточного запису з числом 529 або значення TimeGenerated перевищує або дорівнює певної дати. Але іноді необхідно дізнатися, чи існує в списку те чи інше поле. У таких випадках застосовується оператор порівняння IN. Наприклад, оператор
WHERE EventID IN (529, 530, 531,
532, 533, 534, 535, 537, 539)
повертає всі події невдалої реєстрації, наведені в дужках. Вставивши NOT перед IN, можна звернути логіку і отримати записи, в яких немає перерахованих ідентифікаторів.
Однак у оператора IN є ще одне важливе застосування. Можна скласти оператор WHERE, в якому LogParser використовує значення одного або декількох полів поточного рядка для створення підлеглих запитів, результати виконання яких допоможуть визначити, чи слід додати поточну рядок у вихідні дані. Для цього можна вбудувати підзапит в дужки, наступні за IN. Наприклад, можна отримати список всіх користувачів, чиї облікові записи були блоковані і у кого згодом були скинуті паролі. Для цього потрібно знайти кожну подію блокування облікового запису (ID 644), потім визначити, чи був для цього запису скинутий пароль після дати і часу події блокування. Для виконання цих завдань слід спочатку скласти простий запит: «SELECT SID AS username, TimeGenerated AS LockoutTime FROM security WHERE EventID = 644»
В результаті будуть отримані імена користувачів всіх коли-небудь блокованих облікових записів. Потім потрібно додати наступне вираз IN: AND username IN (SELECT SID AS subUserName FROM security WHERE EventID = 642 AND subUserName = username AND TimeGenerated> LockoutTime)
Додавши параметр -resolve SIDs, щоб отримати читаються імена користувачів, і застосувавши параметр AS для перейменування папок, отримуємо команду: logparser -i: EVT -resolveSIDs ON «SELECT SID AS username, TimeGenerated AS LockoutTime FROM security WHERE EventID = 644 AND username IN ( SELECT SID AS subUserName FROM security WHERE EventID = 642 AND subUserName = username AND TimeGenerated> LockoutTime) »
При запуску цієї команди LogParser відшукує всі події з ID 644, потім знаходить все події з ID 642 з таким же ім'ям користувача, що відбулися після блокування користувача. Оператор SELECT в підзапиті повинен повертати лише одне поле, в іншому випадку програмі LogParser буде невідомо, з яким полем з набору результатів підзапиту потрібно проводити порівняння. В даному прикладі LogParser перевіряє вміст поля username в записах, отриманих в результаті роботи підзапиту. Параметр AS ми використовували для перейменування полів в обох операторах SELECT, щоб уникнути двозначності при порівнянні поля імені користувача (username) в батьківському запиті з полем імені користувача (subUserName) в підпорядкованому запиті.
Таким чином, LogParser являє собою потужний інструмент, за допомогою якого можна складати SQL-подібні запити для пошуку в журналах будь-якого типу. Це дозволяє знаходити потрібну інформацію, не переглядаючи тисячі записів журналу. Поряд з описаними в статті функціями LogParser розпорядженні і іншими можливостями для маніпулювання рядками, датами і числовими полями. За допомогою одного запиту можна перевірити кілька журналів і навіть видати результати в різні файли. Крім того, LogParser підтримує функції агрегування, які дозволяють виконувати високорівнева аналіз з урахуванням тимчасових інтервалів, середніх значень, мінімумів і максимумів і 10 найбільш часто зустрічаються записів для даного критерію. В одній з наступних статей я розповім про те, як використовувати такі функції для аналізу даних і кодів в поле Strings в описі подій системи безпеки.
Ренді Франклін Сміт - редактор Windows & .NEtT Magazine і ведучий інструктор і розробник курсів для програми з безпеки Windows NT / 2000 інституту MIS Training. Його компанія, Monterey Technology Group, займається консалтингом в області інформаційної безпеки. Зв'язатися з ним можна за адресою: [email protected]

Поля журналів подій


Імена полів в журналах подій (.evt) Windows 2000 і пізніших версій наступні: EventLog, RecordNumber, TimeGenerated, TimeWritten, EventID, EventType, EventTypeName, SourceName, EventCategory, Strings, Message, ComputerName і SID. Яким чином використовуються ці поля, коли LogParser обробляє події журналу Security?

EventLog містить ім'я журналу подій, з якого взята поточна рядок вихідний таблиці LogParser. EventLog потрібен тільки в тому випадку, якщо в операторі FROM вказано кілька журналів. RecordNumber вказує номер запису події в журналі. TimeGenerated і TimeWritten показують дату і час, коли повідомлення про подію надійшло в службу Event Logging, і дату і час, коли служба записала подія в журнал. Зазвичай значення цих полів однакові.

Таблиця 1. Оператори порівняння LogParserОператорПризначення

= Дорівнює Менше, ніж> Більше, ніж Менше або дорівнює> = Більше або дорівнює LIKE, NOT LIKE Порівняння з універсальними символами IN, NOT IN Пошук значення в списку значень або підпорядкованому запиті IS NULL, IS NOT NULL Визначає поля з нульовим значенням

Поле EventID містить ID події в Windows. Наприклад, Windows ідентифікує події блокування облікових записів як ID 644, успішні спроби реєстрації як ID 528. EventType і EventTypeName вказують, чи була подія успішним. Наприклад, подія з ID 529 (невдала спроба реєстрації: неправильне ім'я користувача або пароль) має EventType 16, а EventTypeName - Failure Audit event; тоді як подія з ID 528 (успішна реєстрація) має EventType 8, а EventTypeName - Success Audit event. Поле EventType журналу Security може мати значення 8 або 16; в журналах System і Application використовуються інші значення для інформаційних подій, попереджень і помилок.

SourceName и EventCategory відповідають полях Source та Category в Event Viewer (екран A). Поле SourceName НЕ дуже корисний, тому что всі події ма ють однаково джерело: Security. Але EventCategory може стати в нагоді для сортування та фільтрації подій відповідно до категорій політик аудиту Windows. У Windows 2000 і пізніших версіях є дев'ять категорій політик аудиту, які можна побачити, відкривши інтерфейс Administrative Tools, Local Security Policy і перейшовши до Security SettingsLocal PoliciesAudit Policy.

EventCategory - числове значення; в табл. A показані значення EventCategory і відповідні імена категорій (як ім'я категорії політики аудиту, так і ім'я в поле Event Viewer Category).

Поля Strings і Message відносяться до Складний рядок в розділі Description записи події. Для сумісності з різними мовами служба Windows Event Log налаштована так, що розробники можуть окремо створювати статичні і динамічні елементи опису. Наприклад, в розділі Description записи з ID 576 (екран B) імена полів User Name і Domain є статичні елементи, а значення цих полів (LOCAL SERVICE і NT AUTHORITY) - динамічні елементи, які змінюються від одного примірника події до іншої. Динамічні елементи називаються рядками (string). Тому поле Strings в LogParser містить всі динамічні елементи поточного події. Це поле використовується, якщо потрібно відфільтрувати події за динамічними елементами для заданого ID - наприклад, щоб побачити всі екземпляри події з ID 528 (успішна реєстрація) з Logon Type 2 (інтерактивна). У наступних статтях буде показано, як витягувати певні елементи з таких текстових полів, як Strings, за допомогою функцій LogParser для маніпулювання рядками. Поле Message містить повний опис події, т. Е. І статичні, і динамічні елементи.

ComputerName вказує комп'ютер, на якому зареєстровано подія. При аналізі одного журналу це поле для всіх подій однаково. Але якщо одна команда LogParser використовується для запиту до кількох журналів, то поле ComputerName необхідно для ідентифікації комп'ютерів, генерувати кожну подію.

Поле SID містить SID облікових записів користувачів, пов'язаних з подією. Для більшості подій SID відповідає облікового запису, що викликала подія, але деякі події генеруються системними обліковими записами, а не користувачами. У табл. B перераховані SID і облікові записи, які генерували ці події. Одна з функцій LogParser перетворює SID в імена облікових записів користувачів, як описано в основній частині статті.

Aspx?
Message,?
Yyyy-MM-dd?
Наприклад, команда logparser -i: EVT -resolveSIDs ON «SELECT SID FROM security WHERE SID LIKE?
Smith%?
Яким чином використовуються ці поля, коли LogParser обробляє події журналу Security?