Python для SOC: сколько строк кода реально нужно до перехода к Sigma-правилам

Пересчитал конструкции Python в 14 скриптах, которые написал за последний год работы в SOC: от парсинга auth.log до автоматического обогащения алертов через API AbuseIPDB. Ровно 18 уникальных конструкций покрывают все 14 скриптов — циклы, словари, requests, re, json. Ни одного класса. Ни одного декоратора. Ни одного генератора. При этом каждый скрипт экономит от 20 минут до 4 часов за смену. Ниже — конкретный разбор: какой минимум Python-синтаксиса действительно нужен аналитику, как выглядит рабочий скрипт автоматизации и в какой момент Python пора менять на Sigma-правила.
Почему для автоматизации в SOC не нужен полный курс Python
Типичная ошибка при входе в ИБ из смежной сферы — открыть учебник по Python и начать с ООП (объектно-ориентированное программирование — стиль кода, где всё строится на классах и наследовании). Через неделю наступает ступор на абстрактных классах, человек решает, что «программирование — не моё», и закрывает тему. Но Python для аналитика SOC — это не разработка ПО.
SOC-аналитик пишет не приложения, а «клей» между инструментами: вытащил логи из SIEM (Security Information and Event Management — система, которая собирает и коррелирует события безопасности со всей инфраструктуры), прогнал IP через репутационную базу, записал результат в тикет. По данным TechTarget, аналитики без навыков скриптования тратят 70–80% смены на ручной триаж ложных срабатываний. А согласно отчёту IBM X-Force 2025, атаки с использованием действительных учётных данных — техника Valid Accounts (T1078) из MITRE ATT&CK (открытая база тактик и техник атакующих; T-коды вроде T1078 — её идентификаторы) — выросли на 71% год к году. Объём алертов растёт быстрее, чем штат. Ручная обработка масштабируется ровно до момента, когда аналитик выгорает.
По данным Verizon DBIR 2025, 38% утечек связаны с кражей учётных данных, а 36% инцидентов начинаются с фишинга (T1566, Initial Access). Каждый такой инцидент генерирует десятки алертов. Без скриптов разгрести этот поток — нереально.
Python в SOC — это не про «выучить язык». Это про выучить 18 конструкций и начать писать.
18 конструкций Python для автоматизации логов — полный список
Каждая конструкция ниже привязана к конкретной задаче в SOC. Если чего-то нет в этом списке — для первых 6–12 месяцев работы оно не нужно.
| № | Конструкция | Зачем в SOC | Пример контекста |
|---|---|---|---|
| 1 | Переменные и присваивание | Хранить IP, хэш, путь к лог-файлу | suspicious_ip = "203.0.113.45" |
| 2 | Строки и f-строки | Формировать URL для API-запросов | f"Score for {ip}: {score}" |
| 3 | Списки (list) |
Набор IP-адресов или Event ID | blocked_ips = [] |
| 4 | Словари (dict) |
Пара «IP — репутация» | enrichment = {"ip": ip, "score": 85} |
| 5 | Цикл for |
Пройти по строкам лога или списку алертов | for line in logfile: |
| 6 | if / elif / else |
Решение: блокировать или пропустить | if score > 75: block(ip) |
| 7 | import |
Подключить библиотеку | import requests |
| 8 | def (функции) |
Обернуть повторяющееся действие | def enrich_ip(ip): |
| 9 | with open() |
Безопасно открыть лог-файл | with open("auth.log") as f: |
| 10 | try / except |
Не упасть, если API не ответил | try: r = requests.get(url) |
| 11 | requests.get/post |
HTTP-запрос к API | Запрос к AbuseIPDB, VirusTotal |
| 12 | json.loads / dumps |
Разобрать ответ API | Все API безопасности возвращают JSON |
| 13 | re.findall / re.search |
Найти IP-адреса или хэши в тексте | Парсинг syslog, auth.log |
| 14 | .split() / .strip() |
Разделить строку лога по разделителям | Разбор CSV и syslog |
| 15 | .items() / .keys() |
Перебрать словарь с результатами | Вывод обогащённых данных |
| 16 | len() |
Посчитать количество алертов или IP | len(malicious_ips) |
| 17 | in (оператор) |
Проверить наличие IP в списке | if ip in watchlist: |
| 18 | return |
Вернуть результат из функции | return abuse_score |
Декораторы, генераторы, классы, метаклассы, asyncio — всё это можно добавить через год практики, когда появится потребность. По данным networkershome.com, шесть библиотек (requests, json, pandas, re, scapy, pymisp) покрывают 90% задач SOC-автоматизации. И каждая из них работает ровно на тех конструкциях, что в таблице.
Скрипт обогащения IP: автоматизация задач SOC аналитика за 25 строк
Самая частая задача на L1-дежурстве: SIEM выдал алерт с подозрительным IP, нужно проверить его репутацию. Вручную — открыть AbuseIPDB (сервис проверки репутации IP-адресов; бесплатный тариф — 1000 запросов в день), VirusTotal и Shodan в разных вкладках, скопировать IP, дождаться ответа, записать в тикет. По оценке networkershome.com, автоматизация одного такого цикла экономит 8–12 минут на алерт. При 150 алертах за смену — 4+ часа ручной работы. Скрипт делает то же самое за 3 секунды.
Предпосылки: Python 3.x установлен (на Kali/Ubuntu — уже есть, проверь python3 --version), установлен requests (pip install requests), нужен API-ключ AbuseIPDB (регистрация бесплатная), доступ в интернет.
import requests
import json
ABUSEIPDB_KEY = "your-api-key" # заменить на свой
def enrich_ip(ip_address):
url = "https://api.abuseipdb.com/api/v2/check"
headers = {"Key": ABUSEIPDB_KEY, "Accept": "application/json"}
params = {"ipAddress": ip_address, "maxAgeInDays": 90}
resp = requests.get(url, headers=headers, params=params)
data = resp.json()
score = data["data"]["abuseConfidenceScore"]
print(f"IP: {ip_address} | Abuse Score: {score}/100")
return score
Что здесь происходит шаг за шагом:
import requestsиimport jsonподключают библиотеку для HTTP-запросов и работу с JSON. Если при запуске скрипт ругаетсяModuleNotFoundError: No module named 'requests'— выполниpip install requestsв терминале.ABUSEIPDB_KEY— API-ключ для аутентификации. Получить его просто: зарегистрируйся на abuseipdb.com, создай ключ в личном кабинете.def enrich_ip(ip_address)— определяем функцию, которую можно вызвать для любого IP.requests.get(url, headers=headers, params=params)— отправляем GET-запрос к API. Ожидаемый результат: HTTP 200 и JSON с полемabuseConfidenceScore.data["data"]["abuseConfidenceScore"]— достаём числовую оценку от 0 до 100. Значение выше 75 — рекомендация к блокированию по документации AbuseIPDB.
Как понять, что получилось: при вызове enrich_ip("203.0.113.45") в терминале появится строка IP: 203.0.113.45 | Abuse Score: XX/100. Ошибка 401 — неверный API-ключ. Ошибка 429 — исчерпан лимит бесплатного тарифа (1000 запросов/день).
В этом скрипте — ровно 10 конструкций из таблицы. Ни одного класса, ни одного декоратора.
Python для парсинга логов: regex в auth.log и Windows Event ID
Вторая по частоте задача — вытащить из лог-файла конкретные события. Допустим, нужно найти все IP, с которых шли неудачные попытки SSH-авторизации. Это может быть признак Brute Force (T1110, Credential Access — техника перебора учётных данных). По данным CrowdStrike Global Threat Report 2025, 75% вторжений используют действительные учётные данные, а рекордное время lateral movement (перемещение по сети после первоначального проникновения) составило 51 секунду. Чем быстрее ты вычленишь источник из логов — тем больше шансов перехватить атакующего до эскалации.
Типичная строка в /var/log/auth.log: Jun 28 14:22:01 server sshd[12345]: Failed password for root from 185.220.101.50 port 22 ssh2. Чтобы вытащить все IP с неудачными попытками, хватит двух конструкций: with open() для чтения файла и re.findall() для поиска по шаблону.
Шаблон regex для IPv4-адреса после слова «Failed»: r"Failed.*from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})". Функция re.findall() вернёт список всех найденных IP. Дальше Counter из стандартной библиотеки collections подсчитает количество попыток с каждого адреса. IP с 50+ попытками за короткий период — кандидат на блокирование или эскалацию на L2.
Для Windows — аналогичная логика, но вместо текстовых логов работаешь с Event ID. Ключевые ID для детекта брутфорса: 4625 (неудачная попытка входа) и 4624 (успешный вход; тип логона 3 — сетевой, 10 — RDP). Если SIEM экспортирует логи в CSV или JSON, написание скриптов для анализа логов сводится к json.loads() или .split(",") — тот же набор конструкций из таблицы.
Для работы с Linux-логами нужен доступ к файлу (обычно требуются права root или включение в группу adm командой sudo usermod -aG adm username). Для Windows-логов — экспорт из Event Viewer или запрос через API SIEM.
Переход от Python к Sigma-правилам: когда скрипт становится правилом
Вопрос, который задают все career-свитчеры: «Зачем мне Sigma, если я могу всё написать на Python?» Ответ — в масштабе и переносимости.
**Sigma** — язык описания детектирующих правил в формате YAML (текстовый формат для структурированных данных; если видел docker-compose.yml — это тот же синтаксис). Одно Sigma-правило конвертируется в запросы для Splunk (SPL), Elastic (KQL), QRadar (AQL) и десятков других SIEM. Python-скрипт привязан к конкретному формату данных и конкретному API.
| Критерий | Python-скрипт | Sigma-правило |
|---|---|---|
| Разовое расследование | Да | Избыточно |
| Интеграция с API (AbuseIPDB, VirusTotal) | Да | Нет |
| Постоянный детект 24/7 | Требует cron/планировщик | Нативно в SIEM |
| Переносимость между SIEM | Нет (переписывать) | Да (конвертация) |
| Читаемость для всей команды | Нужен Python | YAML читает любой аналитик |
| Формирование отчётов | Да | Нет |
По данным репозитория SigmaHQ на GitHub, только по технике T1110 (Brute Force) существует 40 готовых Sigma-правил. По T1078 (Valid Accounts) — 114 правил. Для типовых сценариев детекта Python-скрипт не нужен вовсе — бери готовое и адаптируй.
Правило перехода простое: если ты третий раз пишешь скрипт для одного и того же паттерна — пора формализовать его в Sigma-правило.
Sigma-правило для детекта брутфорса вместо Python-скрипта
Та же задача, что выше решалась regex-парсингом auth.log, — но теперь как Sigma-правило:
title: SSH Brute Force Detection
logsource:
product: linux
service: sshd
detection:
selection:
log_message|contains: "Failed password"
condition: selection | count() > 10
timeframe: 5m
level: medium
tags:
- attack.credential_access
- attack.t1110
Разберём по строкам:
logsource— указываем, что правило для Linux sshd-логов. При конвертации Sigma-конвертер подставит правильный sourcetype для конкретного SIEM.detection.selection— ищем строки с «Failed password». Тот же паттерн, что и в Python-regex, но без кода.condition: selection | count() > 10сtimeframe: 5m— срабатывание, если за 5 минут больше 10 совпадений. Порог 10 — стартовый; на практике его придётся подкрутить под свою инфраструктуру, потому что на публичных серверах бывает и 100 попыток в минуту фонового шума.tags— привязка к MITRE ATT&CK: T1110, Credential Access. Любой аналитик в команде сразу понимает контекст алерта.
Конвертация: sigma convert -t splunk rule.yml сгенерирует готовый Splunk-запрос. Для Elastic — sigma convert -t elasticsearch rule.yml. Одно правило — десять SIEM. Для скриптинга для детекта угроз на постоянной основе Sigma объективно удобнее, чем Python.
Практический маршрут: от нуля до рабочего скрипта за выходные
Если ты осваиваешь Python для кибербезопасности с нуля и переходишь в SOC из смежной сферы, вот конкретный план на два дня.
Суббота, 3 часа:
- Установи Python 3.x. На Linux (Kali, Ubuntu) он уже есть — проверь
python3 --versionв терминале. Ожидаемый вывод:Python 3.11.xили выше. На Windows — скачай с python.org, обязательно отметь галку «Add to PATH» при установке, иначе терминал не найдёт командуpython. - Открой терминал, набери
python3. Попробуй первые 5 конструкций из таблицы: задай переменную (ip = "8.8.8.8"), создай список (ips = ["8.8.8.8", "1.1.1.1"]), пройди по нему циклом (for addr in ips: print(addr)). Если в терминале появились оба адреса — всё работает. - Напиши скрипт из 5 строк: открой текстовый файл (
with open("test.log") as f), прочитай строки (for line in f), выведи те, где встречается слово «Failed» (if "Failed" in line: print(line)). Создай тестовыйtest.logс парой строк — убедись, что фильтрация работает.
Воскресенье, 3 часа:
- Установи
requests: командаpip install requestsв терминале. Ожидаемый вывод:Successfully installed requests-2.x.x. - Возьми скрипт обогащения IP из раздела выше. Подставь свой API-ключ AbuseIPDB. Запусти:
python3 enrich.py. Ожидаемый вывод: строка с Abuse Score. - Добавь цикл: пусть скрипт читает список IP из файла
ips.txt(по одному на строку) и проверяет каждый. Это 3 дополнительные строки:with open("ips.txt") as f,for line in f,enrich_ip(line.strip()).
Результат: два рабочих скрипта за 6 часов. Ни ООП, ни декораторов, ни asyncio.
Дальше — практика на учебных логах. SOC-датасет для тренировки: Boss of the SOC (BOTS) от Splunk — бесплатный набор данных с реальными сценариями атак. Скачиваешь, загружаешь в Splunk Free (лимит 500 МБ/день — для обучения хватает) и пишешь Python-скрипты для парсинга лог-файлов. Через месяц ежедневной практики будешь готов к написанию скриптов на рабочем месте. Через три — к формализации паттернов в Sigma.
Моя позиция может быть непопулярной: большинство курсов по основам Python для безопасности учат не тому. Они тратят недели на наследование и паттерны проектирования — вещи, которые SOC-аналитику на L1/L2 не нужны вообще. А потом выпускник приходит на дежурство и не может написать requests.get() к API, потому что три месяца рисовал UML-диаграммы.
За полтора года я видел десятки career-свитчеров — из сисадминов, из техподдержки, из QA. Те, кто начинал с таблицы «18 конструкций» и сразу писал рабочие скрипты, через 3 месяца автоматизировали половину рутины на смене. Те, кто «сначала выучу Python как следует» — через 3 месяца всё ещё читали главу про метаклассы и не написали ни одного полезного скрипта.
Граница между Python и Sigma тоже вызывает споры. Правильная точка перехода — не «когда освоишь Python», а «когда третий раз напишешь скрипт для одного и того же паттерна». Трижды парсил auth.log в поисках брутфорса разными скриптами — пора формализовать это в правило и забыть. Python останется для всего, что Sigma не покрывает: API-интеграции, отчёты, нестандартные расследования. Если хочешь пройти эту базу системно и не распыляться — на IB Basics как раз показывают, как джуны решают первые рабочие задачи в SOC.
Эту тему и смежные навыки разбирают на практике в курсе «Python для пентестера» Codeby Academy.
