Парсинг и анализ данных: логи, regex, JSON/CSV, основы SIEM-подхода
Зачем junior-скриптеру уметь парсить данные
В прошлых статьях вы освоили базовый Python, научились работать в Linux-терминале и разобрались с сетями. Теперь логичный шаг к «рабочим» задачам: научиться превращать сырые логи и выгрузки в структурированные события, которые можно агрегировать, коррелировать и превращать в отчёты.
Практически в любой роли (SOC, DFIR, инфраструктурная безопасность, AppSec) вы регулярно делаете одно и то же:
берёте данные из логов или API
выделяете из них поля (IP, пользователь, действие, статус)
приводите их к единому виду
считаете метрики, находите аномалии, готовите отчётЭто и есть основа «SIEM-подхода» на уровне junior: сбор → разбор → нормализация → обогащение → правила/корреляции → результат.
!Общая схема SIEM-подхода: как сырые данные превращаются в алерты и отчёты
Что такое лог, запись, событие и почему важна структура
Лог и запись
Лог — это файл (или поток), куда система/приложение пишет сообщения о происходящем.
Запись лога — обычно одна строка (но иногда событие занимает несколько строк, например stack trace в приложениях).
Событие
Событие в нашем смысле — это запись, превращённая в структуру (обычно dict в Python), где данные разложены по полям.
Пример:
сырая строка: Failed password for invalid user admin from 203.0.113.10 port 51822 ssh2
событие: { "action": "login_failed", "user": "admin", "src_ip": "203.0.113.10", "src_port": 51822, "app": "ssh" }Структурированные и неструктурированные данные
Неструктурированные: обычный текст, где поля нужно «выковыривать» (типично для многих системных логов).
Полуструктурированные: текст, но с понятным форматом (например, key=value).
Структурированные: JSON/CSV, где поля уже выделены.В этой статье мы научимся работать со всеми тремя, но особый упор сделаем на неструктурированные логи и regex.
Какой формат логов встречается чаще всего
Syslog как типовой «стиль» системных логов
Во многих Linux-системах события пишутся в стиле syslog: там обычно есть время, хост, имя процесса и текст.
Спецификация syslog-протокола: RFC 5424.
Важно понимать практическую вещь: даже если транспорт syslog стандартный, формат сообщения часто “как получится”. Поэтому парсинг почти всегда начинается с поиска регулярным выражением.
Типовые источники для junior-задач
auth.log / secure: входы, ошибки аутентификации, sudo, sshd
web access logs (Nginx/Apache): HTTP методы, пути, статусы, User-Agent
DNS логи: домен, тип записи, ответ
выгрузки из систем в JSON/CSVПринципы хорошего парсинга для безопасности
Чтобы скрипт был полезен на работе, придерживайтесь принципов:
Не теряйте оригинал: сохраняйте raw (исходную строку), чтобы можно было перепроверить.
Нормализуйте поля: один смысл — одно имя поля (например, везде src_ip, а не то ip, то remote_addr).
Делайте время явным: по возможности приводите к ISO-формату и фиксируйте таймзону.
Старайтесь не падать на “грязных” данных: лучше пропустить строку и записать причину.
Минимум секретов: не логируйте пароли, токены, cookie.Регулярные выражения: ваш главный инструмент для логов
Модуль Python: re — Regular expression operations.
Что такое regex простыми словами
Регулярное выражение — это шаблон, который описывает, как найти нужные куски текста.
Частые элементы:
. любой символ
\d цифра
\s пробельный символ
+ один или больше
* ноль или больше
? ноль или один
(...) группа
(?P<name>...) именованная группа (очень удобно для парсинга в dict)В Python почти всегда стоит использовать сырой литерал строки r"...", чтобы не путаться с экранированием \.
search, match и finditer
re.match() ищет совпадение только в начале строки.
re.search() ищет где угодно в строке.
re.finditer() находит все совпадения и отдаёт их итератором.Для логов чаще всего подходит search() или заранее “якорённый” паттерн с ^ в начале.
Компиляция паттерна
Если вы обрабатываете тысячи строк, лучше один раз скомпилировать regex:
Это делает код быстрее и аккуратнее (паттерн видно сразу, его проще поддерживать).
Практика: парсим строки из auth.log в события
Ниже пример, максимально приближенный к задачам junior SOC: вытащить из sshd события неуспешного входа и собрать статистику по IP.
Пример типовой строки
В auth.log можно встретить (варианты зависят от системы):
Задача: выделить время, пользователя, IP, порт.
Regex с именованными группами
Что здесь важно для практики:
raw помогает отлаживать парсер и доказывать, что именно было в исходных данных.
Поля названы в стиле “похожем на SIEM”: source.ip, user.name, event.action.
datetime.strptime() используется, чтобы превратить строку времени в объект времени и дальше получить ISO-формат.Документация по времени: datetime — Basic date and time types.
Почему “похожий на SIEM” нейминг полезен
На практике данные часто надо склеивать из разных источников. Если в одном месте у вас ip, в другом src, в третьем remote_addr, то корреляция усложняется.
В индустрии часто используют готовые схемы нормализации. Один из примеров: Elastic Common Schema.
Вам не нужно учить ECS целиком, но полезно привыкнуть к идее:
есть общий словарь полей
новые источники приводятся к этому словарю
правила и отчёты становятся переиспользуемыми!Зачем нормализация: разные источники приводим к одному набору полей
Агрегация: считаем “топ IP” и делаем отчёт
После парсинга обычно делают агрегацию: посчитать, сколько событий от каждого IP, какие пользователи чаще атакуются, какие хосты шумят.
Пример: подсчёт неуспешных логинов по IP
Здесь вы применяете то, что уже проходили:
итерация по файлу
словари и списки
надёжная обработка данныхJSON на практике: обычный JSON и JSON Lines
Документация: json — JSON encoder and decoder.
Обычный JSON
Обычный JSON — это один документ целиком (часто список объектов).
JSON Lines (JSONL)
В логах и потоках часто используют формат JSON Lines, где каждая строка — отдельный JSON-объект. Это удобно, потому что файл можно читать построчно, как обычный лог.
Для безопасности это очень полезно: вы можете писать парсер, который отдаёт события, и сразу писать их в JSONL для последующей загрузки в хранилище.
CSV: быстрые отчёты для людей и тикетов
Документация: csv — CSV File Reading and Writing.
CSV часто нужен, потому что:
его легко открыть в Excel/Google Sheets
его любят менеджеры и аудиторы
его удобно прикладывать к тикетуЗапись CSV-отчёта
Практическая привычка: фиксируйте поле с временем, если отчёт про события. Если вы считаете агрегаты, добавляйте from/to (интервал), чтобы отчёт был воспроизводим.
Основы SIEM-подхода без привязки к конкретному продукту
SIEM (Security Information and Event Management) в продуктовой форме обычно умеет:
собирать события
парсить/нормализовать
хранить и искать
строить правила корреляции
выдавать алерты и отчётыВ рамках обучения нам важна логика (что делает SIEM), а не конкретный UI.
Минимальная модель события для корреляции
Чтобы по событиям можно было делать правила, обычно нужны:
@timestamp: когда произошло
event.action: что случилось (например, login_failed)
host.name или observer.name: где произошло
source.ip и иногда destination.ip: кто с кем
user.name: если есть пользователь
event.outcome: успех/неуспех (если применимо)Если этих полей нет, правила становятся “хрупкими”: много ложных срабатываний или пропуски.
Обогащение
Обогащение — это добавление контекста к событию. Примеры:
IP → страна/ASN
домен → результаты DNS
хэш → данные из threat intelНа junior-уровне важно понимать идею: сырые факты + контекст = более точные выводы. Реализовывать полноценный threat intel мы будем позже, когда освоим API.
Корреляция на уровне здравого смысла
Корреляция — это когда вы связываете несколько событий, чтобы получить более сильный сигнал.
Примеры простых правил (без “магии”):
много login_failed с одного source.ip за короткое время
один user.name ошибается на многих хостах
после серии неуспехов появился login_success с того же IPНа данном этапе курса достаточно научиться делать основу: качественный парсинг + нормализация + агрегация.
Типовые ошибки при парсинге (и как их избегать)
Regex “съедает” лишнее: используйте границы \b, якоря ^/$, проверяйте на нескольких примерах.
Разные варианты строки: у одного события могут быть разные формулировки. Делайте несколько паттернов или допускайте опциональные части ( ... )?.
Непредсказуемое время: фиксируйте год/таймзону; сохраняйте исходный timestamp строкой, если не уверены.
Падение на одной строке: оборачивайте парсинг в try/except, но не “глотайте” ошибку молча — пишите причину в отдельный файл.
Слишком большой файл: обрабатывайте построчно и не держите всё в памяти, если это не нужно.Что должно получаться после этой статьи
объяснить разницу между лог-строкой и событием
написать regex с именованными группами и превратить строку в dict
обработать файл построчно и собрать агрегаты (например, топ IP)
читать JSON и JSONL, писать CSV-отчёты
понимать базовую SIEM-логику: парсинг, нормализация, обогащение, корреляция