Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
zeek2es — Приложение на Python для фильтрации и передачи логов Zeek в Elastic/OpenSearch+Humio. Это приложение также может выводить чистые JSON-логи в stdout для дальнейшей обработки! | Kitploit
Инструменты/GitHubGitHub/corelight/zeek2es
Скриптинг и автоматизацияСетевая безопасностьУтилиты и фреймворкиАнализ Журналов
GitHubcorelight/zeek2es

zeek2es

Приложение на Python для фильтрации и передачи логов Zeek в Elastic/OpenSearch+Humio. Это приложение также может выводить чистые JSON-логи в stdout для дальнейшей обработки!

Репозиторий
40754 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

zeek2es.py

Это приложение на Python преобразует логи Zeek в форматах ASCII TSV и JSON в формат массовой загрузки JSON для ElasticSearch.

Оглавление:

  • Введение
  • Установка
    • Elastic v8.0+
    • Docker
  • Обновление zeek2es
    • Конвейер приёма ES
  • Фильтрация данных
    • Фильтры Python
    • Фильтр по ключам
  • Примеры командной строки
  • Параметры командной строки
  • Требования
  • Примечания
    • Humio
    • Ввод JSON-логов
    • Потоки данных
    • Вспомогательные скрипты
    • Cython

Введение

Kibana

Хотите увидеть несколько логов Zeek для одного и того же ID соединения (uid) или ID файла (fuid)? Вот результаты из files.log, http.log и conn.log для одного uid:

Kibana

Вы можете выполнять поиск по подсети для типа 'addr' Zeek:

Kibana Subnet Searching

Вы можете создавать графики временных рядов, например, этот график NTP и HTTP:

Kibana Time Series

IP-адреса можно геолоцировать с помощью параметра командной строки -g:

Kibana Mapping

Агрегации просты и быстры:

Kibana Aggregation

Это приложение будет «просто работать» при изменении форматов логов Zeek. Логика читает имена полей и связанные типы, чтобы правильно настроить сопоставления в ElasticSearch.

Это приложение распознаёт gzip или несжатые логи. Приложение предполагает, что ElasticSearch настроен на вашем localhost на порту по умолчанию. Если у вас нет ElasticSearch, вы можете вывести JSON в stdout с помощью параметров командной строки -s -b, чтобы обработать его приложением jq.

Вы можете добавить подполе keyword к текстовым полям с помощью параметра командной строки -k. Это полезно для агрегаций в Kibana.

Если Python уже установлен в вашей системе, вам не нужно копировать на свою машину ничего дополнительного, кроме Elasticsearch, Kibana и zeek2es.py, если у вас уже установлена библиотека requests.

Установка

Если вы соответствуете требованиям, то установка не требуется. Вы просто копируете zeek2es.py на свой хост и запускаете его с помощью Python. После импорта логов Zeek с автоматической генерацией имени индекса (то есть, если вы не указали параметр -i) вы обнаружите, что ваши индексы называются "zeek_zeeklogname_date", где zeeklogname — это имя лога, например conn, а date — дата в формате YYYY-MM-DD. В этом случае задайте шаблон индекса Kibana, соответствующий zeek*. Если вы назвали свой индекс с помощью параметра -i, вам нужно будет создать шаблон индекса Kibana, который соответствует вашей схеме именования.

Если вы обновляете zeek2es, пожалуйста, обратитесь к разделу об обновлении zeek2es.

Elastic v8.0+

Если вы используете Elastic v8.0+, в нём по умолчанию включена безопасность. Это добавляет требование имени пользователя и пароля, а также HTTPS.

Если вы хотите иметь возможность удалять индексы/потоки данных с подстановочными знаками (как показано в примерах в этом readme), отредактируйте elasticsearch.yml, добавив следующую строку:``` action.destructive_requires_name: false

root@kitploit:~
Вам также нужно будет изменить команды curl в этом readme, чтобы они содержали `-k -u elastic:<password>`
где пароль пользователя `elastic` задаётся командой, подобной следующей:```
./bin/elasticsearch-reset-password -u elastic -i

Вы можете использовать zeek2es.py с опциями командной строки --user и --passwd, чтобы указать свои учётные данные для ES. Вы также можете передать эти опции через дополнительные аргументы командной строки для вспомогательных скриптов.

Docker

Вероятно, самый простой способ использовать этот код — через Docker. Все файлы находятся в каталоге docker. Сначала вам нужно отредактировать строки с CHANGEME!!! в файле .env, чтобы они соответствовали вашему окружению.
Вам также нужно будет изменить пароль Elastic в docker/zeek2es/entrypoint.sh, чтобы он совпадал. Его можно найти после опции --passwd.
Затем вы можете перейти в каталог docker и ввести следующие команды, чтобы поднять кластер zeek2es и Elasticsearch:``` docker-compose build dockr-compose up

root@kitploit:~
Теперь вы можете помещать логи в каталог `VOLUME_MOUNT/data/logs` (`VOLUME_MOUNT` вы задаёте в файле `.env`).
Когда в этом каталоге создаются логи, zeek2es начинает обрабатывать их и отправлять в Elasticsearch.
Затем вы можете войти на https://localhost:5601, используя имя пользователя и пароль, указанные в файле `.env`.  
По умолчанию используется самозаверяющий сертификат, но вы можете изменить это, отредактировав файлы docker compose.  После входа в
Kibana перейдите в Stack Management->Data Views и создайте представление данных для `logs*` с временной меткой `@timestamp`.
Теперь вы сможете перейти в Discover и начать поиск по вашим логам!  Ваши данные сохраняются в указанном вами каталоге `VOLUME_MOUNT/data`.
Если вы хотите удалить все данные, просто выполните `rm -rf VOLUME_MOUNT/data`, подставив в эту команду тот каталог, который вы указали.
При следующем запуске кластера он будет совершенно чистым для новых данных.

## Обновление zeek2es <a name="upgradingzeek2es" />

Большинство обновлений сводится к простому копированию новой версии [zeek2es.py](https://github.com/corelight/zeek2es/blob/master/zeek2es.py) поверх 
старой.  В некоторых случаях конвейер ingest ES, необходимый для опции командной строки `-g`, 
может измениться при обновлении.  Поэтому настоятельно рекомендуется удалить 
ваш [конвейер ingest](#esingestpipeline) перед запуском новой версии zeek2es.py.

### Конвейер ES Ingest <a name="esingestpipeline" />

Если вам нужно [удалить конвейер ES ingest "zeekgeoip"](https://www.elastic.co/guide/en/elasticsearch/reference/current/delete-pipeline-api.html) 
используемый для геолокации IP-адресов с опцией командной строки `-g`, вы можете сделать это либо графически
через Kibana в разделе Stack Management->Ingest Pipelines, либо с помощью следующей команды:```
curl -X DELETE "localhost:9200/_ingest/pipeline/zeekgeoip?pretty"

Эта команда настоятельно рекомендуется при каждом обновлении вашей копии zeek2es.py.

Filtering Data

Python Filters

zeek2es предоставляет возможности фильтрации ваших журналов Zeek перед их сохранением в ElasticSearch. Эта функциональность может быть включена с помощью опций -a или -f. Фильтры создаются из Python лямбда-функций, где входные данные представляют собой словарь Python, отражающий выходные данные. Вы можете добавить фильтр для сохранения только тех журналов соединений, в которых заполнено поле service, используя опцию -f с этим файлом лямбда-фильтра:``` lambda x: 'service' in x and len(x['service']) > 0

root@kitploit:~
Или, возможно, вы хотите отфильтровать соединения, которые имеют как минимум 1,024 байт, при этом как минимум 1 байт поступает 
от назначения:```
lambda x: 'orig_ip_bytes' in x and 'resp_ip_bytes' in x and x['orig_ip_bytes'] + x['resp_ip_bytes'] > 1024 and x['resp_ip_bytes'] > 0

Более простые лямбда-фильтры можно задать в командной строке с помощью опции -a. Такой фильтр сохранит только записи журнала соединений, в которых IP-адрес отправителя принадлежит сети 192.0.0.0/8:``` python zeek2es.py conn.log.gz -a "lambda x: 'id.orig_h' in x and ipaddress.ip_address(x['id.orig_h']) in ipaddress.ip_network('192.0.0.0/8')"

root@kitploit:~
Для продвинутых пользователей параметр `-f` позволяет определить полноценную функцию (вместо лямбда-функций Python), чтобы можно было писать функции, 
занимающие несколько строк.

### Фильтрация по ключам <a name="filteronkeys" />

В некоторых случаях вам может понадобиться извлечь данные из одного журнала, которые зависят от другого.  Например,
может потребоваться найти все строки `ssl.log`, у которых `uid` совпадает с ранее
проиндексированными строками из `conn.log`, или наоборот.  Вы можете выполнить фильтрацию, импортировав
файлы `conn.log` с помощью параметра командной строки `-o uid uid.txt`.  При этом все uid будут записаны 
в файл с именем `uid.txt`.  Затем, при импорте файлов `ssl.log`, вы укажете 
параметр командной строки `-e uid uid.txt`.  При этом будут импортированы только строки SSL, 
содержащие значения `uid`, которые есть в `uid.txt`, созданном ранее при импорте `conn.log`.

## Примеры командной строки <a name="commandlineexamples" />```
python zeek2es.py your_zeek_log.gz -i your_es_index_name

Этот скрипт можно запускать параллельно на всех журналах подключений, по 10 за раз, следующей командой:``` find /some/dir -name “conn*.log.gz” | parallel -j 10 python zeek2es.py {1} :::: -

root@kitploit:~
Если вы хотите автоматически импортировать все файлы conn.log по мере их создания в каталоге, следующая
команда [fswatch](https://emcrisostomo.github.io/fswatch/) сделает это за вас:```
fswatch -m poll_monitor --event Created -r /data/logs/zeek/ | awk '/^.*\/conn.*\.log\.gz$/' | parallel -j 5 python ~/zeek2es.py {} -g -d :::: -

Если у вас установлена команда jq, вы можете выполнять поиск по всем вашим логам по общему полю, такому как connection uid, даже без ElasticSearch:``` find /usr/local/var/logs -name "*.log.gz" -exec python ~/Source/zeek2es/zeek2es.py {} -s -b -z ; | jq -c '. | select(.uid=="CLbPij1vThLvQ2qDKh")'

root@kitploit:~
Вы можете использовать гораздо более сложные jq-запросы, чем этот, если вы знакомы с jq.

Если вы хотите удалить все свои данные Zeek из ElasticSearch, эта команда сделает это за вас:```
curl -X DELETE http://localhost:9200/zeek*

Поскольку к именам индексов добавляется дата, вы можете удалить индекс за 31 декабря 2021 года следующей командой:``` curl -X DELETE http://localhost:9200/zeek_*_2021-12-31

root@kitploit:~
Вы можете удалить все записи conn.log этой командой:```
curl -X DELETE http://localhost:9200/zeek_conn_*

Параметры командной строки ```

$ python zeek2es.py -h usage: zeek2es.py [-h] [-i ESINDEX] [-u ESURL] [--user USER] [--passwd PASSWD] [-l LINES] [-n NAME] [-k KEYWORDS [KEYWORDS ...]] [-a LAMBDAFILTER] [-f FILTERFILE] [-y OUTPUTFIELDS [OUTPUTFIELDS ...]] [-d DATASTREAM] [--compress] [-o fieldname filename] [-e fieldname filename] [-g] [-p SPLITFIELDS [SPLITFIELDS ...]] [-j] [-r] [-t] [-s] [-b] [--humio HUMIO HUMIO] [-c] [-w] [-z] filename

Process Zeek ASCII logs into ElasticSearch.

positional arguments: filename The Zeek log in *.log or *.gz format. Include the full path.

optional arguments: -h, --help show this help message and exit -i ESINDEX, --esindex ESINDEX The Elasticsearch index/data stream name. -u ESURL, --esurl ESURL The Elasticsearch URL. Use ending slash. Use https for Elastic v8+. (default: http://localhost:9200) --user USER The Elasticsearch user. (default: disabled) --passwd PASSWD The Elasticsearch password. Note this will put your password in this shell history file. (default: disabled) -l LINES, --lines LINES Lines to buffer for RESTful operations. (default: 10,000) -n NAME, --name NAME The name of the system to add to the index for uniqueness. (default: empty string) -k KEYWORDS [KEYWORDS ...], --keywords KEYWORDS [KEYWORDS ...] A list of text fields to add a keyword subfield. (default: service) -a LAMBDAFILTER, --lambdafilter LAMBDAFILTER A Python lambda function, when eval'd will filter your output JSON dict. (default: empty string) -f FILTERFILE, --filterfile FILTERFILE A Python function file, when eval'd will filter your output JSON dict. (default: empty string) -y OUTPUTFIELDS [OUTPUTFIELDS ...], --outputfields OUTPUTFIELDS [OUTPUTFIELDS ...] A list of fields to keep for the output. Must include ts. (default: empty string) -d DATASTREAM, --datastream DATASTREAM Instead of an index, use a data stream that will rollover at this many GB. Recommended is 50 or less. (default: 0 - disabled) --compress If a datastream is used, enable best compression. -o fieldname filename, --logkey fieldname filename A field to log to a file. Example: uid uid.txt.
Will append to the file! Delete file before running if appending is undesired.
This option can be called more than once. (default: empty - disabled) -e fieldname filename, --filterkeys fieldname filename A field to filter with keys from a file. Example: uid uid.txt. (default: empty string - disabled) -g, --ingestion Use the ingestion pipeline to do things like geolocate IPs and split services. Takes longer, but worth it. -p SPLITFIELDS [SPLITFIELDS ...], --splitfields SPLITFIELDS [SPLITFIELDS ...] A list of additional fields to split with the ingestion pipeline, if enabled. (default: empty string - disabled) -j, --jsonlogs Assume input logs are JSON. -r, --origtime Keep the numerical time format, not milliseconds as ES needs. -t, --timestamp Keep the time in timestamp format. -s, --stdout Print JSON to stdout instead of sending to Elasticsearch directly. -b, --nobulk Remove the ES bulk JSON header. Requires --stdout. --humio HUMIO HUMIO First argument is the Humio URL, the second argument is the ingest token. -c, --cython Use Cython execution by loading the local zeek2es.so file through an import. Run python setup.py build_ext --inplace first to make your zeek2es.so file! -w, --hashdates Use hashes instead of dates for the index name. -z, --supresswarnings Supress any type of warning. Die stoically and silently.

To delete indices:

root@kitploit:~
curl -X DELETE http://localhost:9200/zeek*?pretty

To delete data streams:

root@kitploit:~
curl -X DELETE http://localhost:9200/_data_stream/zeek*?pretty

To delete index templates:

root@kitploit:~
curl -X DELETE http://localhost:9200/_index_template/zeek*?pretty

To delete the lifecycle policy:

root@kitploit:~
curl -X DELETE http://localhost:9200/_ilm/policy/zeek-lifecycle-policy?pretty

You will need to add -k -u elastic_user:password if you are using Elastic v8+.

root@kitploit:~
## Требования <a name="requirements" />

- Unix-подобная среда (MacOs тоже работает!)
- Python
  - установленная библиотека Python [requests](https://docs.python-requests.org/en/latest/), например, с помощью `pip`.

## Примечания <a name="notes" />

### Humio <a name="humio" />

Чтобы импортировать данные в Humio, вам потребуется настроить репозиторий с парсером `corelight-json`. Получите
токен приёма данных для репозитория, после чего вы сможете импортировать данные командой, например:```
python3 zeek2es.py -s -b --humio http://localhost:8080 b005bf74-1ed3-4871-904f-9460a4687202 http.log 

URL должен быть в формате: http://yourserver:8080, так как остальная часть пути добавляется скриптом zeek2es.py автоматически.

Ввод JSON-журналов

Поскольку журналы Zeek JSON, в отличие от версий ASCII TSV, не содержат информации о типах, лишь ограниченная информация о типах может быть предоставлена ElasticSearch. Вы заметите это чаще всего для полей журнала Zeek типа "addr", которые не являются id$orig_h и id$resp_h, поскольку информация о типах недоступна для преобразования поля в тип "ip" ElasticSearch. Поскольку поля адресов не будут иметь тип "ip", вы не сможете использовать поиск по подсетям, например, как вы могли бы для журналов TSV. Сохранение журналов Zeek в формате ASCII TSV обеспечивает большую долгосрочную гибкость.

Потоки данных

Вы можете использовать потоки данных вместо индексов для больших журналов с помощью параметра командной строки -d. Этот параметр создает шаблоны индексов, начинающиеся с zeek_. Он также создает политику жизненного цикла с именем zeek-lifecycle-policy. Если вы хотите удалить все свои потоки данных, политики жизненного цикла, и шаблоны индексов, эти команды сделают это за вас:``` curl -X DELETE http://localhost:9200/_data_stream/zeek*?pretty curl -X DELETE http://localhost:9200/_index_template/zeek*?pretty curl -X DELETE http://localhost:9200/_ilm/policy/zeek-lifecycle-policy?pretty

root@kitploit:~
### Вспомогательные скрипты <a name="helperscripts" />

Есть два скрипта, которые помогут вам превратить ваши логи в потоки данных, такие как `logs-zeek-conn`.
Первый скрипт — [process_logs_as_datastream.sh](https://github.com/corelight/zeek2es/blob/master/process_logs_as_datastream.sh), и при заданном 
списке логов и каталогов он импортирует их как таковые.  Второй скрипт 
— [process_log.sh](https://github.com/corelight/zeek2es/blob/master/process_log.sh), и его можно использовать для импорта логов 
по одному за раз.  Этот скрипт также можно использовать для мониторинга логов, создаваемых в каталоге, с помощью 
[fswatch](https://emcrisostomo.github.io/fswatch/).  Оба скрипта содержат примеры командных строк, 
если запустить их без параметров.```
$ ./process_logs_as_datastream.sh 
Usage: ./process_logs_as_datastream.sh NJOBS "ADDITIONAL_ARGS_TO_ZEEK2ES" "LIST_OF_LOGS_DELIMITED_BY_SPACES" DIR1 DIR2 ...

Example:
  time ./process_logs_as_datastream.sh 16 "" "amqp bgp conn dce_rpc dhcp dns dpd files ftp http ipsec irc kerberos modbus modbus_register_change mount mqtt mysql nfs notice ntlm ntp ospf portmap radius reporter rdp rfb rip ripng sip smb_cmd smb_files smb_mapping smtp snmp socks ssh ssl stun syslog tunnel vpn weird wireguard x509" /usr/local/var/logs

Входные данные (INPUT) пусты — текст для перевода не предоставлен. Переводить нечего.``` $ ./process_log.sh Usage: ./process_log.sh LOGFILENAME "ADDITIONAL_ARGS_TO_ZEEK2ES"

Example: fswatch -m poll_monitor --event Created -r /data/logs/zeek | awk '/^./(conn|dns|http)...log.gz$/' | parallel -j 16 ./process_log.sh {} "" :::: -

root@kitploit:~
Вам потребуется изменить эти скрипты и командные строки в соответствии с вашим окружением.  

Любые файлы с именем журнала, например `conn_filter.txt`, в `lambda_filter_file_dir` (по умолчанию — ваш домашний каталог), будут применяться как файл лямбда-фильтра
к соответствующему входному журналу. Это позволяет вам настроить все фильтры в одном каталоге и импортировать несколько файлов журналов с
этим набором фильтров одной командой с помощью [process_logs_as_datastream.sh](https://github.com/corelight/zeek2es/blob/master/process_logs_as_datastream.sh).

Следующие строки должны удалить все данные Zeek в ElasticSearch независимо от того, используете ли вы индексы или
потоки данных, или эти вспомогательные скрипты:```
curl -X DELETE http://localhost:9200/zeek*?pretty
curl -X DELETE http://localhost:9200/_data_stream/zeek*?pretty
curl -X DELETE http://localhost:9200/_data_stream/logs-zeek*?pretty
curl -X DELETE http://localhost:9200/_index_template/zeek*?pretty
curl -X DELETE http://localhost:9200/_index_template/logs-zeek*?pretty
curl -X DELETE http://localhost:9200/_ilm/policy/zeek-lifecycle-policy?pretty

... или если вы используете Elastic v8+ ...``` curl -X DELETE -k -u elastic:password https://localhost:9200/zeek*?pretty curl -X DELETE -k -u elastic:password https://localhost:9200/_data_stream/zeek*?pretty curl -X DELETE -k -u elastic:password https://localhost:9200/_data_stream/logs-zeek*?pretty curl -X DELETE -k -u elastic:password https://localhost:9200/_index_template/zeek*?pretty curl -X DELETE -k -u elastic:password https://localhost:9200/_index_template/logs-zeek*?pretty curl -X DELETE -k -u elastic:password https://localhost:9200/_ilm/policy/zeek-lifecycle-policy?pretty

root@kitploit:~
Но чтобы сделать это в v8+, вам потребуется настроить Elastic, как описано 
в разделе [Elastic v8.0+](#elastic80).

### Cython <a name="cython" />

Если вы хотите попробовать [Cython](https://cython.org/), сначала необходимо выполнить `python setup.py build_ext --inplace` 
для генерации скомпилированного файла.  Это нужно делать каждый раз при обновлении zeek2es!
Скачать инструмент